Compare commits
201 Commits
wip/gcampa
...
wip/is-swi
Author | SHA1 | Date | |
---|---|---|---|
11bf65e2b4 | |||
a8b7e559aa | |||
b733e30a4a | |||
b607958134 | |||
14189e6827 | |||
3dd6113a0a | |||
ae5cdea5af | |||
3c1f389e25 | |||
284d821233 | |||
78272e5592 | |||
098bc41083 | |||
c837090282 | |||
cdc1678e6f | |||
2a3d76b0cc | |||
29e89491de | |||
d63947aec4 | |||
512f0a67fb | |||
a7cd4657f5 | |||
bf02cde598 | |||
b7dbb35546 | |||
6fd5f0e3de | |||
e6469df065 | |||
d61fe357f6 | |||
965dd2ab67 | |||
78e011d558 | |||
76590d6c69 | |||
16dc6ce41a | |||
1dadcee5c9 | |||
bed3bb45f7 | |||
18d850d7d6 | |||
f920fd8b6f | |||
b9da6d9ef6 | |||
3be489c69e | |||
cab092aad7 | |||
0451cba343 | |||
12334cd9ad | |||
9d18a2dff4 | |||
869e1dc241 | |||
b878f3fc4a | |||
2aeabcc38b | |||
94778c0dac | |||
390491b37a | |||
f8ea825577 | |||
f77ad7d184 | |||
e467a53def | |||
9cd2e12915 | |||
627a6587b4 | |||
9b3b419f7a | |||
f37ed44837 | |||
dddc333407 | |||
75714fb784 | |||
5a6342a5fe | |||
e07379b406 | |||
54bfe34273 | |||
bef876e4b4 | |||
6ef9ab6a0b | |||
53ffdd8d68 | |||
ba198034cb | |||
58e66b9e1b | |||
ac7efcb43a | |||
b514b9ec7c | |||
f69942eb35 | |||
f28827f625 | |||
f20a6b3635 | |||
7f7ff3ce3e | |||
0abb0756ba | |||
070ed9396c | |||
307004a455 | |||
d097327bd8 | |||
f72f501931 | |||
e9584cfcab | |||
aec0e75d73 | |||
a6b4d49454 | |||
1cc726593e | |||
5001bd8810 | |||
46aa70aa09 | |||
41cf447c45 | |||
b328fd7aed | |||
917a24580b | |||
af36182879 | |||
160c721afc | |||
ee0040ef1c | |||
9e60a55dd7 | |||
57f27572ae | |||
ceae032112 | |||
d3ab367fcd | |||
0ceefb48c8 | |||
a9815ae1e9 | |||
79140fd132 | |||
6c0f48ce25 | |||
da7ab7057d | |||
499ae609dd | |||
e78b3644e4 | |||
ce6b39bd1c | |||
603f528b47 | |||
5fecd07045 | |||
8edd7ad32e | |||
3a27d0b849 | |||
b351536dee | |||
eeea8559b6 | |||
17591117c1 | |||
c4470fd1e6 | |||
45fc7ec01f | |||
dc54472ca5 | |||
4b3bf05aaf | |||
ec014a7ecf | |||
a8c87f3bab | |||
b39e76200a | |||
01deb9ef7d | |||
5c89568cca | |||
6119b44746 | |||
7af4a7bf88 | |||
04e4d69662 | |||
a87e0f028a | |||
31774a7711 | |||
a32f27a2aa | |||
805a409318 | |||
42d45bd14a | |||
5870709fbc | |||
0fdb7430ff | |||
4771f80d6f | |||
91405583fd | |||
f864303aac | |||
e5ebf4a2b2 | |||
725a36e37a | |||
78dacfa865 | |||
16547fb3c2 | |||
9eeabf79f9 | |||
81b71cc143 | |||
8301acd4d6 | |||
f80afb1755 | |||
71c6b60054 | |||
95a1b874d8 | |||
07de96ede9 | |||
209014b083 | |||
127f10e7a8 | |||
67615a0cbc | |||
dde20f0c76 | |||
ddced79475 | |||
e80795b7f0 | |||
080337a4e8 | |||
884af3c986 | |||
edc95b2cb7 | |||
96239e95ec | |||
331ad76675 | |||
29152d3022 | |||
73fa4b1cbd | |||
7766a91e8c | |||
b7bad765aa | |||
5af09a60e9 | |||
ef623cfbbd | |||
ce5faba185 | |||
40d9ed535b | |||
d5675765f3 | |||
65067c24cc | |||
e2463cb501 | |||
de2f2d7ef1 | |||
7cdb75e7ce | |||
1502e308b8 | |||
dd1fe68e5c | |||
85c1dc5a0c | |||
7b3a689aad | |||
2c28a12cca | |||
324021fd64 | |||
1dceae97c6 | |||
0bef925b51 | |||
0ba1f29e40 | |||
3b1e536822 | |||
9a83662a18 | |||
5bcead5b5c | |||
d8f9502ea2 | |||
020128b9ca | |||
1566a4e607 | |||
fbd59631ee | |||
6c36856499 | |||
f4cda49988 | |||
a6b49fe7d6 | |||
26966b2bf3 | |||
36a7429aa0 | |||
7be1fe09f1 | |||
62bf08d323 | |||
260c082c4e | |||
5e0ff7fd56 | |||
aac312ca34 | |||
a90401454a | |||
5679e6b3a9 | |||
194574bb0e | |||
337d2da38a | |||
df848aa084 | |||
0cc1615252 | |||
d4259fa8aa | |||
157d7e2b59 | |||
ee50904147 | |||
ec39aa3890 | |||
beb0fdf4b8 | |||
443fe813c3 | |||
69cdc5a9b9 | |||
dac54a6019 | |||
e5ca53e56c | |||
7a79236bab | |||
cd37e2908f |
102
NEWS
102
NEWS
@ -1,3 +1,105 @@
|
|||||||
|
3.8.0.1
|
||||||
|
=======
|
||||||
|
* Background bug fixes [Ray; #696712]
|
||||||
|
|
||||||
|
3.8.0
|
||||||
|
=====
|
||||||
|
* Remove blur and desaturation from lock screen [Jasper; #696322]
|
||||||
|
* Remove scroll view fade near edges [Adel; #696404]
|
||||||
|
* dateMenu: Open calendar component when using Evolution [Florian; #696432]
|
||||||
|
* Fix unlocking on fast user switch [Cosimo; #696287]
|
||||||
|
* Tweak screen shield animation [Rui; #696380]
|
||||||
|
* Fix major memory leak when changing backgrounds [Ray; #696157]
|
||||||
|
* Miscellaneous bug fixes [Jasper, Adel, Florian; #696199, #696212, #696422,
|
||||||
|
#696447, #696235]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Giovanni Campagna, Cosimo Cecchi, Adel Gadllah, Rui Matos, Florian Müllner,
|
||||||
|
Jasper St. Pierre, Ray Strode
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Alexandre Franke [fr], Victor Ibragimov [tg], Arash Mousavi [fa],
|
||||||
|
Gabor Kelemen [hu], Sandeep Sheshrao Shedmake [mr], ManojKumar Giri [or],
|
||||||
|
Shantha kumar [ta], Rajesh Ranjan [hi], Stas Solovey [ru],
|
||||||
|
Shankar Prasad [kn], Dušan Kazik [sk], Ihar Hrachyshka [be],
|
||||||
|
Wouter Bolsterlee [nl], Kris Thomsen [da], Jiro Matsuzawa [ja],
|
||||||
|
Daniel Korostil [uk], Ani Peter [ml], Krishnababu Krothapalli [te],
|
||||||
|
Mantas Kriaučiūnas [lt], Praveen Illa [te]
|
||||||
|
|
||||||
|
3.7.92
|
||||||
|
======
|
||||||
|
* Drop fallback lock implementation [Florian; #693403]
|
||||||
|
* Don't let the user trigger message-tray when in fullscreen [Jasper; #694997]
|
||||||
|
* Scroll search results when using keynav [Jasper; #689681]
|
||||||
|
* Allow raising the shield by starting to type the password [Jasper; #686740]
|
||||||
|
* Improve tracking of fullscreen windows [Owen; #649748]
|
||||||
|
* Improve animation of new windows in overview [Giovanni; #695582]
|
||||||
|
* workspace switcher: Animate new workspaces created by DND [Giovanni; #685285]
|
||||||
|
* Give user time to read messages on login screen [Ray; #694688]
|
||||||
|
* Misc bug fixes and cleanups [Jasper, Ray, Florian, Cosimo, Giovanni, Adel,
|
||||||
|
Stef, Takao, Rui, Neil; #695154, #694993, #695272, #691578, #694321, #695338,
|
||||||
|
#695409, #695458, #695526, #695601, #695471, #695324, #695650, #695656,
|
||||||
|
#695659, #695485, #695395, #694951, #695824, #695841, #695801, #694321,
|
||||||
|
#693708, #695800, #695607, #695882, #691578, #685851, #694371, #690857,
|
||||||
|
#694092, #695747, #696007, #693438, #696064, #696102
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Giovanni Campagna, Cosimo Cecchi, Allan Day, Takao Fujiwara, Adel Gadllah,
|
||||||
|
Tim Lunn, Rui Matos, Florian Müllner, Neil Roberts, Jasper St. Pierre,
|
||||||
|
Ray Strode, Stef Walter, Colin Walters, Owen W. Taylor
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Nilamdyuti Goswami [as], Chao-Hsiung Liao [zh_HK, zh_TW],
|
||||||
|
Yuri Myasoedov [ru], Gheyret Kenji [ug], Baurzhan Muftakhidinov [kk],
|
||||||
|
Ville-Pekka Vainio [fi], Matej Urbančič [sl],
|
||||||
|
Мирослав Николић [sr, sr@latin], Rūdolfs Mazurs [lv], Christian Kirbach [de],
|
||||||
|
Andika Triwidada [id], Gil Forcada [ca], Mattias Põldaru [et],
|
||||||
|
Duarte Loreto [pt], Adam Matoušek [cs], Changwoo Ryu [ko],
|
||||||
|
Ihar Hrachyshka [be], Carles Ferrando [ca@valencia], Sweta Kothari [gu]
|
||||||
|
|
||||||
|
3.7.91
|
||||||
|
======
|
||||||
|
* overview: Fade out controls during DND that are not targets [Cosimo; #686984]
|
||||||
|
* overview: Keep open when a Control key is held [Florian; #686984]
|
||||||
|
* Improve login screen => session transition [Ray; #694321]
|
||||||
|
* Center application grid horizontally [Florian; #694261]
|
||||||
|
* Fix hiding panel when fullscreen windows span multiple monitors [Adel; 646861]
|
||||||
|
* Tweak thresholds of pressure barrier [Jasper; #694467]
|
||||||
|
* Tweak window picker layout [Jasper; #694902]
|
||||||
|
* Expose key grab DBus API to gnome-settings-daemon [Florian; #643111]
|
||||||
|
* Don't always show message tray in overview, add message indicator
|
||||||
|
[Cosimo; #687787]
|
||||||
|
* Tweak startup animation [Ray; #694326]
|
||||||
|
* Add OSD popups and expose them to gnome-settings-daemon [Florian; #613543]
|
||||||
|
* Move loupe icon to the start of the search entry [Jasper; #695069]
|
||||||
|
* Don't show the input switcher with less than 2 items [Rui; 695000]
|
||||||
|
* Fix auto-completion of system modals immediately upon display [Stef; #692937]
|
||||||
|
* Ignore workspaces in alt-tab [Florian; #661156]
|
||||||
|
* Disable copying text from password entries [Florian; #695104]
|
||||||
|
* Use standard styling for ibus candidate popups [Allan; #694796]
|
||||||
|
* Fix calendar changing height on month changes [Giovanni; #641383]
|
||||||
|
* Port the hot corner to use pressure barriers [Jasper; #663661]
|
||||||
|
* Misc bug fixes and cleanups: [Hashem, Giovanni, Alban, Jasper, Cosimo,
|
||||||
|
Florian, Adel, Daniel, Matthias, Ray, Rui, Guillaume, Stef; #685849, #690643,
|
||||||
|
#694292, #693814, #694234, #694365, #694287, #694336, #694256, #694261,
|
||||||
|
#663601, #694441, #694284, #694463, #694475, #687248, #694394, #694320,
|
||||||
|
#694701, #694784, #694858, #694906, #694327, #694876, #694905, #694969,
|
||||||
|
#694970, #694988, #695006, #695001, #694998, #695023, #695002, #695073,
|
||||||
|
#695126, #687748, #694837, #693907, #679851, #694988]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Giovanni Campagna, Cosimo Cecchi, Matthias Clasen, Alban Crequy, Allan Day,
|
||||||
|
Guillaume Desmottes, Adel Gadllah, Rui Matos, Daniel Mustieles,
|
||||||
|
Hashem Nasarat, Jasper St. Pierre, Ray Strode, Stef Walter
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Yuri Myasoedov [ru], Adam Matoušek [cs], Piotr Drąg [pl], Matej Urbančič [sl],
|
||||||
|
Sweta Kothari [gu], Kjartan Maraas [nb], Nguyễn Thái Ngọc Duy [vi],
|
||||||
|
Chao-Hsiung Liao [zh_HK, zh_TW], Dimitris Spingos [el],
|
||||||
|
Inaki Larranaga Murgoitio [eu], Luca Ferretti [it], A S Alam [pa],
|
||||||
|
Gheyret Kenji [ug], Stas Solovey [ru], Enrico Nicoletto [pt_BR],
|
||||||
|
Fran Diéguez [gl], Daniel Mustieles [es], Aurimas Černius [lt]
|
||||||
|
|
||||||
3.7.90
|
3.7.90
|
||||||
======
|
======
|
||||||
* Let GNOME Shell work on EGL and GLES2 [Neil; #693225, #693438, #693339]
|
* Let GNOME Shell work on EGL and GLES2 [Neil; #693225, #693438, #693339]
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
AC_PREREQ(2.63)
|
AC_PREREQ(2.63)
|
||||||
AC_INIT([gnome-shell],[3.7.90],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
|
AC_INIT([gnome-shell],[3.8.0.1],[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])
|
||||||
@ -63,7 +63,7 @@ AM_CONDITIONAL(BUILD_RECORDER, $build_recorder)
|
|||||||
CLUTTER_MIN_VERSION=1.13.4
|
CLUTTER_MIN_VERSION=1.13.4
|
||||||
GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1
|
GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1
|
||||||
GJS_MIN_VERSION=1.35.4
|
GJS_MIN_VERSION=1.35.4
|
||||||
MUTTER_MIN_VERSION=3.7.90
|
MUTTER_MIN_VERSION=3.8.0
|
||||||
GTK_MIN_VERSION=3.7.9
|
GTK_MIN_VERSION=3.7.9
|
||||||
GIO_MIN_VERSION=2.35.0
|
GIO_MIN_VERSION=2.35.0
|
||||||
LIBECAL_MIN_VERSION=3.5.3
|
LIBECAL_MIN_VERSION=3.5.3
|
||||||
@ -96,7 +96,7 @@ PKG_CHECK_MODULES(GNOME_SHELL, gio-unix-2.0 >= $GIO_MIN_VERSION
|
|||||||
polkit-agent-1 >= $POLKIT_MIN_VERSION xfixes
|
polkit-agent-1 >= $POLKIT_MIN_VERSION xfixes
|
||||||
libnm-glib libnm-util >= $NETWORKMANAGER_MIN_VERSION
|
libnm-glib libnm-util >= $NETWORKMANAGER_MIN_VERSION
|
||||||
libnm-gtk >= $NETWORKMANAGER_MIN_VERSION
|
libnm-gtk >= $NETWORKMANAGER_MIN_VERSION
|
||||||
gnome-keyring-1 gcr-3 >= $GCR_MIN_VERSION)
|
libsecret-unstable gcr-3 >= $GCR_MIN_VERSION)
|
||||||
|
|
||||||
PKG_CHECK_MODULES(GNOME_SHELL_JS, gio-2.0 gjs-internals-1.0 >= $GJS_MIN_VERSION)
|
PKG_CHECK_MODULES(GNOME_SHELL_JS, gio-2.0 gjs-internals-1.0 >= $GJS_MIN_VERSION)
|
||||||
PKG_CHECK_MODULES(ST, clutter-1.0 gtk+-3.0 libcroco-0.6 >= 0.6.8 x11)
|
PKG_CHECK_MODULES(ST, clutter-1.0 gtk+-3.0 libcroco-0.6 >= 0.6.8 x11)
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
wandadir = $(pkgdatadir)
|
||||||
|
dist_wanda_DATA = wanda.png
|
||||||
|
|
||||||
desktopdir=$(datadir)/applications
|
desktopdir=$(datadir)/applications
|
||||||
desktop_DATA = gnome-shell.desktop gnome-shell-extension-prefs.desktop
|
desktop_DATA = gnome-shell.desktop gnome-shell-extension-prefs.desktop
|
||||||
|
|
||||||
|
@ -125,7 +125,8 @@ StScrollBar StButton#vhandle:active {
|
|||||||
|
|
||||||
/* PopupMenu */
|
/* PopupMenu */
|
||||||
|
|
||||||
.popup-menu-boxpointer {
|
.popup-menu-boxpointer,
|
||||||
|
.candidate-popup-boxpointer {
|
||||||
-arrow-border-radius: 8px;
|
-arrow-border-radius: 8px;
|
||||||
-arrow-background-color: rgba(0,0,0,0.9);
|
-arrow-background-color: rgba(0,0,0,0.9);
|
||||||
-arrow-border-width: 2px;
|
-arrow-border-width: 2px;
|
||||||
@ -315,10 +316,20 @@ StScrollBar StButton#vhandle:active {
|
|||||||
.notification-button:focus,
|
.notification-button:focus,
|
||||||
.notification-icon-button:focus,
|
.notification-icon-button:focus,
|
||||||
.hotplug-notification-item:focus,
|
.hotplug-notification-item:focus,
|
||||||
.modal-dialog-button:focus {
|
.modal-dialog-button:focus,
|
||||||
|
.app-view-control:focus {
|
||||||
border-width: 2px;
|
border-width: 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.app-view-control:focus {
|
||||||
|
padding: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.app-view-control:first-child:ltr:focus,
|
||||||
|
.app-view-control:last-child:rtl:focus {
|
||||||
|
border-right-width: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
.candidate-page-button:active,
|
.candidate-page-button:active,
|
||||||
.candidate-page-button:pressed,
|
.candidate-page-button:pressed,
|
||||||
.notification-button:active,
|
.notification-button:active,
|
||||||
@ -886,8 +897,8 @@ StScrollBar StButton#vhandle:active {
|
|||||||
.search-display > StBoxLayout,
|
.search-display > StBoxLayout,
|
||||||
.all-apps > StBoxLayout,
|
.all-apps > StBoxLayout,
|
||||||
.frequent-apps > StBoxLayout {
|
.frequent-apps > StBoxLayout {
|
||||||
/* horizontal padding to make sure the scrollbar doesn't overlap content */
|
/* horizontal padding to make sure scrollbars or dash don't overlap content */
|
||||||
padding: 0px 18px;
|
padding: 0px 88px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.app-folder-icon {
|
.app-folder-icon {
|
||||||
@ -963,6 +974,10 @@ StScrollBar StButton#vhandle:active {
|
|||||||
color:white;
|
color:white;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.app-display .app-well-app > .overview-icon {
|
||||||
|
border-radius: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
.list-search-result:hover .list-search-result-description {
|
.list-search-result:hover .list-search-result-description {
|
||||||
text-shadow: rgba(0,0,0,0.8) 0px 1px 2px;
|
text-shadow: rgba(0,0,0,0.8) 0px 1px 2px;
|
||||||
}
|
}
|
||||||
@ -1257,15 +1272,15 @@ StScrollBar StButton#vhandle:active {
|
|||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
|
|
||||||
.calendar-other-month-day {
|
|
||||||
color: #333333;
|
|
||||||
}
|
|
||||||
|
|
||||||
.calendar-day-with-events {
|
.calendar-day-with-events {
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
color: white;
|
color: white;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.calendar-other-month-day {
|
||||||
|
color: #333333;
|
||||||
|
}
|
||||||
|
|
||||||
.events-header-vbox {
|
.events-header-vbox {
|
||||||
spacing: 6pt;
|
spacing: 6pt;
|
||||||
padding-right: .5em;
|
padding-right: .5em;
|
||||||
@ -2129,23 +2144,12 @@ StScrollBar StButton#vhandle:active {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* IBus Candidate Popup */
|
/* IBus Candidate Popup */
|
||||||
.candidate-popup-boxpointer {
|
|
||||||
-arrow-border-radius: 8px;
|
|
||||||
-arrow-background-color: #707070;
|
|
||||||
-arrow-border-width: 0px;
|
|
||||||
-arrow-base: 24px;
|
|
||||||
-arrow-rise: 11px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.candidate-popup-content {
|
.candidate-popup-content {
|
||||||
padding: 0.5em;
|
padding: 0.5em;
|
||||||
spacing: 0.3em;
|
spacing: 0.3em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.candidate-popup-text {
|
|
||||||
font-size: 9pt;
|
|
||||||
}
|
|
||||||
|
|
||||||
.candidate-index {
|
.candidate-index {
|
||||||
padding: 0 0.5em 0 0;
|
padding: 0 0.5em 0 0;
|
||||||
color: #cccccc;
|
color: #cccccc;
|
||||||
@ -2211,6 +2215,9 @@ StScrollBar StButton#vhandle:active {
|
|||||||
border: none;
|
border: none;
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
|
|
||||||
|
padding-bottom: 80px;
|
||||||
|
padding-top: 80px;
|
||||||
|
|
||||||
border-radius: 16px;
|
border-radius: 16px;
|
||||||
min-height: 150px;
|
min-height: 150px;
|
||||||
max-height: 700px;
|
max-height: 700px;
|
||||||
|
BIN
data/wanda.png
Normal file
BIN
data/wanda.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 13 KiB |
@ -66,11 +66,4 @@ its dependencies to build from tarballs.</description>
|
|||||||
<gnome:userid>fmuellner</gnome:userid>
|
<gnome:userid>fmuellner</gnome:userid>
|
||||||
</foaf:Person>
|
</foaf:Person>
|
||||||
</maintainer>
|
</maintainer>
|
||||||
<maintainer>
|
|
||||||
<foaf:Person>
|
|
||||||
<foaf:name>Ray Strode</foaf:name>
|
|
||||||
<foaf:mbox rdf:resource="mailto:halfline@gmail.com" />
|
|
||||||
<gnome:userid>halfline</gnome:userid>
|
|
||||||
</foaf:Person>
|
|
||||||
</maintainer>
|
|
||||||
</Project>
|
</Project>
|
||||||
|
@ -594,6 +594,7 @@ const LoginDialog = new Lang.Class({
|
|||||||
this._promptEntry = new St.Entry({ style_class: 'login-dialog-prompt-entry',
|
this._promptEntry = new St.Entry({ style_class: 'login-dialog-prompt-entry',
|
||||||
can_focus: true });
|
can_focus: true });
|
||||||
this._promptEntryTextChangedId = 0;
|
this._promptEntryTextChangedId = 0;
|
||||||
|
this._promptEntryActivateId = 0;
|
||||||
this._promptBox.add(this._promptEntry,
|
this._promptBox.add(this._promptEntry,
|
||||||
{ expand: true,
|
{ expand: true,
|
||||||
x_fill: true,
|
x_fill: true,
|
||||||
@ -690,6 +691,8 @@ const LoginDialog = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_reset: function() {
|
_reset: function() {
|
||||||
|
this._userVerifier.clear();
|
||||||
|
|
||||||
this._updateSensitivity(true);
|
this._updateSensitivity(true);
|
||||||
this._promptMessage.hide();
|
this._promptMessage.hide();
|
||||||
this._user = null;
|
this._user = null;
|
||||||
@ -811,6 +814,11 @@ const LoginDialog = new Lang.Class({
|
|||||||
Lang.bind(this, function() {
|
Lang.bind(this, function() {
|
||||||
this._updateSignInButtonSensitivity(this._promptEntry.text.length > 0);
|
this._updateSignInButtonSensitivity(this._promptEntry.text.length > 0);
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
this._promptEntryActivateId =
|
||||||
|
this._promptEntry.clutter_text.connect('activate', function() {
|
||||||
|
hold.release();
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
_updateSensitivity: function(sensitive) {
|
_updateSensitivity: function(sensitive) {
|
||||||
@ -835,6 +843,11 @@ const LoginDialog = new Lang.Class({
|
|||||||
this._promptEntryTextChangedId = 0;
|
this._promptEntryTextChangedId = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this._promptEntryActivateId > 0) {
|
||||||
|
this._promptEntry.clutter_text.disconnect(this._promptEntryActivateId);
|
||||||
|
this._promptEntryActivateId = 0;
|
||||||
|
}
|
||||||
|
|
||||||
this._setWorking(false);
|
this._setWorking(false);
|
||||||
this._promptBox.hide();
|
this._promptBox.hide();
|
||||||
this._promptLoginHint.hide();
|
this._promptLoginHint.hide();
|
||||||
@ -917,7 +930,7 @@ const LoginDialog = new Lang.Class({
|
|||||||
return batch.run();
|
return batch.run();
|
||||||
},
|
},
|
||||||
|
|
||||||
_onSessionOpened: function(client, serviceName) {
|
_startSession: function(serviceName) {
|
||||||
Tweener.addTween(this.dialogLayout,
|
Tweener.addTween(this.dialogLayout,
|
||||||
{ opacity: 0,
|
{ opacity: 0,
|
||||||
time: _FADE_ANIMATION_TIME,
|
time: _FADE_ANIMATION_TIME,
|
||||||
@ -940,6 +953,18 @@ const LoginDialog = new Lang.Class({
|
|||||||
onCompleteScope: this });
|
onCompleteScope: this });
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_onSessionOpened: function(client, serviceName) {
|
||||||
|
if (!this._userVerifier.hasPendingMessages) {
|
||||||
|
this._startSession(serviceName);
|
||||||
|
} else {
|
||||||
|
let signalId = this._userVerifier.connect('no-more-messages',
|
||||||
|
Lang.bind(this, function() {
|
||||||
|
this._userVerifier.disconnect(signalId);
|
||||||
|
this._startSession(serviceName);
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
_waitForItemForUser: function(userName) {
|
_waitForItemForUser: function(userName) {
|
||||||
let item = this._userList.getItemFromUserName(userName);
|
let item = this._userList.getItemFromUserName(userName);
|
||||||
|
|
||||||
@ -1003,7 +1028,7 @@ const LoginDialog = new Lang.Class({
|
|||||||
function() {
|
function() {
|
||||||
// If we're just starting out, start on the right
|
// If we're just starting out, start on the right
|
||||||
// item.
|
// item.
|
||||||
if (!this.is_loaded) {
|
if (!this._userManager.is_loaded) {
|
||||||
this._userList.jumpToItem(this._timedLoginItem);
|
this._userList.jumpToItem(this._timedLoginItem);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -1141,15 +1166,6 @@ const LoginDialog = new Lang.Class({
|
|||||||
Lang.bind(this, function(userManager, user) {
|
Lang.bind(this, function(userManager, user) {
|
||||||
this._userList.removeUser(user);
|
this._userList.removeUser(user);
|
||||||
}));
|
}));
|
||||||
|
|
||||||
// emitted in idle so caller doesn't have to explicitly check if
|
|
||||||
// it's loaded immediately after construction
|
|
||||||
// (since there's no way the caller could be listening for
|
|
||||||
// 'loaded' yet)
|
|
||||||
Mainloop.idle_add(Lang.bind(this, function() {
|
|
||||||
this.emit('loaded');
|
|
||||||
this.is_loaded = true;
|
|
||||||
}));
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_onOpened: function() {
|
_onOpened: function() {
|
||||||
@ -1164,5 +1180,9 @@ const LoginDialog = new Lang.Class({
|
|||||||
this.parent();
|
this.parent();
|
||||||
|
|
||||||
Main.ctrlAltTabManager.removeGroup(this.dialogLayout);
|
Main.ctrlAltTabManager.removeGroup(this.dialogLayout);
|
||||||
}
|
},
|
||||||
|
|
||||||
|
addCharacter: function(unichar) {
|
||||||
|
this._promptEntry.clutter_text.insert_unichar(unichar);
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
116
js/gdm/util.js
116
js/gdm/util.js
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
const Clutter = imports.gi.Clutter;
|
const Clutter = imports.gi.Clutter;
|
||||||
const Gio = imports.gi.Gio;
|
const Gio = imports.gi.Gio;
|
||||||
|
const GLib = imports.gi.GLib;
|
||||||
const Lang = imports.lang;
|
const Lang = imports.lang;
|
||||||
const Mainloop = imports.mainloop;
|
const Mainloop = imports.mainloop;
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
@ -27,6 +28,9 @@ const ALLOWED_FAILURES_KEY = 'allowed-failures';
|
|||||||
const LOGO_KEY = 'logo';
|
const LOGO_KEY = 'logo';
|
||||||
const DISABLE_USER_LIST_KEY = 'disable-user-list';
|
const DISABLE_USER_LIST_KEY = 'disable-user-list';
|
||||||
|
|
||||||
|
// Give user 16ms to read each character of a PAM message
|
||||||
|
const USER_READ_TIME = 16
|
||||||
|
|
||||||
function fadeInActor(actor) {
|
function fadeInActor(actor) {
|
||||||
if (actor.opacity == 255 && actor.visible)
|
if (actor.opacity == 255 && actor.visible)
|
||||||
return null;
|
return null;
|
||||||
@ -114,6 +118,9 @@ const ShellUserVerifier = new Lang.Class({
|
|||||||
|
|
||||||
this._fprintManager = new Fprint.FprintManager();
|
this._fprintManager = new Fprint.FprintManager();
|
||||||
this._realmManager = new Realmd.Manager();
|
this._realmManager = new Realmd.Manager();
|
||||||
|
this._messageQueue = [];
|
||||||
|
this._messageQueueTimeoutId = 0;
|
||||||
|
this.hasPendingMessages = false;
|
||||||
|
|
||||||
this._failCounter = 0;
|
this._failCounter = 0;
|
||||||
},
|
},
|
||||||
@ -153,13 +160,73 @@ const ShellUserVerifier = new Lang.Class({
|
|||||||
this._userVerifier.run_dispose();
|
this._userVerifier.run_dispose();
|
||||||
this._userVerifier = null;
|
this._userVerifier = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this._clearMessageQueue();
|
||||||
},
|
},
|
||||||
|
|
||||||
answerQuery: function(serviceName, answer) {
|
answerQuery: function(serviceName, answer) {
|
||||||
// Clear any previous message
|
if (!this._userVerifier.hasPendingMessages) {
|
||||||
this.emit('show-message', null, null);
|
this._userVerifier.call_answer_query(serviceName, answer, this._cancellable, null);
|
||||||
|
} else {
|
||||||
|
let signalId = this._userVerifier.connect('no-more-messages',
|
||||||
|
Lang.bind(this, function() {
|
||||||
|
this._userVerifier.disconnect(signalId);
|
||||||
|
this._userVerifier.call_answer_query(serviceName, answer, this._cancellable, null);
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
this._userVerifier.call_answer_query(serviceName, answer, this._cancellable, null);
|
_getIntervalForMessage: function(message) {
|
||||||
|
// We probably could be smarter here
|
||||||
|
return message.length * USER_READ_TIME;
|
||||||
|
},
|
||||||
|
|
||||||
|
finishMessageQueue: function() {
|
||||||
|
if (!this.hasPendingMessages)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this._messageQueue = [];
|
||||||
|
|
||||||
|
this.hasPendingMessages = false;
|
||||||
|
this.emit('no-more-messages');
|
||||||
|
},
|
||||||
|
|
||||||
|
_queueMessageTimeout: function() {
|
||||||
|
if (this._messageQueue.length == 0) {
|
||||||
|
this.finishMessageQueue();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this._messageQueueTimeoutId != 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
let message = this._messageQueue.shift();
|
||||||
|
this.emit('show-message', message.text, message.iconName);
|
||||||
|
|
||||||
|
this._messageQueueTimeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT,
|
||||||
|
message.interval,
|
||||||
|
Lang.bind(this, function() {
|
||||||
|
this._messageQueueTimeoutId = 0;
|
||||||
|
this._queueMessageTimeout();
|
||||||
|
}));
|
||||||
|
},
|
||||||
|
|
||||||
|
_queueMessage: function(message, iconName) {
|
||||||
|
let interval = this._getIntervalForMessage(message);
|
||||||
|
|
||||||
|
this.hasPendingMessages = true;
|
||||||
|
this._messageQueue.push({ text: message, interval: interval, iconName: iconName });
|
||||||
|
this._queueMessageTimeout();
|
||||||
|
},
|
||||||
|
|
||||||
|
_clearMessageQueue: function() {
|
||||||
|
this.finishMessageQueue();
|
||||||
|
|
||||||
|
if (this._messageQueueTimeoutId != 0) {
|
||||||
|
GLib.source_remove(this._messageQueueTimeoutId);
|
||||||
|
this._messageQueueTimeoutId = 0;
|
||||||
|
}
|
||||||
|
this.emit('show-message', null, null);
|
||||||
},
|
},
|
||||||
|
|
||||||
_checkForFingerprintReader: function() {
|
_checkForFingerprintReader: function() {
|
||||||
@ -179,7 +246,7 @@ const ShellUserVerifier = new Lang.Class({
|
|||||||
logError(error, where);
|
logError(error, where);
|
||||||
this._hold.release();
|
this._hold.release();
|
||||||
|
|
||||||
this.emit('show-message', _("Authentication error"), 'login-dialog-message-warning');
|
this._queueMessage(_("Authentication error"), 'login-dialog-message-warning');
|
||||||
this._verificationFailed(false);
|
this._verificationFailed(false);
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -298,7 +365,7 @@ const ShellUserVerifier = new Lang.Class({
|
|||||||
// to indicate the user can swipe their finger instead
|
// to indicate the user can swipe their finger instead
|
||||||
this.emit('show-login-hint', _("(or swipe finger)"));
|
this.emit('show-login-hint', _("(or swipe finger)"));
|
||||||
} else if (serviceName == PASSWORD_SERVICE_NAME) {
|
} else if (serviceName == PASSWORD_SERVICE_NAME) {
|
||||||
this.emit('show-message', info, 'login-dialog-message-info');
|
this._queueMessage(info, 'login-dialog-message-info');
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -307,7 +374,7 @@ const ShellUserVerifier = new Lang.Class({
|
|||||||
// users who haven't enrolled their fingerprint.
|
// users who haven't enrolled their fingerprint.
|
||||||
if (serviceName != PASSWORD_SERVICE_NAME)
|
if (serviceName != PASSWORD_SERVICE_NAME)
|
||||||
return;
|
return;
|
||||||
this.emit('show-message', problem, 'login-dialog-message-warning');
|
this._queueMessage(problem, 'login-dialog-message-warning');
|
||||||
},
|
},
|
||||||
|
|
||||||
_showRealmLoginHint: function() {
|
_showRealmLoginHint: function() {
|
||||||
@ -346,8 +413,6 @@ const ShellUserVerifier = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_onReset: function() {
|
_onReset: function() {
|
||||||
this.clear();
|
|
||||||
|
|
||||||
// Clear previous attempts to authenticate
|
// Clear previous attempts to authenticate
|
||||||
this._failCounter = 0;
|
this._failCounter = 0;
|
||||||
|
|
||||||
@ -358,6 +423,15 @@ const ShellUserVerifier = new Lang.Class({
|
|||||||
this.emit('verification-complete');
|
this.emit('verification-complete');
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_cancelAndReset: function() {
|
||||||
|
this.cancel();
|
||||||
|
this._onReset();
|
||||||
|
},
|
||||||
|
|
||||||
|
_retry: function() {
|
||||||
|
this.begin(this._userName, new Batch.Hold());
|
||||||
|
},
|
||||||
|
|
||||||
_verificationFailed: function(retry) {
|
_verificationFailed: function(retry) {
|
||||||
// For Not Listed / enterprise logins, immediately reset
|
// For Not Listed / enterprise logins, immediately reset
|
||||||
// the dialog
|
// the dialog
|
||||||
@ -369,15 +443,25 @@ const ShellUserVerifier = new Lang.Class({
|
|||||||
this._failCounter < this._settings.get_int(ALLOWED_FAILURES_KEY);
|
this._failCounter < this._settings.get_int(ALLOWED_FAILURES_KEY);
|
||||||
|
|
||||||
if (canRetry) {
|
if (canRetry) {
|
||||||
this.clear();
|
if (!this._userVerifier.hasPendingMessages) {
|
||||||
this.begin(this._userName, new Batch.Hold());
|
this._retry();
|
||||||
|
} else {
|
||||||
|
let signalId = this._userVerifier.connect('no-more-messages',
|
||||||
|
Lang.bind(this, function() {
|
||||||
|
this._userVerifier.disconnect(signalId);
|
||||||
|
this._retry();
|
||||||
|
}));
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// Allow some time to see the message, then reset everything
|
if (!this._userVerifier.hasPendingMessages) {
|
||||||
Mainloop.timeout_add(3000, Lang.bind(this, function() {
|
this._cancelAndReset();
|
||||||
this.cancel();
|
} else {
|
||||||
|
let signalId = this._userVerifier.connect('no-more-messages',
|
||||||
this._onReset();
|
Lang.bind(this, function() {
|
||||||
}));
|
this._userVerifier.disconnect(signalId);
|
||||||
|
this._cancelAndReset();
|
||||||
|
}));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this.emit('verification-failed');
|
this.emit('verification-failed');
|
||||||
|
@ -33,6 +33,10 @@ const SystemdLoginManagerIface = <interface name='org.freedesktop.login1.Manager
|
|||||||
<arg type='s' direction='in'/>
|
<arg type='s' direction='in'/>
|
||||||
<arg type='h' direction='out'/>
|
<arg type='h' direction='out'/>
|
||||||
</method>
|
</method>
|
||||||
|
<method name='GetSession'>
|
||||||
|
<arg type='s' direction='in'/>
|
||||||
|
<arg type='o' direction='out'/>
|
||||||
|
</method>
|
||||||
<method name='ListSessions'>
|
<method name='ListSessions'>
|
||||||
<arg name='sessions' type='a(susso)' direction='out'/>
|
<arg name='sessions' type='a(susso)' direction='out'/>
|
||||||
</method>
|
</method>
|
||||||
@ -72,7 +76,36 @@ const ConsoleKitSession = Gio.DBusProxy.makeProxyWrapper(ConsoleKitSessionIface)
|
|||||||
const ConsoleKitManager = Gio.DBusProxy.makeProxyWrapper(ConsoleKitManagerIface);
|
const ConsoleKitManager = Gio.DBusProxy.makeProxyWrapper(ConsoleKitManagerIface);
|
||||||
|
|
||||||
function haveSystemd() {
|
function haveSystemd() {
|
||||||
return GLib.access("/sys/fs/cgroup/systemd", 0) >= 0;
|
return GLib.access("/run/systemd/seats", 0) >= 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function versionCompare(required, reference) {
|
||||||
|
required = required.split('.');
|
||||||
|
reference = reference.split('.');
|
||||||
|
|
||||||
|
for (let i = 0; i < required.length; i++) {
|
||||||
|
if (required[i] != reference[i])
|
||||||
|
return required[i] < reference[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function canLock() {
|
||||||
|
try {
|
||||||
|
let params = GLib.Variant.new('(ss)', ['org.gnome.DisplayManager.Manager', 'Version']);
|
||||||
|
let result = Gio.DBus.system.call_sync('org.gnome.DisplayManager',
|
||||||
|
'/org/gnome/DisplayManager/Manager',
|
||||||
|
'org.freedesktop.DBus.Properties',
|
||||||
|
'Get', params, null,
|
||||||
|
Gio.DBusCallFlags.NONE,
|
||||||
|
-1, null);
|
||||||
|
|
||||||
|
let version = result.deep_unpack()[0].deep_unpack();
|
||||||
|
return versionCompare('3.5.91', version);
|
||||||
|
} catch(e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let _loginManager = null;
|
let _loginManager = null;
|
||||||
@ -107,15 +140,23 @@ const LoginManagerSystemd = new Lang.Class({
|
|||||||
// Having this function is a bit of a hack since the Systemd and ConsoleKit
|
// Having this function is a bit of a hack since the Systemd and ConsoleKit
|
||||||
// session objects have different interfaces - but in both cases there are
|
// session objects have different interfaces - but in both cases there are
|
||||||
// Lock/Unlock signals, and that's all we count upon at the moment.
|
// Lock/Unlock signals, and that's all we count upon at the moment.
|
||||||
getCurrentSessionProxy: function() {
|
getCurrentSessionProxy: function(callback) {
|
||||||
if (!this._currentSession) {
|
if (this._currentSession) {
|
||||||
this._currentSession = new SystemdLoginSession(Gio.DBus.system,
|
callback (this._currentSession);
|
||||||
'org.freedesktop.login1',
|
return;
|
||||||
'/org/freedesktop/login1/session/' +
|
|
||||||
GLib.getenv('XDG_SESSION_ID'));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return this._currentSession;
|
this._proxy.GetSessionRemote(GLib.getenv('XDG_SESSION_ID'), Lang.bind(this,
|
||||||
|
function(result, error) {
|
||||||
|
if (error) {
|
||||||
|
logError(error, 'Could not get a proxy for the current session');
|
||||||
|
} else {
|
||||||
|
this._currentSession = new SystemdLoginSession(Gio.DBus.system,
|
||||||
|
'org.freedesktop.login1',
|
||||||
|
result[0]);
|
||||||
|
callback(this._currentSession);
|
||||||
|
}
|
||||||
|
}));
|
||||||
},
|
},
|
||||||
|
|
||||||
canPowerOff: function(asyncCallback) {
|
canPowerOff: function(asyncCallback) {
|
||||||
@ -204,15 +245,23 @@ const LoginManagerConsoleKit = new Lang.Class({
|
|||||||
// Having this function is a bit of a hack since the Systemd and ConsoleKit
|
// Having this function is a bit of a hack since the Systemd and ConsoleKit
|
||||||
// session objects have different interfaces - but in both cases there are
|
// session objects have different interfaces - but in both cases there are
|
||||||
// Lock/Unlock signals, and that's all we count upon at the moment.
|
// Lock/Unlock signals, and that's all we count upon at the moment.
|
||||||
getCurrentSessionProxy: function() {
|
getCurrentSessionProxy: function(callback) {
|
||||||
if (!this._currentSession) {
|
if (this._currentSession) {
|
||||||
let [currentSessionId] = this._proxy.GetCurrentSessionSync();
|
callback (this._currentSession);
|
||||||
this._currentSession = new ConsoleKitSession(Gio.DBus.system,
|
return;
|
||||||
'org.freedesktop.ConsoleKit',
|
|
||||||
currentSessionId);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return this._currentSession;
|
this._proxy.GetCurrentSessionRemote(Lang.bind(this,
|
||||||
|
function(result, error) {
|
||||||
|
if (error) {
|
||||||
|
logError(error, 'Could not get a proxy for the current session');
|
||||||
|
} else {
|
||||||
|
this._currentSession = new ConsoleKitSession(Gio.DBus.system,
|
||||||
|
'org.freedesktop.ConsoleKit',
|
||||||
|
result[0]);
|
||||||
|
callback(this._currentSession);
|
||||||
|
}
|
||||||
|
}));
|
||||||
},
|
},
|
||||||
|
|
||||||
canPowerOff: function(asyncCallback) {
|
canPowerOff: function(asyncCallback) {
|
||||||
|
@ -5,6 +5,9 @@ const GLib = imports.gi.GLib;
|
|||||||
const St = imports.gi.St;
|
const St = imports.gi.St;
|
||||||
|
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
|
const Tweener = imports.ui.tweener;
|
||||||
|
|
||||||
|
const SCROLL_TIME = 0.1;
|
||||||
|
|
||||||
// http://daringfireball.net/2010/07/improved_regex_for_matching_urls
|
// http://daringfireball.net/2010/07/improved_regex_for_matching_urls
|
||||||
const _balancedParens = '\\((?:[^\\s()<>]+|(?:\\(?:[^\\s()<>]+\\)))*\\)';
|
const _balancedParens = '\\((?:[^\\s()<>]+|(?:\\(?:[^\\s()<>]+\\)))*\\)';
|
||||||
@ -234,3 +237,39 @@ function makeCloseButton() {
|
|||||||
|
|
||||||
return closeButton;
|
return closeButton;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function ensureActorVisibleInScrollView(scrollView, actor) {
|
||||||
|
let adjustment = scrollView.vscroll.adjustment;
|
||||||
|
let [value, lower, upper, stepIncrement, pageIncrement, pageSize] = adjustment.get_values();
|
||||||
|
|
||||||
|
let offset = 0;
|
||||||
|
let vfade = scrollView.get_effect("fade");
|
||||||
|
if (vfade)
|
||||||
|
offset = vfade.vfade_offset;
|
||||||
|
|
||||||
|
let box = actor.get_allocation_box();
|
||||||
|
let y1 = box.y1, y2 = box.y2;
|
||||||
|
|
||||||
|
let parent = actor.get_parent();
|
||||||
|
while (parent != scrollView) {
|
||||||
|
if (!parent)
|
||||||
|
throw new Error("actor not in scroll view");
|
||||||
|
|
||||||
|
let box = parent.get_allocation_box();
|
||||||
|
y1 += box.y1;
|
||||||
|
y2 += box.y1;
|
||||||
|
parent = parent.get_parent();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (y1 < value + offset)
|
||||||
|
value = Math.max(0, y1 - offset);
|
||||||
|
else if (y2 > value + pageSize - offset)
|
||||||
|
value = Math.min(upper, y2 + offset - pageSize);
|
||||||
|
else
|
||||||
|
return;
|
||||||
|
|
||||||
|
Tweener.addTween(adjustment,
|
||||||
|
{ value: value,
|
||||||
|
time: SCROLL_TIME,
|
||||||
|
transition: 'easeOutQuad' });
|
||||||
|
}
|
||||||
|
@ -232,11 +232,11 @@ const AppSwitcherPopup = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_finish : function(timestamp) {
|
_finish : function(timestamp) {
|
||||||
this.parent();
|
|
||||||
|
|
||||||
let appIcon = this._items[this._selectedIndex];
|
let appIcon = this._items[this._selectedIndex];
|
||||||
let window = this._currentWindow > 0 ? this._currentWindow : 0;
|
let window = this._currentWindow > 0 ? this._currentWindow : 0;
|
||||||
appIcon.app.activate_window(appIcon.cachedWindows[window], timestamp);
|
appIcon.app.activate_window(appIcon.cachedWindows[window], timestamp);
|
||||||
|
|
||||||
|
this.parent();
|
||||||
},
|
},
|
||||||
|
|
||||||
_onDestroy : function() {
|
_onDestroy : function() {
|
||||||
@ -395,9 +395,9 @@ const WindowSwitcherPopup = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_finish: function() {
|
_finish: function() {
|
||||||
this.parent();
|
|
||||||
|
|
||||||
Main.activateWindow(this._items[this._selectedIndex].window);
|
Main.activateWindow(this._items[this._selectedIndex].window);
|
||||||
|
|
||||||
|
this.parent();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -29,7 +29,6 @@ const Util = imports.misc.util;
|
|||||||
|
|
||||||
const MAX_APPLICATION_WORK_MILLIS = 75;
|
const MAX_APPLICATION_WORK_MILLIS = 75;
|
||||||
const MENU_POPUP_TIMEOUT = 600;
|
const MENU_POPUP_TIMEOUT = 600;
|
||||||
const SCROLL_TIME = 0.1;
|
|
||||||
const MAX_COLUMNS = 6;
|
const MAX_COLUMNS = 6;
|
||||||
|
|
||||||
const INACTIVE_GRID_OPACITY = 77;
|
const INACTIVE_GRID_OPACITY = 77;
|
||||||
@ -157,6 +156,30 @@ const FolderView = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const AllViewLayout = new Lang.Class({
|
||||||
|
Name: 'AllViewLayout',
|
||||||
|
Extends: Clutter.BinLayout,
|
||||||
|
|
||||||
|
vfunc_get_preferred_height: function(container, forWidth) {
|
||||||
|
let minBottom = 0;
|
||||||
|
let naturalBottom = 0;
|
||||||
|
|
||||||
|
for (let child = container.get_first_child();
|
||||||
|
child;
|
||||||
|
child = child.get_next_sibling()) {
|
||||||
|
let childY = child.y;
|
||||||
|
let [childMin, childNatural] = child.get_preferred_height(forWidth);
|
||||||
|
|
||||||
|
if (childMin + childY > minBottom)
|
||||||
|
minBottom = childMin + childY;
|
||||||
|
|
||||||
|
if (childNatural + childY > naturalBottom)
|
||||||
|
naturalBottom = childNatural + childY;
|
||||||
|
}
|
||||||
|
return [minBottom, naturalBottom];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
const AllView = new Lang.Class({
|
const AllView = new Lang.Class({
|
||||||
Name: 'AllView',
|
Name: 'AllView',
|
||||||
Extends: AlphabeticalView,
|
Extends: AlphabeticalView,
|
||||||
@ -165,7 +188,7 @@ const AllView = new Lang.Class({
|
|||||||
this.parent();
|
this.parent();
|
||||||
|
|
||||||
let box = new St.BoxLayout({ vertical: true });
|
let box = new St.BoxLayout({ vertical: true });
|
||||||
this._stack = new St.Widget({ layout_manager: new Clutter.BinLayout() });
|
this._stack = new St.Widget({ layout_manager: new AllViewLayout() });
|
||||||
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);
|
||||||
@ -259,29 +282,7 @@ const AllView = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_ensureIconVisible: function(icon) {
|
_ensureIconVisible: function(icon) {
|
||||||
let adjustment = this.actor.vscroll.adjustment;
|
Util.ensureActorVisibleInScrollView(this.actor, icon);
|
||||||
let [value, lower, upper, stepIncrement, pageIncrement, pageSize] = adjustment.get_values();
|
|
||||||
|
|
||||||
let offset = 0;
|
|
||||||
let vfade = this.actor.get_effect("fade");
|
|
||||||
if (vfade)
|
|
||||||
offset = vfade.vfade_offset;
|
|
||||||
|
|
||||||
// If this gets called as part of a right-click, the actor
|
|
||||||
// will be needs_allocation, and so "icon.y" would return 0
|
|
||||||
let box = icon.get_allocation_box();
|
|
||||||
|
|
||||||
if (box.y1 < value + offset)
|
|
||||||
value = Math.max(0, box.y1 - offset);
|
|
||||||
else if (box.y2 > value + pageSize - offset)
|
|
||||||
value = Math.min(upper, box.y2 + offset - pageSize);
|
|
||||||
else
|
|
||||||
return;
|
|
||||||
|
|
||||||
Tweener.addTween(adjustment,
|
|
||||||
{ value: value,
|
|
||||||
time: SCROLL_TIME,
|
|
||||||
transition: 'easeOutQuad' });
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_updateIconOpacities: function(folderOpen) {
|
_updateIconOpacities: function(folderOpen) {
|
||||||
|
@ -38,6 +38,7 @@ const BackgroundCache = new Lang.Class({
|
|||||||
_init: function() {
|
_init: function() {
|
||||||
this._patterns = [];
|
this._patterns = [];
|
||||||
this._images = [];
|
this._images = [];
|
||||||
|
this._pendingFileLoads = [];
|
||||||
this._fileMonitors = {};
|
this._fileMonitors = {};
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -84,10 +85,10 @@ const BackgroundCache = new Lang.Class({
|
|||||||
} else {
|
} else {
|
||||||
content.load_gradient(params.shadingType, params.color, params.secondColor);
|
content.load_gradient(params.shadingType, params.color, params.secondColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
this._patterns.push(content);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this._patterns.push(content);
|
||||||
|
|
||||||
return content;
|
return content;
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -128,6 +129,73 @@ const BackgroundCache = new Lang.Class({
|
|||||||
this._removeContent(this._images, content);
|
this._removeContent(this._images, content);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_loadImageContent: function(params) {
|
||||||
|
params = Params.parse(params, { monitorIndex: 0,
|
||||||
|
style: null,
|
||||||
|
filename: null,
|
||||||
|
effects: Meta.BackgroundEffects.NONE,
|
||||||
|
cancellable: null,
|
||||||
|
onFinished: null });
|
||||||
|
|
||||||
|
for (let i = 0; i < this._pendingFileLoads.length; i++) {
|
||||||
|
if (this._pendingFileLoads[i].filename == params.filename &&
|
||||||
|
this._pendingFileLoads[i].style == params.style) {
|
||||||
|
this._pendingFileLoads[i].callers.push({ shouldCopy: true,
|
||||||
|
monitorIndex: params.monitorIndex,
|
||||||
|
effects: params.effects,
|
||||||
|
onFinished: params.onFinished });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this._pendingFileLoads.push({ filename: params.filename,
|
||||||
|
style: params.style,
|
||||||
|
callers: [{ shouldCopy: false,
|
||||||
|
monitorIndex: params.monitorIndex,
|
||||||
|
effects: params.effects,
|
||||||
|
onFinished: params.onFinished }] });
|
||||||
|
|
||||||
|
let content = new Meta.Background({ meta_screen: global.screen,
|
||||||
|
monitor: params.monitorIndex,
|
||||||
|
effects: params.effects });
|
||||||
|
|
||||||
|
content.load_file_async(params.filename,
|
||||||
|
params.style,
|
||||||
|
params.cancellable,
|
||||||
|
Lang.bind(this,
|
||||||
|
function(object, result) {
|
||||||
|
try {
|
||||||
|
content.load_file_finish(result);
|
||||||
|
|
||||||
|
this._monitorFile(params.filename);
|
||||||
|
this._images.push(content);
|
||||||
|
} catch(e) {
|
||||||
|
content = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let i = 0; i < this._pendingFileLoads.length; i++) {
|
||||||
|
let pendingLoad = this._pendingFileLoads[i];
|
||||||
|
if (pendingLoad.filename != params.filename ||
|
||||||
|
pendingLoad.style != params.style)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
for (let j = 0; j < pendingLoad.callers.length; j++) {
|
||||||
|
if (pendingLoad.callers[j].onFinished) {
|
||||||
|
if (content && pendingLoad.callers[j].shouldCopy) {
|
||||||
|
content = object.copy(pendingLoad.callers[j].monitorIndex,
|
||||||
|
pendingLoad.callers[j].effects);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
pendingLoad.callers[j].onFinished(content);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this._pendingFileLoads.splice(i, 1);
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
},
|
||||||
|
|
||||||
getImageContent: function(params) {
|
getImageContent: function(params) {
|
||||||
params = Params.parse(params, { monitorIndex: 0,
|
params = Params.parse(params, { monitorIndex: 0,
|
||||||
style: null,
|
style: null,
|
||||||
@ -165,31 +233,19 @@ const BackgroundCache = new Lang.Class({
|
|||||||
|
|
||||||
if (params.cancellable && params.cancellable.is_cancelled())
|
if (params.cancellable && params.cancellable.is_cancelled())
|
||||||
content = null;
|
content = null;
|
||||||
|
else
|
||||||
|
this._images.push(content);
|
||||||
|
|
||||||
if (params.onFinished)
|
if (params.onFinished)
|
||||||
params.onFinished(content);
|
params.onFinished(content);
|
||||||
} else {
|
} else {
|
||||||
content = new Meta.Background({ meta_screen: global.screen,
|
this._loadImageContent({ filename: params.filename,
|
||||||
monitor: params.monitorIndex,
|
style: params.style,
|
||||||
effects: params.effects });
|
effects: params.effects,
|
||||||
|
monitorIndex: params.monitorIndex,
|
||||||
|
cancellable: params.cancellable,
|
||||||
|
onFinished: params.onFinished });
|
||||||
|
|
||||||
content.load_file_async(params.filename,
|
|
||||||
params.style,
|
|
||||||
params.cancellable,
|
|
||||||
Lang.bind(this,
|
|
||||||
function(object, result) {
|
|
||||||
try {
|
|
||||||
content.load_file_finish(result);
|
|
||||||
|
|
||||||
this._monitorFile(params.filename);
|
|
||||||
this._images.push(content);
|
|
||||||
} catch(e) {
|
|
||||||
content = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (params.onFinished)
|
|
||||||
params.onFinished(content);
|
|
||||||
}));
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -267,9 +323,9 @@ const Background = new Lang.Class({
|
|||||||
_destroy: function() {
|
_destroy: function() {
|
||||||
this._cancellable.cancel();
|
this._cancellable.cancel();
|
||||||
|
|
||||||
if (this._animationUpdateTimeoutId) {
|
if (this._updateAnimationTimeoutId) {
|
||||||
GLib.source_remove (this._animationUpdateTimeoutId);
|
GLib.source_remove (this._updateAnimationTimeoutId);
|
||||||
this._animationUpdateTimeoutId = 0
|
this._updateAnimationTimeoutId = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
let i;
|
let i;
|
||||||
@ -356,7 +412,10 @@ const Background = new Lang.Class({
|
|||||||
|
|
||||||
let actor = new Meta.BackgroundActor();
|
let actor = new Meta.BackgroundActor();
|
||||||
actor.content = content;
|
actor.content = content;
|
||||||
this.actor.add_child(actor);
|
|
||||||
|
// The background pattern is the first actor in
|
||||||
|
// the group, and all images should be above that.
|
||||||
|
this.actor.insert_child_at_index(actor, index + 1);
|
||||||
|
|
||||||
this._images[index] = actor;
|
this._images[index] = actor;
|
||||||
this._watchCacheFile(filename);
|
this._watchCacheFile(filename);
|
||||||
@ -367,27 +426,27 @@ const Background = new Lang.Class({
|
|||||||
content.brightness = this._brightness;
|
content.brightness = this._brightness;
|
||||||
content.vignette_sharpness = this._vignetteSharpness;
|
content.vignette_sharpness = this._vignetteSharpness;
|
||||||
|
|
||||||
|
this._cache.removeImageContent(content);
|
||||||
this._images[index].content = content;
|
this._images[index].content = content;
|
||||||
this._watchCacheFile(filename);
|
this._watchCacheFile(filename);
|
||||||
},
|
},
|
||||||
|
|
||||||
_updateAnimationProgress: function() {
|
_updateAnimationProgress: function() {
|
||||||
if (this._images[1]) {
|
if (this._images[1])
|
||||||
this._images[1].raise_top();
|
|
||||||
this._images[1].opacity = this._animation.transitionProgress * 255;
|
this._images[1].opacity = this._animation.transitionProgress * 255;
|
||||||
}
|
|
||||||
|
|
||||||
this._queueAnimationUpdate();
|
this._queueUpdateAnimation();
|
||||||
},
|
},
|
||||||
|
|
||||||
_updateAnimation: function() {
|
_updateAnimation: function() {
|
||||||
this._animationUpdateTimeoutId = 0;
|
this._updateAnimationTimeoutId = 0;
|
||||||
|
|
||||||
let files = this._animation.getKeyFrameFiles(this._layoutManager.monitors[this._monitorIndex]);
|
this._animation.update(this._layoutManager.monitors[this._monitorIndex]);
|
||||||
|
let files = this._animation.keyFrameFiles;
|
||||||
|
|
||||||
if (!files) {
|
if (files.length == 0) {
|
||||||
this._setLoaded();
|
this._setLoaded();
|
||||||
this._queueAnimationUpdate();
|
this._queueUpdateAnimation();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -406,7 +465,7 @@ const Background = new Lang.Class({
|
|||||||
style: this._style,
|
style: this._style,
|
||||||
filename: files[i],
|
filename: files[i],
|
||||||
cancellable: this._cancellable,
|
cancellable: this._cancellable,
|
||||||
onFinished: Lang.bind(this, function(content) {
|
onFinished: Lang.bind(this, function(content, i) {
|
||||||
numPendingImages--;
|
numPendingImages--;
|
||||||
|
|
||||||
if (!content) {
|
if (!content) {
|
||||||
@ -426,27 +485,34 @@ const Background = new Lang.Class({
|
|||||||
this._setLoaded();
|
this._setLoaded();
|
||||||
this._updateAnimationProgress();
|
this._updateAnimationProgress();
|
||||||
}
|
}
|
||||||
})
|
}, i)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_queueAnimationUpdate: function() {
|
_queueUpdateAnimation: function() {
|
||||||
if (this._animationUpdateTimeoutId != 0)
|
if (this._updateAnimationTimeoutId != 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!this._cancellable || this._cancellable.is_cancelled())
|
if (!this._cancellable || this._cancellable.is_cancelled())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!this._animation.duration)
|
if (!this._animation.transitionDuration)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
let nSteps = 255 / ANIMATION_OPACITY_STEP_INCREMENT;
|
||||||
|
let timePerStep = (this._animation.transitionDuration * 1000) / nSteps;
|
||||||
|
|
||||||
let interval = Math.max(ANIMATION_MIN_WAKEUP_INTERVAL * 1000,
|
let interval = Math.max(ANIMATION_MIN_WAKEUP_INTERVAL * 1000,
|
||||||
ANIMATION_OPACITY_STEP_INCREMENT / this._animation.duration);
|
timePerStep);
|
||||||
this._animationUpdateTimeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT,
|
|
||||||
|
if (interval > GLib.MAXUINT32)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this._updateAnimationTimeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT,
|
||||||
interval,
|
interval,
|
||||||
Lang.bind(this, function() {
|
Lang.bind(this, function() {
|
||||||
this._animationUpdateTimeoutId = 0;
|
this._updateAnimationTimeoutId = 0;
|
||||||
this._updateAnimation();
|
this._updateAnimation();
|
||||||
return false;
|
return false;
|
||||||
}));
|
}));
|
||||||
@ -585,9 +651,9 @@ const Animation = new Lang.Class({
|
|||||||
params = Params.parse(params, { filename: null });
|
params = Params.parse(params, { filename: null });
|
||||||
|
|
||||||
this.filename = params.filename;
|
this.filename = params.filename;
|
||||||
this._keyFrames = [];
|
this.keyFrameFiles = [];
|
||||||
this.duration = 0.0;
|
|
||||||
this.transitionProgress = 0.0;
|
this.transitionProgress = 0.0;
|
||||||
|
this.transitionDuration = 0.0;
|
||||||
this.loaded = false;
|
this.loaded = false;
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -599,33 +665,31 @@ const Animation = new Lang.Class({
|
|||||||
this._show.load_async(null,
|
this._show.load_async(null,
|
||||||
Lang.bind(this,
|
Lang.bind(this,
|
||||||
function(object, result) {
|
function(object, result) {
|
||||||
this.duration = this._show.get_total_duration();
|
|
||||||
this.loaded = true;
|
this.loaded = true;
|
||||||
if (callback)
|
if (callback)
|
||||||
callback();
|
callback();
|
||||||
}));
|
}));
|
||||||
},
|
},
|
||||||
|
|
||||||
getKeyFrameFiles: function(monitor) {
|
update: function(monitor) {
|
||||||
|
this.keyFrameFiles = [];
|
||||||
|
|
||||||
if (!this._show)
|
if (!this._show)
|
||||||
return null;
|
return;
|
||||||
|
|
||||||
if (this._show.get_num_slides() < 1)
|
if (this._show.get_num_slides() < 1)
|
||||||
return null;
|
return;
|
||||||
|
|
||||||
let [progress, duration, isFixed, file1, file2] = this._show.get_current_slide(monitor.width, monitor.height);
|
let [progress, duration, isFixed, file1, file2] = this._show.get_current_slide(monitor.width, monitor.height);
|
||||||
|
|
||||||
|
this.transitionDuration = duration;
|
||||||
this.transitionProgress = progress;
|
this.transitionProgress = progress;
|
||||||
|
|
||||||
let files = [];
|
|
||||||
|
|
||||||
if (file1)
|
if (file1)
|
||||||
files.push(file1);
|
this.keyFrameFiles.push(file1);
|
||||||
|
|
||||||
if (file2)
|
if (file2)
|
||||||
files.push(file2);
|
this.keyFrameFiles.push(file2);
|
||||||
|
|
||||||
return files;
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
Signals.addSignalMethods(Animation.prototype);
|
Signals.addSignalMethods(Animation.prototype);
|
||||||
@ -648,17 +712,9 @@ const BackgroundManager = new Lang.Class({
|
|||||||
|
|
||||||
this.background = this._createBackground();
|
this.background = this._createBackground();
|
||||||
this._newBackground = null;
|
this._newBackground = null;
|
||||||
this._loadedSignalId = 0;
|
|
||||||
this._changedSignalId = 0;
|
|
||||||
},
|
},
|
||||||
|
|
||||||
destroy: function() {
|
destroy: function() {
|
||||||
if (this._loadedSignalId)
|
|
||||||
this._newBackground.disconnect(this._loadedSignalId);
|
|
||||||
|
|
||||||
if (this._changedSignalId)
|
|
||||||
this.background.disconnect(this._changedSignalId);
|
|
||||||
|
|
||||||
if (this._newBackground) {
|
if (this._newBackground) {
|
||||||
this._newBackground.actor.destroy();
|
this._newBackground.actor.destroy();
|
||||||
this._newBackground = null;
|
this._newBackground = null;
|
||||||
@ -677,22 +733,24 @@ const BackgroundManager = new Lang.Class({
|
|||||||
newBackground.saturation = background.saturation;
|
newBackground.saturation = background.saturation;
|
||||||
newBackground.visible = background.visible;
|
newBackground.visible = background.visible;
|
||||||
|
|
||||||
let signalId = newBackground.connect('loaded',
|
newBackground.loadedSignalId = newBackground.connect('loaded',
|
||||||
Lang.bind(this, function() {
|
Lang.bind(this, function() {
|
||||||
newBackground.disconnect(signalId);
|
newBackground.disconnect(newBackground.loadedSignalId);
|
||||||
|
newBackground.loadedSignalId = 0;
|
||||||
Tweener.addTween(background.actor,
|
Tweener.addTween(background.actor,
|
||||||
{ opacity: 0,
|
{ opacity: 0,
|
||||||
time: FADE_ANIMATION_TIME,
|
time: FADE_ANIMATION_TIME,
|
||||||
transition: 'easeOutQuad',
|
transition: 'easeOutQuad',
|
||||||
onComplete: Lang.bind(this, function() {
|
onComplete: Lang.bind(this, function() {
|
||||||
this.background = newBackground;
|
if (this.background == background) {
|
||||||
this._newBackground = null;
|
this.background = newBackground;
|
||||||
background.actor.destroy();
|
this._newBackground = null;
|
||||||
|
background.actor.destroy();
|
||||||
|
}
|
||||||
this.emit('changed');
|
this.emit('changed');
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
}));
|
}));
|
||||||
this._loadedSignalId = signalId;
|
|
||||||
|
|
||||||
this._newBackground = newBackground;
|
this._newBackground = newBackground;
|
||||||
},
|
},
|
||||||
@ -711,12 +769,19 @@ const BackgroundManager = new Lang.Class({
|
|||||||
background.actor.lower_bottom();
|
background.actor.lower_bottom();
|
||||||
}
|
}
|
||||||
|
|
||||||
let signalId = background.connect('changed', Lang.bind(this, function() {
|
background.changeSignalId = background.connect('changed', Lang.bind(this, function() {
|
||||||
background.disconnect(signalId);
|
background.disconnect(background.changeSignalId);
|
||||||
|
background.changeSignalId = 0;
|
||||||
this._updateBackground(background, this._monitorIndex);
|
this._updateBackground(background, this._monitorIndex);
|
||||||
}));
|
}));
|
||||||
|
|
||||||
this._changedSignalId = signalId;
|
background.actor.connect('destroy', Lang.bind(this, function() {
|
||||||
|
if (background.changeSignalId)
|
||||||
|
background.disconnect(background.changeSignalId);
|
||||||
|
|
||||||
|
if (background.loadedSignalId)
|
||||||
|
background.disconnect(background.loadedSignalId);
|
||||||
|
}));
|
||||||
|
|
||||||
return background;
|
return background;
|
||||||
},
|
},
|
||||||
|
@ -55,4 +55,10 @@ function addBackgroundMenu(actor) {
|
|||||||
openMenu();
|
openMenu();
|
||||||
});
|
});
|
||||||
actor.add_action(clickAction);
|
actor.add_action(clickAction);
|
||||||
|
|
||||||
|
actor.connect('destroy', function() {
|
||||||
|
actor._backgroundMenu.destroy();
|
||||||
|
actor._backgroundMenu = null;
|
||||||
|
actor._backgroundManager = null;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
@ -71,7 +71,7 @@ function _formatEventTime(event, clockFormat) {
|
|||||||
default:
|
default:
|
||||||
/* explicit fall-through */
|
/* explicit fall-through */
|
||||||
case '12h':
|
case '12h':
|
||||||
/* Transators: Shown in calendar event list, if 12h format,
|
/* Translators: Shown in calendar event list, if 12h format,
|
||||||
\u2236 is a ratio character, similar to : and \u2009 is
|
\u2236 is a ratio character, similar to : and \u2009 is
|
||||||
a thin space */
|
a thin space */
|
||||||
ret = event.date.toLocaleFormat(C_("event list time", "%l\u2236%M\u2009%p"));
|
ret = event.date.toLocaleFormat(C_("event list time", "%l\u2236%M\u2009%p"));
|
||||||
@ -168,6 +168,12 @@ const EmptyEventSource = new Lang.Class({
|
|||||||
Name: 'EmptyEventSource',
|
Name: 'EmptyEventSource',
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
|
this.isLoading = false;
|
||||||
|
this.isDummy = true;
|
||||||
|
this.hasCalendars = false;
|
||||||
|
},
|
||||||
|
|
||||||
|
destroy: function() {
|
||||||
},
|
},
|
||||||
|
|
||||||
requestRange: function(begin, end) {
|
requestRange: function(begin, end) {
|
||||||
@ -191,6 +197,7 @@ const CalendarServerIface = <interface name="org.gnome.Shell.CalendarServer">
|
|||||||
<arg type="b" direction="in" />
|
<arg type="b" direction="in" />
|
||||||
<arg type="a(sssbxxa{sv})" direction="out" />
|
<arg type="a(sssbxxa{sv})" direction="out" />
|
||||||
</method>
|
</method>
|
||||||
|
<property name="HasCalendars" type="b" access="read" />
|
||||||
<signal name="Changed" />
|
<signal name="Changed" />
|
||||||
</interface>;
|
</interface>;
|
||||||
|
|
||||||
@ -201,8 +208,7 @@ function CalendarServer() {
|
|||||||
g_interface_name: CalendarServerInfo.name,
|
g_interface_name: CalendarServerInfo.name,
|
||||||
g_interface_info: CalendarServerInfo,
|
g_interface_info: CalendarServerInfo,
|
||||||
g_name: 'org.gnome.Shell.CalendarServer',
|
g_name: 'org.gnome.Shell.CalendarServer',
|
||||||
g_object_path: '/org/gnome/Shell/CalendarServer',
|
g_object_path: '/org/gnome/Shell/CalendarServer' });
|
||||||
g_flags: Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES });
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function _datesEqual(a, b) {
|
function _datesEqual(a, b) {
|
||||||
@ -229,6 +235,8 @@ const DBusEventSource = new Lang.Class({
|
|||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
this._resetCache();
|
this._resetCache();
|
||||||
|
this.isLoading = false;
|
||||||
|
this.isDummy = false;
|
||||||
|
|
||||||
this._initialized = false;
|
this._initialized = false;
|
||||||
this._dbusProxy = new CalendarServer();
|
this._dbusProxy = new CalendarServer();
|
||||||
@ -249,11 +257,27 @@ const DBusEventSource = new Lang.Class({
|
|||||||
this._onNameVanished();
|
this._onNameVanished();
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
this._dbusProxy.connect('g-properties-changed', Lang.bind(this, function() {
|
||||||
|
this.emit('notify::has-calendars');
|
||||||
|
}));
|
||||||
|
|
||||||
this._initialized = true;
|
this._initialized = true;
|
||||||
|
this.emit('notify::has-calendars');
|
||||||
this._onNameAppeared();
|
this._onNameAppeared();
|
||||||
}));
|
}));
|
||||||
},
|
},
|
||||||
|
|
||||||
|
destroy: function() {
|
||||||
|
this._dbusProxy.run_dispose();
|
||||||
|
},
|
||||||
|
|
||||||
|
get hasCalendars() {
|
||||||
|
if (this._initialized)
|
||||||
|
return this._dbusProxy.HasCalendars;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
|
||||||
_resetCache: function() {
|
_resetCache: function() {
|
||||||
this._events = [];
|
this._events = [];
|
||||||
this._lastRequestBegin = null;
|
this._lastRequestBegin = null;
|
||||||
@ -293,6 +317,7 @@ const DBusEventSource = new Lang.Class({
|
|||||||
}
|
}
|
||||||
|
|
||||||
this._events = newEvents;
|
this._events = newEvents;
|
||||||
|
this.isLoading = false;
|
||||||
this.emit('changed');
|
this.emit('changed');
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -315,6 +340,7 @@ const DBusEventSource = new Lang.Class({
|
|||||||
|
|
||||||
requestRange: function(begin, end, forceReload) {
|
requestRange: function(begin, end, forceReload) {
|
||||||
if (forceReload || !(_datesEqual(begin, this._lastRequestBegin) && _datesEqual(end, this._lastRequestEnd))) {
|
if (forceReload || !(_datesEqual(begin, this._lastRequestBegin) && _datesEqual(end, this._lastRequestEnd))) {
|
||||||
|
this.isLoading = true;
|
||||||
this._lastRequestBegin = begin;
|
this._lastRequestBegin = begin;
|
||||||
this._lastRequestEnd = end;
|
this._lastRequestEnd = end;
|
||||||
this._curRequestBegin = begin;
|
this._curRequestBegin = begin;
|
||||||
@ -389,19 +415,11 @@ const Calendar = new Lang.Class({
|
|||||||
// @eventSource: is an object implementing the EventSource API, e.g. the
|
// @eventSource: is an object implementing the EventSource API, e.g. the
|
||||||
// requestRange(), getEvents(), hasEvents() methods and the ::changed signal.
|
// requestRange(), getEvents(), hasEvents() methods and the ::changed signal.
|
||||||
setEventSource: function(eventSource) {
|
setEventSource: function(eventSource) {
|
||||||
if (this._eventSource) {
|
|
||||||
this._eventSource.disconnect(this._eventSourceChangedId);
|
|
||||||
this._eventSource = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
this._eventSource = eventSource;
|
this._eventSource = eventSource;
|
||||||
|
this._eventSource.connect('changed', Lang.bind(this, function() {
|
||||||
if (this._eventSource) {
|
this._update(false);
|
||||||
this._eventSourceChangedId = this._eventSource.connect('changed', Lang.bind(this, function() {
|
}));
|
||||||
this._update(false);
|
this._update(true);
|
||||||
}));
|
|
||||||
this._update(true);
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
// Sets the calendar to show a specific date
|
// Sets the calendar to show a specific date
|
||||||
@ -538,20 +556,44 @@ const Calendar = new Lang.Class({
|
|||||||
children[i].destroy();
|
children[i].destroy();
|
||||||
|
|
||||||
// Start at the beginning of the week before the start of the month
|
// Start at the beginning of the week before the start of the month
|
||||||
|
//
|
||||||
|
// We want to show always 6 weeks (to keep the calendar menu at the same
|
||||||
|
// height if there are no events), so we pad it according to the following
|
||||||
|
// policy:
|
||||||
|
//
|
||||||
|
// 1 - If a month has 6 weeks, we place no padding (example: Dec 2012)
|
||||||
|
// 2 - If a month has 5 weeks and it starts on week start, we pad one week
|
||||||
|
// before it (example: Apr 2012)
|
||||||
|
// 3 - If a month has 5 weeks and it starts on any other day, we pad one week
|
||||||
|
// after it (example: Nov 2012)
|
||||||
|
// 4 - If a month has 4 weeks, we pad one week before and one after it
|
||||||
|
// (example: Feb 2010)
|
||||||
|
//
|
||||||
|
// Actually computing the number of weeks is complex, but we know that the
|
||||||
|
// problematic categories (2 and 4) always start on week start, and that
|
||||||
|
// all months at the end have 6 weeks.
|
||||||
|
|
||||||
let beginDate = new Date(this._selectedDate);
|
let beginDate = new Date(this._selectedDate);
|
||||||
beginDate.setDate(1);
|
beginDate.setDate(1);
|
||||||
beginDate.setSeconds(0);
|
beginDate.setSeconds(0);
|
||||||
beginDate.setHours(12);
|
beginDate.setHours(12);
|
||||||
|
let year = beginDate.getYear();
|
||||||
|
|
||||||
let daysToWeekStart = (7 + beginDate.getDay() - this._weekStart) % 7;
|
let daysToWeekStart = (7 + beginDate.getDay() - this._weekStart) % 7;
|
||||||
beginDate.setTime(beginDate.getTime() - daysToWeekStart * MSECS_IN_DAY);
|
let startsOnWeekStart = daysToWeekStart == 0;
|
||||||
|
let weekPadding = startsOnWeekStart ? 7 : 0;
|
||||||
|
|
||||||
|
beginDate.setTime(beginDate.getTime() - (weekPadding + daysToWeekStart) * MSECS_IN_DAY);
|
||||||
|
|
||||||
let iter = new Date(beginDate);
|
let iter = new Date(beginDate);
|
||||||
let row = 2;
|
let row = 2;
|
||||||
while (true) {
|
// nRows here means 6 weeks + one header + one navbar
|
||||||
|
let nRows = 8;
|
||||||
|
while (row < 8) {
|
||||||
let button = new St.Button({ label: iter.getDate().toString() });
|
let button = new St.Button({ label: iter.getDate().toString() });
|
||||||
let rtl = button.get_text_direction() == Clutter.TextDirection.RTL;
|
let rtl = button.get_text_direction() == Clutter.TextDirection.RTL;
|
||||||
|
|
||||||
if (!this._eventSource)
|
if (this._eventSource.isDummy)
|
||||||
button.reactive = false;
|
button.reactive = false;
|
||||||
|
|
||||||
let iterStr = iter.toUTCString();
|
let iterStr = iter.toUTCString();
|
||||||
@ -560,8 +602,9 @@ const Calendar = new Lang.Class({
|
|||||||
this.setDate(newlySelectedDate, false);
|
this.setDate(newlySelectedDate, false);
|
||||||
}));
|
}));
|
||||||
|
|
||||||
let hasEvents = this._eventSource && this._eventSource.hasEvents(iter);
|
let hasEvents = this._eventSource.hasEvents(iter);
|
||||||
let styleClass = 'calendar-day-base calendar-day';
|
let styleClass = 'calendar-day-base calendar-day';
|
||||||
|
|
||||||
if (_isWorkDay(iter))
|
if (_isWorkDay(iter))
|
||||||
styleClass += ' calendar-work-day'
|
styleClass += ' calendar-work-day'
|
||||||
else
|
else
|
||||||
@ -601,17 +644,13 @@ const Calendar = new Lang.Class({
|
|||||||
}
|
}
|
||||||
|
|
||||||
iter.setTime(iter.getTime() + MSECS_IN_DAY);
|
iter.setTime(iter.getTime() + MSECS_IN_DAY);
|
||||||
if (iter.getDay() == this._weekStart) {
|
|
||||||
// We stop on the first "first day of the week" after the month we are displaying
|
if (iter.getDay() == this._weekStart)
|
||||||
if (iter.getMonth() > this._selectedDate.getMonth() || iter.getYear() > this._selectedDate.getYear())
|
|
||||||
break;
|
|
||||||
row++;
|
row++;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// Signal to the event source that we are interested in events
|
// Signal to the event source that we are interested in events
|
||||||
// only from this date range
|
// only from this date range
|
||||||
if (this._eventSource)
|
this._eventSource.requestRange(beginDate, iter, forceReload);
|
||||||
this._eventSource.requestRange(beginDate, iter, forceReload);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -629,16 +668,8 @@ const EventsList = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
setEventSource: function(eventSource) {
|
setEventSource: function(eventSource) {
|
||||||
if (this._eventSource) {
|
|
||||||
this._eventSource.disconnect(this._eventSourceChangedId);
|
|
||||||
this._eventSource = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
this._eventSource = eventSource;
|
this._eventSource = eventSource;
|
||||||
|
this._eventSource.connect('changed', Lang.bind(this, this._update));
|
||||||
if (this._eventSource) {
|
|
||||||
this._eventSourceChangedId = this._eventSource.connect('changed', Lang.bind(this, this._update));
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_addEvent: function(dayNameBox, timeBox, eventTitleBox, includeDayName, day, time, desc) {
|
_addEvent: function(dayNameBox, timeBox, eventTitleBox, includeDayName, day, time, desc) {
|
||||||
@ -655,9 +686,6 @@ const EventsList = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_addPeriod: function(header, begin, end, includeDayName, showNothingScheduled) {
|
_addPeriod: function(header, begin, end, includeDayName, showNothingScheduled) {
|
||||||
if (!this._eventSource)
|
|
||||||
return;
|
|
||||||
|
|
||||||
let events = this._eventSource.getEvents(begin, end);
|
let events = this._eventSource.getEvents(begin, end);
|
||||||
|
|
||||||
let clockFormat = this._desktopSettings.get_string(CLOCK_FORMAT_KEY);;
|
let clockFormat = this._desktopSettings.get_string(CLOCK_FORMAT_KEY);;
|
||||||
@ -754,6 +782,9 @@ const EventsList = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_update: function() {
|
_update: function() {
|
||||||
|
if (this._eventSource.isLoading)
|
||||||
|
return;
|
||||||
|
|
||||||
let today = new Date();
|
let today = new Date();
|
||||||
if (_sameDay (this._date, today)) {
|
if (_sameDay (this._date, today)) {
|
||||||
this._showToday();
|
this._showToday();
|
||||||
|
@ -292,6 +292,7 @@ const AutorunResidentSource = new Lang.Class({
|
|||||||
|
|
||||||
_init: function(manager) {
|
_init: function(manager) {
|
||||||
this.parent(_("Removable Devices"), 'media-removable');
|
this.parent(_("Removable Devices"), 'media-removable');
|
||||||
|
this.resident = true;
|
||||||
|
|
||||||
this._mounts = [];
|
this._mounts = [];
|
||||||
|
|
||||||
|
@ -222,7 +222,7 @@ const KeyringPrompter = new Lang.Class({
|
|||||||
enable: function() {
|
enable: function() {
|
||||||
this._prompter.register(Gio.DBus.session);
|
this._prompter.register(Gio.DBus.session);
|
||||||
this._dbusId = Gio.DBus.session.own_name('org.gnome.keyring.SystemPrompter',
|
this._dbusId = Gio.DBus.session.own_name('org.gnome.keyring.SystemPrompter',
|
||||||
Gio.BusNameOwnerFlags.REPLACE, null, null);
|
Gio.BusNameOwnerFlags.ALLOW_REPLACEMENT, null, null);
|
||||||
},
|
},
|
||||||
|
|
||||||
disable: function() {
|
disable: function() {
|
||||||
|
@ -103,6 +103,11 @@ const CtrlAltTabManager = new Lang.Class({
|
|||||||
else
|
else
|
||||||
icon = textureCache.bind_pixbuf_property(windows[i], 'icon');
|
icon = textureCache.bind_pixbuf_property(windows[i], 'icon');
|
||||||
items.push({ name: windows[i].title,
|
items.push({ name: windows[i].title,
|
||||||
|
proxy: windows[i].get_compositor_private(),
|
||||||
|
focusCallback: Lang.bind(windows[i],
|
||||||
|
function(timestamp) {
|
||||||
|
Main.activateWindow(this, timestamp);
|
||||||
|
}),
|
||||||
iconActor: icon,
|
iconActor: icon,
|
||||||
sortGroup: SortGroup.MIDDLE });
|
sortGroup: SortGroup.MIDDLE });
|
||||||
}
|
}
|
||||||
|
@ -161,8 +161,10 @@ const DateMenuButton = new Lang.Class({
|
|||||||
this._openClocksItem.actor.visible = app !== null;
|
this._openClocksItem.actor.visible = app !== null;
|
||||||
},
|
},
|
||||||
|
|
||||||
_setEventsVisibility: function(visible) {
|
_updateEventsVisibility: function() {
|
||||||
|
let visible = this._eventSource.hasCalendars;
|
||||||
this._openCalendarItem.actor.visible = visible;
|
this._openCalendarItem.actor.visible = visible;
|
||||||
|
this._openClocksItem.actor.visible = visible;
|
||||||
this._separator.visible = visible;
|
this._separator.visible = visible;
|
||||||
if (visible) {
|
if (visible) {
|
||||||
let alignment = 0.25;
|
let alignment = 0.25;
|
||||||
@ -177,8 +179,16 @@ const DateMenuButton = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_setEventSource: function(eventSource) {
|
_setEventSource: function(eventSource) {
|
||||||
|
if (this._eventSource)
|
||||||
|
this._eventSource.destroy();
|
||||||
|
|
||||||
this._calendar.setEventSource(eventSource);
|
this._calendar.setEventSource(eventSource);
|
||||||
this._eventList.setEventSource(eventSource);
|
this._eventList.setEventSource(eventSource);
|
||||||
|
|
||||||
|
this._eventSource = eventSource;
|
||||||
|
this._eventSource.connect('notify::has-calendars', Lang.bind(this, function() {
|
||||||
|
this._updateEventsVisibility();
|
||||||
|
}));
|
||||||
},
|
},
|
||||||
|
|
||||||
_sessionUpdated: function() {
|
_sessionUpdated: function() {
|
||||||
@ -187,10 +197,10 @@ const DateMenuButton = new Lang.Class({
|
|||||||
if (showEvents) {
|
if (showEvents) {
|
||||||
eventSource = new Calendar.DBusEventSource();
|
eventSource = new Calendar.DBusEventSource();
|
||||||
} else {
|
} else {
|
||||||
eventSource = null;
|
eventSource = new Calendar.EmptyEventSource();
|
||||||
}
|
}
|
||||||
this._setEventSource(eventSource);
|
this._setEventSource(eventSource);
|
||||||
this._setEventsVisibility(showEvents);
|
this._updateEventsVisibility();
|
||||||
|
|
||||||
// This needs to be handled manually, as the code to
|
// This needs to be handled manually, as the code to
|
||||||
// autohide separators doesn't work across the vbox
|
// autohide separators doesn't work across the vbox
|
||||||
@ -211,6 +221,8 @@ const DateMenuButton = new Lang.Class({
|
|||||||
this.menu.close();
|
this.menu.close();
|
||||||
|
|
||||||
let app = Gio.AppInfo.get_default_for_type('text/calendar', false);
|
let app = Gio.AppInfo.get_default_for_type('text/calendar', false);
|
||||||
|
if (app.get_id() == 'evolution')
|
||||||
|
app = Gio.DesktopAppInfo.new('evolution-calendar');
|
||||||
app.launch([], global.create_app_launch_context());
|
app.launch([], global.create_app_launch_context());
|
||||||
},
|
},
|
||||||
|
|
||||||
|
12
js/ui/dnd.js
12
js/ui/dnd.js
@ -85,11 +85,13 @@ const _Draggable = new Lang.Class({
|
|||||||
|
|
||||||
this.actor.connect('destroy', Lang.bind(this, function() {
|
this.actor.connect('destroy', Lang.bind(this, function() {
|
||||||
this._actorDestroyed = true;
|
this._actorDestroyed = true;
|
||||||
|
|
||||||
// If the drag actor is destroyed and we were going to fix
|
// If the drag actor is destroyed and we were going to fix
|
||||||
// up its hover state, fix up the parent hover state instead
|
// up its hover state, fix up the parent hover state instead
|
||||||
if (this.actor == this._firstLeaveActor)
|
if (this.actor == this._firstLeaveActor)
|
||||||
this._firstLeaveActor = this._dragOrigParent;
|
this._firstLeaveActor = this._dragOrigParent;
|
||||||
if (this._dragInProgress)
|
|
||||||
|
if (this._dragInProgress && this._dragCancellable)
|
||||||
this._cancelDrag(global.get_current_time());
|
this._cancelDrag(global.get_current_time());
|
||||||
this.disconnectAll();
|
this.disconnectAll();
|
||||||
}));
|
}));
|
||||||
@ -102,6 +104,7 @@ const _Draggable = new Lang.Class({
|
|||||||
this._buttonDown = false; // The mouse button has been pressed and has not yet been released.
|
this._buttonDown = false; // The mouse button has been pressed and has not yet been released.
|
||||||
this._dragInProgress = false; // The drag has been started, and has not been dropped or cancelled yet.
|
this._dragInProgress = false; // The drag has been started, and has not been dropped or cancelled yet.
|
||||||
this._animationInProgress = false; // The drag is over and the item is in the process of animating to its original position (snapping back or reverting).
|
this._animationInProgress = false; // The drag is over and the item is in the process of animating to its original position (snapping back or reverting).
|
||||||
|
this._dragCancellable = true;
|
||||||
|
|
||||||
// During the drag, we eat enter/leave events so that actors don't prelight.
|
// During the drag, we eat enter/leave events so that actors don't prelight.
|
||||||
// But we remember the actors that we first left/last entered so we can
|
// But we remember the actors that we first left/last entered so we can
|
||||||
@ -439,6 +442,11 @@ const _Draggable = new Lang.Class({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// At this point it is too late to cancel a drag by destroying
|
||||||
|
// the actor, the fate of which is decided by acceptDrop and its
|
||||||
|
// side-effects
|
||||||
|
this._dragCancellable = false;
|
||||||
|
|
||||||
while (target) {
|
while (target) {
|
||||||
if (target._delegate && target._delegate.acceptDrop) {
|
if (target._delegate && target._delegate.acceptDrop) {
|
||||||
let [r, targX, targY] = target.transform_stage_point(dropX, dropY);
|
let [r, targX, targY] = target.transform_stage_point(dropX, dropY);
|
||||||
@ -447,8 +455,6 @@ const _Draggable = new Lang.Class({
|
|||||||
targX,
|
targX,
|
||||||
targY,
|
targY,
|
||||||
event.get_time())) {
|
event.get_time())) {
|
||||||
if (this._actorDestroyed)
|
|
||||||
return true;
|
|
||||||
// If it accepted the drop without taking the actor,
|
// If it accepted the drop without taking the actor,
|
||||||
// handle it ourselves.
|
// handle it ourselves.
|
||||||
if (this._dragActor.get_parent() == Main.uiGroup) {
|
if (this._dragActor.get_parent() == Main.uiGroup) {
|
||||||
|
@ -225,7 +225,8 @@ const EndSessionDialog = new Lang.Class({
|
|||||||
Extends: ModalDialog.ModalDialog,
|
Extends: ModalDialog.ModalDialog,
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
this.parent({ styleClass: 'end-session-dialog' });
|
this.parent({ styleClass: 'end-session-dialog',
|
||||||
|
destroyOnClose: false });
|
||||||
|
|
||||||
this._user = AccountsService.UserManager.get_default().get_user(GLib.get_user_name());
|
this._user = AccountsService.UserManager.get_default().get_user(GLib.get_user_name());
|
||||||
|
|
||||||
|
@ -248,7 +248,7 @@ const GrabHelper = new Lang.Class({
|
|||||||
global.set_stage_input_mode(Shell.StageInputMode.FOCUSED);
|
global.set_stage_input_mode(Shell.StageInputMode.FOCUSED);
|
||||||
}
|
}
|
||||||
|
|
||||||
global.screen.focus_default_window(global.get_current_time());
|
global.screen.focus_default_window(global.display.get_current_time_roundtrip());
|
||||||
},
|
},
|
||||||
|
|
||||||
// ignoreRelease:
|
// ignoreRelease:
|
||||||
@ -308,6 +308,8 @@ const GrabHelper = new Lang.Class({
|
|||||||
if (!this.grabbed && this._capturedEventId > 0) {
|
if (!this.grabbed && this._capturedEventId > 0) {
|
||||||
global.stage.disconnect(this._capturedEventId);
|
global.stage.disconnect(this._capturedEventId);
|
||||||
this._capturedEventId = 0;
|
this._capturedEventId = 0;
|
||||||
|
|
||||||
|
this._ignoreRelease = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hadFocus) {
|
if (hadFocus) {
|
||||||
@ -353,6 +355,7 @@ const GrabHelper = new Lang.Class({
|
|||||||
this._ignoreRelease = true;
|
this._ignoreRelease = 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 true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return this._modalCount > 0;
|
return this._modalCount > 0;
|
||||||
|
519
js/ui/layout.js
519
js/ui/layout.js
@ -18,7 +18,6 @@ const Main = imports.ui.main;
|
|||||||
const Params = imports.misc.params;
|
const Params = imports.misc.params;
|
||||||
const Tweener = imports.ui.tweener;
|
const Tweener = imports.ui.tweener;
|
||||||
|
|
||||||
const HOT_CORNER_ACTIVATION_TIMEOUT = 0.5;
|
|
||||||
const STARTUP_ANIMATION_TIME = 0.5;
|
const STARTUP_ANIMATION_TIME = 0.5;
|
||||||
const KEYBOARD_ANIMATION_TIME = 0.15;
|
const KEYBOARD_ANIMATION_TIME = 0.15;
|
||||||
const BACKGROUND_FADE_ANIMATION_TIME = 1.0;
|
const BACKGROUND_FADE_ANIMATION_TIME = 1.0;
|
||||||
@ -29,6 +28,9 @@ const DEFAULT_BACKGROUND_COLOR = Clutter.Color.from_pixel(0x2e3436ff);
|
|||||||
const MESSAGE_TRAY_PRESSURE_THRESHOLD = 250; // pixels
|
const MESSAGE_TRAY_PRESSURE_THRESHOLD = 250; // pixels
|
||||||
const MESSAGE_TRAY_PRESSURE_TIMEOUT = 1000; // ms
|
const MESSAGE_TRAY_PRESSURE_TIMEOUT = 1000; // ms
|
||||||
|
|
||||||
|
const HOT_CORNER_PRESSURE_THRESHOLD = 100; // pixels
|
||||||
|
const HOT_CORNER_PRESSURE_TIMEOUT = 1000; // ms
|
||||||
|
|
||||||
function isPopupMetaWindow(actor) {
|
function isPopupMetaWindow(actor) {
|
||||||
switch(actor.meta_window.get_window_type()) {
|
switch(actor.meta_window.get_window_type()) {
|
||||||
case Meta.WindowType.DROPDOWN_MENU:
|
case Meta.WindowType.DROPDOWN_MENU:
|
||||||
@ -130,9 +132,9 @@ const LayoutManager = new Lang.Class({
|
|||||||
this.monitors = [];
|
this.monitors = [];
|
||||||
this.primaryMonitor = null;
|
this.primaryMonitor = null;
|
||||||
this.primaryIndex = -1;
|
this.primaryIndex = -1;
|
||||||
|
this.hotCorners = [];
|
||||||
|
|
||||||
this._keyboardIndex = -1;
|
this._keyboardIndex = -1;
|
||||||
this._hotCorners = [];
|
|
||||||
this._leftPanelBarrier = null;
|
|
||||||
this._rightPanelBarrier = null;
|
this._rightPanelBarrier = null;
|
||||||
this._trayBarrier = null;
|
this._trayBarrier = null;
|
||||||
|
|
||||||
@ -140,6 +142,7 @@ const LayoutManager = new Lang.Class({
|
|||||||
this._updateRegionIdle = 0;
|
this._updateRegionIdle = 0;
|
||||||
|
|
||||||
this._trackedActors = [];
|
this._trackedActors = [];
|
||||||
|
this._topActors = [];
|
||||||
this._isPopupWindowVisible = false;
|
this._isPopupWindowVisible = false;
|
||||||
this._startingUp = true;
|
this._startingUp = true;
|
||||||
|
|
||||||
@ -191,6 +194,7 @@ const LayoutManager = new Lang.Class({
|
|||||||
this.trayBox = new St.Widget({ name: 'trayBox',
|
this.trayBox = new St.Widget({ name: 'trayBox',
|
||||||
layout_manager: new Clutter.BinLayout() });
|
layout_manager: new Clutter.BinLayout() });
|
||||||
this.addChrome(this.trayBox);
|
this.addChrome(this.trayBox);
|
||||||
|
this._setupTrayPressure();
|
||||||
|
|
||||||
this.keyboardBox = new St.BoxLayout({ name: 'keyboardBox',
|
this.keyboardBox = new St.BoxLayout({ name: 'keyboardBox',
|
||||||
reactive: true,
|
reactive: true,
|
||||||
@ -218,6 +222,8 @@ const LayoutManager = new Lang.Class({
|
|||||||
Lang.bind(this, this._windowsRestacked));
|
Lang.bind(this, this._windowsRestacked));
|
||||||
global.screen.connect('monitors-changed',
|
global.screen.connect('monitors-changed',
|
||||||
Lang.bind(this, this._monitorsChanged));
|
Lang.bind(this, this._monitorsChanged));
|
||||||
|
global.screen.connect('in-fullscreen-changed',
|
||||||
|
Lang.bind(this, this._updateFullscreen));
|
||||||
this._monitorsChanged();
|
this._monitorsChanged();
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -228,6 +234,8 @@ const LayoutManager = new Lang.Class({
|
|||||||
Main.overview.connect('showing', Lang.bind(this, this._overviewShowing));
|
Main.overview.connect('showing', Lang.bind(this, this._overviewShowing));
|
||||||
Main.overview.connect('hidden', Lang.bind(this, this._overviewHidden));
|
Main.overview.connect('hidden', Lang.bind(this, this._overviewHidden));
|
||||||
Main.sessionMode.connect('updated', Lang.bind(this, this._sessionUpdated));
|
Main.sessionMode.connect('updated', Lang.bind(this, this._sessionUpdated));
|
||||||
|
|
||||||
|
this._prepareStartupAnimation();
|
||||||
},
|
},
|
||||||
|
|
||||||
_overviewShowing: function() {
|
_overviewShowing: function() {
|
||||||
@ -275,56 +283,58 @@ const LayoutManager = new Lang.Class({
|
|||||||
|
|
||||||
_updateHotCorners: function() {
|
_updateHotCorners: function() {
|
||||||
// destroy old hot corners
|
// destroy old hot corners
|
||||||
for (let i = 0; i < this._hotCorners.length; i++)
|
for (let i = 0; i < this.hotCorners.length; i++)
|
||||||
this._hotCorners[i].destroy();
|
this.hotCorners[i].destroy();
|
||||||
this._hotCorners = [];
|
this.hotCorners = [];
|
||||||
|
|
||||||
|
let size = this.panelBox.height;
|
||||||
|
|
||||||
// build new hot corners
|
// build new hot corners
|
||||||
for (let i = 0; i < this.monitors.length; i++) {
|
for (let i = 0; i < this.monitors.length; i++) {
|
||||||
if (i == this.primaryIndex)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
let monitor = this.monitors[i];
|
let monitor = this.monitors[i];
|
||||||
let cornerX = this._rtl ? monitor.x + monitor.width : monitor.x;
|
let cornerX = this._rtl ? monitor.x + monitor.width : monitor.x;
|
||||||
let cornerY = monitor.y;
|
let cornerY = monitor.y;
|
||||||
|
|
||||||
let haveTopLeftCorner = true;
|
if (i != this.primaryIndex) {
|
||||||
|
let haveTopLeftCorner = true;
|
||||||
|
|
||||||
// Check if we have a top left (right for RTL) corner.
|
// Check if we have a top left (right for RTL) corner.
|
||||||
// I.e. if there is no monitor directly above or to the left(right)
|
// I.e. if there is no monitor directly above or to the left(right)
|
||||||
let besideX = this._rtl ? monitor.x + 1 : cornerX - 1;
|
let besideX = this._rtl ? monitor.x + 1 : cornerX - 1;
|
||||||
let besideY = cornerY;
|
let besideY = cornerY;
|
||||||
let aboveX = cornerX;
|
let aboveX = cornerX;
|
||||||
let aboveY = cornerY - 1;
|
let aboveY = cornerY - 1;
|
||||||
|
|
||||||
for (let j = 0; j < this.monitors.length; j++) {
|
for (let j = 0; j < this.monitors.length; j++) {
|
||||||
if (i == j)
|
if (i == j)
|
||||||
|
continue;
|
||||||
|
let otherMonitor = this.monitors[j];
|
||||||
|
if (besideX >= otherMonitor.x &&
|
||||||
|
besideX < otherMonitor.x + otherMonitor.width &&
|
||||||
|
besideY >= otherMonitor.y &&
|
||||||
|
besideY < otherMonitor.y + otherMonitor.height) {
|
||||||
|
haveTopLeftCorner = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (aboveX >= otherMonitor.x &&
|
||||||
|
aboveX < otherMonitor.x + otherMonitor.width &&
|
||||||
|
aboveY >= otherMonitor.y &&
|
||||||
|
aboveY < otherMonitor.y + otherMonitor.height) {
|
||||||
|
haveTopLeftCorner = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!haveTopLeftCorner)
|
||||||
continue;
|
continue;
|
||||||
let otherMonitor = this.monitors[j];
|
|
||||||
if (besideX >= otherMonitor.x &&
|
|
||||||
besideX < otherMonitor.x + otherMonitor.width &&
|
|
||||||
besideY >= otherMonitor.y &&
|
|
||||||
besideY < otherMonitor.y + otherMonitor.height) {
|
|
||||||
haveTopLeftCorner = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (aboveX >= otherMonitor.x &&
|
|
||||||
aboveX < otherMonitor.x + otherMonitor.width &&
|
|
||||||
aboveY >= otherMonitor.y &&
|
|
||||||
aboveY < otherMonitor.y + otherMonitor.height) {
|
|
||||||
haveTopLeftCorner = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!haveTopLeftCorner)
|
let corner = new HotCorner(this, monitor, cornerX, cornerY);
|
||||||
continue;
|
corner.setBarrierSize(size);
|
||||||
|
this.hotCorners.push(corner);
|
||||||
let corner = new HotCorner(this);
|
|
||||||
this._hotCorners.push(corner);
|
|
||||||
corner.actor.set_position(cornerX, cornerY);
|
|
||||||
this.addChrome(corner.actor);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.emit('hot-corners-changed');
|
||||||
},
|
},
|
||||||
|
|
||||||
_createBackground: function(monitorIndex) {
|
_createBackground: function(monitorIndex) {
|
||||||
@ -394,16 +404,15 @@ const LayoutManager = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_panelBoxChanged: function() {
|
_panelBoxChanged: function() {
|
||||||
this.emit('panel-box-changed');
|
this._updatePanelBarrier();
|
||||||
this._updatePanelBarriers();
|
|
||||||
|
let size = this.panelBox.height;
|
||||||
|
this.hotCorners.forEach(function(corner) {
|
||||||
|
corner.setBarrierSize(size);
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
_updatePanelBarriers: function() {
|
_updatePanelBarrier: function() {
|
||||||
if (this._leftPanelBarrier) {
|
|
||||||
this._leftPanelBarrier.destroy();
|
|
||||||
this._leftPanelBarrier = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this._rightPanelBarrier) {
|
if (this._rightPanelBarrier) {
|
||||||
this._rightPanelBarrier.destroy();
|
this._rightPanelBarrier.destroy();
|
||||||
this._rightPanelBarrier = null;
|
this._rightPanelBarrier = null;
|
||||||
@ -412,10 +421,6 @@ const LayoutManager = new Lang.Class({
|
|||||||
if (this.panelBox.height) {
|
if (this.panelBox.height) {
|
||||||
let primary = this.primaryMonitor;
|
let primary = this.primaryMonitor;
|
||||||
|
|
||||||
this._leftPanelBarrier = new Meta.Barrier({ display: global.display,
|
|
||||||
x1: primary.x, y1: primary.y,
|
|
||||||
x2: primary.x, y2: primary.y + this.panelBox.height,
|
|
||||||
directions: Meta.BarrierDirection.POSITIVE_X });
|
|
||||||
this._rightPanelBarrier = new Meta.Barrier({ display: global.display,
|
this._rightPanelBarrier = new Meta.Barrier({ display: global.display,
|
||||||
x1: primary.x + primary.width, y1: primary.y,
|
x1: primary.x + primary.width, y1: primary.y,
|
||||||
x2: primary.x + primary.width, y2: primary.y + this.panelBox.height,
|
x2: primary.x + primary.width, y2: primary.y + this.panelBox.height,
|
||||||
@ -423,28 +428,44 @@ const LayoutManager = new Lang.Class({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_setupTrayPressure: function() {
|
||||||
|
this._trayPressure = new PressureBarrier(MESSAGE_TRAY_PRESSURE_THRESHOLD,
|
||||||
|
MESSAGE_TRAY_PRESSURE_TIMEOUT,
|
||||||
|
Shell.KeyBindingMode.NORMAL |
|
||||||
|
Shell.KeyBindingMode.OVERVIEW);
|
||||||
|
this._trayPressure.setEventFilter(this._trayBarrierEventFilter);
|
||||||
|
this._trayPressure.connect('trigger', function(barrier) {
|
||||||
|
if (Main.layoutManager.bottomMonitor.inFullscreen)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Main.messageTray.openTray();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
_updateTrayBarrier: function() {
|
_updateTrayBarrier: function() {
|
||||||
let monitor = this.bottomMonitor;
|
let monitor = this.bottomMonitor;
|
||||||
|
|
||||||
if (this._trayBarrier) {
|
if (this._trayBarrier) {
|
||||||
|
this._trayPressure.removeBarrier(this._trayBarrier);
|
||||||
this._trayBarrier.destroy();
|
this._trayBarrier.destroy();
|
||||||
this._trayBarrier = null;
|
this._trayBarrier = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this._trayPressure) {
|
|
||||||
this._trayPressure.destroy();
|
|
||||||
this._trayPressure = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
this._trayBarrier = new Meta.Barrier({ display: global.display,
|
this._trayBarrier = new Meta.Barrier({ display: global.display,
|
||||||
x1: monitor.x, x2: monitor.x + monitor.width,
|
x1: monitor.x, x2: monitor.x + monitor.width,
|
||||||
y1: monitor.y + monitor.height, y2: monitor.y + monitor.height,
|
y1: monitor.y + monitor.height, y2: monitor.y + monitor.height,
|
||||||
directions: Meta.BarrierDirection.NEGATIVE_Y });
|
directions: Meta.BarrierDirection.NEGATIVE_Y });
|
||||||
|
this._trayPressure.addBarrier(this._trayBarrier);
|
||||||
|
},
|
||||||
|
|
||||||
this._trayPressure = new PressureBarrier(this._trayBarrier, MESSAGE_TRAY_PRESSURE_THRESHOLD, MESSAGE_TRAY_PRESSURE_TIMEOUT);
|
_trayBarrierEventFilter: function(event) {
|
||||||
this._trayPressure.connect('trigger', function(barrier) {
|
// Throw out all events where the pointer was grabbed by another
|
||||||
Main.messageTray.openTray();
|
// client, as the client that grabbed the pointer expects to have
|
||||||
});
|
// complete control over it
|
||||||
|
if (event.grabbed && Main.modalCount == 0)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
},
|
},
|
||||||
|
|
||||||
_monitorsChanged: function() {
|
_monitorsChanged: function() {
|
||||||
@ -534,7 +555,7 @@ const LayoutManager = new Lang.Class({
|
|||||||
// MetaBackgroundActor inside global.window_group covers the entirety of the
|
// MetaBackgroundActor inside global.window_group covers the entirety of the
|
||||||
// screen. So, we set no_clear_hint at the end of the animation.
|
// screen. So, we set no_clear_hint at the end of the animation.
|
||||||
|
|
||||||
prepareStartupAnimation: function() {
|
_prepareStartupAnimation: function() {
|
||||||
// Set ourselves to FULLSCREEN input mode while the animation is running
|
// Set ourselves to FULLSCREEN input mode while the animation is running
|
||||||
// so events don't get delivered to X11 windows (which are distorted by the animation)
|
// so events don't get delivered to X11 windows (which are distorted by the animation)
|
||||||
global.stage_input_mode = Shell.StageInputMode.FULLSCREEN;
|
global.stage_input_mode = Shell.StageInputMode.FULLSCREEN;
|
||||||
@ -557,6 +578,7 @@ const LayoutManager = new Lang.Class({
|
|||||||
y / global.screen_height);
|
y / global.screen_height);
|
||||||
this.uiGroup.scale_x = this.uiGroup.scale_y = 0.5;
|
this.uiGroup.scale_x = this.uiGroup.scale_y = 0.5;
|
||||||
this.uiGroup.opacity = 0;
|
this.uiGroup.opacity = 0;
|
||||||
|
global.window_group.set_clip(monitor.x, monitor.y, monitor.width, monitor.height);
|
||||||
}
|
}
|
||||||
|
|
||||||
this._systemBackground = new Background.SystemBackground();
|
this._systemBackground = new Background.SystemBackground();
|
||||||
@ -572,25 +594,25 @@ const LayoutManager = new Lang.Class({
|
|||||||
Lang.bind(this, function() {
|
Lang.bind(this, function() {
|
||||||
this._systemBackground.disconnect(signalId);
|
this._systemBackground.disconnect(signalId);
|
||||||
this._systemBackground.actor.show();
|
this._systemBackground.actor.show();
|
||||||
|
global.stage.show();
|
||||||
|
|
||||||
|
this.emit('startup-prepared');
|
||||||
|
|
||||||
// We're mostly prepared for the startup animation
|
// We're mostly prepared for the startup animation
|
||||||
// now, but since a lot is going on asynchronously
|
// now, but since a lot is going on asynchronously
|
||||||
// during startup, let's defer emission of the
|
// during startup, let's defer the startup animation
|
||||||
// startup-prepared signal until the event loop is
|
// until the event loop is uncontended and idle.
|
||||||
// uncontended and idle. This helps to prevent us
|
// This helps to prevent us from running the animation
|
||||||
// from running the animation when the system is
|
// when the system is bogged down
|
||||||
// bogged down
|
|
||||||
GLib.idle_add(GLib.PRIORITY_LOW,
|
GLib.idle_add(GLib.PRIORITY_LOW,
|
||||||
Lang.bind(this, function() {
|
Lang.bind(this, function() {
|
||||||
this.emit('startup-prepared');
|
this._startupAnimation();
|
||||||
return false;
|
return false;
|
||||||
}));
|
}));
|
||||||
|
|
||||||
}));
|
}));
|
||||||
},
|
},
|
||||||
|
|
||||||
startupAnimation: function() {
|
_startupAnimation: function() {
|
||||||
global.stage.show();
|
|
||||||
if (Main.sessionMode.isGreeter)
|
if (Main.sessionMode.isGreeter)
|
||||||
this._startupAnimationGreeter();
|
this._startupAnimationGreeter();
|
||||||
else
|
else
|
||||||
@ -633,12 +655,14 @@ const LayoutManager = new Lang.Class({
|
|||||||
this.trayBox.show();
|
this.trayBox.show();
|
||||||
this.keyboardBox.show();
|
this.keyboardBox.show();
|
||||||
|
|
||||||
if (!Main.sessionMode.isGreeter)
|
if (!Main.sessionMode.isGreeter) {
|
||||||
this._createSecondaryBackgrounds();
|
this._createSecondaryBackgrounds();
|
||||||
|
global.window_group.remove_clip();
|
||||||
this.emit('panel-box-changed');
|
}
|
||||||
|
|
||||||
this._queueUpdateRegions();
|
this._queueUpdateRegions();
|
||||||
|
|
||||||
|
this.emit('startup-complete');
|
||||||
},
|
},
|
||||||
|
|
||||||
showKeyboard: function () {
|
showKeyboard: function () {
|
||||||
@ -814,6 +838,11 @@ const LayoutManager = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_updateVisibility: function() {
|
_updateVisibility: function() {
|
||||||
|
let windowsVisible = Main.sessionMode.hasWindows && !this._inOverview;
|
||||||
|
|
||||||
|
global.window_group.visible = windowsVisible;
|
||||||
|
global.top_window_group.visible = windowsVisible;
|
||||||
|
|
||||||
for (let i = 0; i < this._trackedActors.length; i++) {
|
for (let i = 0; i < this._trackedActors.length; i++) {
|
||||||
let actorData = this._trackedActors[i], visible;
|
let actorData = this._trackedActors[i], visible;
|
||||||
if (!actorData.trackFullscreen)
|
if (!actorData.trackFullscreen)
|
||||||
@ -821,7 +850,7 @@ const LayoutManager = new Lang.Class({
|
|||||||
if (!actorData.isToplevel)
|
if (!actorData.isToplevel)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (this._inOverview || !Main.sessionMode.hasWindows)
|
if (!windowsVisible)
|
||||||
visible = true;
|
visible = true;
|
||||||
else if (this.findMonitorForActor(actorData.actor).inFullscreen)
|
else if (this.findMonitorForActor(actorData.actor).inFullscreen)
|
||||||
visible = false;
|
visible = false;
|
||||||
@ -871,95 +900,25 @@ const LayoutManager = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_updateFullscreen: function() {
|
_updateFullscreen: function() {
|
||||||
let windows = this._getWindowActorsForWorkspace(global.screen.get_active_workspace());
|
|
||||||
|
|
||||||
// Reset all monitors to not fullscreen
|
|
||||||
for (let i = 0; i < this.monitors.length; i++)
|
for (let i = 0; i < this.monitors.length; i++)
|
||||||
this.monitors[i].inFullscreen = false;
|
this.monitors[i].inFullscreen = global.screen.get_monitor_in_fullscreen (i);
|
||||||
|
|
||||||
// Ordinary chrome should be visible unless there is a window
|
this._updateVisibility();
|
||||||
// with layer FULLSCREEN, or a window with layer
|
this._queueUpdateRegions();
|
||||||
// OVERRIDE_REDIRECT that covers the whole screen.
|
|
||||||
// ('override_redirect' is not actually a layer above all
|
|
||||||
// other windows, but this seems to be how mutter treats it
|
|
||||||
// currently...) If we wanted to be extra clever, we could
|
|
||||||
// figure out when an OVERRIDE_REDIRECT window was trying to
|
|
||||||
// partially overlap us, and then adjust the input region and
|
|
||||||
// our clip region accordingly...
|
|
||||||
|
|
||||||
// @windows is sorted bottom to top.
|
this.emit('fullscreen-changed');
|
||||||
|
|
||||||
for (let i = windows.length - 1; i > -1; i--) {
|
|
||||||
let window = windows[i];
|
|
||||||
let metaWindow = window.meta_window;
|
|
||||||
let layer = metaWindow.get_layer();
|
|
||||||
|
|
||||||
// Skip minimized windows
|
|
||||||
if (!metaWindow.showing_on_its_workspace())
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (layer == Meta.StackLayer.FULLSCREEN ||
|
|
||||||
(layer == Meta.StackLayer.OVERRIDE_REDIRECT && metaWindow.is_monitor_sized())) {
|
|
||||||
if (metaWindow.is_screen_sized()) {
|
|
||||||
for (let i = 0; i < this.monitors.length; i++)
|
|
||||||
this.monitors[i].inFullscreen = true;
|
|
||||||
} else {
|
|
||||||
let monitors = metaWindow.get_all_monitors();
|
|
||||||
for (let i = 0; i < monitors.length; i++) {
|
|
||||||
let index = monitors[i];
|
|
||||||
this.monitors[index].inFullscreen = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_windowsRestacked: function() {
|
_windowsRestacked: function() {
|
||||||
let wasInFullscreen = [];
|
|
||||||
for (let i = 0; i < this.monitors.length; i++)
|
|
||||||
wasInFullscreen[i] = this.monitors[i].inFullscreen;
|
|
||||||
|
|
||||||
let primaryWasInFullscreen = this.primaryMonitor.inFullscreen;
|
|
||||||
|
|
||||||
this._updateFullscreen();
|
|
||||||
|
|
||||||
let changed = false;
|
let changed = false;
|
||||||
for (let i = 0; i < wasInFullscreen.length; i++) {
|
|
||||||
if (wasInFullscreen[i] != this.monitors[i].inFullscreen) {
|
|
||||||
changed = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!changed && (this._isPopupWindowVisible != global.top_window_group.get_children().some(isPopupMetaWindow)))
|
if (this._isPopupWindowVisible != global.top_window_group.get_children().some(isPopupMetaWindow))
|
||||||
changed = true;
|
changed = true;
|
||||||
|
|
||||||
if (changed) {
|
if (changed) {
|
||||||
this._updateVisibility();
|
this._updateVisibility();
|
||||||
this._queueUpdateRegions();
|
this._queueUpdateRegions();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (primaryWasInFullscreen != this.primaryMonitor.inFullscreen) {
|
|
||||||
let windows = this._getWindowActorsForWorkspace(global.screen.get_active_workspace());
|
|
||||||
for (let i = 0; i < windows.length; i++) {
|
|
||||||
let window = windows[i];
|
|
||||||
let metaWindow = window.meta_window;
|
|
||||||
|
|
||||||
// Skip minimized windows
|
|
||||||
if (!metaWindow.showing_on_its_workspace())
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// Skip windows that aren't on the primary monitor
|
|
||||||
if (!metaWindow.is_on_primary_monitor())
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// Minimize monitor sized windows that are not focused
|
|
||||||
if (metaWindow.is_monitor_sized() &&
|
|
||||||
!metaWindow.appears_focused)
|
|
||||||
metaWindow.minimize();
|
|
||||||
}
|
|
||||||
this.emit('primary-fullscreen-changed', this.primaryMonitor.inFullscreen);
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_updateRegions: function() {
|
_updateRegions: function() {
|
||||||
@ -1089,54 +1048,25 @@ Signals.addSignalMethods(LayoutManager.prototype);
|
|||||||
const HotCorner = new Lang.Class({
|
const HotCorner = new Lang.Class({
|
||||||
Name: 'HotCorner',
|
Name: 'HotCorner',
|
||||||
|
|
||||||
_init : function(layoutManager) {
|
_init : function(layoutManager, monitor, x, y) {
|
||||||
// We use this flag to mark the case where the user has entered the
|
// We use this flag to mark the case where the user has entered the
|
||||||
// hot corner and has not left both the hot corner and a surrounding
|
// hot corner and has not left both the hot corner and a surrounding
|
||||||
// guard area (the "environs"). This avoids triggering the hot corner
|
// guard area (the "environs"). This avoids triggering the hot corner
|
||||||
// multiple times due to an accidental jitter.
|
// multiple times due to an accidental jitter.
|
||||||
this._entered = false;
|
this._entered = false;
|
||||||
|
|
||||||
this.actor = new Clutter.Actor({ name: 'hot-corner-environs',
|
this._monitor = monitor;
|
||||||
width: 3,
|
|
||||||
height: 3,
|
|
||||||
reactive: true });
|
|
||||||
|
|
||||||
this._corner = new Clutter.Rectangle({ name: 'hot-corner',
|
this._x = x;
|
||||||
width: 1,
|
this._y = y;
|
||||||
height: 1,
|
|
||||||
opacity: 0,
|
|
||||||
reactive: true });
|
|
||||||
this._corner._delegate = this;
|
|
||||||
|
|
||||||
this.actor.add_child(this._corner);
|
this._setupFallbackCornerIfNeeded(layoutManager);
|
||||||
|
|
||||||
if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) {
|
this._pressureBarrier = new PressureBarrier(HOT_CORNER_PRESSURE_THRESHOLD,
|
||||||
this._corner.set_position(this.actor.width - this._corner.width, 0);
|
HOT_CORNER_PRESSURE_TIMEOUT,
|
||||||
this.actor.set_anchor_point_from_gravity(Clutter.Gravity.NORTH_EAST);
|
Shell.KeyBindingMode.NORMAL |
|
||||||
} else {
|
Shell.KeyBindingMode.OVERVIEW);
|
||||||
this._corner.set_position(0, 0);
|
this._pressureBarrier.connect('trigger', Lang.bind(this, this._toggleOverview));
|
||||||
}
|
|
||||||
|
|
||||||
this._activationTime = 0;
|
|
||||||
|
|
||||||
this.actor.connect('leave-event',
|
|
||||||
Lang.bind(this, this._onEnvironsLeft));
|
|
||||||
|
|
||||||
// Clicking on the hot corner environs should result in the
|
|
||||||
// same behavior as clicking on the hot corner.
|
|
||||||
this.actor.connect('button-release-event',
|
|
||||||
Lang.bind(this, this._onCornerClicked));
|
|
||||||
|
|
||||||
// In addition to being triggered by the mouse enter event,
|
|
||||||
// the hot corner can be triggered by clicking on it. This is
|
|
||||||
// useful if the user wants to undo the effect of triggering
|
|
||||||
// the hot corner once in the hot corner.
|
|
||||||
this._corner.connect('enter-event',
|
|
||||||
Lang.bind(this, this._onCornerEntered));
|
|
||||||
this._corner.connect('button-release-event',
|
|
||||||
Lang.bind(this, this._onCornerClicked));
|
|
||||||
this._corner.connect('leave-event',
|
|
||||||
Lang.bind(this, this._onCornerLeft));
|
|
||||||
|
|
||||||
// Cache the three ripples instead of dynamically creating and destroying them.
|
// Cache the three ripples instead of dynamically creating and destroying them.
|
||||||
this._ripple1 = new St.BoxLayout({ style_class: 'ripple-box', opacity: 0, visible: false });
|
this._ripple1 = new St.BoxLayout({ style_class: 'ripple-box', opacity: 0, visible: false });
|
||||||
@ -1148,8 +1078,74 @@ const HotCorner = new Lang.Class({
|
|||||||
layoutManager.uiGroup.add_actor(this._ripple3);
|
layoutManager.uiGroup.add_actor(this._ripple3);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
setBarrierSize: function(size) {
|
||||||
|
if (this._verticalBarrier) {
|
||||||
|
this._pressureBarrier.removeBarrier(this._verticalBarrier);
|
||||||
|
this._verticalBarrier.destroy();
|
||||||
|
this._verticalBarrier = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this._horizontalBarrier) {
|
||||||
|
this._pressureBarrier.removeBarrier(this._horizontalBarrier);
|
||||||
|
this._horizontalBarrier.destroy();
|
||||||
|
this._horizontalBarrier = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (size > 0) {
|
||||||
|
this._verticalBarrier = new Meta.Barrier({ display: global.display,
|
||||||
|
x1: this._x, x2: this._x, y1: this._y, y2: this._y + size,
|
||||||
|
directions: Meta.BarrierDirection.POSITIVE_X });
|
||||||
|
this._horizontalBarrier = new Meta.Barrier({ display: global.display,
|
||||||
|
x1: this._x, x2: this._x + size, y1: this._y, y2: this._y,
|
||||||
|
directions: Meta.BarrierDirection.POSITIVE_Y });
|
||||||
|
|
||||||
|
this._pressureBarrier.addBarrier(this._verticalBarrier);
|
||||||
|
this._pressureBarrier.addBarrier(this._horizontalBarrier);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_setupFallbackCornerIfNeeded: function(layoutManager) {
|
||||||
|
if (!global.display.supports_extended_barriers()) {
|
||||||
|
this.actor = new Clutter.Actor({ name: 'hot-corner-environs',
|
||||||
|
x: this._x, y: this._y,
|
||||||
|
width: 3,
|
||||||
|
height: 3,
|
||||||
|
reactive: true });
|
||||||
|
|
||||||
|
this._corner = new Clutter.Rectangle({ name: 'hot-corner',
|
||||||
|
width: 1,
|
||||||
|
height: 1,
|
||||||
|
opacity: 0,
|
||||||
|
reactive: true });
|
||||||
|
this._corner._delegate = this;
|
||||||
|
|
||||||
|
this.actor.add_child(this._corner);
|
||||||
|
layoutManager.addChrome(this.actor);
|
||||||
|
|
||||||
|
if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) {
|
||||||
|
this._corner.set_position(this.actor.width - this._corner.width, 0);
|
||||||
|
this.actor.set_anchor_point_from_gravity(Clutter.Gravity.NORTH_EAST);
|
||||||
|
} else {
|
||||||
|
this._corner.set_position(0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.actor.connect('leave-event',
|
||||||
|
Lang.bind(this, this._onEnvironsLeft));
|
||||||
|
|
||||||
|
this._corner.connect('enter-event',
|
||||||
|
Lang.bind(this, this._onCornerEntered));
|
||||||
|
this._corner.connect('leave-event',
|
||||||
|
Lang.bind(this, this._onCornerLeft));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
destroy: function() {
|
destroy: function() {
|
||||||
this.actor.destroy();
|
this.setBarrierSize(0);
|
||||||
|
this._pressureBarrier.destroy();
|
||||||
|
this._pressureBarrier = null;
|
||||||
|
|
||||||
|
if (this.actor)
|
||||||
|
this.actor.destroy();
|
||||||
},
|
},
|
||||||
|
|
||||||
_animRipple : function(ripple, delay, time, startScale, startOpacity, finalScale) {
|
_animRipple : function(ripple, delay, time, startScale, startOpacity, finalScale) {
|
||||||
@ -1169,9 +1165,8 @@ const HotCorner = new Lang.Class({
|
|||||||
ripple.opacity = 255 * Math.sqrt(startOpacity);
|
ripple.opacity = 255 * Math.sqrt(startOpacity);
|
||||||
ripple.scale_x = ripple.scale_y = startScale;
|
ripple.scale_x = ripple.scale_y = startScale;
|
||||||
|
|
||||||
let [x, y] = this._corner.get_transformed_position();
|
ripple.x = this._x;
|
||||||
ripple.x = x;
|
ripple.y = this._y;
|
||||||
ripple.y = y;
|
|
||||||
|
|
||||||
Tweener.addTween(ripple, { _opacity: 0,
|
Tweener.addTween(ripple, { _opacity: 0,
|
||||||
scale_x: finalScale,
|
scale_x: finalScale,
|
||||||
@ -1183,7 +1178,7 @@ const HotCorner = new Lang.Class({
|
|||||||
onComplete: function() { ripple.visible = false; } });
|
onComplete: function() { ripple.visible = false; } });
|
||||||
},
|
},
|
||||||
|
|
||||||
rippleAnimation: function() {
|
_rippleAnimation: function() {
|
||||||
// Show three concentric ripples expanding outwards; the exact
|
// Show three concentric ripples expanding outwards; the exact
|
||||||
// parameters were found by trial and error, so don't look
|
// parameters were found by trial and error, so don't look
|
||||||
// for them to make perfect sense mathematically
|
// for them to make perfect sense mathematically
|
||||||
@ -1194,14 +1189,21 @@ const HotCorner = new Lang.Class({
|
|||||||
this._animRipple(this._ripple3, 0.35, 1.0, 0.0, 0.3, 1);
|
this._animRipple(this._ripple3, 0.35, 1.0, 0.0, 0.3, 1);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_toggleOverview: function() {
|
||||||
|
if (this._monitor.inFullscreen)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (Main.overview.shouldToggleByCornerOrButton()) {
|
||||||
|
this._rippleAnimation();
|
||||||
|
Main.overview.toggle();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
handleDragOver: function(source, actor, x, y, time) {
|
handleDragOver: function(source, actor, x, y, time) {
|
||||||
if (source != Main.xdndHandler)
|
if (source != Main.xdndHandler)
|
||||||
return DND.DragMotionResult.CONTINUE;
|
return DND.DragMotionResult.CONTINUE;
|
||||||
|
|
||||||
if (!Main.overview.visible && !Main.overview.animationInProgress) {
|
this._toggleOverview();
|
||||||
this.rippleAnimation();
|
|
||||||
Main.overview.showTemporarily();
|
|
||||||
}
|
|
||||||
|
|
||||||
return DND.DragMotionResult.CONTINUE;
|
return DND.DragMotionResult.CONTINUE;
|
||||||
},
|
},
|
||||||
@ -1209,22 +1211,11 @@ const HotCorner = new Lang.Class({
|
|||||||
_onCornerEntered : function() {
|
_onCornerEntered : function() {
|
||||||
if (!this._entered) {
|
if (!this._entered) {
|
||||||
this._entered = true;
|
this._entered = true;
|
||||||
if (!Main.overview.animationInProgress) {
|
this._toggleOverview();
|
||||||
this._activationTime = Date.now() / 1000;
|
|
||||||
|
|
||||||
this.rippleAnimation();
|
|
||||||
Main.overview.toggle();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
},
|
},
|
||||||
|
|
||||||
_onCornerClicked : function() {
|
|
||||||
if (this.shouldToggleOverviewOnClick())
|
|
||||||
Main.overview.toggle();
|
|
||||||
return true;
|
|
||||||
},
|
|
||||||
|
|
||||||
_onCornerLeft : function(actor, event) {
|
_onCornerLeft : function(actor, event) {
|
||||||
if (event.get_related() != this.actor)
|
if (event.get_related() != this.actor)
|
||||||
this._entered = false;
|
this._entered = false;
|
||||||
@ -1236,42 +1227,47 @@ const HotCorner = new Lang.Class({
|
|||||||
if (event.get_related() != this._corner)
|
if (event.get_related() != this._corner)
|
||||||
this._entered = false;
|
this._entered = false;
|
||||||
return false;
|
return false;
|
||||||
},
|
|
||||||
|
|
||||||
// Checks if the Activities button is currently sensitive to
|
|
||||||
// clicks. The first call to this function within the
|
|
||||||
// HOT_CORNER_ACTIVATION_TIMEOUT time of the hot corner being
|
|
||||||
// triggered will return false. This avoids opening and closing
|
|
||||||
// the overview if the user both triggered the hot corner and
|
|
||||||
// clicked the Activities button.
|
|
||||||
shouldToggleOverviewOnClick: function() {
|
|
||||||
if (Main.overview.animationInProgress)
|
|
||||||
return false;
|
|
||||||
if (this._activationTime == 0 || Date.now() / 1000 - this._activationTime > HOT_CORNER_ACTIVATION_TIMEOUT)
|
|
||||||
return true;
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const PressureBarrier = new Lang.Class({
|
const PressureBarrier = new Lang.Class({
|
||||||
Name: 'PressureBarrier',
|
Name: 'PressureBarrier',
|
||||||
|
|
||||||
_init: function(barrier, threshold, timeout) {
|
_init: function(threshold, timeout, keybindingMode) {
|
||||||
this._barrier = barrier;
|
|
||||||
this._threshold = threshold;
|
this._threshold = threshold;
|
||||||
this._timeout = timeout;
|
this._timeout = timeout;
|
||||||
this._orientation = (barrier.y1 == barrier.y2) ? Clutter.Orientation.HORIZONTAL : Clutter.Orientation.VERTICAL;
|
this._keybindingMode = keybindingMode;
|
||||||
|
this._barriers = [];
|
||||||
|
this._eventFilter = null;
|
||||||
|
|
||||||
|
this._isTriggered = false;
|
||||||
this._reset();
|
this._reset();
|
||||||
|
},
|
||||||
|
|
||||||
this._barrierHitId = this._barrier.connect('hit', Lang.bind(this, this._onBarrierHit));
|
addBarrier: function(barrier) {
|
||||||
this._barrierLeftId = this._barrier.connect('left', Lang.bind(this, this._onBarrierLeft));
|
barrier._pressureHitId = barrier.connect('hit', Lang.bind(this, this._onBarrierHit));
|
||||||
|
barrier._pressureLeftId = barrier.connect('left', Lang.bind(this, this._onBarrierLeft));
|
||||||
|
|
||||||
|
this._barriers.push(barrier);
|
||||||
|
},
|
||||||
|
|
||||||
|
_disconnectBarrier: function(barrier) {
|
||||||
|
barrier.disconnect(barrier._pressureHitId);
|
||||||
|
barrier.disconnect(barrier._pressureLeftId);
|
||||||
|
},
|
||||||
|
|
||||||
|
removeBarrier: function(barrier) {
|
||||||
|
this._disconnectBarrier(barrier);
|
||||||
|
this._barriers.splice(this._barriers.indexOf(barrier), 1);
|
||||||
},
|
},
|
||||||
|
|
||||||
destroy: function() {
|
destroy: function() {
|
||||||
this._barrier.disconnect(this._barrierHitId);
|
this._barriers.forEach(Lang.bind(this, this._disconnectBarrier));
|
||||||
this._barrier.disconnect(this._barrierLeftId);
|
this._barriers = [];
|
||||||
this._barrier = null;
|
},
|
||||||
|
|
||||||
|
setEventFilter: function(filter) {
|
||||||
|
this._eventFilter = filter;
|
||||||
},
|
},
|
||||||
|
|
||||||
_reset: function() {
|
_reset: function() {
|
||||||
@ -1280,33 +1276,34 @@ const PressureBarrier = new Lang.Class({
|
|||||||
this._lastTime = 0;
|
this._lastTime = 0;
|
||||||
},
|
},
|
||||||
|
|
||||||
_getDistanceAcrossBarrier: function(event) {
|
_isHorizontal: function(barrier) {
|
||||||
if (this._orientation == Clutter.Orientation.HORIZONTAL)
|
return barrier.y1 == barrier.y2;
|
||||||
|
},
|
||||||
|
|
||||||
|
_getDistanceAcrossBarrier: function(barrier, event) {
|
||||||
|
if (this._isHorizontal(barrier))
|
||||||
return Math.abs(event.dy);
|
return Math.abs(event.dy);
|
||||||
else
|
else
|
||||||
return Math.abs(event.dx);
|
return Math.abs(event.dx);
|
||||||
},
|
},
|
||||||
|
|
||||||
_getDistanceAlongBarrier: function(event) {
|
_getDistanceAlongBarrier: function(barrier, event) {
|
||||||
if (this._orientation == Clutter.Orientation.HORIZONTAL)
|
if (this._isHorizontal(barrier))
|
||||||
return Math.abs(event.dx);
|
return Math.abs(event.dx);
|
||||||
else
|
else
|
||||||
return Math.abs(event.dy);
|
return Math.abs(event.dy);
|
||||||
},
|
},
|
||||||
|
|
||||||
_isBarrierEventTooOld: function(event) {
|
|
||||||
// Ignore all events older than this time
|
|
||||||
let threshold = this._lastTime - this._timeout;
|
|
||||||
return event.time < threshold;
|
|
||||||
},
|
|
||||||
|
|
||||||
_trimBarrierEvents: function() {
|
_trimBarrierEvents: function() {
|
||||||
// Events are guaranteed to be sorted in time order from
|
// Events are guaranteed to be sorted in time order from
|
||||||
// oldest to newest, so just look for the first old event,
|
// oldest to newest, so just look for the first old event,
|
||||||
// and then chop events after that off.
|
// and then chop events after that off.
|
||||||
let i = 0;
|
let i = 0;
|
||||||
|
let threshold = this._lastTime - this._timeout;
|
||||||
|
|
||||||
while (i < this._barrierEvents.length) {
|
while (i < this._barrierEvents.length) {
|
||||||
if (!this._isBarrierEventTooOld(this._barrierEvents[i]))
|
let [time, distance] = this._barrierEvents[i];
|
||||||
|
if (time >= threshold)
|
||||||
break;
|
break;
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
@ -1314,7 +1311,8 @@ const PressureBarrier = new Lang.Class({
|
|||||||
let firstNewEvent = i;
|
let firstNewEvent = i;
|
||||||
|
|
||||||
for (i = 0; i < firstNewEvent; i++) {
|
for (i = 0; i < firstNewEvent; i++) {
|
||||||
this._currentPressure -= this._getDistanceAcrossBarrier(this._barrierEvents[i]);
|
let [time, distance] = this._barrierEvents[i];
|
||||||
|
this._currentPressure -= distance;
|
||||||
}
|
}
|
||||||
|
|
||||||
this._barrierEvents = this._barrierEvents.slice(firstNewEvent);
|
this._barrierEvents = this._barrierEvents.slice(firstNewEvent);
|
||||||
@ -1322,29 +1320,30 @@ const PressureBarrier = new Lang.Class({
|
|||||||
|
|
||||||
_onBarrierLeft: function(barrier, event) {
|
_onBarrierLeft: function(barrier, event) {
|
||||||
this._reset();
|
this._reset();
|
||||||
|
this._isTriggered = false;
|
||||||
},
|
},
|
||||||
|
|
||||||
_trigger: function() {
|
_trigger: function() {
|
||||||
|
this._isTriggered = true;
|
||||||
this.emit('trigger');
|
this.emit('trigger');
|
||||||
this._reset();
|
this._reset();
|
||||||
},
|
},
|
||||||
|
|
||||||
_onBarrierHit: function(barrier, event) {
|
_onBarrierHit: function(barrier, event) {
|
||||||
// Throw out all events where the pointer was grabbed by another
|
// If we've triggered the barrier, wait until the pointer has the
|
||||||
// client, as the client that grabbed the pointer expects to have
|
// left the barrier hitbox until we trigger it again.
|
||||||
// complete control over it
|
if (this._isTriggered)
|
||||||
if (event.grabbed && Main.modalCount == 0)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
let isOverview = ((Main.keybindingMode & (Shell.KeyBindingMode.OVERVIEW)) != 0);
|
if (this._eventFilter && this._eventFilter(event))
|
||||||
|
|
||||||
// Throw out events where the grab is taken by something that's
|
|
||||||
// not the overview (modal dialogs, etc.)
|
|
||||||
if (event.grabbed && !isOverview)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
let slide = this._getDistanceAlongBarrier(event);
|
// Throw out all events not in the proper keybinding mode
|
||||||
let distance = this._getDistanceAcrossBarrier(event);
|
if (!(this._keybindingMode & Main.keybindingMode))
|
||||||
|
return;
|
||||||
|
|
||||||
|
let slide = this._getDistanceAlongBarrier(barrier, event);
|
||||||
|
let distance = this._getDistanceAcrossBarrier(barrier, event);
|
||||||
|
|
||||||
if (distance >= this._threshold) {
|
if (distance >= this._threshold) {
|
||||||
this._trigger();
|
this._trigger();
|
||||||
@ -1360,8 +1359,10 @@ const PressureBarrier = new Lang.Class({
|
|||||||
this._lastTime = event.time;
|
this._lastTime = event.time;
|
||||||
|
|
||||||
this._trimBarrierEvents();
|
this._trimBarrierEvents();
|
||||||
this._barrierEvents.push(event);
|
distance = Math.min(15, distance);
|
||||||
this._currentPressure += Math.min(15, distance);
|
|
||||||
|
this._barrierEvents.push([event.time, distance]);
|
||||||
|
this._currentPressure += distance;
|
||||||
|
|
||||||
if (this._currentPressure >= this._threshold)
|
if (this._currentPressure >= this._threshold)
|
||||||
this._trigger();
|
this._trigger();
|
||||||
|
@ -24,6 +24,7 @@ const Panel = imports.ui.panel;
|
|||||||
const Params = imports.misc.params;
|
const Params = imports.misc.params;
|
||||||
const RunDialog = imports.ui.runDialog;
|
const RunDialog = imports.ui.runDialog;
|
||||||
const Layout = imports.ui.layout;
|
const Layout = imports.ui.layout;
|
||||||
|
const LoginManager = imports.misc.loginManager;
|
||||||
const LookingGlass = imports.ui.lookingGlass;
|
const LookingGlass = imports.ui.lookingGlass;
|
||||||
const NotificationDaemon = imports.ui.notificationDaemon;
|
const NotificationDaemon = imports.ui.notificationDaemon;
|
||||||
const WindowAttentionHandler = imports.ui.windowAttentionHandler;
|
const WindowAttentionHandler = imports.ui.windowAttentionHandler;
|
||||||
@ -32,7 +33,6 @@ const Scripting = imports.ui.scripting;
|
|||||||
const SessionMode = imports.ui.sessionMode;
|
const SessionMode = imports.ui.sessionMode;
|
||||||
const ShellDBus = imports.ui.shellDBus;
|
const ShellDBus = imports.ui.shellDBus;
|
||||||
const ShellMountOperation = imports.ui.shellMountOperation;
|
const ShellMountOperation = imports.ui.shellMountOperation;
|
||||||
const UnlockDialog = imports.ui.unlockDialog;
|
|
||||||
const WindowManager = imports.ui.windowManager;
|
const WindowManager = imports.ui.windowManager;
|
||||||
const Magnifier = imports.ui.magnifier;
|
const Magnifier = imports.ui.magnifier;
|
||||||
const XdndHandler = imports.ui.xdndHandler;
|
const XdndHandler = imports.ui.xdndHandler;
|
||||||
@ -58,7 +58,7 @@ let shellDBusService = null;
|
|||||||
let shellMountOpDBusService = null;
|
let shellMountOpDBusService = null;
|
||||||
let screenSaverDBus = null;
|
let screenSaverDBus = null;
|
||||||
let modalCount = 0;
|
let modalCount = 0;
|
||||||
let keybindingMode = Shell.KeyBindingMode.NORMAL;
|
let keybindingMode = Shell.KeyBindingMode.NONE;
|
||||||
let modalActorFocusStack = [];
|
let modalActorFocusStack = [];
|
||||||
let uiGroup = null;
|
let uiGroup = null;
|
||||||
let magnifier = null;
|
let magnifier = null;
|
||||||
@ -71,6 +71,8 @@ let _cssStylesheet = null;
|
|||||||
let _overridesSettings = null;
|
let _overridesSettings = null;
|
||||||
|
|
||||||
function _sessionUpdated() {
|
function _sessionUpdated() {
|
||||||
|
_loadDefaultStylesheet();
|
||||||
|
|
||||||
wm.setCustomKeybindingHandler('panel-main-menu',
|
wm.setCustomKeybindingHandler('panel-main-menu',
|
||||||
Shell.KeyBindingMode.NORMAL |
|
Shell.KeyBindingMode.NORMAL |
|
||||||
Shell.KeyBindingMode.OVERVIEW,
|
Shell.KeyBindingMode.OVERVIEW,
|
||||||
@ -82,8 +84,9 @@ function _sessionUpdated() {
|
|||||||
Shell.KeyBindingMode.NORMAL |
|
Shell.KeyBindingMode.NORMAL |
|
||||||
Shell.KeyBindingMode.OVERVIEW,
|
Shell.KeyBindingMode.OVERVIEW,
|
||||||
sessionMode.hasRunDialog ? openRunDialog : null);
|
sessionMode.hasRunDialog ? openRunDialog : null);
|
||||||
if (sessionMode.isGreeter)
|
|
||||||
screenShield.showDialog();
|
if (!sessionMode.hasRunDialog && lookingGlass)
|
||||||
|
lookingGlass.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
function start() {
|
function start() {
|
||||||
@ -91,29 +94,27 @@ function start() {
|
|||||||
global.logError = window.log;
|
global.logError = window.log;
|
||||||
global.log = window.log;
|
global.log = window.log;
|
||||||
|
|
||||||
// Hide the stage until we're ready for it
|
|
||||||
global.stage.hide();
|
|
||||||
|
|
||||||
// Chain up async errors reported from C
|
// Chain up async errors reported from C
|
||||||
global.connect('notify-error', function (global, msg, detail) { notifyError(msg, detail); });
|
global.connect('notify-error', function (global, msg, detail) { notifyError(msg, detail); });
|
||||||
|
|
||||||
Gio.DesktopAppInfo.set_desktop_env('GNOME');
|
Gio.DesktopAppInfo.set_desktop_env('GNOME');
|
||||||
|
|
||||||
sessionMode = new SessionMode.SessionMode();
|
sessionMode = new SessionMode.SessionMode();
|
||||||
|
sessionMode.connect('sessions-loaded', _sessionsLoaded);
|
||||||
// start session after we know what mode we're running in
|
sessionMode.init();
|
||||||
let signalId = sessionMode.connect('updated', function() {
|
|
||||||
sessionMode.disconnect(signalId);
|
|
||||||
startSession();
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function startSession() {
|
function _sessionsLoaded() {
|
||||||
sessionMode.connect('updated', _loadDefaultStylesheet);
|
sessionMode.connect('updated', _sessionUpdated);
|
||||||
|
_initializeUI();
|
||||||
|
|
||||||
shellDBusService = new ShellDBus.GnomeShell();
|
shellDBusService = new ShellDBus.GnomeShell();
|
||||||
shellMountOpDBusService = new ShellMountOperation.GnomeShellMountOpHandler();
|
shellMountOpDBusService = new ShellMountOperation.GnomeShellMountOpHandler();
|
||||||
|
|
||||||
|
_sessionUpdated();
|
||||||
|
}
|
||||||
|
|
||||||
|
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
|
||||||
// needs to load all the .desktop files, and ShellWindowTracker
|
// needs to load all the .desktop files, and ShellWindowTracker
|
||||||
@ -143,13 +144,9 @@ function startSession() {
|
|||||||
overview = new Overview.Overview();
|
overview = new Overview.Overview();
|
||||||
wm = new WindowManager.WindowManager();
|
wm = new WindowManager.WindowManager();
|
||||||
magnifier = new Magnifier.Magnifier();
|
magnifier = new Magnifier.Magnifier();
|
||||||
if (UnlockDialog.isSupported())
|
if (LoginManager.canLock())
|
||||||
screenShield = new ScreenShield.ScreenShield();
|
screenShield = new ScreenShield.ScreenShield();
|
||||||
else
|
|
||||||
screenShield = new ScreenShield.ScreenShieldFallback();
|
|
||||||
|
|
||||||
// The message tray relies on being constructed
|
|
||||||
// after the panel.
|
|
||||||
panel = new Panel.Panel();
|
panel = new Panel.Panel();
|
||||||
messageTray = new MessageTray.MessageTray();
|
messageTray = new MessageTray.MessageTray();
|
||||||
keyboard = new Keyboard.Keyboard();
|
keyboard = new Keyboard.Keyboard();
|
||||||
@ -158,14 +155,11 @@ function startSession() {
|
|||||||
componentManager = new Components.ComponentManager();
|
componentManager = new Components.ComponentManager();
|
||||||
|
|
||||||
layoutManager.init();
|
layoutManager.init();
|
||||||
layoutManager.prepareStartupAnimation();
|
|
||||||
overview.init();
|
overview.init();
|
||||||
|
|
||||||
global.screen.override_workspace_layout(Meta.ScreenCorner.TOPLEFT,
|
global.screen.override_workspace_layout(Meta.ScreenCorner.TOPLEFT,
|
||||||
false, -1, 1);
|
false, -1, 1);
|
||||||
global.display.connect('overlay-key', Lang.bind(overview, overview.toggle));
|
global.display.connect('overlay-key', Lang.bind(overview, overview.toggle));
|
||||||
sessionMode.connect('updated', _sessionUpdated);
|
|
||||||
_sessionUpdated();
|
|
||||||
|
|
||||||
// Provide the bus object for gnome-session to
|
// Provide the bus object for gnome-session to
|
||||||
// initiate logouts.
|
// initiate logouts.
|
||||||
@ -199,8 +193,16 @@ function startSession() {
|
|||||||
ExtensionDownloader.init();
|
ExtensionDownloader.init();
|
||||||
ExtensionSystem.init();
|
ExtensionSystem.init();
|
||||||
|
|
||||||
layoutManager.connect('startup-prepared', function() {
|
if (sessionMode.isGreeter && screenShield) {
|
||||||
layoutManager.startupAnimation();
|
layoutManager.connect('startup-prepared', function() {
|
||||||
|
screenShield.showDialog();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
layoutManager.connect('startup-complete', function() {
|
||||||
|
if (keybindingMode == Shell.KeyBindingMode.NONE) {
|
||||||
|
keybindingMode = Shell.KeyBindingMode.NORMAL;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1591,17 +1591,13 @@ const MessageTray = new Lang.Class({
|
|||||||
global.focus_manager.add_group(this.actor);
|
global.focus_manager.add_group(this.actor);
|
||||||
this._summary = new St.BoxLayout({ style_class: 'message-tray-summary',
|
this._summary = new St.BoxLayout({ style_class: 'message-tray-summary',
|
||||||
reactive: true,
|
reactive: true,
|
||||||
track_hover: true,
|
|
||||||
x_align: Clutter.ActorAlign.END,
|
x_align: Clutter.ActorAlign.END,
|
||||||
x_expand: true,
|
x_expand: true,
|
||||||
y_align: Clutter.ActorAlign.CENTER,
|
y_align: Clutter.ActorAlign.CENTER,
|
||||||
y_expand: true });
|
y_expand: true });
|
||||||
this._summary.connect('notify::hover', Lang.bind(this, this._onSummaryHoverChanged));
|
|
||||||
this.actor.add_actor(this._summary);
|
this.actor.add_actor(this._summary);
|
||||||
this._summary.opacity = 0;
|
|
||||||
|
|
||||||
this._summaryMotionId = 0;
|
this._summaryMotionId = 0;
|
||||||
this._trayMotionId = 0;
|
|
||||||
|
|
||||||
this._summaryBoxPointer = new BoxPointer.BoxPointer(St.Side.BOTTOM,
|
this._summaryBoxPointer = new BoxPointer.BoxPointer(St.Side.BOTTOM,
|
||||||
{ reactive: true,
|
{ reactive: true,
|
||||||
@ -1636,15 +1632,22 @@ const MessageTray = new Lang.Class({
|
|||||||
Main.layoutManager.connect('keyboard-visible-changed', Lang.bind(this, this._onKeyboardVisibleChanged));
|
Main.layoutManager.connect('keyboard-visible-changed', Lang.bind(this, this._onKeyboardVisibleChanged));
|
||||||
|
|
||||||
this._trayState = State.HIDDEN;
|
this._trayState = State.HIDDEN;
|
||||||
this._locked = false;
|
|
||||||
this._traySummoned = false;
|
this._traySummoned = false;
|
||||||
this._useLongerTrayLeftTimeout = false;
|
this._useLongerTrayLeftTimeout = false;
|
||||||
this._trayLeftTimeoutId = 0;
|
this._trayLeftTimeoutId = 0;
|
||||||
|
|
||||||
|
// pointerInTray is sort of a misnomer -- it tracks whether
|
||||||
|
// a message tray notification should expand. The value is
|
||||||
|
// partially driven by the hover state of the tray, but has
|
||||||
|
// a lot of complex state related to timeouts and the current
|
||||||
|
// state of the pointer when a notification pops up.
|
||||||
this._pointerInTray = false;
|
this._pointerInTray = false;
|
||||||
this._pointerInKeyboard = false;
|
|
||||||
|
// This tracks this.actor.hover and is used to fizzle
|
||||||
|
// out non-changing hover notifications in onTrayHoverChanged.
|
||||||
|
this._trayHovered = false;
|
||||||
|
|
||||||
this._keyboardVisible = false;
|
this._keyboardVisible = false;
|
||||||
this._summaryState = State.HIDDEN;
|
|
||||||
this._pointerInSummary = false;
|
|
||||||
this._notificationClosed = false;
|
this._notificationClosed = false;
|
||||||
this._notificationState = State.HIDDEN;
|
this._notificationState = State.HIDDEN;
|
||||||
this._notificationTimeoutId = 0;
|
this._notificationTimeoutId = 0;
|
||||||
@ -1666,20 +1669,18 @@ const MessageTray = new Lang.Class({
|
|||||||
});
|
});
|
||||||
|
|
||||||
Main.layoutManager.trayBox.add_actor(this.actor);
|
Main.layoutManager.trayBox.add_actor(this.actor);
|
||||||
this.actor.y = 0;
|
|
||||||
Main.layoutManager.trackChrome(this.actor);
|
Main.layoutManager.trackChrome(this.actor);
|
||||||
Main.layoutManager.trackChrome(this._notificationWidget);
|
Main.layoutManager.trackChrome(this._notificationWidget);
|
||||||
Main.layoutManager.trackChrome(this._closeButton);
|
Main.layoutManager.trackChrome(this._closeButton);
|
||||||
|
|
||||||
Main.layoutManager.connect('primary-fullscreen-changed', Lang.bind(this, this._onFullscreenChanged));
|
Main.layoutManager.connect('fullscreen-changed', Lang.bind(this, this._updateState));
|
||||||
|
Main.layoutManager.connect('hot-corners-changed', Lang.bind(this, this._hotCornersChanged));
|
||||||
|
|
||||||
// If the overview shows or hides while we're in
|
// If the overview shows or hides while we're in
|
||||||
// the message tray, revert back to normal mode.
|
// the message tray, revert back to normal mode.
|
||||||
Main.overview.connect('showing', Lang.bind(this, this._escapeTray));
|
Main.overview.connect('showing', Lang.bind(this, this._escapeTray));
|
||||||
Main.overview.connect('hiding', Lang.bind(this, this._escapeTray));
|
Main.overview.connect('hiding', Lang.bind(this, this._escapeTray));
|
||||||
|
|
||||||
// Track if we've added the activities button
|
|
||||||
this._activitiesButtonAdded = false;
|
|
||||||
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',
|
||||||
@ -1703,6 +1704,7 @@ const MessageTray = new Lang.Class({
|
|||||||
this._trayDwellTimeoutId = 0;
|
this._trayDwellTimeoutId = 0;
|
||||||
this._setupTrayDwellIfNeeded();
|
this._setupTrayDwellIfNeeded();
|
||||||
this._sessionUpdated();
|
this._sessionUpdated();
|
||||||
|
this._hotCornersChanged();
|
||||||
|
|
||||||
this._noMessages = new St.Label({ text: _("No Messages"),
|
this._noMessages = new St.Label({ text: _("No Messages"),
|
||||||
style_class: 'no-messages-label',
|
style_class: 'no-messages-label',
|
||||||
@ -1743,13 +1745,11 @@ const MessageTray = new Lang.Class({
|
|||||||
|
|
||||||
_openContextMenu: function () {
|
_openContextMenu: function () {
|
||||||
let [x, y, mask] = global.get_pointer();
|
let [x, y, mask] = global.get_pointer();
|
||||||
this._lock();
|
|
||||||
this._contextMenu.setPosition(Math.round(x), Math.round(y));
|
this._contextMenu.setPosition(Math.round(x), Math.round(y));
|
||||||
this._grabHelper.grab({ actor: this._contextMenu.actor,
|
this._grabHelper.grab({ actor: this._contextMenu.actor,
|
||||||
grabFocus: true,
|
grabFocus: true,
|
||||||
onUngrab: Lang.bind(this, function () {
|
onUngrab: Lang.bind(this, function () {
|
||||||
this._contextMenu.close(BoxPointer.PopupAnimation.FULL);
|
this._contextMenu.close(BoxPointer.PopupAnimation.FULL);
|
||||||
this._unlock();
|
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
this._contextMenu.open(BoxPointer.PopupAnimation.FULL);
|
this._contextMenu.open(BoxPointer.PopupAnimation.FULL);
|
||||||
@ -1775,11 +1775,6 @@ const MessageTray = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_sessionUpdated: function() {
|
_sessionUpdated: function() {
|
||||||
if (!this._activitiesButtonAdded && Main.panel.statusArea.activities) {
|
|
||||||
this._activitiesButtonAdded = true;
|
|
||||||
this._grabHelper.addActor(Main.panel.statusArea.activities.hotCorner.actor);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((Main.sessionMode.isLocked || Main.sessionMode.isGreeter) && this._inCtrlAltTab) {
|
if ((Main.sessionMode.isLocked || Main.sessionMode.isGreeter) && this._inCtrlAltTab) {
|
||||||
Main.ctrlAltTabManager.removeGroup(this._summary);
|
Main.ctrlAltTabManager.removeGroup(this._summary);
|
||||||
this._inCtrlAltTab = false;
|
this._inCtrlAltTab = false;
|
||||||
@ -1828,6 +1823,9 @@ const MessageTray = new Lang.Class({
|
|||||||
_trayDwellTimeout: function() {
|
_trayDwellTimeout: function() {
|
||||||
this._trayDwellTimeoutId = 0;
|
this._trayDwellTimeoutId = 0;
|
||||||
|
|
||||||
|
if (Main.layoutManager.bottomMonitor.inFullscreen)
|
||||||
|
return false;
|
||||||
|
|
||||||
// We don't want to open the tray when a modal dialog
|
// We don't want to open the tray when a modal dialog
|
||||||
// is up, so we check the modal count for that. When we are in the
|
// is up, so we check the modal count for that. When we are in the
|
||||||
// overview we have to take the overview's modal push into account
|
// overview we have to take the overview's modal push into account
|
||||||
@ -1999,18 +1997,6 @@ const MessageTray = new Lang.Class({
|
|||||||
this._notificationQueue.splice(index, 1);
|
this._notificationQueue.splice(index, 1);
|
||||||
},
|
},
|
||||||
|
|
||||||
_lock: function() {
|
|
||||||
this._locked = true;
|
|
||||||
},
|
|
||||||
|
|
||||||
_unlock: function() {
|
|
||||||
if (!this._locked)
|
|
||||||
return;
|
|
||||||
this._locked = false;
|
|
||||||
this._pointerInTray = this.actor.hover;
|
|
||||||
this._updateState();
|
|
||||||
},
|
|
||||||
|
|
||||||
openTray: function() {
|
openTray: function() {
|
||||||
if (Main.overview.animationInProgress)
|
if (Main.overview.animationInProgress)
|
||||||
return;
|
return;
|
||||||
@ -2036,7 +2022,6 @@ const MessageTray = new Lang.Class({
|
|||||||
hide: function() {
|
hide: function() {
|
||||||
this._traySummoned = false;
|
this._traySummoned = false;
|
||||||
this.actor.set_hover(false);
|
this.actor.set_hover(false);
|
||||||
this._summary.set_hover(false);
|
|
||||||
this._updateState();
|
this._updateState();
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -2096,13 +2081,19 @@ const MessageTray = new Lang.Class({
|
|||||||
this._updateState();
|
this._updateState();
|
||||||
},
|
},
|
||||||
|
|
||||||
_onSummaryHoverChanged: function() {
|
_hotCornersChanged: function() {
|
||||||
this._pointerInSummary = this._summary.hover;
|
let primary = Main.layoutManager.primaryIndex;
|
||||||
this._updateState();
|
let corner = Main.layoutManager.hotCorners[primary];
|
||||||
|
if (corner && corner.actor)
|
||||||
|
this._grabHelper.addActor(corner.actor);
|
||||||
},
|
},
|
||||||
|
|
||||||
_onTrayHoverChanged: function() {
|
_onTrayHoverChanged: function() {
|
||||||
if (this.actor.hover) {
|
if (this.actor.hover == this._trayHovered)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this._trayHovered = this.actor.hover;
|
||||||
|
if (this._trayHovered) {
|
||||||
// No dwell inside notifications at the bottom of the screen
|
// No dwell inside notifications at the bottom of the screen
|
||||||
this._cancelTrayDwell();
|
this._cancelTrayDwell();
|
||||||
|
|
||||||
@ -2110,13 +2101,6 @@ const MessageTray = new Lang.Class({
|
|||||||
if (this._trayState == State.HIDDEN && this._notificationState == State.HIDDEN)
|
if (this._trayState == State.HIDDEN && this._notificationState == State.HIDDEN)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Don't do anything if this._useLongerTrayLeftTimeout is true, meaning the notification originally
|
|
||||||
// popped up under the pointer, but this._trayLeftTimeoutId is 0, meaning the pointer didn't leave
|
|
||||||
// the tray yet. We need to check for this case because sometimes _onTrayHoverChanged() gets called
|
|
||||||
// multiple times while this.actor.hover is true.
|
|
||||||
if (this._useLongerTrayLeftTimeout && !this._trayLeftTimeoutId)
|
|
||||||
return;
|
|
||||||
|
|
||||||
this._useLongerTrayLeftTimeout = false;
|
this._useLongerTrayLeftTimeout = false;
|
||||||
if (this._trayLeftTimeoutId) {
|
if (this._trayLeftTimeoutId) {
|
||||||
Mainloop.source_remove(this._trayLeftTimeoutId);
|
Mainloop.source_remove(this._trayLeftTimeoutId);
|
||||||
@ -2165,11 +2149,6 @@ const MessageTray = new Lang.Class({
|
|||||||
this._updateState();
|
this._updateState();
|
||||||
},
|
},
|
||||||
|
|
||||||
_onFullscreenChanged: function(obj, state) {
|
|
||||||
this._inFullscreen = state;
|
|
||||||
this._updateState();
|
|
||||||
},
|
|
||||||
|
|
||||||
_onStatusChanged: function(status) {
|
_onStatusChanged: function(status) {
|
||||||
if (status == GnomeSession.PresenceStatus.BUSY) {
|
if (status == GnomeSession.PresenceStatus.BUSY) {
|
||||||
// remove notification and allow the summary to be closed now
|
// remove notification and allow the summary to be closed now
|
||||||
@ -2201,7 +2180,6 @@ const MessageTray = new Lang.Class({
|
|||||||
this._trayLeftTimeoutId = 0;
|
this._trayLeftTimeoutId = 0;
|
||||||
this._useLongerTrayLeftTimeout = false;
|
this._useLongerTrayLeftTimeout = false;
|
||||||
this._pointerInTray = false;
|
this._pointerInTray = false;
|
||||||
this._pointerInSummary = false;
|
|
||||||
this._updateNotificationTimeout(0);
|
this._updateNotificationTimeout(0);
|
||||||
this._updateState();
|
this._updateState();
|
||||||
}
|
}
|
||||||
@ -2209,9 +2187,7 @@ const MessageTray = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_escapeTray: function() {
|
_escapeTray: function() {
|
||||||
this._unlock();
|
|
||||||
this._pointerInTray = false;
|
this._pointerInTray = false;
|
||||||
this._pointerInSummary = false;
|
|
||||||
this._traySummoned = false;
|
this._traySummoned = false;
|
||||||
this._setClickedSummaryItem(null);
|
this._setClickedSummaryItem(null);
|
||||||
this._updateNotificationTimeout(0);
|
this._updateNotificationTimeout(0);
|
||||||
@ -2220,7 +2196,7 @@ const MessageTray = new Lang.Class({
|
|||||||
|
|
||||||
// All of the logic for what happens when occurs here; the various
|
// All of the logic for what happens when occurs here; the various
|
||||||
// event handlers merely update variables such as
|
// event handlers merely update variables such as
|
||||||
// 'this._pointerInTray', 'this._summaryState', etc, and
|
// 'this._pointerInTray', 'this._traySummoned', etc, and
|
||||||
// _updateState() figures out what (if anything) needs to be done
|
// _updateState() figures out what (if anything) needs to be done
|
||||||
// at the present time.
|
// at the present time.
|
||||||
_updateState: function() {
|
_updateState: function() {
|
||||||
@ -2228,25 +2204,22 @@ const MessageTray = new Lang.Class({
|
|||||||
let notificationQueue = this._notificationQueue;
|
let notificationQueue = this._notificationQueue;
|
||||||
let notificationUrgent = notificationQueue.length > 0 && notificationQueue[0].urgency == Urgency.CRITICAL;
|
let notificationUrgent = notificationQueue.length > 0 && notificationQueue[0].urgency == Urgency.CRITICAL;
|
||||||
let notificationForFeedback = notificationQueue.length > 0 && notificationQueue[0].forFeedback;
|
let notificationForFeedback = notificationQueue.length > 0 && notificationQueue[0].forFeedback;
|
||||||
let notificationsLimited = this._busy || this._inFullscreen;
|
let notificationsLimited = this._busy || Main.layoutManager.bottomMonitor.inFullscreen;
|
||||||
let notificationsPending = notificationQueue.length > 0 && (!notificationsLimited || notificationUrgent || notificationForFeedback) && Main.sessionMode.hasNotifications;
|
let notificationsPending = notificationQueue.length > 0 && (!notificationsLimited || notificationUrgent || notificationForFeedback) && Main.sessionMode.hasNotifications;
|
||||||
let nextNotification = notificationQueue.length > 0 ? notificationQueue[0] : null;
|
let nextNotification = notificationQueue.length > 0 ? notificationQueue[0] : null;
|
||||||
let notificationPinned = this._pointerInTray && !this._pointerInSummary && !this._notificationRemoved;
|
let notificationPinned = this._pointerInTray && !this._notificationRemoved;
|
||||||
let notificationExpanded = this._notification && this._notification.expanded;
|
let notificationExpanded = this._notification && this._notification.expanded;
|
||||||
let notificationExpired = this._notificationTimeoutId == 0 &&
|
let notificationExpired = this._notificationTimeoutId == 0 &&
|
||||||
!(this._notification && this._notification.urgency == Urgency.CRITICAL) &&
|
!(this._notification && this._notification.urgency == Urgency.CRITICAL) &&
|
||||||
!(this._notification && this._notification.focused) &&
|
!(this._notification && this._notification.focused) &&
|
||||||
!this._pointerInTray &&
|
!this._pointerInTray;
|
||||||
!this._locked &&
|
|
||||||
!(this._pointerInKeyboard && notificationExpanded);
|
|
||||||
let notificationLockedOut = !Main.sessionMode.hasNotifications && this._notification;
|
let notificationLockedOut = !Main.sessionMode.hasNotifications && this._notification;
|
||||||
let notificationMustClose = this._notificationRemoved || notificationLockedOut || (notificationExpired && this._userActiveWhileNotificationShown) || this._notificationClosed;
|
let notificationMustClose = this._notificationRemoved || notificationLockedOut || (notificationExpired && this._userActiveWhileNotificationShown) || this._notificationClosed;
|
||||||
let canShowNotification = notificationsPending && this._summaryState == State.HIDDEN;
|
let canShowNotification = notificationsPending && this._trayState == State.HIDDEN;
|
||||||
|
|
||||||
if (this._notificationState == State.HIDDEN) {
|
if (this._notificationState == State.HIDDEN) {
|
||||||
if (canShowNotification) {
|
if (canShowNotification)
|
||||||
this._showNotification();
|
this._showNotification();
|
||||||
}
|
|
||||||
} else if (this._notificationState == State.SHOWN) {
|
} else if (this._notificationState == State.SHOWN) {
|
||||||
if (notificationMustClose)
|
if (notificationMustClose)
|
||||||
this._hideNotification();
|
this._hideNotification();
|
||||||
@ -2256,27 +2229,17 @@ const MessageTray = new Lang.Class({
|
|||||||
this._ensureNotificationFocused();
|
this._ensureNotificationFocused();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Summary
|
|
||||||
let summarySummoned = this._pointerInSummary || this._traySummoned;
|
|
||||||
let summaryPinned = this._pointerInTray || summarySummoned || this._locked;
|
|
||||||
let summaryHovered = this._pointerInTray || this._pointerInSummary;
|
|
||||||
|
|
||||||
let notificationsVisible = this._notificationState != State.HIDDEN;
|
let notificationsVisible = this._notificationState != State.HIDDEN;
|
||||||
let notificationsDone = !notificationsVisible && !notificationsPending;
|
let notificationsDone = !notificationsVisible && !notificationsPending;
|
||||||
|
|
||||||
let mustHideSummary = ((notificationsPending && notificationUrgent)
|
let mustHideTray = ((notificationsPending && notificationUrgent)
|
||||||
|| notificationsVisible || !Main.sessionMode.hasNotifications);
|
|| notificationsVisible || !Main.sessionMode.hasNotifications);
|
||||||
|
|
||||||
if (this._summaryState == State.HIDDEN && !mustHideSummary && summarySummoned)
|
|
||||||
this._showSummary();
|
|
||||||
else if (this._summaryState == State.SHOWN && (!summaryPinned || mustHideSummary))
|
|
||||||
this._hideSummary();
|
|
||||||
|
|
||||||
// Summary notification
|
// Summary notification
|
||||||
let haveClickedSummaryItem = this._clickedSummaryItem != null;
|
let haveClickedSummaryItem = this._clickedSummaryItem != null;
|
||||||
let summarySourceIsMainNotificationSource = (haveClickedSummaryItem && this._notification &&
|
let summarySourceIsMainNotificationSource = (haveClickedSummaryItem && this._notification &&
|
||||||
this._clickedSummaryItem.source == this._notification.source);
|
this._clickedSummaryItem.source == this._notification.source);
|
||||||
let canShowSummaryBoxPointer = this._summaryState == State.SHOWN;
|
let canShowSummaryBoxPointer = this._trayState == State.SHOWN;
|
||||||
// We only have sources with empty notification stacks for legacy tray icons. Currently, we never attempt
|
// We only have sources with empty notification stacks for legacy tray icons. Currently, we never attempt
|
||||||
// to show notifications for legacy tray icons, but this would be necessary if we did.
|
// to show notifications for legacy tray icons, but this would be necessary if we did.
|
||||||
let requestedNotificationStackIsEmpty = (this._clickedSummaryItemMouseButton == 1 && this._clickedSummaryItem.source.notifications.length == 0);
|
let requestedNotificationStackIsEmpty = (this._clickedSummaryItemMouseButton == 1 && this._clickedSummaryItem.source.notifications.length == 0);
|
||||||
@ -2291,7 +2254,7 @@ const MessageTray = new Lang.Class({
|
|||||||
if (haveClickedSummaryItem && !summarySourceIsMainNotificationSource && canShowSummaryBoxPointer && !requestedNotificationStackIsEmpty)
|
if (haveClickedSummaryItem && !summarySourceIsMainNotificationSource && canShowSummaryBoxPointer && !requestedNotificationStackIsEmpty)
|
||||||
this._showSummaryBoxPointer();
|
this._showSummaryBoxPointer();
|
||||||
} else if (this._summaryBoxPointerState == State.SHOWN) {
|
} else if (this._summaryBoxPointerState == State.SHOWN) {
|
||||||
if (!haveClickedSummaryItem || !canShowSummaryBoxPointer || wrongSummaryBoxPointer || mustHideSummary) {
|
if (!haveClickedSummaryItem || !canShowSummaryBoxPointer || wrongSummaryBoxPointer || mustHideTray) {
|
||||||
this._hideSummaryBoxPointer();
|
this._hideSummaryBoxPointer();
|
||||||
if (wrongSummaryBoxPointer)
|
if (wrongSummaryBoxPointer)
|
||||||
this._showSummaryBoxPointer();
|
this._showSummaryBoxPointer();
|
||||||
@ -2301,9 +2264,7 @@ const MessageTray = new Lang.Class({
|
|||||||
// Tray itself
|
// Tray itself
|
||||||
let trayIsVisible = (this._trayState == State.SHOWING ||
|
let trayIsVisible = (this._trayState == State.SHOWING ||
|
||||||
this._trayState == State.SHOWN);
|
this._trayState == State.SHOWN);
|
||||||
let trayShouldBeVisible = (this._summaryState == State.SHOWING ||
|
let trayShouldBeVisible = this._traySummoned && !this._keyboardVisible && !mustHideTray;
|
||||||
this._summaryState == State.SHOWN) &&
|
|
||||||
!this._keyboardVisible;
|
|
||||||
if (!trayIsVisible && trayShouldBeVisible)
|
if (!trayIsVisible && trayShouldBeVisible)
|
||||||
trayShouldBeVisible = this._showTray();
|
trayShouldBeVisible = this._showTray();
|
||||||
else if (trayIsVisible && !trayShouldBeVisible)
|
else if (trayIsVisible && !trayShouldBeVisible)
|
||||||
@ -2441,7 +2402,7 @@ const MessageTray = new Lang.Class({
|
|||||||
_showNotification: function() {
|
_showNotification: function() {
|
||||||
this._notification = this._notificationQueue.shift();
|
this._notification = this._notificationQueue.shift();
|
||||||
|
|
||||||
this._userActiveWhileNotificationShown = this.idleMonitor.get_idletime() > IDLE_TIME;
|
this._userActiveWhileNotificationShown = this.idleMonitor.get_idletime() <= IDLE_TIME;
|
||||||
if (!this._userActiveWhileNotificationShown) {
|
if (!this._userActiveWhileNotificationShown) {
|
||||||
// If the user isn't active, set up a watch to let us know
|
// If the user isn't active, set up a watch to let us know
|
||||||
// when the user becomes active.
|
// when the user becomes active.
|
||||||
@ -2576,6 +2537,14 @@ const MessageTray = new Lang.Class({
|
|||||||
this._notificationUnfocusedId = 0;
|
this._notificationUnfocusedId = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this._useLongerTrayLeftTimeout = false;
|
||||||
|
if (this._trayLeftTimeoutId) {
|
||||||
|
Mainloop.source_remove(this._trayLeftTimeoutId);
|
||||||
|
this._trayLeftTimeoutId = 0;
|
||||||
|
this._trayLeftMouseX = -1;
|
||||||
|
this._trayLeftMouseY = -1;
|
||||||
|
}
|
||||||
|
|
||||||
if (this._notificationRemoved) {
|
if (this._notificationRemoved) {
|
||||||
Tweener.removeTweens(this._notificationWidget);
|
Tweener.removeTweens(this._notificationWidget);
|
||||||
this._notificationWidget.y = this.actor.height;
|
this._notificationWidget.y = this.actor.height;
|
||||||
@ -2606,7 +2575,11 @@ const MessageTray = new Lang.Class({
|
|||||||
this._notificationRemoved = false;
|
this._notificationRemoved = false;
|
||||||
this._closeButton.hide();
|
this._closeButton.hide();
|
||||||
this._pointerInTray = false;
|
this._pointerInTray = false;
|
||||||
this.actor.hover = false; // Clutter doesn't emit notify::hover when actors move
|
|
||||||
|
// Clutter will send a leave-event the next time the mouse
|
||||||
|
// moves, but we need to set this here now to update the
|
||||||
|
// state machine.
|
||||||
|
this.actor.hover = false;
|
||||||
this._notificationBin.child = null;
|
this._notificationBin.child = null;
|
||||||
this._notificationWidget.hide();
|
this._notificationWidget.hide();
|
||||||
},
|
},
|
||||||
@ -2619,10 +2592,9 @@ const MessageTray = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_expandNotification: function(autoExpanding) {
|
_expandNotification: function(autoExpanding) {
|
||||||
// Don't grab focus in notifications that are auto-expanded.
|
// Don't focus notifications that are auto-expanding.
|
||||||
if (!autoExpanding)
|
if (!autoExpanding)
|
||||||
this._grabHelper.grab({ actor: this._notification.actor,
|
this._ensureNotificationFocused();
|
||||||
grabFocus: true });
|
|
||||||
|
|
||||||
if (!this._notificationExpandedId)
|
if (!this._notificationExpandedId)
|
||||||
this._notificationExpandedId =
|
this._notificationExpandedId =
|
||||||
@ -2652,30 +2624,11 @@ const MessageTray = new Lang.Class({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
// We use this function to grab focus when the user moves the pointer
|
|
||||||
// to a notification with CRITICAL urgency that was already auto-expanded.
|
|
||||||
_ensureNotificationFocused: function() {
|
_ensureNotificationFocused: function() {
|
||||||
this._grabHelper.grab({ actor: this._notification.actor,
|
this._grabHelper.grab({ actor: this._notification.actor,
|
||||||
grabFocus: true });
|
grabFocus: true });
|
||||||
},
|
},
|
||||||
|
|
||||||
_showSummary: function() {
|
|
||||||
this._summary.opacity = 0;
|
|
||||||
this._tween(this._summary, '_summaryState', State.SHOWN,
|
|
||||||
{ opacity: 255,
|
|
||||||
time: ANIMATION_TIME,
|
|
||||||
transition: 'easeOutQuad',
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
_hideSummary: function() {
|
|
||||||
this._tween(this._summary, '_summaryState', State.HIDDEN,
|
|
||||||
{ opacity: 0,
|
|
||||||
time: ANIMATION_TIME,
|
|
||||||
transition: 'easeOutQuad',
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
_onSourceDoneDisplayingContent: function(source, closeTray) {
|
_onSourceDoneDisplayingContent: function(source, closeTray) {
|
||||||
if (closeTray) {
|
if (closeTray) {
|
||||||
this._escapeTray();
|
this._escapeTray();
|
||||||
@ -2719,7 +2672,6 @@ const MessageTray = new Lang.Class({
|
|||||||
this._grabHelper.grab({ actor: this._summaryBoxPointer.bin.child,
|
this._grabHelper.grab({ actor: this._summaryBoxPointer.bin.child,
|
||||||
grabFocus: true,
|
grabFocus: true,
|
||||||
onUngrab: Lang.bind(this, this._onSummaryBoxPointerUngrabbed) });
|
onUngrab: Lang.bind(this, this._onSummaryBoxPointerUngrabbed) });
|
||||||
this._lock();
|
|
||||||
|
|
||||||
this._summaryBoxPointer.actor.opacity = 0;
|
this._summaryBoxPointer.actor.opacity = 0;
|
||||||
this._summaryBoxPointer.actor.show();
|
this._summaryBoxPointer.actor.show();
|
||||||
@ -2754,10 +2706,8 @@ const MessageTray = new Lang.Class({
|
|||||||
this._clickedSummaryItem.actor.remove_style_pseudo_class('selected');
|
this._clickedSummaryItem.actor.remove_style_pseudo_class('selected');
|
||||||
this._clickedSummaryItem.actor.disconnect(this._clickedSummaryItemAllocationChangedId);
|
this._clickedSummaryItem.actor.disconnect(this._clickedSummaryItemAllocationChangedId);
|
||||||
this._summary.disconnect(this._summaryMotionId);
|
this._summary.disconnect(this._summaryMotionId);
|
||||||
Main.layoutManager.trayBox.disconnect(this._trayMotionId);
|
|
||||||
this._clickedSummaryItemAllocationChangedId = 0;
|
this._clickedSummaryItemAllocationChangedId = 0;
|
||||||
this._summaryMotionId = 0;
|
this._summaryMotionId = 0;
|
||||||
this._trayMotionId = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this._clickedSummaryItem = item;
|
this._clickedSummaryItem = item;
|
||||||
@ -2772,8 +2722,6 @@ const MessageTray = new Lang.Class({
|
|||||||
// _clickedSummaryItem.actor can change absolute position without changing allocation
|
// _clickedSummaryItem.actor can change absolute position without changing allocation
|
||||||
this._summaryMotionId = this._summary.connect('allocation-changed',
|
this._summaryMotionId = this._summary.connect('allocation-changed',
|
||||||
Lang.bind(this, this._adjustSummaryBoxPointerPosition));
|
Lang.bind(this, this._adjustSummaryBoxPointerPosition));
|
||||||
this._trayMotionId = Main.layoutManager.trayBox.connect('notify::anchor-y',
|
|
||||||
Lang.bind(this, this._adjustSummaryBoxPointerPosition));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -2810,8 +2758,6 @@ const MessageTray = new Lang.Class({
|
|||||||
this._sourceDoneDisplayingId = 0;
|
this._sourceDoneDisplayingId = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
this._unlock();
|
|
||||||
|
|
||||||
if (this._summaryBoxPointerItem.source.notifications.length == 0) {
|
if (this._summaryBoxPointerItem.source.notifications.length == 0) {
|
||||||
this._summaryBoxPointer.actor.hide();
|
this._summaryBoxPointer.actor.hide();
|
||||||
this._hideSummaryBoxPointerCompleted();
|
this._hideSummaryBoxPointerCompleted();
|
||||||
|
@ -38,13 +38,15 @@ const ModalDialog = new Lang.Class({
|
|||||||
styleClass: null,
|
styleClass: null,
|
||||||
parentActor: Main.uiGroup,
|
parentActor: Main.uiGroup,
|
||||||
keybindingMode: Shell.KeyBindingMode.SYSTEM_MODAL,
|
keybindingMode: Shell.KeyBindingMode.SYSTEM_MODAL,
|
||||||
shouldFadeIn: true });
|
shouldFadeIn: true,
|
||||||
|
destroyOnClose: true });
|
||||||
|
|
||||||
this.state = State.CLOSED;
|
this.state = State.CLOSED;
|
||||||
this._hasModal = false;
|
this._hasModal = false;
|
||||||
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._destroyOnClose = params.destroyOnClose;
|
||||||
|
|
||||||
this._group = new St.Widget({ visible: false,
|
this._group = new St.Widget({ visible: false,
|
||||||
x: 0,
|
x: 0,
|
||||||
@ -277,6 +279,9 @@ const ModalDialog = new Lang.Class({
|
|||||||
this.state = State.CLOSED;
|
this.state = State.CLOSED;
|
||||||
this._group.hide();
|
this._group.hide();
|
||||||
this.emit('closed');
|
this.emit('closed');
|
||||||
|
|
||||||
|
if (this._destroyOnClose)
|
||||||
|
this.destroy();
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
@ -244,7 +244,7 @@ const NotificationDaemon = new Lang.Class({
|
|||||||
Main.overview.connect('hidden',
|
Main.overview.connect('hidden',
|
||||||
Lang.bind(this, this._onFocusAppChanged));
|
Lang.bind(this, this._onFocusAppChanged));
|
||||||
|
|
||||||
this._trayManager.manage_stage(global.stage, Main.messageTray.actor);
|
this._trayManager.manage_screen(global.screen, Main.messageTray.actor);
|
||||||
},
|
},
|
||||||
|
|
||||||
_imageForNotificationData: function(hints) {
|
_imageForNotificationData: function(hints) {
|
||||||
|
@ -164,12 +164,12 @@ const OsdWindow = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_monitorsChanged: function() {
|
_monitorsChanged: function() {
|
||||||
/* assume 130x130 on a 640x480 display and scale from there */
|
/* assume 110x110 on a 640x480 display and scale from there */
|
||||||
let monitor = Main.layoutManager.primaryMonitor;
|
let monitor = Main.layoutManager.primaryMonitor;
|
||||||
let scalew = monitor.width / 640.0;
|
let scalew = monitor.width / 640.0;
|
||||||
let scaleh = monitor.height / 480.0;
|
let scaleh = monitor.height / 480.0;
|
||||||
let scale = Math.min(scalew, scaleh);
|
let scale = Math.min(scalew, scaleh);
|
||||||
let size = 130 * Math.max(1, scale);
|
let size = 110 * Math.max(1, scale);
|
||||||
|
|
||||||
this._box.set_size(size, size);
|
this._box.set_size(size, size);
|
||||||
this._box.translation_y = monitor.height / 4;
|
this._box.translation_y = monitor.height / 4;
|
||||||
|
@ -33,6 +33,8 @@ const SHADE_ANIMATION_TIME = .20;
|
|||||||
|
|
||||||
const DND_WINDOW_SWITCH_TIMEOUT = 1250;
|
const DND_WINDOW_SWITCH_TIMEOUT = 1250;
|
||||||
|
|
||||||
|
const OVERVIEW_ACTIVATION_TIMEOUT = 0.5;
|
||||||
|
|
||||||
const ShellInfo = new Lang.Class({
|
const ShellInfo = new Lang.Class({
|
||||||
Name: 'ShellInfo',
|
Name: 'ShellInfo',
|
||||||
|
|
||||||
@ -93,9 +95,7 @@ const Overview = new Lang.Class({
|
|||||||
_init: function() {
|
_init: function() {
|
||||||
this._overviewCreated = false;
|
this._overviewCreated = false;
|
||||||
this._initCalled = false;
|
this._initCalled = false;
|
||||||
this._controlPressed = false;
|
|
||||||
|
|
||||||
global.stage.connect('captured-event', Lang.bind(this, this._capturedEvent));
|
|
||||||
Main.sessionMode.connect('updated', Lang.bind(this, this._sessionUpdated));
|
Main.sessionMode.connect('updated', Lang.bind(this, this._sessionUpdated));
|
||||||
this._sessionUpdated();
|
this._sessionUpdated();
|
||||||
},
|
},
|
||||||
@ -146,9 +146,10 @@ const Overview = new Lang.Class({
|
|||||||
this._backgroundGroup.hide();
|
this._backgroundGroup.hide();
|
||||||
this._bgManagers = [];
|
this._bgManagers = [];
|
||||||
|
|
||||||
|
this._activationTime = 0;
|
||||||
|
|
||||||
this.visible = false; // animating to overview, in overview, animating out
|
this.visible = false; // animating to overview, in overview, animating out
|
||||||
this._shown = false; // show() and not hide()
|
this._shown = false; // show() and not hide()
|
||||||
this._shownTemporarily = false; // showTemporarily() and not hideTemporarily()
|
|
||||||
this._modal = false; // have a modal grab
|
this._modal = false; // have a modal grab
|
||||||
this.animationInProgress = false;
|
this.animationInProgress = false;
|
||||||
this.visibleTarget = false;
|
this.visibleTarget = false;
|
||||||
@ -238,20 +239,6 @@ const Overview = new Lang.Class({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_capturedEvent: function(actor, event) {
|
|
||||||
let type = event.type();
|
|
||||||
if (type != Clutter.EventType.KEY_PRESS &&
|
|
||||||
type != Clutter.EventType.KEY_RELEASE)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
let symbol = event.get_key_symbol();
|
|
||||||
if (symbol == Clutter.KEY_Control_L ||
|
|
||||||
symbol == Clutter.KEY_Control_R)
|
|
||||||
this._controlPressed = type == Clutter.EventType.KEY_PRESS;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
},
|
|
||||||
|
|
||||||
_sessionUpdated: function() {
|
_sessionUpdated: function() {
|
||||||
this.isDummy = !Main.sessionMode.hasOverview;
|
this.isDummy = !Main.sessionMode.hasOverview;
|
||||||
this._createOverview();
|
this._createOverview();
|
||||||
@ -346,18 +333,22 @@ const Overview = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_onDragBegin: function() {
|
_onDragBegin: function() {
|
||||||
|
this._inXdndDrag = true;
|
||||||
|
|
||||||
DND.addDragMonitor(this._dragMonitor);
|
DND.addDragMonitor(this._dragMonitor);
|
||||||
// Remember the workspace we started from
|
// Remember the workspace we started from
|
||||||
this._lastActiveWorkspaceIndex = global.screen.get_active_workspace_index();
|
this._lastActiveWorkspaceIndex = global.screen.get_active_workspace_index();
|
||||||
},
|
},
|
||||||
|
|
||||||
_onDragEnd: function(time) {
|
_onDragEnd: function(time) {
|
||||||
|
this._inXdndDrag = false;
|
||||||
|
|
||||||
// In case the drag was canceled while in the overview
|
// In case the drag was canceled while in the overview
|
||||||
// we have to go back to where we started and hide
|
// we have to go back to where we started and hide
|
||||||
// the overview
|
// the overview
|
||||||
if (this._shownTemporarily) {
|
if (this._shown) {
|
||||||
global.screen.get_workspace_by_index(this._lastActiveWorkspaceIndex).activate(time);
|
global.screen.get_workspace_by_index(this._lastActiveWorkspaceIndex).activate(time);
|
||||||
this.hideTemporarily();
|
this.hide();
|
||||||
}
|
}
|
||||||
this._resetWindowSwitchTimeout();
|
this._resetWindowSwitchTimeout();
|
||||||
this._lastHoveredWindow = null;
|
this._lastHoveredWindow = null;
|
||||||
@ -405,7 +396,7 @@ const Overview = new Lang.Class({
|
|||||||
this._needsFakePointerEvent = true;
|
this._needsFakePointerEvent = true;
|
||||||
Main.activateWindow(dragEvent.targetActor._delegate.metaWindow,
|
Main.activateWindow(dragEvent.targetActor._delegate.metaWindow,
|
||||||
this._windowSwitchTimestamp);
|
this._windowSwitchTimestamp);
|
||||||
this.hideTemporarily();
|
this.hide();
|
||||||
this._lastHoveredWindow = null;
|
this._lastHoveredWindow = null;
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
@ -501,9 +492,10 @@ const Overview = new Lang.Class({
|
|||||||
if (this._shown)
|
if (this._shown)
|
||||||
return;
|
return;
|
||||||
this._shown = true;
|
this._shown = true;
|
||||||
this._syncInputMode();
|
|
||||||
if (!this._modal)
|
if (!this._syncInputMode())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
this._animateVisible();
|
this._animateVisible();
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -536,6 +528,7 @@ const Overview = new Lang.Class({
|
|||||||
this.visible = true;
|
this.visible = true;
|
||||||
this.animationInProgress = true;
|
this.animationInProgress = true;
|
||||||
this.visibleTarget = true;
|
this.visibleTarget = true;
|
||||||
|
this._activationTime = Date.now() / 1000;
|
||||||
|
|
||||||
// All the the actors in the window group are completely obscured,
|
// All the the actors in the window group are completely obscured,
|
||||||
// hiding the group holding them while the Overview is displayed greatly
|
// hiding the group holding them while the Overview is displayed greatly
|
||||||
@ -547,8 +540,6 @@ const Overview = new Lang.Class({
|
|||||||
//
|
//
|
||||||
// Disable unredirection while in the overview
|
// Disable unredirection while in the overview
|
||||||
Meta.disable_unredirect_for_screen(global.screen);
|
Meta.disable_unredirect_for_screen(global.screen);
|
||||||
global.window_group.hide();
|
|
||||||
global.top_window_group.hide();
|
|
||||||
this._stack.show();
|
this._stack.show();
|
||||||
this._backgroundGroup.show();
|
this._backgroundGroup.show();
|
||||||
this._viewSelector.show();
|
this._viewSelector.show();
|
||||||
@ -568,24 +559,6 @@ const Overview = new Lang.Class({
|
|||||||
this.emit('showing');
|
this.emit('showing');
|
||||||
},
|
},
|
||||||
|
|
||||||
// showTemporarily:
|
|
||||||
//
|
|
||||||
// Animates the overview visible without grabbing mouse and keyboard input;
|
|
||||||
// if show() has already been called, this has no immediate effect, but
|
|
||||||
// will result in the overview not being hidden until hideTemporarily() is
|
|
||||||
// called.
|
|
||||||
showTemporarily: function() {
|
|
||||||
if (this.isDummy)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (this._shownTemporarily)
|
|
||||||
return;
|
|
||||||
|
|
||||||
this._syncInputMode();
|
|
||||||
this._animateVisible();
|
|
||||||
this._shownTemporarily = true;
|
|
||||||
},
|
|
||||||
|
|
||||||
// hide:
|
// hide:
|
||||||
//
|
//
|
||||||
// Reverses the effect of show()
|
// Reverses the effect of show()
|
||||||
@ -596,33 +569,22 @@ const Overview = new Lang.Class({
|
|||||||
if (!this._shown)
|
if (!this._shown)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (this._controlPressed)
|
let event = Clutter.get_current_event();
|
||||||
return;
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
if (!this._shownTemporarily)
|
this._animateNotVisible();
|
||||||
this._animateNotVisible();
|
|
||||||
|
|
||||||
this._shown = false;
|
this._shown = false;
|
||||||
this._syncInputMode();
|
this._syncInputMode();
|
||||||
},
|
},
|
||||||
|
|
||||||
// hideTemporarily:
|
|
||||||
//
|
|
||||||
// Reverses the effect of showTemporarily()
|
|
||||||
hideTemporarily: function() {
|
|
||||||
if (this.isDummy)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!this._shownTemporarily)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!this._shown)
|
|
||||||
this._animateNotVisible();
|
|
||||||
|
|
||||||
this._shownTemporarily = false;
|
|
||||||
this._syncInputMode();
|
|
||||||
},
|
|
||||||
|
|
||||||
toggle: function() {
|
toggle: function() {
|
||||||
if (this.isDummy)
|
if (this.isDummy)
|
||||||
return;
|
return;
|
||||||
@ -633,6 +595,20 @@ const Overview = new Lang.Class({
|
|||||||
this.show();
|
this.show();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// Checks if the Activities button is currently sensitive to
|
||||||
|
// clicks. The first call to this function within the
|
||||||
|
// OVERVIEW_ACTIVATION_TIMEOUT time of the hot corner being
|
||||||
|
// triggered will return false. This avoids opening and closing
|
||||||
|
// the overview if the user both triggered the hot corner and
|
||||||
|
// clicked the Activities button.
|
||||||
|
shouldToggleByCornerOrButton: function() {
|
||||||
|
if (this.animationInProgress)
|
||||||
|
return false;
|
||||||
|
if (this._activationTime == 0 || Date.now() / 1000 - this._activationTime > OVERVIEW_ACTIVATION_TIMEOUT)
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
|
||||||
//// Private methods ////
|
//// Private methods ////
|
||||||
|
|
||||||
_syncInputMode: function() {
|
_syncInputMode: function() {
|
||||||
@ -640,22 +616,23 @@ const Overview = new Lang.Class({
|
|||||||
// 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
|
||||||
// going to an application.
|
// going to an application.
|
||||||
if (this.animationInProgress)
|
if (this.animationInProgress)
|
||||||
return;
|
return true;
|
||||||
|
|
||||||
if (this._shown) {
|
if (this._shown) {
|
||||||
if (!this._modal) {
|
let shouldBeModal = !this._inXdndDrag;
|
||||||
if (Main.pushModal(this._overview,
|
if (shouldBeModal) {
|
||||||
{ keybindingMode: Shell.KeyBindingMode.OVERVIEW }))
|
if (!this._modal) {
|
||||||
this._modal = true;
|
if (Main.pushModal(this._overview,
|
||||||
else
|
{ keybindingMode: Shell.KeyBindingMode.OVERVIEW })) {
|
||||||
this.hide();
|
this._modal = true;
|
||||||
|
} else {
|
||||||
|
this.hide();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
global.stage_input_mode = Shell.StageInputMode.FULLSCREEN;
|
||||||
}
|
}
|
||||||
} else if (this._shownTemporarily) {
|
|
||||||
if (this._modal) {
|
|
||||||
Main.popModal(this._overview);
|
|
||||||
this._modal = false;
|
|
||||||
}
|
|
||||||
global.stage_input_mode = Shell.StageInputMode.FULLSCREEN;
|
|
||||||
} else {
|
} else {
|
||||||
if (this._modal) {
|
if (this._modal) {
|
||||||
Main.popModal(this._overview);
|
Main.popModal(this._overview);
|
||||||
@ -664,6 +641,7 @@ const Overview = new Lang.Class({
|
|||||||
else if (global.stage_input_mode == Shell.StageInputMode.FULLSCREEN)
|
else if (global.stage_input_mode == Shell.StageInputMode.FULLSCREEN)
|
||||||
global.stage_input_mode = Shell.StageInputMode.NORMAL;
|
global.stage_input_mode = Shell.StageInputMode.NORMAL;
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
},
|
},
|
||||||
|
|
||||||
_animateNotVisible: function() {
|
_animateNotVisible: function() {
|
||||||
@ -697,7 +675,7 @@ const Overview = new Lang.Class({
|
|||||||
|
|
||||||
this.emit('shown');
|
this.emit('shown');
|
||||||
// Handle any calls to hide* while we were showing
|
// Handle any calls to hide* while we were showing
|
||||||
if (!this._shown && !this._shownTemporarily)
|
if (!this._shown)
|
||||||
this._animateNotVisible();
|
this._animateNotVisible();
|
||||||
|
|
||||||
this._syncInputMode();
|
this._syncInputMode();
|
||||||
@ -708,9 +686,6 @@ const Overview = new Lang.Class({
|
|||||||
// Re-enable unredirection
|
// Re-enable unredirection
|
||||||
Meta.enable_unredirect_for_screen(global.screen);
|
Meta.enable_unredirect_for_screen(global.screen);
|
||||||
|
|
||||||
global.window_group.show();
|
|
||||||
global.top_window_group.show();
|
|
||||||
|
|
||||||
this._viewSelector.hide();
|
this._viewSelector.hide();
|
||||||
this._desktopFade.hide();
|
this._desktopFade.hide();
|
||||||
this._backgroundGroup.hide();
|
this._backgroundGroup.hide();
|
||||||
@ -723,7 +698,7 @@ const Overview = new Lang.Class({
|
|||||||
|
|
||||||
this.emit('hidden');
|
this.emit('hidden');
|
||||||
// Handle any calls to show* while we were hiding
|
// Handle any calls to show* while we were hiding
|
||||||
if (this._shown || this._shownTemporarily)
|
if (this._shown)
|
||||||
this._animateVisible();
|
this._animateVisible();
|
||||||
|
|
||||||
this._syncInputMode();
|
this._syncInputMode();
|
||||||
|
@ -452,9 +452,11 @@ const MessagesIndicator = new Lang.Class({
|
|||||||
|
|
||||||
_updateCount: function() {
|
_updateCount: function() {
|
||||||
let count = 0;
|
let count = 0;
|
||||||
|
let hasChats = false;
|
||||||
this._sources.forEach(Lang.bind(this,
|
this._sources.forEach(Lang.bind(this,
|
||||||
function(source) {
|
function(source) {
|
||||||
count += source.indicatorCount;
|
count += source.indicatorCount;
|
||||||
|
hasChats |= source.isChat;
|
||||||
}));
|
}));
|
||||||
|
|
||||||
this._count = count;
|
this._count = count;
|
||||||
@ -462,6 +464,7 @@ const MessagesIndicator = new Lang.Class({
|
|||||||
"%d new messages",
|
"%d new messages",
|
||||||
count).format(count);
|
count).format(count);
|
||||||
|
|
||||||
|
this._icon.visible = hasChats;
|
||||||
this._updateVisibility();
|
this._updateVisibility();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -18,7 +18,6 @@ const Atk = imports.gi.Atk;
|
|||||||
const Config = imports.misc.config;
|
const Config = imports.misc.config;
|
||||||
const CtrlAltTab = imports.ui.ctrlAltTab;
|
const CtrlAltTab = imports.ui.ctrlAltTab;
|
||||||
const DND = imports.ui.dnd;
|
const DND = imports.ui.dnd;
|
||||||
const Layout = imports.ui.layout;
|
|
||||||
const Overview = imports.ui.overview;
|
const Overview = imports.ui.overview;
|
||||||
const PopupMenu = imports.ui.popupMenu;
|
const PopupMenu = imports.ui.popupMenu;
|
||||||
const PanelMenu = imports.ui.panelMenu;
|
const PanelMenu = imports.ui.panelMenu;
|
||||||
@ -630,23 +629,15 @@ const ActivitiesButton = new Lang.Class({
|
|||||||
this.parent(0.0, null, true);
|
this.parent(0.0, null, true);
|
||||||
this.actor.accessible_role = Atk.Role.TOGGLE_BUTTON;
|
this.actor.accessible_role = Atk.Role.TOGGLE_BUTTON;
|
||||||
|
|
||||||
let container = new Shell.GenericContainer();
|
|
||||||
container.connect('get-preferred-width', Lang.bind(this, this._containerGetPreferredWidth));
|
|
||||||
container.connect('get-preferred-height', Lang.bind(this, this._containerGetPreferredHeight));
|
|
||||||
container.connect('allocate', Lang.bind(this, this._containerAllocate));
|
|
||||||
this.actor.add_actor(container);
|
|
||||||
this.actor.name = 'panelActivities';
|
this.actor.name = 'panelActivities';
|
||||||
|
|
||||||
/* 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". */
|
||||||
this._label = new St.Label({ text: _("Activities") });
|
this._label = new St.Label({ text: _("Activities") });
|
||||||
container.add_actor(this._label);
|
this.actor.add_actor(this._label);
|
||||||
|
|
||||||
this.actor.label_actor = this._label;
|
this.actor.label_actor = this._label;
|
||||||
|
|
||||||
this.hotCorner = new Layout.HotCorner(Main.layoutManager);
|
|
||||||
container.add_actor(this.hotCorner.actor);
|
|
||||||
|
|
||||||
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('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));
|
||||||
@ -661,44 +652,6 @@ const ActivitiesButton = new Lang.Class({
|
|||||||
}));
|
}));
|
||||||
|
|
||||||
this._xdndTimeOut = 0;
|
this._xdndTimeOut = 0;
|
||||||
|
|
||||||
// Since the hot corner uses stage coordinates, Clutter won't
|
|
||||||
// queue relayouts for us when the panel moves. Queue a relayout
|
|
||||||
// when that happens.
|
|
||||||
Main.layoutManager.connect('panel-box-changed', Lang.bind(this, function() {
|
|
||||||
container.queue_relayout();
|
|
||||||
}));
|
|
||||||
},
|
|
||||||
|
|
||||||
_containerGetPreferredWidth: function(actor, forHeight, alloc) {
|
|
||||||
[alloc.min_size, alloc.natural_size] = this._label.get_preferred_width(forHeight);
|
|
||||||
},
|
|
||||||
|
|
||||||
_containerGetPreferredHeight: function(actor, forWidth, alloc) {
|
|
||||||
[alloc.min_size, alloc.natural_size] = this._label.get_preferred_height(forWidth);
|
|
||||||
},
|
|
||||||
|
|
||||||
_containerAllocate: function(actor, box, flags) {
|
|
||||||
this._label.allocate(box, flags);
|
|
||||||
|
|
||||||
// The hot corner needs to be outside any padding/alignment
|
|
||||||
// that has been imposed on us
|
|
||||||
let primary = Main.layoutManager.primaryMonitor;
|
|
||||||
let hotBox = new Clutter.ActorBox();
|
|
||||||
let ok, x, y;
|
|
||||||
if (actor.get_text_direction() == Clutter.TextDirection.LTR) {
|
|
||||||
[ok, x, y] = actor.transform_stage_point(primary.x, primary.y)
|
|
||||||
} else {
|
|
||||||
[ok, x, y] = actor.transform_stage_point(primary.x + primary.width, primary.y);
|
|
||||||
// hotCorner.actor has northeast gravity, so we don't need
|
|
||||||
// to adjust x for its width
|
|
||||||
}
|
|
||||||
|
|
||||||
hotBox.x1 = Math.round(x);
|
|
||||||
hotBox.x2 = hotBox.x1 + this.hotCorner.actor.width;
|
|
||||||
hotBox.y1 = Math.round(y);
|
|
||||||
hotBox.y2 = hotBox.y1 + this.hotCorner.actor.height;
|
|
||||||
this.hotCorner.actor.allocate(hotBox, flags);
|
|
||||||
},
|
},
|
||||||
|
|
||||||
handleDragOver: function(source, actor, x, y, time) {
|
handleDragOver: function(source, actor, x, y, time) {
|
||||||
@ -708,14 +661,14 @@ const ActivitiesButton = new Lang.Class({
|
|||||||
if (this._xdndTimeOut != 0)
|
if (this._xdndTimeOut != 0)
|
||||||
Mainloop.source_remove(this._xdndTimeOut);
|
Mainloop.source_remove(this._xdndTimeOut);
|
||||||
this._xdndTimeOut = Mainloop.timeout_add(BUTTON_DND_ACTIVATION_TIMEOUT,
|
this._xdndTimeOut = Mainloop.timeout_add(BUTTON_DND_ACTIVATION_TIMEOUT,
|
||||||
Lang.bind(this, this._xdndShowOverview, actor));
|
Lang.bind(this, this._xdndToggleOverview, actor));
|
||||||
|
|
||||||
return DND.DragMotionResult.CONTINUE;
|
return DND.DragMotionResult.CONTINUE;
|
||||||
},
|
},
|
||||||
|
|
||||||
_onCapturedEvent: function(actor, event) {
|
_onCapturedEvent: function(actor, event) {
|
||||||
if (event.type() == Clutter.EventType.BUTTON_PRESS) {
|
if (event.type() == Clutter.EventType.BUTTON_PRESS) {
|
||||||
if (!this.hotCorner.shouldToggleOverviewOnClick())
|
if (!Main.overview.shouldToggleByCornerOrButton())
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@ -732,15 +685,12 @@ const ActivitiesButton = new Lang.Class({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_xdndShowOverview: function(actor) {
|
_xdndToggleOverview: function(actor) {
|
||||||
let [x, y, mask] = global.get_pointer();
|
let [x, y, mask] = global.get_pointer();
|
||||||
let pickedActor = global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE, x, y);
|
let pickedActor = global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE, x, y);
|
||||||
|
|
||||||
if (pickedActor == this.actor) {
|
if (pickedActor == this.actor && Main.overview.shouldToggleByCornerOrButton())
|
||||||
if (!Main.overview.visible && !Main.overview.animationInProgress) {
|
Main.overview.toggle();
|
||||||
Main.overview.showTemporarily();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Mainloop.source_remove(this._xdndTimeOut);
|
Mainloop.source_remove(this._xdndTimeOut);
|
||||||
this._xdndTimeOut = 0;
|
this._xdndTimeOut = 0;
|
||||||
|
@ -2086,7 +2086,7 @@ const PopupMenuManager = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
removeMenu: function(menu) {
|
removeMenu: function(menu) {
|
||||||
if (menu == this._activeMenu)
|
if (menu == this.activeMenu)
|
||||||
this._closeMenu(menu);
|
this._closeMenu(menu);
|
||||||
|
|
||||||
let position = this._findMenu(menu);
|
let position = this._findMenu(menu);
|
||||||
@ -2110,9 +2110,9 @@ const PopupMenuManager = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
get activeMenu() {
|
get activeMenu() {
|
||||||
let actor = this._grabHelper.currentGrab.actor;
|
let firstGrab = this._grabHelper.grabStack[0];
|
||||||
if (actor)
|
if (firstGrab)
|
||||||
return actor._delegate;
|
return firstGrab.actor._delegate;
|
||||||
else
|
else
|
||||||
return null;
|
return null;
|
||||||
},
|
},
|
||||||
|
@ -127,8 +127,6 @@ function remoteProvidersLoaded(loadState) {
|
|||||||
// Special case gnome-control-center to be always active and always first
|
// Special case gnome-control-center to be always active and always first
|
||||||
sortOrder.unshift('gnome-control-center.desktop');
|
sortOrder.unshift('gnome-control-center.desktop');
|
||||||
|
|
||||||
let numSorted = sortOrder.length;
|
|
||||||
|
|
||||||
loadState.loadedProviders.sort(
|
loadState.loadedProviders.sort(
|
||||||
function(providerA, providerB) {
|
function(providerA, providerB) {
|
||||||
let idxA, idxB;
|
let idxA, idxB;
|
||||||
@ -148,15 +146,6 @@ function remoteProvidersLoaded(loadState) {
|
|||||||
return GLib.utf8_collate(nameA, nameB);
|
return GLib.utf8_collate(nameA, nameB);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (numSorted > 1) {
|
|
||||||
// if providerA is the last, it goes after everything
|
|
||||||
if ((idxA + 1) == numSorted)
|
|
||||||
return 1;
|
|
||||||
// if providerB is the last, it goes after everything
|
|
||||||
else if ((idxB + 1) == numSorted)
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// if providerA isn't found, it's sorted after providerB
|
// if providerA isn't found, it's sorted after providerB
|
||||||
if (idxA == -1)
|
if (idxA == -1)
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -30,138 +30,6 @@ const EXEC_ARG_KEY = 'exec-arg';
|
|||||||
|
|
||||||
const DIALOG_GROW_TIME = 0.1;
|
const DIALOG_GROW_TIME = 0.1;
|
||||||
|
|
||||||
const CommandCompleter = new Lang.Class({
|
|
||||||
Name: 'CommandCompleter',
|
|
||||||
|
|
||||||
_init : function() {
|
|
||||||
this._changedCount = 0;
|
|
||||||
this._paths = GLib.getenv('PATH').split(':');
|
|
||||||
this._paths.push(GLib.get_home_dir());
|
|
||||||
this._valid = false;
|
|
||||||
this._updateInProgress = false;
|
|
||||||
this._childs = new Array(this._paths.length);
|
|
||||||
this._monitors = new Array(this._paths.length);
|
|
||||||
for (let i = 0; i < this._paths.length; i++) {
|
|
||||||
this._childs[i] = [];
|
|
||||||
let file = Gio.file_new_for_path(this._paths[i]);
|
|
||||||
let info;
|
|
||||||
try {
|
|
||||||
info = file.query_info(Gio.FILE_ATTRIBUTE_STANDARD_TYPE, Gio.FileQueryInfoFlags.NONE, null);
|
|
||||||
} catch (e) {
|
|
||||||
// FIXME catchall
|
|
||||||
this._paths[i] = null;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (info.get_attribute_uint32(Gio.FILE_ATTRIBUTE_STANDARD_TYPE) != Gio.FileType.DIRECTORY)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
this._paths[i] = file.get_path();
|
|
||||||
this._monitors[i] = file.monitor_directory(Gio.FileMonitorFlags.NONE, null);
|
|
||||||
if (this._monitors[i] != null) {
|
|
||||||
this._monitors[i].connect('changed', Lang.bind(this, this._onChanged));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this._paths = this._paths.filter(function(a) {
|
|
||||||
return a != null;
|
|
||||||
});
|
|
||||||
this._update(0);
|
|
||||||
},
|
|
||||||
|
|
||||||
update : function() {
|
|
||||||
if (this._valid)
|
|
||||||
return;
|
|
||||||
this._update(0);
|
|
||||||
},
|
|
||||||
|
|
||||||
_update : function(i) {
|
|
||||||
if (i == 0 && this._updateInProgress)
|
|
||||||
return;
|
|
||||||
this._updateInProgress = true;
|
|
||||||
this._changedCount = 0;
|
|
||||||
this._i = i;
|
|
||||||
if (i >= this._paths.length) {
|
|
||||||
this._valid = true;
|
|
||||||
this._updateInProgress = false;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
let file = Gio.file_new_for_path(this._paths[i]);
|
|
||||||
this._childs[this._i] = [];
|
|
||||||
FileUtils.listDirAsync(file, Lang.bind(this, function (files) {
|
|
||||||
for (let i = 0; i < files.length; i++) {
|
|
||||||
this._childs[this._i].push(files[i].get_name());
|
|
||||||
}
|
|
||||||
this._update(this._i + 1);
|
|
||||||
}));
|
|
||||||
},
|
|
||||||
|
|
||||||
_onChanged : function(m, f, of, type) {
|
|
||||||
if (!this._valid)
|
|
||||||
return;
|
|
||||||
let path = f.get_parent().get_path();
|
|
||||||
let k = undefined;
|
|
||||||
for (let i = 0; i < this._paths.length; i++) {
|
|
||||||
if (this._paths[i] == path)
|
|
||||||
k = i;
|
|
||||||
}
|
|
||||||
if (k === undefined) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (type == Gio.FileMonitorEvent.CREATED) {
|
|
||||||
this._childs[k].push(f.get_basename());
|
|
||||||
}
|
|
||||||
if (type == Gio.FileMonitorEvent.DELETED) {
|
|
||||||
this._changedCount++;
|
|
||||||
if (this._changedCount > MAX_FILE_DELETED_BEFORE_INVALID) {
|
|
||||||
this._valid = false;
|
|
||||||
}
|
|
||||||
let name = f.get_basename();
|
|
||||||
this._childs[k] = this._childs[k].filter(function(e) {
|
|
||||||
return e != name;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (type == Gio.FileMonitorEvent.UNMOUNTED) {
|
|
||||||
this._childs[k] = [];
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
getCompletion: function(text) {
|
|
||||||
let common = '';
|
|
||||||
let notInit = true;
|
|
||||||
if (!this._valid) {
|
|
||||||
this._update(0);
|
|
||||||
return common;
|
|
||||||
}
|
|
||||||
function _getCommon(s1, s2) {
|
|
||||||
let k = 0;
|
|
||||||
for (; k < s1.length && k < s2.length; k++) {
|
|
||||||
if (s1[k] != s2[k])
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (k == 0)
|
|
||||||
return '';
|
|
||||||
return s1.substr(0, k);
|
|
||||||
}
|
|
||||||
function _hasPrefix(s1, prefix) {
|
|
||||||
return s1.indexOf(prefix) == 0;
|
|
||||||
}
|
|
||||||
for (let i = 0; i < this._childs.length; i++) {
|
|
||||||
for (let k = 0; k < this._childs[i].length; k++) {
|
|
||||||
if (!_hasPrefix(this._childs[i][k], text))
|
|
||||||
continue;
|
|
||||||
if (notInit) {
|
|
||||||
common = this._childs[i][k];
|
|
||||||
notInit = false;
|
|
||||||
}
|
|
||||||
common = _getCommon(common, this._childs[i][k]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (common.length)
|
|
||||||
return common.substr(text.length);
|
|
||||||
return common;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
const RunDialog = new Lang.Class({
|
const RunDialog = new Lang.Class({
|
||||||
Name: 'RunDialog',
|
Name: 'RunDialog',
|
||||||
Extends: ModalDialog.ModalDialog,
|
Extends: ModalDialog.ModalDialog,
|
||||||
@ -242,8 +110,6 @@ const RunDialog = new Lang.Class({
|
|||||||
key: Clutter.Escape }]);
|
key: Clutter.Escape }]);
|
||||||
|
|
||||||
this._pathCompleter = new Gio.FilenameCompleter();
|
this._pathCompleter = new Gio.FilenameCompleter();
|
||||||
this._commandCompleter = new CommandCompleter();
|
|
||||||
this._group.connect('notify::visible', Lang.bind(this._commandCompleter, this._commandCompleter.update));
|
|
||||||
|
|
||||||
this._history = new History.HistoryManager({ gsettingsKey: HISTORY_KEY,
|
this._history = new History.HistoryManager({ gsettingsKey: HISTORY_KEY,
|
||||||
entry: this._entryText });
|
entry: this._entryText });
|
||||||
@ -259,18 +125,6 @@ const RunDialog = new Lang.Class({
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (symbol == Clutter.slash) {
|
|
||||||
// Need preload data before get completion. GFilenameCompleter load content of parent directory.
|
|
||||||
// Parent directory for /usr/include/ is /usr/. So need to add fake name('a').
|
|
||||||
let text = o.get_text().concat('/a');
|
|
||||||
let prefix;
|
|
||||||
if (text.lastIndexOf(' ') == -1)
|
|
||||||
prefix = text;
|
|
||||||
else
|
|
||||||
prefix = text.substr(text.lastIndexOf(' ') + 1);
|
|
||||||
this._getCompletion(prefix);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (symbol == Clutter.Tab) {
|
if (symbol == Clutter.Tab) {
|
||||||
let text = o.get_text();
|
let text = o.get_text();
|
||||||
let prefix;
|
let prefix;
|
||||||
@ -282,8 +136,6 @@ const RunDialog = new Lang.Class({
|
|||||||
if (postfix != null && postfix.length > 0) {
|
if (postfix != null && postfix.length > 0) {
|
||||||
o.insert_text(postfix, -1);
|
o.insert_text(postfix, -1);
|
||||||
o.set_cursor_position(text.length + postfix.length);
|
o.set_cursor_position(text.length + postfix.length);
|
||||||
if (postfix[postfix.length - 1] == '/')
|
|
||||||
this._getCompletion(text + postfix + 'a');
|
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -291,11 +143,53 @@ const RunDialog = new Lang.Class({
|
|||||||
}));
|
}));
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_getCommandCompletion: function(text) {
|
||||||
|
function _getCommon(s1, s2) {
|
||||||
|
if (s1 == null)
|
||||||
|
return s2;
|
||||||
|
|
||||||
|
let k = 0;
|
||||||
|
for (; k < s1.length && k < s2.length; k++) {
|
||||||
|
if (s1[k] != s2[k])
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (k == 0)
|
||||||
|
return '';
|
||||||
|
return s1.substr(0, k);
|
||||||
|
}
|
||||||
|
|
||||||
|
let paths = GLib.getenv('PATH').split(':');
|
||||||
|
paths.push(GLib.get_home_dir());
|
||||||
|
let someResults = paths.map(function(path) {
|
||||||
|
let results = [];
|
||||||
|
try {
|
||||||
|
let file = Gio.File.new_for_path(path);
|
||||||
|
let fileEnum = file.enumerate_children('standard::name', Gio.FileQueryInfoFlags.NONE, null);
|
||||||
|
let info;
|
||||||
|
while ((info = fileEnum.next_file(null))) {
|
||||||
|
let name = info.get_name();
|
||||||
|
if (name.slice(0, text.length) == text)
|
||||||
|
results.push(name);
|
||||||
|
}
|
||||||
|
} catch (e if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_FOUND) &&
|
||||||
|
!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_DIRECTORY))) {
|
||||||
|
log(e);
|
||||||
|
} finally {
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
let results = someResults.reduce(function(a, b) {
|
||||||
|
return a.concat(b);
|
||||||
|
}, []);
|
||||||
|
let common = results.reduce(_getCommon, null);
|
||||||
|
return common.substr(text.length);
|
||||||
|
},
|
||||||
|
|
||||||
_getCompletion : function(text) {
|
_getCompletion : function(text) {
|
||||||
if (text.indexOf('/') != -1) {
|
if (text.indexOf('/') != -1) {
|
||||||
return this._pathCompleter.get_completion_suffix(text);
|
return this._pathCompleter.get_completion_suffix(text);
|
||||||
} else {
|
} else {
|
||||||
return this._commandCompleter.getCompletion(text);
|
return this._getCommandCompletion(text);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -38,11 +38,7 @@ const ARROW_DRAG_THRESHOLD = 0.1;
|
|||||||
const N_ARROWS = 3;
|
const N_ARROWS = 3;
|
||||||
const ARROW_ANIMATION_TIME = 0.6;
|
const ARROW_ANIMATION_TIME = 0.6;
|
||||||
const ARROW_ANIMATION_PEAK_OPACITY = 0.4;
|
const ARROW_ANIMATION_PEAK_OPACITY = 0.4;
|
||||||
|
const ARROW_IDLE_TIME = 30000; // ms
|
||||||
// The distance in px that the lock screen will move to when pressing
|
|
||||||
// a key that has no effect in the lock screen (bumping it)
|
|
||||||
const BUMP_SIZE = 25;
|
|
||||||
const BUMP_TIME = 0.3;
|
|
||||||
|
|
||||||
const SUMMARY_ICON_SIZE = 48;
|
const SUMMARY_ICON_SIZE = 48;
|
||||||
|
|
||||||
@ -54,7 +50,7 @@ const SUMMARY_ICON_SIZE = 48;
|
|||||||
// - CURTAIN_SLIDE_TIME is used when raising the shield before unlocking
|
// - CURTAIN_SLIDE_TIME is used when raising the shield before unlocking
|
||||||
// - INITIAL_FADE_IN_TIME is used for the initial fade in at startup
|
// - INITIAL_FADE_IN_TIME is used for the initial fade in at startup
|
||||||
const STANDARD_FADE_TIME = 10;
|
const STANDARD_FADE_TIME = 10;
|
||||||
const MANUAL_FADE_TIME = 0.8;
|
const MANUAL_FADE_TIME = 0.3;
|
||||||
const BACKGROUND_FADE_TIME = 1.0;
|
const BACKGROUND_FADE_TIME = 1.0;
|
||||||
const CURTAIN_SLIDE_TIME = 0.3;
|
const CURTAIN_SLIDE_TIME = 0.3;
|
||||||
const INITIAL_FADE_IN_TIME = 0.25;
|
const INITIAL_FADE_IN_TIME = 0.25;
|
||||||
@ -435,8 +431,8 @@ const ScreenShield = new Lang.Class({
|
|||||||
name: 'lockScreenGroup',
|
name: 'lockScreenGroup',
|
||||||
visible: false,
|
visible: false,
|
||||||
});
|
});
|
||||||
this._lockScreenGroup.connect('key-release-event',
|
this._lockScreenGroup.connect('key-press-event',
|
||||||
Lang.bind(this, this._onLockScreenKeyRelease));
|
Lang.bind(this, this._onLockScreenKeyPress));
|
||||||
this._lockScreenGroup.connect('scroll-event',
|
this._lockScreenGroup.connect('scroll-event',
|
||||||
Lang.bind(this, this._onLockScreenScroll));
|
Lang.bind(this, this._onLockScreenScroll));
|
||||||
Main.ctrlAltTabManager.addGroup(this._lockScreenGroup, _("Lock"), 'changes-prevent-symbolic');
|
Main.ctrlAltTabManager.addGroup(this._lockScreenGroup, _("Lock"), 'changes-prevent-symbolic');
|
||||||
@ -456,6 +452,9 @@ const ScreenShield = new Lang.Class({
|
|||||||
this._updateBackgrounds();
|
this._updateBackgrounds();
|
||||||
Main.layoutManager.connect('monitors-changed', Lang.bind(this, this._updateBackgrounds));
|
Main.layoutManager.connect('monitors-changed', Lang.bind(this, this._updateBackgrounds));
|
||||||
|
|
||||||
|
this._arrowAnimationId = 0;
|
||||||
|
this._arrowWatchId = 0;
|
||||||
|
this._arrowActiveWatchId = 0;
|
||||||
this._arrowContainer = new St.BoxLayout({ style_class: 'screen-shield-arrows',
|
this._arrowContainer = new St.BoxLayout({ style_class: 'screen-shield-arrows',
|
||||||
vertical: true,
|
vertical: true,
|
||||||
x_align: Clutter.ActorAlign.CENTER,
|
x_align: Clutter.ActorAlign.CENTER,
|
||||||
@ -507,14 +506,18 @@ const ScreenShield = new Lang.Class({
|
|||||||
this._screenSaverDBus = new ShellDBus.ScreenSaverDBus(this);
|
this._screenSaverDBus = new ShellDBus.ScreenSaverDBus(this);
|
||||||
|
|
||||||
this._inhibitor = null;
|
this._inhibitor = null;
|
||||||
|
this._aboutToSuspend = false;
|
||||||
this._loginManager = LoginManager.getLoginManager();
|
this._loginManager = LoginManager.getLoginManager();
|
||||||
this._loginManager.connect('prepare-for-sleep',
|
this._loginManager.connect('prepare-for-sleep',
|
||||||
Lang.bind(this, this._prepareForSleep));
|
Lang.bind(this, this._prepareForSleep));
|
||||||
this._inhibitSuspend();
|
this._inhibitSuspend();
|
||||||
|
|
||||||
this._loginSession = this._loginManager.getCurrentSessionProxy();
|
this._loginManager.getCurrentSessionProxy(Lang.bind(this,
|
||||||
this._loginSession.connectSignal('Lock', Lang.bind(this, function() { this.lock(false); }));
|
function(sessionProxy) {
|
||||||
this._loginSession.connectSignal('Unlock', Lang.bind(this, function() { this.deactivate(false); }));
|
this._loginSession = sessionProxy;
|
||||||
|
this._loginSession.connectSignal('Lock', Lang.bind(this, function() { this.lock(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: SCREENSAVER_SCHEMA });
|
||||||
|
|
||||||
@ -547,9 +550,7 @@ const ScreenShield = new Lang.Class({
|
|||||||
|
|
||||||
let bgManager = new Background.BackgroundManager({ container: widget,
|
let bgManager = new Background.BackgroundManager({ container: widget,
|
||||||
monitorIndex: monitorIndex,
|
monitorIndex: monitorIndex,
|
||||||
effects: Meta.BackgroundEffects.BLUR | Meta.BackgroundEffects.DESATURATE,
|
|
||||||
controlPosition: false });
|
controlPosition: false });
|
||||||
bgManager.background.saturation = 0.6;
|
|
||||||
|
|
||||||
this._bgManagers.push(bgManager);
|
this._bgManagers.push(bgManager);
|
||||||
|
|
||||||
@ -590,28 +591,28 @@ const ScreenShield = new Lang.Class({
|
|||||||
return this._isModal;
|
return this._isModal;
|
||||||
},
|
},
|
||||||
|
|
||||||
_onLockScreenKeyRelease: function(actor, event) {
|
_onLockScreenKeyPress: function(actor, event) {
|
||||||
let symbol = event.get_key_symbol();
|
let symbol = event.get_key_symbol();
|
||||||
|
let unichar = event.get_key_unicode();
|
||||||
|
|
||||||
// Do nothing if the lock screen is not fully shown.
|
// Do nothing if the lock screen is not fully shown.
|
||||||
// This avoids reusing the previous (and stale) unlock
|
// This avoids reusing the previous (and stale) unlock
|
||||||
// dialog if esc is pressed while the curtain is going
|
// dialog if esc is pressed while the curtain is going
|
||||||
// down after cancel.
|
// down after cancel.
|
||||||
// Similarly, don't bump if the lock screen is not showing or is
|
|
||||||
// animating, as the bump overrides the animation and would
|
|
||||||
// remove any onComplete handler.
|
|
||||||
|
|
||||||
if (this._lockScreenState != MessageTray.State.SHOWN)
|
if (this._lockScreenState != MessageTray.State.SHOWN)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (symbol == Clutter.KEY_Escape ||
|
let isEnter = (symbol == Clutter.KEY_Return || symbol == Clutter.KEY_KP_Enter);
|
||||||
symbol == Clutter.KEY_Return ||
|
if (!isEnter && !(GLib.unichar_isprint(unichar) || symbol == Clutter.KEY_Escape))
|
||||||
symbol == Clutter.KEY_KP_Enter) {
|
return false;
|
||||||
this._liftShield(false, 0);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
this._bumpLockScreen();
|
this._ensureUnlockDialog(true, true);
|
||||||
|
|
||||||
|
if (GLib.unichar_isgraph(unichar))
|
||||||
|
this._dialog.addCharacter(unichar);
|
||||||
|
|
||||||
|
this._liftShield(true, 0);
|
||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -649,6 +650,8 @@ const ScreenShield = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_prepareForSleep: function(loginManager, aboutToSuspend) {
|
_prepareForSleep: function(loginManager, aboutToSuspend) {
|
||||||
|
this._aboutToSuspend = aboutToSuspend;
|
||||||
|
|
||||||
if (aboutToSuspend) {
|
if (aboutToSuspend) {
|
||||||
if (!this._settings.get_boolean(LOCK_ENABLED_KEY)) {
|
if (!this._settings.get_boolean(LOCK_ENABLED_KEY)) {
|
||||||
this._uninhibitSuspend();
|
this._uninhibitSuspend();
|
||||||
@ -849,21 +852,6 @@ const ScreenShield = new Lang.Class({
|
|||||||
this._hideLockScreen(false, 0);
|
this._hideLockScreen(false, 0);
|
||||||
},
|
},
|
||||||
|
|
||||||
_bumpLockScreen: function() {
|
|
||||||
Tweener.removeTweens(this._lockScreenGroup);
|
|
||||||
Tweener.addTween(this._lockScreenGroup,
|
|
||||||
{ y: -BUMP_SIZE,
|
|
||||||
time: BUMP_TIME / 2,
|
|
||||||
transition: 'easeOutQuad',
|
|
||||||
onComplete: function() {
|
|
||||||
Tweener.addTween(this,
|
|
||||||
{ y: 0,
|
|
||||||
time: BUMP_TIME / 2,
|
|
||||||
transition: 'easeInQuad' });
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
_hideLockScreenComplete: function() {
|
_hideLockScreenComplete: function() {
|
||||||
if (Main.sessionMode.currentMode == 'lock-screen')
|
if (Main.sessionMode.currentMode == 'lock-screen')
|
||||||
Main.sessionMode.popMode('lock-screen');
|
Main.sessionMode.popMode('lock-screen');
|
||||||
@ -917,14 +905,12 @@ const ScreenShield = new Lang.Class({
|
|||||||
|
|
||||||
|
|
||||||
let time = global.get_current_time();
|
let time = global.get_current_time();
|
||||||
this._dialog.connect('loaded', Lang.bind(this, function() {
|
if (!this._dialog.open(time, onPrimary)) {
|
||||||
if (!this._dialog.open(time, onPrimary)) {
|
// This is kind of an impossible error: we're already modal
|
||||||
// This is kind of an impossible error: we're already modal
|
// by the time we reach this...
|
||||||
// by the time we reach this...
|
log('Could not open login dialog: failed to acquire grab');
|
||||||
log('Could not open login dialog: failed to acquire grab');
|
this.deactivate(true);
|
||||||
this.deactivate(true);
|
}
|
||||||
}
|
|
||||||
}));
|
|
||||||
|
|
||||||
this._dialog.connect('failed', Lang.bind(this, this._onUnlockFailed));
|
this._dialog.connect('failed', Lang.bind(this, this._onUnlockFailed));
|
||||||
this._dialog.connect('unlocked', Lang.bind(this, this._onUnlockSucceded));
|
this._dialog.connect('unlocked', Lang.bind(this, this._onUnlockSucceded));
|
||||||
@ -990,16 +976,60 @@ const ScreenShield = new Lang.Class({
|
|||||||
Main.sessionMode.pushMode('lock-screen');
|
Main.sessionMode.pushMode('lock-screen');
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_startArrowAnimation: function() {
|
||||||
|
this._arrowActiveWatchId = 0;
|
||||||
|
|
||||||
|
if (!this._arrowAnimationId) {
|
||||||
|
this._arrowAnimationId = Mainloop.timeout_add(6000, Lang.bind(this, this._animateArrows));
|
||||||
|
this._animateArrows();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!this._arrowWatchId)
|
||||||
|
this._arrowWatchId = this.idleMonitor.add_idle_watch(ARROW_IDLE_TIME,
|
||||||
|
Lang.bind(this, this._pauseArrowAnimation));
|
||||||
|
},
|
||||||
|
|
||||||
|
_pauseArrowAnimation: function() {
|
||||||
|
if (this._arrowAnimationId) {
|
||||||
|
Mainloop.source_remove(this._arrowAnimationId);
|
||||||
|
this._arrowAnimationId = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!this._arrowActiveWatchId)
|
||||||
|
this._arrowActiveWatchId = this.idleMonitor.add_user_active_watch(Lang.bind(this, this._startArrowAnimation));
|
||||||
|
},
|
||||||
|
|
||||||
|
_stopArrowAnimation: function() {
|
||||||
|
if (this._arrowAnimationId) {
|
||||||
|
Mainloop.source_remove(this._arrowAnimationId);
|
||||||
|
this._arrowAnimationId = 0;
|
||||||
|
}
|
||||||
|
if (this._arrowActiveWatchId) {
|
||||||
|
this.idleMonitor.remove_watch(this._arrowActiveWatchId);
|
||||||
|
this._arrowActiveWatchId = 0;
|
||||||
|
}
|
||||||
|
if (this._arrowWatchId) {
|
||||||
|
this.idleMonitor.remove_watch(this._arrowWatchId);
|
||||||
|
this._arrowWatchId = 0;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_checkArrowAnimation: function() {
|
||||||
|
let idleTime = this.idleMonitor.get_idletime();
|
||||||
|
|
||||||
|
if (idleTime < ARROW_IDLE_TIME)
|
||||||
|
this._startArrowAnimation();
|
||||||
|
else
|
||||||
|
this._pauseArrowAnimation();
|
||||||
|
},
|
||||||
|
|
||||||
_lockScreenShown: function() {
|
_lockScreenShown: function() {
|
||||||
if (this._dialog && !this._isGreeter) {
|
if (this._dialog && !this._isGreeter) {
|
||||||
this._dialog.destroy();
|
this._dialog.destroy();
|
||||||
this._dialog = null;
|
this._dialog = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this._arrowAnimationId)
|
this._checkArrowAnimation();
|
||||||
Mainloop.source_remove(this._arrowAnimationId);
|
|
||||||
this._arrowAnimationId = Mainloop.timeout_add(6000, Lang.bind(this, this._animateArrows));
|
|
||||||
this._animateArrows();
|
|
||||||
|
|
||||||
let motionId = global.stage.connect('captured-event', function(stage, event) {
|
let motionId = global.stage.connect('captured-event', function(stage, event) {
|
||||||
if (event.type() == Clutter.EventType.MOTION) {
|
if (event.type() == Clutter.EventType.MOTION) {
|
||||||
@ -1021,7 +1051,8 @@ const ScreenShield = new Lang.Class({
|
|||||||
if (prevIsActive != this._isActive)
|
if (prevIsActive != this._isActive)
|
||||||
this.emit('active-changed');
|
this.emit('active-changed');
|
||||||
|
|
||||||
this._uninhibitSuspend();
|
if (this._aboutToSuspend)
|
||||||
|
this._uninhibitSuspend();
|
||||||
|
|
||||||
this.emit('lock-screen-shown');
|
this.emit('lock-screen-shown');
|
||||||
},
|
},
|
||||||
@ -1061,12 +1092,9 @@ const ScreenShield = new Lang.Class({
|
|||||||
this._notificationsBox = null;
|
this._notificationsBox = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
this._lockScreenContentsBox.destroy();
|
this._stopArrowAnimation();
|
||||||
|
|
||||||
if (this._arrowAnimationId) {
|
this._lockScreenContentsBox.destroy();
|
||||||
Mainloop.source_remove(this._arrowAnimationId);
|
|
||||||
this._arrowAnimationId = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
this._hasLockScreen = false;
|
this._hasLockScreen = false;
|
||||||
},
|
},
|
||||||
@ -1178,62 +1206,3 @@ const ScreenShield = new Lang.Class({
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
Signals.addSignalMethods(ScreenShield.prototype);
|
Signals.addSignalMethods(ScreenShield.prototype);
|
||||||
|
|
||||||
/* Fallback code to handle session locking using gnome-screensaver,
|
|
||||||
in case the required GDM dependency is not there
|
|
||||||
*/
|
|
||||||
const ScreenShieldFallback = new Lang.Class({
|
|
||||||
Name: 'ScreenShieldFallback',
|
|
||||||
|
|
||||||
_init: function() {
|
|
||||||
Util.spawn(['gnome-screensaver']);
|
|
||||||
|
|
||||||
this._proxy = new Gio.DBusProxy({ g_connection: Gio.DBus.session,
|
|
||||||
g_name: 'org.gnome.ScreenSaver',
|
|
||||||
g_object_path: '/org/gnome/ScreenSaver',
|
|
||||||
g_interface_name: 'org.gnome.ScreenSaver',
|
|
||||||
g_flags: (Gio.DBusProxyFlags.DO_NOT_AUTO_START |
|
|
||||||
Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES),
|
|
||||||
});
|
|
||||||
this._proxy.init(null);
|
|
||||||
|
|
||||||
this._proxy.connect('g-signal', Lang.bind(this, this._onSignal));
|
|
||||||
this._proxy.connect('notify::g-name-owner', Lang.bind(this, this._onNameOwnerChanged));
|
|
||||||
},
|
|
||||||
|
|
||||||
_onNameOwnerChanged: function(object, pspec) {
|
|
||||||
if (this._proxy.g_name_owner)
|
|
||||||
[this._locked] = this._proxy.call_sync('GetActive', null,
|
|
||||||
Gio.DBusCallFlags.NONE, -1, null).deep_unpack();
|
|
||||||
else
|
|
||||||
this._locked = false;
|
|
||||||
|
|
||||||
this.emit('active-changed', this._locked);
|
|
||||||
},
|
|
||||||
|
|
||||||
_onSignal: function(proxy, senderName, signalName, params) {
|
|
||||||
if (signalName == 'ActiveChanged') {
|
|
||||||
[this._locked] = params.deep_unpack();
|
|
||||||
this.emit('active-changed', this._locked);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
get locked() {
|
|
||||||
return this._locked;
|
|
||||||
},
|
|
||||||
|
|
||||||
lock: function() {
|
|
||||||
this._proxy.call('Lock', null, Gio.DBusCallFlags.NONE, -1, null,
|
|
||||||
Lang.bind(this, function(proxy, result) {
|
|
||||||
proxy.call_finish(result);
|
|
||||||
|
|
||||||
this.emit('lock-screen-shown');
|
|
||||||
}));
|
|
||||||
},
|
|
||||||
|
|
||||||
unlock: function() {
|
|
||||||
this._proxy.call('SetActive', GLib.Variant.new('(b)', false),
|
|
||||||
Gio.DBusCallFlags.NONE, -1, null, null);
|
|
||||||
},
|
|
||||||
});
|
|
||||||
Signals.addSignalMethods(ScreenShieldFallback.prototype);
|
|
||||||
|
@ -4,6 +4,7 @@ const Clutter = imports.gi.Clutter;
|
|||||||
const Lang = imports.lang;
|
const Lang = imports.lang;
|
||||||
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 St = imports.gi.St;
|
const St = imports.gi.St;
|
||||||
const Atk = imports.gi.Atk;
|
const Atk = imports.gi.Atk;
|
||||||
|
|
||||||
@ -13,6 +14,7 @@ const Main = imports.ui.main;
|
|||||||
const Overview = imports.ui.overview;
|
const Overview = imports.ui.overview;
|
||||||
const Separator = imports.ui.separator;
|
const Separator = imports.ui.separator;
|
||||||
const Search = imports.ui.search;
|
const Search = imports.ui.search;
|
||||||
|
const Util = imports.misc.util;
|
||||||
|
|
||||||
const MAX_LIST_SEARCH_RESULTS_ROWS = 3;
|
const MAX_LIST_SEARCH_RESULTS_ROWS = 3;
|
||||||
const MAX_GRID_SEARCH_RESULTS_ROWS = 1;
|
const MAX_GRID_SEARCH_RESULTS_ROWS = 1;
|
||||||
@ -102,6 +104,7 @@ const ListSearchResult = new Lang.Class({
|
|||||||
y_fill: false,
|
y_fill: false,
|
||||||
x_align: St.Align.START,
|
x_align: St.Align.START,
|
||||||
y_align: St.Align.START });
|
y_align: St.Align.START });
|
||||||
|
this.actor.label_actor = title;
|
||||||
|
|
||||||
if (this.metaInfo['description']) {
|
if (this.metaInfo['description']) {
|
||||||
let description = new St.Label({ style_class: 'list-search-result-description' });
|
let description = new St.Label({ style_class: 'list-search-result-description' });
|
||||||
@ -139,6 +142,7 @@ const GridSearchResult = new Lang.Class({
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.actor.set_child(content);
|
this.actor.set_child(content);
|
||||||
|
this.actor.label_actor = content.label_actor;
|
||||||
|
|
||||||
let draggable = DND.makeDraggable(this.actor);
|
let draggable = DND.makeDraggable(this.actor);
|
||||||
draggable.connect('drag-begin',
|
draggable.connect('drag-begin',
|
||||||
@ -227,9 +231,14 @@ const ListSearchResults = new Lang.Class({
|
|||||||
this._pendingClear = true;
|
this._pendingClear = true;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_keyFocusIn: function(icon) {
|
||||||
|
this.emit('key-focus-in', icon);
|
||||||
|
},
|
||||||
|
|
||||||
renderResults: function(metas) {
|
renderResults: function(metas) {
|
||||||
for (let i = 0; i < metas.length; i++) {
|
for (let i = 0; i < metas.length; i++) {
|
||||||
let display = new ListSearchResult(this.provider, metas[i], this._terms);
|
let display = new ListSearchResult(this.provider, metas[i], this._terms);
|
||||||
|
display.actor.connect('key-focus-in', Lang.bind(this, this._keyFocusIn));
|
||||||
this._content.add_actor(display.actor);
|
this._content.add_actor(display.actor);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -246,6 +255,7 @@ const ListSearchResults = new Lang.Class({
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
Signals.addSignalMethods(ListSearchResults.prototype);
|
||||||
|
|
||||||
const GridSearchResults = new Lang.Class({
|
const GridSearchResults = new Lang.Class({
|
||||||
Name: 'GridSearchResults',
|
Name: 'GridSearchResults',
|
||||||
@ -288,9 +298,14 @@ const GridSearchResults = new Lang.Class({
|
|||||||
this._pendingClear = true;
|
this._pendingClear = true;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_keyFocusIn: function(icon) {
|
||||||
|
this.emit('key-focus-in', icon);
|
||||||
|
},
|
||||||
|
|
||||||
renderResults: function(metas) {
|
renderResults: function(metas) {
|
||||||
for (let i = 0; i < metas.length; i++) {
|
for (let i = 0; i < metas.length; i++) {
|
||||||
let display = new GridSearchResult(this.provider, metas[i], this._terms);
|
let display = new GridSearchResult(this.provider, metas[i], this._terms);
|
||||||
|
display.actor.connect('key-focus-in', Lang.bind(this, this._keyFocusIn));
|
||||||
this._grid.addItem(display.actor);
|
this._grid.addItem(display.actor);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -307,6 +322,7 @@ const GridSearchResults = new Lang.Class({
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
Signals.addSignalMethods(GridSearchResults.prototype);
|
||||||
|
|
||||||
const SearchResults = new Lang.Class({
|
const SearchResults = new Lang.Class({
|
||||||
Name: 'SearchResults',
|
Name: 'SearchResults',
|
||||||
@ -366,6 +382,10 @@ const SearchResults = new Lang.Class({
|
|||||||
return false;
|
return false;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_keyFocusIn: function(provider, icon) {
|
||||||
|
Util.ensureActorVisibleInScrollView(this._scrollView, icon);
|
||||||
|
},
|
||||||
|
|
||||||
createProviderMeta: function(provider) {
|
createProviderMeta: function(provider) {
|
||||||
let providerBox = new St.BoxLayout({ style_class: 'search-section',
|
let providerBox = new St.BoxLayout({ style_class: 'search-section',
|
||||||
vertical: true });
|
vertical: true });
|
||||||
@ -379,6 +399,8 @@ const SearchResults = new Lang.Class({
|
|||||||
resultDisplay = new GridSearchResults(provider);
|
resultDisplay = new GridSearchResults(provider);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
resultDisplay.connect('key-focus-in', Lang.bind(this, this._keyFocusIn));
|
||||||
|
|
||||||
let resultDisplayBin = new St.Bin({ child: resultDisplay.actor,
|
let resultDisplayBin = new St.Bin({ child: resultDisplay.actor,
|
||||||
x_fill: true,
|
x_fill: true,
|
||||||
y_fill: true });
|
y_fill: true });
|
||||||
@ -557,6 +579,7 @@ const ProviderIcon = new Lang.Class({
|
|||||||
this.parent({ style_class: 'search-provider-icon',
|
this.parent({ style_class: 'search-provider-icon',
|
||||||
reactive: true,
|
reactive: true,
|
||||||
can_focus: true,
|
can_focus: true,
|
||||||
|
accessible_name: provider.appInfo.get_name(),
|
||||||
track_hover: true });
|
track_hover: true });
|
||||||
|
|
||||||
this._content = new St.Widget({ layout_manager: new Clutter.BinLayout() });
|
this._content = new St.Widget({ layout_manager: new Clutter.BinLayout() });
|
||||||
|
@ -79,12 +79,13 @@ const _modes = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
'initial-setup': {
|
'initial-setup': {
|
||||||
|
hasWindows: true,
|
||||||
isPrimary: true,
|
isPrimary: true,
|
||||||
components: ['keyring'],
|
components: ['keyring'],
|
||||||
panel: {
|
panel: {
|
||||||
left: [],
|
left: [],
|
||||||
center: ['dateMenu'],
|
center: ['dateMenu'],
|
||||||
right: ['a11yGreeter', 'keyboard', 'volume']
|
right: ['a11yGreeter', 'keyboard', 'volume', 'battery']
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -158,12 +159,7 @@ function listModes() {
|
|||||||
const SessionMode = new Lang.Class({
|
const SessionMode = new Lang.Class({
|
||||||
Name: 'SessionMode',
|
Name: 'SessionMode',
|
||||||
|
|
||||||
_init: function() {
|
init: function() {
|
||||||
global.connect('notify::session-mode', Lang.bind(this, this._sync));
|
|
||||||
this._modes = _modes;
|
|
||||||
this._modeStack = [DEFAULT_MODE];
|
|
||||||
this._sync();
|
|
||||||
|
|
||||||
_getModes(Lang.bind(this, function(modes) {
|
_getModes(Lang.bind(this, function(modes) {
|
||||||
this._modes = modes;
|
this._modes = modes;
|
||||||
let primary = modes[global.session_mode] &&
|
let primary = modes[global.session_mode] &&
|
||||||
@ -171,6 +167,8 @@ const SessionMode = new Lang.Class({
|
|||||||
let mode = primary ? global.session_mode : 'user';
|
let mode = primary ? global.session_mode : 'user';
|
||||||
this._modeStack = [mode];
|
this._modeStack = [mode];
|
||||||
this._sync();
|
this._sync();
|
||||||
|
|
||||||
|
this.emit('sessions-loaded');
|
||||||
}));
|
}));
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -397,7 +397,7 @@ const ScreenSaverDBus = new Lang.Class({
|
|||||||
if (active)
|
if (active)
|
||||||
this._screenShield.activate(true);
|
this._screenShield.activate(true);
|
||||||
else
|
else
|
||||||
this._screenShield.unlock(false);
|
this._screenShield.deactivate(false);
|
||||||
},
|
},
|
||||||
|
|
||||||
GetActive: function() {
|
GetActive: function() {
|
||||||
|
@ -171,4 +171,10 @@ function addContextMenu(entry, params) {
|
|||||||
entry.connect('button-press-event', Lang.bind(null, _onButtonPressEvent, entry));
|
entry.connect('button-press-event', Lang.bind(null, _onButtonPressEvent, entry));
|
||||||
|
|
||||||
entry.connect('popup-menu', Lang.bind(null, _onPopup, entry));
|
entry.connect('popup-menu', Lang.bind(null, _onPopup, entry));
|
||||||
|
|
||||||
|
entry.connect('destroy', function() {
|
||||||
|
entry.menu.destroy();
|
||||||
|
entry.menu = null;
|
||||||
|
entry._menuManager = null;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
@ -33,6 +33,36 @@ const KEY_INPUT_SOURCES = 'sources';
|
|||||||
const INPUT_SOURCE_TYPE_XKB = 'xkb';
|
const INPUT_SOURCE_TYPE_XKB = 'xkb';
|
||||||
const INPUT_SOURCE_TYPE_IBUS = 'ibus';
|
const INPUT_SOURCE_TYPE_IBUS = 'ibus';
|
||||||
|
|
||||||
|
// This is longest we'll keep the keyboard frozen until an input
|
||||||
|
// source is active.
|
||||||
|
const MAX_INPUT_SOURCE_ACTIVATION_TIME = 2000; // ms
|
||||||
|
|
||||||
|
const BUS_NAME = 'org.gnome.SettingsDaemon.Keyboard';
|
||||||
|
const OBJECT_PATH = '/org/gnome/SettingsDaemon/Keyboard';
|
||||||
|
|
||||||
|
const KeyboardManagerInterface =
|
||||||
|
<interface name="org.gnome.SettingsDaemon.Keyboard">
|
||||||
|
<method name="SetInputSource">
|
||||||
|
<arg type="u" direction="in" />
|
||||||
|
</method>
|
||||||
|
</interface>;
|
||||||
|
|
||||||
|
const KeyboardManagerProxy = Gio.DBusProxy.makeProxyWrapper(KeyboardManagerInterface);
|
||||||
|
|
||||||
|
function releaseKeyboard() {
|
||||||
|
if (Main.modalCount > 0)
|
||||||
|
global.display.unfreeze_keyboard(global.get_current_time());
|
||||||
|
else
|
||||||
|
global.display.ungrab_keyboard(global.get_current_time());
|
||||||
|
}
|
||||||
|
|
||||||
|
function holdKeyboard() {
|
||||||
|
if (Main.modalCount > 0)
|
||||||
|
global.display.freeze_keyboard(global.get_current_time());
|
||||||
|
else
|
||||||
|
global.display.grab_keyboard(global.get_current_time());
|
||||||
|
}
|
||||||
|
|
||||||
const IBusManager = new Lang.Class({
|
const IBusManager = new Lang.Class({
|
||||||
Name: 'IBusManager',
|
Name: 'IBusManager',
|
||||||
|
|
||||||
@ -230,6 +260,7 @@ const InputSource = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
activate: function() {
|
activate: function() {
|
||||||
|
holdKeyboard();
|
||||||
this.emit('activate');
|
this.emit('activate');
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
@ -262,11 +293,11 @@ const InputSourcePopup = new Lang.Class({
|
|||||||
this._select(this._selectedIndex);
|
this._select(this._selectedIndex);
|
||||||
},
|
},
|
||||||
|
|
||||||
_keyPressHandler: function(keysym, backwards, action) {
|
_keyPressHandler: function(keysym, _ignored, 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)
|
||||||
@ -336,14 +367,13 @@ const InputSourceIndicator = new Lang.Class({
|
|||||||
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: "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: "org.gnome.desktop.wm.keybindings" }),
|
||||||
Meta.KeyBindingFlags.REVERSES |
|
Meta.KeyBindingFlags.NONE,
|
||||||
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: DESKTOP_INPUT_SOURCES_SCHEMA });
|
||||||
@ -364,6 +394,13 @@ const InputSourceIndicator = new Lang.Class({
|
|||||||
this._ibusManager.connect('property-updated', Lang.bind(this, this._ibusPropertyUpdated));
|
this._ibusManager.connect('property-updated', Lang.bind(this, this._ibusPropertyUpdated));
|
||||||
this._inputSourcesChanged();
|
this._inputSourcesChanged();
|
||||||
|
|
||||||
|
this._keyboardManager = new KeyboardManagerProxy(Gio.DBus.session, BUS_NAME, OBJECT_PATH,
|
||||||
|
function(proxy, error) {
|
||||||
|
if (error)
|
||||||
|
log(error.message);
|
||||||
|
});
|
||||||
|
global.display.connect('modifiers-accelerator-activated', Lang.bind(this, this._modifiersSwitcher));
|
||||||
|
|
||||||
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
||||||
this._showLayoutItem = this.menu.addAction(_("Show Keyboard Layout"), Lang.bind(this, this._showLayout));
|
this._showLayoutItem = this.menu.addAction(_("Show Keyboard Layout"), Lang.bind(this, this._showLayout));
|
||||||
|
|
||||||
@ -397,13 +434,44 @@ const InputSourceIndicator = new Lang.Class({
|
|||||||
this._inputSourcesChanged();
|
this._inputSourcesChanged();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_modifiersSwitcher: function() {
|
||||||
|
let sourceIndexes = Object.keys(this._inputSources);
|
||||||
|
if (sourceIndexes.length == 0) {
|
||||||
|
releaseKeyboard();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let is = this._currentSource;
|
||||||
|
if (!is)
|
||||||
|
is = this._inputSources[sourceIndexes[0]];
|
||||||
|
|
||||||
|
let nextIndex = is.index + 1;
|
||||||
|
if (nextIndex > sourceIndexes[sourceIndexes.length - 1])
|
||||||
|
nextIndex = 0;
|
||||||
|
|
||||||
|
while (!(is = this._inputSources[nextIndex]))
|
||||||
|
nextIndex += 1;
|
||||||
|
|
||||||
|
is.activate();
|
||||||
|
},
|
||||||
|
|
||||||
_switchInputSource: function(display, screen, window, binding) {
|
_switchInputSource: function(display, screen, window, binding) {
|
||||||
if (this._mruSources.length < 2)
|
if (this._mruSources.length < 2)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
// HACK: Fall back on simple input source switching since we
|
||||||
|
// can't show a popup switcher while the message tray is up
|
||||||
|
// without considerable work to consolidate the usage of
|
||||||
|
// pushModal/popModal and grabHelper. See
|
||||||
|
// https://bugzilla.gnome.org/show_bug.cgi?id=695143 .
|
||||||
|
if (Main.keybindingMode == Shell.KeyBindingMode.MESSAGE_TRAY) {
|
||||||
|
this._modifiersSwitcher();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
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;
|
let backwards = false; // Not using this
|
||||||
if (!popup.show(backwards, binding.get_name(), binding.get_mask()))
|
if (!popup.show(backwards, binding.get_name(), binding.get_mask()))
|
||||||
popup.destroy();
|
popup.destroy();
|
||||||
},
|
},
|
||||||
@ -416,6 +484,11 @@ const InputSourceIndicator = new Lang.Class({
|
|||||||
let oldSource;
|
let oldSource;
|
||||||
[oldSource, this._currentSource] = [this._currentSource, newSource];
|
[oldSource, this._currentSource] = [this._currentSource, newSource];
|
||||||
|
|
||||||
|
if (oldSource) {
|
||||||
|
oldSource.menuItem.setShowDot(false);
|
||||||
|
oldSource.indicatorLabel.hide();
|
||||||
|
}
|
||||||
|
|
||||||
if (!newSource || (nVisibleSources < 2 && !newSource.properties)) {
|
if (!newSource || (nVisibleSources < 2 && !newSource.properties)) {
|
||||||
// This source index might be invalid if we weren't able
|
// This source index might be invalid if we weren't able
|
||||||
// to build a menu item for it, so we hide ourselves since
|
// to build a menu item for it, so we hide ourselves since
|
||||||
@ -430,11 +503,6 @@ const InputSourceIndicator = new Lang.Class({
|
|||||||
|
|
||||||
this.actor.show();
|
this.actor.show();
|
||||||
|
|
||||||
if (oldSource) {
|
|
||||||
oldSource.menuItem.setShowDot(false);
|
|
||||||
oldSource.indicatorLabel.hide();
|
|
||||||
}
|
|
||||||
|
|
||||||
newSource.menuItem.setShowDot(true);
|
newSource.menuItem.setShowDot(true);
|
||||||
newSource.indicatorLabel.show();
|
newSource.indicatorLabel.show();
|
||||||
|
|
||||||
@ -487,10 +555,10 @@ const InputSourceIndicator = new Lang.Class({
|
|||||||
let is = new InputSource(type, id, displayName, shortName, i);
|
let is = new InputSource(type, id, displayName, shortName, i);
|
||||||
|
|
||||||
is.connect('activate', Lang.bind(this, function() {
|
is.connect('activate', Lang.bind(this, function() {
|
||||||
if (this._currentSource.index == is.index)
|
let inVariant = new GLib.Variant('(u)', [is.index]);
|
||||||
return;
|
this._keyboardManager.call('SetInputSource', inVariant, 0,
|
||||||
this._settings.set_value(KEY_CURRENT_INPUT_SOURCE,
|
MAX_INPUT_SOURCE_ACTIVATION_TIME,
|
||||||
GLib.Variant.new_uint32(is.index));
|
null, releaseKeyboard);
|
||||||
}));
|
}));
|
||||||
|
|
||||||
if (!(is.shortName in inputSourcesByShortName))
|
if (!(is.shortName in inputSourcesByShortName))
|
||||||
@ -703,7 +771,7 @@ const InputSourceIndicator = new Lang.Class({
|
|||||||
item.prop = prop;
|
item.prop = prop;
|
||||||
item.connect('activate', Lang.bind(this, function() {
|
item.connect('activate', Lang.bind(this, function() {
|
||||||
this._ibusManager.activateProperty(item.prop.get_key(),
|
this._ibusManager.activateProperty(item.prop.get_key(),
|
||||||
IBus.PropState.CHECKED);
|
item.prop.get_state());
|
||||||
}));
|
}));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -27,35 +27,6 @@ const LoginDialog = imports.gdm.loginDialog;
|
|||||||
// The timeout before going back automatically to the lock screen (in seconds)
|
// The timeout before going back automatically to the lock screen (in seconds)
|
||||||
const IDLE_TIMEOUT = 2 * 60;
|
const IDLE_TIMEOUT = 2 * 60;
|
||||||
|
|
||||||
function versionCompare(required, reference) {
|
|
||||||
required = required.split('.');
|
|
||||||
reference = reference.split('.');
|
|
||||||
|
|
||||||
for (let i = 0; i < required.length; i++) {
|
|
||||||
if (required[i] != reference[i])
|
|
||||||
return required[i] < reference[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
function isSupported() {
|
|
||||||
try {
|
|
||||||
let params = GLib.Variant.new('(ss)', ['org.gnome.DisplayManager.Manager', 'Version']);
|
|
||||||
let result = Gio.DBus.system.call_sync('org.gnome.DisplayManager',
|
|
||||||
'/org/gnome/DisplayManager/Manager',
|
|
||||||
'org.freedesktop.DBus.Properties',
|
|
||||||
'Get', params, null,
|
|
||||||
Gio.DBusCallFlags.NONE,
|
|
||||||
-1, null);
|
|
||||||
|
|
||||||
let version = result.deep_unpack()[0].deep_unpack();
|
|
||||||
return versionCompare('3.5.91', version);
|
|
||||||
} catch(e) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const UnlockDialog = new Lang.Class({
|
const UnlockDialog = new Lang.Class({
|
||||||
Name: 'UnlockDialog',
|
Name: 'UnlockDialog',
|
||||||
Extends: ModalDialog.ModalDialog,
|
Extends: ModalDialog.ModalDialog,
|
||||||
@ -76,6 +47,7 @@ const UnlockDialog = new Lang.Class({
|
|||||||
|
|
||||||
this._greeterClient = new Gdm.Client();
|
this._greeterClient = new Gdm.Client();
|
||||||
this._userVerifier = new GdmUtil.ShellUserVerifier(this._greeterClient, { reauthenticationOnly: true });
|
this._userVerifier = new GdmUtil.ShellUserVerifier(this._greeterClient, { reauthenticationOnly: true });
|
||||||
|
this._userVerified = false;
|
||||||
|
|
||||||
this._userVerifier.connect('ask-question', Lang.bind(this, this._onAskQuestion));
|
this._userVerifier.connect('ask-question', Lang.bind(this, this._onAskQuestion));
|
||||||
this._userVerifier.connect('show-message', Lang.bind(this, this._showMessage));
|
this._userVerifier.connect('show-message', Lang.bind(this, this._showMessage));
|
||||||
@ -98,6 +70,7 @@ const UnlockDialog = new Lang.Class({
|
|||||||
|
|
||||||
this._promptEntry = new St.Entry({ style_class: 'login-dialog-prompt-entry',
|
this._promptEntry = new St.Entry({ style_class: 'login-dialog-prompt-entry',
|
||||||
can_focus: true });
|
can_focus: true });
|
||||||
|
this._promptEntry.clutter_text.connect('activate', Lang.bind(this, this._doUnlock));
|
||||||
this._promptEntry.clutter_text.set_password_char('\u25cf');
|
this._promptEntry.clutter_text.set_password_char('\u25cf');
|
||||||
ShellEntry.addContextMenu(this._promptEntry, { isPassword: true });
|
ShellEntry.addContextMenu(this._promptEntry, { isPassword: true });
|
||||||
this.setInitialKeyFocus(this._promptEntry);
|
this.setInitialKeyFocus(this._promptEntry);
|
||||||
@ -169,11 +142,6 @@ const UnlockDialog = new Lang.Class({
|
|||||||
let batch = new Batch.Hold();
|
let batch = new Batch.Hold();
|
||||||
this._userVerifier.begin(this._userName, batch);
|
this._userVerifier.begin(this._userName, batch);
|
||||||
|
|
||||||
GLib.idle_add(GLib.PRIORITY_DEFAULT, Lang.bind(this, function() {
|
|
||||||
this.emit('loaded');
|
|
||||||
return false;
|
|
||||||
}));
|
|
||||||
|
|
||||||
Main.ctrlAltTabManager.addGroup(this.dialogLayout, _("Unlock Window"), 'dialog-password-symbolic');
|
Main.ctrlAltTabManager.addGroup(this.dialogLayout, _("Unlock Window"), 'dialog-password-symbolic');
|
||||||
|
|
||||||
this._idleMonitor = new GnomeDesktop.IdleMonitor();
|
this._idleMonitor = new GnomeDesktop.IdleMonitor();
|
||||||
@ -282,18 +250,35 @@ const UnlockDialog = new Lang.Class({
|
|||||||
this._userVerifier.answerQuery(query, this._promptEntry.text);
|
this._userVerifier.answerQuery(query, this._promptEntry.text);
|
||||||
},
|
},
|
||||||
|
|
||||||
_onVerificationComplete: function() {
|
_finishUnlock: function() {
|
||||||
this._userVerifier.clear();
|
this._userVerifier.clear();
|
||||||
this.emit('unlocked');
|
this.emit('unlocked');
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_onVerificationComplete: function() {
|
||||||
|
this._userVerified = true;
|
||||||
|
if (!this._userVerifier.hasPendingMessages) {
|
||||||
|
this._finishUnlock();
|
||||||
|
} else {
|
||||||
|
let signalId = this._userVerifier.connect('no-more-messages',
|
||||||
|
Lang.bind(this, function() {
|
||||||
|
this._userVerifier.disconnect(signalId);
|
||||||
|
this._finishUnlock();
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
_onReset: function() {
|
_onReset: function() {
|
||||||
this.emit('failed');
|
if (!this._userVerified) {
|
||||||
|
this._userVerifier.clear();
|
||||||
|
this.emit('failed');
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_onVerificationFailed: function() {
|
_onVerificationFailed: function() {
|
||||||
this._currentQuery = null;
|
this._currentQuery = null;
|
||||||
this._firstQuestion = true;
|
this._firstQuestion = true;
|
||||||
|
this._userVerified = false;
|
||||||
|
|
||||||
this._promptEntry.text = '';
|
this._promptEntry.text = '';
|
||||||
this._promptEntry.clutter_text.set_password_char('\u25cf');
|
this._promptEntry.clutter_text.set_password_char('\u25cf');
|
||||||
@ -333,4 +318,8 @@ const UnlockDialog = new Lang.Class({
|
|||||||
|
|
||||||
this.destroy();
|
this.destroy();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
addCharacter: function(unichar) {
|
||||||
|
this._promptEntry.clutter_text.insert_unichar(unichar);
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
@ -600,7 +600,8 @@ const UserMenuButton = new Lang.Class({
|
|||||||
Lang.bind(this, this._updateHaveShutdown));
|
Lang.bind(this, this._updateHaveShutdown));
|
||||||
|
|
||||||
Main.sessionMode.connect('updated', Lang.bind(this, this._sessionUpdated));
|
Main.sessionMode.connect('updated', Lang.bind(this, this._sessionUpdated));
|
||||||
Main.screenShield.connect('locked-changed', Lang.bind(this, this._updatePresenceIcon));
|
if (Main.screenShield)
|
||||||
|
Main.screenShield.connect('locked-changed', Lang.bind(this, this._updatePresenceIcon));
|
||||||
this._sessionUpdated();
|
this._sessionUpdated();
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -656,7 +657,7 @@ const UserMenuButton = new Lang.Class({
|
|||||||
|
|
||||||
_updateLockScreen: function() {
|
_updateLockScreen: function() {
|
||||||
let allowLockScreen = !this._lockdownSettings.get_boolean(DISABLE_LOCK_SCREEN_KEY);
|
let allowLockScreen = !this._lockdownSettings.get_boolean(DISABLE_LOCK_SCREEN_KEY);
|
||||||
this._lockScreenItem.actor.visible = allowLockScreen;
|
this._lockScreenItem.actor.visible = allowLockScreen && LoginManager.canLock();
|
||||||
},
|
},
|
||||||
|
|
||||||
_updateInstallUpdates: function() {
|
_updateInstallUpdates: function() {
|
||||||
@ -864,7 +865,8 @@ const UserMenuButton = new Lang.Class({
|
|||||||
_onLoginScreenActivate: function() {
|
_onLoginScreenActivate: function() {
|
||||||
this.menu.close(BoxPointer.PopupAnimation.NONE);
|
this.menu.close(BoxPointer.PopupAnimation.NONE);
|
||||||
Main.overview.hide();
|
Main.overview.hide();
|
||||||
Main.screenShield.lock(false);
|
if (Main.screenShield)
|
||||||
|
Main.screenShield.lock(false);
|
||||||
Gdm.goto_login_session_sync(null);
|
Gdm.goto_login_session_sync(null);
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -915,8 +917,10 @@ const UserMenuButton = new Lang.Class({
|
|||||||
session.user.get_real_name() : session.username;
|
session.user.get_real_name() : session.username;
|
||||||
|
|
||||||
if (session.info.remote)
|
if (session.info.remote)
|
||||||
|
/* Translators: Remote here refers to a remote session, like a ssh login */
|
||||||
userLabelText = _("%s (remote)").format(userName);
|
userLabelText = _("%s (remote)").format(userName);
|
||||||
else if (session.info.type == "tty")
|
else if (session.info.type == "tty")
|
||||||
|
/* Translators: Console here refers to a tty like a VT console */
|
||||||
userLabelText = _("%s (console)").format(userName);
|
userLabelText = _("%s (console)").format(userName);
|
||||||
else
|
else
|
||||||
userLabelText = userName;
|
userLabelText = userName;
|
||||||
|
@ -11,12 +11,14 @@ const Layout = imports.ui.layout;
|
|||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const Panel = imports.ui.panel;
|
const Panel = imports.ui.panel;
|
||||||
|
|
||||||
// we could make these gsettings
|
|
||||||
const FISH_NAME = 'wanda';
|
const FISH_NAME = 'wanda';
|
||||||
|
const FISH_FILENAME = 'wanda.png';
|
||||||
const FISH_SPEED = 300;
|
const FISH_SPEED = 300;
|
||||||
const FISH_COMMAND = 'fortune';
|
const FISH_COMMAND = 'fortune';
|
||||||
|
// The size of an individual frame in the animation
|
||||||
|
const FISH_HEIGHT = 22;
|
||||||
|
const FISH_WIDTH = 36;
|
||||||
|
|
||||||
const GNOME_PANEL_PIXMAPDIR = '../gnome-panel/fish';
|
|
||||||
const FISH_GROUP = 'Fish Animation';
|
const FISH_GROUP = 'Fish Animation';
|
||||||
|
|
||||||
const MAGIC_FISH_KEY = 'free the fish';
|
const MAGIC_FISH_KEY = 'free the fish';
|
||||||
@ -26,33 +28,16 @@ const WandaIcon = new Lang.Class({
|
|||||||
Extends: IconGrid.BaseIcon,
|
Extends: IconGrid.BaseIcon,
|
||||||
|
|
||||||
_init : function(fish, label, params) {
|
_init : function(fish, label, params) {
|
||||||
this._fish = fish;
|
|
||||||
let file = GLib.build_filenamev([global.datadir, GNOME_PANEL_PIXMAPDIR, fish + '.fish']);
|
|
||||||
|
|
||||||
if (GLib.file_test(file, GLib.FileTest.EXISTS)) {
|
|
||||||
this._keyfile = new GLib.KeyFile();
|
|
||||||
this._keyfile.load_from_file(file, GLib.KeyFileFlags.NONE);
|
|
||||||
|
|
||||||
this._imageFile = GLib.build_filenamev([global.datadir, GNOME_PANEL_PIXMAPDIR,
|
|
||||||
this._keyfile.get_string(FISH_GROUP, 'image')]);
|
|
||||||
|
|
||||||
let tmpPixbuf = GdkPixbuf.Pixbuf.new_from_file(this._imageFile);
|
|
||||||
|
|
||||||
this._imgHeight = tmpPixbuf.height;
|
|
||||||
this._imgWidth = tmpPixbuf.width / this._keyfile.get_integer(FISH_GROUP, 'frames');
|
|
||||||
} else {
|
|
||||||
this._imageFile = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.parent(label, params);
|
this.parent(label, params);
|
||||||
|
|
||||||
|
this._fish = fish;
|
||||||
|
this._imageFile = GLib.build_filenamev([global.datadir, fish + '.png']);
|
||||||
|
|
||||||
|
this._imgHeight = FISH_HEIGHT;
|
||||||
|
this._imgWidth = FISH_WIDTH;
|
||||||
},
|
},
|
||||||
|
|
||||||
createIcon: function(iconSize) {
|
createIcon: function(iconSize) {
|
||||||
if (!this._imageFile) {
|
|
||||||
return new St.Icon({ icon_name: 'face-smile',
|
|
||||||
icon_size: iconSize });
|
|
||||||
}
|
|
||||||
|
|
||||||
this._animations = new Panel.Animation(this._imageFile, this._imgWidth, this._imgHeight, FISH_SPEED);
|
this._animations = new Panel.Animation(this._imageFile, this._imgWidth, this._imgHeight, FISH_SPEED);
|
||||||
this._animations.play();
|
this._animations.play();
|
||||||
return this._animations.actor;
|
return this._animations.actor;
|
||||||
|
@ -174,6 +174,15 @@ const WindowManager = new Lang.Class({
|
|||||||
Meta.KeyBindingFlags.NONE,
|
Meta.KeyBindingFlags.NONE,
|
||||||
Shell.KeyBindingMode.NORMAL,
|
Shell.KeyBindingMode.NORMAL,
|
||||||
Lang.bind(this, this._openAppMenu));
|
Lang.bind(this, this._openAppMenu));
|
||||||
|
|
||||||
|
Main.overview.connect('showing', Lang.bind(this, function() {
|
||||||
|
for (let i = 0; i < this._dimmedWindows.length; i++)
|
||||||
|
this._undimWindow(this._dimmedWindows[i]);
|
||||||
|
}));
|
||||||
|
Main.overview.connect('hiding', Lang.bind(this, function() {
|
||||||
|
for (let i = 0; i < this._dimmedWindows.length; i++)
|
||||||
|
this._dimWindow(this._dimmedWindows[i]);
|
||||||
|
}));
|
||||||
},
|
},
|
||||||
|
|
||||||
setCustomKeybindingHandler: function(name, modes, handler) {
|
setCustomKeybindingHandler: function(name, modes, handler) {
|
||||||
@ -333,13 +342,15 @@ const WindowManager = new Lang.Class({
|
|||||||
if (shouldDim && !window._dimmed) {
|
if (shouldDim && !window._dimmed) {
|
||||||
window._dimmed = true;
|
window._dimmed = true;
|
||||||
this._dimmedWindows.push(window);
|
this._dimmedWindows.push(window);
|
||||||
this._dimWindow(window);
|
if (!Main.overview.visible)
|
||||||
|
this._dimWindow(window);
|
||||||
} else if (!shouldDim && window._dimmed) {
|
} else if (!shouldDim && window._dimmed) {
|
||||||
window._dimmed = false;
|
window._dimmed = false;
|
||||||
this._dimmedWindows = this._dimmedWindows.filter(function(win) {
|
this._dimmedWindows = this._dimmedWindows.filter(function(win) {
|
||||||
return win != window;
|
return win != window;
|
||||||
});
|
});
|
||||||
this._undimWindow(window);
|
if (!Main.overview.visible)
|
||||||
|
this._undimWindow(window);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -15,7 +15,6 @@ const Main = imports.ui.main;
|
|||||||
const Overview = imports.ui.overview;
|
const Overview = imports.ui.overview;
|
||||||
const Panel = imports.ui.panel;
|
const Panel = imports.ui.panel;
|
||||||
const Tweener = imports.ui.tweener;
|
const Tweener = imports.ui.tweener;
|
||||||
const WindowManager = imports.ui.windowManager;
|
|
||||||
|
|
||||||
const FOCUS_ANIMATION_TIME = 0.15;
|
const FOCUS_ANIMATION_TIME = 0.15;
|
||||||
|
|
||||||
@ -42,68 +41,6 @@ function _interpolate(start, end, step) {
|
|||||||
return start + (end - start) * step;
|
return start + (end - start) * step;
|
||||||
}
|
}
|
||||||
|
|
||||||
const WindowCloneLayout = new Lang.Class({
|
|
||||||
Name: 'WindowCloneLayout',
|
|
||||||
Extends: Clutter.LayoutManager,
|
|
||||||
|
|
||||||
_init: function(boundingBox) {
|
|
||||||
this.parent();
|
|
||||||
|
|
||||||
this._boundingBox = boundingBox;
|
|
||||||
},
|
|
||||||
|
|
||||||
get boundingBox() {
|
|
||||||
return this._boundingBox;
|
|
||||||
},
|
|
||||||
|
|
||||||
set boundingBox(b) {
|
|
||||||
this._boundingBox = b;
|
|
||||||
this.layout_changed();
|
|
||||||
},
|
|
||||||
|
|
||||||
_makeBoxForWindow: function(window) {
|
|
||||||
// We need to adjust the position of the actor because of the
|
|
||||||
// consequences of invisible borders -- in reality, the texture
|
|
||||||
// has an extra set of "padding" around it that we need to trim
|
|
||||||
// down.
|
|
||||||
|
|
||||||
// The outer rect (from which we compute the bounding box)
|
|
||||||
// paradoxically is the smaller rectangle, containing the positions
|
|
||||||
// of the visible frame. The input rect contains everything,
|
|
||||||
// including the invisible border padding.
|
|
||||||
let inputRect = window.get_input_rect();
|
|
||||||
|
|
||||||
let box = new Clutter.ActorBox();
|
|
||||||
|
|
||||||
box.set_origin(inputRect.x - this._boundingBox.x,
|
|
||||||
inputRect.y - this._boundingBox.y);
|
|
||||||
box.set_size(inputRect.width, inputRect.height);
|
|
||||||
|
|
||||||
return box;
|
|
||||||
},
|
|
||||||
|
|
||||||
vfunc_get_preferred_height: function(container, forWidth) {
|
|
||||||
return [this._boundingBox.height, this._boundingBox.height];
|
|
||||||
},
|
|
||||||
|
|
||||||
vfunc_get_preferred_width: function(container, forHeight) {
|
|
||||||
return [this._boundingBox.width, this._boundingBox.width];
|
|
||||||
},
|
|
||||||
|
|
||||||
vfunc_allocate: function(container, box, flags) {
|
|
||||||
let clone = container.get_children().forEach(function (child) {
|
|
||||||
let realWindow;
|
|
||||||
if (child == container._delegate._windowClone)
|
|
||||||
realWindow = container._delegate.realWindow;
|
|
||||||
else
|
|
||||||
realWindow = child.source;
|
|
||||||
|
|
||||||
child.allocate(this._makeBoxForWindow(realWindow.meta_window),
|
|
||||||
flags);
|
|
||||||
}, this);
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const WindowClone = new Lang.Class({
|
const WindowClone = new Lang.Class({
|
||||||
Name: 'WindowClone',
|
Name: 'WindowClone',
|
||||||
|
|
||||||
@ -113,7 +50,10 @@ const WindowClone = new Lang.Class({
|
|||||||
this.metaWindow._delegate = this;
|
this.metaWindow._delegate = this;
|
||||||
this._workspace = workspace;
|
this._workspace = workspace;
|
||||||
|
|
||||||
this._windowClone = new Clutter.Clone({ source: realWindow.get_texture() });
|
let [borderX, borderY] = this._getInvisibleBorderPadding();
|
||||||
|
this._windowClone = new Clutter.Clone({ source: realWindow.get_texture(),
|
||||||
|
x: -borderX,
|
||||||
|
y: -borderY });
|
||||||
// We expect this.actor to be used for all interaction rather than
|
// We expect this.actor to be used for all interaction rather than
|
||||||
// this._windowClone; as the former is reactive and the latter
|
// this._windowClone; as the former is reactive and the latter
|
||||||
// is not, this just works for most cases. However, for DND all
|
// is not, this just works for most cases. However, for DND all
|
||||||
@ -121,15 +61,20 @@ const WindowClone = new Lang.Class({
|
|||||||
// To avoid this, we hide it from pick.
|
// To avoid this, we hide it from pick.
|
||||||
Shell.util_set_hidden_from_pick(this._windowClone, true);
|
Shell.util_set_hidden_from_pick(this._windowClone, true);
|
||||||
|
|
||||||
|
this.origX = realWindow.x + borderX;
|
||||||
|
this.origY = realWindow.y + borderY;
|
||||||
|
|
||||||
|
let outerRect = realWindow.meta_window.get_outer_rect();
|
||||||
|
|
||||||
// The MetaShapedTexture that we clone has a size that includes
|
// The MetaShapedTexture that we clone has a size that includes
|
||||||
// the invisible border; this is inconvenient; rather than trying
|
// the invisible border; this is inconvenient; rather than trying
|
||||||
// to compensate all over the place we insert a custom container into
|
// to compensate all over the place we insert a ClutterActor into
|
||||||
// the hierarchy that is sized to only the visible portion.
|
// the hierarchy that is sized to only the visible portion.
|
||||||
// As usual, we cannot use a ShellGenericContainer or StWidget here,
|
|
||||||
// because Workspace plays dirty tricks with reparenting to do DNDs
|
|
||||||
// and scroll-to-zoom.
|
|
||||||
this.actor = new Clutter.Actor({ reactive: true,
|
this.actor = new Clutter.Actor({ reactive: true,
|
||||||
layout_manager: new WindowCloneLayout() });
|
x: this.origX,
|
||||||
|
y: this.origY,
|
||||||
|
width: outerRect.width,
|
||||||
|
height: outerRect.height });
|
||||||
|
|
||||||
this.actor.add_child(this._windowClone);
|
this.actor.add_child(this._windowClone);
|
||||||
|
|
||||||
@ -139,19 +84,10 @@ const WindowClone = new Lang.Class({
|
|||||||
this._dragSlot = [0, 0, 0, 0];
|
this._dragSlot = [0, 0, 0, 0];
|
||||||
this._stackAbove = null;
|
this._stackAbove = null;
|
||||||
|
|
||||||
this._windowClone._updateId = this.realWindow.connect('size-changed',
|
this._sizeChangedId = this.realWindow.connect('size-changed',
|
||||||
Lang.bind(this, this._onRealWindowSizeChanged));
|
Lang.bind(this, this._onRealWindowSizeChanged));
|
||||||
this._windowClone._destroyId = this.realWindow.connect('destroy', Lang.bind(this, function() {
|
this._realWindowDestroyId = this.realWindow.connect('destroy',
|
||||||
// First destroy the clone and then destroy everything
|
Lang.bind(this, this._disconnectRealWindowSignals));
|
||||||
// This will ensure that we never see it in the _disconnectSignals loop
|
|
||||||
this._windowClone.destroy();
|
|
||||||
this.destroy();
|
|
||||||
}));
|
|
||||||
|
|
||||||
this._updateAttachedDialogs();
|
|
||||||
this._computeBoundingBox();
|
|
||||||
this.actor.x = this._boundingBox.x;
|
|
||||||
this.actor.y = this._boundingBox.y;
|
|
||||||
|
|
||||||
let clickAction = new Clutter.ClickAction();
|
let clickAction = new Clutter.ClickAction();
|
||||||
clickAction.connect('clicked', Lang.bind(this, this._onClicked));
|
clickAction.connect('clicked', Lang.bind(this, this._onClicked));
|
||||||
@ -185,95 +121,20 @@ const WindowClone = new Lang.Class({
|
|||||||
return this._slot;
|
return this._slot;
|
||||||
},
|
},
|
||||||
|
|
||||||
deleteAll: function() {
|
// Find the actor just below us, respecting reparenting done
|
||||||
// Delete all windows, starting from the bottom-most (most-modal) one
|
// by DND code
|
||||||
|
getActualStackAbove: function() {
|
||||||
|
if (this._stackAbove == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
let windows = this.actor.get_children();
|
if (this.inDrag || this._zooming) {
|
||||||
for (let i = windows.length - 1; i >= 1; i--) {
|
if (this._stackAbove._delegate)
|
||||||
let realWindow = windows[i].source;
|
return this._stackAbove._delegate.getActualStackAbove();
|
||||||
let metaWindow = realWindow.meta_window;
|
|
||||||
|
|
||||||
metaWindow.delete(global.get_current_time());
|
|
||||||
}
|
|
||||||
|
|
||||||
this.metaWindow.delete(global.get_current_time());
|
|
||||||
},
|
|
||||||
|
|
||||||
addAttachedDialog: function(win) {
|
|
||||||
this._doAddAttachedDialog(win, win.get_compositor_private());
|
|
||||||
this._computeBoundingBox();
|
|
||||||
this._updateDimmer();
|
|
||||||
this.emit('size-changed');
|
|
||||||
},
|
|
||||||
|
|
||||||
_doAddAttachedDialog: function(metaWin, realWin) {
|
|
||||||
let clone = new Clutter.Clone({ source: realWin });
|
|
||||||
clone._updateId = realWin.connect('size-changed', Lang.bind(this, function() {
|
|
||||||
this._computeBoundingBox();
|
|
||||||
this.emit('size-changed');
|
|
||||||
}));
|
|
||||||
clone._destroyId = realWin.connect('destroy', Lang.bind(this, function() {
|
|
||||||
clone.destroy();
|
|
||||||
|
|
||||||
this._computeBoundingBox();
|
|
||||||
this._updateDimmer();
|
|
||||||
this.emit('size-changed');
|
|
||||||
}));
|
|
||||||
this.actor.add_child(clone);
|
|
||||||
},
|
|
||||||
|
|
||||||
_updateAttachedDialogs: function() {
|
|
||||||
let iter = Lang.bind(this, function(win) {
|
|
||||||
let actor = win.get_compositor_private();
|
|
||||||
|
|
||||||
if (!actor)
|
|
||||||
return false;
|
|
||||||
if (!win.is_attached_dialog())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
this._doAddAttachedDialog(win, actor);
|
|
||||||
win.foreach_transient(iter);
|
|
||||||
return true;
|
|
||||||
});
|
|
||||||
this.metaWindow.foreach_transient(iter);
|
|
||||||
|
|
||||||
this._dimmer = new WindowManager.WindowDimmer(this._windowClone);
|
|
||||||
this._updateDimmer();
|
|
||||||
},
|
|
||||||
|
|
||||||
_updateDimmer: function() {
|
|
||||||
if (this.actor.get_n_children() > 1) {
|
|
||||||
this._dimmer.setEnabled(true);
|
|
||||||
this._dimmer.dimFactor = 1.0;
|
|
||||||
} else {
|
|
||||||
this._dimmer.setEnabled(false);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
get boundingBox() {
|
|
||||||
return this._boundingBox;
|
|
||||||
},
|
|
||||||
|
|
||||||
getOriginalPosition: function() {
|
|
||||||
return [this._boundingBox.x, this._boundingBox.y];
|
|
||||||
},
|
|
||||||
|
|
||||||
_computeBoundingBox: function() {
|
|
||||||
let rect = this.metaWindow.get_outer_rect();
|
|
||||||
|
|
||||||
this.actor.get_children().forEach(function (child) {
|
|
||||||
let realWindow;
|
|
||||||
if (child == this._windowClone)
|
|
||||||
realWindow = this.realWindow;
|
|
||||||
else
|
else
|
||||||
realWindow = child.source;
|
return null;
|
||||||
|
} else {
|
||||||
let metaWindow = realWindow.meta_window;
|
return this._stackAbove;
|
||||||
rect = rect.union(metaWindow.get_outer_rect());
|
}
|
||||||
}, this);
|
|
||||||
|
|
||||||
this._boundingBox = rect;
|
|
||||||
this.actor.layout_manager.boundingBox = rect;
|
|
||||||
},
|
},
|
||||||
|
|
||||||
setStackAbove: function (actor) {
|
setStackAbove: function (actor) {
|
||||||
@ -281,36 +142,56 @@ const WindowClone = new Lang.Class({
|
|||||||
if (this.inDrag)
|
if (this.inDrag)
|
||||||
// We'll fix up the stack after the drag
|
// We'll fix up the stack after the drag
|
||||||
return;
|
return;
|
||||||
if (this._stackAbove == null)
|
|
||||||
|
let actualAbove = this.getActualStackAbove();
|
||||||
|
if (actualAbove == null)
|
||||||
this.actor.lower_bottom();
|
this.actor.lower_bottom();
|
||||||
else
|
else
|
||||||
this.actor.raise(this._stackAbove);
|
this.actor.raise(actualAbove);
|
||||||
},
|
},
|
||||||
|
|
||||||
destroy: function () {
|
destroy: function () {
|
||||||
this.actor.destroy();
|
this.actor.destroy();
|
||||||
},
|
},
|
||||||
|
|
||||||
_disconnectSignals: function() {
|
_disconnectRealWindowSignals: function() {
|
||||||
this.actor.get_children().forEach(Lang.bind(this, function (child) {
|
if (this._sizeChangedId > 0)
|
||||||
let realWindow;
|
this.realWindow.disconnect(this._sizeChangedId);
|
||||||
if (child == this._windowClone)
|
this._sizeChangedId = 0;
|
||||||
realWindow = this.realWindow;
|
|
||||||
else
|
|
||||||
realWindow = child.source;
|
|
||||||
|
|
||||||
realWindow.disconnect(child._updateId);
|
if (this._realWindowDestroyId > 0)
|
||||||
realWindow.disconnect(child._destroyId);
|
this.realWindow.disconnect(this._realWindowDestroyId);
|
||||||
}));
|
this._realWindowDestroyId = 0;
|
||||||
|
},
|
||||||
|
|
||||||
|
_getInvisibleBorderPadding: function() {
|
||||||
|
// We need to adjust the position of the actor because of the
|
||||||
|
// consequences of invisible borders -- in reality, the texture
|
||||||
|
// has an extra set of "padding" around it that we need to trim
|
||||||
|
// down.
|
||||||
|
|
||||||
|
// The outer rect paradoxically is the smaller rectangle,
|
||||||
|
// containing the positions of the visible frame. The input
|
||||||
|
// rect contains everything, including the invisible border
|
||||||
|
// padding.
|
||||||
|
let outerRect = this.metaWindow.get_outer_rect();
|
||||||
|
let inputRect = this.metaWindow.get_input_rect();
|
||||||
|
let [borderX, borderY] = [outerRect.x - inputRect.x,
|
||||||
|
outerRect.y - inputRect.y];
|
||||||
|
|
||||||
|
return [borderX, borderY];
|
||||||
},
|
},
|
||||||
|
|
||||||
_onRealWindowSizeChanged: function() {
|
_onRealWindowSizeChanged: function() {
|
||||||
this._computeBoundingBox();
|
let [borderX, borderY] = this._getInvisibleBorderPadding();
|
||||||
|
let outerRect = this.metaWindow.get_outer_rect();
|
||||||
|
this.actor.set_size(outerRect.width, outerRect.height);
|
||||||
|
this._windowClone.set_position(-borderX, -borderY);
|
||||||
this.emit('size-changed');
|
this.emit('size-changed');
|
||||||
},
|
},
|
||||||
|
|
||||||
_onDestroy: function() {
|
_onDestroy: function() {
|
||||||
this._disconnectSignals();
|
this._disconnectRealWindowSignals();
|
||||||
|
|
||||||
this.metaWindow._delegate = null;
|
this.metaWindow._delegate = null;
|
||||||
this.actor._delegate = null;
|
this.actor._delegate = null;
|
||||||
@ -569,7 +450,7 @@ const WindowOverlay = new Lang.Class({
|
|||||||
Lang.bind(this,
|
Lang.bind(this,
|
||||||
this._onWindowAdded));
|
this._onWindowAdded));
|
||||||
|
|
||||||
this._windowClone.deleteAll();
|
metaWindow.delete(global.get_current_time());
|
||||||
},
|
},
|
||||||
|
|
||||||
_onWindowAdded: function(workspace, win) {
|
_onWindowAdded: function(workspace, win) {
|
||||||
@ -1045,7 +926,7 @@ const Workspace = new Lang.Class({
|
|||||||
this._windowOverlays = [];
|
this._windowOverlays = [];
|
||||||
for (let i = 0; i < windows.length; i++) {
|
for (let i = 0; i < windows.length; i++) {
|
||||||
if (this._isOverviewWindow(windows[i])) {
|
if (this._isOverviewWindow(windows[i])) {
|
||||||
this._addWindowClone(windows[i]);
|
this._addWindowClone(windows[i], true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1170,11 +1051,23 @@ const Workspace = new Lang.Class({
|
|||||||
if (clone.inDrag)
|
if (clone.inDrag)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
clone.slot = [x, y, clone.actor.width * scale, clone.actor.height * scale];
|
let cloneWidth = clone.actor.width * scale;
|
||||||
|
let cloneHeight = clone.actor.height * scale;
|
||||||
|
clone.slot = [x, y, cloneWidth, cloneHeight];
|
||||||
|
|
||||||
if (overlay && initialPositioning)
|
if (overlay && (initialPositioning || !clone.positioned))
|
||||||
overlay.hide();
|
overlay.hide();
|
||||||
|
|
||||||
|
if (!clone.positioned) {
|
||||||
|
// This window appeared after the overview was already up
|
||||||
|
// Grow the clone from the center of the slot
|
||||||
|
clone.actor.x = x + cloneWidth / 2;
|
||||||
|
clone.actor.y = y + cloneHeight / 2;
|
||||||
|
clone.actor.scale_x = 0;
|
||||||
|
clone.actor.scale_y = 0;
|
||||||
|
clone.positioned = true;
|
||||||
|
}
|
||||||
|
|
||||||
if (animate && isOnCurrentWorkspace) {
|
if (animate && isOnCurrentWorkspace) {
|
||||||
if (!metaWindow.showing_on_its_workspace()) {
|
if (!metaWindow.showing_on_its_workspace()) {
|
||||||
/* Hidden windows should fade in and grow
|
/* Hidden windows should fade in and grow
|
||||||
@ -1357,30 +1250,10 @@ const Workspace = new Lang.Class({
|
|||||||
if (this._lookupIndex (metaWin) != -1)
|
if (this._lookupIndex (metaWin) != -1)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!this._isMyWindow(win))
|
if (!this._isMyWindow(win) || !this._isOverviewWindow(win))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!this._isOverviewWindow(win)) {
|
let [clone, overlay] = this._addWindowClone(win, false);
|
||||||
if (metaWin.is_attached_dialog()) {
|
|
||||||
let parent = metaWin.get_transient_for();
|
|
||||||
while (parent.is_attached_dialog())
|
|
||||||
parent = metaWin.get_transient_for();
|
|
||||||
|
|
||||||
let idx = this._lookupIndex (parent);
|
|
||||||
if (idx < 0) {
|
|
||||||
// parent was not created yet, it will take care
|
|
||||||
// of the dialog when created
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
let clone = this._windows[idx];
|
|
||||||
clone.addAttachedDialog(metaWin);
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
let [clone, overlay] = this._addWindowClone(win);
|
|
||||||
|
|
||||||
if (win._overviewHint) {
|
if (win._overviewHint) {
|
||||||
let x = win._overviewHint.x - this.actor.x;
|
let x = win._overviewHint.x - this.actor.x;
|
||||||
@ -1389,16 +1262,10 @@ const Workspace = new Lang.Class({
|
|||||||
delete win._overviewHint;
|
delete win._overviewHint;
|
||||||
|
|
||||||
clone.slot = [x, y, clone.actor.width * scale, clone.actor.height * scale];
|
clone.slot = [x, y, clone.actor.width * scale, clone.actor.height * scale];
|
||||||
|
clone.positioned = true;
|
||||||
clone.actor.set_position (x, y);
|
clone.actor.set_position (x, y);
|
||||||
clone.actor.set_scale (scale, scale);
|
clone.actor.set_scale (scale, scale);
|
||||||
clone.overlay.relayout(false);
|
clone.overlay.relayout(false);
|
||||||
} else {
|
|
||||||
// Position new windows at the top corner of the workspace rather
|
|
||||||
// than where they were placed for real to avoid the window
|
|
||||||
// being clipped to the workspaceView. Its not really more
|
|
||||||
// natural for the window to suddenly appear in the overview
|
|
||||||
// on some seemingly random location anyway.
|
|
||||||
clone.actor.set_position (this._x, this._y);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this._currentLayout = null;
|
this._currentLayout = null;
|
||||||
@ -1478,11 +1345,9 @@ const Workspace = new Lang.Class({
|
|||||||
overlay.hide();
|
overlay.hide();
|
||||||
|
|
||||||
if (clone.metaWindow.showing_on_its_workspace()) {
|
if (clone.metaWindow.showing_on_its_workspace()) {
|
||||||
let [origX, origY] = clone.getOriginalPosition();
|
|
||||||
|
|
||||||
Tweener.addTween(clone.actor,
|
Tweener.addTween(clone.actor,
|
||||||
{ x: origX,
|
{ x: clone.origX,
|
||||||
y: origY,
|
y: clone.origY,
|
||||||
scale_x: 1.0,
|
scale_x: 1.0,
|
||||||
scale_y: 1.0,
|
scale_y: 1.0,
|
||||||
time: Overview.ANIMATION_TIME,
|
time: Overview.ANIMATION_TIME,
|
||||||
@ -1547,10 +1412,11 @@ const Workspace = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
// Create a clone of a (non-desktop) window and add it to the window list
|
// Create a clone of a (non-desktop) window and add it to the window list
|
||||||
_addWindowClone : function(win) {
|
_addWindowClone : function(win, positioned) {
|
||||||
let clone = new WindowClone(win, this);
|
let clone = new WindowClone(win, this);
|
||||||
let overlay = new WindowOverlay(clone, this._windowOverlaysGroup);
|
let overlay = new WindowOverlay(clone, this._windowOverlaysGroup);
|
||||||
clone.overlay = overlay;
|
clone.overlay = overlay;
|
||||||
|
clone.positioned = positioned;
|
||||||
|
|
||||||
clone.connect('selected',
|
clone.connect('selected',
|
||||||
Lang.bind(this, this._onCloneSelected));
|
Lang.bind(this, this._onCloneSelected));
|
||||||
|
@ -13,7 +13,6 @@ const Background = imports.ui.background;
|
|||||||
const DND = imports.ui.dnd;
|
const DND = imports.ui.dnd;
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const Tweener = imports.ui.tweener;
|
const Tweener = imports.ui.tweener;
|
||||||
const WindowManager = imports.ui.windowManager;
|
|
||||||
const Workspace = imports.ui.workspace;
|
const Workspace = imports.ui.workspace;
|
||||||
const WorkspacesView = imports.ui.workspacesView;
|
const WorkspacesView = imports.ui.workspacesView;
|
||||||
|
|
||||||
@ -32,49 +31,20 @@ const WORKSPACE_KEEP_ALIVE_TIME = 100;
|
|||||||
|
|
||||||
const OVERRIDE_SCHEMA = 'org.gnome.shell.overrides';
|
const OVERRIDE_SCHEMA = 'org.gnome.shell.overrides';
|
||||||
|
|
||||||
/* A layout manager that requests size only for primary_actor, but then allocates
|
|
||||||
all using a fixed layout */
|
|
||||||
const PrimaryActorLayout = new Lang.Class({
|
|
||||||
Name: 'PrimaryActorLayout',
|
|
||||||
Extends: Clutter.FixedLayout,
|
|
||||||
|
|
||||||
_init: function(primaryActor) {
|
|
||||||
this.parent();
|
|
||||||
|
|
||||||
this.primaryActor = primaryActor;
|
|
||||||
},
|
|
||||||
|
|
||||||
vfunc_get_preferred_width: function(forHeight) {
|
|
||||||
return this.primaryActor.get_preferred_width(forHeight);
|
|
||||||
},
|
|
||||||
|
|
||||||
vfunc_get_preferred_height: function(forWidth) {
|
|
||||||
return this.primaryActor.get_preferred_height(forWidth);
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const WindowClone = new Lang.Class({
|
const WindowClone = new Lang.Class({
|
||||||
Name: 'WindowClone',
|
Name: 'WindowClone',
|
||||||
|
|
||||||
_init : function(realWindow) {
|
_init : function(realWindow) {
|
||||||
this.clone = new Clutter.Clone({ source: realWindow });
|
this.actor = new Clutter.Clone({ source: realWindow.get_texture(),
|
||||||
|
|
||||||
/* Can't use a Shell.GenericContainer because of DND and reparenting... */
|
|
||||||
this.actor = new Clutter.Actor({ layout_manager: new PrimaryActorLayout(this.clone),
|
|
||||||
reactive: true });
|
reactive: true });
|
||||||
this.actor._delegate = this;
|
this.actor._delegate = this;
|
||||||
this.actor.add_child(this.clone);
|
|
||||||
this.realWindow = realWindow;
|
this.realWindow = realWindow;
|
||||||
this.metaWindow = realWindow.meta_window;
|
this.metaWindow = realWindow.meta_window;
|
||||||
|
|
||||||
this.clone._updateId = this.realWindow.connect('position-changed',
|
this._positionChangedId = this.realWindow.connect('position-changed',
|
||||||
Lang.bind(this, this._onPositionChanged));
|
Lang.bind(this, this._onPositionChanged));
|
||||||
this.clone._destroyId = this.realWindow.connect('destroy', Lang.bind(this, function() {
|
this._realWindowDestroyedId = this.realWindow.connect('destroy',
|
||||||
// First destroy the clone and then destroy everything
|
Lang.bind(this, this._disconnectRealWindowSignals));
|
||||||
// This will ensure that we never see it in the _disconnectSignals loop
|
|
||||||
this.clone.destroy();
|
|
||||||
this.destroy();
|
|
||||||
}));
|
|
||||||
this._onPositionChanged();
|
this._onPositionChanged();
|
||||||
|
|
||||||
this.actor.connect('button-release-event',
|
this.actor.connect('button-release-event',
|
||||||
@ -90,89 +60,62 @@ const WindowClone = new Lang.Class({
|
|||||||
this._draggable.connect('drag-cancelled', Lang.bind(this, this._onDragCancelled));
|
this._draggable.connect('drag-cancelled', Lang.bind(this, this._onDragCancelled));
|
||||||
this._draggable.connect('drag-end', Lang.bind(this, this._onDragEnd));
|
this._draggable.connect('drag-end', Lang.bind(this, this._onDragEnd));
|
||||||
this.inDrag = false;
|
this.inDrag = false;
|
||||||
|
},
|
||||||
|
|
||||||
let iter = Lang.bind(this, function(win) {
|
// Find the actor just below us, respecting reparenting done
|
||||||
let actor = win.get_compositor_private();
|
// by DND code
|
||||||
|
getActualStackAbove: function() {
|
||||||
|
if (this._stackAbove == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
if (!actor)
|
if (this.inDrag) {
|
||||||
return false;
|
if (this._stackAbove._delegate)
|
||||||
if (!win.is_attached_dialog())
|
return this._stackAbove._delegate.getActualStackAbove();
|
||||||
return false;
|
else
|
||||||
|
return null;
|
||||||
this._doAddAttachedDialog(win, actor);
|
} else {
|
||||||
win.foreach_transient(iter);
|
return this._stackAbove;
|
||||||
|
}
|
||||||
return true;
|
|
||||||
});
|
|
||||||
this.metaWindow.foreach_transient(iter);
|
|
||||||
|
|
||||||
this._dimmer = new WindowManager.WindowDimmer(this.clone);
|
|
||||||
this._updateDimmer();
|
|
||||||
},
|
},
|
||||||
|
|
||||||
setStackAbove: function (actor) {
|
setStackAbove: function (actor) {
|
||||||
this._stackAbove = actor;
|
this._stackAbove = actor;
|
||||||
if (this._stackAbove == null)
|
|
||||||
|
// Don't apply the new stacking now, it will be applied
|
||||||
|
// when dragging ends and window are stacked again
|
||||||
|
if (actor.inDrag)
|
||||||
|
return;
|
||||||
|
|
||||||
|
let actualAbove = this.getActualStackAbove();
|
||||||
|
if (actualAbove == null)
|
||||||
this.actor.lower_bottom();
|
this.actor.lower_bottom();
|
||||||
else
|
else
|
||||||
this.actor.raise(this._stackAbove);
|
this.actor.raise(actualAbove);
|
||||||
},
|
},
|
||||||
|
|
||||||
destroy: function () {
|
destroy: function () {
|
||||||
this.actor.destroy();
|
this.actor.destroy();
|
||||||
},
|
},
|
||||||
|
|
||||||
addAttachedDialog: function(win) {
|
|
||||||
this._doAddAttachedDialog(win, win.get_compositor_private());
|
|
||||||
this._updateDimmer();
|
|
||||||
},
|
|
||||||
|
|
||||||
_doAddAttachedDialog: function(metaDialog, realDialog) {
|
|
||||||
let clone = new Clutter.Clone({ source: realDialog });
|
|
||||||
this._updateDialogPosition(realDialog, clone);
|
|
||||||
|
|
||||||
clone._updateId = realDialog.connect('position-changed',
|
|
||||||
Lang.bind(this, this._updateDialogPosition, clone));
|
|
||||||
clone._destroyId = realDialog.connect('destroy', Lang.bind(this, function() {
|
|
||||||
clone.destroy();
|
|
||||||
this._updateDimmer();
|
|
||||||
}));
|
|
||||||
this.actor.add_child(clone);
|
|
||||||
},
|
|
||||||
|
|
||||||
_updateDimmer: function() {
|
|
||||||
if (this.actor.get_n_children() > 1) {
|
|
||||||
this._dimmer.setEnabled(true);
|
|
||||||
this._dimmer.dimFactor = 1.0;
|
|
||||||
} else {
|
|
||||||
this._dimmer.setEnabled(false);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
_updateDialogPosition: function(realDialog, cloneDialog) {
|
|
||||||
let metaDialog = realDialog.meta_window;
|
|
||||||
let dialogRect = metaDialog.get_outer_rect();
|
|
||||||
let rect = this.metaWindow.get_outer_rect();
|
|
||||||
|
|
||||||
cloneDialog.set_position(dialogRect.x - rect.x, dialogRect.y - rect.y);
|
|
||||||
},
|
|
||||||
|
|
||||||
_onPositionChanged: function() {
|
_onPositionChanged: function() {
|
||||||
let rect = this.metaWindow.get_outer_rect();
|
let rect = this.metaWindow.get_outer_rect();
|
||||||
this.actor.set_position(this.realWindow.x, this.realWindow.y);
|
this.actor.set_position(this.realWindow.x, this.realWindow.y);
|
||||||
},
|
},
|
||||||
|
|
||||||
_disconnectSignals: function() {
|
_disconnectRealWindowSignals: function() {
|
||||||
this.actor.get_children().forEach(function(child) {
|
if (this._positionChangedId != 0) {
|
||||||
let realWindow = child.source;
|
this.realWindow.disconnect(this._positionChangedId);
|
||||||
|
this._positionChangedId = 0;
|
||||||
|
}
|
||||||
|
|
||||||
realWindow.disconnect(child._updateId);
|
if (this._realWindowDestroyedId != 0) {
|
||||||
realWindow.disconnect(child._destroyId);
|
this.realWindow.disconnect(this._realWindowDestroyedId);
|
||||||
});
|
this._realWindowDestroyedId = 0;
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_onDestroy: function() {
|
_onDestroy: function() {
|
||||||
this._disconnectSignals();
|
this._disconnectRealWindowSignals();
|
||||||
|
|
||||||
this.actor._delegate = null;
|
this.actor._delegate = null;
|
||||||
|
|
||||||
@ -400,26 +343,10 @@ const WorkspaceThumbnail = new Lang.Class({
|
|||||||
if (this._lookupIndex (metaWin) != -1)
|
if (this._lookupIndex (metaWin) != -1)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!this._isMyWindow(win))
|
if (!this._isMyWindow(win) || !this._isOverviewWindow(win))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (this._isOverviewWindow(win)) {
|
let clone = this._addWindowClone(win);
|
||||||
this._addWindowClone(win);
|
|
||||||
} else if (metaWin.is_attached_dialog()) {
|
|
||||||
let parent = metaWin.get_transient_for();
|
|
||||||
while (parent.is_attached_dialog())
|
|
||||||
parent = metaWin.get_transient_for();
|
|
||||||
|
|
||||||
let idx = this._lookupIndex (parent);
|
|
||||||
if (idx < 0) {
|
|
||||||
// parent was not created yet, it will take care
|
|
||||||
// of the dialog when created
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
let clone = this._windows[idx];
|
|
||||||
clone.addAttachedDialog(metaWin);
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_windowAdded : function(metaWorkspace, metaWin) {
|
_windowAdded : function(metaWorkspace, metaWin) {
|
||||||
@ -457,9 +384,8 @@ const WorkspaceThumbnail = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
destroy : function() {
|
destroy : function() {
|
||||||
this.actor.destroy();
|
if (this.actor)
|
||||||
this._bgManager.destroy();
|
this.actor.destroy();
|
||||||
this._bgManager = null;
|
|
||||||
},
|
},
|
||||||
|
|
||||||
workspaceRemoved : function() {
|
workspaceRemoved : function() {
|
||||||
@ -480,6 +406,11 @@ const WorkspaceThumbnail = new Lang.Class({
|
|||||||
_onDestroy: function(actor) {
|
_onDestroy: function(actor) {
|
||||||
this.workspaceRemoved();
|
this.workspaceRemoved();
|
||||||
|
|
||||||
|
if (this._bgManager) {
|
||||||
|
this._bgManager.destroy();
|
||||||
|
this._bgManager = null;
|
||||||
|
}
|
||||||
|
|
||||||
this._windows = [];
|
this._windows = [];
|
||||||
this.actor = null;
|
this.actor = null;
|
||||||
},
|
},
|
||||||
@ -631,6 +562,7 @@ const ThumbnailsBox = new Lang.Class({
|
|||||||
this._dropPlaceholderPos = -1;
|
this._dropPlaceholderPos = -1;
|
||||||
this._dropPlaceholder = new St.Bin({ style_class: 'placeholder' });
|
this._dropPlaceholder = new St.Bin({ style_class: 'placeholder' });
|
||||||
this.actor.add_actor(this._dropPlaceholder);
|
this.actor.add_actor(this._dropPlaceholder);
|
||||||
|
this._spliceIndex = -1;
|
||||||
|
|
||||||
this._targetScale = 0;
|
this._targetScale = 0;
|
||||||
this._scale = 0;
|
this._scale = 0;
|
||||||
@ -813,6 +745,8 @@ const ThumbnailsBox = new Lang.Class({
|
|||||||
return win.get_workspace() >= newWorkspaceIndex;
|
return win.get_workspace() >= newWorkspaceIndex;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this._spliceIndex = newWorkspaceIndex;
|
||||||
|
|
||||||
// ... move them down one.
|
// ... move them down one.
|
||||||
windows.forEach(function(win) {
|
windows.forEach(function(win) {
|
||||||
win.meta_window.change_workspace_by_index(win.get_workspace() + 1,
|
win.meta_window.change_workspace_by_index(win.get_workspace() + 1,
|
||||||
@ -834,6 +768,14 @@ const ThumbnailsBox = new Lang.Class({
|
|||||||
WORKSPACE_KEEP_ALIVE_TIME);
|
WORKSPACE_KEEP_ALIVE_TIME);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Start the animation on the workspace (which is actually
|
||||||
|
// an old one which just became empty)
|
||||||
|
let thumbnail = this._thumbnails[newWorkspaceIndex];
|
||||||
|
this._setThumbnailState(thumbnail, ThumbnailState.NEW);
|
||||||
|
thumbnail.slidePosition = 1;
|
||||||
|
|
||||||
|
this._queueUpdateStates();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
@ -921,7 +863,8 @@ const ThumbnailsBox = new Lang.Class({
|
|||||||
this._thumbnails.push(thumbnail);
|
this._thumbnails.push(thumbnail);
|
||||||
this.actor.add_actor(thumbnail.actor);
|
this.actor.add_actor(thumbnail.actor);
|
||||||
|
|
||||||
if (start > 0) { // not the initial fill
|
if (start > 0 && this._spliceIndex == -1) {
|
||||||
|
// not the initial fill, and not splicing via DND
|
||||||
thumbnail.state = ThumbnailState.NEW;
|
thumbnail.state = ThumbnailState.NEW;
|
||||||
thumbnail.slidePosition = 1; // start slid out
|
thumbnail.slidePosition = 1; // start slid out
|
||||||
this._haveNewThumbnails = true;
|
this._haveNewThumbnails = true;
|
||||||
@ -936,6 +879,9 @@ const ThumbnailsBox = new Lang.Class({
|
|||||||
|
|
||||||
// The thumbnails indicator actually needs to be on top of the thumbnails
|
// The thumbnails indicator actually needs to be on top of the thumbnails
|
||||||
this._indicator.raise_top();
|
this._indicator.raise_top();
|
||||||
|
|
||||||
|
// Clear the splice index, we got the message
|
||||||
|
this._spliceIndex = -1;
|
||||||
},
|
},
|
||||||
|
|
||||||
removeThumbnails: function(start, count) {
|
removeThumbnails: function(start, count) {
|
||||||
|
@ -386,6 +386,15 @@ const WorkspacesView = new Lang.Class({
|
|||||||
let current = Math.round(adj.value);
|
let current = Math.round(adj.value);
|
||||||
|
|
||||||
if (active != current) {
|
if (active != current) {
|
||||||
|
if (!this._workspaces[current]) {
|
||||||
|
// The current workspace was destroyed. This could happen
|
||||||
|
// when you are on the last empty workspace, and consolidate
|
||||||
|
// windows using the thumbnail bar.
|
||||||
|
// In that case, the intended behavior is to stay on the empty
|
||||||
|
// workspace, which is the last one, so pick it.
|
||||||
|
current = this._workspaces.length - 1;
|
||||||
|
}
|
||||||
|
|
||||||
let metaWorkspace = this._workspaces[current].metaWorkspace;
|
let metaWorkspace = this._workspaces[current].metaWorkspace;
|
||||||
metaWorkspace.activate(global.get_current_time());
|
metaWorkspace.activate(global.get_current_time());
|
||||||
}
|
}
|
||||||
|
@ -60,6 +60,7 @@ sr@latin
|
|||||||
sv
|
sv
|
||||||
ta
|
ta
|
||||||
te
|
te
|
||||||
|
tg
|
||||||
th
|
th
|
||||||
tr
|
tr
|
||||||
ug
|
ug
|
||||||
|
File diff suppressed because it is too large
Load Diff
1164
po/en_GB.po
1164
po/en_GB.po
File diff suppressed because it is too large
Load Diff
275
po/et.po
275
po/et.po
@ -13,8 +13,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: 2012-12-09 13:03+0000\n"
|
"POT-Creation-Date: 2013-03-11 22:02+0000\n"
|
||||||
"PO-Revision-Date: 2012-12-19 16:47+0300\n"
|
"PO-Revision-Date: 2013-03-12 16:28+0300\n"
|
||||||
"Last-Translator: Mattias Põldaru <mahfiaz@gmail.com>\n"
|
"Last-Translator: Mattias Põldaru <mahfiaz@gmail.com>\n"
|
||||||
"Language-Team: Estonian <>\n"
|
"Language-Team: Estonian <>\n"
|
||||||
"Language: et\n"
|
"Language: et\n"
|
||||||
@ -104,6 +104,16 @@ msgid ""
|
|||||||
"favorites area."
|
"favorites area."
|
||||||
msgstr "Nendele tunnustele vastavaid rakendusi kuvatakse lemmikutes."
|
msgstr "Nendele tunnustele vastavaid rakendusi kuvatakse lemmikutes."
|
||||||
|
|
||||||
|
msgid "List of categories that should be displayed as folders"
|
||||||
|
msgstr "Kategooriad, mida tuleb kuvada kaustadena"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Each category name in this list will be represented as folder in the "
|
||||||
|
"application view, rather than being displayed inline in the main view."
|
||||||
|
msgstr ""
|
||||||
|
"Kõiki selles loetelus olevaid kategooriaid kuvatakse rakenduste vaates "
|
||||||
|
"kaustadena, mitte peavaates teistega koos."
|
||||||
|
|
||||||
msgid "History for command (Alt-F2) dialog"
|
msgid "History for command (Alt-F2) dialog"
|
||||||
msgstr "Käsudialoogi (Alt-F2) ajalugu"
|
msgstr "Käsudialoogi (Alt-F2) ajalugu"
|
||||||
|
|
||||||
@ -135,12 +145,6 @@ msgstr ""
|
|||||||
"See võti keelab automaatse 'Logi välja' menüükirje peitmise, kui arvutis on "
|
"See võti keelab automaatse 'Logi välja' menüükirje peitmise, kui arvutis on "
|
||||||
"üks kasutaja ning avatud üks seanss."
|
"üks kasutaja ning avatud üks seanss."
|
||||||
|
|
||||||
msgid "Show full name in the user menu"
|
|
||||||
msgstr "Kasutajamenüüs näidatakse kasutaja tervet nime"
|
|
||||||
|
|
||||||
msgid "Whether the users full name is shown in the user menu or not."
|
|
||||||
msgstr "Kas kasutajamenüüs näidatakse kasutaja kogu nime või mitte."
|
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Whether to remember password for mounting encrypted or remote filesystems"
|
"Whether to remember password for mounting encrypted or remote filesystems"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -299,12 +303,8 @@ msgstr "Laiendus"
|
|||||||
msgid "Select an extension to configure using the combobox above."
|
msgid "Select an extension to configure using the combobox above."
|
||||||
msgstr "Vali seadistatav laiendus kasutades ülemist valikukasti."
|
msgstr "Vali seadistatav laiendus kasutades ülemist valikukasti."
|
||||||
|
|
||||||
msgid "Session..."
|
msgid "Session…"
|
||||||
msgstr "Seanss..."
|
msgstr "Seanss…"
|
||||||
|
|
||||||
msgctxt "title"
|
|
||||||
msgid "Sign In"
|
|
||||||
msgstr "Sisselogimine"
|
|
||||||
|
|
||||||
#. translators: this message is shown below the user list on the
|
#. translators: this message is shown below the user list on the
|
||||||
#. login screen. It can be activated to reveal an entry for
|
#. login screen. It can be activated to reveal an entry for
|
||||||
@ -368,16 +368,12 @@ msgstr "Käsku pole võimalik analüüsida:"
|
|||||||
msgid "Execution of '%s' failed:"
|
msgid "Execution of '%s' failed:"
|
||||||
msgstr "'%s' käivitamine nurjus:"
|
msgstr "'%s' käivitamine nurjus:"
|
||||||
|
|
||||||
#. Translators: Filter to display all applications
|
msgid "Frequent"
|
||||||
|
msgstr "Sage"
|
||||||
|
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Kõik"
|
msgstr "Kõik"
|
||||||
|
|
||||||
msgid "APPLICATIONS"
|
|
||||||
msgstr "RAKENDUSED"
|
|
||||||
|
|
||||||
msgid "SETTINGS"
|
|
||||||
msgstr "SEADED"
|
|
||||||
|
|
||||||
msgid "New Window"
|
msgid "New Window"
|
||||||
msgstr "Uus aken"
|
msgstr "Uus aken"
|
||||||
|
|
||||||
@ -395,6 +391,12 @@ msgstr "%s lisati lemmikutesse."
|
|||||||
msgid "%s has been removed from your favorites."
|
msgid "%s has been removed from your favorites."
|
||||||
msgstr "%s eemaldati lemmikutest."
|
msgstr "%s eemaldati lemmikutest."
|
||||||
|
|
||||||
|
msgid "Settings"
|
||||||
|
msgstr "Sätted"
|
||||||
|
|
||||||
|
msgid "Change Background…"
|
||||||
|
msgstr "Muuda tausta…"
|
||||||
|
|
||||||
#. Translators: Shown in calendar event list for all day events
|
#. Translators: Shown in calendar event list for all day events
|
||||||
#. * Keep it short, best if you can use less then 10 characters
|
#. * Keep it short, best if you can use less then 10 characters
|
||||||
#.
|
#.
|
||||||
@ -402,15 +404,18 @@ msgctxt "event list time"
|
|||||||
msgid "All Day"
|
msgid "All Day"
|
||||||
msgstr "Kogu päev"
|
msgstr "Kogu päev"
|
||||||
|
|
||||||
#. Translators: Shown in calendar event list, if 24h format
|
#. Translators: Shown in calendar event list, if 24h format,
|
||||||
|
#. \u2236 is a ratio character, similar to :
|
||||||
msgctxt "event list time"
|
msgctxt "event list time"
|
||||||
msgid "%H:%M"
|
msgid "%H\\u2236%M"
|
||||||
msgstr "%H:%M"
|
msgstr "%H\\u2236%M"
|
||||||
|
|
||||||
#. Transators: Shown in calendar event list, if 12h format
|
#. Transators: Shown in calendar event list, if 12h format,
|
||||||
|
#. \u2236 is a ratio character, similar to : and \u2009 is
|
||||||
|
#. a thin space
|
||||||
msgctxt "event list time"
|
msgctxt "event list time"
|
||||||
msgid "%l:%M %p"
|
msgid "%l\\u2236%M\\u2009%p"
|
||||||
msgstr "%l:%M %p"
|
msgstr "%l\\u2236%M\\u2009%p"
|
||||||
|
|
||||||
#. Translators: Calendar grid abbreviation for Sunday.
|
#. Translators: Calendar grid abbreviation for Sunday.
|
||||||
#. *
|
#. *
|
||||||
@ -517,6 +522,12 @@ msgstr "Käesolev nädal"
|
|||||||
msgid "Next week"
|
msgid "Next week"
|
||||||
msgstr "Järgmine nädal"
|
msgstr "Järgmine nädal"
|
||||||
|
|
||||||
|
msgid "External drive connected"
|
||||||
|
msgstr "Väline ketas ühendati"
|
||||||
|
|
||||||
|
msgid "External drive disconnected"
|
||||||
|
msgstr "Väline ketas eemaldati"
|
||||||
|
|
||||||
msgid "Removable Devices"
|
msgid "Removable Devices"
|
||||||
msgstr "Eemaldatavad seadmed"
|
msgstr "Eemaldatavad seadmed"
|
||||||
|
|
||||||
@ -801,12 +812,20 @@ msgstr "Aknad"
|
|||||||
msgid "Show Applications"
|
msgid "Show Applications"
|
||||||
msgstr "Rakenduste kuvamine"
|
msgstr "Rakenduste kuvamine"
|
||||||
|
|
||||||
msgid "Date and Time Settings"
|
#. Translators: this is the name of the dock/favorites area on
|
||||||
msgstr "Kuupäeva ja kellaaja sätted"
|
#. the left of the overview
|
||||||
|
msgid "Dash"
|
||||||
|
msgstr "Dokk"
|
||||||
|
|
||||||
msgid "Open Calendar"
|
msgid "Open Calendar"
|
||||||
msgstr "Ava kalender"
|
msgstr "Ava kalender"
|
||||||
|
|
||||||
|
msgid "Open Clocks"
|
||||||
|
msgstr "Ava kell"
|
||||||
|
|
||||||
|
msgid "Date & Time Settings"
|
||||||
|
msgstr "Kuupäeva ja kella sätted"
|
||||||
|
|
||||||
#. 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").
|
||||||
#.
|
#.
|
||||||
@ -897,9 +916,6 @@ msgstr "Paigalda"
|
|||||||
msgid "Download and install '%s' from extensions.gnome.org?"
|
msgid "Download and install '%s' from extensions.gnome.org?"
|
||||||
msgstr "Kas laadida alla ja paigaldada '%s' aadressilt extensions.gnome.org?"
|
msgstr "Kas laadida alla ja paigaldada '%s' aadressilt extensions.gnome.org?"
|
||||||
|
|
||||||
msgid "tray"
|
|
||||||
msgstr "salv"
|
|
||||||
|
|
||||||
msgid "Keyboard"
|
msgid "Keyboard"
|
||||||
msgstr "Klaviatuur"
|
msgstr "Klaviatuur"
|
||||||
|
|
||||||
@ -920,6 +936,8 @@ msgstr "Näita vigu"
|
|||||||
msgid "Enabled"
|
msgid "Enabled"
|
||||||
msgstr "Lubatud"
|
msgstr "Lubatud"
|
||||||
|
|
||||||
|
#. translators:
|
||||||
|
#. * The device has been disabled
|
||||||
msgid "Disabled"
|
msgid "Disabled"
|
||||||
msgstr "Keelatud"
|
msgstr "Keelatud"
|
||||||
|
|
||||||
@ -944,6 +962,12 @@ msgstr "Ava"
|
|||||||
msgid "Remove"
|
msgid "Remove"
|
||||||
msgstr "Eemalda"
|
msgstr "Eemalda"
|
||||||
|
|
||||||
|
msgid "Clear Messages"
|
||||||
|
msgstr "Kustuta teated"
|
||||||
|
|
||||||
|
msgid "Notification Settings"
|
||||||
|
msgstr "Märguannete sätted"
|
||||||
|
|
||||||
msgid "No Messages"
|
msgid "No Messages"
|
||||||
msgstr "Teateid pole"
|
msgstr "Teateid pole"
|
||||||
|
|
||||||
@ -957,6 +981,12 @@ msgctxt "program"
|
|||||||
msgid "Unknown"
|
msgid "Unknown"
|
||||||
msgstr "Tundmatu"
|
msgstr "Tundmatu"
|
||||||
|
|
||||||
|
#, c-format
|
||||||
|
msgid "%d new message"
|
||||||
|
msgid_plural "%d new messages"
|
||||||
|
msgstr[0] "%d uus sõnum"
|
||||||
|
msgstr[1] "%d uut sõnumit"
|
||||||
|
|
||||||
msgid "Undo"
|
msgid "Undo"
|
||||||
msgstr "Võta tagasi"
|
msgstr "Võta tagasi"
|
||||||
|
|
||||||
@ -967,13 +997,8 @@ msgstr "Ülevaade"
|
|||||||
#. in the search entry when no search is
|
#. in the search entry when no search is
|
||||||
#. active; it should not exceed ~30
|
#. active; it should not exceed ~30
|
||||||
#. characters.
|
#. characters.
|
||||||
msgid "Type to search..."
|
msgid "Type to search…"
|
||||||
msgstr "Otsing..."
|
msgstr "Otsing…"
|
||||||
|
|
||||||
#. Translators: this is the name of the dock/favorites area on
|
|
||||||
#. the left of the overview
|
|
||||||
msgid "Dash"
|
|
||||||
msgstr "Dokk"
|
|
||||||
|
|
||||||
msgid "Quit"
|
msgid "Quit"
|
||||||
msgstr "Sulge"
|
msgstr "Sulge"
|
||||||
@ -1005,12 +1030,6 @@ msgstr "Sulge"
|
|||||||
msgid "%A, %B %d"
|
msgid "%A, %B %d"
|
||||||
msgstr "%A, %d. %B"
|
msgstr "%A, %d. %B"
|
||||||
|
|
||||||
#, c-format
|
|
||||||
msgid "%d new message"
|
|
||||||
msgid_plural "%d new messages"
|
|
||||||
msgstr[0] "%d uus sõnum"
|
|
||||||
msgstr[1] "%d uut sõnumit"
|
|
||||||
|
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%d new notification"
|
msgid "%d new notification"
|
||||||
msgid_plural "%d new notifications"
|
msgid_plural "%d new notifications"
|
||||||
@ -1020,8 +1039,24 @@ msgstr[1] "%d uut märguannet"
|
|||||||
msgid "Lock"
|
msgid "Lock"
|
||||||
msgstr "Lukusta"
|
msgstr "Lukusta"
|
||||||
|
|
||||||
msgid "Searching..."
|
msgid "GNOME needs to lock the screen"
|
||||||
msgstr "Otsimine..."
|
msgstr "GNOME peab ekraani lukustama"
|
||||||
|
|
||||||
|
#. We could not become modal, so we can't activate the
|
||||||
|
#. screenshield. The user is probably very upset at this
|
||||||
|
#. point, but any application using global grabs is broken
|
||||||
|
#. Just tell him to stop using this app
|
||||||
|
#.
|
||||||
|
#. XXX: another option is to kick the user into the gdm login
|
||||||
|
#. screen, where we're not affected by grabs
|
||||||
|
msgid "Unable to lock"
|
||||||
|
msgstr "Pole võimalik lukustada"
|
||||||
|
|
||||||
|
msgid "Lock was blocked by an application"
|
||||||
|
msgstr "Rakendus blokeeris lukustamise"
|
||||||
|
|
||||||
|
msgid "Searching…"
|
||||||
|
msgstr "Otsing…"
|
||||||
|
|
||||||
msgid "No results."
|
msgid "No results."
|
||||||
msgstr "Tulemused puuduvad."
|
msgstr "Tulemused puuduvad."
|
||||||
@ -1089,11 +1124,11 @@ msgstr "Bluetooth"
|
|||||||
msgid "Visibility"
|
msgid "Visibility"
|
||||||
msgstr "Nähtavus"
|
msgstr "Nähtavus"
|
||||||
|
|
||||||
msgid "Send Files to Device..."
|
msgid "Send Files to Device…"
|
||||||
msgstr "Failide saatmine seadmesse..."
|
msgstr "Failide saatmine seadmesse…"
|
||||||
|
|
||||||
msgid "Set up a New Device..."
|
msgid "Set Up a New Device…"
|
||||||
msgstr "Uue seadme häälestamine..."
|
msgstr "Uue seadme häälestamine…"
|
||||||
|
|
||||||
msgid "Bluetooth Settings"
|
msgid "Bluetooth Settings"
|
||||||
msgstr "Bluetoothi sätted"
|
msgstr "Bluetoothi sätted"
|
||||||
@ -1111,8 +1146,8 @@ msgstr "ühenduse katkestamine..."
|
|||||||
msgid "connecting..."
|
msgid "connecting..."
|
||||||
msgstr "ühendumine..."
|
msgstr "ühendumine..."
|
||||||
|
|
||||||
msgid "Send Files..."
|
msgid "Send Files…"
|
||||||
msgstr "Failide saatmine..."
|
msgstr "Failide saatmine…"
|
||||||
|
|
||||||
msgid "Keyboard Settings"
|
msgid "Keyboard Settings"
|
||||||
msgstr "Klaviatuurisätted"
|
msgstr "Klaviatuurisätted"
|
||||||
@ -1173,7 +1208,7 @@ msgstr "Olgu"
|
|||||||
msgid "Show Keyboard Layout"
|
msgid "Show Keyboard Layout"
|
||||||
msgstr "Klaviatuuripaigutuse kuvamine"
|
msgstr "Klaviatuuripaigutuse kuvamine"
|
||||||
|
|
||||||
msgid "Region and Language Settings"
|
msgid "Region & Language Settings"
|
||||||
msgstr "Asukoha ja keele sätted"
|
msgstr "Asukoha ja keele sätted"
|
||||||
|
|
||||||
msgid "Volume, network, battery"
|
msgid "Volume, network, battery"
|
||||||
@ -1212,17 +1247,23 @@ msgstr "pole saadaval"
|
|||||||
msgid "connection failed"
|
msgid "connection failed"
|
||||||
msgstr "ühendumine nurjus"
|
msgstr "ühendumine nurjus"
|
||||||
|
|
||||||
msgid "More..."
|
msgid "More…"
|
||||||
msgstr "Veel..."
|
msgstr "Veel…"
|
||||||
|
|
||||||
#. TRANSLATORS: this is the indication that a connection for another logged in user is active,
|
#. TRANSLATORS: this is the indication that a connection for another logged in user is active,
|
||||||
#. and we cannot access its settings (including the name)
|
#. and we cannot access its settings (including the name)
|
||||||
msgid "Connected (private)"
|
msgid "Connected (private)"
|
||||||
msgstr "Ühendatud (privaatne)"
|
msgstr "Ühendatud (privaatne)"
|
||||||
|
|
||||||
|
msgid "Wired"
|
||||||
|
msgstr "Juhtmega"
|
||||||
|
|
||||||
msgid "Auto Ethernet"
|
msgid "Auto Ethernet"
|
||||||
msgstr "Automaatne ethernet"
|
msgstr "Automaatne ethernet"
|
||||||
|
|
||||||
|
msgid "Mobile broadband"
|
||||||
|
msgstr "Mobiiliühendus"
|
||||||
|
|
||||||
msgid "Auto broadband"
|
msgid "Auto broadband"
|
||||||
msgstr "Automaatne lairibaühendus"
|
msgstr "Automaatne lairibaühendus"
|
||||||
|
|
||||||
@ -1269,8 +1310,8 @@ msgstr "Toitesätted..."
|
|||||||
|
|
||||||
#. 0 is reported when UPower does not have enough data
|
#. 0 is reported when UPower does not have enough data
|
||||||
#. to estimate battery life
|
#. to estimate battery life
|
||||||
msgid "Estimating..."
|
msgid "Estimating…"
|
||||||
msgstr "Andmete kogumine..."
|
msgstr "Andmete kogumine…"
|
||||||
|
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%d hour remaining"
|
msgid "%d hour remaining"
|
||||||
@ -1304,10 +1345,10 @@ msgctxt "percent of battery remaining"
|
|||||||
msgid "%d%%"
|
msgid "%d%%"
|
||||||
msgstr "%d%%"
|
msgstr "%d%%"
|
||||||
|
|
||||||
msgid "AC adapter"
|
msgid "AC Adapter"
|
||||||
msgstr "Võrgutoite adapter"
|
msgstr "Laadija"
|
||||||
|
|
||||||
msgid "Laptop battery"
|
msgid "Laptop Battery"
|
||||||
msgstr "Sülearvuti aku"
|
msgstr "Sülearvuti aku"
|
||||||
|
|
||||||
msgid "UPS"
|
msgid "UPS"
|
||||||
@ -1322,10 +1363,10 @@ msgstr "Hiir"
|
|||||||
msgid "PDA"
|
msgid "PDA"
|
||||||
msgstr "Elektronmärkmik"
|
msgstr "Elektronmärkmik"
|
||||||
|
|
||||||
msgid "Cell phone"
|
msgid "Cell Phone"
|
||||||
msgstr "Mobiiltelefon"
|
msgstr "Mobiiltelefon"
|
||||||
|
|
||||||
msgid "Media player"
|
msgid "Media Player"
|
||||||
msgstr "Meediaesitaja"
|
msgstr "Meediaesitaja"
|
||||||
|
|
||||||
msgid "Tablet"
|
msgid "Tablet"
|
||||||
@ -1338,6 +1379,9 @@ msgctxt "device"
|
|||||||
msgid "Unknown"
|
msgid "Unknown"
|
||||||
msgstr "Tundmatu"
|
msgstr "Tundmatu"
|
||||||
|
|
||||||
|
msgid "Volume changed"
|
||||||
|
msgstr "Helivaljus muutus"
|
||||||
|
|
||||||
#. Translators: This is the label for audio volume
|
#. Translators: This is the label for audio volume
|
||||||
msgid "Volume"
|
msgid "Volume"
|
||||||
msgstr "Helivaljus"
|
msgstr "Helivaljus"
|
||||||
@ -1372,9 +1416,6 @@ msgstr "Ühendamata"
|
|||||||
msgid "Notifications"
|
msgid "Notifications"
|
||||||
msgstr "Märguanded"
|
msgstr "Märguanded"
|
||||||
|
|
||||||
msgid "Settings"
|
|
||||||
msgstr "Sätted"
|
|
||||||
|
|
||||||
msgid "Switch User"
|
msgid "Switch User"
|
||||||
msgstr "Vaheta kasutajat"
|
msgstr "Vaheta kasutajat"
|
||||||
|
|
||||||
@ -1394,6 +1435,22 @@ msgstr ""
|
|||||||
"Märguanded on nüüd keelatud, sealhulgas vestlusteated. Sinu netiolekut "
|
"Märguanded on nüüd keelatud, sealhulgas vestlusteated. Sinu netiolekut "
|
||||||
"muudeti, et teised teaksid, et sa ei pruugi nende teateid näha."
|
"muudeti, et teised teaksid, et sa ei pruugi nende teateid näha."
|
||||||
|
|
||||||
|
msgid "Other users are logged in."
|
||||||
|
msgstr "Teised kasutajad on sisse logitud."
|
||||||
|
|
||||||
|
msgid "Shutting down might cause them to lose unsaved work."
|
||||||
|
msgstr "Väljalülitamine võib põhjustada salvestamata töö kaotsimineku."
|
||||||
|
|
||||||
|
#. Translators: Remote here refers to a remote session, like a ssh login
|
||||||
|
#, c-format
|
||||||
|
msgid "%s (remote)"
|
||||||
|
msgstr "%s (kaugühendus)"
|
||||||
|
|
||||||
|
#. Translators: Console here refers to a tty like a VT console
|
||||||
|
#, c-format
|
||||||
|
msgid "%s (console)"
|
||||||
|
msgstr "%s (konsool)"
|
||||||
|
|
||||||
msgid "Applications"
|
msgid "Applications"
|
||||||
msgstr "Rakendused"
|
msgstr "Rakendused"
|
||||||
|
|
||||||
@ -1412,9 +1469,6 @@ msgstr ""
|
|||||||
msgid "%s the Oracle says"
|
msgid "%s the Oracle says"
|
||||||
msgstr "Oraakel %s ütleb"
|
msgstr "Oraakel %s ütleb"
|
||||||
|
|
||||||
msgid "Your favorite Easter Egg"
|
|
||||||
msgstr "Sinu lemmiküllatusmuna"
|
|
||||||
|
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "'%s' is ready"
|
msgid "'%s' is ready"
|
||||||
msgstr "'%s' on valmis"
|
msgstr "'%s' on valmis"
|
||||||
@ -1422,6 +1476,25 @@ msgstr "'%s' on valmis"
|
|||||||
msgid "Evolution Calendar"
|
msgid "Evolution Calendar"
|
||||||
msgstr "Evolutioni kalender"
|
msgstr "Evolutioni kalender"
|
||||||
|
|
||||||
|
#. translators:
|
||||||
|
#. * The number of sound outputs on a particular device
|
||||||
|
#, c-format
|
||||||
|
msgid "%u Output"
|
||||||
|
msgid_plural "%u Outputs"
|
||||||
|
msgstr[0] "%u väljund"
|
||||||
|
msgstr[1] "%u väljundit"
|
||||||
|
|
||||||
|
#. translators:
|
||||||
|
#. * The number of sound inputs on a particular device
|
||||||
|
#, c-format
|
||||||
|
msgid "%u Input"
|
||||||
|
msgid_plural "%u Inputs"
|
||||||
|
msgstr[0] "%u sisend"
|
||||||
|
msgstr[1] "%u sisendit"
|
||||||
|
|
||||||
|
msgid "System Sounds"
|
||||||
|
msgstr "Süsteemi helid"
|
||||||
|
|
||||||
msgid "Print version"
|
msgid "Print version"
|
||||||
msgstr "Printimise versioon"
|
msgstr "Printimise versioon"
|
||||||
|
|
||||||
@ -1444,15 +1517,48 @@ msgstr "Paroolid ei kattu."
|
|||||||
msgid "Password cannot be blank"
|
msgid "Password cannot be blank"
|
||||||
msgstr "Parool ei saa olla tühi"
|
msgstr "Parool ei saa olla tühi"
|
||||||
|
|
||||||
msgid "United Kingdom"
|
|
||||||
msgstr "Suurbritannia"
|
|
||||||
|
|
||||||
msgid "Default"
|
|
||||||
msgstr "Vaikimisi"
|
|
||||||
|
|
||||||
msgid "Authentication dialog was dismissed by the user"
|
msgid "Authentication dialog was dismissed by the user"
|
||||||
msgstr "Kasutaja katkestas autentimisdialoogi"
|
msgstr "Kasutaja katkestas autentimisdialoogi"
|
||||||
|
|
||||||
|
#~ msgid "Show full name in the user menu"
|
||||||
|
#~ msgstr "Kasutajamenüüs näidatakse kasutaja tervet nime"
|
||||||
|
|
||||||
|
#~ msgid "Whether the users full name is shown in the user menu or not."
|
||||||
|
#~ msgstr "Kas kasutajamenüüs näidatakse kasutaja kogu nime või mitte."
|
||||||
|
|
||||||
|
#~ msgctxt "title"
|
||||||
|
#~ msgid "Sign In"
|
||||||
|
#~ msgstr "Sisselogimine"
|
||||||
|
|
||||||
|
#~ msgid "APPLICATIONS"
|
||||||
|
#~ msgstr "RAKENDUSED"
|
||||||
|
|
||||||
|
#~ msgid "SETTINGS"
|
||||||
|
#~ msgstr "SEADED"
|
||||||
|
|
||||||
|
#~ msgctxt "event list time"
|
||||||
|
#~ msgid "%H:%M"
|
||||||
|
#~ msgstr "%H:%M"
|
||||||
|
|
||||||
|
#~ msgctxt "event list time"
|
||||||
|
#~ msgid "%l:%M %p"
|
||||||
|
#~ msgstr "%l:%M %p"
|
||||||
|
|
||||||
|
#~ msgid "tray"
|
||||||
|
#~ msgstr "salv"
|
||||||
|
|
||||||
|
#~ msgid "More..."
|
||||||
|
#~ msgstr "Veel..."
|
||||||
|
|
||||||
|
#~ msgid "Your favorite Easter Egg"
|
||||||
|
#~ msgstr "Sinu lemmiküllatusmuna"
|
||||||
|
|
||||||
|
#~ msgid "United Kingdom"
|
||||||
|
#~ msgstr "Suurbritannia"
|
||||||
|
|
||||||
|
#~ msgid "Default"
|
||||||
|
#~ msgstr "Vaikimisi"
|
||||||
|
|
||||||
#~ msgid "Subscription request"
|
#~ msgid "Subscription request"
|
||||||
#~ msgstr "Tellimuse päring"
|
#~ msgstr "Tellimuse päring"
|
||||||
|
|
||||||
@ -1471,28 +1577,9 @@ msgstr "Kasutaja katkestas autentimisdialoogi"
|
|||||||
#~ msgid "Reconnect"
|
#~ msgid "Reconnect"
|
||||||
#~ msgstr "Ühendu uuesti"
|
#~ msgstr "Ühendu uuesti"
|
||||||
|
|
||||||
#~ msgid "Wired"
|
|
||||||
#~ msgstr "Juhtmega"
|
|
||||||
|
|
||||||
#~ msgid "Wireless"
|
#~ msgid "Wireless"
|
||||||
#~ msgstr "Juhtmeta"
|
#~ msgstr "Juhtmeta"
|
||||||
|
|
||||||
#~ msgid "Mobile broadband"
|
|
||||||
#~ msgstr "Mobiiliühendus"
|
|
||||||
|
|
||||||
#~ msgid "%u Output"
|
|
||||||
#~ msgid_plural "%u Outputs"
|
|
||||||
#~ msgstr[0] "%u väljund"
|
|
||||||
#~ msgstr[1] "%u väljundit"
|
|
||||||
|
|
||||||
#~ msgid "%u Input"
|
|
||||||
#~ msgid_plural "%u Inputs"
|
|
||||||
#~ msgstr[0] "%u sisend"
|
|
||||||
#~ msgstr[1] "%u sisendit"
|
|
||||||
|
|
||||||
#~ msgid "System Sounds"
|
|
||||||
#~ msgstr "Süsteemi helid"
|
|
||||||
|
|
||||||
#~ msgid "disabled OpenSearch providers"
|
#~ msgid "disabled OpenSearch providers"
|
||||||
#~ msgstr "keelatud OpenSearch pakkujad"
|
#~ msgstr "keelatud OpenSearch pakkujad"
|
||||||
|
|
||||||
|
157
po/nb.po
157
po/nb.po
@ -6,10 +6,10 @@
|
|||||||
# Torstein Adolf Winterseth <kvikende@fsfe.org>, 2010.
|
# Torstein Adolf Winterseth <kvikende@fsfe.org>, 2010.
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: gnome-shell 3.7.x\n"
|
"Project-Id-Version: gnome-shell 3.8.x\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2013-03-04 14:14+0100\n"
|
"POT-Creation-Date: 2013-04-03 13:31+0200\n"
|
||||||
"PO-Revision-Date: 2013-03-04 14:15+0100\n"
|
"PO-Revision-Date: 2013-04-03 13:31+0200\n"
|
||||||
"Last-Translator: Kjartan Maraas <kmaraas@gnome.org>\n"
|
"Last-Translator: Kjartan Maraas <kmaraas@gnome.org>\n"
|
||||||
"Language-Team: Norwegian bokmål <i18n-nb@lister.ping.uio.no>\n"
|
"Language-Team: Norwegian bokmål <i18n-nb@lister.ping.uio.no>\n"
|
||||||
"Language: \n"
|
"Language: \n"
|
||||||
@ -295,7 +295,8 @@ msgstr "Fest modal dialog til opphavsvinduet"
|
|||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:43
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:43
|
||||||
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 "Denne nøkkelen overstyrer nøkkelen i org.gnome.mutter når GNOME Shell kjøres."
|
msgstr ""
|
||||||
|
"Denne nøkkelen overstyrer nøkkelen i org.gnome.mutter når GNOME Shell kjøres."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:44
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:44
|
||||||
msgid "Arrangement of buttons on the titlebar"
|
msgid "Arrangement of buttons on the titlebar"
|
||||||
@ -305,7 +306,9 @@ msgstr "Plassering av knappene på tittellinjen"
|
|||||||
msgid ""
|
msgid ""
|
||||||
"This key overrides the key in org.gnome.desktop.wm.preferences when running "
|
"This key overrides the key in org.gnome.desktop.wm.preferences when running "
|
||||||
"GNOME Shell."
|
"GNOME Shell."
|
||||||
msgstr "Denne nøkkelen overstyrer nøkkelen i org.gnome.desktop.wm.preferences når GNOME Shell kjøres."
|
msgstr ""
|
||||||
|
"Denne nøkkelen overstyrer nøkkelen i org.gnome.desktop.wm.preferences når "
|
||||||
|
"GNOME Shell kjøres."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:46
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:46
|
||||||
msgid "Enable edge tiling when dropping windows on screen edges"
|
msgid "Enable edge tiling when dropping windows on screen edges"
|
||||||
@ -339,36 +342,36 @@ msgstr "Økt …"
|
|||||||
#. translators: this message is shown below the user list on the
|
#. translators: this message is shown below the user list on the
|
||||||
#. login screen. It can be activated to reveal an entry for
|
#. login screen. It can be activated to reveal an entry for
|
||||||
#. manually entering the username.
|
#. manually entering the username.
|
||||||
#: ../js/gdm/loginDialog.js:629
|
#: ../js/gdm/loginDialog.js:630
|
||||||
msgid "Not listed?"
|
msgid "Not listed?"
|
||||||
msgstr "Ikke listet?"
|
msgstr "Ikke listet?"
|
||||||
|
|
||||||
#: ../js/gdm/loginDialog.js:783 ../js/ui/components/networkAgent.js:137
|
#: ../js/gdm/loginDialog.js:786 ../js/ui/components/networkAgent.js:137
|
||||||
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:375
|
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:375
|
||||||
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
|
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
|
||||||
#: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:126
|
#: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:99
|
||||||
#: ../js/ui/userMenu.js:934
|
#: ../js/ui/userMenu.js:938
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Avbryt"
|
msgstr "Avbryt"
|
||||||
|
|
||||||
#: ../js/gdm/loginDialog.js:799
|
#: ../js/gdm/loginDialog.js:802
|
||||||
msgctxt "button"
|
msgctxt "button"
|
||||||
msgid "Sign In"
|
msgid "Sign In"
|
||||||
msgstr "Logg inn"
|
msgstr "Logg inn"
|
||||||
|
|
||||||
#: ../js/gdm/loginDialog.js:799
|
#: ../js/gdm/loginDialog.js:802
|
||||||
msgid "Next"
|
msgid "Next"
|
||||||
msgstr "Neste"
|
msgstr "Neste"
|
||||||
|
|
||||||
#. TTLS and PEAP are actually much more complicated, but this complication
|
#. TTLS and PEAP are actually much more complicated, but this complication
|
||||||
#. is not visible here since we only care about phase2 authentication
|
#. is not visible here since we only care about phase2 authentication
|
||||||
#. (and don't even care of which one)
|
#. (and don't even care of which one)
|
||||||
#: ../js/gdm/loginDialog.js:904 ../js/ui/components/networkAgent.js:260
|
#: ../js/gdm/loginDialog.js:917 ../js/ui/components/networkAgent.js:260
|
||||||
#: ../js/ui/components/networkAgent.js:278
|
#: ../js/ui/components/networkAgent.js:278
|
||||||
msgid "Username: "
|
msgid "Username: "
|
||||||
msgstr "Brukernavn: "
|
msgstr "Brukernavn: "
|
||||||
|
|
||||||
#: ../js/gdm/loginDialog.js:1157
|
#: ../js/gdm/loginDialog.js:1173
|
||||||
msgid "Login Window"
|
msgid "Login Window"
|
||||||
msgstr "Innloggingsvindu"
|
msgstr "Innloggingsvindu"
|
||||||
|
|
||||||
@ -377,8 +380,8 @@ msgstr "Innloggingsvindu"
|
|||||||
msgid "Power"
|
msgid "Power"
|
||||||
msgstr "Strøm"
|
msgstr "Strøm"
|
||||||
|
|
||||||
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:695 ../js/ui/userMenu.js:699
|
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:696 ../js/ui/userMenu.js:700
|
||||||
#: ../js/ui/userMenu.js:815
|
#: ../js/ui/userMenu.js:816
|
||||||
msgid "Suspend"
|
msgid "Suspend"
|
||||||
msgstr "Hvilemodus"
|
msgstr "Hvilemodus"
|
||||||
|
|
||||||
@ -386,58 +389,58 @@ msgstr "Hvilemodus"
|
|||||||
msgid "Restart"
|
msgid "Restart"
|
||||||
msgstr "Start på nytt"
|
msgstr "Start på nytt"
|
||||||
|
|
||||||
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:697
|
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:698
|
||||||
#: ../js/ui/userMenu.js:699 ../js/ui/userMenu.js:814 ../js/ui/userMenu.js:938
|
#: ../js/ui/userMenu.js:700 ../js/ui/userMenu.js:815 ../js/ui/userMenu.js:942
|
||||||
msgid "Power Off"
|
msgid "Power Off"
|
||||||
msgstr "Slå av"
|
msgstr "Slå av"
|
||||||
|
|
||||||
#: ../js/gdm/util.js:182
|
#: ../js/gdm/util.js:249
|
||||||
msgid "Authentication error"
|
msgid "Authentication error"
|
||||||
msgstr "Autentiseringsfeil"
|
msgstr "Autentiseringsfeil"
|
||||||
|
|
||||||
#. Translators: this message is shown below the password entry field
|
#. Translators: this message is shown below the password entry field
|
||||||
#. to indicate the user can swipe their finger instead
|
#. to indicate the user can swipe their finger instead
|
||||||
#: ../js/gdm/util.js:299
|
#: ../js/gdm/util.js:366
|
||||||
msgid "(or swipe finger)"
|
msgid "(or swipe finger)"
|
||||||
msgstr "(eller dra finger)"
|
msgstr "(eller dra finger)"
|
||||||
|
|
||||||
#: ../js/gdm/util.js:324
|
#: ../js/gdm/util.js:391
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "(e.g., user or %s)"
|
msgid "(e.g., user or %s)"
|
||||||
msgstr "(f.eks. bruker eller %s)"
|
msgstr "(f.eks. bruker eller %s)"
|
||||||
|
|
||||||
#: ../js/misc/util.js:94
|
#: ../js/misc/util.js:97
|
||||||
msgid "Command not found"
|
msgid "Command not found"
|
||||||
msgstr "Kommando ikke funnet"
|
msgstr "Kommando ikke funnet"
|
||||||
|
|
||||||
#. Replace "Error invoking GLib.shell_parse_argv: " with
|
#. Replace "Error invoking GLib.shell_parse_argv: " with
|
||||||
#. something nicer
|
#. something nicer
|
||||||
#: ../js/misc/util.js:127
|
#: ../js/misc/util.js:130
|
||||||
msgid "Could not parse command:"
|
msgid "Could not parse command:"
|
||||||
msgstr "Klarte ikke å lese kommando:"
|
msgstr "Klarte ikke å lese kommando:"
|
||||||
|
|
||||||
#: ../js/misc/util.js:135
|
#: ../js/misc/util.js:138
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Execution of '%s' failed:"
|
msgid "Execution of '%s' failed:"
|
||||||
msgstr "Kjøring av «%s» feilet:"
|
msgstr "Kjøring av «%s» feilet:"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:348
|
#: ../js/ui/appDisplay.js:349
|
||||||
msgid "Frequent"
|
msgid "Frequent"
|
||||||
msgstr "Ofte"
|
msgstr "Ofte"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:355
|
#: ../js/ui/appDisplay.js:356
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Alle"
|
msgstr "Alle"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:913
|
#: ../js/ui/appDisplay.js:914
|
||||||
msgid "New Window"
|
msgid "New Window"
|
||||||
msgstr "Nytt vindu"
|
msgstr "Nytt vindu"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:916 ../js/ui/dash.js:284
|
#: ../js/ui/appDisplay.js:917 ../js/ui/dash.js:284
|
||||||
msgid "Remove from Favorites"
|
msgid "Remove from Favorites"
|
||||||
msgstr "Fjern fra favoritter"
|
msgstr "Fjern fra favoritter"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:917
|
#: ../js/ui/appDisplay.js:918
|
||||||
msgid "Add to Favorites"
|
msgid "Add to Favorites"
|
||||||
msgstr "Legg til i favoritter"
|
msgstr "Legg til i favoritter"
|
||||||
|
|
||||||
@ -451,7 +454,7 @@ msgstr "%s ble lagt til i dine favoritter."
|
|||||||
msgid "%s has been removed from your favorites."
|
msgid "%s has been removed from your favorites."
|
||||||
msgstr "%s ble fjernet fra dine favoritter."
|
msgstr "%s ble fjernet fra dine favoritter."
|
||||||
|
|
||||||
#: ../js/ui/backgroundMenu.js:19 ../js/ui/userMenu.js:788
|
#: ../js/ui/backgroundMenu.js:19 ../js/ui/userMenu.js:789
|
||||||
msgid "Settings"
|
msgid "Settings"
|
||||||
msgstr "Innstillinger"
|
msgstr "Innstillinger"
|
||||||
|
|
||||||
@ -474,7 +477,7 @@ msgctxt "event list time"
|
|||||||
msgid "%H\\u2236%M"
|
msgid "%H\\u2236%M"
|
||||||
msgstr "%H\\u2336%M"
|
msgstr "%H\\u2336%M"
|
||||||
|
|
||||||
#. Transators: Shown in calendar event list, if 12h format,
|
#. Translators: Shown in calendar event list, if 12h format,
|
||||||
#. \u2236 is a ratio character, similar to : and \u2009 is
|
#. \u2236 is a ratio character, similar to : and \u2009 is
|
||||||
#. a thin space
|
#. a thin space
|
||||||
#: ../js/ui/calendar.js:77
|
#: ../js/ui/calendar.js:77
|
||||||
@ -576,35 +579,35 @@ msgid "S"
|
|||||||
msgstr "Lø"
|
msgstr "Lø"
|
||||||
|
|
||||||
#. Translators: Text to show if there are no events
|
#. Translators: Text to show if there are no events
|
||||||
#: ../js/ui/calendar.js:692
|
#: ../js/ui/calendar.js:720
|
||||||
msgid "Nothing Scheduled"
|
msgid "Nothing Scheduled"
|
||||||
msgstr "Ingenting planlagt"
|
msgstr "Ingenting planlagt"
|
||||||
|
|
||||||
#. 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:708
|
#: ../js/ui/calendar.js:736
|
||||||
msgctxt "calendar heading"
|
msgctxt "calendar heading"
|
||||||
msgid "%A, %B %d"
|
msgid "%A, %B %d"
|
||||||
msgstr "%A %B %d"
|
msgstr "%A %B %d"
|
||||||
|
|
||||||
#. Translators: Shown on calendar heading when selected day occurs on different year
|
#. Translators: Shown on calendar heading when selected day occurs on different year
|
||||||
#: ../js/ui/calendar.js:711
|
#: ../js/ui/calendar.js:739
|
||||||
msgctxt "calendar heading"
|
msgctxt "calendar heading"
|
||||||
msgid "%A, %B %d, %Y"
|
msgid "%A, %B %d, %Y"
|
||||||
msgstr "%A %B %d, %Y"
|
msgstr "%A %B %d, %Y"
|
||||||
|
|
||||||
#: ../js/ui/calendar.js:721
|
#: ../js/ui/calendar.js:749
|
||||||
msgid "Today"
|
msgid "Today"
|
||||||
msgstr "I dag"
|
msgstr "I dag"
|
||||||
|
|
||||||
#: ../js/ui/calendar.js:725
|
#: ../js/ui/calendar.js:753
|
||||||
msgid "Tomorrow"
|
msgid "Tomorrow"
|
||||||
msgstr "I morgen"
|
msgstr "I morgen"
|
||||||
|
|
||||||
#: ../js/ui/calendar.js:736
|
#: ../js/ui/calendar.js:764
|
||||||
msgid "This week"
|
msgid "This week"
|
||||||
msgstr "Denne uken"
|
msgstr "Denne uken"
|
||||||
|
|
||||||
#: ../js/ui/calendar.js:744
|
#: ../js/ui/calendar.js:772
|
||||||
msgid "Next week"
|
msgid "Next week"
|
||||||
msgstr "Neste uke"
|
msgstr "Neste uke"
|
||||||
|
|
||||||
@ -620,12 +623,12 @@ msgstr "Ekstern stasjon koblet fra"
|
|||||||
msgid "Removable Devices"
|
msgid "Removable Devices"
|
||||||
msgstr "Avtagbare enheter"
|
msgstr "Avtagbare enheter"
|
||||||
|
|
||||||
#: ../js/ui/components/autorunManager.js:593
|
#: ../js/ui/components/autorunManager.js:594
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Open with %s"
|
msgid "Open with %s"
|
||||||
msgstr "Åpne med %s"
|
msgstr "Åpne med %s"
|
||||||
|
|
||||||
#: ../js/ui/components/autorunManager.js:619
|
#: ../js/ui/components/autorunManager.js:620
|
||||||
msgid "Eject"
|
msgid "Eject"
|
||||||
msgstr "Løs ut"
|
msgstr "Løs ut"
|
||||||
|
|
||||||
@ -1007,7 +1010,7 @@ msgstr "Innstillinger for dato og klokkeslett"
|
|||||||
#. 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:215
|
||||||
msgid "%A %B %e, %Y"
|
msgid "%A %B %e, %Y"
|
||||||
msgstr "%a %e %B, %Y"
|
msgstr "%a %e %B, %Y"
|
||||||
|
|
||||||
@ -1181,15 +1184,15 @@ msgstr "Tøm meldinger"
|
|||||||
msgid "Notification Settings"
|
msgid "Notification Settings"
|
||||||
msgstr "Innstillinger for varsling"
|
msgstr "Innstillinger for varsling"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:1707
|
#: ../js/ui/messageTray.js:1709
|
||||||
msgid "No Messages"
|
msgid "No Messages"
|
||||||
msgstr "Ingen meldinger"
|
msgstr "Ingen meldinger"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:1787
|
#: ../js/ui/messageTray.js:1782
|
||||||
msgid "Message Tray"
|
msgid "Message Tray"
|
||||||
msgstr "Meldingstrau"
|
msgstr "Meldingstrau"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:2864
|
#: ../js/ui/messageTray.js:2810
|
||||||
msgid "System Information"
|
msgid "System Information"
|
||||||
msgstr "Systeminformasjon"
|
msgstr "Systeminformasjon"
|
||||||
|
|
||||||
@ -1198,14 +1201,14 @@ msgctxt "program"
|
|||||||
msgid "Unknown"
|
msgid "Unknown"
|
||||||
msgstr "Ukjent"
|
msgstr "Ukjent"
|
||||||
|
|
||||||
#: ../js/ui/overviewControls.js:460 ../js/ui/screenShield.js:153
|
#: ../js/ui/overviewControls.js:463 ../js/ui/screenShield.js:149
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%d new message"
|
msgid "%d new message"
|
||||||
msgid_plural "%d new messages"
|
msgid_plural "%d new messages"
|
||||||
msgstr[0] "%d ny melding"
|
msgstr[0] "%d ny melding"
|
||||||
msgstr[1] "%d nye meldinger"
|
msgstr[1] "%d nye meldinger"
|
||||||
|
|
||||||
#: ../js/ui/overview.js:82
|
#: ../js/ui/overview.js:84
|
||||||
msgid "Undo"
|
msgid "Undo"
|
||||||
msgstr "Angre"
|
msgstr "Angre"
|
||||||
|
|
||||||
@ -1217,21 +1220,21 @@ msgstr "Oversikt"
|
|||||||
#. in the search entry when no search is
|
#. in the search entry when no search is
|
||||||
#. active; it should not exceed ~30
|
#. active; it should not exceed ~30
|
||||||
#. characters.
|
#. characters.
|
||||||
#: ../js/ui/overview.js:284
|
#: ../js/ui/overview.js:271
|
||||||
msgid "Type to search…"
|
msgid "Type to search…"
|
||||||
msgstr "Skriv for å søke …"
|
msgstr "Skriv for å søke …"
|
||||||
|
|
||||||
#: ../js/ui/panel.js:613
|
#: ../js/ui/panel.js:612
|
||||||
msgid "Quit"
|
msgid "Quit"
|
||||||
msgstr "Avslutt"
|
msgstr "Avslutt"
|
||||||
|
|
||||||
#. 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:642
|
#: ../js/ui/panel.js:636
|
||||||
msgid "Activities"
|
msgid "Activities"
|
||||||
msgstr "Aktiviteter"
|
msgstr "Aktiviteter"
|
||||||
|
|
||||||
#: ../js/ui/panel.js:983
|
#: ../js/ui/panel.js:933
|
||||||
msgid "Top Bar"
|
msgid "Top Bar"
|
||||||
msgstr "Topp-panel"
|
msgstr "Topp-panel"
|
||||||
|
|
||||||
@ -1244,32 +1247,32 @@ msgstr "Topp-panel"
|
|||||||
msgid "toggle-switch-us"
|
msgid "toggle-switch-us"
|
||||||
msgstr "toggle-switch-intl"
|
msgstr "toggle-switch-intl"
|
||||||
|
|
||||||
#: ../js/ui/runDialog.js:205
|
#: ../js/ui/runDialog.js:73
|
||||||
msgid "Enter a Command"
|
msgid "Enter a Command"
|
||||||
msgstr "Oppgi en kommando"
|
msgstr "Oppgi en kommando"
|
||||||
|
|
||||||
#: ../js/ui/runDialog.js:241
|
#: ../js/ui/runDialog.js:109
|
||||||
msgid "Close"
|
msgid "Close"
|
||||||
msgstr "Lukk"
|
msgstr "Lukk"
|
||||||
|
|
||||||
#. 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:90
|
#: ../js/ui/screenShield.js:86
|
||||||
msgid "%A, %B %d"
|
msgid "%A, %B %d"
|
||||||
msgstr "%A, %B %d"
|
msgstr "%A, %B %d"
|
||||||
|
|
||||||
#: ../js/ui/screenShield.js:155
|
#: ../js/ui/screenShield.js:151
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%d new notification"
|
msgid "%d new notification"
|
||||||
msgid_plural "%d new notifications"
|
msgid_plural "%d new notifications"
|
||||||
msgstr[0] "%d ny varsling"
|
msgstr[0] "%d ny varsling"
|
||||||
msgstr[1] "%d nye varslinger"
|
msgstr[1] "%d nye varslinger"
|
||||||
|
|
||||||
#: ../js/ui/screenShield.js:442 ../js/ui/userMenu.js:806
|
#: ../js/ui/screenShield.js:438 ../js/ui/userMenu.js:807
|
||||||
msgid "Lock"
|
msgid "Lock"
|
||||||
msgstr "Lås"
|
msgstr "Lås"
|
||||||
|
|
||||||
#: ../js/ui/screenShield.js:639
|
#: ../js/ui/screenShield.js:640
|
||||||
msgid "GNOME needs to lock the screen"
|
msgid "GNOME needs to lock the screen"
|
||||||
msgstr "GNOME må låse skjermen"
|
msgstr "GNOME må låse skjermen"
|
||||||
|
|
||||||
@ -1280,19 +1283,19 @@ msgstr "GNOME må låse skjermen"
|
|||||||
#.
|
#.
|
||||||
#. XXX: another option is to kick the user into the gdm login
|
#. XXX: another option is to kick the user into the gdm login
|
||||||
#. screen, where we're not affected by grabs
|
#. screen, where we're not affected by grabs
|
||||||
#: ../js/ui/screenShield.js:758 ../js/ui/screenShield.js:1169
|
#: ../js/ui/screenShield.js:761 ../js/ui/screenShield.js:1197
|
||||||
msgid "Unable to lock"
|
msgid "Unable to lock"
|
||||||
msgstr "Kan ikke låse"
|
msgstr "Kan ikke låse"
|
||||||
|
|
||||||
#: ../js/ui/screenShield.js:759 ../js/ui/screenShield.js:1170
|
#: ../js/ui/screenShield.js:762 ../js/ui/screenShield.js:1198
|
||||||
msgid "Lock was blocked by an application"
|
msgid "Lock was blocked by an application"
|
||||||
msgstr "Låsing ble stoppet av et program"
|
msgstr "Låsing ble stoppet av et program"
|
||||||
|
|
||||||
#: ../js/ui/searchDisplay.js:431
|
#: ../js/ui/searchDisplay.js:453
|
||||||
msgid "Searching…"
|
msgid "Searching…"
|
||||||
msgstr "Søker …"
|
msgstr "Søker …"
|
||||||
|
|
||||||
#: ../js/ui/searchDisplay.js:475
|
#: ../js/ui/searchDisplay.js:497
|
||||||
msgid "No results."
|
msgid "No results."
|
||||||
msgstr "Ingen resultater."
|
msgstr "Ingen resultater."
|
||||||
|
|
||||||
@ -1304,11 +1307,11 @@ msgstr "Kopier"
|
|||||||
msgid "Paste"
|
msgid "Paste"
|
||||||
msgstr "Lim inn"
|
msgstr "Lim inn"
|
||||||
|
|
||||||
#: ../js/ui/shellEntry.js:105
|
#: ../js/ui/shellEntry.js:106
|
||||||
msgid "Show Text"
|
msgid "Show Text"
|
||||||
msgstr "Vis tekst"
|
msgstr "Vis tekst"
|
||||||
|
|
||||||
#: ../js/ui/shellEntry.js:107
|
#: ../js/ui/shellEntry.js:108
|
||||||
msgid "Hide Text"
|
msgid "Hide Text"
|
||||||
msgstr "Skjul tekst"
|
msgstr "Skjul tekst"
|
||||||
|
|
||||||
@ -1320,7 +1323,7 @@ msgstr "Passord"
|
|||||||
msgid "Remember Password"
|
msgid "Remember Password"
|
||||||
msgstr "Husk passord"
|
msgstr "Husk passord"
|
||||||
|
|
||||||
#: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:140
|
#: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:113
|
||||||
msgid "Unlock"
|
msgid "Unlock"
|
||||||
msgstr "Lås opp"
|
msgstr "Lås opp"
|
||||||
|
|
||||||
@ -1725,11 +1728,11 @@ msgstr "Volum"
|
|||||||
msgid "Microphone"
|
msgid "Microphone"
|
||||||
msgstr "Mikrofon"
|
msgstr "Mikrofon"
|
||||||
|
|
||||||
#: ../js/ui/unlockDialog.js:151
|
#: ../js/ui/unlockDialog.js:124
|
||||||
msgid "Log in as another user"
|
msgid "Log in as another user"
|
||||||
msgstr "Logg inn som en annen bruker"
|
msgstr "Logg inn som en annen bruker"
|
||||||
|
|
||||||
#: ../js/ui/unlockDialog.js:177
|
#: ../js/ui/unlockDialog.js:145
|
||||||
msgid "Unlock Window"
|
msgid "Unlock Window"
|
||||||
msgstr "Lås opp vindu"
|
msgstr "Lås opp vindu"
|
||||||
|
|
||||||
@ -1757,27 +1760,27 @@ msgstr "Ledig"
|
|||||||
msgid "Offline"
|
msgid "Offline"
|
||||||
msgstr "Frakoblet"
|
msgstr "Frakoblet"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:780
|
#: ../js/ui/userMenu.js:781
|
||||||
msgid "Notifications"
|
msgid "Notifications"
|
||||||
msgstr "Varslinger"
|
msgstr "Varslinger"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:796
|
#: ../js/ui/userMenu.js:797
|
||||||
msgid "Switch User"
|
msgid "Switch User"
|
||||||
msgstr "Bytt bruker"
|
msgstr "Bytt bruker"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:801
|
#: ../js/ui/userMenu.js:802
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "Logg ut"
|
msgstr "Logg ut"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:821
|
#: ../js/ui/userMenu.js:822
|
||||||
msgid "Install Updates & Restart"
|
msgid "Install Updates & Restart"
|
||||||
msgstr "Installer oppdateringer og start på nytt"
|
msgstr "Installer oppdateringer og start på nytt"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:839
|
#: ../js/ui/userMenu.js:840
|
||||||
msgid "Your chat status will be set to busy"
|
msgid "Your chat status will be set to busy"
|
||||||
msgstr "Din pratestatus vil bli satt til opptatt"
|
msgstr "Din pratestatus vil bli satt til opptatt"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:840
|
#: ../js/ui/userMenu.js:841
|
||||||
msgid ""
|
msgid ""
|
||||||
"Notifications are now disabled, including chat messages. Your online status "
|
"Notifications are now disabled, including chat messages. Your online status "
|
||||||
"has been adjusted to let others know that you might not see their messages."
|
"has been adjusted to let others know that you might not see their messages."
|
||||||
@ -1786,22 +1789,24 @@ msgstr ""
|
|||||||
"tilkoblingsstatus er justert for å la andre vite at du kanskje ikke ser "
|
"tilkoblingsstatus er justert for å la andre vite at du kanskje ikke ser "
|
||||||
"deres meldinger."
|
"deres meldinger."
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:886
|
#: ../js/ui/userMenu.js:888
|
||||||
msgid "Other users are logged in."
|
msgid "Other users are logged in."
|
||||||
msgstr "Andre brukere er logget inn."
|
msgstr "Andre brukere er logget inn."
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:891
|
#: ../js/ui/userMenu.js:893
|
||||||
msgid "Shutting down might cause them to lose unsaved work."
|
msgid "Shutting down might cause them to lose unsaved work."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Hvis du slår av vil dette kunne medføre at de mister arbeid som ikke er "
|
"Hvis du slår av vil dette kunne medføre at de mister arbeid som ikke er "
|
||||||
"lagret."
|
"lagret."
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:918
|
#. Translators: Remote here refers to a remote session, like a ssh login
|
||||||
|
#: ../js/ui/userMenu.js:921
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s (remote)"
|
msgid "%s (remote)"
|
||||||
msgstr "%s (ekstern)"
|
msgstr "%s (ekstern)"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:920
|
#. Translators: Console here refers to a tty like a VT console
|
||||||
|
#: ../js/ui/userMenu.js:924
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s (console)"
|
msgid "%s (console)"
|
||||||
msgstr "%s (konsoll)"
|
msgstr "%s (konsoll)"
|
||||||
@ -1814,7 +1819,7 @@ msgstr "Programmer"
|
|||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr "Søk"
|
msgstr "Søk"
|
||||||
|
|
||||||
#: ../js/ui/wanda.js:92
|
#: ../js/ui/wanda.js:77
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Sorry, no wisdom for you today:\n"
|
"Sorry, no wisdom for you today:\n"
|
||||||
@ -1823,7 +1828,7 @@ msgstr ""
|
|||||||
"Beklager, ingen visdom til deg i dag:\n"
|
"Beklager, ingen visdom til deg i dag:\n"
|
||||||
"%s"
|
"%s"
|
||||||
|
|
||||||
#: ../js/ui/wanda.js:96
|
#: ../js/ui/wanda.js:81
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s the Oracle says"
|
msgid "%s the Oracle says"
|
||||||
msgstr "Orakelet sier %s"
|
msgstr "Orakelet sier %s"
|
||||||
|
307
po/pl.po
307
po/pl.po
@ -6,14 +6,15 @@
|
|||||||
# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
||||||
# Piotr Drąg <piotrdrag@gmail.com>, 2009-2013.
|
# Piotr Drąg <piotrdrag@gmail.com>, 2009-2013.
|
||||||
# Tomasz Dominikowski <dominikowski@gmail.com>, 2009.
|
# Tomasz Dominikowski <dominikowski@gmail.com>, 2009.
|
||||||
|
# Wojciech Szczęsny <wszczesny@aviary.pl>, 2013.
|
||||||
# Aviary.pl <gnomepl@aviary.pl>, 2009-2013.
|
# Aviary.pl <gnomepl@aviary.pl>, 2009-2013.
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: gnome-shell\n"
|
"Project-Id-Version: gnome-shell\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2013-02-24 01:52+0100\n"
|
"POT-Creation-Date: 2013-04-02 15:54+0200\n"
|
||||||
"PO-Revision-Date: 2013-02-24 01:53+0100\n"
|
"PO-Revision-Date: 2013-04-02 15:55+0200\n"
|
||||||
"Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
|
"Last-Translator: Wojciech Szczęsny <wszczesny@aviary.pl>\n"
|
||||||
"Language-Team: Polish <gnomepl@aviary.pl>\n"
|
"Language-Team: Polish <gnomepl@aviary.pl>\n"
|
||||||
"Language: pl\n"
|
"Language: pl\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
@ -61,7 +62,7 @@ msgid "Window management and application launching"
|
|||||||
msgstr "Zarządzanie oknami i uruchamianiem programów"
|
msgstr "Zarządzanie oknami i uruchamianiem programów"
|
||||||
|
|
||||||
#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:1
|
#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:1
|
||||||
#: ../js/extensionPrefs/main.js:152
|
#: ../js/extensionPrefs/main.js:153
|
||||||
msgid "GNOME Shell Extension Preferences"
|
msgid "GNOME Shell Extension Preferences"
|
||||||
msgstr "Preferencje rozszerzenia powłoki GNOME"
|
msgstr "Preferencje rozszerzenia powłoki GNOME"
|
||||||
|
|
||||||
@ -80,7 +81,7 @@ msgid ""
|
|||||||
"Allows access to internal debugging and monitoring tools using the Alt-F2 "
|
"Allows access to internal debugging and monitoring tools using the Alt-F2 "
|
||||||
"dialog."
|
"dialog."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Umożliwia dostęp do wewnętrznych narzędzi debugowania i monitorowania "
|
"Umożliwia dostęp do wewnętrznych narzędzi debugowania i monitorowania, "
|
||||||
"używając okna dialogowego Alt-F2."
|
"używając okna dialogowego Alt-F2."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:3
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:3
|
||||||
@ -96,9 +97,9 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Rozszerzenia powłoki GNOME posiadają własność UUID; ten klucz zawiera "
|
"Rozszerzenia powłoki GNOME posiadają własność UUID; ten klucz zawiera "
|
||||||
"rozszerzenia, które powinny zostać wczytane. Każde rozszerzenie, które ma "
|
"rozszerzenia, które powinny zostać wczytane. Każde rozszerzenie, które ma "
|
||||||
"zostać wczytane musi znajdować się na tej liście. Można także manipulować tą "
|
"zostać wczytane, musi znajdować się na tej liście. Można także manipulować "
|
||||||
"listą za pomocą metod EnableExtension i DisableExtension usługi D-Bus na org."
|
"tą listą za pomocą metod EnableExtension i DisableExtension usługi D-Bus na "
|
||||||
"gnome.Shell."
|
"org.gnome.Shell."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:5
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:5
|
||||||
msgid "Whether to collect stats about applications usage"
|
msgid "Whether to collect stats about applications usage"
|
||||||
@ -112,7 +113,7 @@ msgid ""
|
|||||||
"remove already saved data."
|
"remove already saved data."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Powłoka zwykle monitoruje aktywne programy, aby przedstawiać najczęściej "
|
"Powłoka zwykle monitoruje aktywne programy, aby przedstawiać najczęściej "
|
||||||
"używane (np. aktywatory programów). Mimo, że te dane nie są publiczne, można "
|
"używane (np. aktywatory programów). Mimo że te dane nie są publiczne, można "
|
||||||
"wyłączyć je z powodu prywatności. Proszę zauważyć, że wyłączenie nie "
|
"wyłączyć je z powodu prywatności. Proszę zauważyć, że wyłączenie nie "
|
||||||
"spowoduje usunięcia już zapisanych danych."
|
"spowoduje usunięcia już zapisanych danych."
|
||||||
|
|
||||||
@ -138,7 +139,7 @@ msgid ""
|
|||||||
"application view, rather than being displayed inline in the main view."
|
"application view, rather than being displayed inline in the main view."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Każda nazwa kategorii na tej liście będzie przedstawiana jako katalog w "
|
"Każda nazwa kategorii na tej liście będzie przedstawiana jako katalog w "
|
||||||
"widoku programów, zamiast wyświetlać ją bezpośrednio w głównym widoku."
|
"widoku programów, zamiast wyświetlania jej bezpośrednio w głównym widoku."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:11
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:11
|
||||||
msgid "History for command (Alt-F2) dialog"
|
msgid "History for command (Alt-F2) dialog"
|
||||||
@ -286,7 +287,7 @@ msgstr ""
|
|||||||
"Ustawia potok biblioteki GStreamer używany do zakodowania nagrań. Używa "
|
"Ustawia potok biblioteki GStreamer używany do zakodowania nagrań. Używa "
|
||||||
"składni programu gst-launch. Potok powinien posiadać niepołączony odpływ, "
|
"składni programu gst-launch. Potok powinien posiadać niepołączony odpływ, "
|
||||||
"gdzie jest nagrywane. Zwykle taki posiada, a wyjście będzie zapisywane do "
|
"gdzie jest nagrywane. Zwykle taki posiada, a wyjście będzie zapisywane do "
|
||||||
"pliku wyjściowego. Mimo, że potok może sam zająć się swoim wyjściem, można "
|
"pliku wyjściowego. Mimo że potok może sam zająć się swoim wyjściem, można "
|
||||||
"także wysłać wyjście do serwera icecast przez polecenie shout2send lub "
|
"także wysłać wyjście do serwera icecast przez polecenie shout2send lub "
|
||||||
"podobne. Jeśli nie zostanie ustawione lub ustawione na pustą wartość, to "
|
"podobne. Jeśli nie zostanie ustawione lub ustawione na pustą wartość, to "
|
||||||
"zostanie użyty domyślny potok. Jest nim obecnie \"vp8enc min_quantizer=13 "
|
"zostanie użyty domyślny potok. Jest nim obecnie \"vp8enc min_quantizer=13 "
|
||||||
@ -359,20 +360,20 @@ msgstr "Dynamiczne zarządzanie obszarami roboczymi"
|
|||||||
msgid "Workspaces only on primary monitor"
|
msgid "Workspaces only on primary monitor"
|
||||||
msgstr "Obszary robocze tylko na pierwszym monitorze"
|
msgstr "Obszary robocze tylko na pierwszym monitorze"
|
||||||
|
|
||||||
#: ../js/extensionPrefs/main.js:124
|
#: ../js/extensionPrefs/main.js:125
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "There was an error loading the preferences dialog for %s:"
|
msgid "There was an error loading the preferences dialog for %s:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Wystąpił błąd podczas wczytywania okna preferencji dla rozszerzenia %s:"
|
"Wystąpił błąd podczas wczytywania okna preferencji dla rozszerzenia %s:"
|
||||||
|
|
||||||
#: ../js/extensionPrefs/main.js:164
|
#: ../js/extensionPrefs/main.js:165
|
||||||
msgid "Extension"
|
msgid "Extension"
|
||||||
msgstr "Rozszerzenie"
|
msgstr "Rozszerzenie"
|
||||||
|
|
||||||
#: ../js/extensionPrefs/main.js:188
|
#: ../js/extensionPrefs/main.js:189
|
||||||
msgid "Select an extension to configure using the combobox above."
|
msgid "Select an extension to configure using the combobox above."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Proszę wybrać rozszerzenie do skonfigurowania używając powyższego pola "
|
"Proszę wybrać rozszerzenie do skonfigurowania, używając powyższego pola "
|
||||||
"wyboru."
|
"wyboru."
|
||||||
|
|
||||||
#: ../js/gdm/loginDialog.js:405
|
#: ../js/gdm/loginDialog.js:405
|
||||||
@ -382,36 +383,36 @@ msgstr "Sesja…"
|
|||||||
#. translators: this message is shown below the user list on the
|
#. translators: this message is shown below the user list on the
|
||||||
#. login screen. It can be activated to reveal an entry for
|
#. login screen. It can be activated to reveal an entry for
|
||||||
#. manually entering the username.
|
#. manually entering the username.
|
||||||
#: ../js/gdm/loginDialog.js:629
|
#: ../js/gdm/loginDialog.js:630
|
||||||
msgid "Not listed?"
|
msgid "Not listed?"
|
||||||
msgstr "Inny użytkownik?"
|
msgstr "Inny użytkownik?"
|
||||||
|
|
||||||
#: ../js/gdm/loginDialog.js:783 ../js/ui/components/networkAgent.js:137
|
#: ../js/gdm/loginDialog.js:786 ../js/ui/components/networkAgent.js:137
|
||||||
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:375
|
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:375
|
||||||
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
|
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
|
||||||
#: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:126
|
#: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:99
|
||||||
#: ../js/ui/userMenu.js:932
|
#: ../js/ui/userMenu.js:938
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Anuluj"
|
msgstr "Anuluj"
|
||||||
|
|
||||||
#: ../js/gdm/loginDialog.js:799
|
#: ../js/gdm/loginDialog.js:802
|
||||||
msgctxt "button"
|
msgctxt "button"
|
||||||
msgid "Sign In"
|
msgid "Sign In"
|
||||||
msgstr "Zaloguj"
|
msgstr "Zaloguj"
|
||||||
|
|
||||||
#: ../js/gdm/loginDialog.js:799
|
#: ../js/gdm/loginDialog.js:802
|
||||||
msgid "Next"
|
msgid "Next"
|
||||||
msgstr "Dalej"
|
msgstr "Dalej"
|
||||||
|
|
||||||
#. TTLS and PEAP are actually much more complicated, but this complication
|
#. TTLS and PEAP are actually much more complicated, but this complication
|
||||||
#. is not visible here since we only care about phase2 authentication
|
#. is not visible here since we only care about phase2 authentication
|
||||||
#. (and don't even care of which one)
|
#. (and don't even care of which one)
|
||||||
#: ../js/gdm/loginDialog.js:904 ../js/ui/components/networkAgent.js:260
|
#: ../js/gdm/loginDialog.js:917 ../js/ui/components/networkAgent.js:260
|
||||||
#: ../js/ui/components/networkAgent.js:278
|
#: ../js/ui/components/networkAgent.js:278
|
||||||
msgid "Username: "
|
msgid "Username: "
|
||||||
msgstr "Nazwa użytkownika: "
|
msgstr "Nazwa użytkownika: "
|
||||||
|
|
||||||
#: ../js/gdm/loginDialog.js:1157
|
#: ../js/gdm/loginDialog.js:1173
|
||||||
msgid "Login Window"
|
msgid "Login Window"
|
||||||
msgstr "Okno logowania"
|
msgstr "Okno logowania"
|
||||||
|
|
||||||
@ -420,8 +421,8 @@ msgstr "Okno logowania"
|
|||||||
msgid "Power"
|
msgid "Power"
|
||||||
msgstr "Zasilanie"
|
msgstr "Zasilanie"
|
||||||
|
|
||||||
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:694 ../js/ui/userMenu.js:698
|
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:696 ../js/ui/userMenu.js:700
|
||||||
#: ../js/ui/userMenu.js:814
|
#: ../js/ui/userMenu.js:816
|
||||||
msgid "Suspend"
|
msgid "Suspend"
|
||||||
msgstr "Uśpij"
|
msgstr "Uśpij"
|
||||||
|
|
||||||
@ -429,58 +430,58 @@ msgstr "Uśpij"
|
|||||||
msgid "Restart"
|
msgid "Restart"
|
||||||
msgstr "Uruchom ponownie"
|
msgstr "Uruchom ponownie"
|
||||||
|
|
||||||
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:696
|
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:698
|
||||||
#: ../js/ui/userMenu.js:698 ../js/ui/userMenu.js:813 ../js/ui/userMenu.js:936
|
#: ../js/ui/userMenu.js:700 ../js/ui/userMenu.js:815 ../js/ui/userMenu.js:942
|
||||||
msgid "Power Off"
|
msgid "Power Off"
|
||||||
msgstr "Wyłącz komputer"
|
msgstr "Wyłącz komputer"
|
||||||
|
|
||||||
#: ../js/gdm/util.js:182
|
#: ../js/gdm/util.js:249
|
||||||
msgid "Authentication error"
|
msgid "Authentication error"
|
||||||
msgstr "Błąd uwierzytelniania"
|
msgstr "Błąd uwierzytelniania"
|
||||||
|
|
||||||
#. Translators: this message is shown below the password entry field
|
#. Translators: this message is shown below the password entry field
|
||||||
#. to indicate the user can swipe their finger instead
|
#. to indicate the user can swipe their finger instead
|
||||||
#: ../js/gdm/util.js:299
|
#: ../js/gdm/util.js:366
|
||||||
msgid "(or swipe finger)"
|
msgid "(or swipe finger)"
|
||||||
msgstr "(lub przeciągnięcie palca)"
|
msgstr "(lub przeciągnięcie palca)"
|
||||||
|
|
||||||
#: ../js/gdm/util.js:324
|
#: ../js/gdm/util.js:391
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "(e.g., user or %s)"
|
msgid "(e.g., user or %s)"
|
||||||
msgstr "(np. użytkownik lub %s)"
|
msgstr "(np. użytkownik lub %s)"
|
||||||
|
|
||||||
#: ../js/misc/util.js:94
|
#: ../js/misc/util.js:97
|
||||||
msgid "Command not found"
|
msgid "Command not found"
|
||||||
msgstr "Nie odnaleziono polecenia"
|
msgstr "Nie odnaleziono polecenia"
|
||||||
|
|
||||||
#. Replace "Error invoking GLib.shell_parse_argv: " with
|
#. Replace "Error invoking GLib.shell_parse_argv: " with
|
||||||
#. something nicer
|
#. something nicer
|
||||||
#: ../js/misc/util.js:127
|
#: ../js/misc/util.js:130
|
||||||
msgid "Could not parse command:"
|
msgid "Could not parse command:"
|
||||||
msgstr "Nie można przetworzyć polecenia:"
|
msgstr "Nie można przetworzyć polecenia:"
|
||||||
|
|
||||||
#: ../js/misc/util.js:135
|
#: ../js/misc/util.js:138
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Execution of '%s' failed:"
|
msgid "Execution of '%s' failed:"
|
||||||
msgstr "Wykonanie polecenia \"%s\" się nie powiodło:"
|
msgstr "Wykonanie polecenia \"%s\" się nie powiodło:"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:348
|
#: ../js/ui/appDisplay.js:349
|
||||||
msgid "Frequent"
|
msgid "Frequent"
|
||||||
msgstr "Często używane"
|
msgstr "Często używane"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:355
|
#: ../js/ui/appDisplay.js:356
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Wszystkie"
|
msgstr "Wszystkie"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:913
|
#: ../js/ui/appDisplay.js:914
|
||||||
msgid "New Window"
|
msgid "New Window"
|
||||||
msgstr "Nowe okno"
|
msgstr "Nowe okno"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:916 ../js/ui/dash.js:284
|
#: ../js/ui/appDisplay.js:917 ../js/ui/dash.js:284
|
||||||
msgid "Remove from Favorites"
|
msgid "Remove from Favorites"
|
||||||
msgstr "Usuń z ulubionych"
|
msgstr "Usuń z ulubionych"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:917
|
#: ../js/ui/appDisplay.js:918
|
||||||
msgid "Add to Favorites"
|
msgid "Add to Favorites"
|
||||||
msgstr "Dodaj do ulubionych"
|
msgstr "Dodaj do ulubionych"
|
||||||
|
|
||||||
@ -494,7 +495,7 @@ msgstr "Program %s został dodany do ulubionych."
|
|||||||
msgid "%s has been removed from your favorites."
|
msgid "%s has been removed from your favorites."
|
||||||
msgstr "Program %s został usunięty z ulubionych."
|
msgstr "Program %s został usunięty z ulubionych."
|
||||||
|
|
||||||
#: ../js/ui/backgroundMenu.js:19 ../js/ui/userMenu.js:787
|
#: ../js/ui/backgroundMenu.js:19 ../js/ui/userMenu.js:789
|
||||||
msgid "Settings"
|
msgid "Settings"
|
||||||
msgstr "Ustawienia"
|
msgstr "Ustawienia"
|
||||||
|
|
||||||
@ -517,7 +518,7 @@ msgctxt "event list time"
|
|||||||
msgid "%H\\u2236%M"
|
msgid "%H\\u2236%M"
|
||||||
msgstr "%H\\u2236%M"
|
msgstr "%H\\u2236%M"
|
||||||
|
|
||||||
#. Transators: Shown in calendar event list, if 12h format,
|
#. Translators: Shown in calendar event list, if 12h format,
|
||||||
#. \u2236 is a ratio character, similar to : and \u2009 is
|
#. \u2236 is a ratio character, similar to : and \u2009 is
|
||||||
#. a thin space
|
#. a thin space
|
||||||
#: ../js/ui/calendar.js:77
|
#: ../js/ui/calendar.js:77
|
||||||
@ -619,35 +620,35 @@ msgid "S"
|
|||||||
msgstr "S"
|
msgstr "S"
|
||||||
|
|
||||||
#. Translators: Text to show if there are no events
|
#. Translators: Text to show if there are no events
|
||||||
#: ../js/ui/calendar.js:692
|
#: ../js/ui/calendar.js:720
|
||||||
msgid "Nothing Scheduled"
|
msgid "Nothing Scheduled"
|
||||||
msgstr "Nic nie zaplanowano"
|
msgstr "Nic nie zaplanowano"
|
||||||
|
|
||||||
#. 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:708
|
#: ../js/ui/calendar.js:736
|
||||||
msgctxt "calendar heading"
|
msgctxt "calendar heading"
|
||||||
msgid "%A, %B %d"
|
msgid "%A, %B %d"
|
||||||
msgstr "%A, %e %B"
|
msgstr "%A, %e %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:711
|
#: ../js/ui/calendar.js:739
|
||||||
msgctxt "calendar heading"
|
msgctxt "calendar heading"
|
||||||
msgid "%A, %B %d, %Y"
|
msgid "%A, %B %d, %Y"
|
||||||
msgstr "%A, %e %B %Y"
|
msgstr "%A, %e %B %Y"
|
||||||
|
|
||||||
#: ../js/ui/calendar.js:721
|
#: ../js/ui/calendar.js:749
|
||||||
msgid "Today"
|
msgid "Today"
|
||||||
msgstr "Dzisiaj"
|
msgstr "Dzisiaj"
|
||||||
|
|
||||||
#: ../js/ui/calendar.js:725
|
#: ../js/ui/calendar.js:753
|
||||||
msgid "Tomorrow"
|
msgid "Tomorrow"
|
||||||
msgstr "Jutro"
|
msgstr "Jutro"
|
||||||
|
|
||||||
#: ../js/ui/calendar.js:736
|
#: ../js/ui/calendar.js:764
|
||||||
msgid "This week"
|
msgid "This week"
|
||||||
msgstr "Ten tydzień"
|
msgstr "Ten tydzień"
|
||||||
|
|
||||||
#: ../js/ui/calendar.js:744
|
#: ../js/ui/calendar.js:772
|
||||||
msgid "Next week"
|
msgid "Next week"
|
||||||
msgstr "Następny tydzień"
|
msgstr "Następny tydzień"
|
||||||
|
|
||||||
@ -663,12 +664,12 @@ msgstr "Odłączono dysk zewnętrzny"
|
|||||||
msgid "Removable Devices"
|
msgid "Removable Devices"
|
||||||
msgstr "Urządzenia wymienne"
|
msgstr "Urządzenia wymienne"
|
||||||
|
|
||||||
#: ../js/ui/components/autorunManager.js:593
|
#: ../js/ui/components/autorunManager.js:594
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Open with %s"
|
msgid "Open with %s"
|
||||||
msgstr "Otwórz za pomocą %s"
|
msgstr "Otwórz za pomocą %s"
|
||||||
|
|
||||||
#: ../js/ui/components/autorunManager.js:619
|
#: ../js/ui/components/autorunManager.js:620
|
||||||
msgid "Eject"
|
msgid "Eject"
|
||||||
msgstr "Wysuń"
|
msgstr "Wysuń"
|
||||||
|
|
||||||
@ -811,39 +812,39 @@ msgid "Mute"
|
|||||||
msgstr "Wycisz"
|
msgstr "Wycisz"
|
||||||
|
|
||||||
#. Translators: this is the word "Yesterday" followed by a time string. i.e. "Yesterday, 14:30"
|
#. Translators: this is the word "Yesterday" followed by a time string. i.e. "Yesterday, 14:30"
|
||||||
#: ../js/ui/components/telepathyClient.js:938
|
#: ../js/ui/components/telepathyClient.js:942
|
||||||
#, no-c-format
|
#, no-c-format
|
||||||
msgid "<b>Yesterday</b>, <b>%H:%M</b>"
|
msgid "<b>Yesterday</b>, <b>%H:%M</b>"
|
||||||
msgstr "<b>Wczoraj</b> o <b>%H:%M</b>"
|
msgstr "<b>Wczoraj</b> o <b>%H:%M</b>"
|
||||||
|
|
||||||
#. Translators: this is the week day name followed by a time string. i.e. "Monday, 14:30
|
#. Translators: this is the week day name followed by a time string. i.e. "Monday, 14:30
|
||||||
#: ../js/ui/components/telepathyClient.js:944
|
#: ../js/ui/components/telepathyClient.js:948
|
||||||
#, no-c-format
|
#, no-c-format
|
||||||
msgid "<b>%A</b>, <b>%H:%M</b>"
|
msgid "<b>%A</b>, <b>%H:%M</b>"
|
||||||
msgstr "<b>%A</b> o <b>%H:%M</b>"
|
msgstr "<b>%A</b> o <b>%H:%M</b>"
|
||||||
|
|
||||||
#. Translators: this is the month name and day number followed by a time string. i.e. "May 25, 14:30"
|
#. Translators: this is the month name and day number followed by a time string. i.e. "May 25, 14:30"
|
||||||
#: ../js/ui/components/telepathyClient.js:949
|
#: ../js/ui/components/telepathyClient.js:953
|
||||||
#, no-c-format
|
#, no-c-format
|
||||||
msgid "<b>%B</b> <b>%d</b>, <b>%H:%M</b>"
|
msgid "<b>%B</b> <b>%d</b>, <b>%H:%M</b>"
|
||||||
msgstr "<b>%d</b> <b>%B</b>, <b>%H:%M</b>"
|
msgstr "<b>%d</b> <b>%B</b>, <b>%H:%M</b>"
|
||||||
|
|
||||||
#. Translators: this is the month name, day number, year number followed by a time string. i.e. "May 25 2012, 14:30"
|
#. Translators: this is the month name, day number, year number followed by a time string. i.e. "May 25 2012, 14:30"
|
||||||
#: ../js/ui/components/telepathyClient.js:953
|
#: ../js/ui/components/telepathyClient.js:957
|
||||||
#, no-c-format
|
#, no-c-format
|
||||||
msgid "<b>%B</b> <b>%d</b> <b>%Y</b>, <b>%H:%M</b> "
|
msgid "<b>%B</b> <b>%d</b> <b>%Y</b>, <b>%H:%M</b> "
|
||||||
msgstr "<b>%d</b> <b>%B</b> <b>%Y</b>, <b>%H:%M</b> "
|
msgstr "<b>%d</b> <b>%B</b> <b>%Y</b>, <b>%H:%M</b> "
|
||||||
|
|
||||||
#. Translators: this is the other person changing their old IM name to their new
|
#. Translators: this is the other person changing their old IM name to their new
|
||||||
#. IM name.
|
#. IM name.
|
||||||
#: ../js/ui/components/telepathyClient.js:981
|
#: ../js/ui/components/telepathyClient.js:985
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s is now known as %s"
|
msgid "%s is now known as %s"
|
||||||
msgstr "Użytkownik %s jest teraz znany jako %s"
|
msgstr "Użytkownik %s jest teraz znany jako %s"
|
||||||
|
|
||||||
#. translators: argument is a room name like
|
#. translators: argument is a room name like
|
||||||
#. * room@jabber.org for example.
|
#. * room@jabber.org for example.
|
||||||
#: ../js/ui/components/telepathyClient.js:1084
|
#: ../js/ui/components/telepathyClient.js:1088
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Invitation to %s"
|
msgid "Invitation to %s"
|
||||||
msgstr "Zaproszenie do pokoju %s"
|
msgstr "Zaproszenie do pokoju %s"
|
||||||
@ -851,38 +852,38 @@ msgstr "Zaproszenie do pokoju %s"
|
|||||||
#. translators: first argument is the name of a contact and the second
|
#. translators: first argument is the name of a contact and the second
|
||||||
#. * one the name of a room. "Alice is inviting you to join room@jabber.org
|
#. * one the name of a room. "Alice is inviting you to join room@jabber.org
|
||||||
#. * for example.
|
#. * for example.
|
||||||
#: ../js/ui/components/telepathyClient.js:1092
|
#: ../js/ui/components/telepathyClient.js:1096
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s is inviting you to join %s"
|
msgid "%s is inviting you to join %s"
|
||||||
msgstr "Użytkownik %s zaprasza do dołączenia do pokoju %s"
|
msgstr "Użytkownik %s zaprasza do dołączenia do pokoju %s"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1094
|
#: ../js/ui/components/telepathyClient.js:1098
|
||||||
#: ../js/ui/components/telepathyClient.js:1133
|
#: ../js/ui/components/telepathyClient.js:1137
|
||||||
#: ../js/ui/components/telepathyClient.js:1173
|
#: ../js/ui/components/telepathyClient.js:1177
|
||||||
#: ../js/ui/components/telepathyClient.js:1236
|
#: ../js/ui/components/telepathyClient.js:1240
|
||||||
msgid "Decline"
|
msgid "Decline"
|
||||||
msgstr "Odmów"
|
msgstr "Odmów"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1095
|
#: ../js/ui/components/telepathyClient.js:1099
|
||||||
#: ../js/ui/components/telepathyClient.js:1174
|
#: ../js/ui/components/telepathyClient.js:1178
|
||||||
#: ../js/ui/components/telepathyClient.js:1237
|
#: ../js/ui/components/telepathyClient.js:1241
|
||||||
msgid "Accept"
|
msgid "Accept"
|
||||||
msgstr "Zaakceptuj"
|
msgstr "Zaakceptuj"
|
||||||
|
|
||||||
#. translators: argument is a contact name like Alice for example.
|
#. translators: argument is a contact name like Alice for example.
|
||||||
#: ../js/ui/components/telepathyClient.js:1125
|
#: ../js/ui/components/telepathyClient.js:1129
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Video call from %s"
|
msgid "Video call from %s"
|
||||||
msgstr "Wideorozmowa z użytkownikiem %s"
|
msgstr "Wideorozmowa z użytkownikiem %s"
|
||||||
|
|
||||||
#. translators: argument is a contact name like Alice for example.
|
#. translators: argument is a contact name like Alice for example.
|
||||||
#: ../js/ui/components/telepathyClient.js:1128
|
#: ../js/ui/components/telepathyClient.js:1132
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Call from %s"
|
msgid "Call from %s"
|
||||||
msgstr "Rozmowa z użytkownikiem %s"
|
msgstr "Rozmowa z użytkownikiem %s"
|
||||||
|
|
||||||
#. translators: this is a button label (verb), not a noun
|
#. translators: this is a button label (verb), not a noun
|
||||||
#: ../js/ui/components/telepathyClient.js:1135
|
#: ../js/ui/components/telepathyClient.js:1139
|
||||||
msgid "Answer"
|
msgid "Answer"
|
||||||
msgstr "Odbierz"
|
msgstr "Odbierz"
|
||||||
|
|
||||||
@ -891,111 +892,111 @@ msgstr "Odbierz"
|
|||||||
#. * file name. The string will be something
|
#. * file name. The string will be something
|
||||||
#. * like: "Alice is sending you test.ogg"
|
#. * like: "Alice is sending you test.ogg"
|
||||||
#.
|
#.
|
||||||
#: ../js/ui/components/telepathyClient.js:1167
|
#: ../js/ui/components/telepathyClient.js:1171
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s is sending you %s"
|
msgid "%s is sending you %s"
|
||||||
msgstr "Użytkownik %s przysyła plik %s"
|
msgstr "Użytkownik %s przysyła plik %s"
|
||||||
|
|
||||||
#. To translators: The parameter is the contact's alias
|
#. To translators: The parameter is the contact's alias
|
||||||
#: ../js/ui/components/telepathyClient.js:1202
|
#: ../js/ui/components/telepathyClient.js:1206
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s would like permission to see when you are online"
|
msgid "%s would like permission to see when you are online"
|
||||||
msgstr "Użytkownik %s prosi o uprawnienie do wyświetlania stanu"
|
msgstr "Użytkownik %s prosi o uprawnienie do wyświetlania stanu"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1294
|
#: ../js/ui/components/telepathyClient.js:1298
|
||||||
msgid "Network error"
|
msgid "Network error"
|
||||||
msgstr "Błąd sieci"
|
msgstr "Błąd sieci"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1296
|
#: ../js/ui/components/telepathyClient.js:1300
|
||||||
msgid "Authentication failed"
|
msgid "Authentication failed"
|
||||||
msgstr "Uwierzytelnienie się nie powiodło"
|
msgstr "Uwierzytelnienie się nie powiodło"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1298
|
#: ../js/ui/components/telepathyClient.js:1302
|
||||||
msgid "Encryption error"
|
msgid "Encryption error"
|
||||||
msgstr "Błąd szyfrowania"
|
msgstr "Błąd szyfrowania"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1300
|
#: ../js/ui/components/telepathyClient.js:1304
|
||||||
msgid "Certificate not provided"
|
msgid "Certificate not provided"
|
||||||
msgstr "Nie podano certyfikatu"
|
msgstr "Nie podano certyfikatu"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1302
|
#: ../js/ui/components/telepathyClient.js:1306
|
||||||
msgid "Certificate untrusted"
|
msgid "Certificate untrusted"
|
||||||
msgstr "Certyfikat jest niezaufany"
|
msgstr "Certyfikat jest niezaufany"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1304
|
#: ../js/ui/components/telepathyClient.js:1308
|
||||||
msgid "Certificate expired"
|
msgid "Certificate expired"
|
||||||
msgstr "Certyfikat wygasł"
|
msgstr "Certyfikat wygasł"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1306
|
#: ../js/ui/components/telepathyClient.js:1310
|
||||||
msgid "Certificate not activated"
|
msgid "Certificate not activated"
|
||||||
msgstr "Certyfikat nie został aktywowany"
|
msgstr "Certyfikat nie został aktywowany"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1308
|
#: ../js/ui/components/telepathyClient.js:1312
|
||||||
msgid "Certificate hostname mismatch"
|
msgid "Certificate hostname mismatch"
|
||||||
msgstr "Nazwa komputera certyfikatu się nie zgadza"
|
msgstr "Nazwa komputera certyfikatu się nie zgadza"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1310
|
#: ../js/ui/components/telepathyClient.js:1314
|
||||||
msgid "Certificate fingerprint mismatch"
|
msgid "Certificate fingerprint mismatch"
|
||||||
msgstr "Odcisk palca certyfikatu się nie zgadza"
|
msgstr "Odcisk palca certyfikatu się nie zgadza"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1312
|
#: ../js/ui/components/telepathyClient.js:1316
|
||||||
msgid "Certificate self-signed"
|
msgid "Certificate self-signed"
|
||||||
msgstr "Certyfikat został samodzielnie podpisany"
|
msgstr "Certyfikat został samodzielnie podpisany"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1314
|
#: ../js/ui/components/telepathyClient.js:1318
|
||||||
msgid "Status is set to offline"
|
msgid "Status is set to offline"
|
||||||
msgstr "Stan jest ustawiony na offline"
|
msgstr "Stan jest ustawiony na offline"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1316
|
#: ../js/ui/components/telepathyClient.js:1320
|
||||||
msgid "Encryption is not available"
|
msgid "Encryption is not available"
|
||||||
msgstr "Szyfrowanie jest niedostępne"
|
msgstr "Szyfrowanie jest niedostępne"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1318
|
#: ../js/ui/components/telepathyClient.js:1322
|
||||||
msgid "Certificate is invalid"
|
msgid "Certificate is invalid"
|
||||||
msgstr "Certyfikat jest nieprawidłowy"
|
msgstr "Certyfikat jest nieprawidłowy"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1320
|
#: ../js/ui/components/telepathyClient.js:1324
|
||||||
msgid "Connection has been refused"
|
msgid "Connection has been refused"
|
||||||
msgstr "Odrzucono połączenie"
|
msgstr "Odrzucono połączenie"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1322
|
#: ../js/ui/components/telepathyClient.js:1326
|
||||||
msgid "Connection can't be established"
|
msgid "Connection can't be established"
|
||||||
msgstr "Nie można nawiązać połączenia"
|
msgstr "Nie można nawiązać połączenia"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1324
|
#: ../js/ui/components/telepathyClient.js:1328
|
||||||
msgid "Connection has been lost"
|
msgid "Connection has been lost"
|
||||||
msgstr "Utracono połączenie"
|
msgstr "Utracono połączenie"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1326
|
#: ../js/ui/components/telepathyClient.js:1330
|
||||||
msgid "This account is already connected to the server"
|
msgid "This account is already connected to the server"
|
||||||
msgstr "To konto jest już połączone z serwerem"
|
msgstr "To konto jest już połączone z serwerem"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1328
|
#: ../js/ui/components/telepathyClient.js:1332
|
||||||
msgid ""
|
msgid ""
|
||||||
"Connection has been replaced by a new connection using the same resource"
|
"Connection has been replaced by a new connection using the same resource"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Połączenie zostało zastąpione nowym z wykorzystaniem tego samego zasobu"
|
"Połączenie zostało zastąpione nowym z wykorzystaniem tego samego zasobu"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1330
|
#: ../js/ui/components/telepathyClient.js:1334
|
||||||
msgid "The account already exists on the server"
|
msgid "The account already exists on the server"
|
||||||
msgstr "Konto już istnieje na serwerze"
|
msgstr "Konto już istnieje na serwerze"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1332
|
#: ../js/ui/components/telepathyClient.js:1336
|
||||||
msgid "Server is currently too busy to handle the connection"
|
msgid "Server is currently too busy to handle the connection"
|
||||||
msgstr "Serwer jest obecnie zbyt zajęty, aby obsłużyć połączenie"
|
msgstr "Serwer jest obecnie zbyt zajęty, aby obsłużyć połączenie"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1334
|
#: ../js/ui/components/telepathyClient.js:1338
|
||||||
msgid "Certificate has been revoked"
|
msgid "Certificate has been revoked"
|
||||||
msgstr "Certyfikat został unieważniony"
|
msgstr "Certyfikat został unieważniony"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1336
|
#: ../js/ui/components/telepathyClient.js:1340
|
||||||
msgid ""
|
msgid ""
|
||||||
"Certificate uses an insecure cipher algorithm or is cryptographically weak"
|
"Certificate uses an insecure cipher algorithm or is cryptographically weak"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Certyfikat używa niezabezpieczonego algorytmu szyfrowania lub jest "
|
"Certyfikat używa niezabezpieczonego algorytmu szyfrowania lub jest "
|
||||||
"kryptograficznie słaby"
|
"kryptograficznie słaby"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1338
|
#: ../js/ui/components/telepathyClient.js:1342
|
||||||
msgid ""
|
msgid ""
|
||||||
"The length of the server certificate, or the depth of the server certificate "
|
"The length of the server certificate, or the depth of the server certificate "
|
||||||
"chain, exceed the limits imposed by the cryptography library"
|
"chain, exceed the limits imposed by the cryptography library"
|
||||||
@ -1003,26 +1004,26 @@ msgstr ""
|
|||||||
"Długość certyfikatu serwera lub głębokość jego łańcucha przekracza "
|
"Długość certyfikatu serwera lub głębokość jego łańcucha przekracza "
|
||||||
"ograniczenia nałożone przez bibliotekę kryptograficzną"
|
"ograniczenia nałożone przez bibliotekę kryptograficzną"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1340
|
#: ../js/ui/components/telepathyClient.js:1344
|
||||||
msgid "Internal error"
|
msgid "Internal error"
|
||||||
msgstr "Błąd wewnętrzny"
|
msgstr "Błąd wewnętrzny"
|
||||||
|
|
||||||
#. translators: argument is the account name, like
|
#. translators: argument is the account name, like
|
||||||
#. * name@jabber.org for example.
|
#. * name@jabber.org for example.
|
||||||
#: ../js/ui/components/telepathyClient.js:1350
|
#: ../js/ui/components/telepathyClient.js:1354
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Unable to connect to %s"
|
msgid "Unable to connect to %s"
|
||||||
msgstr "Nie można połączyć się z kontem %s"
|
msgstr "Nie można połączyć się z kontem %s"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1355
|
#: ../js/ui/components/telepathyClient.js:1359
|
||||||
msgid "View account"
|
msgid "View account"
|
||||||
msgstr "Wyświetl konto"
|
msgstr "Wyświetl konto"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1394
|
#: ../js/ui/components/telepathyClient.js:1398
|
||||||
msgid "Unknown reason"
|
msgid "Unknown reason"
|
||||||
msgstr "Nieznana przyczyna"
|
msgstr "Nieznana przyczyna"
|
||||||
|
|
||||||
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:97
|
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:96
|
||||||
msgid "Windows"
|
msgid "Windows"
|
||||||
msgstr "Okna"
|
msgstr "Okna"
|
||||||
|
|
||||||
@ -1051,7 +1052,7 @@ msgstr "Ustawienia daty i czasu"
|
|||||||
#. 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:215
|
||||||
msgid "%A %B %e, %Y"
|
msgid "%A %B %e, %Y"
|
||||||
msgstr "%A, %e %B %Y"
|
msgstr "%A, %e %B %Y"
|
||||||
|
|
||||||
@ -1212,23 +1213,23 @@ msgstr "Wyświetl źródło"
|
|||||||
msgid "Web Page"
|
msgid "Web Page"
|
||||||
msgstr "Strona WWW"
|
msgstr "Strona WWW"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:1177
|
#: ../js/ui/messageTray.js:1182
|
||||||
msgid "Open"
|
msgid "Open"
|
||||||
msgstr "Otwórz"
|
msgstr "Otwórz"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:1184
|
#: ../js/ui/messageTray.js:1189
|
||||||
msgid "Remove"
|
msgid "Remove"
|
||||||
msgstr "Usuń"
|
msgstr "Usuń"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:1496
|
#: ../js/ui/messageTray.js:1501
|
||||||
msgid "Clear Messages"
|
msgid "Clear Messages"
|
||||||
msgstr "Wyczyść wiadomości"
|
msgstr "Wyczyść wiadomości"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:1523
|
#: ../js/ui/messageTray.js:1528
|
||||||
msgid "Notification Settings"
|
msgid "Notification Settings"
|
||||||
msgstr "Ustawienia powiadomień"
|
msgstr "Ustawienia powiadomień"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:1702
|
#: ../js/ui/messageTray.js:1709
|
||||||
msgid "No Messages"
|
msgid "No Messages"
|
||||||
msgstr "Brak wiadomości"
|
msgstr "Brak wiadomości"
|
||||||
|
|
||||||
@ -1236,7 +1237,7 @@ msgstr "Brak wiadomości"
|
|||||||
msgid "Message Tray"
|
msgid "Message Tray"
|
||||||
msgstr "Obszar powiadamiania"
|
msgstr "Obszar powiadamiania"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:2857
|
#: ../js/ui/messageTray.js:2810
|
||||||
msgid "System Information"
|
msgid "System Information"
|
||||||
msgstr "Informacje systemowe"
|
msgstr "Informacje systemowe"
|
||||||
|
|
||||||
@ -1245,11 +1246,19 @@ msgctxt "program"
|
|||||||
msgid "Unknown"
|
msgid "Unknown"
|
||||||
msgstr "Nieznany"
|
msgstr "Nieznany"
|
||||||
|
|
||||||
#: ../js/ui/overview.js:81
|
#: ../js/ui/overviewControls.js:463 ../js/ui/screenShield.js:149
|
||||||
|
#, c-format
|
||||||
|
msgid "%d new message"
|
||||||
|
msgid_plural "%d new messages"
|
||||||
|
msgstr[0] "%d nowa wiadomość"
|
||||||
|
msgstr[1] "%d nowe wiadomości"
|
||||||
|
msgstr[2] "%d nowych wiadomości"
|
||||||
|
|
||||||
|
#: ../js/ui/overview.js:84
|
||||||
msgid "Undo"
|
msgid "Undo"
|
||||||
msgstr "Cofnij"
|
msgstr "Cofnij"
|
||||||
|
|
||||||
#: ../js/ui/overview.js:124
|
#: ../js/ui/overview.js:129
|
||||||
msgid "Overview"
|
msgid "Overview"
|
||||||
msgstr "Podgląd"
|
msgstr "Podgląd"
|
||||||
|
|
||||||
@ -1257,21 +1266,21 @@ msgstr "Podgląd"
|
|||||||
#. in the search entry when no search is
|
#. in the search entry when no search is
|
||||||
#. active; it should not exceed ~30
|
#. active; it should not exceed ~30
|
||||||
#. characters.
|
#. characters.
|
||||||
#: ../js/ui/overview.js:272
|
#: ../js/ui/overview.js:271
|
||||||
msgid "Type to search…"
|
msgid "Type to search…"
|
||||||
msgstr "Wyszukiwanie…"
|
msgstr "Wyszukiwanie…"
|
||||||
|
|
||||||
#: ../js/ui/panel.js:613
|
#: ../js/ui/panel.js:612
|
||||||
msgid "Quit"
|
msgid "Quit"
|
||||||
msgstr "Zakończ"
|
msgstr "Zakończ"
|
||||||
|
|
||||||
#. 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:642
|
#: ../js/ui/panel.js:636
|
||||||
msgid "Activities"
|
msgid "Activities"
|
||||||
msgstr "Podgląd"
|
msgstr "Podgląd"
|
||||||
|
|
||||||
#: ../js/ui/panel.js:983
|
#: ../js/ui/panel.js:933
|
||||||
msgid "Top Bar"
|
msgid "Top Bar"
|
||||||
msgstr "Górny pasek"
|
msgstr "Górny pasek"
|
||||||
|
|
||||||
@ -1284,29 +1293,21 @@ msgstr "Górny pasek"
|
|||||||
msgid "toggle-switch-us"
|
msgid "toggle-switch-us"
|
||||||
msgstr "toggle-switch-intl"
|
msgstr "toggle-switch-intl"
|
||||||
|
|
||||||
#: ../js/ui/runDialog.js:205
|
#: ../js/ui/runDialog.js:73
|
||||||
msgid "Enter a Command"
|
msgid "Enter a Command"
|
||||||
msgstr "Proszę wprowadzić polecenie"
|
msgstr "Proszę wprowadzić polecenie"
|
||||||
|
|
||||||
#: ../js/ui/runDialog.js:241
|
#: ../js/ui/runDialog.js:109
|
||||||
msgid "Close"
|
msgid "Close"
|
||||||
msgstr "Zamknij"
|
msgstr "Zamknij"
|
||||||
|
|
||||||
#. 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:90
|
#: ../js/ui/screenShield.js:86
|
||||||
msgid "%A, %B %d"
|
msgid "%A, %B %d"
|
||||||
msgstr "%A, %e %B"
|
msgstr "%A, %e %B"
|
||||||
|
|
||||||
#: ../js/ui/screenShield.js:153
|
#: ../js/ui/screenShield.js:151
|
||||||
#, c-format
|
|
||||||
msgid "%d new message"
|
|
||||||
msgid_plural "%d new messages"
|
|
||||||
msgstr[0] "%d nowa wiadomość"
|
|
||||||
msgstr[1] "%d nowe wiadomości"
|
|
||||||
msgstr[2] "%d nowych wiadomości"
|
|
||||||
|
|
||||||
#: ../js/ui/screenShield.js:155
|
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%d new notification"
|
msgid "%d new notification"
|
||||||
msgid_plural "%d new notifications"
|
msgid_plural "%d new notifications"
|
||||||
@ -1314,11 +1315,11 @@ msgstr[0] "%d nowe powiadomienie"
|
|||||||
msgstr[1] "%d nowe powiadomienia"
|
msgstr[1] "%d nowe powiadomienia"
|
||||||
msgstr[2] "%d nowych powiadomień"
|
msgstr[2] "%d nowych powiadomień"
|
||||||
|
|
||||||
#: ../js/ui/screenShield.js:442 ../js/ui/userMenu.js:805
|
#: ../js/ui/screenShield.js:438 ../js/ui/userMenu.js:807
|
||||||
msgid "Lock"
|
msgid "Lock"
|
||||||
msgstr "Zablokuj ekran"
|
msgstr "Zablokuj ekran"
|
||||||
|
|
||||||
#: ../js/ui/screenShield.js:638
|
#: ../js/ui/screenShield.js:640
|
||||||
msgid "GNOME needs to lock the screen"
|
msgid "GNOME needs to lock the screen"
|
||||||
msgstr "Środowisko GNOME musi zablokować ekran"
|
msgstr "Środowisko GNOME musi zablokować ekran"
|
||||||
|
|
||||||
@ -1329,19 +1330,19 @@ msgstr "Środowisko GNOME musi zablokować ekran"
|
|||||||
#.
|
#.
|
||||||
#. XXX: another option is to kick the user into the gdm login
|
#. XXX: another option is to kick the user into the gdm login
|
||||||
#. screen, where we're not affected by grabs
|
#. screen, where we're not affected by grabs
|
||||||
#: ../js/ui/screenShield.js:757 ../js/ui/screenShield.js:1168
|
#: ../js/ui/screenShield.js:761 ../js/ui/screenShield.js:1197
|
||||||
msgid "Unable to lock"
|
msgid "Unable to lock"
|
||||||
msgstr "Nie można zablokować"
|
msgstr "Nie można zablokować"
|
||||||
|
|
||||||
#: ../js/ui/screenShield.js:758 ../js/ui/screenShield.js:1169
|
#: ../js/ui/screenShield.js:762 ../js/ui/screenShield.js:1198
|
||||||
msgid "Lock was blocked by an application"
|
msgid "Lock was blocked by an application"
|
||||||
msgstr "Blokowanie zostało zablokowane przez program"
|
msgstr "Blokowanie zostało zablokowane przez program"
|
||||||
|
|
||||||
#: ../js/ui/searchDisplay.js:431
|
#: ../js/ui/searchDisplay.js:453
|
||||||
msgid "Searching…"
|
msgid "Searching…"
|
||||||
msgstr "Wyszukiwanie…"
|
msgstr "Wyszukiwanie…"
|
||||||
|
|
||||||
#: ../js/ui/searchDisplay.js:475
|
#: ../js/ui/searchDisplay.js:497
|
||||||
msgid "No results."
|
msgid "No results."
|
||||||
msgstr "Brak wyników."
|
msgstr "Brak wyników."
|
||||||
|
|
||||||
@ -1353,11 +1354,11 @@ msgstr "Skopiuj"
|
|||||||
msgid "Paste"
|
msgid "Paste"
|
||||||
msgstr "Wklej"
|
msgstr "Wklej"
|
||||||
|
|
||||||
#: ../js/ui/shellEntry.js:105
|
#: ../js/ui/shellEntry.js:106
|
||||||
msgid "Show Text"
|
msgid "Show Text"
|
||||||
msgstr "Wyświetl tekst"
|
msgstr "Wyświetl tekst"
|
||||||
|
|
||||||
#: ../js/ui/shellEntry.js:107
|
#: ../js/ui/shellEntry.js:108
|
||||||
msgid "Hide Text"
|
msgid "Hide Text"
|
||||||
msgstr "Ukryj tekst"
|
msgstr "Ukryj tekst"
|
||||||
|
|
||||||
@ -1369,7 +1370,7 @@ msgstr "Hasło"
|
|||||||
msgid "Remember Password"
|
msgid "Remember Password"
|
||||||
msgstr "Zapamiętanie hasła"
|
msgstr "Zapamiętanie hasła"
|
||||||
|
|
||||||
#: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:140
|
#: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:113
|
||||||
msgid "Unlock"
|
msgid "Unlock"
|
||||||
msgstr "Odblokuj"
|
msgstr "Odblokuj"
|
||||||
|
|
||||||
@ -1778,59 +1779,59 @@ msgstr "Głośność"
|
|||||||
msgid "Microphone"
|
msgid "Microphone"
|
||||||
msgstr "Mikrofon"
|
msgstr "Mikrofon"
|
||||||
|
|
||||||
#: ../js/ui/unlockDialog.js:151
|
#: ../js/ui/unlockDialog.js:124
|
||||||
msgid "Log in as another user"
|
msgid "Log in as another user"
|
||||||
msgstr "Zaloguj jako inny użytkownik"
|
msgstr "Zaloguj jako inny użytkownik"
|
||||||
|
|
||||||
#: ../js/ui/unlockDialog.js:177
|
#: ../js/ui/unlockDialog.js:145
|
||||||
msgid "Unlock Window"
|
msgid "Unlock Window"
|
||||||
msgstr "Okno odblokowania"
|
msgstr "Okno odblokowania"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:192
|
#: ../js/ui/userMenu.js:193
|
||||||
msgid "Available"
|
msgid "Available"
|
||||||
msgstr "Dostępny"
|
msgstr "Dostępny"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:195
|
#: ../js/ui/userMenu.js:196
|
||||||
msgid "Busy"
|
msgid "Busy"
|
||||||
msgstr "Zajęty"
|
msgstr "Zajęty"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:198
|
#: ../js/ui/userMenu.js:199
|
||||||
msgid "Invisible"
|
msgid "Invisible"
|
||||||
msgstr "Niewidoczny"
|
msgstr "Niewidoczny"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:201
|
#: ../js/ui/userMenu.js:202
|
||||||
msgid "Away"
|
msgid "Away"
|
||||||
msgstr "Nieobecny"
|
msgstr "Nieobecny"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:204
|
#: ../js/ui/userMenu.js:205
|
||||||
msgid "Idle"
|
msgid "Idle"
|
||||||
msgstr "Bezczynny"
|
msgstr "Bezczynny"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:207
|
#: ../js/ui/userMenu.js:208
|
||||||
msgid "Offline"
|
msgid "Offline"
|
||||||
msgstr "Offline"
|
msgstr "Offline"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:779
|
#: ../js/ui/userMenu.js:781
|
||||||
msgid "Notifications"
|
msgid "Notifications"
|
||||||
msgstr "Powiadomienia"
|
msgstr "Powiadomienia"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:795
|
#: ../js/ui/userMenu.js:797
|
||||||
msgid "Switch User"
|
msgid "Switch User"
|
||||||
msgstr "Przełącz użytkownika"
|
msgstr "Przełącz użytkownika"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:800
|
#: ../js/ui/userMenu.js:802
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "Wyloguj się"
|
msgstr "Wyloguj się"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:820
|
#: ../js/ui/userMenu.js:822
|
||||||
msgid "Install Updates & Restart"
|
msgid "Install Updates & Restart"
|
||||||
msgstr "Zaktualizuj i uruchom ponownie"
|
msgstr "Zaktualizuj i uruchom ponownie"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:838
|
#: ../js/ui/userMenu.js:840
|
||||||
msgid "Your chat status will be set to busy"
|
msgid "Your chat status will be set to busy"
|
||||||
msgstr "Stan komunikatora zostanie ustawiony na \"zajęty\""
|
msgstr "Stan komunikatora zostanie ustawiony na \"zajęty\""
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:839
|
#: ../js/ui/userMenu.js:841
|
||||||
msgid ""
|
msgid ""
|
||||||
"Notifications are now disabled, including chat messages. Your online status "
|
"Notifications are now disabled, including chat messages. Your online status "
|
||||||
"has been adjusted to let others know that you might not see their messages."
|
"has been adjusted to let others know that you might not see their messages."
|
||||||
@ -1840,33 +1841,35 @@ msgstr ""
|
|||||||
"użytkownik tego komputera może nie zobaczyć przychodzących od nich "
|
"użytkownik tego komputera może nie zobaczyć przychodzących od nich "
|
||||||
"wiadomości."
|
"wiadomości."
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:885
|
#: ../js/ui/userMenu.js:888
|
||||||
msgid "Other users are logged in."
|
msgid "Other users are logged in."
|
||||||
msgstr "Inni użytkownicy są zalogowani."
|
msgstr "Inni użytkownicy są zalogowani."
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:890
|
#: ../js/ui/userMenu.js:893
|
||||||
msgid "Shutting down might cause them to lose unsaved work."
|
msgid "Shutting down might cause them to lose unsaved work."
|
||||||
msgstr "Wyłączenie komputera może spowodować utratę danych."
|
msgstr "Wyłączenie komputera może spowodować utratę danych."
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:916
|
#. Translators: Remote here refers to a remote session, like a ssh login
|
||||||
|
#: ../js/ui/userMenu.js:921
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s (remote)"
|
msgid "%s (remote)"
|
||||||
msgstr "%s (zdalnie)"
|
msgstr "%s (zdalnie)"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:918
|
#. Translators: Console here refers to a tty like a VT console
|
||||||
|
#: ../js/ui/userMenu.js:924
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s (console)"
|
msgid "%s (console)"
|
||||||
msgstr "%s (konsola)"
|
msgstr "%s (konsola)"
|
||||||
|
|
||||||
#: ../js/ui/viewSelector.js:101
|
#: ../js/ui/viewSelector.js:100
|
||||||
msgid "Applications"
|
msgid "Applications"
|
||||||
msgstr "Programy"
|
msgstr "Programy"
|
||||||
|
|
||||||
#: ../js/ui/viewSelector.js:105
|
#: ../js/ui/viewSelector.js:104
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr "Wyszukiwanie"
|
msgstr "Wyszukiwanie"
|
||||||
|
|
||||||
#: ../js/ui/wanda.js:92
|
#: ../js/ui/wanda.js:77
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Sorry, no wisdom for you today:\n"
|
"Sorry, no wisdom for you today:\n"
|
||||||
@ -1875,7 +1878,7 @@ msgstr ""
|
|||||||
"Nic mądrego na dzisiaj:\n"
|
"Nic mądrego na dzisiaj:\n"
|
||||||
"%s"
|
"%s"
|
||||||
|
|
||||||
#: ../js/ui/wanda.js:96
|
#: ../js/ui/wanda.js:81
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s the Oracle says"
|
msgid "%s the Oracle says"
|
||||||
msgstr "Wyrocznia %s przemawia"
|
msgstr "Wyrocznia %s przemawia"
|
||||||
|
193
po/ru.po
193
po/ru.po
@ -15,8 +15,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: 2013-03-03 12:52+0000\n"
|
"POT-Creation-Date: 2013-03-14 18:11+0000\n"
|
||||||
"PO-Revision-Date: 2013-03-03 23:21+0400\n"
|
"PO-Revision-Date: 2013-03-22 21:02+0400\n"
|
||||||
"Last-Translator: Yuri Myasoedov <omerta13@yandex.ru>\n"
|
"Last-Translator: Yuri Myasoedov <omerta13@yandex.ru>\n"
|
||||||
"Language-Team: русский <gnome-cyr@gnome.org>\n"
|
"Language-Team: русский <gnome-cyr@gnome.org>\n"
|
||||||
"Language: ru\n"
|
"Language: ru\n"
|
||||||
@ -142,11 +142,11 @@ msgstr ""
|
|||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:11
|
#: ../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 "История команд диалога (Alt-F2)"
|
msgstr "История команд диалогового окна (Alt-F2)"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:12
|
#: ../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 "История просмотра прозрачного диалога"
|
msgstr "История просмотра прозрачного диалогового окна"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:13
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:13
|
||||||
msgid ""
|
msgid ""
|
||||||
@ -223,11 +223,11 @@ msgstr "Комбинация клавиш для перехода в режим
|
|||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
|
#: ../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 "Комбинация клавиш для показа и скрытия панели сообщений"
|
msgstr "Комбинация клавиш для отображения или скрытия панели сообщений"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:26
|
#: ../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 "Комбинация клавиш для показа и скрытия панели сообщений."
|
msgstr "Комбинация клавиш для отображения или скрытия панели сообщений."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
|
||||||
msgid "Keybinding to focus the active notification"
|
msgid "Keybinding to focus the active notification"
|
||||||
@ -239,12 +239,13 @@ msgstr "Комбинация клавиш для перевода фокуса
|
|||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
|
||||||
msgid "Keybinding to toggle the screen recorder"
|
msgid "Keybinding to toggle the screen recorder"
|
||||||
msgstr "Комбинация клавиш для включения и выключения средства записи экрана"
|
msgstr "Комбинация клавиш для включения или выключения средства записи экрана"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
|
||||||
msgid "Keybinding to start/stop the builtin screen recorder."
|
msgid "Keybinding to start/stop the builtin screen recorder."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Комбинация клавиш для запуска и останова встроенного средства записи экрана."
|
"Комбинация клавиш для запуска или остановки встроенного средства записи "
|
||||||
|
"экрана."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
|
||||||
msgid "Which keyboard to use"
|
msgid "Which keyboard to use"
|
||||||
@ -263,8 +264,8 @@ msgid ""
|
|||||||
"The framerate of the resulting screencast recordered by GNOME Shell's "
|
"The framerate of the resulting screencast recordered by GNOME Shell's "
|
||||||
"screencast recorder in frames-per-second."
|
"screencast recorder in frames-per-second."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Частота смены кадров в скринкасте, записанном с помощью GNOME Shell (кадров/"
|
"Частота смены кадров (кадров/сек) скринкаста, записанного с помощью GNOME "
|
||||||
"сек)."
|
"Shell."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35
|
||||||
msgid "The gstreamer pipeline used to encode the screencast"
|
msgid "The gstreamer pipeline used to encode the screencast"
|
||||||
@ -299,7 +300,7 @@ msgstr ""
|
|||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38
|
||||||
msgid "File extension used for storing the screencast"
|
msgid "File extension used for storing the screencast"
|
||||||
msgstr "Расширение файла, использующееся для хранения скринкастов"
|
msgstr "Расширение файла, используемое при сохранении скринкастов"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:39
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:39
|
||||||
msgid ""
|
msgid ""
|
||||||
@ -307,9 +308,9 @@ msgid ""
|
|||||||
"current date, and use this extension. It should be changed when recording to "
|
"current date, and use this extension. It should be changed when recording to "
|
||||||
"a different container format."
|
"a different container format."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Имя файла записанного скринкаста будет уникальным именем, основанным на "
|
"Имя файла записанного скринкаста будет уникальным, основанным на текущей "
|
||||||
"текущей дате, и использует это расширение. Оно должно быть изменено, если "
|
"дате и используемом расширении. Оно должно быть изменено, если запись "
|
||||||
"запись выполняется в другой контейнерный формат."
|
"выполняется в другой формат контейнера."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:40
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:40
|
||||||
msgid "The application icon mode."
|
msgid "The application icon mode."
|
||||||
@ -364,7 +365,7 @@ msgstr "Рабочие места только на основном монит
|
|||||||
#: ../js/extensionPrefs/main.js:125
|
#: ../js/extensionPrefs/main.js:125
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "There was an error loading the preferences dialog for %s:"
|
msgid "There was an error loading the preferences dialog for %s:"
|
||||||
msgstr "При загрузке диалога параметров для %s произошла ошибка:"
|
msgstr "При загрузке диалогового окна параметров для %s произошла ошибка:"
|
||||||
|
|
||||||
#: ../js/extensionPrefs/main.js:165
|
#: ../js/extensionPrefs/main.js:165
|
||||||
msgid "Extension"
|
msgid "Extension"
|
||||||
@ -381,46 +382,46 @@ msgstr "Сеанс…"
|
|||||||
#. translators: this message is shown below the user list on the
|
#. translators: this message is shown below the user list on the
|
||||||
#. login screen. It can be activated to reveal an entry for
|
#. login screen. It can be activated to reveal an entry for
|
||||||
#. manually entering the username.
|
#. manually entering the username.
|
||||||
#: ../js/gdm/loginDialog.js:629
|
#: ../js/gdm/loginDialog.js:630
|
||||||
msgid "Not listed?"
|
msgid "Not listed?"
|
||||||
msgstr "Нет в списке?"
|
msgstr "Нет в списке?"
|
||||||
|
|
||||||
#: ../js/gdm/loginDialog.js:783 ../js/ui/components/networkAgent.js:137
|
#: ../js/gdm/loginDialog.js:784 ../js/ui/components/networkAgent.js:137
|
||||||
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:375
|
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:375
|
||||||
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
|
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
|
||||||
#: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:126
|
#: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:98
|
||||||
#: ../js/ui/userMenu.js:934
|
#: ../js/ui/userMenu.js:938
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Отмена"
|
msgstr "Отмена"
|
||||||
|
|
||||||
#: ../js/gdm/loginDialog.js:799
|
#: ../js/gdm/loginDialog.js:800
|
||||||
msgctxt "button"
|
msgctxt "button"
|
||||||
msgid "Sign In"
|
msgid "Sign In"
|
||||||
msgstr "Войти"
|
msgstr "Войти"
|
||||||
|
|
||||||
#: ../js/gdm/loginDialog.js:799
|
#: ../js/gdm/loginDialog.js:800
|
||||||
msgid "Next"
|
msgid "Next"
|
||||||
msgstr "Следующий"
|
msgstr "Далее"
|
||||||
|
|
||||||
#. TTLS and PEAP are actually much more complicated, but this complication
|
#. TTLS and PEAP are actually much more complicated, but this complication
|
||||||
#. is not visible here since we only care about phase2 authentication
|
#. is not visible here since we only care about phase2 authentication
|
||||||
#. (and don't even care of which one)
|
#. (and don't even care of which one)
|
||||||
#: ../js/gdm/loginDialog.js:904 ../js/ui/components/networkAgent.js:260
|
#: ../js/gdm/loginDialog.js:915 ../js/ui/components/networkAgent.js:260
|
||||||
#: ../js/ui/components/networkAgent.js:278
|
#: ../js/ui/components/networkAgent.js:278
|
||||||
msgid "Username: "
|
msgid "Username: "
|
||||||
msgstr "Имя пользователя: "
|
msgstr "Имя пользователя: "
|
||||||
|
|
||||||
#: ../js/gdm/loginDialog.js:1157
|
#: ../js/gdm/loginDialog.js:1159
|
||||||
msgid "Login Window"
|
msgid "Login Window"
|
||||||
msgstr "Окно входа в систему"
|
msgstr "Окно входа в систему"
|
||||||
|
|
||||||
#. Translators: accessible name of the power menu in the login screen
|
#. Translators: accessible name of the power menu in the login screen
|
||||||
#: ../js/gdm/powerMenu.js:36
|
#: ../js/gdm/powerMenu.js:36
|
||||||
msgid "Power"
|
msgid "Power"
|
||||||
msgstr "Питание"
|
msgstr "Электропитание"
|
||||||
|
|
||||||
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:695 ../js/ui/userMenu.js:699
|
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:696 ../js/ui/userMenu.js:700
|
||||||
#: ../js/ui/userMenu.js:815
|
#: ../js/ui/userMenu.js:816
|
||||||
msgid "Suspend"
|
msgid "Suspend"
|
||||||
msgstr "Ждущий режим"
|
msgstr "Ждущий режим"
|
||||||
|
|
||||||
@ -428,14 +429,14 @@ msgstr "Ждущий режим"
|
|||||||
msgid "Restart"
|
msgid "Restart"
|
||||||
msgstr "Перезапустить"
|
msgstr "Перезапустить"
|
||||||
|
|
||||||
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:697
|
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:698
|
||||||
#: ../js/ui/userMenu.js:699 ../js/ui/userMenu.js:814 ../js/ui/userMenu.js:938
|
#: ../js/ui/userMenu.js:700 ../js/ui/userMenu.js:815 ../js/ui/userMenu.js:942
|
||||||
msgid "Power Off"
|
msgid "Power Off"
|
||||||
msgstr "Выключить"
|
msgstr "Выключить"
|
||||||
|
|
||||||
#: ../js/gdm/util.js:182
|
#: ../js/gdm/util.js:182
|
||||||
msgid "Authentication error"
|
msgid "Authentication error"
|
||||||
msgstr "Ошибка подтверждения подлинности"
|
msgstr "Ошибка проверки подлинности"
|
||||||
|
|
||||||
#. Translators: this message is shown below the password entry field
|
#. Translators: this message is shown below the password entry field
|
||||||
#. to indicate the user can swipe their finger instead
|
#. to indicate the user can swipe their finger instead
|
||||||
@ -448,38 +449,38 @@ msgstr "(или проведите пальцем по считывающему
|
|||||||
msgid "(e.g., user or %s)"
|
msgid "(e.g., user or %s)"
|
||||||
msgstr "(например, пользователь или %s)"
|
msgstr "(например, пользователь или %s)"
|
||||||
|
|
||||||
#: ../js/misc/util.js:94
|
#: ../js/misc/util.js:97
|
||||||
msgid "Command not found"
|
msgid "Command not found"
|
||||||
msgstr "Команда не найдена"
|
msgstr "Команда не найдена"
|
||||||
|
|
||||||
#. Replace "Error invoking GLib.shell_parse_argv: " with
|
#. Replace "Error invoking GLib.shell_parse_argv: " with
|
||||||
#. something nicer
|
#. something nicer
|
||||||
#: ../js/misc/util.js:127
|
#: ../js/misc/util.js:130
|
||||||
msgid "Could not parse command:"
|
msgid "Could not parse command:"
|
||||||
msgstr "Не удалось разобрать команду:"
|
msgstr "Не удалось разобрать команду:"
|
||||||
|
|
||||||
#: ../js/misc/util.js:135
|
#: ../js/misc/util.js:138
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Execution of '%s' failed:"
|
msgid "Execution of '%s' failed:"
|
||||||
msgstr "Не удалось выполнить «%s»:"
|
msgstr "Не удалось выполнить «%s»:"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:348
|
#: ../js/ui/appDisplay.js:325
|
||||||
msgid "Frequent"
|
msgid "Frequent"
|
||||||
msgstr "Часто используемые"
|
msgstr "Популярные"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:355
|
#: ../js/ui/appDisplay.js:332
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Все"
|
msgstr "Все"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:913
|
#: ../js/ui/appDisplay.js:890
|
||||||
msgid "New Window"
|
msgid "New Window"
|
||||||
msgstr "Новое окно"
|
msgstr "Новое окно"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:916 ../js/ui/dash.js:284
|
#: ../js/ui/appDisplay.js:893 ../js/ui/dash.js:284
|
||||||
msgid "Remove from Favorites"
|
msgid "Remove from Favorites"
|
||||||
msgstr "Удалить из избранного"
|
msgstr "Удалить из избранного"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:917
|
#: ../js/ui/appDisplay.js:894
|
||||||
msgid "Add to Favorites"
|
msgid "Add to Favorites"
|
||||||
msgstr "Добавить в избранное"
|
msgstr "Добавить в избранное"
|
||||||
|
|
||||||
@ -493,7 +494,7 @@ msgstr "Приложение %s добавлено в избранное."
|
|||||||
msgid "%s has been removed from your favorites."
|
msgid "%s has been removed from your favorites."
|
||||||
msgstr "Приложение %s удалено из избранного."
|
msgstr "Приложение %s удалено из избранного."
|
||||||
|
|
||||||
#: ../js/ui/backgroundMenu.js:19 ../js/ui/userMenu.js:788
|
#: ../js/ui/backgroundMenu.js:19 ../js/ui/userMenu.js:789
|
||||||
msgid "Settings"
|
msgid "Settings"
|
||||||
msgstr "Параметры"
|
msgstr "Параметры"
|
||||||
|
|
||||||
@ -618,35 +619,35 @@ msgid "S"
|
|||||||
msgstr "Сб"
|
msgstr "Сб"
|
||||||
|
|
||||||
#. Translators: Text to show if there are no events
|
#. Translators: Text to show if there are no events
|
||||||
#: ../js/ui/calendar.js:692
|
#: ../js/ui/calendar.js:720
|
||||||
msgid "Nothing Scheduled"
|
msgid "Nothing Scheduled"
|
||||||
msgstr "Нет событий"
|
msgstr "Нет событий"
|
||||||
|
|
||||||
#. Translators: Shown on calendar heading when selected day occurs on current year
|
#. Translators: Shown on calendar heading when selected day occurs on current year
|
||||||
#: ../js/ui/calendar.js:708
|
#: ../js/ui/calendar.js:736
|
||||||
msgctxt "calendar heading"
|
msgctxt "calendar heading"
|
||||||
msgid "%A, %B %d"
|
msgid "%A, %B %d"
|
||||||
msgstr "%A, %B %d"
|
msgstr "%A, %B %d"
|
||||||
|
|
||||||
#. Translators: Shown on calendar heading when selected day occurs on different year
|
#. Translators: Shown on calendar heading when selected day occurs on different year
|
||||||
#: ../js/ui/calendar.js:711
|
#: ../js/ui/calendar.js:739
|
||||||
msgctxt "calendar heading"
|
msgctxt "calendar heading"
|
||||||
msgid "%A, %B %d, %Y"
|
msgid "%A, %B %d, %Y"
|
||||||
msgstr "%A, %B %d, %Y"
|
msgstr "%A, %B %d, %Y"
|
||||||
|
|
||||||
#: ../js/ui/calendar.js:721
|
#: ../js/ui/calendar.js:749
|
||||||
msgid "Today"
|
msgid "Today"
|
||||||
msgstr "Сегодня"
|
msgstr "Сегодня"
|
||||||
|
|
||||||
#: ../js/ui/calendar.js:725
|
#: ../js/ui/calendar.js:753
|
||||||
msgid "Tomorrow"
|
msgid "Tomorrow"
|
||||||
msgstr "Завтра"
|
msgstr "Завтра"
|
||||||
|
|
||||||
#: ../js/ui/calendar.js:736
|
#: ../js/ui/calendar.js:764
|
||||||
msgid "This week"
|
msgid "This week"
|
||||||
msgstr "Эта неделя"
|
msgstr "Эта неделя"
|
||||||
|
|
||||||
#: ../js/ui/calendar.js:744
|
#: ../js/ui/calendar.js:772
|
||||||
msgid "Next week"
|
msgid "Next week"
|
||||||
msgstr "Следующая неделя"
|
msgstr "Следующая неделя"
|
||||||
|
|
||||||
@ -743,7 +744,7 @@ msgstr "Для широкополосного мобильного устрой
|
|||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:330
|
#: ../js/ui/components/networkAgent.js:330
|
||||||
msgid "PIN: "
|
msgid "PIN: "
|
||||||
msgstr "PIN: "
|
msgstr "PIN-код: "
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:336
|
#: ../js/ui/components/networkAgent.js:336
|
||||||
msgid "Mobile broadband network password"
|
msgid "Mobile broadband network password"
|
||||||
@ -772,7 +773,7 @@ msgstr "Подтвердить"
|
|||||||
#. * for instance.
|
#. * for instance.
|
||||||
#: ../js/ui/components/polkitAgent.js:256 ../js/ui/shellMountOperation.js:383
|
#: ../js/ui/components/polkitAgent.js:256 ../js/ui/shellMountOperation.js:383
|
||||||
msgid "Sorry, that didn't work. Please try again."
|
msgid "Sorry, that didn't work. Please try again."
|
||||||
msgstr "Извините, это не сработало. Попробуйте снова."
|
msgstr "Не удалось подтвердить подлинность. Попробуйте снова."
|
||||||
|
|
||||||
#. Translators: this is a filename used for screencast recording
|
#. Translators: this is a filename used for screencast recording
|
||||||
#: ../js/ui/components/recorder.js:48
|
#: ../js/ui/components/recorder.js:48
|
||||||
@ -1020,7 +1021,7 @@ msgstr "Показать учётную запись"
|
|||||||
msgid "Unknown reason"
|
msgid "Unknown reason"
|
||||||
msgstr "Неизвестная причина"
|
msgstr "Неизвестная причина"
|
||||||
|
|
||||||
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:97
|
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:96
|
||||||
msgid "Windows"
|
msgid "Windows"
|
||||||
msgstr "Окна"
|
msgstr "Окна"
|
||||||
|
|
||||||
@ -1049,7 +1050,7 @@ msgstr "Настроить дату и время"
|
|||||||
#. Translators: This is the date format to use when the calendar popup is
|
#. Translators: This is the date format to use when the calendar popup is
|
||||||
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
|
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
|
||||||
#.
|
#.
|
||||||
#: ../js/ui/dateMenu.js:205
|
#: ../js/ui/dateMenu.js:215
|
||||||
msgid "%A %B %e, %Y"
|
msgid "%A %B %e, %Y"
|
||||||
msgstr "%A, %e %B, %Y"
|
msgstr "%A, %e %B, %Y"
|
||||||
|
|
||||||
@ -1057,7 +1058,7 @@ msgstr "%A, %e %B, %Y"
|
|||||||
#, c-format
|
#, c-format
|
||||||
msgctxt "title"
|
msgctxt "title"
|
||||||
msgid "Log Out %s"
|
msgid "Log Out %s"
|
||||||
msgstr "Завершить сеанс пользователя %s"
|
msgstr "Завершение сеанса пользователя %s"
|
||||||
|
|
||||||
#: ../js/ui/endSessionDialog.js:64
|
#: ../js/ui/endSessionDialog.js:64
|
||||||
msgctxt "title"
|
msgctxt "title"
|
||||||
@ -1228,15 +1229,15 @@ msgstr "Очистить список сообщений"
|
|||||||
msgid "Notification Settings"
|
msgid "Notification Settings"
|
||||||
msgstr "Параметры уведомлений"
|
msgstr "Параметры уведомлений"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:1707
|
#: ../js/ui/messageTray.js:1711
|
||||||
msgid "No Messages"
|
msgid "No Messages"
|
||||||
msgstr "Нет сообщений"
|
msgstr "Нет сообщений"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:1787
|
#: ../js/ui/messageTray.js:1784
|
||||||
msgid "Message Tray"
|
msgid "Message Tray"
|
||||||
msgstr "Панель сообщений"
|
msgstr "Панель сообщений"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:2864
|
#: ../js/ui/messageTray.js:2816
|
||||||
msgid "System Information"
|
msgid "System Information"
|
||||||
msgstr "Системная информация"
|
msgstr "Системная информация"
|
||||||
|
|
||||||
@ -1245,7 +1246,7 @@ msgctxt "program"
|
|||||||
msgid "Unknown"
|
msgid "Unknown"
|
||||||
msgstr "Неизвестно"
|
msgstr "Неизвестно"
|
||||||
|
|
||||||
#: ../js/ui/overviewControls.js:460 ../js/ui/screenShield.js:153
|
#: ../js/ui/overviewControls.js:463 ../js/ui/screenShield.js:148
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%d new message"
|
msgid "%d new message"
|
||||||
msgid_plural "%d new messages"
|
msgid_plural "%d new messages"
|
||||||
@ -1253,7 +1254,7 @@ msgstr[0] "%d новое сообщение"
|
|||||||
msgstr[1] "%d новых сообщения"
|
msgstr[1] "%d новых сообщения"
|
||||||
msgstr[2] "%d новых сообщений"
|
msgstr[2] "%d новых сообщений"
|
||||||
|
|
||||||
#: ../js/ui/overview.js:82
|
#: ../js/ui/overview.js:84
|
||||||
msgid "Undo"
|
msgid "Undo"
|
||||||
msgstr "Отменить"
|
msgstr "Отменить"
|
||||||
|
|
||||||
@ -1265,21 +1266,21 @@ msgstr "Обзор"
|
|||||||
#. in the search entry when no search is
|
#. in the search entry when no search is
|
||||||
#. active; it should not exceed ~30
|
#. active; it should not exceed ~30
|
||||||
#. characters.
|
#. characters.
|
||||||
#: ../js/ui/overview.js:284
|
#: ../js/ui/overview.js:271
|
||||||
msgid "Type to search…"
|
msgid "Type to search…"
|
||||||
msgstr "Найти…"
|
msgstr "Найти…"
|
||||||
|
|
||||||
#: ../js/ui/panel.js:613
|
#: ../js/ui/panel.js:612
|
||||||
msgid "Quit"
|
msgid "Quit"
|
||||||
msgstr "Закрыть"
|
msgstr "Закрыть"
|
||||||
|
|
||||||
#. 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:642
|
#: ../js/ui/panel.js:636
|
||||||
msgid "Activities"
|
msgid "Activities"
|
||||||
msgstr "Обзор"
|
msgstr "Обзор"
|
||||||
|
|
||||||
#: ../js/ui/panel.js:983
|
#: ../js/ui/panel.js:933
|
||||||
msgid "Top Bar"
|
msgid "Top Bar"
|
||||||
msgstr "Верхняя панель"
|
msgstr "Верхняя панель"
|
||||||
|
|
||||||
@ -1292,33 +1293,33 @@ msgstr "Верхняя панель"
|
|||||||
msgid "toggle-switch-us"
|
msgid "toggle-switch-us"
|
||||||
msgstr "toggle-switch-intl"
|
msgstr "toggle-switch-intl"
|
||||||
|
|
||||||
#: ../js/ui/runDialog.js:205
|
#: ../js/ui/runDialog.js:73
|
||||||
msgid "Enter a Command"
|
msgid "Enter a Command"
|
||||||
msgstr "Введите команду"
|
msgstr "Введите команду"
|
||||||
|
|
||||||
#: ../js/ui/runDialog.js:241
|
#: ../js/ui/runDialog.js:109
|
||||||
msgid "Close"
|
msgid "Close"
|
||||||
msgstr "Закрыть"
|
msgstr "Закрыть"
|
||||||
|
|
||||||
#. 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:90
|
#: ../js/ui/screenShield.js:85
|
||||||
msgid "%A, %B %d"
|
msgid "%A, %B %d"
|
||||||
msgstr "%d %B, %A"
|
msgstr "%d %B, %A"
|
||||||
|
|
||||||
#: ../js/ui/screenShield.js:155
|
#: ../js/ui/screenShield.js:150
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%d new notification"
|
msgid "%d new notification"
|
||||||
msgid_plural "%d new notifications"
|
msgid_plural "%d new notifications"
|
||||||
msgstr[0] "%d новые уведомление"
|
msgstr[0] "%d новое уведомление"
|
||||||
msgstr[1] "%d новых уведомленя"
|
msgstr[1] "%d новых уведомления"
|
||||||
msgstr[2] "%d новых уведомлений"
|
msgstr[2] "%d новых уведомлений"
|
||||||
|
|
||||||
#: ../js/ui/screenShield.js:442 ../js/ui/userMenu.js:806
|
#: ../js/ui/screenShield.js:437 ../js/ui/userMenu.js:807
|
||||||
msgid "Lock"
|
msgid "Lock"
|
||||||
msgstr "Заблокировать"
|
msgstr "Заблокировать"
|
||||||
|
|
||||||
#: ../js/ui/screenShield.js:639
|
#: ../js/ui/screenShield.js:635
|
||||||
msgid "GNOME needs to lock the screen"
|
msgid "GNOME needs to lock the screen"
|
||||||
msgstr "GNOME необходимо заблокировать экран"
|
msgstr "GNOME необходимо заблокировать экран"
|
||||||
|
|
||||||
@ -1329,19 +1330,19 @@ msgstr "GNOME необходимо заблокировать экран"
|
|||||||
#.
|
#.
|
||||||
#. XXX: another option is to kick the user into the gdm login
|
#. XXX: another option is to kick the user into the gdm login
|
||||||
#. screen, where we're not affected by grabs
|
#. screen, where we're not affected by grabs
|
||||||
#: ../js/ui/screenShield.js:758 ../js/ui/screenShield.js:1169
|
#: ../js/ui/screenShield.js:756 ../js/ui/screenShield.js:1151
|
||||||
msgid "Unable to lock"
|
msgid "Unable to lock"
|
||||||
msgstr "Не удалось заблокировать"
|
msgstr "Не удалось заблокировать"
|
||||||
|
|
||||||
#: ../js/ui/screenShield.js:759 ../js/ui/screenShield.js:1170
|
#: ../js/ui/screenShield.js:757 ../js/ui/screenShield.js:1152
|
||||||
msgid "Lock was blocked by an application"
|
msgid "Lock was blocked by an application"
|
||||||
msgstr "Блокировано помешало приложение"
|
msgstr "Блокировке помешало приложение"
|
||||||
|
|
||||||
#: ../js/ui/searchDisplay.js:431
|
#: ../js/ui/searchDisplay.js:451
|
||||||
msgid "Searching…"
|
msgid "Searching…"
|
||||||
msgstr "Поиск…"
|
msgstr "Поиск…"
|
||||||
|
|
||||||
#: ../js/ui/searchDisplay.js:475
|
#: ../js/ui/searchDisplay.js:495
|
||||||
msgid "No results."
|
msgid "No results."
|
||||||
msgstr "Нет результатов."
|
msgstr "Нет результатов."
|
||||||
|
|
||||||
@ -1353,11 +1354,11 @@ msgstr "Копировать"
|
|||||||
msgid "Paste"
|
msgid "Paste"
|
||||||
msgstr "Вставить"
|
msgstr "Вставить"
|
||||||
|
|
||||||
#: ../js/ui/shellEntry.js:105
|
#: ../js/ui/shellEntry.js:106
|
||||||
msgid "Show Text"
|
msgid "Show Text"
|
||||||
msgstr "Показать текст"
|
msgstr "Показать текст"
|
||||||
|
|
||||||
#: ../js/ui/shellEntry.js:107
|
#: ../js/ui/shellEntry.js:108
|
||||||
msgid "Hide Text"
|
msgid "Hide Text"
|
||||||
msgstr "Скрыть текст"
|
msgstr "Скрыть текст"
|
||||||
|
|
||||||
@ -1369,7 +1370,7 @@ msgstr "Пароль"
|
|||||||
msgid "Remember Password"
|
msgid "Remember Password"
|
||||||
msgstr "Запомнить пароль"
|
msgstr "Запомнить пароль"
|
||||||
|
|
||||||
#: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:140
|
#: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:112
|
||||||
msgid "Unlock"
|
msgid "Unlock"
|
||||||
msgstr "Разблокировать"
|
msgstr "Разблокировать"
|
||||||
|
|
||||||
@ -1670,7 +1671,7 @@ msgstr "Батарея"
|
|||||||
|
|
||||||
#: ../js/ui/status/power.js:81
|
#: ../js/ui/status/power.js:81
|
||||||
msgid "Power Settings"
|
msgid "Power Settings"
|
||||||
msgstr "Параметры питания"
|
msgstr "Параметры электропитания"
|
||||||
|
|
||||||
#. 0 is reported when UPower does not have enough data
|
#. 0 is reported when UPower does not have enough data
|
||||||
#. to estimate battery life
|
#. to estimate battery life
|
||||||
@ -1778,11 +1779,11 @@ msgstr "Громкость"
|
|||||||
msgid "Microphone"
|
msgid "Microphone"
|
||||||
msgstr "Микрофон"
|
msgstr "Микрофон"
|
||||||
|
|
||||||
#: ../js/ui/unlockDialog.js:151
|
#: ../js/ui/unlockDialog.js:123
|
||||||
msgid "Log in as another user"
|
msgid "Log in as another user"
|
||||||
msgstr "Войти от имени другого пользователя"
|
msgstr "Войти от имени другого пользователя"
|
||||||
|
|
||||||
#: ../js/ui/unlockDialog.js:177
|
#: ../js/ui/unlockDialog.js:144
|
||||||
msgid "Unlock Window"
|
msgid "Unlock Window"
|
||||||
msgstr "Разблокировать окно"
|
msgstr "Разблокировать окно"
|
||||||
|
|
||||||
@ -1810,27 +1811,27 @@ msgstr "Бездействует"
|
|||||||
msgid "Offline"
|
msgid "Offline"
|
||||||
msgstr "Не в сети"
|
msgstr "Не в сети"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:780
|
#: ../js/ui/userMenu.js:781
|
||||||
msgid "Notifications"
|
msgid "Notifications"
|
||||||
msgstr "Уведомления"
|
msgstr "Уведомления"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:796
|
#: ../js/ui/userMenu.js:797
|
||||||
msgid "Switch User"
|
msgid "Switch User"
|
||||||
msgstr "Сменить пользователя"
|
msgstr "Сменить пользователя"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:801
|
#: ../js/ui/userMenu.js:802
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "Выйти из системы"
|
msgstr "Выйти из системы"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:821
|
#: ../js/ui/userMenu.js:822
|
||||||
msgid "Install Updates & Restart"
|
msgid "Install Updates & Restart"
|
||||||
msgstr "Установить обновления и выполнить перезагрузку"
|
msgstr "Установить обновления и выполнить перезагрузку"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:839
|
#: ../js/ui/userMenu.js:840
|
||||||
msgid "Your chat status will be set to busy"
|
msgid "Your chat status will be set to busy"
|
||||||
msgstr "Будет установлен статус «не беспокоить»"
|
msgstr "Будет установлен статус «не беспокоить»"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:840
|
#: ../js/ui/userMenu.js:841
|
||||||
msgid ""
|
msgid ""
|
||||||
"Notifications are now disabled, including chat messages. Your online status "
|
"Notifications are now disabled, including chat messages. Your online status "
|
||||||
"has been adjusted to let others know that you might not see their messages."
|
"has been adjusted to let others know that you might not see their messages."
|
||||||
@ -1838,33 +1839,35 @@ msgstr ""
|
|||||||
"Уведомления отключены, включая сообщения в чате. Ваш статус доступности "
|
"Уведомления отключены, включая сообщения в чате. Ваш статус доступности "
|
||||||
"изменён, чтобы другие знали, что вы возможно не видите их сообщения."
|
"изменён, чтобы другие знали, что вы возможно не видите их сообщения."
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:886
|
#: ../js/ui/userMenu.js:888
|
||||||
msgid "Other users are logged in."
|
msgid "Other users are logged in."
|
||||||
msgstr "В системе имеются сеансы других пользователей."
|
msgstr "В системе имеются открытые сеансы других пользователей."
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:891
|
#: ../js/ui/userMenu.js:893
|
||||||
msgid "Shutting down might cause them to lose unsaved work."
|
msgid "Shutting down might cause them to lose unsaved work."
|
||||||
msgstr "Завершение работы может привести к потере несохранённых изменений."
|
msgstr "Завершение работы может привести к потере несохранённых изменений."
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:918
|
#. Translators: Remote here refers to a remote session, like a ssh login
|
||||||
|
#: ../js/ui/userMenu.js:921
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s (remote)"
|
msgid "%s (remote)"
|
||||||
msgstr "%s (удалённый)"
|
msgstr "%s (удалённый)"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:920
|
#. Translators: Console here refers to a tty like a VT console
|
||||||
|
#: ../js/ui/userMenu.js:924
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s (console)"
|
msgid "%s (console)"
|
||||||
msgstr "%s (консоль)"
|
msgstr "%s (консоль)"
|
||||||
|
|
||||||
#: ../js/ui/viewSelector.js:101
|
#: ../js/ui/viewSelector.js:100
|
||||||
msgid "Applications"
|
msgid "Applications"
|
||||||
msgstr "Приложения"
|
msgstr "Приложения"
|
||||||
|
|
||||||
#: ../js/ui/viewSelector.js:105
|
#: ../js/ui/viewSelector.js:104
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr "Поиск"
|
msgstr "Поиск"
|
||||||
|
|
||||||
#: ../js/ui/wanda.js:92
|
#: ../js/ui/wanda.js:77
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Sorry, no wisdom for you today:\n"
|
"Sorry, no wisdom for you today:\n"
|
||||||
@ -1873,7 +1876,7 @@ msgstr ""
|
|||||||
"Извините, на сегодня нет никаких советов:\n"
|
"Извините, на сегодня нет никаких советов:\n"
|
||||||
"%s"
|
"%s"
|
||||||
|
|
||||||
#: ../js/ui/wanda.js:96
|
#: ../js/ui/wanda.js:81
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s the Oracle says"
|
msgid "%s the Oracle says"
|
||||||
msgstr "Оракул говорит: «%s»"
|
msgstr "Оракул говорит: «%s»"
|
||||||
|
592
po/sr@latin.po
592
po/sr@latin.po
File diff suppressed because it is too large
Load Diff
77
po/ug.po
77
po/ug.po
@ -11,8 +11,8 @@ msgid ""
|
|||||||
msgstr ""
|
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-shell&keywords=I18N+L10N&component=general\n"
|
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell&keywords=I18N+L10N&component=general\n"
|
||||||
"POT-Creation-Date: 2013-03-02 23:02+0000\n"
|
"POT-Creation-Date: 2013-03-04 08:38+0000\n"
|
||||||
"PO-Revision-Date: 2013-03-03 15:57+0900\n"
|
"PO-Revision-Date: 2013-03-07 21:01+0900\n"
|
||||||
"Last-Translator: Gheyret Kenji <gheyret@gmail.com>\n"
|
"Last-Translator: Gheyret Kenji <gheyret@gmail.com>\n"
|
||||||
"Language-Team: Uyghur Computer Science Association <UKIJ@yahoogroups.com>\n"
|
"Language-Team: Uyghur Computer Science Association <UKIJ@yahoogroups.com>\n"
|
||||||
"Language: \n"
|
"Language: \n"
|
||||||
@ -112,13 +112,13 @@ msgstr "مۇناسىپ پروگرامما بەلگىسى يىغقۇچ رايون
|
|||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:9
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:9
|
||||||
msgid "List of categories that should be displayed as folders"
|
msgid "List of categories that should be displayed as folders"
|
||||||
msgstr ""
|
msgstr "قىسقۇچ سۈپىتىدە كۆرسىتىلىدىغان كاتېگورىيەلەرنىڭ تىزىمى"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:10
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:10
|
||||||
msgid ""
|
msgid ""
|
||||||
"Each category name in this list will be represented as folder in the "
|
"Each category name in this list will be represented as folder in the "
|
||||||
"application view, rather than being displayed inline in the main view."
|
"application view, rather than being displayed inline in the main view."
|
||||||
msgstr ""
|
msgstr "پروگرامما كۆرۈنۈشىدە ھەر بىر كاتېگورىيە ئاتى قىسقۇچ سۈپىتىدە ئىپادىلىنىدۇ، ئاساسىي كۆرۈنۈشتە كۆرسىتىلمەيدۇ."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:11
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:11
|
||||||
msgid "History for command (Alt-F2) dialog"
|
msgid "History for command (Alt-F2) dialog"
|
||||||
@ -316,7 +316,6 @@ msgid "Select an extension to configure using the combobox above."
|
|||||||
msgstr "يۇقىرىدىكى combobox دىن سەپلەيدىغان كېڭەيتىلمىنى تاللاڭ."
|
msgstr "يۇقىرىدىكى combobox دىن سەپلەيدىغان كېڭەيتىلمىنى تاللاڭ."
|
||||||
|
|
||||||
#: ../js/gdm/loginDialog.js:405
|
#: ../js/gdm/loginDialog.js:405
|
||||||
#| msgid "Session..."
|
|
||||||
msgid "Session…"
|
msgid "Session…"
|
||||||
msgstr "ئەڭگىمە…"
|
msgstr "ئەڭگىمە…"
|
||||||
|
|
||||||
@ -331,7 +330,7 @@ msgstr "تىزىمدا يوقمۇ؟"
|
|||||||
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:375
|
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:375
|
||||||
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
|
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
|
||||||
#: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:126
|
#: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:126
|
||||||
#: ../js/ui/userMenu.js:932
|
#: ../js/ui/userMenu.js:934
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "ئەمەلدىن قالدۇر"
|
msgstr "ئەمەلدىن قالدۇر"
|
||||||
|
|
||||||
@ -361,8 +360,8 @@ msgstr "كىرىش كۆزنىكى"
|
|||||||
msgid "Power"
|
msgid "Power"
|
||||||
msgstr "توك مەنبە"
|
msgstr "توك مەنبە"
|
||||||
|
|
||||||
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:694 ../js/ui/userMenu.js:698
|
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:695 ../js/ui/userMenu.js:699
|
||||||
#: ../js/ui/userMenu.js:814
|
#: ../js/ui/userMenu.js:815
|
||||||
msgid "Suspend"
|
msgid "Suspend"
|
||||||
msgstr "توڭلات"
|
msgstr "توڭلات"
|
||||||
|
|
||||||
@ -370,14 +369,14 @@ msgstr "توڭلات"
|
|||||||
msgid "Restart"
|
msgid "Restart"
|
||||||
msgstr "قايتا قوزغات"
|
msgstr "قايتا قوزغات"
|
||||||
|
|
||||||
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:696
|
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:697
|
||||||
#: ../js/ui/userMenu.js:698 ../js/ui/userMenu.js:813 ../js/ui/userMenu.js:936
|
#: ../js/ui/userMenu.js:699 ../js/ui/userMenu.js:814 ../js/ui/userMenu.js:938
|
||||||
msgid "Power Off"
|
msgid "Power Off"
|
||||||
msgstr "توكنى ئۈز"
|
msgstr "توكنى ئۈز"
|
||||||
|
|
||||||
#: ../js/gdm/util.js:182
|
#: ../js/gdm/util.js:182
|
||||||
msgid "Authentication error"
|
msgid "Authentication error"
|
||||||
msgstr "سالاھىيەت دەلىللەش خاتالىقى"
|
msgstr "كىملىك دەلىللەش خاتالىقى"
|
||||||
|
|
||||||
#. Translators: this message is shown below the password entry field
|
#. Translators: this message is shown below the password entry field
|
||||||
#. to indicate the user can swipe their finger instead
|
#. to indicate the user can swipe their finger instead
|
||||||
@ -435,7 +434,7 @@ msgstr "%s يىغقۇچىڭىزغا قوشۇلدى."
|
|||||||
msgid "%s has been removed from your favorites."
|
msgid "%s has been removed from your favorites."
|
||||||
msgstr "%s يىغقۇچىڭىزدىن چىقىرىۋېتىلىدۇ."
|
msgstr "%s يىغقۇچىڭىزدىن چىقىرىۋېتىلىدۇ."
|
||||||
|
|
||||||
#: ../js/ui/backgroundMenu.js:19 ../js/ui/userMenu.js:787
|
#: ../js/ui/backgroundMenu.js:19 ../js/ui/userMenu.js:788
|
||||||
msgid "Settings"
|
msgid "Settings"
|
||||||
msgstr "تەڭشەكلەر"
|
msgstr "تەڭشەكلەر"
|
||||||
|
|
||||||
@ -697,7 +696,7 @@ msgstr "‹%s› كە باغلىنىش ئۈچۈن بىر ئىمغا ئېھتىي
|
|||||||
|
|
||||||
#: ../js/ui/components/polkitAgent.js:55
|
#: ../js/ui/components/polkitAgent.js:55
|
||||||
msgid "Authentication Required"
|
msgid "Authentication Required"
|
||||||
msgstr "سالاھىيەت دەلىللەش زۆرۈر"
|
msgstr "كىملىك دەلىللەش زۆرۈر"
|
||||||
|
|
||||||
#: ../js/ui/components/polkitAgent.js:93
|
#: ../js/ui/components/polkitAgent.js:93
|
||||||
msgid "Administrator"
|
msgid "Administrator"
|
||||||
@ -847,7 +846,7 @@ msgstr "تور خاتالىقى"
|
|||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1300
|
#: ../js/ui/components/telepathyClient.js:1300
|
||||||
msgid "Authentication failed"
|
msgid "Authentication failed"
|
||||||
msgstr "سالاھىيەت دەلىللەش مەغلۇپ بولدى"
|
msgstr "كىملىك دەلىللەش مەغلۇپ بولدى"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1302
|
#: ../js/ui/components/telepathyClient.js:1302
|
||||||
msgid "Encryption error"
|
msgid "Encryption error"
|
||||||
@ -956,7 +955,7 @@ msgstr "ھېساباتنى كۆرۈش"
|
|||||||
msgid "Unknown reason"
|
msgid "Unknown reason"
|
||||||
msgstr "نامەلۇم سەۋەب"
|
msgstr "نامەلۇم سەۋەب"
|
||||||
|
|
||||||
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:97
|
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:96
|
||||||
msgid "Windows"
|
msgid "Windows"
|
||||||
msgstr "كۆزنەكلەر"
|
msgstr "كۆزنەكلەر"
|
||||||
|
|
||||||
@ -1144,7 +1143,6 @@ msgid "Remove"
|
|||||||
msgstr "چىقىرىۋەت"
|
msgstr "چىقىرىۋەت"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:1501
|
#: ../js/ui/messageTray.js:1501
|
||||||
#| msgid "No Messages"
|
|
||||||
msgid "Clear Messages"
|
msgid "Clear Messages"
|
||||||
msgstr "ئۇچۇرنى تازىلا"
|
msgstr "ئۇچۇرنى تازىلا"
|
||||||
|
|
||||||
@ -1188,7 +1186,6 @@ msgstr "قىسقىچە بايان"
|
|||||||
#. active; it should not exceed ~30
|
#. active; it should not exceed ~30
|
||||||
#. characters.
|
#. characters.
|
||||||
#: ../js/ui/overview.js:284
|
#: ../js/ui/overview.js:284
|
||||||
#| msgid "Type to search..."
|
|
||||||
msgid "Type to search…"
|
msgid "Type to search…"
|
||||||
msgstr "ئىزدەيدىغاننى كىرگۈزۈڭ.…"
|
msgstr "ئىزدەيدىغاننى كىرگۈزۈڭ.…"
|
||||||
|
|
||||||
@ -1235,7 +1232,7 @@ msgid "%d new notification"
|
|||||||
msgid_plural "%d new notifications"
|
msgid_plural "%d new notifications"
|
||||||
msgstr[0] "%d دانە ئۇقتۇرۇش"
|
msgstr[0] "%d دانە ئۇقتۇرۇش"
|
||||||
|
|
||||||
#: ../js/ui/screenShield.js:442 ../js/ui/userMenu.js:805
|
#: ../js/ui/screenShield.js:442 ../js/ui/userMenu.js:806
|
||||||
msgid "Lock"
|
msgid "Lock"
|
||||||
msgstr "قۇلۇپلا"
|
msgstr "قۇلۇپلا"
|
||||||
|
|
||||||
@ -1251,7 +1248,6 @@ msgstr "گىنوم ئېكراننى قۇلۇپلىشى زۆرۈر"
|
|||||||
#. XXX: another option is to kick the user into the gdm login
|
#. XXX: another option is to kick the user into the gdm login
|
||||||
#. screen, where we're not affected by grabs
|
#. screen, where we're not affected by grabs
|
||||||
#: ../js/ui/screenShield.js:758 ../js/ui/screenShield.js:1169
|
#: ../js/ui/screenShield.js:758 ../js/ui/screenShield.js:1169
|
||||||
#| msgid "Unable to connect to %s"
|
|
||||||
msgid "Unable to lock"
|
msgid "Unable to lock"
|
||||||
msgstr "قۇلۇپلىغىلى بولمىدى"
|
msgstr "قۇلۇپلىغىلى بولمىدى"
|
||||||
|
|
||||||
@ -1260,7 +1256,6 @@ msgid "Lock was blocked by an application"
|
|||||||
msgstr "بىر پروگرامما قۇلۇپلاشنى توسۇپ قويغان"
|
msgstr "بىر پروگرامما قۇلۇپلاشنى توسۇپ قويغان"
|
||||||
|
|
||||||
#: ../js/ui/searchDisplay.js:431
|
#: ../js/ui/searchDisplay.js:431
|
||||||
#| msgid "Searching..."
|
|
||||||
msgid "Searching…"
|
msgid "Searching…"
|
||||||
msgstr "ئىزدەۋاتىدۇ…"
|
msgstr "ئىزدەۋاتىدۇ…"
|
||||||
|
|
||||||
@ -1356,12 +1351,10 @@ msgid "Visibility"
|
|||||||
msgstr "كۆرۈشچانلىقى"
|
msgstr "كۆرۈشچانلىقى"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:59
|
#: ../js/ui/status/bluetooth.js:59
|
||||||
#| msgid "Send Files to Device..."
|
|
||||||
msgid "Send Files to Device…"
|
msgid "Send Files to Device…"
|
||||||
msgstr "ھۆججەتلەرنى ئۈسكۈنىگە ئەۋەتىش…"
|
msgstr "ھۆججەتلەرنى ئۈسكۈنىگە ئەۋەتىش…"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:60
|
#: ../js/ui/status/bluetooth.js:60
|
||||||
#| msgid "Set Up a New Device..."
|
|
||||||
msgid "Set Up a New Device…"
|
msgid "Set Up a New Device…"
|
||||||
msgstr "يېڭى ئۈسكۈنە ئورنىتىش…"
|
msgstr "يېڭى ئۈسكۈنە ئورنىتىش…"
|
||||||
|
|
||||||
@ -1388,7 +1381,6 @@ msgid "connecting..."
|
|||||||
msgstr "باغلىنىۋاتىدۇ…"
|
msgstr "باغلىنىۋاتىدۇ…"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:239
|
#: ../js/ui/status/bluetooth.js:239
|
||||||
#| msgid "Send Files..."
|
|
||||||
msgid "Send Files…"
|
msgid "Send Files…"
|
||||||
msgstr "ھۆججەت يوللاش…"
|
msgstr "ھۆججەت يوللاش…"
|
||||||
|
|
||||||
@ -1494,7 +1486,7 @@ msgstr "باشقۇرۇلمىغان"
|
|||||||
#. Translators: this is for network connections that require some kind of key or password
|
#. Translators: this is for network connections that require some kind of key or password
|
||||||
#: ../js/ui/status/network.js:469 ../js/ui/status/network.js:1549
|
#: ../js/ui/status/network.js:469 ../js/ui/status/network.js:1549
|
||||||
msgid "authentication required"
|
msgid "authentication required"
|
||||||
msgstr "سالاھىيەت دەلىللەش زۆرۈر"
|
msgstr "كىملىك دەلىللەش زۆرۈر"
|
||||||
|
|
||||||
#. Translators: this is for devices that require some kind of firmware or kernel
|
#. Translators: this is for devices that require some kind of firmware or kernel
|
||||||
#. module, which is missing
|
#. module, which is missing
|
||||||
@ -1601,7 +1593,6 @@ msgstr "توك مەنبە تەڭشىكى"
|
|||||||
#. 0 is reported when UPower does not have enough data
|
#. 0 is reported when UPower does not have enough data
|
||||||
#. to estimate battery life
|
#. to estimate battery life
|
||||||
#: ../js/ui/status/power.js:99
|
#: ../js/ui/status/power.js:99
|
||||||
#| msgid "Estimating..."
|
|
||||||
msgid "Estimating…"
|
msgid "Estimating…"
|
||||||
msgstr "مۆلچەرلەۋاتىدۇ…"
|
msgstr "مۆلچەرلەۋاتىدۇ…"
|
||||||
|
|
||||||
@ -1705,79 +1696,79 @@ msgstr "باشقا ئىشلەتكۈچى سۈپىتىدە كىر"
|
|||||||
msgid "Unlock Window"
|
msgid "Unlock Window"
|
||||||
msgstr "كۆزنەكنى قۇلۇپلا"
|
msgstr "كۆزنەكنى قۇلۇپلا"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:192
|
#: ../js/ui/userMenu.js:193
|
||||||
msgid "Available"
|
msgid "Available"
|
||||||
msgstr "ئىشلەتكىلى بولىدۇ"
|
msgstr "ئىشلەتكىلى بولىدۇ"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:195
|
#: ../js/ui/userMenu.js:196
|
||||||
msgid "Busy"
|
msgid "Busy"
|
||||||
msgstr "ئالدىراش"
|
msgstr "ئالدىراش"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:198
|
#: ../js/ui/userMenu.js:199
|
||||||
msgid "Invisible"
|
msgid "Invisible"
|
||||||
msgstr "يوشۇرۇن"
|
msgstr "يوشۇرۇن"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:201
|
#: ../js/ui/userMenu.js:202
|
||||||
msgid "Away"
|
msgid "Away"
|
||||||
msgstr "يوق"
|
msgstr "يوق"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:204
|
#: ../js/ui/userMenu.js:205
|
||||||
msgid "Idle"
|
msgid "Idle"
|
||||||
msgstr "بىكار"
|
msgstr "بىكار"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:207
|
#: ../js/ui/userMenu.js:208
|
||||||
msgid "Offline"
|
msgid "Offline"
|
||||||
msgstr "توردا يوق"
|
msgstr "توردا يوق"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:779
|
#: ../js/ui/userMenu.js:780
|
||||||
msgid "Notifications"
|
msgid "Notifications"
|
||||||
msgstr "ئۇقتۇرۇشلار"
|
msgstr "ئۇقتۇرۇشلار"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:795
|
#: ../js/ui/userMenu.js:796
|
||||||
msgid "Switch User"
|
msgid "Switch User"
|
||||||
msgstr "ئىشلەتكۈچى ئالماشتۇرۇش"
|
msgstr "ئىشلەتكۈچى ئالماشتۇرۇش"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:800
|
#: ../js/ui/userMenu.js:801
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "تىزىمدىن چىقىش"
|
msgstr "تىزىمدىن چىقىش"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:820
|
#: ../js/ui/userMenu.js:821
|
||||||
msgid "Install Updates & Restart"
|
msgid "Install Updates & Restart"
|
||||||
msgstr "يېڭىلانمىلارنى ئورنىتىپ قايتا قوزغات"
|
msgstr "يېڭىلانمىلارنى ئورنىتىپ قايتا قوزغات"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:838
|
#: ../js/ui/userMenu.js:839
|
||||||
msgid "Your chat status will be set to busy"
|
msgid "Your chat status will be set to busy"
|
||||||
msgstr "سىزنىڭ سۆھبەت ھالىتىڭىز ئالدىراش قىلىنىدۇ"
|
msgstr "سىزنىڭ سۆھبەت ھالىتىڭىز ئالدىراش قىلىنىدۇ"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:839
|
#: ../js/ui/userMenu.js:840
|
||||||
msgid ""
|
msgid ""
|
||||||
"Notifications are now disabled, including chat messages. Your online status "
|
"Notifications are now disabled, including chat messages. Your online status "
|
||||||
"has been adjusted to let others know that you might not see their messages."
|
"has been adjusted to let others know that you might not see their messages."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:885
|
#: ../js/ui/userMenu.js:886
|
||||||
msgid "Other users are logged in."
|
msgid "Other users are logged in."
|
||||||
msgstr "باشقا ئىشلەتكۈچىلەر كىردى:"
|
msgstr "باشقا ئىشلەتكۈچىلەر كىردى:"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:890
|
#: ../js/ui/userMenu.js:891
|
||||||
msgid "Shutting down might cause them to lose unsaved work."
|
msgid "Shutting down might cause them to lose unsaved work."
|
||||||
msgstr "تاقالسا ساقلانمىغان خىزمەتلەر يوقىلىشى مۇمكىن."
|
msgstr "تاقالسا ساقلانمىغان خىزمەتلەر يوقىلىشى مۇمكىن."
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:916
|
#: ../js/ui/userMenu.js:918
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s (remote)"
|
msgid "%s (remote)"
|
||||||
msgstr "%s (يىراق)"
|
msgstr "%s (يىراق)"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:918
|
#: ../js/ui/userMenu.js:920
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s (console)"
|
msgid "%s (console)"
|
||||||
msgstr "%s (تىزگىن كۆزنەك)"
|
msgstr "%s (تىزگىن كۆزنەك)"
|
||||||
|
|
||||||
#: ../js/ui/viewSelector.js:101
|
#: ../js/ui/viewSelector.js:100
|
||||||
msgid "Applications"
|
msgid "Applications"
|
||||||
msgstr "پروگراممىلار"
|
msgstr "پروگراممىلار"
|
||||||
|
|
||||||
#: ../js/ui/viewSelector.js:105
|
#: ../js/ui/viewSelector.js:104
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr "ئىزدە"
|
msgstr "ئىزدە"
|
||||||
|
|
||||||
|
877
po/zh_CN.po
877
po/zh_CN.po
File diff suppressed because it is too large
Load Diff
585
po/zh_HK.po
585
po/zh_HK.po
File diff suppressed because it is too large
Load Diff
587
po/zh_TW.po
587
po/zh_TW.po
File diff suppressed because it is too large
Load Diff
@ -287,7 +287,7 @@ libgnome_shell_la_LIBADD = \
|
|||||||
libgnome_shell_la_CPPFLAGS = $(gnome_shell_cflags)
|
libgnome_shell_la_CPPFLAGS = $(gnome_shell_cflags)
|
||||||
|
|
||||||
Shell-0.1.gir: libgnome-shell.la St-1.0.gir
|
Shell-0.1.gir: libgnome-shell.la St-1.0.gir
|
||||||
Shell_0_1_gir_INCLUDES = Clutter-1.0 ClutterX11-1.0 Meta-3.0 TelepathyGLib-0.12 TelepathyLogger-0.2 Soup-2.4 GMenu-3.0 NetworkManager-1.0 NMClient-1.0
|
Shell_0_1_gir_INCLUDES = Clutter-1.0 ClutterX11-1.0 Meta-3.0 TelepathyGLib-0.12 Soup-2.4 GMenu-3.0 NetworkManager-1.0 NMClient-1.0
|
||||||
Shell_0_1_gir_CFLAGS = $(libgnome_shell_la_CPPFLAGS) -I $(srcdir)
|
Shell_0_1_gir_CFLAGS = $(libgnome_shell_la_CPPFLAGS) -I $(srcdir)
|
||||||
Shell_0_1_gir_LIBS = libgnome-shell.la
|
Shell_0_1_gir_LIBS = libgnome-shell.la
|
||||||
Shell_0_1_gir_FILES = $(libgnome_shell_la_gir_sources)
|
Shell_0_1_gir_FILES = $(libgnome_shell_la_gir_sources)
|
||||||
|
@ -490,6 +490,17 @@ calendar_sources_registry_source_removed_cb (ESourceRegistry *registry,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
ensure_appointment_sources (CalendarSources *sources)
|
||||||
|
{
|
||||||
|
if (!sources->priv->appointment_sources.loaded)
|
||||||
|
{
|
||||||
|
calendar_sources_load_esource_list (sources->priv->registry,
|
||||||
|
&sources->priv->appointment_sources);
|
||||||
|
sources->priv->appointment_sources.loaded = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
GList *
|
GList *
|
||||||
calendar_sources_get_appointment_clients (CalendarSources *sources)
|
calendar_sources_get_appointment_clients (CalendarSources *sources)
|
||||||
{
|
{
|
||||||
@ -497,12 +508,7 @@ calendar_sources_get_appointment_clients (CalendarSources *sources)
|
|||||||
|
|
||||||
g_return_val_if_fail (CALENDAR_IS_SOURCES (sources), NULL);
|
g_return_val_if_fail (CALENDAR_IS_SOURCES (sources), NULL);
|
||||||
|
|
||||||
if (!sources->priv->appointment_sources.loaded)
|
ensure_appointment_sources (sources);
|
||||||
{
|
|
||||||
calendar_sources_load_esource_list (sources->priv->registry,
|
|
||||||
&sources->priv->appointment_sources);
|
|
||||||
sources->priv->appointment_sources.loaded = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
list = g_hash_table_get_values (sources->priv->appointment_sources.clients);
|
list = g_hash_table_get_values (sources->priv->appointment_sources.clients);
|
||||||
|
|
||||||
@ -512,6 +518,17 @@ calendar_sources_get_appointment_clients (CalendarSources *sources)
|
|||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
ensure_task_sources (CalendarSources *sources)
|
||||||
|
{
|
||||||
|
if (!sources->priv->task_sources.loaded)
|
||||||
|
{
|
||||||
|
calendar_sources_load_esource_list (sources->priv->registry,
|
||||||
|
&sources->priv->task_sources);
|
||||||
|
sources->priv->task_sources.loaded = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
GList *
|
GList *
|
||||||
calendar_sources_get_task_clients (CalendarSources *sources)
|
calendar_sources_get_task_clients (CalendarSources *sources)
|
||||||
{
|
{
|
||||||
@ -519,12 +536,7 @@ calendar_sources_get_task_clients (CalendarSources *sources)
|
|||||||
|
|
||||||
g_return_val_if_fail (CALENDAR_IS_SOURCES (sources), NULL);
|
g_return_val_if_fail (CALENDAR_IS_SOURCES (sources), NULL);
|
||||||
|
|
||||||
if (!sources->priv->task_sources.loaded)
|
ensure_task_sources (sources);
|
||||||
{
|
|
||||||
calendar_sources_load_esource_list (sources->priv->registry,
|
|
||||||
&sources->priv->task_sources);
|
|
||||||
sources->priv->task_sources.loaded = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
list = g_hash_table_get_values (sources->priv->task_sources.clients);
|
list = g_hash_table_get_values (sources->priv->task_sources.clients);
|
||||||
|
|
||||||
@ -533,3 +545,15 @@ calendar_sources_get_task_clients (CalendarSources *sources)
|
|||||||
|
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
calendar_sources_has_sources (CalendarSources *sources)
|
||||||
|
{
|
||||||
|
g_return_val_if_fail (CALENDAR_IS_SOURCES (sources), FALSE);
|
||||||
|
|
||||||
|
ensure_appointment_sources (sources);
|
||||||
|
ensure_task_sources (sources);
|
||||||
|
|
||||||
|
return g_hash_table_size (sources->priv->appointment_sources.clients) > 0 ||
|
||||||
|
g_hash_table_size (sources->priv->task_sources.clients) > 0;
|
||||||
|
}
|
||||||
|
@ -61,6 +61,8 @@ CalendarSources *calendar_sources_get (void);
|
|||||||
GList *calendar_sources_get_appointment_clients (CalendarSources *sources);
|
GList *calendar_sources_get_appointment_clients (CalendarSources *sources);
|
||||||
GList *calendar_sources_get_task_clients (CalendarSources *sources);
|
GList *calendar_sources_get_task_clients (CalendarSources *sources);
|
||||||
|
|
||||||
|
gboolean calendar_sources_has_sources (CalendarSources *sources);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
#endif /* __CALENDAR_SOURCES_H__ */
|
#endif /* __CALENDAR_SOURCES_H__ */
|
||||||
|
@ -57,6 +57,7 @@ static const gchar introspection_xml[] =
|
|||||||
" <signal name='Changed'/>"
|
" <signal name='Changed'/>"
|
||||||
" <property name='Since' type='x' access='read'/>"
|
" <property name='Since' type='x' access='read'/>"
|
||||||
" <property name='Until' type='x' access='read'/>"
|
" <property name='Until' type='x' access='read'/>"
|
||||||
|
" <property name='HasCalendars' type='b' access='read'/>"
|
||||||
" </interface>"
|
" </interface>"
|
||||||
"</node>";
|
"</node>";
|
||||||
static GDBusNodeInfo *introspection_data = NULL;
|
static GDBusNodeInfo *introspection_data = NULL;
|
||||||
@ -726,6 +727,12 @@ app_load_events (App *app)
|
|||||||
app->cache_invalid = FALSE;
|
app->cache_invalid = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
app_has_calendars (App *app)
|
||||||
|
{
|
||||||
|
return calendar_sources_has_sources (app->sources);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
on_appointment_sources_changed (CalendarSources *sources,
|
on_appointment_sources_changed (CalendarSources *sources,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
@ -734,6 +741,26 @@ on_appointment_sources_changed (CalendarSources *sources,
|
|||||||
|
|
||||||
print_debug ("Sources changed\n");
|
print_debug ("Sources changed\n");
|
||||||
app_load_events (app);
|
app_load_events (app);
|
||||||
|
|
||||||
|
/* Notify the HasCalendars property */
|
||||||
|
{
|
||||||
|
GVariantBuilder dict_builder;
|
||||||
|
|
||||||
|
g_variant_builder_init (&dict_builder, G_VARIANT_TYPE ("a{sv}"));
|
||||||
|
g_variant_builder_add (&dict_builder, "{sv}", "HasCalendars",
|
||||||
|
g_variant_new_boolean (app_has_calendars (app)));
|
||||||
|
|
||||||
|
g_dbus_connection_emit_signal (g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL),
|
||||||
|
NULL,
|
||||||
|
"/org/gnome/Shell/CalendarServer",
|
||||||
|
"org.freedesktop.DBus.Properties",
|
||||||
|
"PropertiesChanged",
|
||||||
|
g_variant_new ("(sa{sv}as)",
|
||||||
|
"org.gnome.Shell.CalendarServer",
|
||||||
|
&dict_builder,
|
||||||
|
NULL),
|
||||||
|
NULL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static App *
|
static App *
|
||||||
@ -933,6 +960,10 @@ handle_get_property (GDBusConnection *connection,
|
|||||||
{
|
{
|
||||||
ret = g_variant_new_int64 (app->until);
|
ret = g_variant_new_int64 (app->until);
|
||||||
}
|
}
|
||||||
|
else if (g_strcmp0 (property_name, "HasCalendars") == 0)
|
||||||
|
{
|
||||||
|
ret = g_variant_new_boolean (app_has_calendars (app));
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
g_assert_not_reached ();
|
g_assert_not_reached ();
|
||||||
|
@ -8,9 +8,7 @@
|
|||||||
#include "shell-embedded-window-private.h"
|
#include "shell-embedded-window-private.h"
|
||||||
|
|
||||||
/* This type is a subclass of GtkWindow that ties the window to a
|
/* This type is a subclass of GtkWindow that ties the window to a
|
||||||
* ShellGtkEmbed; the window is reparented into the stage
|
* ShellGtkEmbed; the resizing logic is bound to the clutter logic.
|
||||||
* window for the actor and the resizing logic is bound to the clutter
|
|
||||||
* logic.
|
|
||||||
*
|
*
|
||||||
* The typical usage we might expect is
|
* The typical usage we might expect is
|
||||||
*
|
*
|
||||||
@ -28,16 +26,13 @@
|
|||||||
G_DEFINE_TYPE (ShellEmbeddedWindow, shell_embedded_window, GTK_TYPE_WINDOW);
|
G_DEFINE_TYPE (ShellEmbeddedWindow, shell_embedded_window, GTK_TYPE_WINDOW);
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
PROP_0,
|
PROP_0
|
||||||
|
|
||||||
PROP_STAGE
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _ShellEmbeddedWindowPrivate {
|
struct _ShellEmbeddedWindowPrivate {
|
||||||
ShellGtkEmbed *actor;
|
ShellGtkEmbed *actor;
|
||||||
|
|
||||||
GdkRectangle position;
|
GdkRectangle position;
|
||||||
Window stage_xwindow;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -80,27 +75,6 @@ shell_embedded_window_hide (GtkWidget *widget)
|
|||||||
GTK_WIDGET_CLASS (shell_embedded_window_parent_class)->hide (widget);
|
GTK_WIDGET_CLASS (shell_embedded_window_parent_class)->hide (widget);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
shell_embedded_window_realize (GtkWidget *widget)
|
|
||||||
{
|
|
||||||
ShellEmbeddedWindow *window = SHELL_EMBEDDED_WINDOW (widget);
|
|
||||||
|
|
||||||
GTK_WIDGET_CLASS (shell_embedded_window_parent_class)->realize (widget);
|
|
||||||
|
|
||||||
|
|
||||||
/* Using XReparentWindow() is simpler than using gdk_window_reparent(),
|
|
||||||
* since it avoids maybe having to create a new foreign GDK window for
|
|
||||||
* the stage. However, GDK will be left thinking that the parent of
|
|
||||||
* window->window is the root window - it's not immediately clear
|
|
||||||
* to me whether that is more or less likely to cause problems than
|
|
||||||
* modifying the GDK hierarchy.
|
|
||||||
*/
|
|
||||||
XReparentWindow (GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (widget)),
|
|
||||||
gdk_x11_window_get_xid (gtk_widget_get_window (widget)),
|
|
||||||
window->priv->stage_xwindow,
|
|
||||||
window->priv->position.x, window->priv->position.y);
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
shell_embedded_window_configure_event (GtkWidget *widget,
|
shell_embedded_window_configure_event (GtkWidget *widget,
|
||||||
GdkEventConfigure *event)
|
GdkEventConfigure *event)
|
||||||
@ -127,27 +101,6 @@ shell_embedded_window_check_resize (GtkContainer *container)
|
|||||||
clutter_actor_queue_relayout (CLUTTER_ACTOR (window->priv->actor));
|
clutter_actor_queue_relayout (CLUTTER_ACTOR (window->priv->actor));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
shell_embedded_window_set_property (GObject *object,
|
|
||||||
guint prop_id,
|
|
||||||
const GValue *value,
|
|
||||||
GParamSpec *pspec)
|
|
||||||
{
|
|
||||||
ShellEmbeddedWindow *window = SHELL_EMBEDDED_WINDOW (object);
|
|
||||||
|
|
||||||
switch (prop_id)
|
|
||||||
{
|
|
||||||
case PROP_STAGE:
|
|
||||||
window->priv->stage_xwindow =
|
|
||||||
clutter_x11_get_stage_window (g_value_get_object (value));
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static GObject *
|
static GObject *
|
||||||
shell_embedded_window_constructor (GType gtype,
|
shell_embedded_window_constructor (GType gtype,
|
||||||
guint n_properties,
|
guint n_properties,
|
||||||
@ -182,23 +135,13 @@ shell_embedded_window_class_init (ShellEmbeddedWindowClass *klass)
|
|||||||
|
|
||||||
g_type_class_add_private (klass, sizeof (ShellEmbeddedWindowPrivate));
|
g_type_class_add_private (klass, sizeof (ShellEmbeddedWindowPrivate));
|
||||||
|
|
||||||
object_class->set_property = shell_embedded_window_set_property;
|
|
||||||
object_class->constructor = shell_embedded_window_constructor;
|
object_class->constructor = shell_embedded_window_constructor;
|
||||||
|
|
||||||
widget_class->show = shell_embedded_window_show;
|
widget_class->show = shell_embedded_window_show;
|
||||||
widget_class->hide = shell_embedded_window_hide;
|
widget_class->hide = shell_embedded_window_hide;
|
||||||
widget_class->realize = shell_embedded_window_realize;
|
|
||||||
widget_class->configure_event = shell_embedded_window_configure_event;
|
widget_class->configure_event = shell_embedded_window_configure_event;
|
||||||
|
|
||||||
container_class->check_resize = shell_embedded_window_check_resize;
|
container_class->check_resize = shell_embedded_window_check_resize;
|
||||||
|
|
||||||
g_object_class_install_property (object_class,
|
|
||||||
PROP_STAGE,
|
|
||||||
g_param_spec_object ("stage",
|
|
||||||
"Stage",
|
|
||||||
"ClutterStage to embed on",
|
|
||||||
CLUTTER_TYPE_STAGE,
|
|
||||||
G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -282,9 +225,8 @@ _shell_embedded_window_unmap (ShellEmbeddedWindow *window)
|
|||||||
* Public API
|
* Public API
|
||||||
*/
|
*/
|
||||||
GtkWidget *
|
GtkWidget *
|
||||||
shell_embedded_window_new (ClutterStage *stage)
|
shell_embedded_window_new (void)
|
||||||
{
|
{
|
||||||
return g_object_new (SHELL_TYPE_EMBEDDED_WINDOW,
|
return g_object_new (SHELL_TYPE_EMBEDDED_WINDOW,
|
||||||
"stage", stage,
|
|
||||||
NULL);
|
NULL);
|
||||||
}
|
}
|
||||||
|
@ -30,6 +30,6 @@ struct _ShellEmbeddedWindowClass
|
|||||||
};
|
};
|
||||||
|
|
||||||
GType shell_embedded_window_get_type (void) G_GNUC_CONST;
|
GType shell_embedded_window_get_type (void) G_GNUC_CONST;
|
||||||
GtkWidget *shell_embedded_window_new (ClutterStage *stage);
|
GtkWidget *shell_embedded_window_new (void);
|
||||||
|
|
||||||
#endif /* __SHELL_EMBEDDED_WINDOW_H__ */
|
#endif /* __SHELL_EMBEDDED_WINDOW_H__ */
|
||||||
|
@ -3,8 +3,11 @@
|
|||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
#include "shell-embedded-window-private.h"
|
#include "shell-embedded-window-private.h"
|
||||||
|
#include "shell-global.h"
|
||||||
|
|
||||||
#include <gdk/gdkx.h>
|
#include <gdk/gdkx.h>
|
||||||
|
#include <meta/display.h>
|
||||||
|
#include <meta/window.h>
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
PROP_0,
|
PROP_0,
|
||||||
@ -15,9 +18,14 @@ enum {
|
|||||||
struct _ShellGtkEmbedPrivate
|
struct _ShellGtkEmbedPrivate
|
||||||
{
|
{
|
||||||
ShellEmbeddedWindow *window;
|
ShellEmbeddedWindow *window;
|
||||||
|
|
||||||
|
ClutterActor *window_actor;
|
||||||
|
guint window_actor_destroyed_handler;
|
||||||
|
|
||||||
|
guint window_created_handler;
|
||||||
};
|
};
|
||||||
|
|
||||||
G_DEFINE_TYPE (ShellGtkEmbed, shell_gtk_embed, CLUTTER_X11_TYPE_TEXTURE_PIXMAP);
|
G_DEFINE_TYPE (ShellGtkEmbed, shell_gtk_embed, CLUTTER_TYPE_CLONE);
|
||||||
|
|
||||||
static void shell_gtk_embed_set_window (ShellGtkEmbed *embed,
|
static void shell_gtk_embed_set_window (ShellGtkEmbed *embed,
|
||||||
ShellEmbeddedWindow *window);
|
ShellEmbeddedWindow *window);
|
||||||
@ -30,39 +38,106 @@ shell_gtk_embed_on_window_destroy (GtkWidget *object,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
shell_gtk_embed_on_window_realize (GtkWidget *widget,
|
shell_gtk_embed_remove_window_actor (ShellGtkEmbed *embed)
|
||||||
|
{
|
||||||
|
ShellGtkEmbedPrivate *priv = embed->priv;
|
||||||
|
|
||||||
|
if (priv->window_actor)
|
||||||
|
{
|
||||||
|
g_signal_handler_disconnect (priv->window_actor,
|
||||||
|
priv->window_actor_destroyed_handler);
|
||||||
|
priv->window_actor_destroyed_handler = 0;
|
||||||
|
|
||||||
|
g_object_unref (priv->window_actor);
|
||||||
|
priv->window_actor = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
clutter_clone_set_source (CLUTTER_CLONE (embed), NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
shell_gtk_embed_window_created_cb (MetaDisplay *display,
|
||||||
|
MetaWindow *window,
|
||||||
ShellGtkEmbed *embed)
|
ShellGtkEmbed *embed)
|
||||||
{
|
{
|
||||||
/* Here automatic=FALSE means to use CompositeRedirectManual.
|
ShellGtkEmbedPrivate *priv = embed->priv;
|
||||||
* That is, the X server shouldn't draw the window onto the
|
Window xwindow = meta_window_get_xwindow (window);
|
||||||
* screen.
|
GdkWindow *gdk_window = gtk_widget_get_window (GTK_WIDGET (priv->window));
|
||||||
*/
|
|
||||||
clutter_x11_texture_pixmap_set_window (CLUTTER_X11_TEXTURE_PIXMAP (embed),
|
if (xwindow == gdk_x11_window_get_xid (gdk_window))
|
||||||
gdk_x11_window_get_xid (gtk_widget_get_window (widget)),
|
{
|
||||||
FALSE);
|
ClutterActor *window_actor =
|
||||||
|
CLUTTER_ACTOR (meta_window_get_compositor_private (window));
|
||||||
|
MetaDisplay *display = shell_global_get_display (shell_global_get ());
|
||||||
|
GCallback remove_cb = G_CALLBACK (shell_gtk_embed_remove_window_actor);
|
||||||
|
cairo_region_t *empty_region;
|
||||||
|
|
||||||
|
clutter_clone_set_source (CLUTTER_CLONE (embed), window_actor);
|
||||||
|
|
||||||
|
/* We want to explicitly clear the clone source when the window
|
||||||
|
actor is destroyed because otherwise we might end up keeping
|
||||||
|
it alive after it has been disposed. Otherwise this can cause
|
||||||
|
a crash if there is a paint after mutter notices that the top
|
||||||
|
level window has been destroyed, which causes it to dispose
|
||||||
|
the window, and before the tray manager notices that the
|
||||||
|
window is gone which would otherwise reset the window and
|
||||||
|
unref the clone */
|
||||||
|
priv->window_actor = g_object_ref (window_actor);
|
||||||
|
priv->window_actor_destroyed_handler =
|
||||||
|
g_signal_connect_swapped (window_actor,
|
||||||
|
"destroy",
|
||||||
|
remove_cb,
|
||||||
|
embed);
|
||||||
|
|
||||||
|
/* Hide the original actor otherwise it will appear in the scene
|
||||||
|
as a normal window */
|
||||||
|
clutter_actor_set_opacity (window_actor, 0);
|
||||||
|
|
||||||
|
/* Set an empty input shape on the window so that it can't get
|
||||||
|
any input. This probably isn't the ideal way to acheive this.
|
||||||
|
It would probably be better to force the window to go behind
|
||||||
|
Mutter's guard window, but this is quite difficult to do as
|
||||||
|
Mutter doesn't manage the stacking for override redirect
|
||||||
|
windows and the guard window is repeatedly lowered to the
|
||||||
|
bottom of the stack. */
|
||||||
|
empty_region = cairo_region_create ();
|
||||||
|
gdk_window_input_shape_combine_region (gdk_window,
|
||||||
|
empty_region,
|
||||||
|
0, 0 /* offset x/y */);
|
||||||
|
cairo_region_destroy (empty_region);
|
||||||
|
|
||||||
|
/* Now that we've found the window we don't need to listen for
|
||||||
|
new windows anymore */
|
||||||
|
g_signal_handler_disconnect (display,
|
||||||
|
priv->window_created_handler);
|
||||||
|
priv->window_created_handler = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
shell_gtk_embed_set_window (ShellGtkEmbed *embed,
|
shell_gtk_embed_set_window (ShellGtkEmbed *embed,
|
||||||
ShellEmbeddedWindow *window)
|
ShellEmbeddedWindow *window)
|
||||||
{
|
{
|
||||||
|
MetaDisplay *display = shell_global_get_display (shell_global_get ());
|
||||||
|
|
||||||
if (embed->priv->window)
|
if (embed->priv->window)
|
||||||
{
|
{
|
||||||
|
if (embed->priv->window_created_handler)
|
||||||
|
{
|
||||||
|
g_signal_handler_disconnect (display,
|
||||||
|
embed->priv->window_created_handler);
|
||||||
|
embed->priv->window_created_handler = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
shell_gtk_embed_remove_window_actor (embed);
|
||||||
|
|
||||||
_shell_embedded_window_set_actor (embed->priv->window, NULL);
|
_shell_embedded_window_set_actor (embed->priv->window, NULL);
|
||||||
|
|
||||||
g_object_unref (embed->priv->window);
|
g_object_unref (embed->priv->window);
|
||||||
|
|
||||||
clutter_x11_texture_pixmap_set_window (CLUTTER_X11_TEXTURE_PIXMAP (embed),
|
|
||||||
None,
|
|
||||||
FALSE);
|
|
||||||
|
|
||||||
g_signal_handlers_disconnect_by_func (embed->priv->window,
|
g_signal_handlers_disconnect_by_func (embed->priv->window,
|
||||||
(gpointer)shell_gtk_embed_on_window_destroy,
|
(gpointer)shell_gtk_embed_on_window_destroy,
|
||||||
embed);
|
embed);
|
||||||
g_signal_handlers_disconnect_by_func (embed->priv->window,
|
|
||||||
(gpointer)shell_gtk_embed_on_window_realize,
|
|
||||||
embed);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
embed->priv->window = window;
|
embed->priv->window = window;
|
||||||
@ -75,11 +150,14 @@ shell_gtk_embed_set_window (ShellGtkEmbed *embed,
|
|||||||
|
|
||||||
g_signal_connect (embed->priv->window, "destroy",
|
g_signal_connect (embed->priv->window, "destroy",
|
||||||
G_CALLBACK (shell_gtk_embed_on_window_destroy), embed);
|
G_CALLBACK (shell_gtk_embed_on_window_destroy), embed);
|
||||||
g_signal_connect (embed->priv->window, "realize",
|
|
||||||
G_CALLBACK (shell_gtk_embed_on_window_realize), embed);
|
|
||||||
|
|
||||||
if (gtk_widget_get_realized (GTK_WIDGET (window)))
|
/* Listen for new windows so we can detect when Mutter has
|
||||||
shell_gtk_embed_on_window_realize (GTK_WIDGET (embed->priv->window), embed);
|
created a MutterWindow for this window */
|
||||||
|
embed->priv->window_created_handler =
|
||||||
|
g_signal_connect (display,
|
||||||
|
"window-created",
|
||||||
|
G_CALLBACK (shell_gtk_embed_window_created_cb),
|
||||||
|
embed);
|
||||||
}
|
}
|
||||||
|
|
||||||
clutter_actor_queue_relayout (CLUTTER_ACTOR (embed));
|
clutter_actor_queue_relayout (CLUTTER_ACTOR (embed));
|
||||||
@ -260,11 +338,6 @@ shell_gtk_embed_init (ShellGtkEmbed *embed)
|
|||||||
{
|
{
|
||||||
embed->priv = G_TYPE_INSTANCE_GET_PRIVATE (embed, SHELL_TYPE_GTK_EMBED,
|
embed->priv = G_TYPE_INSTANCE_GET_PRIVATE (embed, SHELL_TYPE_GTK_EMBED,
|
||||||
ShellGtkEmbedPrivate);
|
ShellGtkEmbedPrivate);
|
||||||
|
|
||||||
/* automatic here means whether ClutterX11TexturePixmap should
|
|
||||||
* process damage update and refresh the pixmap itself.
|
|
||||||
*/
|
|
||||||
clutter_x11_texture_pixmap_set_automatic (CLUTTER_X11_TEXTURE_PIXMAP (embed), TRUE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user