Compare commits
321 Commits
wip/gcampa
...
3.8.3
Author | SHA1 | Date | |
---|---|---|---|
cad6f31c1a | |||
294f59103f | |||
f88f51dd99 | |||
c1eaf97bc6 | |||
1420f62dfa | |||
3ff194247a | |||
36b1cd13c9 | |||
bcede26d77 | |||
fbf1ee8a01 | |||
1360747c9e | |||
1d95841da0 | |||
494fcfecf8 | |||
75705b45ef | |||
1ad1e48741 | |||
ddb682e4fe | |||
5216b77600 | |||
c93d91d80b | |||
f9e3467b70 | |||
13bea1a01b | |||
76c930e471 | |||
9f6cd75170 | |||
c107882828 | |||
d18e084cd5 | |||
2eb779740c | |||
3ce20568d0 | |||
d45ab6f15e | |||
cd7197e605 | |||
3f6c1aadef | |||
29e8290b65 | |||
3074e48405 | |||
12c2939b64 | |||
c7eed59562 | |||
73903400c5 | |||
dc7cc9b517 | |||
b18c239240 | |||
3c66f1a4d9 | |||
1dff5fb5b2 | |||
e2561d15b5 | |||
326c3732b8 | |||
5dd020f2e2 | |||
b6edbd46b9 | |||
c330036fef | |||
d0a864b9b9 | |||
9bed5b725e | |||
f374ecfc75 | |||
dd8ca02425 | |||
ff3f9bdd7d | |||
fab02ae82f | |||
d43c5ec27a | |||
f7de35b852 | |||
cde0045851 | |||
f844613292 | |||
ff2e44de53 | |||
17aa8e0488 | |||
a33df9b046 | |||
c25f399f7c | |||
bd47d07fbc | |||
72282237e1 | |||
dfb44aa51d | |||
5516cad087 | |||
ab60c31629 | |||
52dd030087 | |||
98240c2857 | |||
65bfd6c6d2 | |||
1034e33c35 | |||
d7528b878c | |||
eb2e66c539 | |||
30e9a2a7d0 | |||
e842694316 | |||
b33d87a762 | |||
0ff3599d91 | |||
28d79a1235 | |||
522d21154b | |||
7c231916c1 | |||
a40bb67fc6 | |||
4c350b90c7 | |||
47dee22b05 | |||
13c0e575f6 | |||
ea8736b13a | |||
303d53e7f5 | |||
31295dfe83 | |||
69ea4553cb | |||
0d8d77356e | |||
8b78032248 | |||
ad277a563c | |||
db26fb201e | |||
9f00be50d6 | |||
77d21e53d0 | |||
ba0b4ba590 | |||
b9fc7a3050 | |||
aa053a906d | |||
2cda0472bd | |||
4710753700 | |||
2b439ef209 | |||
2fc76e6d9e | |||
ff544450a5 | |||
b4590da686 | |||
6c4be0311a | |||
4a2cdc20f0 | |||
6ce79c62eb | |||
96994721ef | |||
f358bb1a96 | |||
1bce210c51 | |||
8a3c8d1b1c | |||
08b224de1f | |||
86c92c37d2 | |||
07053c3df7 | |||
4fb33c9b09 | |||
5e6a25c3c2 | |||
e14ef4a294 | |||
8b659f0f4c | |||
a6395c95d4 | |||
98e74dfd38 | |||
1d728186db | |||
2499f2ed80 | |||
963905adcd | |||
7c21ab0985 | |||
77d3712261 | |||
0376f22d41 | |||
007820b7c1 | |||
dc98711477 | |||
e98c6ff31b | |||
9eae74357a | |||
1ee88a2878 | |||
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 |
199
NEWS
199
NEWS
@ -1,3 +1,202 @@
|
|||||||
|
3.8.3
|
||||||
|
=====
|
||||||
|
* Fix child menu regression introduced in 3.8.2 [Florian; #699678]
|
||||||
|
* Fix alt-tab not always switching back to the previous window [Florian; #700356]
|
||||||
|
* Fix VPN network icon regression introduced in 3.8.2 [Florian; #700394]
|
||||||
|
* Allow switch-to-workspace-n keybindings in overview [Florian; #649977]
|
||||||
|
* Update man page [Matthias; #700339]
|
||||||
|
* Add FocusSearch DBus method [Florian; #700536]
|
||||||
|
* gdm: Update the session chooser style [Allan; #695742]
|
||||||
|
* Fix some app folders getting truncated at the top [Florian; #694371]
|
||||||
|
* Fix duplicate cursors in screenshots with magnification [Florian; #700488]
|
||||||
|
* popupMenu: Allow for an optional border for slider handle [Florian; #697917]
|
||||||
|
* Synchronize input source switching with key events [Rui; #697007]
|
||||||
|
* Switch input source on modifiers-only accelerator [Rui; #697008]
|
||||||
|
* Allow input source switching in message tray [Rui; #697009]
|
||||||
|
* Tweak timeout for activating windows during XDND [Adel; #700150]
|
||||||
|
* Fix fullscreen windows not being unredirected when legacy tray icons
|
||||||
|
are around [Adel; #701224]
|
||||||
|
* Fix ellipsization in control buttons in app picker [Carlos; #696307]
|
||||||
|
* Fix DND to empty dash [Florian; #684618]
|
||||||
|
* Fix OSD window appearing below system modal dialogs [Rui; #701269]
|
||||||
|
* Clear clipboard on screen lock to prevent information leak [Florian; #698922]
|
||||||
|
* Allow session mode specific overrides schema [Florian; #701717]
|
||||||
|
* Fix incomplete app menu if multiple actions only become available later
|
||||||
|
[Xavier; #694612]
|
||||||
|
* Fix showing the OSD when a fullscreen app is unredirected [Adel, #701224]
|
||||||
|
* window-switcher: Only show windows from current workspace by default
|
||||||
|
[Florian; #701214
|
||||||
|
* Misc bug fixes [Florian, Rui, Giovanni, Stef; #700409, #700625, #700807,
|
||||||
|
#700842, #700900, #700944, #700190, #700972, #700877]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Giovanni Campagna, Xavier Claessens, Matthias Clasen, Allan Day,
|
||||||
|
Adel Gadllah, Rui Matos, Florian Müllner, Carlos Soriano, Stef Walter
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Cheng-Chia Tseng [zh_HK, zh_TW], eternalhui [zh_CN]
|
||||||
|
|
||||||
|
3.8.2
|
||||||
|
=====
|
||||||
|
* Fix hotcorner regression in RTL locales [Jasper; #698884]
|
||||||
|
* Allow some keybindings to work while a top bar menu is open [Florian; #698938]
|
||||||
|
* Make open-app-menu keybinding a toggle action [Florian; #686756]
|
||||||
|
* ctrlAltTab: Use symbolic icons for desktop windows [Matthias; #697914]
|
||||||
|
* gdm: Fix regression where domain login hint not shown [Stef; #698200]
|
||||||
|
* Hide "Open Calendar" item when no calendar app is installed [Lionel; #697725]
|
||||||
|
* Update how branding appears on login screen [Florian; #694912, #699877]
|
||||||
|
* Allow OSD popups to grow if necessary [Marta; #696523]
|
||||||
|
* Fix offset of shadow offscreen rendering [Lionel; #698301]
|
||||||
|
* Fix insensitive button preventing empty keyring password [Stef; #696304]
|
||||||
|
* Allow cancelling keyring dialog between prompts [Stef; #682830]
|
||||||
|
* modalDialog: Show spinner while working [Stef; #684438]
|
||||||
|
* Provide a DBus API for screencasting [Florian; #696247]
|
||||||
|
* Implement app folder keynav and shortcuts [Florian; #695314]
|
||||||
|
* polkitAgent: Allow retrying after mistyped passwords [Stef; #684431]
|
||||||
|
* Add input purpose and hints to StEntry and StIMText [Daiki; #691392]
|
||||||
|
* Set input-purpose property for password entries [Rui; #700043]
|
||||||
|
* Misc fixes and cleanups [Jasper, Florian, Giovanni, Tim, Rui; #697203,
|
||||||
|
#698959, #696720, #698531, #676285, #698812, #699189]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Giovanni Campagna, Matthias Clasen, Lionel Landwerlin, Tim Lunn, Rui Matos,
|
||||||
|
Simon McVittie, Marta Milakovic, Florian Müllner, Jasper St. Pierre,
|
||||||
|
Daiki Ueno, Stef Walter
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Muhammet Kara [tr], Nik Kalach [ia], Žygimantas Beručka [lt],
|
||||||
|
Kjartan Maraas [nb]
|
||||||
|
|
||||||
|
3.8.1
|
||||||
|
=====
|
||||||
|
* Clip window group during startup animation [Jasper; #696323]
|
||||||
|
* Check for logind rather than systemd [Martin; #696252]
|
||||||
|
* Don't special-case last remote search provider position [Giovanni; #694974]
|
||||||
|
* Fix memory leaks [Ray, Jasper; ##697119, #697295, #697300, #697395]
|
||||||
|
* AppSwitcherPopup: Activate only the selected window if any [Rui; #697480]
|
||||||
|
* Enable screen recorder keybinding in all modes [Florian; #696200]
|
||||||
|
* Remove box-shadow from screen shield for performance reasons [Adel; #697274]
|
||||||
|
* Add support for -st-natural-width/height CSS properties [Giovanni; #664411]
|
||||||
|
* Remove excessive padding from notification buttons [Allan; #664411]
|
||||||
|
* Fix thumbnail dragging in overview [Jasper; #697504]
|
||||||
|
* theme-node: Add get_url()/lookup_url() methods [Florian; #693688]
|
||||||
|
* Misc bug fixes and cleanups [Jasper, Rui, Colin, David, Ray, Matthias:
|
||||||
|
#695859, #696259, #696585, #696436, #697432, #697435, #697560, #697722,
|
||||||
|
#697709]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Giovanni Campagna, Matthias Clasen, Allan Day, Adel Gadllah, David Gumberg,
|
||||||
|
Rui Matos, Florian Müllner, Martin Pitt, Jasper St. Pierre, Ray Strode,
|
||||||
|
Colin Walters
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Daniel Martinez [an], Bruce Cowan [en_GB], Khaled Hosny [ar],
|
||||||
|
Ihar Hrachyshka [be], Aron Xu [zh_CN], Wojciech Szczęsny [pl],
|
||||||
|
Inaki Larranaga Murgoitio [eu], Kjartan Maraas [nb],
|
||||||
|
Милош Поповић [sr, sr@latin], Trần Ngọc Quân [vi]
|
||||||
|
|
||||||
|
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.3],[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.3
|
||||||
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
|
||||||
@ -71,7 +71,7 @@ LIBEDATASERVER_MIN_VERSION=3.5.3
|
|||||||
TELEPATHY_GLIB_MIN_VERSION=0.17.5
|
TELEPATHY_GLIB_MIN_VERSION=0.17.5
|
||||||
POLKIT_MIN_VERSION=0.100
|
POLKIT_MIN_VERSION=0.100
|
||||||
STARTUP_NOTIFICATION_MIN_VERSION=0.11
|
STARTUP_NOTIFICATION_MIN_VERSION=0.11
|
||||||
GCR_MIN_VERSION=3.3.90
|
GCR_MIN_VERSION=3.7.5
|
||||||
GNOME_DESKTOP_REQUIRED_VERSION=3.7.90
|
GNOME_DESKTOP_REQUIRED_VERSION=3.7.90
|
||||||
GNOME_MENUS_REQUIRED_VERSION=3.5.3
|
GNOME_MENUS_REQUIRED_VERSION=3.5.3
|
||||||
NETWORKMANAGER_MIN_VERSION=0.9.6
|
NETWORKMANAGER_MIN_VERSION=0.9.6
|
||||||
@ -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-base-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
|
||||||
|
|
||||||
@ -12,6 +15,7 @@ desktop_DATA = gnome-shell.desktop gnome-shell-extension-prefs.desktop
|
|||||||
|
|
||||||
introspectiondir = $(datadir)/dbus-1/interfaces
|
introspectiondir = $(datadir)/dbus-1/interfaces
|
||||||
introspection_DATA = \
|
introspection_DATA = \
|
||||||
|
org.gnome.Shell.Screencast.xml \
|
||||||
org.gnome.Shell.Screenshot.xml \
|
org.gnome.Shell.Screenshot.xml \
|
||||||
org.gnome.ShellSearchProvider.xml \
|
org.gnome.ShellSearchProvider.xml \
|
||||||
org.gnome.ShellSearchProvider2.xml
|
org.gnome.ShellSearchProvider2.xml
|
||||||
|
96
data/org.gnome.Shell.Screencast.xml
Normal file
96
data/org.gnome.Shell.Screencast.xml
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
<!DOCTYPE node PUBLIC
|
||||||
|
'-//freedesktop//DTD D-BUS Object Introspection 1.0//EN'
|
||||||
|
'http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd'>
|
||||||
|
<node>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
org.gnome.Shell.Screencast:
|
||||||
|
@short_description: Screencast interface
|
||||||
|
|
||||||
|
The interface used to record screen contents.
|
||||||
|
-->
|
||||||
|
<interface name="org.gnome.Shell.Screencast">
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Screencast:
|
||||||
|
@file_template: the template for the filename to use
|
||||||
|
@options: a dictionary of optional parameters
|
||||||
|
@success: whether the screencast was started successfully
|
||||||
|
@filename_used: the file where the screencast is being saved
|
||||||
|
|
||||||
|
Records a screencast of the whole screen and saves it
|
||||||
|
(by default) as webm video under a filename derived from
|
||||||
|
@file_template. The template is either a relative or absolute
|
||||||
|
filename which may contain some escape sequences - %d and %t
|
||||||
|
will be replaced by the start date and time of the recording.
|
||||||
|
If a relative name is used, the screencast will be saved in the
|
||||||
|
$XDG_VIDEOS_DIR if it exists, or the home directory otherwise.
|
||||||
|
The actual filename of the saved video is returned in @filename_used.
|
||||||
|
The set of optional parameters in @options currently consists of:
|
||||||
|
'draw-cursor'(b): whether the cursor should be included in the
|
||||||
|
recording (true)
|
||||||
|
'framerate'(i): the number of frames per second that should be
|
||||||
|
recorded if possible (30)
|
||||||
|
'pipeline'(s): the GStreamer pipeline used to encode recordings
|
||||||
|
in gst-launch format; if not specified, the
|
||||||
|
recorder will produce vp8 (webm) video (unset)
|
||||||
|
-->
|
||||||
|
<method name="Screencast">
|
||||||
|
<arg type="s" direction="in" name="file_template"/>
|
||||||
|
<arg type="a{sv}" direction="in" name="options"/>
|
||||||
|
<arg type="b" direction="in" name="flash"/>
|
||||||
|
<arg type="b" direction="out" name="success"/>
|
||||||
|
<arg type="s" direction="out" name="filename_used"/>
|
||||||
|
</method>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
ScreencastArea:
|
||||||
|
@x: the X coordinate of the area to capture
|
||||||
|
@y: the Y coordinate of the area to capture
|
||||||
|
@width: the width of the area to capture
|
||||||
|
@height: the height of the area to capture
|
||||||
|
@file_template: the template for the filename to use
|
||||||
|
@options: a dictionary of optional parameters
|
||||||
|
@success: whether the screencast was started successfully
|
||||||
|
@filename_used: the file where the screencast is being saved
|
||||||
|
|
||||||
|
Records a screencast of the passed in area and saves it
|
||||||
|
(by default) as webm video under a filename derived from
|
||||||
|
@file_template. The template is either a relative or absolute
|
||||||
|
filename which may contain some escape sequences - %d and %t
|
||||||
|
will be replaced by the start date and time of the recording.
|
||||||
|
If a relative name is used, the screencast will be saved in the
|
||||||
|
$XDG_VIDEOS_DIR if it exists, or the home directory otherwise.
|
||||||
|
The actual filename of the saved video is returned in @filename_used.
|
||||||
|
The set of optional parameters in @options currently consists of:
|
||||||
|
'draw-cursor'(b): whether the cursor should be included in the
|
||||||
|
recording (true)
|
||||||
|
'framerate'(i): the number of frames per second that should be
|
||||||
|
recorded if possible (30)
|
||||||
|
'pipeline'(s): the GStreamer pipeline used to encode recordings
|
||||||
|
in gst-launch format; if not specified, the
|
||||||
|
recorder will produce vp8 (webm) video (unset)
|
||||||
|
-->
|
||||||
|
<method name="ScreencastArea">
|
||||||
|
<arg type="i" direction="in" name="x"/>
|
||||||
|
<arg type="i" direction="in" name="y"/>
|
||||||
|
<arg type="i" direction="in" name="width"/>
|
||||||
|
<arg type="i" direction="in" name="height"/>
|
||||||
|
<arg type="s" direction="in" name="file_template"/>
|
||||||
|
<arg type="a{sv}" direction="in" name="options"/>
|
||||||
|
<arg type="b" direction="out" name="success"/>
|
||||||
|
<arg type="s" direction="out" name="filename_used"/>
|
||||||
|
</method>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
StopScreencast:
|
||||||
|
@success: whether stopping the recording was successful
|
||||||
|
|
||||||
|
Stop the recording started by either Screencast or ScreencastArea.
|
||||||
|
-->
|
||||||
|
<method name="StopScreencast">
|
||||||
|
<arg type="b" direction="out" name="success"/>
|
||||||
|
</method>
|
||||||
|
|
||||||
|
</interface>
|
||||||
|
</node>
|
@ -207,7 +207,7 @@ value here is from the GsmPresenceStatus enumeration.</_summary>
|
|||||||
</_description>
|
</_description>
|
||||||
</key>
|
</key>
|
||||||
<key type="b" name="current-workspace-only">
|
<key type="b" name="current-workspace-only">
|
||||||
<default>false</default>
|
<default>true</default>
|
||||||
<summary>Limit switcher to current workspace.</summary>
|
<summary>Limit switcher to current workspace.</summary>
|
||||||
<description>
|
<description>
|
||||||
If true, only windows from the current workspace are shown in the switcher.
|
If true, only windows from the current workspace are shown in the switcher.
|
||||||
|
@ -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,
|
||||||
@ -501,6 +512,7 @@ StScrollBar StButton#vhandle:active {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#appMenu {
|
#appMenu {
|
||||||
|
spinner-image: url("process-working.svg");
|
||||||
spacing: 4px;
|
spacing: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -788,6 +800,11 @@ StScrollBar StButton#vhandle:active {
|
|||||||
height: 24px;
|
height: 24px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.empty-dash-drop-target {
|
||||||
|
width: 24px;
|
||||||
|
height: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
/* Search Box */
|
/* Search Box */
|
||||||
|
|
||||||
#searchEntry {
|
#searchEntry {
|
||||||
@ -875,19 +892,18 @@ StScrollBar StButton#vhandle:active {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.app-view-controls {
|
.app-view-controls {
|
||||||
width: 250px;
|
|
||||||
padding-bottom: 32px;
|
padding-bottom: 32px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.app-view-control {
|
.app-view-control {
|
||||||
padding: 4px 16px;
|
padding: 4px 32px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.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 +979,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 +1277,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;
|
||||||
@ -1438,11 +1458,13 @@ StScrollBar StButton#vhandle:active {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.notification-button {
|
.notification-button {
|
||||||
padding: 4px 42px 5px;
|
-st-natural-width: 140px;
|
||||||
|
padding: 4px 4px 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.notification-button:focus {
|
.notification-button:focus {
|
||||||
padding: 3px 41px 4px;
|
-st-natural-width: 138px;
|
||||||
|
padding: 3px 4px 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.notification-icon-button {
|
.notification-icon-button {
|
||||||
@ -2129,23 +2151,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 +2222,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;
|
||||||
@ -2328,52 +2342,47 @@ StScrollBar StButton#vhandle:active {
|
|||||||
width: 15em;
|
width: 15em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.login-dialog-session-list {
|
.login-dialog-session-list,
|
||||||
color: #ffffff;
|
.login-dialog-session-list-item {
|
||||||
font-size: 10.5pt;
|
color: #babdb6;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-dialog-session-list-button:focus,
|
||||||
|
.login-dialog-session-list-button:active,
|
||||||
|
.login-dialog-session-list-button:hover,
|
||||||
|
.login-dialog-session-list-item:focus,
|
||||||
|
.login-dialog-session-list-item:hover {
|
||||||
|
color: white;
|
||||||
}
|
}
|
||||||
|
|
||||||
.login-dialog-session-list-button {
|
.login-dialog-session-list-button {
|
||||||
padding: 4px;
|
padding: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.login-dialog-session-list-button:focus {
|
|
||||||
background-color: #4c4c4c;
|
|
||||||
}
|
|
||||||
|
|
||||||
.login-dialog-session-list-button:active {
|
|
||||||
background-color: #4c4c4c;
|
|
||||||
}
|
|
||||||
|
|
||||||
.login-dialog-session-list-button:hover {
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
.login-dialog-session-list-scroll-view {
|
.login-dialog-session-list-scroll-view {
|
||||||
background-gradient-start: rgba(80,80,80,0.3);
|
padding: 6px;
|
||||||
background-gradient-end: rgba(80,80,80,0.7);
|
|
||||||
background-gradient-direction: vertical;
|
|
||||||
box-shadow: inset 0px 2px 4px rgba(0,0,0,0.9);
|
|
||||||
border-radius: 8px;
|
|
||||||
border: 1px solid rgba(80,80,80,1.0);
|
|
||||||
padding: .5em;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.login-dialog-session-list-item:focus {
|
.login-dialog-session-list-item {
|
||||||
background-color: #666666;
|
padding-bottom: 6px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.login-dialog-session-list-triangle {
|
.login-dialog-session-list-triangle {
|
||||||
padding-right: .5em;
|
padding-right: 6px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.login-dialog-session-list-item-box {
|
.login-dialog-session-list-item-box {
|
||||||
spacing: .25em;
|
padding-left: 6px;
|
||||||
|
spacing: 6px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.login-dialog-session-list-item-dot {
|
.login-dialog-session-list-item-dot {
|
||||||
width: .75em;
|
width: 10px;
|
||||||
height: .75em;
|
height: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-dialog-logo-bin {
|
||||||
|
padding: 24px 0px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.login-dialog .modal-dialog-button-box {
|
.login-dialog .modal-dialog-button-box {
|
||||||
@ -2438,7 +2447,6 @@ StScrollBar StButton#vhandle:active {
|
|||||||
|
|
||||||
.screen-shield-background {
|
.screen-shield-background {
|
||||||
background: black;
|
background: black;
|
||||||
box-shadow: 0px 4px 8px rgba(0,0,0,0.9);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#lockDialogGroup {
|
#lockDialogGroup {
|
||||||
|
BIN
data/wanda.png
Normal file
BIN
data/wanda.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 13 KiB |
@ -46,6 +46,7 @@
|
|||||||
<xi:include href="doc-gen-org.gnome.Shell.SearchProvider.xml"/>
|
<xi:include href="doc-gen-org.gnome.Shell.SearchProvider.xml"/>
|
||||||
<xi:include href="doc-gen-org.gnome.Shell.SearchProvider2.xml"/>
|
<xi:include href="doc-gen-org.gnome.Shell.SearchProvider2.xml"/>
|
||||||
<xi:include href="xml/shell-global.xml"/>
|
<xi:include href="xml/shell-global.xml"/>
|
||||||
|
<xi:include href="xml/shell-keybinding-modes.xml"/>
|
||||||
<xi:include href="xml/shell-wm.xml"/>
|
<xi:include href="xml/shell-wm.xml"/>
|
||||||
<xi:include href="xml/shell-xfixes-cursor.xml"/>
|
<xi:include href="xml/shell-xfixes-cursor.xml"/>
|
||||||
<xi:include href="xml/shell-util.xml"/>
|
<xi:include href="xml/shell-util.xml"/>
|
||||||
|
@ -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>
|
||||||
|
@ -78,6 +78,7 @@ nobase_dist_js_DATA = \
|
|||||||
ui/popupMenu.js \
|
ui/popupMenu.js \
|
||||||
ui/remoteSearch.js \
|
ui/remoteSearch.js \
|
||||||
ui/runDialog.js \
|
ui/runDialog.js \
|
||||||
|
ui/screencast.js \
|
||||||
ui/screenshot.js \
|
ui/screenshot.js \
|
||||||
ui/screenShield.js \
|
ui/screenShield.js \
|
||||||
ui/scripting.js \
|
ui/scripting.js \
|
||||||
|
@ -28,6 +28,7 @@ const Mainloop = imports.mainloop;
|
|||||||
const Meta = imports.gi.Meta;
|
const Meta = imports.gi.Meta;
|
||||||
const Lang = imports.lang;
|
const Lang = imports.lang;
|
||||||
const Pango = imports.gi.Pango;
|
const Pango = imports.gi.Pango;
|
||||||
|
const Realmd = imports.gdm.realmd;
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
const Shell = imports.gi.Shell;
|
const Shell = imports.gi.Shell;
|
||||||
const St = imports.gi.St;
|
const St = imports.gi.St;
|
||||||
@ -39,7 +40,6 @@ const GdmUtil = imports.gdm.util;
|
|||||||
const Lightbox = imports.ui.lightbox;
|
const Lightbox = imports.ui.lightbox;
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const ModalDialog = imports.ui.modalDialog;
|
const ModalDialog = imports.ui.modalDialog;
|
||||||
const Panel = imports.ui.panel;
|
|
||||||
const PanelMenu = imports.ui.panelMenu;
|
const PanelMenu = imports.ui.panelMenu;
|
||||||
const Tweener = imports.ui.tweener;
|
const Tweener = imports.ui.tweener;
|
||||||
const UserMenu = imports.ui.userMenu;
|
const UserMenu = imports.ui.userMenu;
|
||||||
@ -48,44 +48,10 @@ const UserWidget = imports.ui.userWidget;
|
|||||||
const _FADE_ANIMATION_TIME = 0.25;
|
const _FADE_ANIMATION_TIME = 0.25;
|
||||||
const _SCROLL_ANIMATION_TIME = 0.5;
|
const _SCROLL_ANIMATION_TIME = 0.5;
|
||||||
const _TIMED_LOGIN_IDLE_THRESHOLD = 5.0;
|
const _TIMED_LOGIN_IDLE_THRESHOLD = 5.0;
|
||||||
const _LOGO_ICON_HEIGHT = 16;
|
const _LOGO_ICON_HEIGHT = 48;
|
||||||
|
|
||||||
const WORK_SPINNER_ICON_SIZE = 24;
|
|
||||||
const WORK_SPINNER_ANIMATION_DELAY = 1.0;
|
|
||||||
const WORK_SPINNER_ANIMATION_TIME = 0.3;
|
|
||||||
|
|
||||||
let _loginDialog = null;
|
let _loginDialog = null;
|
||||||
|
|
||||||
const LogoMenuButton = new Lang.Class({
|
|
||||||
Name: 'LogoMenuButton',
|
|
||||||
Extends: PanelMenu.Button,
|
|
||||||
|
|
||||||
_init: function() {
|
|
||||||
this.parent(0.0, null, true);
|
|
||||||
|
|
||||||
this._settings = new Gio.Settings({ schema: GdmUtil.LOGIN_SCREEN_SCHEMA });
|
|
||||||
this._settings.connect('changed::' + GdmUtil.LOGO_KEY,
|
|
||||||
Lang.bind(this, this._updateLogo));
|
|
||||||
|
|
||||||
this._iconBin = new St.Bin();
|
|
||||||
this.actor.add_actor(this._iconBin);
|
|
||||||
|
|
||||||
this._updateLogo();
|
|
||||||
},
|
|
||||||
|
|
||||||
_updateLogo: function() {
|
|
||||||
let path = this._settings.get_string(GdmUtil.LOGO_KEY);
|
|
||||||
let icon = null;
|
|
||||||
|
|
||||||
if (path) {
|
|
||||||
let file = Gio.file_new_for_path(path);
|
|
||||||
let cache = St.TextureCache.get_default();
|
|
||||||
icon = cache.load_uri_async(file.get_uri(), -1, _LOGO_ICON_HEIGHT);
|
|
||||||
}
|
|
||||||
this._iconBin.set_child(icon);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
const UserListItem = new Lang.Class({
|
const UserListItem = new Lang.Class({
|
||||||
Name: 'UserListItem',
|
Name: 'UserListItem',
|
||||||
|
|
||||||
@ -552,6 +518,12 @@ const LoginDialog = new Lang.Class({
|
|||||||
Lang.bind(this, this._updateBanner));
|
Lang.bind(this, this._updateBanner));
|
||||||
this._settings.connect('changed::' + GdmUtil.DISABLE_USER_LIST_KEY,
|
this._settings.connect('changed::' + GdmUtil.DISABLE_USER_LIST_KEY,
|
||||||
Lang.bind(this, this._updateDisableUserList));
|
Lang.bind(this, this._updateDisableUserList));
|
||||||
|
this._settings.connect('changed::' + GdmUtil.LOGO_KEY,
|
||||||
|
Lang.bind(this, this._updateLogo));
|
||||||
|
|
||||||
|
this._textureCache = St.TextureCache.get_default();
|
||||||
|
this._textureCache.connect('texture-file-changed',
|
||||||
|
Lang.bind(this, this._updateLogoTexture));
|
||||||
|
|
||||||
this._userSelectionBox = new St.BoxLayout({ style_class: 'login-dialog-user-selection-box',
|
this._userSelectionBox = new St.BoxLayout({ style_class: 'login-dialog-user-selection-box',
|
||||||
vertical: true });
|
vertical: true });
|
||||||
@ -594,6 +566,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,
|
||||||
@ -608,7 +581,6 @@ const LoginDialog = new Lang.Class({
|
|||||||
this._promptBox.add(this._promptLoginHint);
|
this._promptBox.add(this._promptLoginHint);
|
||||||
|
|
||||||
this._signInButton = null;
|
this._signInButton = null;
|
||||||
this._workSpinner = null;
|
|
||||||
|
|
||||||
this._sessionList = new SessionList();
|
this._sessionList = new SessionList();
|
||||||
this._sessionList.connect('session-activated',
|
this._sessionList.connect('session-activated',
|
||||||
@ -643,6 +615,11 @@ const LoginDialog = new Lang.Class({
|
|||||||
x_align: St.Align.START,
|
x_align: St.Align.START,
|
||||||
x_fill: true });
|
x_fill: true });
|
||||||
|
|
||||||
|
this._logoBin = new St.Bin({ style_class: 'login-dialog-logo-bin', y_expand: true });
|
||||||
|
this._logoBin.set_y_align(Clutter.ActorAlign.END);
|
||||||
|
this.backgroundStack.add_actor(this._logoBin);
|
||||||
|
this._updateLogo();
|
||||||
|
|
||||||
if (!this._userManager.is_loaded)
|
if (!this._userManager.is_loaded)
|
||||||
this._userManagerLoadedId = this._userManager.connect('notify::is-loaded',
|
this._userManagerLoadedId = this._userManager.connect('notify::is-loaded',
|
||||||
Lang.bind(this, function() {
|
Lang.bind(this, function() {
|
||||||
@ -689,7 +666,27 @@ const LoginDialog = new Lang.Class({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_updateLogoTexture: function(cache, uri) {
|
||||||
|
if (this._logoFileUri != uri)
|
||||||
|
return;
|
||||||
|
|
||||||
|
let icon = null;
|
||||||
|
if (this._logoFileUri)
|
||||||
|
icon = this._textureCache.load_uri_async(this._logoFileUri,
|
||||||
|
-1, _LOGO_ICON_HEIGHT);
|
||||||
|
this._logoBin.set_child(icon);
|
||||||
|
},
|
||||||
|
|
||||||
|
_updateLogo: function() {
|
||||||
|
let path = this._settings.get_string(GdmUtil.LOGO_KEY);
|
||||||
|
|
||||||
|
this._logoFileUri = path ? Gio.file_new_for_path(path).get_uri() : null;
|
||||||
|
this._updateLogoTexture(this._textureCache, this._logoFileUri);
|
||||||
|
},
|
||||||
|
|
||||||
_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;
|
||||||
@ -705,7 +702,7 @@ const LoginDialog = new Lang.Class({
|
|||||||
this._promptEntry.text = '';
|
this._promptEntry.text = '';
|
||||||
|
|
||||||
this._updateSensitivity(true);
|
this._updateSensitivity(true);
|
||||||
this._setWorking(false);
|
this.setWorking(false);
|
||||||
},
|
},
|
||||||
|
|
||||||
_onDefaultSessionChanged: function(client, sessionId) {
|
_onDefaultSessionChanged: function(client, sessionId) {
|
||||||
@ -771,10 +768,6 @@ const LoginDialog = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_prepareDialog: function(forSecret, hold) {
|
_prepareDialog: function(forSecret, hold) {
|
||||||
this._workSpinner = new Panel.AnimatedIcon('process-working.svg', WORK_SPINNER_ICON_SIZE);
|
|
||||||
this._workSpinner.actor.opacity = 0;
|
|
||||||
this._workSpinner.actor.show();
|
|
||||||
|
|
||||||
this.buttonLayout.visible = true;
|
this.buttonLayout.visible = true;
|
||||||
this.clearButtons();
|
this.clearButtons();
|
||||||
|
|
||||||
@ -787,8 +780,7 @@ const LoginDialog = new Lang.Class({
|
|||||||
y_fill: false,
|
y_fill: false,
|
||||||
x_align: St.Align.START,
|
x_align: St.Align.START,
|
||||||
y_align: St.Align.MIDDLE });
|
y_align: St.Align.MIDDLE });
|
||||||
this.buttonLayout.add(this._workSpinner.actor,
|
this.placeSpinner({ expand: false,
|
||||||
{ expand: false,
|
|
||||||
x_fill: false,
|
x_fill: false,
|
||||||
y_fill: false,
|
y_fill: false,
|
||||||
x_align: St.Align.END,
|
x_align: St.Align.END,
|
||||||
@ -811,6 +803,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,7 +832,12 @@ const LoginDialog = new Lang.Class({
|
|||||||
this._promptEntryTextChangedId = 0;
|
this._promptEntryTextChangedId = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
this._setWorking(false);
|
if (this._promptEntryActivateId > 0) {
|
||||||
|
this._promptEntry.clutter_text.disconnect(this._promptEntryActivateId);
|
||||||
|
this._promptEntryActivateId = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.setWorking(false);
|
||||||
this._promptBox.hide();
|
this._promptBox.hide();
|
||||||
this._promptLoginHint.hide();
|
this._promptLoginHint.hide();
|
||||||
|
|
||||||
@ -848,36 +850,9 @@ const LoginDialog = new Lang.Class({
|
|||||||
this._promptLoginHint.hide();
|
this._promptLoginHint.hide();
|
||||||
|
|
||||||
this.clearButtons();
|
this.clearButtons();
|
||||||
this._workSpinner = null;
|
|
||||||
this._signInButton = null;
|
this._signInButton = null;
|
||||||
},
|
},
|
||||||
|
|
||||||
_setWorking: function(working) {
|
|
||||||
if (!this._workSpinner)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (working) {
|
|
||||||
this._workSpinner.play();
|
|
||||||
Tweener.addTween(this._workSpinner.actor,
|
|
||||||
{ opacity: 255,
|
|
||||||
delay: WORK_SPINNER_ANIMATION_DELAY,
|
|
||||||
time: WORK_SPINNER_ANIMATION_TIME,
|
|
||||||
transition: 'linear'
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
Tweener.addTween(this._workSpinner.actor,
|
|
||||||
{ opacity: 0,
|
|
||||||
time: WORK_SPINNER_ANIMATION_TIME,
|
|
||||||
transition: 'linear',
|
|
||||||
onCompleteScope: this,
|
|
||||||
onComplete: function() {
|
|
||||||
if (this._workSpinner)
|
|
||||||
this._workSpinner.stop();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
_askQuestion: function(verifier, serviceName, question, passwordChar) {
|
_askQuestion: function(verifier, serviceName, question, passwordChar) {
|
||||||
this._promptLabel.set_text(question);
|
this._promptLabel.set_text(question);
|
||||||
|
|
||||||
@ -892,7 +867,7 @@ const LoginDialog = new Lang.Class({
|
|||||||
function() {
|
function() {
|
||||||
let text = this._promptEntry.get_text();
|
let text = this._promptEntry.get_text();
|
||||||
this._updateSensitivity(false);
|
this._updateSensitivity(false);
|
||||||
this._setWorking(true);
|
this.setWorking(true);
|
||||||
this._userVerifier.answerQuery(serviceName, text);
|
this._userVerifier.answerQuery(serviceName, text);
|
||||||
}];
|
}];
|
||||||
|
|
||||||
@ -900,24 +875,47 @@ const LoginDialog = new Lang.Class({
|
|||||||
return batch.run();
|
return batch.run();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_showRealmLoginHint: function(realmManager, hint) {
|
||||||
|
if (!hint)
|
||||||
|
return;
|
||||||
|
|
||||||
|
hint = hint.replace(/%U/g, 'user');
|
||||||
|
hint = hint.replace(/%D/g, 'DOMAIN');
|
||||||
|
hint = hint.replace(/%[^UD]/g, '');
|
||||||
|
|
||||||
|
// Translators: this message is shown below the username entry field
|
||||||
|
// to clue the user in on how to login to the local network realm
|
||||||
|
this._showLoginHint(null, _("(e.g., user or %s)").format(hint));
|
||||||
|
},
|
||||||
|
|
||||||
_askForUsernameAndLogIn: function() {
|
_askForUsernameAndLogIn: function() {
|
||||||
this._promptLabel.set_text(_("Username: "));
|
this._promptLabel.set_text(_("Username: "));
|
||||||
this._promptEntry.set_text('');
|
this._promptEntry.set_text('');
|
||||||
this._promptEntry.clutter_text.set_password_char('');
|
this._promptEntry.clutter_text.set_password_char('');
|
||||||
|
|
||||||
|
let realmManager = new Realmd.Manager();
|
||||||
|
let signalId = realmManager.connect('login-format-changed',
|
||||||
|
Lang.bind(this, this._showRealmLoginHint));
|
||||||
|
this._showRealmLoginHint(realmManager.loginFormat);
|
||||||
|
|
||||||
let tasks = [this._showPrompt,
|
let tasks = [this._showPrompt,
|
||||||
|
|
||||||
function() {
|
function() {
|
||||||
let userName = this._promptEntry.get_text();
|
let userName = this._promptEntry.get_text();
|
||||||
this._promptEntry.reactive = false;
|
this._promptEntry.reactive = false;
|
||||||
return this._beginVerificationForUser(userName);
|
return this._beginVerificationForUser(userName);
|
||||||
|
},
|
||||||
|
|
||||||
|
function() {
|
||||||
|
realmManager.disconnect(signalId)
|
||||||
|
realmManager.release();
|
||||||
}];
|
}];
|
||||||
|
|
||||||
let batch = new Batch.ConsecutiveBatch(this, tasks);
|
let batch = new Batch.ConsecutiveBatch(this, tasks);
|
||||||
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 +938,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 +1013,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 +1151,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 +1165,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);
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
@ -63,7 +63,7 @@ const Manager = new Lang.Class({
|
|||||||
Lang.bind(this, this._reloadRealms))
|
Lang.bind(this, this._reloadRealms))
|
||||||
this._realms = {};
|
this._realms = {};
|
||||||
|
|
||||||
this._aggregateProvider.connect('g-properties-changed',
|
this._signalId = this._aggregateProvider.connect('g-properties-changed',
|
||||||
Lang.bind(this, function(proxy, properties) {
|
Lang.bind(this, function(proxy, properties) {
|
||||||
if ('Realms' in properties.deep_unpack())
|
if ('Realms' in properties.deep_unpack())
|
||||||
this._reloadRealms();
|
this._reloadRealms();
|
||||||
@ -106,7 +106,7 @@ const Manager = new Lang.Class({
|
|||||||
realm.connect('g-properties-changed',
|
realm.connect('g-properties-changed',
|
||||||
Lang.bind(this, function(proxy, properties) {
|
Lang.bind(this, function(proxy, properties) {
|
||||||
if ('Configured' in properties.deep_unpack())
|
if ('Configured' in properties.deep_unpack())
|
||||||
this._reloadRealm();
|
this._reloadRealm(realm);
|
||||||
}));
|
}));
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -134,6 +134,18 @@ const Manager = new Lang.Class({
|
|||||||
this._updateLoginFormat();
|
this._updateLoginFormat();
|
||||||
|
|
||||||
return this._loginFormat;
|
return this._loginFormat;
|
||||||
|
},
|
||||||
|
|
||||||
|
release: function() {
|
||||||
|
Service(Gio.DBus.system,
|
||||||
|
'org.freedesktop.realmd',
|
||||||
|
'/org/freedesktop/realmd',
|
||||||
|
function(service) {
|
||||||
|
service.ReleaseRemote();
|
||||||
|
});
|
||||||
|
this._aggregateProvider.disconnect(this._signalId);
|
||||||
|
this._realms = { };
|
||||||
|
this._updateLoginFormat();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
Signals.addSignalMethods(Manager.prototype)
|
Signals.addSignalMethods(Manager.prototype)
|
||||||
|
140
js/gdm/util.js
140
js/gdm/util.js
@ -2,13 +2,13 @@
|
|||||||
|
|
||||||
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;
|
||||||
|
|
||||||
const Batch = imports.gdm.batch;
|
const Batch = imports.gdm.batch;
|
||||||
const Fprint = imports.gdm.fingerprint;
|
const Fprint = imports.gdm.fingerprint;
|
||||||
const Realmd = imports.gdm.realmd;
|
|
||||||
const Main = imports.ui.main;
|
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;
|
||||||
@ -27,6 +27,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;
|
||||||
@ -113,7 +116,9 @@ const ShellUserVerifier = new Lang.Class({
|
|||||||
this._settings = new Gio.Settings({ schema: LOGIN_SCREEN_SCHEMA });
|
this._settings = new Gio.Settings({ schema: LOGIN_SCREEN_SCHEMA });
|
||||||
|
|
||||||
this._fprintManager = new Fprint.FprintManager();
|
this._fprintManager = new Fprint.FprintManager();
|
||||||
this._realmManager = new Realmd.Manager();
|
this._messageQueue = [];
|
||||||
|
this._messageQueueTimeoutId = 0;
|
||||||
|
this.hasPendingMessages = false;
|
||||||
|
|
||||||
this._failCounter = 0;
|
this._failCounter = 0;
|
||||||
},
|
},
|
||||||
@ -153,13 +158,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);
|
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);
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_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 +244,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 +363,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,22 +372,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() {
|
|
||||||
if (this._realmManager.loginFormat) {
|
|
||||||
let hint = this._realmManager.loginFormat;
|
|
||||||
|
|
||||||
hint = hint.replace(/%U/g, 'user');
|
|
||||||
hint = hint.replace(/%D/g, 'DOMAIN');
|
|
||||||
hint = hint.replace(/%[^UD]/g, '');
|
|
||||||
|
|
||||||
// Translators: this message is shown below the username entry field
|
|
||||||
// to clue the user in on how to login to the local network realm
|
|
||||||
this.emit('show-login-hint',
|
|
||||||
_("(e.g., user or %s)").format(hint));
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_onInfoQuery: function(client, serviceName, question) {
|
_onInfoQuery: function(client, serviceName, question) {
|
||||||
@ -330,10 +380,6 @@ const ShellUserVerifier = new Lang.Class({
|
|||||||
if (serviceName != PASSWORD_SERVICE_NAME)
|
if (serviceName != PASSWORD_SERVICE_NAME)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
this._showRealmLoginHint();
|
|
||||||
this._realmLoginHintSignalId = this._realmManager.connect('login-format-changed',
|
|
||||||
Lang.bind(this, this._showRealmLoginHint));
|
|
||||||
|
|
||||||
this.emit('ask-question', serviceName, question, '');
|
this.emit('ask-question', serviceName, question, '');
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -346,8 +392,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 +402,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,16 +422,26 @@ 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 {
|
} else {
|
||||||
// Allow some time to see the message, then reset everything
|
let signalId = this._userVerifier.connect('no-more-messages',
|
||||||
Mainloop.timeout_add(3000, Lang.bind(this, function() {
|
Lang.bind(this, function() {
|
||||||
this.cancel();
|
this._userVerifier.disconnect(signalId);
|
||||||
|
this._retry();
|
||||||
this._onReset();
|
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
if (!this._userVerifier.hasPendingMessages) {
|
||||||
|
this._cancelAndReset();
|
||||||
|
} else {
|
||||||
|
let signalId = this._userVerifier.connect('no-more-messages',
|
||||||
|
Lang.bind(this, function() {
|
||||||
|
this._userVerifier.disconnect(signalId);
|
||||||
|
this._cancelAndReset();
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
this.emit('verification-failed');
|
this.emit('verification-failed');
|
||||||
},
|
},
|
||||||
@ -392,11 +455,6 @@ const ShellUserVerifier = new Lang.Class({
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.emit('hide-login-hint');
|
this.emit('hide-login-hint');
|
||||||
|
|
||||||
if (this._realmLoginHintSignalId) {
|
|
||||||
this._realmManager.disconnect(this._realmLoginHintSignalId);
|
|
||||||
this._realmLoginHintSignalId = 0;
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
Signals.addSignalMethods(ShellUserVerifier.prototype);
|
Signals.addSignalMethods(ShellUserVerifier.prototype);
|
||||||
|
@ -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,13 @@ 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;
|
if (this._currentWindow < 0)
|
||||||
appIcon.app.activate_window(appIcon.cachedWindows[window], timestamp);
|
appIcon.app.activate_window(appIcon.cachedWindows[0], timestamp);
|
||||||
|
else
|
||||||
|
Main.activateWindow(appIcon.cachedWindows[this._currentWindow], timestamp);
|
||||||
|
|
||||||
|
this.parent();
|
||||||
},
|
},
|
||||||
|
|
||||||
_onDestroy : function() {
|
_onDestroy : function() {
|
||||||
@ -395,9 +397,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,
|
||||||
@ -164,8 +187,11 @@ const AllView = new Lang.Class({
|
|||||||
_init: function() {
|
_init: function() {
|
||||||
this.parent();
|
this.parent();
|
||||||
|
|
||||||
|
this._grid.actor.y_align = Clutter.ActorAlign.START;
|
||||||
|
this._grid.actor.y_expand = true;
|
||||||
|
|
||||||
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);
|
||||||
@ -253,35 +279,17 @@ const AllView = new Lang.Class({
|
|||||||
this._eventBlocker.reactive = isOpen;
|
this._eventBlocker.reactive = isOpen;
|
||||||
this._currentPopup = isOpen ? popup : null;
|
this._currentPopup = isOpen ? popup : null;
|
||||||
this._updateIconOpacities(isOpen);
|
this._updateIconOpacities(isOpen);
|
||||||
if (isOpen)
|
if (isOpen) {
|
||||||
this._ensureIconVisible(popup.actor);
|
this._ensureIconVisible(popup.actor);
|
||||||
|
this._grid.actor.y = popup.parentOffset;
|
||||||
|
} else {
|
||||||
|
this._grid.actor.y = 0;
|
||||||
|
}
|
||||||
}));
|
}));
|
||||||
},
|
},
|
||||||
|
|
||||||
_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) {
|
||||||
@ -326,6 +334,42 @@ const Views = {
|
|||||||
ALL: 1
|
ALL: 1
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const ControlsBoxLayout = Lang.Class({
|
||||||
|
Name: 'ControlsBoxLayout',
|
||||||
|
Extends: Clutter.BoxLayout,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Override the BoxLayout behavior to use the maximum preferred width of all
|
||||||
|
* buttons for each child
|
||||||
|
*/
|
||||||
|
vfunc_get_preferred_width: function(container, forHeight) {
|
||||||
|
let maxMinWidth = 0;
|
||||||
|
let maxNaturalWidth = 0;
|
||||||
|
for (let child = container.get_first_child();
|
||||||
|
child;
|
||||||
|
child = child.get_next_sibling()) {
|
||||||
|
let [minWidth, natWidth] = child.get_preferred_width(forHeight);
|
||||||
|
maxMinWidth = Math.max(maxMinWidth, minWidth);
|
||||||
|
maxNaturalWidth = Math.max(maxNaturalWidth, natWidth);
|
||||||
|
}
|
||||||
|
let childrenCount = container.get_n_children();
|
||||||
|
let totalSpacing = this.spacing * (childrenCount - 1);
|
||||||
|
return [maxMinWidth * childrenCount + totalSpacing,
|
||||||
|
maxNaturalWidth * childrenCount + totalSpacing];
|
||||||
|
},
|
||||||
|
|
||||||
|
vfunc_set_container: function(container) {
|
||||||
|
if(this._styleChangedId) {
|
||||||
|
this._container.disconnect(this._styleChangedId);
|
||||||
|
this._styleChangedId = 0;
|
||||||
|
}
|
||||||
|
if(container != null)
|
||||||
|
this._styleChangedId = container.connect('style-changed', Lang.bind(this,
|
||||||
|
function() { this.spacing = this._container.get_theme_node().get_length('spacing'); }));
|
||||||
|
this._container = container;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
const AppDisplay = new Lang.Class({
|
const AppDisplay = new Lang.Class({
|
||||||
Name: 'AppDisplay',
|
Name: 'AppDisplay',
|
||||||
|
|
||||||
@ -366,9 +410,9 @@ const AppDisplay = new Lang.Class({
|
|||||||
x_expand: true, y_expand: true });
|
x_expand: true, y_expand: true });
|
||||||
this.actor.add(this._viewStack, { expand: true });
|
this.actor.add(this._viewStack, { expand: true });
|
||||||
|
|
||||||
let layout = new Clutter.BoxLayout({ homogeneous: true });
|
let layout = new ControlsBoxLayout({ homogeneous: true });
|
||||||
this._controls = new St.Widget({ style_class: 'app-view-controls',
|
this._controls = new St.Widget({ style_class: 'app-view-controls' });
|
||||||
layout_manager: layout });
|
this._controls.set_layout_manager(layout);
|
||||||
this.actor.add(new St.Bin({ child: this._controls }));
|
this.actor.add(new St.Bin({ child: this._controls }));
|
||||||
|
|
||||||
|
|
||||||
@ -571,7 +615,11 @@ const FolderIcon = new Lang.Class({
|
|||||||
// Position the popup above or below the source icon
|
// Position the popup above or below the source icon
|
||||||
if (side == St.Side.BOTTOM) {
|
if (side == St.Side.BOTTOM) {
|
||||||
this._popup.actor.show();
|
this._popup.actor.show();
|
||||||
this._popup.actor.y = this.actor.y - this._popup.actor.height;
|
let closeButtonOffset = -this._popup.closeButton.translation_y;
|
||||||
|
let y = this.actor.y - this._popup.actor.height;
|
||||||
|
let yWithButton = y - closeButtonOffset;
|
||||||
|
this._popup.parentOffset = yWithButton < 0 ? -yWithButton : 0;
|
||||||
|
this._popup.actor.y = Math.max(y, closeButtonOffset);
|
||||||
this._popup.actor.hide();
|
this._popup.actor.hide();
|
||||||
} else {
|
} else {
|
||||||
this._popup.actor.y = this.actor.y + this.actor.height;
|
this._popup.actor.y = this.actor.y + this.actor.height;
|
||||||
@ -594,6 +642,7 @@ const AppFolderPopup = new Lang.Class({
|
|||||||
this._arrowSide = side;
|
this._arrowSide = side;
|
||||||
|
|
||||||
this._isOpen = false;
|
this._isOpen = false;
|
||||||
|
this.parentOffset = 0;
|
||||||
|
|
||||||
this.actor = new St.Widget({ layout_manager: new Clutter.BinLayout(),
|
this.actor = new St.Widget({ layout_manager: new Clutter.BinLayout(),
|
||||||
visible: false,
|
visible: false,
|
||||||
@ -617,17 +666,31 @@ const AppFolderPopup = new Lang.Class({
|
|||||||
this.actor.add_actor(this._boxPointer.actor);
|
this.actor.add_actor(this._boxPointer.actor);
|
||||||
this._boxPointer.bin.set_child(this._view.actor);
|
this._boxPointer.bin.set_child(this._view.actor);
|
||||||
|
|
||||||
let closeButton = Util.makeCloseButton();
|
this.closeButton = Util.makeCloseButton();
|
||||||
closeButton.connect('clicked', Lang.bind(this, this.popdown));
|
this.closeButton.connect('clicked', Lang.bind(this, this.popdown));
|
||||||
this.actor.add_actor(closeButton);
|
this.actor.add_actor(this.closeButton);
|
||||||
|
|
||||||
this._boxPointer.actor.bind_property('opacity', closeButton, 'opacity',
|
this._boxPointer.actor.bind_property('opacity', this.closeButton, 'opacity',
|
||||||
GObject.BindingFlags.SYNC_CREATE);
|
GObject.BindingFlags.SYNC_CREATE);
|
||||||
|
|
||||||
|
global.focus_manager.add_group(this.actor);
|
||||||
|
|
||||||
source.actor.connect('destroy', Lang.bind(this,
|
source.actor.connect('destroy', Lang.bind(this,
|
||||||
function() {
|
function() {
|
||||||
this.actor.destroy();
|
this.actor.destroy();
|
||||||
}));
|
}));
|
||||||
|
this.actor.connect('key-press-event', Lang.bind(this, this._onKeyPress));
|
||||||
|
},
|
||||||
|
|
||||||
|
_onKeyPress: function(actor, event) {
|
||||||
|
if (!this._isOpen)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (event.get_key_symbol() != Clutter.KEY_Escape)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
this.popdown();
|
||||||
|
return true;
|
||||||
},
|
},
|
||||||
|
|
||||||
toggle: function() {
|
toggle: function() {
|
||||||
@ -642,6 +705,7 @@ const AppFolderPopup = new Lang.Class({
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
this.actor.show();
|
this.actor.show();
|
||||||
|
this.actor.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
|
||||||
|
|
||||||
this._boxPointer.setArrowActor(this._source.actor);
|
this._boxPointer.setArrowActor(this._source.actor);
|
||||||
this._boxPointer.show(BoxPointer.PopupAnimation.FADE |
|
this._boxPointer.show(BoxPointer.PopupAnimation.FADE |
|
||||||
|
@ -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,9 +85,9 @@ 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;
|
||||||
},
|
},
|
||||||
@ -125,9 +126,81 @@ const BackgroundCache = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
removeImageContent: function(content) {
|
removeImageContent: function(content) {
|
||||||
|
let filename = content.get_filename();
|
||||||
|
|
||||||
|
if (filename && this._fileMonitors[filename])
|
||||||
|
delete this._fileMonitors[filename];
|
||||||
|
|
||||||
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 +238,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 +328,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 +417,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 +431,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(this._images[index].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 +470,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 +490,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 +656,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 +670,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 +717,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 +738,28 @@ 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() {
|
||||||
|
if (this._newBackground == newBackground) {
|
||||||
this.background = newBackground;
|
this.background = newBackground;
|
||||||
this._newBackground = null;
|
this._newBackground = null;
|
||||||
|
} else {
|
||||||
|
newBackground.actor.destroy();
|
||||||
|
}
|
||||||
|
|
||||||
background.actor.destroy();
|
background.actor.destroy();
|
||||||
|
|
||||||
this.emit('changed');
|
this.emit('changed');
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
}));
|
}));
|
||||||
this._loadedSignalId = signalId;
|
|
||||||
|
|
||||||
this._newBackground = newBackground;
|
this._newBackground = newBackground;
|
||||||
},
|
},
|
||||||
@ -711,12 +778,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;
|
||||||
},
|
},
|
||||||
|
@ -46,8 +46,10 @@ function addBackgroundMenu(actor) {
|
|||||||
clickAction.connect('long-press', function(action, actor, state) {
|
clickAction.connect('long-press', function(action, actor, state) {
|
||||||
if (state == Clutter.LongPressState.QUERY)
|
if (state == Clutter.LongPressState.QUERY)
|
||||||
return action.get_button() == 1 && !actor._backgroundMenu.isOpen;
|
return action.get_button() == 1 && !actor._backgroundMenu.isOpen;
|
||||||
if (state == Clutter.LongPressState.ACTIVATE)
|
if (state == Clutter.LongPressState.ACTIVATE) {
|
||||||
openMenu();
|
openMenu();
|
||||||
|
actor._backgroundManager.ignoreRelease();
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
clickAction.connect('clicked', function(action) {
|
clickAction.connect('clicked', function(action) {
|
||||||
@ -55,4 +57,12 @@ 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;
|
||||||
|
|
||||||
|
cursor.destroy();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
@ -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._eventSourceChangedId = this._eventSource.connect('changed', Lang.bind(this, function() {
|
|
||||||
this._update(false);
|
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,16 +644,12 @@ 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 = [];
|
||||||
|
|
||||||
|
@ -25,7 +25,7 @@ const KeyringDialog = new Lang.Class({
|
|||||||
this.prompt = new Shell.KeyringPrompt();
|
this.prompt = new Shell.KeyringPrompt();
|
||||||
this.prompt.connect('show-password', Lang.bind(this, this._onShowPassword));
|
this.prompt.connect('show-password', Lang.bind(this, this._onShowPassword));
|
||||||
this.prompt.connect('show-confirm', Lang.bind(this, this._onShowConfirm));
|
this.prompt.connect('show-confirm', Lang.bind(this, this._onShowConfirm));
|
||||||
this.prompt.connect('hide-prompt', Lang.bind(this, this._onHidePrompt));
|
this.prompt.connect('prompt-close', Lang.bind(this, this._onHidePrompt));
|
||||||
|
|
||||||
let mainContentBox = new St.BoxLayout({ style_class: 'prompt-dialog-main-layout',
|
let mainContentBox = new St.BoxLayout({ style_class: 'prompt-dialog-main-layout',
|
||||||
vertical: false });
|
vertical: false });
|
||||||
@ -63,11 +63,17 @@ const KeyringDialog = new Lang.Class({
|
|||||||
|
|
||||||
this._cancelButton = this.addButton({ label: '',
|
this._cancelButton = this.addButton({ label: '',
|
||||||
action: Lang.bind(this, this._onCancelButton),
|
action: Lang.bind(this, this._onCancelButton),
|
||||||
key: Clutter.Escape });
|
key: Clutter.Escape },
|
||||||
|
{ expand: true, x_fill: false, x_align: St.Align.START });
|
||||||
|
this.placeSpinner({ expand: false,
|
||||||
|
x_fill: false,
|
||||||
|
y_fill: false,
|
||||||
|
x_align: St.Align.END,
|
||||||
|
y_align: St.Align.MIDDLE });
|
||||||
this._continueButton = this.addButton({ label: '',
|
this._continueButton = this.addButton({ label: '',
|
||||||
action: Lang.bind(this, this._onContinueButton),
|
action: Lang.bind(this, this._onContinueButton),
|
||||||
default: true },
|
default: true },
|
||||||
{ expand: true, x_fill: false, x_align: St.Align.END });
|
{ expand: false, x_fill: false, x_align: St.Align.END });
|
||||||
|
|
||||||
this.prompt.bind_property('cancel-label', this._cancelButton, 'label', GObject.BindingFlags.SYNC_CREATE);
|
this.prompt.bind_property('cancel-label', this._cancelButton, 'label', GObject.BindingFlags.SYNC_CREATE);
|
||||||
this.prompt.bind_property('continue-label', this._continueButton, 'label', GObject.BindingFlags.SYNC_CREATE);
|
this.prompt.bind_property('continue-label', this._continueButton, 'label', GObject.BindingFlags.SYNC_CREATE);
|
||||||
@ -143,11 +149,19 @@ const KeyringDialog = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_updateSensitivity: function(sensitive) {
|
_updateSensitivity: function(sensitive) {
|
||||||
|
if (this._passwordEntry) {
|
||||||
this._passwordEntry.reactive = sensitive;
|
this._passwordEntry.reactive = sensitive;
|
||||||
this._passwordEntry.clutter_text.editable = sensitive;
|
this._passwordEntry.clutter_text.editable = sensitive;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this._confirmEntry) {
|
||||||
|
this._confirmEntry.reactive = sensitive;
|
||||||
|
this._confirmEntry.clutter_text.editable = sensitive;
|
||||||
|
}
|
||||||
|
|
||||||
this._continueButton.can_focus = sensitive;
|
this._continueButton.can_focus = sensitive;
|
||||||
this._continueButton.reactive = sensitive;
|
this._continueButton.reactive = sensitive;
|
||||||
|
this.setWorking(!sensitive);
|
||||||
},
|
},
|
||||||
|
|
||||||
_ensureOpen: function() {
|
_ensureOpen: function() {
|
||||||
@ -222,7 +236,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() {
|
||||||
|
@ -31,7 +31,6 @@ const AuthenticationDialog = new Lang.Class({
|
|||||||
this.message = message;
|
this.message = message;
|
||||||
this.userNames = userNames;
|
this.userNames = userNames;
|
||||||
this._wasDismissed = false;
|
this._wasDismissed = false;
|
||||||
this._completed = false;
|
|
||||||
|
|
||||||
let mainContentBox = new St.BoxLayout({ style_class: 'prompt-dialog-main-layout',
|
let mainContentBox = new St.BoxLayout({ style_class: 'prompt-dialog-main-layout',
|
||||||
vertical: false });
|
vertical: false });
|
||||||
@ -161,26 +160,32 @@ const AuthenticationDialog = new Lang.Class({
|
|||||||
|
|
||||||
this._cancelButton = this.addButton({ label: _("Cancel"),
|
this._cancelButton = this.addButton({ label: _("Cancel"),
|
||||||
action: Lang.bind(this, this.cancel),
|
action: Lang.bind(this, this.cancel),
|
||||||
key: Clutter.Escape });
|
key: Clutter.Escape },
|
||||||
|
{ expand: true, x_fill: false, x_align: St.Align.START });
|
||||||
|
this.placeSpinner({ expand: false,
|
||||||
|
x_fill: false,
|
||||||
|
y_fill: false,
|
||||||
|
x_align: St.Align.END,
|
||||||
|
y_align: St.Align.MIDDLE });
|
||||||
this._okButton = this.addButton({ label: _("Authenticate"),
|
this._okButton = this.addButton({ label: _("Authenticate"),
|
||||||
action: Lang.bind(this, this._onAuthenticateButtonPressed),
|
action: Lang.bind(this, this._onAuthenticateButtonPressed),
|
||||||
default: true },
|
default: true },
|
||||||
{ expand: true, x_fill: false, x_align: St.Align.END });
|
{ expand: false, x_fill: false, x_align: St.Align.END });
|
||||||
|
|
||||||
this._doneEmitted = false;
|
this._doneEmitted = false;
|
||||||
|
|
||||||
this._identityToAuth = Polkit.UnixUser.new_for_name(userName);
|
this._identityToAuth = Polkit.UnixUser.new_for_name(userName);
|
||||||
this._cookie = cookie;
|
this._cookie = cookie;
|
||||||
|
},
|
||||||
|
|
||||||
|
performAuthentication: function() {
|
||||||
|
this.destroySession();
|
||||||
this._session = new PolkitAgent.Session({ identity: this._identityToAuth,
|
this._session = new PolkitAgent.Session({ identity: this._identityToAuth,
|
||||||
cookie: this._cookie });
|
cookie: this._cookie });
|
||||||
this._session.connect('completed', Lang.bind(this, this._onSessionCompleted));
|
this._session.connect('completed', Lang.bind(this, this._onSessionCompleted));
|
||||||
this._session.connect('request', Lang.bind(this, this._onSessionRequest));
|
this._session.connect('request', Lang.bind(this, this._onSessionRequest));
|
||||||
this._session.connect('show-error', Lang.bind(this, this._onSessionShowError));
|
this._session.connect('show-error', Lang.bind(this, this._onSessionShowError));
|
||||||
this._session.connect('show-info', Lang.bind(this, this._onSessionShowInfo));
|
this._session.connect('show-info', Lang.bind(this, this._onSessionShowInfo));
|
||||||
},
|
|
||||||
|
|
||||||
startAuthentication: function() {
|
|
||||||
this._session.initiate();
|
this._session.initiate();
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -202,14 +207,14 @@ const AuthenticationDialog = new Lang.Class({
|
|||||||
log('polkitAuthenticationAgent: Failed to show modal dialog.' +
|
log('polkitAuthenticationAgent: Failed to show modal dialog.' +
|
||||||
' Dismissing authentication request for action-id ' + this.actionId +
|
' Dismissing authentication request for action-id ' + this.actionId +
|
||||||
' cookie ' + this._cookie);
|
' cookie ' + this._cookie);
|
||||||
this._emitDone(false, true);
|
this._emitDone(true);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_emitDone: function(keepVisible, dismissed) {
|
_emitDone: function(dismissed) {
|
||||||
if (!this._doneEmitted) {
|
if (!this._doneEmitted) {
|
||||||
this._doneEmitted = true;
|
this._doneEmitted = true;
|
||||||
this.emit('done', keepVisible, dismissed);
|
this.emit('done', dismissed);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -219,6 +224,7 @@ const AuthenticationDialog = new Lang.Class({
|
|||||||
|
|
||||||
this._okButton.can_focus = sensitive;
|
this._okButton.can_focus = sensitive;
|
||||||
this._okButton.reactive = sensitive;
|
this._okButton.reactive = sensitive;
|
||||||
|
this.setWorking(!sensitive);
|
||||||
},
|
},
|
||||||
|
|
||||||
_onEntryActivate: function() {
|
_onEntryActivate: function() {
|
||||||
@ -237,12 +243,16 @@ const AuthenticationDialog = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_onSessionCompleted: function(session, gainedAuthorization) {
|
_onSessionCompleted: function(session, gainedAuthorization) {
|
||||||
if (this._completed)
|
if (this._completed || this._doneEmitted)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
this._completed = true;
|
this._completed = true;
|
||||||
|
|
||||||
if (!gainedAuthorization) {
|
/* Yay, all done */
|
||||||
|
if (gainedAuthorization) {
|
||||||
|
this._emitDone(false);
|
||||||
|
|
||||||
|
} else {
|
||||||
/* Unless we are showing an existing error message from the PAM
|
/* Unless we are showing an existing error message from the PAM
|
||||||
* module (the PAM module could be reporting the authentication
|
* module (the PAM module could be reporting the authentication
|
||||||
* error providing authentication-method specific information),
|
* error providing authentication-method specific information),
|
||||||
@ -258,8 +268,10 @@ const AuthenticationDialog = new Lang.Class({
|
|||||||
this._infoMessageLabel.hide();
|
this._infoMessageLabel.hide();
|
||||||
this._nullMessageLabel.hide();
|
this._nullMessageLabel.hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Try and authenticate again */
|
||||||
|
this.performAuthentication();
|
||||||
}
|
}
|
||||||
this._emitDone(!gainedAuthorization, false);
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_onSessionRequest: function(session, request, echo_on) {
|
_onSessionRequest: function(session, request, echo_on) {
|
||||||
@ -303,6 +315,7 @@ const AuthenticationDialog = new Lang.Class({
|
|||||||
if (this._session) {
|
if (this._session) {
|
||||||
if (!this._completed)
|
if (!this._completed)
|
||||||
this._session.cancel();
|
this._session.cancel();
|
||||||
|
this._completed = false;
|
||||||
this._session = null;
|
this._session = null;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -317,7 +330,7 @@ const AuthenticationDialog = new Lang.Class({
|
|||||||
cancel: function() {
|
cancel: function() {
|
||||||
this._wasDismissed = true;
|
this._wasDismissed = true;
|
||||||
this.close(global.get_current_time());
|
this.close(global.get_current_time());
|
||||||
this._emitDone(false, true);
|
this._emitDone(true);
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
Signals.addSignalMethods(AuthenticationDialog.prototype);
|
Signals.addSignalMethods(AuthenticationDialog.prototype);
|
||||||
@ -327,7 +340,6 @@ const AuthenticationAgent = new Lang.Class({
|
|||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
this._currentDialog = null;
|
this._currentDialog = null;
|
||||||
this._isCompleting = false;
|
|
||||||
this._handle = null;
|
this._handle = null;
|
||||||
this._native = new Shell.PolkitAuthenticationAgent();
|
this._native = new Shell.PolkitAuthenticationAgent();
|
||||||
this._native.connect('initiate', Lang.bind(this, this._onInitiate));
|
this._native.connect('initiate', Lang.bind(this, this._onInitiate));
|
||||||
@ -364,45 +376,24 @@ const AuthenticationAgent = new Lang.Class({
|
|||||||
// discussion.
|
// discussion.
|
||||||
|
|
||||||
this._currentDialog.connect('done', Lang.bind(this, this._onDialogDone));
|
this._currentDialog.connect('done', Lang.bind(this, this._onDialogDone));
|
||||||
this._currentDialog.startAuthentication();
|
this._currentDialog.performAuthentication();
|
||||||
},
|
},
|
||||||
|
|
||||||
_onCancel: function(nativeAgent) {
|
_onCancel: function(nativeAgent) {
|
||||||
this._completeRequest(false, false);
|
this._completeRequest(false);
|
||||||
},
|
},
|
||||||
|
|
||||||
_onDialogDone: function(dialog, keepVisible, dismissed) {
|
_onDialogDone: function(dialog, dismissed) {
|
||||||
this._completeRequest(keepVisible, dismissed);
|
this._completeRequest(dismissed);
|
||||||
},
|
},
|
||||||
|
|
||||||
_reallyCompleteRequest: function(dismissed) {
|
_completeRequest: function(dismissed) {
|
||||||
this._currentDialog.close();
|
this._currentDialog.close();
|
||||||
this._currentDialog.destroySession();
|
this._currentDialog.destroySession();
|
||||||
this._currentDialog = null;
|
this._currentDialog = null;
|
||||||
this._isCompleting = false;
|
|
||||||
|
|
||||||
this._native.complete(dismissed)
|
this._native.complete(dismissed);
|
||||||
},
|
},
|
||||||
|
|
||||||
_completeRequest: function(keepVisible, wasDismissed) {
|
|
||||||
if (this._isCompleting)
|
|
||||||
return;
|
|
||||||
|
|
||||||
this._isCompleting = true;
|
|
||||||
|
|
||||||
if (keepVisible) {
|
|
||||||
// Give the user 2 seconds to read 'Authentication Failure' before
|
|
||||||
// dismissing the dialog
|
|
||||||
Mainloop.timeout_add(2000,
|
|
||||||
Lang.bind(this,
|
|
||||||
function() {
|
|
||||||
this._reallyCompleteRequest(wasDismissed);
|
|
||||||
return false;
|
|
||||||
}));
|
|
||||||
} else {
|
|
||||||
this._reallyCompleteRequest(wasDismissed);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
const Component = AuthenticationAgent;
|
const Component = AuthenticationAgent;
|
||||||
|
@ -20,8 +20,7 @@ const Recorder = new Lang.Class({
|
|||||||
Main.wm.addKeybinding('toggle-recording',
|
Main.wm.addKeybinding('toggle-recording',
|
||||||
this._bindingSettings,
|
this._bindingSettings,
|
||||||
Meta.KeyBindingFlags.NONE,
|
Meta.KeyBindingFlags.NONE,
|
||||||
Shell.KeyBindingMode.NORMAL |
|
Shell.KeyBindingMode.ALL,
|
||||||
Shell.KeyBindingMode.OVERVIEW,
|
|
||||||
Lang.bind(this, this._toggleRecorder));
|
Lang.bind(this, this._toggleRecorder));
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -89,21 +89,33 @@ const CtrlAltTabManager = new Lang.Class({
|
|||||||
let items = this._items.filter(function (item) { return item.proxy.mapped; });
|
let items = this._items.filter(function (item) { return item.proxy.mapped; });
|
||||||
|
|
||||||
// And add the windows metacity would show in its Ctrl-Alt-Tab list
|
// And add the windows metacity would show in its Ctrl-Alt-Tab list
|
||||||
if (!Main.overview.visible) {
|
if (Main.sessionMode.hasWindows && !Main.overview.visible) {
|
||||||
let screen = global.screen;
|
let screen = global.screen;
|
||||||
let display = screen.get_display();
|
let display = screen.get_display();
|
||||||
let windows = display.get_tab_list(Meta.TabList.DOCKS, screen, screen.get_active_workspace ());
|
let windows = display.get_tab_list(Meta.TabList.DOCKS, screen, screen.get_active_workspace ());
|
||||||
let windowTracker = Shell.WindowTracker.get_default();
|
let windowTracker = Shell.WindowTracker.get_default();
|
||||||
let textureCache = St.TextureCache.get_default();
|
let textureCache = St.TextureCache.get_default();
|
||||||
for (let i = 0; i < windows.length; i++) {
|
for (let i = 0; i < windows.length; i++) {
|
||||||
let icon;
|
let icon = null;
|
||||||
|
let iconName = null;
|
||||||
|
if (windows[i].get_window_type () == Meta.WindowType.DESKTOP) {
|
||||||
|
iconName = 'video-display-symbolic';
|
||||||
|
} else {
|
||||||
let app = windowTracker.get_window_app(windows[i]);
|
let app = windowTracker.get_window_app(windows[i]);
|
||||||
if (app)
|
if (app)
|
||||||
icon = app.create_icon_texture(POPUP_APPICON_SIZE);
|
icon = app.create_icon_texture(POPUP_APPICON_SIZE);
|
||||||
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,
|
||||||
|
iconName: iconName,
|
||||||
sortGroup: SortGroup.MIDDLE });
|
sortGroup: SortGroup.MIDDLE });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -326,6 +326,16 @@ const DragPlaceholderItem = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const EmptyDropTargetItem = new Lang.Class({
|
||||||
|
Name: 'EmptyDropTargetItem',
|
||||||
|
Extends: DashItemContainer,
|
||||||
|
|
||||||
|
_init: function() {
|
||||||
|
this.parent();
|
||||||
|
this.setChild(new St.Bin({ style_class: 'empty-dash-drop-target' }));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
const DashActor = new Lang.Class({
|
const DashActor = new Lang.Class({
|
||||||
Name: 'DashActor',
|
Name: 'DashActor',
|
||||||
Extends: St.Widget,
|
Extends: St.Widget,
|
||||||
@ -441,6 +451,12 @@ const Dash = new Lang.Class({
|
|||||||
dragMotion: Lang.bind(this, this._onDragMotion)
|
dragMotion: Lang.bind(this, this._onDragMotion)
|
||||||
};
|
};
|
||||||
DND.addDragMonitor(this._dragMonitor);
|
DND.addDragMonitor(this._dragMonitor);
|
||||||
|
|
||||||
|
if (this._box.get_n_children() == 0) {
|
||||||
|
this._emptyDropTarget = new EmptyDropTargetItem();
|
||||||
|
this._box.insert_child_at_index(this._emptyDropTarget, 0);
|
||||||
|
this._emptyDropTarget.show(true);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_onDragCancelled: function() {
|
_onDragCancelled: function() {
|
||||||
@ -457,6 +473,7 @@ const Dash = new Lang.Class({
|
|||||||
|
|
||||||
_endDrag: function() {
|
_endDrag: function() {
|
||||||
this._clearDragPlaceholder();
|
this._clearDragPlaceholder();
|
||||||
|
this._clearEmptyDropTarget();
|
||||||
this._showAppsIcon.setDragApp(null);
|
this._showAppsIcon.setDragApp(null);
|
||||||
DND.removeDragMonitor(this._dragMonitor);
|
DND.removeDragMonitor(this._dragMonitor);
|
||||||
},
|
},
|
||||||
@ -797,9 +814,21 @@ const Dash = new Lang.Class({
|
|||||||
|
|
||||||
_clearDragPlaceholder: function() {
|
_clearDragPlaceholder: function() {
|
||||||
if (this._dragPlaceholder) {
|
if (this._dragPlaceholder) {
|
||||||
|
this._animatingPlaceholdersCount++;
|
||||||
this._dragPlaceholder.animateOutAndDestroy();
|
this._dragPlaceholder.animateOutAndDestroy();
|
||||||
|
this._dragPlaceholder.connect('destroy',
|
||||||
|
Lang.bind(this, function() {
|
||||||
|
this._animatingPlaceholdersCount--;
|
||||||
|
}));
|
||||||
this._dragPlaceholder = null;
|
this._dragPlaceholder = null;
|
||||||
|
}
|
||||||
this._dragPlaceholderPos = -1;
|
this._dragPlaceholderPos = -1;
|
||||||
|
},
|
||||||
|
|
||||||
|
_clearEmptyDropTarget: function() {
|
||||||
|
if (this._emptyDropTarget) {
|
||||||
|
this._emptyDropTarget.animateOutAndDestroy();
|
||||||
|
this._emptyDropTarget = null;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -827,23 +856,18 @@ const Dash = new Lang.Class({
|
|||||||
numChildren--;
|
numChildren--;
|
||||||
}
|
}
|
||||||
|
|
||||||
let pos = Math.floor(y * numChildren / boxHeight);
|
let pos;
|
||||||
|
if (!this._emptyDropTarget)
|
||||||
|
pos = Math.floor(y * numChildren / boxHeight);
|
||||||
|
else
|
||||||
|
pos = 0; // always insert at the top when dash is empty
|
||||||
|
|
||||||
if (pos != this._dragPlaceholderPos && pos <= numFavorites && this._animatingPlaceholdersCount == 0) {
|
if (pos != this._dragPlaceholderPos && pos <= numFavorites && this._animatingPlaceholdersCount == 0) {
|
||||||
this._dragPlaceholderPos = pos;
|
this._dragPlaceholderPos = pos;
|
||||||
|
|
||||||
// Don't allow positioning before or after self
|
// Don't allow positioning before or after self
|
||||||
if (favPos != -1 && (pos == favPos || pos == favPos + 1)) {
|
if (favPos != -1 && (pos == favPos || pos == favPos + 1)) {
|
||||||
if (this._dragPlaceholder) {
|
this._clearDragPlaceholder();
|
||||||
this._dragPlaceholder.animateOutAndDestroy();
|
|
||||||
this._animatingPlaceholdersCount++;
|
|
||||||
this._dragPlaceholder.connect('destroy',
|
|
||||||
Lang.bind(this, function() {
|
|
||||||
this._animatingPlaceholdersCount--;
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
this._dragPlaceholder = null;
|
|
||||||
|
|
||||||
return DND.DragMotionResult.CONTINUE;
|
return DND.DragMotionResult.CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -868,9 +892,9 @@ const Dash = new Lang.Class({
|
|||||||
|
|
||||||
// Remove the drag placeholder if we are not in the
|
// Remove the drag placeholder if we are not in the
|
||||||
// "favorites zone"
|
// "favorites zone"
|
||||||
if (pos > numFavorites && this._dragPlaceholder) {
|
if (pos > numFavorites)
|
||||||
this._clearDragPlaceholder();
|
this._clearDragPlaceholder();
|
||||||
}
|
|
||||||
if (!this._dragPlaceholder)
|
if (!this._dragPlaceholder)
|
||||||
return DND.DragMotionResult.NO_DROP;
|
return DND.DragMotionResult.NO_DROP;
|
||||||
|
|
||||||
|
@ -100,7 +100,6 @@ const DateMenuButton = new Lang.Class({
|
|||||||
|
|
||||||
Shell.AppSystem.get_default().connect('installed-changed',
|
Shell.AppSystem.get_default().connect('installed-changed',
|
||||||
Lang.bind(this, this._appInstalledChanged));
|
Lang.bind(this, this._appInstalledChanged));
|
||||||
this._appInstalledChanged();
|
|
||||||
|
|
||||||
item = this.menu.addSettingsAction(_("Date & Time Settings"), 'gnome-datetime-panel.desktop');
|
item = this.menu.addSettingsAction(_("Date & Time Settings"), 'gnome-datetime-panel.desktop');
|
||||||
if (item) {
|
if (item) {
|
||||||
@ -157,12 +156,16 @@ const DateMenuButton = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_appInstalledChanged: function() {
|
_appInstalledChanged: function() {
|
||||||
let app = Shell.AppSystem.get_default().lookup_app('gnome-clocks.desktop');
|
this._calendarApp = undefined;
|
||||||
this._openClocksItem.actor.visible = app !== null;
|
this._updateEventsVisibility();
|
||||||
},
|
},
|
||||||
|
|
||||||
_setEventsVisibility: function(visible) {
|
_updateEventsVisibility: function() {
|
||||||
this._openCalendarItem.actor.visible = visible;
|
let visible = this._eventSource.hasCalendars;
|
||||||
|
this._openCalendarItem.actor.visible = visible &&
|
||||||
|
(this._getCalendarApp() != null);
|
||||||
|
this._openClocksItem.actor.visible = visible &&
|
||||||
|
(this._getClockApp() != null);
|
||||||
this._separator.visible = visible;
|
this._separator.visible = visible;
|
||||||
if (visible) {
|
if (visible) {
|
||||||
let alignment = 0.25;
|
let alignment = 0.25;
|
||||||
@ -177,8 +180,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 +198,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
|
||||||
@ -207,16 +218,34 @@ const DateMenuButton = new Lang.Class({
|
|||||||
this._date.set_text(displayDate.toLocaleFormat(dateFormat));
|
this._date.set_text(displayDate.toLocaleFormat(dateFormat));
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_getCalendarApp: function() {
|
||||||
|
if (this._calendarApp !== undefined)
|
||||||
|
return this._calendarApp;
|
||||||
|
|
||||||
|
let apps = Gio.AppInfo.get_recommended_for_type('text/calendar');
|
||||||
|
if (apps && (apps.length > 0))
|
||||||
|
this._calendarApp = apps[0];
|
||||||
|
else
|
||||||
|
this._calendarApp = null;
|
||||||
|
return this._calendarApp;
|
||||||
|
},
|
||||||
|
|
||||||
|
_getClockApp: function() {
|
||||||
|
return Shell.AppSystem.get_default().lookup_app('gnome-clocks.desktop');
|
||||||
|
},
|
||||||
|
|
||||||
_onOpenCalendarActivate: function() {
|
_onOpenCalendarActivate: function() {
|
||||||
this.menu.close();
|
this.menu.close();
|
||||||
|
|
||||||
let app = Gio.AppInfo.get_default_for_type('text/calendar', false);
|
let app = this._getCalendarApp();
|
||||||
|
if (app.get_id() == 'evolution.desktop')
|
||||||
|
app = Gio.DesktopAppInfo.new('evolution-calendar.desktop');
|
||||||
app.launch([], global.create_app_launch_context());
|
app.launch([], global.create_app_launch_context());
|
||||||
},
|
},
|
||||||
|
|
||||||
_onOpenClocksActivate: function() {
|
_onOpenClocksActivate: function() {
|
||||||
this.menu.close();
|
this.menu.close();
|
||||||
let app = Shell.AppSystem.get_default().lookup_app('gnome-clocks.desktop');
|
let app = this._getClockApp();
|
||||||
app.activate();
|
app.activate();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
34
js/ui/dnd.js
34
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
|
||||||
@ -146,16 +149,16 @@ const _Draggable = new Lang.Class({
|
|||||||
|
|
||||||
_grabEvents: function() {
|
_grabEvents: function() {
|
||||||
if (!this._eventsGrabbed) {
|
if (!this._eventsGrabbed) {
|
||||||
|
this._eventsGrabbed = Main.pushModal(_getEventHandlerActor());
|
||||||
|
if (this._eventsGrabbed)
|
||||||
Clutter.grab_pointer(_getEventHandlerActor());
|
Clutter.grab_pointer(_getEventHandlerActor());
|
||||||
Clutter.grab_keyboard(_getEventHandlerActor());
|
|
||||||
this._eventsGrabbed = true;
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_ungrabEvents: function() {
|
_ungrabEvents: function() {
|
||||||
if (this._eventsGrabbed) {
|
if (this._eventsGrabbed) {
|
||||||
Clutter.ungrab_pointer();
|
Clutter.ungrab_pointer();
|
||||||
Clutter.ungrab_keyboard();
|
Main.popModal(_getEventHandlerActor());
|
||||||
this._eventsGrabbed = false;
|
this._eventsGrabbed = false;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -288,19 +291,19 @@ const _Draggable = new Lang.Class({
|
|||||||
this._dragOrigY = this._dragActor.y;
|
this._dragOrigY = this._dragActor.y;
|
||||||
this._dragOrigScale = this._dragActor.scale_x;
|
this._dragOrigScale = this._dragActor.scale_x;
|
||||||
|
|
||||||
this._dragActor.reparent(Main.uiGroup);
|
// Set the actor's scale such that it will keep the same
|
||||||
this._dragActor.raise_top();
|
// transformed size when it's reparented to the uiGroup
|
||||||
Shell.util_set_hidden_from_pick(this._dragActor, true);
|
let [scaledWidth, scaledHeight] = this.actor.get_transformed_size();
|
||||||
|
this._dragActor.set_scale(scaledWidth / this.actor.width,
|
||||||
|
scaledHeight / this.actor.height);
|
||||||
|
|
||||||
let [actorStageX, actorStageY] = this.actor.get_transformed_position();
|
let [actorStageX, actorStageY] = this.actor.get_transformed_position();
|
||||||
this._dragOffsetX = actorStageX - this._dragStartX;
|
this._dragOffsetX = actorStageX - this._dragStartX;
|
||||||
this._dragOffsetY = actorStageY - this._dragStartY;
|
this._dragOffsetY = actorStageY - this._dragStartY;
|
||||||
|
|
||||||
// Set the actor's scale such that it will keep the same
|
this._dragActor.reparent(Main.uiGroup);
|
||||||
// transformed size when it's reparented to the uiGroup
|
this._dragActor.raise_top();
|
||||||
let [scaledWidth, scaledHeight] = this.actor.get_transformed_size();
|
Shell.util_set_hidden_from_pick(this._dragActor, true);
|
||||||
this.actor.set_scale(scaledWidth / this.actor.width,
|
|
||||||
scaledHeight / this.actor.height);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this._dragOrigOpacity = this._dragActor.opacity;
|
this._dragOrigOpacity = this._dragActor.opacity;
|
||||||
@ -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;
|
||||||
|
438
js/ui/layout.js
438
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,19 +283,19 @@ 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;
|
||||||
|
|
||||||
|
if (i != this.primaryIndex) {
|
||||||
let haveTopLeftCorner = true;
|
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.
|
||||||
@ -319,12 +327,14 @@ const LayoutManager = new Lang.Class({
|
|||||||
|
|
||||||
if (!haveTopLeftCorner)
|
if (!haveTopLeftCorner)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
let corner = new HotCorner(this);
|
|
||||||
this._hotCorners.push(corner);
|
|
||||||
corner.actor.set_position(cornerX, cornerY);
|
|
||||||
this.addChrome(corner.actor);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let corner = new HotCorner(this, monitor, cornerX, cornerY);
|
||||||
|
corner.setBarrierSize(size);
|
||||||
|
this.hotCorners.push(corner);
|
||||||
|
}
|
||||||
|
|
||||||
|
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,14 +1048,75 @@ 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._monitor = monitor;
|
||||||
|
|
||||||
|
this._x = x;
|
||||||
|
this._y = y;
|
||||||
|
|
||||||
|
this._setupFallbackCornerIfNeeded(layoutManager);
|
||||||
|
|
||||||
|
this._pressureBarrier = new PressureBarrier(HOT_CORNER_PRESSURE_THRESHOLD,
|
||||||
|
HOT_CORNER_PRESSURE_TIMEOUT,
|
||||||
|
Shell.KeyBindingMode.NORMAL |
|
||||||
|
Shell.KeyBindingMode.OVERVIEW);
|
||||||
|
this._pressureBarrier.connect('trigger', Lang.bind(this, this._toggleOverview));
|
||||||
|
|
||||||
|
// 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._ripple2 = new St.BoxLayout({ style_class: 'ripple-box', opacity: 0, visible: false });
|
||||||
|
this._ripple3 = new St.BoxLayout({ style_class: 'ripple-box', opacity: 0, visible: false });
|
||||||
|
|
||||||
|
layoutManager.uiGroup.add_actor(this._ripple1);
|
||||||
|
layoutManager.uiGroup.add_actor(this._ripple2);
|
||||||
|
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) {
|
||||||
|
if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) {
|
||||||
|
this._verticalBarrier = new Meta.Barrier({ display: global.display,
|
||||||
|
x1: this._x, x2: this._x, y1: this._y, y2: this._y + size,
|
||||||
|
directions: Meta.BarrierDirection.NEGATIVE_X });
|
||||||
|
this._horizontalBarrier = new Meta.Barrier({ display: global.display,
|
||||||
|
x1: this._x - size, x2: this._x, y1: this._y, y2: this._y,
|
||||||
|
directions: Meta.BarrierDirection.POSITIVE_Y });
|
||||||
|
} else {
|
||||||
|
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',
|
this.actor = new Clutter.Actor({ name: 'hot-corner-environs',
|
||||||
|
x: this._x, y: this._y,
|
||||||
width: 3,
|
width: 3,
|
||||||
height: 3,
|
height: 3,
|
||||||
reactive: true });
|
reactive: true });
|
||||||
@ -1109,6 +1129,7 @@ const HotCorner = new Lang.Class({
|
|||||||
this._corner._delegate = this;
|
this._corner._delegate = this;
|
||||||
|
|
||||||
this.actor.add_child(this._corner);
|
this.actor.add_child(this._corner);
|
||||||
|
layoutManager.addChrome(this.actor);
|
||||||
|
|
||||||
if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) {
|
if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) {
|
||||||
this._corner.set_position(this.actor.width - this._corner.width, 0);
|
this._corner.set_position(this.actor.width - this._corner.width, 0);
|
||||||
@ -1117,38 +1138,22 @@ const HotCorner = new Lang.Class({
|
|||||||
this._corner.set_position(0, 0);
|
this._corner.set_position(0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
this._activationTime = 0;
|
|
||||||
|
|
||||||
this.actor.connect('leave-event',
|
this.actor.connect('leave-event',
|
||||||
Lang.bind(this, this._onEnvironsLeft));
|
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',
|
this._corner.connect('enter-event',
|
||||||
Lang.bind(this, this._onCornerEntered));
|
Lang.bind(this, this._onCornerEntered));
|
||||||
this._corner.connect('button-release-event',
|
|
||||||
Lang.bind(this, this._onCornerClicked));
|
|
||||||
this._corner.connect('leave-event',
|
this._corner.connect('leave-event',
|
||||||
Lang.bind(this, this._onCornerLeft));
|
Lang.bind(this, this._onCornerLeft));
|
||||||
|
}
|
||||||
// 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._ripple2 = new St.BoxLayout({ style_class: 'ripple-box', opacity: 0, visible: false });
|
|
||||||
this._ripple3 = new St.BoxLayout({ style_class: 'ripple-box', opacity: 0, visible: false });
|
|
||||||
|
|
||||||
layoutManager.uiGroup.add_actor(this._ripple1);
|
|
||||||
layoutManager.uiGroup.add_actor(this._ripple2);
|
|
||||||
layoutManager.uiGroup.add_actor(this._ripple3);
|
|
||||||
},
|
},
|
||||||
|
|
||||||
destroy: function() {
|
destroy: function() {
|
||||||
|
this.setBarrierSize(0);
|
||||||
|
this._pressureBarrier.destroy();
|
||||||
|
this._pressureBarrier = null;
|
||||||
|
|
||||||
|
if (this.actor)
|
||||||
this.actor.destroy();
|
this.actor.destroy();
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -1169,9 +1174,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 +1187,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 +1198,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 +1220,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 +1236,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 +1285,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 +1320,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 +1329,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 +1368,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,13 +33,11 @@ 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;
|
||||||
const Util = imports.misc.util;
|
const Util = imports.misc.util;
|
||||||
|
|
||||||
const OVERRIDES_SCHEMA = 'org.gnome.shell.overrides';
|
|
||||||
const DEFAULT_BACKGROUND_COLOR = Clutter.Color.from_pixel(0x2e3436ff);
|
const DEFAULT_BACKGROUND_COLOR = Clutter.Color.from_pixel(0x2e3436ff);
|
||||||
|
|
||||||
let componentManager = null;
|
let componentManager = null;
|
||||||
@ -58,7 +57,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;
|
||||||
@ -68,9 +67,11 @@ let layoutManager = null;
|
|||||||
let _startDate;
|
let _startDate;
|
||||||
let _defaultCssStylesheet = null;
|
let _defaultCssStylesheet = null;
|
||||||
let _cssStylesheet = null;
|
let _cssStylesheet = null;
|
||||||
let _overridesSettings = null;
|
let _workspacesSettings = 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 +83,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 +93,43 @@ 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);
|
||||||
|
_initializePrefs();
|
||||||
|
_initializeUI();
|
||||||
|
|
||||||
shellDBusService = new ShellDBus.GnomeShell();
|
shellDBusService = new ShellDBus.GnomeShell();
|
||||||
shellMountOpDBusService = new ShellMountOperation.GnomeShellMountOpHandler();
|
shellMountOpDBusService = new ShellMountOperation.GnomeShellMountOpHandler();
|
||||||
|
|
||||||
|
_sessionUpdated();
|
||||||
|
}
|
||||||
|
|
||||||
|
function _initializePrefs() {
|
||||||
|
let keys = new Gio.Settings({ schema: sessionMode.overridesSchema }).list_keys();
|
||||||
|
for (let i = 0; i < keys.length; i++)
|
||||||
|
Meta.prefs_override_preference_schema (keys[i], sessionMode.overridesSchema);
|
||||||
|
|
||||||
|
let workspacesSchema;
|
||||||
|
if (keys.indexOf('dynamic-workspaces') > -1)
|
||||||
|
workspacesSchema = sessionMode.overridesSchema;
|
||||||
|
else
|
||||||
|
workspacesSchema = 'org.gnome.mutter';
|
||||||
|
|
||||||
|
_workspacesSettings = new Gio.Settings({ schema: workspacesSchema });
|
||||||
|
_workspacesSettings.connect('changed::dynamic-workspaces', _queueCheckWorkspaces);
|
||||||
|
}
|
||||||
|
|
||||||
|
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 +159,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 +170,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.
|
||||||
@ -185,9 +194,6 @@ function startSession() {
|
|||||||
Scripting.runPerfScript(module, perfOutput);
|
Scripting.runPerfScript(module, perfOutput);
|
||||||
}
|
}
|
||||||
|
|
||||||
_overridesSettings = new Gio.Settings({ schema: OVERRIDES_SCHEMA });
|
|
||||||
_overridesSettings.connect('changed::dynamic-workspaces', _queueCheckWorkspaces);
|
|
||||||
|
|
||||||
global.screen.connect('notify::n-workspaces', _nWorkspacesChanged);
|
global.screen.connect('notify::n-workspaces', _nWorkspacesChanged);
|
||||||
|
|
||||||
global.screen.connect('window-entered-monitor', _windowEnteredMonitor);
|
global.screen.connect('window-entered-monitor', _windowEnteredMonitor);
|
||||||
@ -199,8 +205,16 @@ function startSession() {
|
|||||||
ExtensionDownloader.init();
|
ExtensionDownloader.init();
|
||||||
ExtensionSystem.init();
|
ExtensionSystem.init();
|
||||||
|
|
||||||
|
if (sessionMode.isGreeter && screenShield) {
|
||||||
layoutManager.connect('startup-prepared', function() {
|
layoutManager.connect('startup-prepared', function() {
|
||||||
layoutManager.startupAnimation();
|
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',
|
||||||
@ -1719,6 +1721,9 @@ const MessageTray = new Lang.Class({
|
|||||||
this.actor.add_action(clickAction);
|
this.actor.add_action(clickAction);
|
||||||
|
|
||||||
clickAction.connect('clicked', Lang.bind(this, function(action) {
|
clickAction.connect('clicked', Lang.bind(this, function(action) {
|
||||||
|
if (this._trayState != State.SHOWN)
|
||||||
|
return;
|
||||||
|
|
||||||
let button = action.get_button();
|
let button = action.get_button();
|
||||||
if (button == 3)
|
if (button == 3)
|
||||||
this._openContextMenu();
|
this._openContextMenu();
|
||||||
@ -1729,7 +1734,7 @@ const MessageTray = new Lang.Class({
|
|||||||
clickAction.connect('long-press', Lang.bind(this, function(action, actor, state) {
|
clickAction.connect('long-press', Lang.bind(this, function(action, actor, state) {
|
||||||
switch (state) {
|
switch (state) {
|
||||||
case Clutter.LongPressState.QUERY:
|
case Clutter.LongPressState.QUERY:
|
||||||
return true;
|
return this._trayState == State.SHOWN;
|
||||||
case Clutter.LongPressState.ACTIVATE:
|
case Clutter.LongPressState.ACTIVATE:
|
||||||
this._openContextMenu();
|
this._openContextMenu();
|
||||||
}
|
}
|
||||||
@ -1743,13 +1748,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 +1778,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 +1826,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 +2000,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 +2025,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 +2084,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 +2104,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 +2152,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 +2183,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 +2190,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 +2199,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 +2207,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,33 +2232,28 @@ 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 = (haveClickedSummaryItem &&
|
||||||
let wrongSummaryNotificationStack = (this._clickedSummaryItemMouseButton == 1 &&
|
this._clickedSummaryItemMouseButton == 1 &&
|
||||||
|
this._clickedSummaryItem.source.notifications.length == 0);
|
||||||
|
let wrongSummaryNotificationStack = (haveClickedSummaryItem &&
|
||||||
|
this._clickedSummaryItemMouseButton == 1 &&
|
||||||
this._summaryBoxPointer.bin.child != this._clickedSummaryItem.notificationStackWidget);
|
this._summaryBoxPointer.bin.child != this._clickedSummaryItem.notificationStackWidget);
|
||||||
let wrongSummaryRightClickMenu = (this._clickedSummaryItemMouseButton == 3 &&
|
let wrongSummaryRightClickMenu = (haveClickedSummaryItem &&
|
||||||
|
this._clickedSummaryItemMouseButton == 3 &&
|
||||||
|
this._clickedSummaryItem.rightClickMenu != null &&
|
||||||
this._summaryBoxPointer.bin.child != this._clickedSummaryItem.rightClickMenu);
|
this._summaryBoxPointer.bin.child != this._clickedSummaryItem.rightClickMenu);
|
||||||
let wrongSummaryBoxPointer = (haveClickedSummaryItem &&
|
let wrongSummaryBoxPointer = (haveClickedSummaryItem &&
|
||||||
(wrongSummaryNotificationStack || wrongSummaryRightClickMenu));
|
(wrongSummaryNotificationStack || wrongSummaryRightClickMenu));
|
||||||
@ -2291,7 +2262,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 +2272,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 +2410,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 +2545,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 +2583,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 +2600,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 +2632,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 +2680,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 +2714,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 +2730,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 +2766,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();
|
||||||
|
@ -22,6 +22,10 @@ const Tweener = imports.ui.tweener;
|
|||||||
const OPEN_AND_CLOSE_TIME = 0.1;
|
const OPEN_AND_CLOSE_TIME = 0.1;
|
||||||
const FADE_OUT_DIALOG_TIME = 1.0;
|
const FADE_OUT_DIALOG_TIME = 1.0;
|
||||||
|
|
||||||
|
const WORK_SPINNER_ICON_SIZE = 24;
|
||||||
|
const WORK_SPINNER_ANIMATION_DELAY = 1.0;
|
||||||
|
const WORK_SPINNER_ANIMATION_TIME = 0.3;
|
||||||
|
|
||||||
const State = {
|
const State = {
|
||||||
OPENED: 0,
|
OPENED: 0,
|
||||||
CLOSED: 1,
|
CLOSED: 1,
|
||||||
@ -38,13 +42,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,
|
||||||
@ -63,7 +69,9 @@ const ModalDialog = new Lang.Class({
|
|||||||
this._group.connect('key-press-event', Lang.bind(this, this._onKeyPressEvent));
|
this._group.connect('key-press-event', Lang.bind(this, this._onKeyPressEvent));
|
||||||
this._group.connect('key-release-event', Lang.bind(this, this._onKeyReleaseEvent));
|
this._group.connect('key-release-event', Lang.bind(this, this._onKeyReleaseEvent));
|
||||||
|
|
||||||
this._backgroundBin = new St.Bin();
|
this.backgroundStack = new St.Widget({ layout_manager: new Clutter.BinLayout() });
|
||||||
|
this._backgroundBin = new St.Bin({ child: this.backgroundStack,
|
||||||
|
x_fill: true, y_fill: true });
|
||||||
this._monitorConstraint = new Layout.MonitorConstraint();
|
this._monitorConstraint = new Layout.MonitorConstraint();
|
||||||
this._backgroundBin.add_constraint(this._monitorConstraint);
|
this._backgroundBin.add_constraint(this._monitorConstraint);
|
||||||
this._group.add_actor(this._backgroundBin);
|
this._group.add_actor(this._backgroundBin);
|
||||||
@ -79,15 +87,10 @@ const ModalDialog = new Lang.Class({
|
|||||||
{ inhibitEvents: true });
|
{ inhibitEvents: true });
|
||||||
this._lightbox.highlight(this._backgroundBin);
|
this._lightbox.highlight(this._backgroundBin);
|
||||||
|
|
||||||
let stack = new Shell.Stack();
|
|
||||||
this._backgroundBin.child = stack;
|
|
||||||
|
|
||||||
this._eventBlocker = new Clutter.Actor({ reactive: true });
|
this._eventBlocker = new Clutter.Actor({ reactive: true });
|
||||||
stack.add_actor(this._eventBlocker);
|
this.backgroundStack.add_actor(this._eventBlocker);
|
||||||
stack.add_actor(this.dialogLayout);
|
|
||||||
} else {
|
|
||||||
this._backgroundBin.child = this.dialogLayout;
|
|
||||||
}
|
}
|
||||||
|
this.backgroundStack.add_actor(this.dialogLayout);
|
||||||
|
|
||||||
|
|
||||||
this.contentLayout = new St.BoxLayout({ vertical: true });
|
this.contentLayout = new St.BoxLayout({ vertical: true });
|
||||||
@ -108,6 +111,8 @@ const ModalDialog = new Lang.Class({
|
|||||||
this._initialKeyFocus = this.dialogLayout;
|
this._initialKeyFocus = this.dialogLayout;
|
||||||
this._initialKeyFocusDestroyId = 0;
|
this._initialKeyFocusDestroyId = 0;
|
||||||
this._savedKeyFocus = null;
|
this._savedKeyFocus = null;
|
||||||
|
|
||||||
|
this._workSpinner = null;
|
||||||
},
|
},
|
||||||
|
|
||||||
destroy: function() {
|
destroy: function() {
|
||||||
@ -181,6 +186,44 @@ const ModalDialog = new Lang.Class({
|
|||||||
return button;
|
return button;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
placeSpinner: function(layoutInfo) {
|
||||||
|
/* This is here because of recursive imports */
|
||||||
|
const Panel = imports.ui.panel;
|
||||||
|
let spinnerIcon = global.datadir + '/theme/process-working.svg';
|
||||||
|
this._workSpinner = new Panel.AnimatedIcon(spinnerIcon, WORK_SPINNER_ICON_SIZE);
|
||||||
|
this._workSpinner.actor.opacity = 0;
|
||||||
|
this._workSpinner.actor.show();
|
||||||
|
|
||||||
|
this.buttonLayout.add(this._workSpinner.actor, layoutInfo);
|
||||||
|
},
|
||||||
|
|
||||||
|
setWorking: function(working) {
|
||||||
|
if (!this._workSpinner)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Tweener.removeTweens(this._workSpinner.actor);
|
||||||
|
if (working) {
|
||||||
|
this._workSpinner.play();
|
||||||
|
Tweener.addTween(this._workSpinner.actor,
|
||||||
|
{ opacity: 255,
|
||||||
|
delay: WORK_SPINNER_ANIMATION_DELAY,
|
||||||
|
time: WORK_SPINNER_ANIMATION_TIME,
|
||||||
|
transition: 'linear'
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
Tweener.addTween(this._workSpinner.actor,
|
||||||
|
{ opacity: 0,
|
||||||
|
time: WORK_SPINNER_ANIMATION_TIME,
|
||||||
|
transition: 'linear',
|
||||||
|
onCompleteScope: this,
|
||||||
|
onComplete: function() {
|
||||||
|
if (this._workSpinner)
|
||||||
|
this._workSpinner.stop();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
_onKeyPressEvent: function(object, event) {
|
_onKeyPressEvent: function(object, event) {
|
||||||
this._pressedKey = event.get_key_symbol();
|
this._pressedKey = event.get_key_symbol();
|
||||||
},
|
},
|
||||||
@ -277,6 +320,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) {
|
||||||
|
@ -8,6 +8,7 @@ const Layout = imports.ui.layout;
|
|||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const Mainloop = imports.mainloop;
|
const Mainloop = imports.mainloop;
|
||||||
const Tweener = imports.ui.tweener;
|
const Tweener = imports.ui.tweener;
|
||||||
|
const Meta = imports.gi.Meta;
|
||||||
|
|
||||||
const HIDE_TIMEOUT = 1500;
|
const HIDE_TIMEOUT = 1500;
|
||||||
const FADE_TIME = 0.1;
|
const FADE_TIME = 0.1;
|
||||||
@ -71,6 +72,7 @@ const OsdWindow = new Lang.Class({
|
|||||||
Name: 'OsdWindow',
|
Name: 'OsdWindow',
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
|
this._popupSize = 0;
|
||||||
this.actor = new St.Widget({ x_expand: true,
|
this.actor = new St.Widget({ x_expand: true,
|
||||||
y_expand: true,
|
y_expand: true,
|
||||||
x_align: Clutter.ActorAlign.CENTER,
|
x_align: Clutter.ActorAlign.CENTER,
|
||||||
@ -80,6 +82,15 @@ const OsdWindow = new Lang.Class({
|
|||||||
vertical: true });
|
vertical: true });
|
||||||
this.actor.add_actor(this._box);
|
this.actor.add_actor(this._box);
|
||||||
|
|
||||||
|
this._box.connect('style-changed', Lang.bind(this, this._onStyleChanged));
|
||||||
|
this._box.connect('notify::height', Lang.bind(this,
|
||||||
|
function() {
|
||||||
|
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this,
|
||||||
|
function() {
|
||||||
|
this._box.width = this._box.height;
|
||||||
|
}));
|
||||||
|
}));
|
||||||
|
|
||||||
this._icon = new St.Icon();
|
this._icon = new St.Icon();
|
||||||
this._box.add(this._icon, { expand: true });
|
this._box.add(this._icon, { expand: true });
|
||||||
|
|
||||||
@ -125,8 +136,10 @@ const OsdWindow = new Lang.Class({
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
if (!this.actor.visible) {
|
if (!this.actor.visible) {
|
||||||
|
Meta.disable_unredirect_for_screen(global.screen);
|
||||||
this.actor.show();
|
this.actor.show();
|
||||||
this.actor.opacity = 0;
|
this.actor.opacity = 0;
|
||||||
|
this.actor.get_parent().set_child_above_sibling(this.actor, null);
|
||||||
|
|
||||||
Tweener.addTween(this.actor,
|
Tweener.addTween(this.actor,
|
||||||
{ opacity: 255,
|
{ opacity: 255,
|
||||||
@ -161,19 +174,34 @@ const OsdWindow = new Lang.Class({
|
|||||||
this.actor.hide();
|
this.actor.hide();
|
||||||
this.setLabel(null);
|
this.setLabel(null);
|
||||||
this.setLevel(null);
|
this.setLevel(null);
|
||||||
|
Meta.enable_unredirect_for_screen(global.screen);
|
||||||
},
|
},
|
||||||
|
|
||||||
_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);
|
this._popupSize = 110 * Math.max(1, scale);
|
||||||
|
|
||||||
this._box.set_size(size, size);
|
|
||||||
this._box.translation_y = monitor.height / 4;
|
this._box.translation_y = monitor.height / 4;
|
||||||
|
this._icon.icon_size = this._popupSize / 2;
|
||||||
|
this._box.style_changed();
|
||||||
|
},
|
||||||
|
|
||||||
this._icon.icon_size = size / 2;
|
_onStyleChanged: function() {
|
||||||
|
let themeNode = this._box.get_theme_node();
|
||||||
|
let horizontalPadding = themeNode.get_horizontal_padding();
|
||||||
|
let verticalPadding = themeNode.get_vertical_padding();
|
||||||
|
let topBorder = themeNode.get_border_width(St.Side.TOP);
|
||||||
|
let bottomBorder = themeNode.get_border_width(St.Side.BOTTOM);
|
||||||
|
let leftBorder = themeNode.get_border_width(St.Side.LEFT);
|
||||||
|
let rightBorder = themeNode.get_border_width(St.Side.RIGHT);
|
||||||
|
|
||||||
|
let minWidth = this._popupSize - verticalPadding - leftBorder - rightBorder;
|
||||||
|
let minHeight = this._popupSize - horizontalPadding - topBorder - bottomBorder;
|
||||||
|
|
||||||
|
this._box.style = 'min-height: %dpx;'.format(Math.max(minWidth, minHeight));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -31,7 +31,9 @@ const ANIMATION_TIME = 0.25;
|
|||||||
// and don't want the shading animation to get cut off
|
// and don't want the shading animation to get cut off
|
||||||
const SHADE_ANIMATION_TIME = .20;
|
const SHADE_ANIMATION_TIME = .20;
|
||||||
|
|
||||||
const DND_WINDOW_SWITCH_TIMEOUT = 1250;
|
const DND_WINDOW_SWITCH_TIMEOUT = 750;
|
||||||
|
|
||||||
|
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,12 +492,18 @@ 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();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
focusSearch: function() {
|
||||||
|
this.show();
|
||||||
|
this._searchEntry.grab_key_focus();
|
||||||
|
},
|
||||||
|
|
||||||
fadeInDesktop: function() {
|
fadeInDesktop: function() {
|
||||||
this._desktopFade.opacity = 0;
|
this._desktopFade.opacity = 0;
|
||||||
this._desktopFade.show();
|
this._desktopFade.show();
|
||||||
@ -536,6 +533,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 +545,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 +564,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 +574,22 @@ const Overview = new Lang.Class({
|
|||||||
if (!this._shown)
|
if (!this._shown)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (this._controlPressed)
|
let event = Clutter.get_current_event();
|
||||||
|
if (event) {
|
||||||
|
let type = event.type();
|
||||||
|
let button = (type == Clutter.EventType.BUTTON_PRESS ||
|
||||||
|
type == Clutter.EventType.BUTTON_RELEASE);
|
||||||
|
let ctrl = (event.get_state() & Clutter.ModifierType.CONTROL_MASK) != 0;
|
||||||
|
if (button && ctrl)
|
||||||
return;
|
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 +600,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 +621,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) {
|
||||||
|
let shouldBeModal = !this._inXdndDrag;
|
||||||
|
if (shouldBeModal) {
|
||||||
if (!this._modal) {
|
if (!this._modal) {
|
||||||
if (Main.pushModal(this._overview,
|
if (Main.pushModal(this._overview,
|
||||||
{ keybindingMode: Shell.KeyBindingMode.OVERVIEW }))
|
{ keybindingMode: Shell.KeyBindingMode.OVERVIEW })) {
|
||||||
this._modal = true;
|
this._modal = true;
|
||||||
else
|
} else {
|
||||||
this.hide();
|
this.hide();
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
} else if (this._shownTemporarily) {
|
|
||||||
if (this._modal) {
|
|
||||||
Main.popModal(this._overview);
|
|
||||||
this._modal = false;
|
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
global.stage_input_mode = Shell.StageInputMode.FULLSCREEN;
|
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 +646,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 +680,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 +691,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 +703,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();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
142
js/ui/panel.js
142
js/ui/panel.js
@ -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;
|
||||||
@ -145,8 +144,8 @@ const AnimatedIcon = new Lang.Class({
|
|||||||
Name: 'AnimatedIcon',
|
Name: 'AnimatedIcon',
|
||||||
Extends: Animation,
|
Extends: Animation,
|
||||||
|
|
||||||
_init: function(name, size) {
|
_init: function(filename, size) {
|
||||||
this.parent(global.datadir + '/theme/' + name, size, size, ANIMATED_ICON_UPDATE_TIMEOUT);
|
this.parent(filename, size, size, ANIMATED_ICON_UPDATE_TIMEOUT);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -259,6 +258,7 @@ const AppMenuButton = new Lang.Class({
|
|||||||
this._actionGroupNotifyId = 0;
|
this._actionGroupNotifyId = 0;
|
||||||
|
|
||||||
let bin = new St.Bin({ name: 'appMenu' });
|
let bin = new St.Bin({ name: 'appMenu' });
|
||||||
|
bin.connect('style-changed', Lang.bind(this, this._onStyleChanged));
|
||||||
this.actor.add_actor(bin);
|
this.actor.add_actor(bin);
|
||||||
|
|
||||||
this.actor.bind_property("reactive", this.actor, "can-focus", 0);
|
this.actor.bind_property("reactive", this.actor, "can-focus", 0);
|
||||||
@ -289,26 +289,24 @@ const AppMenuButton = new Lang.Class({
|
|||||||
this._visible = !Main.overview.visible;
|
this._visible = !Main.overview.visible;
|
||||||
if (!this._visible)
|
if (!this._visible)
|
||||||
this.actor.hide();
|
this.actor.hide();
|
||||||
Main.overview.connect('hiding', Lang.bind(this, function () {
|
this._overviewHidingId = Main.overview.connect('hiding', Lang.bind(this, function () {
|
||||||
this.show();
|
this.show();
|
||||||
}));
|
}));
|
||||||
Main.overview.connect('showing', Lang.bind(this, function () {
|
this._overviewShowingId = Main.overview.connect('showing', Lang.bind(this, function () {
|
||||||
this.hide();
|
this.hide();
|
||||||
}));
|
}));
|
||||||
|
|
||||||
this._stop = true;
|
this._stop = true;
|
||||||
|
|
||||||
this._spinner = new AnimatedIcon('process-working.svg',
|
this._spinner = null;
|
||||||
PANEL_ICON_SIZE);
|
|
||||||
this._container.add_actor(this._spinner.actor);
|
|
||||||
this._spinner.actor.hide();
|
|
||||||
this._spinner.actor.lower_bottom();
|
|
||||||
|
|
||||||
let tracker = Shell.WindowTracker.get_default();
|
let tracker = Shell.WindowTracker.get_default();
|
||||||
let appSys = Shell.AppSystem.get_default();
|
let appSys = Shell.AppSystem.get_default();
|
||||||
|
this._focusAppNotifyId =
|
||||||
tracker.connect('notify::focus-app', Lang.bind(this, this._focusAppChanged));
|
tracker.connect('notify::focus-app', Lang.bind(this, this._focusAppChanged));
|
||||||
|
this._appStateChangedSignalId =
|
||||||
appSys.connect('app-state-changed', Lang.bind(this, this._onAppStateChanged));
|
appSys.connect('app-state-changed', Lang.bind(this, this._onAppStateChanged));
|
||||||
|
this._switchWorkspaceNotifyId =
|
||||||
global.window_manager.connect('switch-workspace', Lang.bind(this, this._sync));
|
global.window_manager.connect('switch-workspace', Lang.bind(this, this._sync));
|
||||||
|
|
||||||
this._sync();
|
this._sync();
|
||||||
@ -355,6 +353,18 @@ const AppMenuButton = new Lang.Class({
|
|||||||
onCompleteScope: this });
|
onCompleteScope: this });
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_onStyleChanged: function(actor) {
|
||||||
|
let node = actor.get_theme_node();
|
||||||
|
let [success, icon] = node.lookup_url('spinner-image', false);
|
||||||
|
if (!success || this._spinnerIcon == icon)
|
||||||
|
return;
|
||||||
|
this._spinnerIcon = icon;
|
||||||
|
this._spinner = new AnimatedIcon(this._spinnerIcon, PANEL_ICON_SIZE);
|
||||||
|
this._container.add_actor(this._spinner.actor);
|
||||||
|
this._spinner.actor.hide();
|
||||||
|
this._spinner.actor.lower_bottom();
|
||||||
|
},
|
||||||
|
|
||||||
_onIconBoxStyleChanged: function() {
|
_onIconBoxStyleChanged: function() {
|
||||||
let node = this._iconBox.get_theme_node();
|
let node = this._iconBox.get_theme_node();
|
||||||
this._iconBottomClip = node.get_length('app-icon-bottom-clip');
|
this._iconBottomClip = node.get_length('app-icon-bottom-clip');
|
||||||
@ -386,6 +396,10 @@ const AppMenuButton = new Lang.Class({
|
|||||||
|
|
||||||
this._stop = true;
|
this._stop = true;
|
||||||
this.actor.reactive = true;
|
this.actor.reactive = true;
|
||||||
|
|
||||||
|
if (this._spinner == null)
|
||||||
|
return;
|
||||||
|
|
||||||
Tweener.addTween(this._spinner.actor,
|
Tweener.addTween(this._spinner.actor,
|
||||||
{ opacity: 0,
|
{ opacity: 0,
|
||||||
time: SPINNER_ANIMATION_TIME,
|
time: SPINNER_ANIMATION_TIME,
|
||||||
@ -402,6 +416,10 @@ const AppMenuButton = new Lang.Class({
|
|||||||
startAnimation: function() {
|
startAnimation: function() {
|
||||||
this._stop = false;
|
this._stop = false;
|
||||||
this.actor.reactive = false;
|
this.actor.reactive = false;
|
||||||
|
|
||||||
|
if (this._spinner == null)
|
||||||
|
return;
|
||||||
|
|
||||||
this._spinner.play();
|
this._spinner.play();
|
||||||
this._spinner.actor.show();
|
this._spinner.actor.show();
|
||||||
},
|
},
|
||||||
@ -464,6 +482,9 @@ const AppMenuButton = new Lang.Class({
|
|||||||
}
|
}
|
||||||
this._label.actor.allocate(childBox, flags);
|
this._label.actor.allocate(childBox, flags);
|
||||||
|
|
||||||
|
if (this._spinner == null)
|
||||||
|
return;
|
||||||
|
|
||||||
if (direction == Clutter.TextDirection.LTR) {
|
if (direction == Clutter.TextDirection.LTR) {
|
||||||
childBox.x1 = Math.floor(iconWidth / 2) + this._label.actor.width;
|
childBox.x1 = Math.floor(iconWidth / 2) + this._label.actor.width;
|
||||||
childBox.x2 = childBox.x1 + this._spinner.actor.width;
|
childBox.x2 = childBox.x1 + this._spinner.actor.width;
|
||||||
@ -554,6 +575,7 @@ const AppMenuButton = new Lang.Class({
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this._spinner)
|
||||||
this._spinner.actor.hide();
|
this._spinner.actor.hide();
|
||||||
if (this._iconBox.child != null)
|
if (this._iconBox.child != null)
|
||||||
this._iconBox.child.destroy();
|
this._iconBox.child.destroy();
|
||||||
@ -617,6 +639,33 @@ const AppMenuButton = new Lang.Class({
|
|||||||
|
|
||||||
this.setMenu(menu);
|
this.setMenu(menu);
|
||||||
this._menuManager.addMenu(menu);
|
this._menuManager.addMenu(menu);
|
||||||
|
},
|
||||||
|
|
||||||
|
destroy: function() {
|
||||||
|
if (this._appStateChangedSignalId > 0) {
|
||||||
|
let appSys = Shell.AppSystem.get_default();
|
||||||
|
appSys.disconnect(this._appStateChangedSignalId);
|
||||||
|
this._appStateChangedSignalId = 0;
|
||||||
|
}
|
||||||
|
if (this._focusAppNotifyId > 0) {
|
||||||
|
let tracker = Shell.WindowTracker.get_default();
|
||||||
|
tracker.disconnect(this._focusAppNotifyId);
|
||||||
|
this._focusAppNotifyId = 0;
|
||||||
|
}
|
||||||
|
if (this._overviewHidingId > 0) {
|
||||||
|
Main.overview.disconnect(this._overviewHidingId);
|
||||||
|
this._overviewHidingId = 0;
|
||||||
|
}
|
||||||
|
if (this._overviewShowingId > 0) {
|
||||||
|
Main.overview.disconnect(this._overviewShowingId);
|
||||||
|
this._overviewShowingId = 0;
|
||||||
|
}
|
||||||
|
if (this._switchWorkspaceNotifyId > 0) {
|
||||||
|
global.window_manager.disconnect(this._switchWorkspaceNotifyId);
|
||||||
|
this._switchWorkspaceNotifyId = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.parent();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -630,23 +679,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 +702,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 +711,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 +735,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;
|
||||||
@ -923,7 +923,6 @@ const PANEL_ITEM_IMPLEMENTATIONS = {
|
|||||||
'volume': imports.ui.status.volume.Indicator,
|
'volume': imports.ui.status.volume.Indicator,
|
||||||
'battery': imports.ui.status.power.Indicator,
|
'battery': imports.ui.status.power.Indicator,
|
||||||
'lockScreen': imports.ui.status.lockScreenMenu.Indicator,
|
'lockScreen': imports.ui.status.lockScreenMenu.Indicator,
|
||||||
'logo': imports.gdm.loginDialog.LogoMenuButton,
|
|
||||||
'keyboard': imports.ui.status.keyboard.InputSourceIndicator,
|
'keyboard': imports.ui.status.keyboard.InputSourceIndicator,
|
||||||
'powerMenu': imports.gdm.powerMenu.PowerMenuButton,
|
'powerMenu': imports.gdm.powerMenu.PowerMenuButton,
|
||||||
'userMenu': imports.ui.userMenu.UserMenuButton
|
'userMenu': imports.ui.userMenu.UserMenuButton
|
||||||
@ -952,7 +951,7 @@ const Panel = new Lang.Class({
|
|||||||
|
|
||||||
this.statusArea = {};
|
this.statusArea = {};
|
||||||
|
|
||||||
this.menuManager = new PopupMenu.PopupMenuManager(this);
|
this.menuManager = new PopupMenu.PopupMenuManager(this, { keybindingMode: Shell.KeyBindingMode.TOPBAR_POPUP });
|
||||||
|
|
||||||
this._leftBox = new St.BoxLayout({ name: 'panelLeft' });
|
this._leftBox = new St.BoxLayout({ name: 'panelLeft' });
|
||||||
this.actor.add_actor(this._leftBox);
|
this.actor.add_actor(this._leftBox);
|
||||||
@ -1106,16 +1105,17 @@ const Panel = new Lang.Class({
|
|||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
|
|
||||||
openAppMenu: function() {
|
toggleAppMenu: function() {
|
||||||
let indicator = this.statusArea.appMenu;
|
let indicator = this.statusArea.appMenu;
|
||||||
if (!indicator) // appMenu not supported by current session mode
|
if (!indicator) // appMenu not supported by current session mode
|
||||||
return;
|
return;
|
||||||
|
|
||||||
let menu = indicator.menu;
|
let menu = indicator.menu;
|
||||||
if (!indicator.actor.reactive || menu.isOpen)
|
if (!indicator.actor.reactive)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
menu.open();
|
menu.toggle();
|
||||||
|
if (menu.isOpen)
|
||||||
menu.actor.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
|
menu.actor.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -553,6 +553,10 @@ const PopupSliderMenuItem = new Lang.Class({
|
|||||||
|
|
||||||
let handleRadius = themeNode.get_length('-slider-handle-radius');
|
let handleRadius = themeNode.get_length('-slider-handle-radius');
|
||||||
|
|
||||||
|
let handleBorderWidth = themeNode.get_length('-slider-handle-border-width');
|
||||||
|
let [hasHandleColor, handleBorderColor] =
|
||||||
|
themeNode.lookup_color('-slider-handle-border-color', false);
|
||||||
|
|
||||||
let sliderWidth = width - 2 * handleRadius;
|
let sliderWidth = width - 2 * handleRadius;
|
||||||
let sliderHeight = themeNode.get_length('-slider-height');
|
let sliderHeight = themeNode.get_length('-slider-height');
|
||||||
|
|
||||||
@ -604,7 +608,16 @@ const PopupSliderMenuItem = new Lang.Class({
|
|||||||
color.blue / 255,
|
color.blue / 255,
|
||||||
color.alpha / 255);
|
color.alpha / 255);
|
||||||
cr.arc(handleX, handleY, handleRadius, 0, 2 * Math.PI);
|
cr.arc(handleX, handleY, handleRadius, 0, 2 * Math.PI);
|
||||||
cr.fill();
|
cr.fillPreserve();
|
||||||
|
if (hasHandleColor && handleBorderWidth) {
|
||||||
|
cr.setSourceRGBA(
|
||||||
|
handleBorderColor.red / 255,
|
||||||
|
handleBorderColor.green / 255,
|
||||||
|
handleBorderColor.blue / 255,
|
||||||
|
handleBorderColor.alpha / 255);
|
||||||
|
cr.setLineWidth(handleBorderWidth);
|
||||||
|
cr.stroke();
|
||||||
|
}
|
||||||
cr.$dispose();
|
cr.$dispose();
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -1157,6 +1170,7 @@ const PopupMenuBase = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
destroy: function() {
|
destroy: function() {
|
||||||
|
this.close();
|
||||||
this.removeAll();
|
this.removeAll();
|
||||||
this.actor.destroy();
|
this.actor.destroy();
|
||||||
|
|
||||||
@ -1812,6 +1826,8 @@ const RemoteMenu = new Lang.Class({
|
|||||||
|
|
||||||
this._actionStateChangeId = this.actionGroup.connect('action-state-changed', Lang.bind(this, this._actionStateChanged));
|
this._actionStateChangeId = this.actionGroup.connect('action-state-changed', Lang.bind(this, this._actionStateChanged));
|
||||||
this._actionEnableChangeId = this.actionGroup.connect('action-enabled-changed', Lang.bind(this, this._actionEnabledChanged));
|
this._actionEnableChangeId = this.actionGroup.connect('action-enabled-changed', Lang.bind(this, this._actionEnabledChanged));
|
||||||
|
|
||||||
|
this._skipSignalConnection = false;
|
||||||
},
|
},
|
||||||
|
|
||||||
destroy: function() {
|
destroy: function() {
|
||||||
@ -1859,7 +1875,7 @@ const RemoteMenu = new Lang.Class({
|
|||||||
let action_id = model.get_item_attribute_value(index, Gio.MENU_ATTRIBUTE_ACTION, null).deep_unpack();
|
let action_id = model.get_item_attribute_value(index, Gio.MENU_ATTRIBUTE_ACTION, null).deep_unpack();
|
||||||
if (!this.actionGroup.has_action(action_id)) {
|
if (!this.actionGroup.has_action(action_id)) {
|
||||||
// the action may not be there yet, wait for action-added
|
// the action may not be there yet, wait for action-added
|
||||||
return [null, false, 'action-added'];
|
return [null, false, 'action-added::' + action_id];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!this._actions[action_id])
|
if (!this._actions[action_id])
|
||||||
@ -1896,7 +1912,7 @@ const RemoteMenu = new Lang.Class({
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
log('Action "%s" has state of type %s, which is not supported'.format(action_id, action.state.get_type_string()));
|
log('Action "%s" has state of type %s, which is not supported'.format(action_id, action.state.get_type_string()));
|
||||||
return [null, false, 'action-state-changed'];
|
return [null, false, 'action-state-changed::' + action_id];
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
target = model.get_item_attribute_value(index, Gio.MENU_ATTRIBUTE_TARGET, null);
|
target = model.get_item_attribute_value(index, Gio.MENU_ATTRIBUTE_TARGET, null);
|
||||||
@ -1972,13 +1988,16 @@ const RemoteMenu = new Lang.Class({
|
|||||||
target.addMenuItem(separator, k+1);
|
target.addMenuItem(separator, k+1);
|
||||||
k++;
|
k++;
|
||||||
}
|
}
|
||||||
} else if (changeSignal) {
|
} else if (changeSignal && !this._skipSignalConnection) {
|
||||||
let signalId = this.actionGroup.connect(changeSignal, Lang.bind(this, function(actionGroup, actionName) {
|
let signalId = this.actionGroup.connect(changeSignal, Lang.bind(this, function(actionGroup, actionName) {
|
||||||
actionGroup.disconnect(signalId);
|
actionGroup.disconnect(signalId);
|
||||||
if (this._actions[actionName]) return;
|
if (this._actions[actionName]) return;
|
||||||
|
|
||||||
// force a full update
|
/* force a full update but do not reconnect signals if other
|
||||||
|
* actions are missing */
|
||||||
|
this._skipSignalConnection = true;
|
||||||
this._modelChanged(model, 0, -1, model.get_n_items(), target);
|
this._modelChanged(model, 0, -1, model.get_n_items(), target);
|
||||||
|
this._skipSignalConnection = false;
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2051,9 +2070,9 @@ const RemoteMenu = new Lang.Class({
|
|||||||
const PopupMenuManager = new Lang.Class({
|
const PopupMenuManager = new Lang.Class({
|
||||||
Name: 'PopupMenuManager',
|
Name: 'PopupMenuManager',
|
||||||
|
|
||||||
_init: function(owner) {
|
_init: function(owner, grabParams) {
|
||||||
this._owner = owner;
|
this._owner = owner;
|
||||||
this._grabHelper = new GrabHelper.GrabHelper(owner.actor);
|
this._grabHelper = new GrabHelper.GrabHelper(owner.actor, grabParams);
|
||||||
this._menus = [];
|
this._menus = [];
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -2086,7 +2105,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 +2129,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;
|
||||||
},
|
},
|
||||||
@ -2123,6 +2142,8 @@ const PopupMenuManager = new Lang.Class({
|
|||||||
|
|
||||||
_onMenuOpenState: function(menu, open) {
|
_onMenuOpenState: function(menu, open) {
|
||||||
if (open) {
|
if (open) {
|
||||||
|
if (this.activeMenu && !this.activeMenu.isChildMenu(menu))
|
||||||
|
this.activeMenu.close(BoxPointer.PopupAnimation.FADE);
|
||||||
this._grabHelper.grab({ actor: menu.actor, modal: true, focus: menu.sourceActor,
|
this._grabHelper.grab({ actor: menu.actor, modal: true, focus: menu.sourceActor,
|
||||||
onUngrab: Lang.bind(this, this._closeMenu, menu) });
|
onUngrab: Lang.bind(this, this._closeMenu, menu) });
|
||||||
} else {
|
} else {
|
||||||
@ -2139,13 +2160,8 @@ const PopupMenuManager = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_changeMenu: function(newMenu) {
|
_changeMenu: function(newMenu) {
|
||||||
let oldMenu = this.activeMenu;
|
newMenu.open(this.activeMenu ? BoxPointer.PopupAnimation.FADE
|
||||||
if (oldMenu) {
|
: BoxPointer.PopupAnimation.FULL);
|
||||||
oldMenu.close(BoxPointer.PopupAnimation.FADE);
|
|
||||||
newMenu.open(BoxPointer.PopupAnimation.FADE);
|
|
||||||
} else {
|
|
||||||
newMenu.open(BoxPointer.PopupAnimation.FULL);
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_onMenuSourceEnter: function(menu) {
|
_onMenuSourceEnter: function(menu) {
|
||||||
|
@ -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,144 +30,13 @@ 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,
|
||||||
|
|
||||||
_init : function() {
|
_init : function() {
|
||||||
this.parent({ styleClass: 'run-dialog' });
|
this.parent({ styleClass: 'run-dialog',
|
||||||
|
destroyOnClose: false });
|
||||||
|
|
||||||
this._lockdownSettings = new Gio.Settings({ schema: LOCKDOWN_SCHEMA });
|
this._lockdownSettings = new Gio.Settings({ schema: LOCKDOWN_SCHEMA });
|
||||||
this._terminalSettings = new Gio.Settings({ schema: TERMINAL_SCHEMA });
|
this._terminalSettings = new Gio.Settings({ schema: TERMINAL_SCHEMA });
|
||||||
@ -242,8 +111,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 +126,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 +137,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 +144,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,
|
||||||
|
function(sessionProxy) {
|
||||||
|
this._loginSession = sessionProxy;
|
||||||
this._loginSession.connectSignal('Lock', Lang.bind(this, function() { this.lock(false); }));
|
this._loginSession.connectSignal('Lock', Lang.bind(this, function() { this.lock(false); }));
|
||||||
this._loginSession.connectSignal('Unlock', Lang.bind(this, function() { this.deactivate(false); }));
|
this._loginSession.connectSignal('Unlock', Lang.bind(this, function() { this.deactivate(false); }));
|
||||||
|
}));
|
||||||
|
|
||||||
this._settings = new Gio.Settings({ schema: SCREENSAVER_SCHEMA });
|
this._settings = new Gio.Settings({ schema: 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);
|
||||||
|
|
||||||
@ -561,6 +562,7 @@ const ScreenShield = new Lang.Class({
|
|||||||
this._bgManagers[i].destroy();
|
this._bgManagers[i].destroy();
|
||||||
|
|
||||||
this._bgManagers = [];
|
this._bgManagers = [];
|
||||||
|
this._backgroundGroup.destroy_all_children();
|
||||||
|
|
||||||
for (let i = 0; i < Main.layoutManager.monitors.length; i++)
|
for (let i = 0; i < Main.layoutManager.monitors.length; i++)
|
||||||
this._createBackground(i);
|
this._createBackground(i);
|
||||||
@ -590,28 +592,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 +651,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 +853,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 +906,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 +977,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,6 +1052,7 @@ const ScreenShield = new Lang.Class({
|
|||||||
if (prevIsActive != this._isActive)
|
if (prevIsActive != this._isActive)
|
||||||
this.emit('active-changed');
|
this.emit('active-changed');
|
||||||
|
|
||||||
|
if (this._aboutToSuspend)
|
||||||
this._uninhibitSuspend();
|
this._uninhibitSuspend();
|
||||||
|
|
||||||
this.emit('lock-screen-shown');
|
this.emit('lock-screen-shown');
|
||||||
@ -1061,12 +1093,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;
|
||||||
},
|
},
|
||||||
@ -1086,6 +1115,9 @@ const ScreenShield = new Lang.Class({
|
|||||||
deactivate: function(animate) {
|
deactivate: function(animate) {
|
||||||
this._hideLockScreen(animate, 0);
|
this._hideLockScreen(animate, 0);
|
||||||
|
|
||||||
|
if (this._hasLockScreen)
|
||||||
|
this._clearLockScreen();
|
||||||
|
|
||||||
if (Main.sessionMode.currentMode == 'lock-screen')
|
if (Main.sessionMode.currentMode == 'lock-screen')
|
||||||
Main.sessionMode.popMode('lock-screen');
|
Main.sessionMode.popMode('lock-screen');
|
||||||
if (Main.sessionMode.currentMode == 'unlock-dialog')
|
if (Main.sessionMode.currentMode == 'unlock-dialog')
|
||||||
@ -1102,9 +1134,6 @@ const ScreenShield = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_completeDeactivate: function() {
|
_completeDeactivate: function() {
|
||||||
if (this._hasLockScreen)
|
|
||||||
this._clearLockScreen();
|
|
||||||
|
|
||||||
if (this._dialog && !this._isGreeter) {
|
if (this._dialog && !this._isGreeter) {
|
||||||
this._dialog.destroy();
|
this._dialog.destroy();
|
||||||
this._dialog = null;
|
this._dialog = null;
|
||||||
@ -1171,6 +1200,12 @@ const ScreenShield = new Lang.Class({
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Clear the clipboard - otherwise, its contents may be leaked
|
||||||
|
// to unauthorized parties by pasting into the unlock dialog's
|
||||||
|
// password entry and unmasking the entry
|
||||||
|
St.Clipboard.get_default().set_text(St.ClipboardType.CLIPBOARD, '');
|
||||||
|
St.Clipboard.get_default().set_text(St.ClipboardType.PRIMARY, '');
|
||||||
|
|
||||||
this._isLocked = true;
|
this._isLocked = true;
|
||||||
this.activate(animate);
|
this.activate(animate);
|
||||||
|
|
||||||
@ -1178,62 +1213,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);
|
|
||||||
|
140
js/ui/screencast.js
Normal file
140
js/ui/screencast.js
Normal file
@ -0,0 +1,140 @@
|
|||||||
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
|
||||||
|
const Gio = imports.gi.Gio;
|
||||||
|
const GLib = imports.gi.GLib;
|
||||||
|
const Lang = imports.lang;
|
||||||
|
const Shell = imports.gi.Shell;
|
||||||
|
|
||||||
|
const Hash = imports.misc.hash;
|
||||||
|
const Main = imports.ui.main;
|
||||||
|
|
||||||
|
const ScreencastIface = <interface name="org.gnome.Shell.Screencast">
|
||||||
|
<method name="Screencast">
|
||||||
|
<arg type="s" direction="in" name="file_template"/>
|
||||||
|
<arg type="a{sv}" direction="in" name="options"/>
|
||||||
|
<arg type="b" direction="out" name="success"/>
|
||||||
|
<arg type="s" direction="out" name="filename_used"/>
|
||||||
|
</method>
|
||||||
|
<method name="ScreencastArea">
|
||||||
|
<arg type="i" direction="in" name="x"/>
|
||||||
|
<arg type="i" direction="in" name="y"/>
|
||||||
|
<arg type="i" direction="in" name="width"/>
|
||||||
|
<arg type="i" direction="in" name="height"/>
|
||||||
|
<arg type="s" direction="in" name="file_template"/>
|
||||||
|
<arg type="a{sv}" direction="in" name="options"/>
|
||||||
|
<arg type="b" direction="out" name="success"/>
|
||||||
|
<arg type="s" direction="out" name="filename_used"/>
|
||||||
|
</method>
|
||||||
|
<method name="StopScreencast">
|
||||||
|
<arg type="b" direction="out" name="success"/>
|
||||||
|
</method>
|
||||||
|
</interface>;
|
||||||
|
|
||||||
|
const ScreencastService = new Lang.Class({
|
||||||
|
Name: 'ScreencastService',
|
||||||
|
|
||||||
|
_init: function() {
|
||||||
|
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(ScreencastIface, this);
|
||||||
|
this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell/Screencast');
|
||||||
|
|
||||||
|
Gio.DBus.session.own_name('org.gnome.Shell.Screencast', Gio.BusNameOwnerFlags.REPLACE, null, null);
|
||||||
|
|
||||||
|
this._recorders = new Hash.Map();
|
||||||
|
|
||||||
|
Main.sessionMode.connect('updated',
|
||||||
|
Lang.bind(this, this._sessionModeChanged));
|
||||||
|
},
|
||||||
|
|
||||||
|
_ensureRecorderForSender: function(sender) {
|
||||||
|
let recorder = this._recorders.get(sender);
|
||||||
|
if (!recorder) {
|
||||||
|
recorder = new Shell.Recorder({ stage: global.stage });
|
||||||
|
recorder._watchNameId =
|
||||||
|
Gio.bus_watch_name(Gio.BusType.SESSION, sender, 0, null,
|
||||||
|
Lang.bind(this, this._onNameVanished));
|
||||||
|
this._recorders.set(sender, recorder);
|
||||||
|
}
|
||||||
|
return recorder;
|
||||||
|
},
|
||||||
|
|
||||||
|
_sessionModeChanged: function() {
|
||||||
|
if (Main.sessionMode.allowScreencast)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (let sender in this._recorders.keys())
|
||||||
|
this._recorders.delete(sender);
|
||||||
|
},
|
||||||
|
|
||||||
|
_onNameVanished: function(connection, name) {
|
||||||
|
this._stopRecordingForSender(name);
|
||||||
|
},
|
||||||
|
|
||||||
|
_stopRecordingForSender: function(sender) {
|
||||||
|
let recorder = this._recorders.get(sender);
|
||||||
|
if (!recorder)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
Gio.bus_unwatch_name(recorder._watchNameId);
|
||||||
|
recorder.close();
|
||||||
|
this._recorders.delete(sender);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
|
||||||
|
_applyOptionalParameters: function(recorder, options) {
|
||||||
|
for (let option in options)
|
||||||
|
options[option] = options[option].deep_unpack();
|
||||||
|
|
||||||
|
if (options['pipeline'])
|
||||||
|
recorder.set_pipeline(options['pipeline']);
|
||||||
|
if (options['framerate'])
|
||||||
|
recorder.set_framerate(options['framerate']);
|
||||||
|
if (options['draw-cursor'])
|
||||||
|
recorder.set_draw_cursor(options['draw-cursor']);
|
||||||
|
},
|
||||||
|
|
||||||
|
ScreencastAsync: function(params, invocation) {
|
||||||
|
let returnValue = [false, ''];
|
||||||
|
if (!Main.sessionMode.allowScreencast)
|
||||||
|
invocation.return_value(GLib.Variant.new('(bs)', returnValue));
|
||||||
|
|
||||||
|
let sender = invocation.get_sender();
|
||||||
|
let recorder = this._ensureRecorderForSender(sender);
|
||||||
|
if (!recorder.is_recording()) {
|
||||||
|
let [fileTemplate, options] = params;
|
||||||
|
|
||||||
|
recorder.set_file_template(fileTemplate);
|
||||||
|
this._applyOptionalParameters(recorder, options);
|
||||||
|
let [success, fileName] = recorder.record();
|
||||||
|
returnValue = [success, fileName ? fileName : ''];
|
||||||
|
}
|
||||||
|
|
||||||
|
invocation.return_value(GLib.Variant.new('(bs)', returnValue));
|
||||||
|
},
|
||||||
|
|
||||||
|
ScreencastAreaAsync: function(params, invocation) {
|
||||||
|
let returnValue = [false, ''];
|
||||||
|
if (!Main.sessionMode.allowScreencast)
|
||||||
|
invocation.return_value(GLib.Variant.new('(bs)', returnValue));
|
||||||
|
|
||||||
|
let sender = invocation.get_sender();
|
||||||
|
let recorder = this._ensureRecorderForSender(sender);
|
||||||
|
|
||||||
|
if (!recorder.is_recording()) {
|
||||||
|
let [x, y, width, height, fileTemplate, options] = params;
|
||||||
|
|
||||||
|
recorder.set_file_template(fileTemplate);
|
||||||
|
recorder.set_area(x, y, width, height);
|
||||||
|
this._applyOptionalParameters(recorder, options);
|
||||||
|
let [success, fileName] = recorder.record();
|
||||||
|
returnValue = [success, fileName ? fileName : ''];
|
||||||
|
}
|
||||||
|
|
||||||
|
invocation.return_value(GLib.Variant.new('(bs)', returnValue));
|
||||||
|
},
|
||||||
|
|
||||||
|
StopScreencastAsync: function(params, invocation) {
|
||||||
|
let success = this._stopRecordingForSender(invocation.get_sender());
|
||||||
|
invocation.return_value(GLib.Variant.new('(b)', [success]));
|
||||||
|
}
|
||||||
|
});
|
@ -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() });
|
||||||
|
@ -16,6 +16,7 @@ const _modes = {
|
|||||||
'restrictive': {
|
'restrictive': {
|
||||||
parentMode: null,
|
parentMode: null,
|
||||||
stylesheetName: 'gnome-shell.css',
|
stylesheetName: 'gnome-shell.css',
|
||||||
|
overridesSchema: 'org.gnome.shell.overrides',
|
||||||
hasOverview: false,
|
hasOverview: false,
|
||||||
showCalendarEvents: false,
|
showCalendarEvents: false,
|
||||||
allowSettings: false,
|
allowSettings: false,
|
||||||
@ -45,7 +46,7 @@ const _modes = {
|
|||||||
unlockDialog: imports.gdm.loginDialog.LoginDialog,
|
unlockDialog: imports.gdm.loginDialog.LoginDialog,
|
||||||
components: ['polkitAgent'],
|
components: ['polkitAgent'],
|
||||||
panel: {
|
panel: {
|
||||||
left: ['logo'],
|
left: [],
|
||||||
center: ['dateMenu'],
|
center: ['dateMenu'],
|
||||||
right: ['a11yGreeter', 'display', 'keyboard',
|
right: ['a11yGreeter', 'display', 'keyboard',
|
||||||
'volume', 'battery', 'powerMenu']
|
'volume', 'battery', 'powerMenu']
|
||||||
@ -79,12 +80,13 @@ const _modes = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
'initial-setup': {
|
'initial-setup': {
|
||||||
|
hasWindows: true,
|
||||||
isPrimary: true,
|
isPrimary: true,
|
||||||
components: ['keyring'],
|
components: ['networkAgent', 'keyring'],
|
||||||
panel: {
|
panel: {
|
||||||
left: [],
|
left: [],
|
||||||
center: ['dateMenu'],
|
center: ['dateMenu'],
|
||||||
right: ['a11yGreeter', 'keyboard', 'volume']
|
right: ['a11yGreeter', 'keyboard', 'volume', 'battery']
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -158,12 +160,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 +168,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');
|
||||||
}));
|
}));
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -197,6 +196,10 @@ const SessionMode = new Lang.Class({
|
|||||||
return this._modeStack[this._modeStack.length - 1];
|
return this._modeStack[this._modeStack.length - 1];
|
||||||
},
|
},
|
||||||
|
|
||||||
|
get allowScreencast() {
|
||||||
|
return this.components.indexOf('recorder') != -1;
|
||||||
|
},
|
||||||
|
|
||||||
_sync: function() {
|
_sync: function() {
|
||||||
let params = this._modes[this.currentMode];
|
let params = this._modes[this.currentMode];
|
||||||
let defaults;
|
let defaults;
|
||||||
|
@ -12,6 +12,7 @@ const ExtensionDownloader = imports.ui.extensionDownloader;
|
|||||||
const ExtensionUtils = imports.misc.extensionUtils;
|
const ExtensionUtils = imports.misc.extensionUtils;
|
||||||
const Hash = imports.misc.hash;
|
const Hash = imports.misc.hash;
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
|
const Screencast = imports.ui.screencast;
|
||||||
const Screenshot = imports.ui.screenshot;
|
const Screenshot = imports.ui.screenshot;
|
||||||
|
|
||||||
const GnomeShellIface = <interface name="org.gnome.Shell">
|
const GnomeShellIface = <interface name="org.gnome.Shell">
|
||||||
@ -20,6 +21,7 @@ const GnomeShellIface = <interface name="org.gnome.Shell">
|
|||||||
<arg type="b" direction="out" name="success" />
|
<arg type="b" direction="out" name="success" />
|
||||||
<arg type="s" direction="out" name="result" />
|
<arg type="s" direction="out" name="result" />
|
||||||
</method>
|
</method>
|
||||||
|
<method name="FocusSearch"/>
|
||||||
<method name="ShowOSD">
|
<method name="ShowOSD">
|
||||||
<arg type="a{sv}" direction="in" name="params"/>
|
<arg type="a{sv}" direction="in" name="params"/>
|
||||||
</method>
|
</method>
|
||||||
@ -70,6 +72,7 @@ const GnomeShell = new Lang.Class({
|
|||||||
this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell');
|
this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell');
|
||||||
|
|
||||||
this._extensionsService = new GnomeShellExtensions();
|
this._extensionsService = new GnomeShellExtensions();
|
||||||
|
this._screencastService = new Screencast.ScreencastService();
|
||||||
this._screenshotService = new Screenshot.ScreenshotService();
|
this._screenshotService = new Screenshot.ScreenshotService();
|
||||||
|
|
||||||
this._grabbedAccelerators = new Hash.Map();
|
this._grabbedAccelerators = new Hash.Map();
|
||||||
@ -97,7 +100,7 @@ const GnomeShell = new Lang.Class({
|
|||||||
*/
|
*/
|
||||||
Eval: function(code) {
|
Eval: function(code) {
|
||||||
if (!global.settings.get_boolean('development-tools'))
|
if (!global.settings.get_boolean('development-tools'))
|
||||||
return [false, null];
|
return [false, ''];
|
||||||
|
|
||||||
let returnValue;
|
let returnValue;
|
||||||
let success;
|
let success;
|
||||||
@ -114,6 +117,10 @@ const GnomeShell = new Lang.Class({
|
|||||||
return [success, returnValue];
|
return [success, returnValue];
|
||||||
},
|
},
|
||||||
|
|
||||||
|
FocusSearch: function() {
|
||||||
|
Main.overview.focusSearch();
|
||||||
|
},
|
||||||
|
|
||||||
ShowOSD: function(params) {
|
ShowOSD: function(params) {
|
||||||
for (let param in params)
|
for (let param in params)
|
||||||
params[param] = params[param].deep_unpack();
|
params[param] = params[param].deep_unpack();
|
||||||
@ -397,7 +404,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() {
|
||||||
|
@ -14,9 +14,7 @@ const EntryMenu = new Lang.Class({
|
|||||||
Name: 'ShellEntryMenu',
|
Name: 'ShellEntryMenu',
|
||||||
Extends: PopupMenu.PopupMenu,
|
Extends: PopupMenu.PopupMenu,
|
||||||
|
|
||||||
_init: function(entry, params) {
|
_init: function(entry) {
|
||||||
params = Params.parse (params, { isPassword: false });
|
|
||||||
|
|
||||||
this.parent(entry, 0, St.Side.TOP);
|
this.parent(entry, 0, St.Side.TOP);
|
||||||
|
|
||||||
this.actor.add_style_class_name('entry-context-menu');
|
this.actor.add_style_class_name('entry-context-menu');
|
||||||
@ -37,8 +35,6 @@ const EntryMenu = new Lang.Class({
|
|||||||
this._pasteItem = item;
|
this._pasteItem = item;
|
||||||
|
|
||||||
this._passwordItem = null;
|
this._passwordItem = null;
|
||||||
if (params.isPassword)
|
|
||||||
this._makePasswordItem();
|
|
||||||
|
|
||||||
Main.uiGroup.add_actor(this.actor);
|
Main.uiGroup.add_actor(this.actor);
|
||||||
this.actor.hide();
|
this.actor.hide();
|
||||||
@ -60,11 +56,13 @@ const EntryMenu = new Lang.Class({
|
|||||||
if (v == this.isPassword)
|
if (v == this.isPassword)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (v)
|
if (v) {
|
||||||
this._makePasswordItem();
|
this._makePasswordItem();
|
||||||
else {
|
this._entry.input_purpose = Gtk.InputPurpose.PASSWORD;
|
||||||
|
} else {
|
||||||
this._passwordItem.destroy();
|
this._passwordItem.destroy();
|
||||||
this._passwordItem = null;
|
this._passwordItem = null;
|
||||||
|
this._entry.input_purpose = Gtk.InputPurpose.FREE_FORM;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -82,11 +80,6 @@ const EntryMenu = new Lang.Class({
|
|||||||
this.actor.grab_key_focus();
|
this.actor.grab_key_focus();
|
||||||
},
|
},
|
||||||
|
|
||||||
close: function(animate) {
|
|
||||||
this._entry.grab_key_focus();
|
|
||||||
this.parent(animate);
|
|
||||||
},
|
|
||||||
|
|
||||||
_updateCopyItem: function() {
|
_updateCopyItem: function() {
|
||||||
let selection = this._entry.clutter_text.get_selection();
|
let selection = this._entry.clutter_text.get_selection();
|
||||||
this._copyItem.setSensitive(!this._entry.clutter_text.password_char &&
|
this._copyItem.setSensitive(!this._entry.clutter_text.password_char &&
|
||||||
@ -160,7 +153,10 @@ function addContextMenu(entry, params) {
|
|||||||
if (entry.menu)
|
if (entry.menu)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
entry.menu = new EntryMenu(entry, params);
|
params = Params.parse (params, { isPassword: false });
|
||||||
|
|
||||||
|
entry.menu = new EntryMenu(entry);
|
||||||
|
entry.menu.isPassword = params.isPassword;
|
||||||
entry._menuManager = new PopupMenu.PopupMenuManager({ actor: entry });
|
entry._menuManager = new PopupMenu.PopupMenuManager({ actor: entry });
|
||||||
entry._menuManager.addMenu(entry.menu);
|
entry._menuManager.addMenu(entry.menu);
|
||||||
|
|
||||||
@ -171,4 +167,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,33 @@ 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 the longest we'll keep the keyboard frozen until an input
|
||||||
|
// source is active.
|
||||||
|
const MAX_INPUT_SOURCE_ACTIVATION_TIME = 4000; // 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() {
|
||||||
|
global.freeze_keyboard(global.get_current_time());
|
||||||
|
}
|
||||||
|
|
||||||
const IBusManager = new Lang.Class({
|
const IBusManager = new Lang.Class({
|
||||||
Name: 'IBusManager',
|
Name: 'IBusManager',
|
||||||
|
|
||||||
@ -45,26 +72,24 @@ const IBusManager = new Lang.Class({
|
|||||||
this._readyCallback = readyCallback;
|
this._readyCallback = readyCallback;
|
||||||
this._candidatePopup = new IBusCandidatePopup.CandidatePopup();
|
this._candidatePopup = new IBusCandidatePopup.CandidatePopup();
|
||||||
|
|
||||||
this._ibus = null;
|
|
||||||
this._panelService = null;
|
this._panelService = null;
|
||||||
this._engines = {};
|
this._engines = {};
|
||||||
this._ready = false;
|
this._ready = false;
|
||||||
this._registerPropertiesId = 0;
|
this._registerPropertiesId = 0;
|
||||||
this._currentEngineName = null;
|
this._currentEngineName = null;
|
||||||
|
|
||||||
this._nameWatcherId = Gio.DBus.session.watch_name(IBus.SERVICE_IBUS,
|
this._ibus = IBus.Bus.new_async();
|
||||||
Gio.BusNameWatcherFlags.NONE,
|
this._ibus.connect('connected', Lang.bind(this, this._onConnected));
|
||||||
Lang.bind(this, this._onNameAppeared),
|
this._ibus.connect('disconnected', Lang.bind(this, this._clear));
|
||||||
Lang.bind(this, this._clear));
|
// Need to set this to get 'global-engine-changed' emitions
|
||||||
|
this._ibus.set_watch_ibus_signal(true);
|
||||||
|
this._ibus.connect('global-engine-changed', Lang.bind(this, this._engineChanged));
|
||||||
},
|
},
|
||||||
|
|
||||||
_clear: function() {
|
_clear: function() {
|
||||||
if (this._panelService)
|
if (this._panelService)
|
||||||
this._panelService.destroy();
|
this._panelService.destroy();
|
||||||
if (this._ibus)
|
|
||||||
this._ibus.destroy();
|
|
||||||
|
|
||||||
this._ibus = null;
|
|
||||||
this._panelService = null;
|
this._panelService = null;
|
||||||
this._candidatePopup.setPanelService(null);
|
this._candidatePopup.setPanelService(null);
|
||||||
this._engines = {};
|
this._engines = {};
|
||||||
@ -76,18 +101,12 @@ const IBusManager = new Lang.Class({
|
|||||||
this._readyCallback(false);
|
this._readyCallback(false);
|
||||||
},
|
},
|
||||||
|
|
||||||
_onNameAppeared: function() {
|
|
||||||
this._ibus = IBus.Bus.new_async();
|
|
||||||
this._ibus.connect('connected', Lang.bind(this, this._onConnected));
|
|
||||||
},
|
|
||||||
|
|
||||||
_onConnected: function() {
|
_onConnected: function() {
|
||||||
this._ibus.list_engines_async(-1, null, Lang.bind(this, this._initEngines));
|
this._ibus.list_engines_async(-1, null, Lang.bind(this, this._initEngines));
|
||||||
this._ibus.request_name_async(IBus.SERVICE_PANEL,
|
this._ibus.request_name_async(IBus.SERVICE_PANEL,
|
||||||
IBus.BusNameFlag.REPLACE_EXISTING,
|
IBus.BusNameFlag.REPLACE_EXISTING,
|
||||||
-1, null,
|
-1, null,
|
||||||
Lang.bind(this, this._initPanelService));
|
Lang.bind(this, this._initPanelService));
|
||||||
this._ibus.connect('disconnected', Lang.bind(this, this._clear));
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_initEngines: function(ibus, result) {
|
_initEngines: function(ibus, result) {
|
||||||
@ -109,9 +128,6 @@ const IBusManager = new Lang.Class({
|
|||||||
this._panelService = new IBus.PanelService({ connection: this._ibus.get_connection(),
|
this._panelService = new IBus.PanelService({ connection: this._ibus.get_connection(),
|
||||||
object_path: IBus.PATH_PANEL });
|
object_path: IBus.PATH_PANEL });
|
||||||
this._candidatePopup.setPanelService(this._panelService);
|
this._candidatePopup.setPanelService(this._panelService);
|
||||||
// Need to set this to get 'global-engine-changed' emitions
|
|
||||||
this._ibus.set_watch_ibus_signal(true);
|
|
||||||
this._ibus.connect('global-engine-changed', Lang.bind(this, this._engineChanged));
|
|
||||||
this._panelService.connect('update-property', Lang.bind(this, this._updateProperty));
|
this._panelService.connect('update-property', Lang.bind(this, this._updateProperty));
|
||||||
// If an engine is already active we need to get its properties
|
// If an engine is already active we need to get its properties
|
||||||
this._ibus.get_global_engine_async(-1, null, Lang.bind(this, function(i, result) {
|
this._ibus.get_global_engine_async(-1, null, Lang.bind(this, function(i, result) {
|
||||||
@ -140,6 +156,9 @@ const IBusManager = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_engineChanged: function(bus, engineName) {
|
_engineChanged: function(bus, engineName) {
|
||||||
|
if (!this._ready)
|
||||||
|
return;
|
||||||
|
|
||||||
this._currentEngineName = engineName;
|
this._currentEngineName = engineName;
|
||||||
|
|
||||||
if (this._registerPropertiesId != 0)
|
if (this._registerPropertiesId != 0)
|
||||||
@ -364,6 +383,15 @@ 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);
|
||||||
|
});
|
||||||
|
this._keyboardManager.g_default_timeout = MAX_INPUT_SOURCE_ACTIVATION_TIME;
|
||||||
|
|
||||||
|
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,10 +425,43 @@ const InputSourceIndicator = new Lang.Class({
|
|||||||
this._inputSourcesChanged();
|
this._inputSourcesChanged();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_modifiersSwitcher: function() {
|
||||||
|
let sourceIndexes = Object.keys(this._inputSources);
|
||||||
|
if (sourceIndexes.length == 0) {
|
||||||
|
releaseKeyboard();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
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();
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
|
||||||
_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 a GrabHelper grab is in
|
||||||
|
// effect 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 ||
|
||||||
|
Main.keybindingMode == Shell.KeyBindingMode.TOPBAR_POPUP) {
|
||||||
|
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 = modifiers & Meta.VirtualModifier.SHIFT_MASK;
|
||||||
@ -416,6 +477,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 +496,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();
|
||||||
|
|
||||||
@ -459,6 +520,7 @@ const InputSourceIndicator = new Lang.Class({
|
|||||||
|
|
||||||
this._inputSources = {};
|
this._inputSources = {};
|
||||||
this._ibusSources = {};
|
this._ibusSources = {};
|
||||||
|
this._currentSource = null;
|
||||||
|
|
||||||
let inputSourcesByShortName = {};
|
let inputSourcesByShortName = {};
|
||||||
|
|
||||||
@ -487,10 +549,8 @@ 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)
|
holdKeyboard();
|
||||||
return;
|
this._keyboardManager.SetInputSourceRemote(is.index, releaseKeyboard);
|
||||||
this._settings.set_value(KEY_CURRENT_INPUT_SOURCE,
|
|
||||||
GLib.Variant.new_uint32(is.index));
|
|
||||||
}));
|
}));
|
||||||
|
|
||||||
if (!(is.shortName in inputSourcesByShortName))
|
if (!(is.shortName in inputSourcesByShortName))
|
||||||
@ -703,7 +763,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;
|
||||||
|
|
||||||
|
@ -2047,6 +2047,7 @@ const NMApplet = new Lang.Class({
|
|||||||
let default_ip4 = null;
|
let default_ip4 = null;
|
||||||
let default_ip6 = null;
|
let default_ip6 = null;
|
||||||
let active_vpn = null;
|
let active_vpn = null;
|
||||||
|
let active_any = null;
|
||||||
for (let i = 0; i < this._activeConnections.length; i++) {
|
for (let i = 0; i < this._activeConnections.length; i++) {
|
||||||
let a = this._activeConnections[i];
|
let a = this._activeConnections[i];
|
||||||
|
|
||||||
@ -2077,10 +2078,15 @@ const NMApplet = new Lang.Class({
|
|||||||
if (a.default6)
|
if (a.default6)
|
||||||
default_ip6 = a;
|
default_ip6 = a;
|
||||||
|
|
||||||
if (a._type == 'vpn')
|
if (a.state == NetworkManager.ActiveConnectionState.ACTIVATING)
|
||||||
active_vpn = a;
|
|
||||||
else if (a.state == NetworkManager.ActiveConnectionState.ACTIVATING)
|
|
||||||
activating = a;
|
activating = a;
|
||||||
|
else if (a.state == NetworkManager.ActiveConnectionState.ACTIVATED)
|
||||||
|
active_any = a;
|
||||||
|
|
||||||
|
if (a._type == 'vpn' &&
|
||||||
|
(a.state == NetworkManager.ActiveConnectionState.ACTIVATING ||
|
||||||
|
a.state == NetworkManager.ActiveConnectionState.ACTIVATED))
|
||||||
|
active_vpn = a;
|
||||||
|
|
||||||
if (!a._primaryDevice) {
|
if (!a._primaryDevice) {
|
||||||
if (a._type != NetworkManager.SETTING_VPN_SETTING_NAME) {
|
if (a._type != NetworkManager.SETTING_VPN_SETTING_NAME) {
|
||||||
@ -2108,7 +2114,7 @@ const NMApplet = new Lang.Class({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this._mainConnection = activating || default_ip4 || default_ip6 || this._activeConnections[0] || null;
|
this._mainConnection = activating || default_ip4 || default_ip6 || active_any || null;
|
||||||
this._vpnConnection = active_vpn;
|
this._vpnConnection = active_vpn;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -307,7 +307,7 @@ const Indicator = new Lang.Class({
|
|||||||
this._headphoneIcon.visible = value;
|
this._headphoneIcon.visible = value;
|
||||||
}));
|
}));
|
||||||
|
|
||||||
this._headphoneIcon = this.addIcon(new Gio.ThemedIcon({ name: 'headphones-symbolic' }));
|
this._headphoneIcon = this.addIcon(new Gio.ThemedIcon({ name: 'audio-headphones-symbolic' }));
|
||||||
this._headphoneIcon.visible = false;
|
this._headphoneIcon.visible = false;
|
||||||
|
|
||||||
this.menu.addMenuItem(this._volumeMenu);
|
this.menu.addMenuItem(this._volumeMenu);
|
||||||
|
@ -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);
|
||||||
@ -118,9 +91,6 @@ const UnlockDialog = new Lang.Class({
|
|||||||
this._promptLoginHint.hide();
|
this._promptLoginHint.hide();
|
||||||
this.contentLayout.add_actor(this._promptLoginHint);
|
this.contentLayout.add_actor(this._promptLoginHint);
|
||||||
|
|
||||||
this._workSpinner = new Panel.AnimatedIcon('process-working.svg', LoginDialog.WORK_SPINNER_ICON_SIZE);
|
|
||||||
this._workSpinner.actor.opacity = 0;
|
|
||||||
|
|
||||||
this.allowCancel = false;
|
this.allowCancel = false;
|
||||||
this.buttonLayout.visible = true;
|
this.buttonLayout.visible = true;
|
||||||
this.addButton({ label: _("Cancel"),
|
this.addButton({ label: _("Cancel"),
|
||||||
@ -131,8 +101,7 @@ const UnlockDialog = new Lang.Class({
|
|||||||
y_fill: false,
|
y_fill: false,
|
||||||
x_align: St.Align.START,
|
x_align: St.Align.START,
|
||||||
y_align: St.Align.MIDDLE });
|
y_align: St.Align.MIDDLE });
|
||||||
this.buttonLayout.add(this._workSpinner.actor,
|
this.placeSpinner({ expand: false,
|
||||||
{ expand: false,
|
|
||||||
x_fill: false,
|
x_fill: false,
|
||||||
y_fill: false,
|
y_fill: false,
|
||||||
x_align: St.Align.END,
|
x_align: St.Align.END,
|
||||||
@ -169,11 +138,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();
|
||||||
@ -195,28 +159,6 @@ const UnlockDialog = new Lang.Class({
|
|||||||
this._okButton.can_focus = sensitive;
|
this._okButton.can_focus = sensitive;
|
||||||
},
|
},
|
||||||
|
|
||||||
_setWorking: function(working) {
|
|
||||||
if (working) {
|
|
||||||
this._workSpinner.play();
|
|
||||||
Tweener.addTween(this._workSpinner.actor,
|
|
||||||
{ opacity: 255,
|
|
||||||
delay: LoginDialog.WORK_SPINNER_ANIMATION_DELAY,
|
|
||||||
time: LoginDialog.WORK_SPINNER_ANIMATION_TIME,
|
|
||||||
transition: 'linear'
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
Tweener.addTween(this._workSpinner.actor,
|
|
||||||
{ opacity: 0,
|
|
||||||
time: LoginDialog.WORK_SPINNER_ANIMATION_TIME,
|
|
||||||
transition: 'linear',
|
|
||||||
onCompleteScope: this,
|
|
||||||
onComplete: function() {
|
|
||||||
this._workSpinner.stop();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
_showMessage: function(userVerifier, message, styleClass) {
|
_showMessage: function(userVerifier, message, styleClass) {
|
||||||
if (message) {
|
if (message) {
|
||||||
this._promptMessage.text = message;
|
this._promptMessage.text = message;
|
||||||
@ -247,7 +189,7 @@ const UnlockDialog = new Lang.Class({
|
|||||||
|
|
||||||
this._currentQuery = serviceName;
|
this._currentQuery = serviceName;
|
||||||
this._updateSensitivity(true);
|
this._updateSensitivity(true);
|
||||||
this._setWorking(false);
|
this.setWorking(false);
|
||||||
},
|
},
|
||||||
|
|
||||||
_showLoginHint: function(verifier, message) {
|
_showLoginHint: function(verifier, message) {
|
||||||
@ -266,7 +208,7 @@ const UnlockDialog = new Lang.Class({
|
|||||||
// the actual reply to GDM will be sent as soon as asked
|
// the actual reply to GDM will be sent as soon as asked
|
||||||
this._firstQuestionAnswer = this._promptEntry.text;
|
this._firstQuestionAnswer = this._promptEntry.text;
|
||||||
this._updateSensitivity(false);
|
this._updateSensitivity(false);
|
||||||
this._setWorking(true);
|
this.setWorking(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -277,30 +219,47 @@ const UnlockDialog = new Lang.Class({
|
|||||||
this._currentQuery = null;
|
this._currentQuery = null;
|
||||||
|
|
||||||
this._updateSensitivity(false);
|
this._updateSensitivity(false);
|
||||||
this._setWorking(true);
|
this.setWorking(true);
|
||||||
|
|
||||||
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() {
|
||||||
|
if (!this._userVerified) {
|
||||||
|
this._userVerifier.clear();
|
||||||
this.emit('failed');
|
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');
|
||||||
this._promptEntry.menu.isPassword = true;
|
this._promptEntry.menu.isPassword = true;
|
||||||
|
|
||||||
this._updateSensitivity(false);
|
this._updateSensitivity(false);
|
||||||
this._setWorking(false);
|
this.setWorking(false);
|
||||||
},
|
},
|
||||||
|
|
||||||
_escape: function() {
|
_escape: function() {
|
||||||
@ -333,4 +292,8 @@ const UnlockDialog = new Lang.Class({
|
|||||||
|
|
||||||
this.destroy();
|
this.destroy();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
addCharacter: function(unichar) {
|
||||||
|
this._promptEntry.clutter_text.insert_unichar(unichar);
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
@ -600,6 +600,7 @@ 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));
|
||||||
|
if (Main.screenShield)
|
||||||
Main.screenShield.connect('locked-changed', Lang.bind(this, this._updatePresenceIcon));
|
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,6 +865,7 @@ 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();
|
||||||
|
if (Main.screenShield)
|
||||||
Main.screenShield.lock(false);
|
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;
|
||||||
|
@ -16,6 +16,7 @@ const UserWidget = new Lang.Class({
|
|||||||
|
|
||||||
this.actor = new St.BoxLayout({ style_class: 'user-widget',
|
this.actor = new St.BoxLayout({ style_class: 'user-widget',
|
||||||
vertical: false });
|
vertical: false });
|
||||||
|
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
|
||||||
|
|
||||||
this._avatar = new UserMenu.UserAvatarWidget(user);
|
this._avatar = new UserMenu.UserAvatarWidget(user);
|
||||||
this.actor.add(this._avatar.actor,
|
this.actor.add(this._avatar.actor,
|
||||||
@ -36,7 +37,7 @@ const UserWidget = new Lang.Class({
|
|||||||
this._updateUser();
|
this._updateUser();
|
||||||
},
|
},
|
||||||
|
|
||||||
destroy: function() {
|
_onDestroy: function() {
|
||||||
if (this._userLoadedId != 0) {
|
if (this._userLoadedId != 0) {
|
||||||
this._user.disconnect(this._userLoadedId);
|
this._user.disconnect(this._userLoadedId);
|
||||||
this._userLoadedId = 0;
|
this._userLoadedId = 0;
|
||||||
@ -46,8 +47,6 @@ const UserWidget = new Lang.Class({
|
|||||||
this._user.disconnect(this._userChangedId);
|
this._user.disconnect(this._userChangedId);
|
||||||
this._userChangedId = 0;
|
this._userChangedId = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.actor.destroy();
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_updateUser: function() {
|
_updateUser: function() {
|
||||||
|
@ -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;
|
||||||
|
@ -136,6 +136,42 @@ const WindowManager = new Lang.Class({
|
|||||||
Shell.KeyBindingMode.NORMAL |
|
Shell.KeyBindingMode.NORMAL |
|
||||||
Shell.KeyBindingMode.OVERVIEW,
|
Shell.KeyBindingMode.OVERVIEW,
|
||||||
Lang.bind(this, this._showWorkspaceSwitcher));
|
Lang.bind(this, this._showWorkspaceSwitcher));
|
||||||
|
this.allowKeybinding('switch-to-workspace-1',
|
||||||
|
Shell.KeyBindingMode.NORMAL |
|
||||||
|
Shell.KeyBindingMode.OVERVIEW);
|
||||||
|
this.allowKeybinding('switch-to-workspace-2',
|
||||||
|
Shell.KeyBindingMode.NORMAL |
|
||||||
|
Shell.KeyBindingMode.OVERVIEW);
|
||||||
|
this.allowKeybinding('switch-to-workspace-3',
|
||||||
|
Shell.KeyBindingMode.NORMAL |
|
||||||
|
Shell.KeyBindingMode.OVERVIEW);
|
||||||
|
this.allowKeybinding('switch-to-workspace-4',
|
||||||
|
Shell.KeyBindingMode.NORMAL |
|
||||||
|
Shell.KeyBindingMode.OVERVIEW);
|
||||||
|
this.allowKeybinding('switch-to-workspace-5',
|
||||||
|
Shell.KeyBindingMode.NORMAL |
|
||||||
|
Shell.KeyBindingMode.OVERVIEW);
|
||||||
|
this.allowKeybinding('switch-to-workspace-6',
|
||||||
|
Shell.KeyBindingMode.NORMAL |
|
||||||
|
Shell.KeyBindingMode.OVERVIEW);
|
||||||
|
this.allowKeybinding('switch-to-workspace-7',
|
||||||
|
Shell.KeyBindingMode.NORMAL |
|
||||||
|
Shell.KeyBindingMode.OVERVIEW);
|
||||||
|
this.allowKeybinding('switch-to-workspace-8',
|
||||||
|
Shell.KeyBindingMode.NORMAL |
|
||||||
|
Shell.KeyBindingMode.OVERVIEW);
|
||||||
|
this.allowKeybinding('switch-to-workspace-9',
|
||||||
|
Shell.KeyBindingMode.NORMAL |
|
||||||
|
Shell.KeyBindingMode.OVERVIEW);
|
||||||
|
this.allowKeybinding('switch-to-workspace-10',
|
||||||
|
Shell.KeyBindingMode.NORMAL |
|
||||||
|
Shell.KeyBindingMode.OVERVIEW);
|
||||||
|
this.allowKeybinding('switch-to-workspace-11',
|
||||||
|
Shell.KeyBindingMode.NORMAL |
|
||||||
|
Shell.KeyBindingMode.OVERVIEW);
|
||||||
|
this.allowKeybinding('switch-to-workspace-12',
|
||||||
|
Shell.KeyBindingMode.NORMAL |
|
||||||
|
Shell.KeyBindingMode.OVERVIEW);
|
||||||
this.setCustomKeybindingHandler('switch-applications',
|
this.setCustomKeybindingHandler('switch-applications',
|
||||||
Shell.KeyBindingMode.NORMAL,
|
Shell.KeyBindingMode.NORMAL,
|
||||||
Lang.bind(this, this._startAppSwitcher));
|
Lang.bind(this, this._startAppSwitcher));
|
||||||
@ -172,8 +208,9 @@ const WindowManager = new Lang.Class({
|
|||||||
this.addKeybinding('open-application-menu',
|
this.addKeybinding('open-application-menu',
|
||||||
new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }),
|
new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }),
|
||||||
Meta.KeyBindingFlags.NONE,
|
Meta.KeyBindingFlags.NONE,
|
||||||
Shell.KeyBindingMode.NORMAL,
|
Shell.KeyBindingMode.NORMAL |
|
||||||
Lang.bind(this, this._openAppMenu));
|
Shell.KeyBindingMode.TOPBAR_POPUP,
|
||||||
|
Lang.bind(this, this._toggleAppMenu));
|
||||||
|
|
||||||
Main.overview.connect('showing', Lang.bind(this, function() {
|
Main.overview.connect('showing', Lang.bind(this, function() {
|
||||||
for (let i = 0; i < this._dimmedWindows.length; i++)
|
for (let i = 0; i < this._dimmedWindows.length; i++)
|
||||||
@ -679,8 +716,8 @@ const WindowManager = new Lang.Class({
|
|||||||
Main.ctrlAltTabManager.popup(backwards, binding.get_name(), binding.get_mask());
|
Main.ctrlAltTabManager.popup(backwards, binding.get_name(), binding.get_mask());
|
||||||
},
|
},
|
||||||
|
|
||||||
_openAppMenu : function(display, screen, window, event, binding) {
|
_toggleAppMenu : function(display, screen, window, event, binding) {
|
||||||
Main.panel.openAppMenu();
|
Main.panel.toggleAppMenu();
|
||||||
},
|
},
|
||||||
|
|
||||||
_showWorkspaceSwitcher : function(display, screen, window, binding) {
|
_showWorkspaceSwitcher : function(display, screen, window, binding) {
|
||||||
|
@ -121,15 +121,33 @@ const WindowClone = new Lang.Class({
|
|||||||
return this._slot;
|
return this._slot;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// Find the actor just below us, respecting reparenting done
|
||||||
|
// by DND code
|
||||||
|
getActualStackAbove: function() {
|
||||||
|
if (this._stackAbove == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
if (this.inDrag || this._zooming) {
|
||||||
|
if (this._stackAbove._delegate)
|
||||||
|
return this._stackAbove._delegate.getActualStackAbove();
|
||||||
|
else
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
return this._stackAbove;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
setStackAbove: function (actor) {
|
setStackAbove: function (actor) {
|
||||||
this._stackAbove = actor;
|
this._stackAbove = actor;
|
||||||
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 () {
|
||||||
@ -908,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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1033,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
|
||||||
@ -1223,7 +1253,7 @@ const Workspace = new Lang.Class({
|
|||||||
if (!this._isMyWindow(win) || !this._isOverviewWindow(win))
|
if (!this._isMyWindow(win) || !this._isOverviewWindow(win))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
let [clone, overlay] = this._addWindowClone(win);
|
let [clone, overlay] = this._addWindowClone(win, false);
|
||||||
|
|
||||||
if (win._overviewHint) {
|
if (win._overviewHint) {
|
||||||
let x = win._overviewHint.x - this.actor.x;
|
let x = win._overviewHint.x - this.actor.x;
|
||||||
@ -1232,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;
|
||||||
@ -1388,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));
|
||||||
|
@ -62,12 +62,35 @@ const WindowClone = new Lang.Class({
|
|||||||
this.inDrag = false;
|
this.inDrag = false;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// Find the actor just below us, respecting reparenting done
|
||||||
|
// by DND code
|
||||||
|
getActualStackAbove: function() {
|
||||||
|
if (this._stackAbove == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
if (this.inDrag) {
|
||||||
|
if (this._stackAbove._delegate)
|
||||||
|
return this._stackAbove._delegate.getActualStackAbove();
|
||||||
|
else
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
return this._stackAbove;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
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 () {
|
||||||
@ -361,9 +384,8 @@ const WorkspaceThumbnail = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
destroy : function() {
|
destroy : function() {
|
||||||
|
if (this.actor)
|
||||||
this.actor.destroy();
|
this.actor.destroy();
|
||||||
this._bgManager.destroy();
|
|
||||||
this._bgManager = null;
|
|
||||||
},
|
},
|
||||||
|
|
||||||
workspaceRemoved : function() {
|
workspaceRemoved : function() {
|
||||||
@ -384,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;
|
||||||
},
|
},
|
||||||
@ -535,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;
|
||||||
@ -717,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,
|
||||||
@ -738,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;
|
||||||
@ -825,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;
|
||||||
@ -840,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());
|
||||||
}
|
}
|
||||||
|
@ -125,6 +125,12 @@
|
|||||||
<listitem><para>List possible modes and exit</para></listitem>
|
<listitem><para>List possible modes and exit</para></listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><option>--clutter-display=<replaceable>DISPLAY</replaceable></option></term>
|
||||||
|
|
||||||
|
<listitem><para>Clutter the option display (otherwise ignored)</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
</variablelist>
|
</variablelist>
|
||||||
|
|
||||||
</refsect1>
|
</refsect1>
|
||||||
|
@ -28,6 +28,7 @@ gu
|
|||||||
he
|
he
|
||||||
hi
|
hi
|
||||||
hu
|
hu
|
||||||
|
ia
|
||||||
id
|
id
|
||||||
it
|
it
|
||||||
ja
|
ja
|
||||||
@ -60,6 +61,7 @@ sr@latin
|
|||||||
sv
|
sv
|
||||||
ta
|
ta
|
||||||
te
|
te
|
||||||
|
tg
|
||||||
th
|
th
|
||||||
tr
|
tr
|
||||||
ug
|
ug
|
||||||
|
@ -55,6 +55,7 @@ js/ui/viewSelector.js
|
|||||||
js/ui/wanda.js
|
js/ui/wanda.js
|
||||||
js/ui/windowAttentionHandler.js
|
js/ui/windowAttentionHandler.js
|
||||||
src/calendar-server/evolution-calendar.desktop.in.in
|
src/calendar-server/evolution-calendar.desktop.in.in
|
||||||
|
# Please do not remove this file from POTFILES.in. Run "git submodule init && git submodule update" to get it.
|
||||||
src/gvc/gvc-mixer-control.c
|
src/gvc/gvc-mixer-control.c
|
||||||
src/main.c
|
src/main.c
|
||||||
src/shell-app.c
|
src/shell-app.c
|
||||||
|
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"
|
||||||
|
|
||||||
|
189
po/nb.po
189
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-05-13 09:47+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"
|
||||||
@ -332,43 +335,50 @@ msgstr "Utvidelse"
|
|||||||
msgid "Select an extension to configure using the combobox above."
|
msgid "Select an extension to configure using the combobox above."
|
||||||
msgstr "Velg en utvidelse som skal konfigureres med komboboksen over."
|
msgstr "Velg en utvidelse som skal konfigureres med komboboksen over."
|
||||||
|
|
||||||
#: ../js/gdm/loginDialog.js:405
|
#: ../js/gdm/loginDialog.js:371
|
||||||
msgid "Session…"
|
msgid "Session…"
|
||||||
msgstr "Økt …"
|
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:601
|
||||||
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:776 ../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:376
|
||||||
#: ../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:96
|
||||||
#: ../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:791
|
||||||
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:791
|
||||||
msgid "Next"
|
msgid "Next"
|
||||||
msgstr "Neste"
|
msgstr "Neste"
|
||||||
|
|
||||||
|
#. Translators: this message is shown below the username entry field
|
||||||
|
#. to clue the user in on how to login to the local network realm
|
||||||
|
#: ../js/gdm/loginDialog.js:888
|
||||||
|
#, c-format
|
||||||
|
msgid "(e.g., user or %s)"
|
||||||
|
msgstr "(f.eks. bruker eller %s)"
|
||||||
|
|
||||||
#. 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:892 ../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:1158
|
||||||
msgid "Login Window"
|
msgid "Login Window"
|
||||||
msgstr "Innloggingsvindu"
|
msgstr "Innloggingsvindu"
|
||||||
|
|
||||||
@ -377,8 +387,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 +396,53 @@ 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:247
|
||||||
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:364
|
||||||
msgid "(or swipe finger)"
|
msgid "(or swipe finger)"
|
||||||
msgstr "(eller dra finger)"
|
msgstr "(eller dra finger)"
|
||||||
|
|
||||||
#: ../js/gdm/util.js:324
|
#: ../js/misc/util.js:97
|
||||||
#, c-format
|
|
||||||
msgid "(e.g., user or %s)"
|
|
||||||
msgstr "(f.eks. bruker eller %s)"
|
|
||||||
|
|
||||||
#: ../js/misc/util.js:94
|
|
||||||
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 +456,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 +479,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 +581,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,20 +625,20 @@ 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"
|
||||||
|
|
||||||
#: ../js/ui/components/keyring.js:82 ../js/ui/components/polkitAgent.js:268
|
#: ../js/ui/components/keyring.js:88 ../js/ui/components/polkitAgent.js:275
|
||||||
msgid "Password:"
|
msgid "Password:"
|
||||||
msgstr "Passord:"
|
msgstr "Passord:"
|
||||||
|
|
||||||
#: ../js/ui/components/keyring.js:101
|
#: ../js/ui/components/keyring.js:107
|
||||||
msgid "Type again:"
|
msgid "Type again:"
|
||||||
msgstr "Skriv på nytt:"
|
msgstr "Skriv på nytt:"
|
||||||
|
|
||||||
@ -721,7 +726,7 @@ msgstr "Autentisering kreves"
|
|||||||
msgid "Administrator"
|
msgid "Administrator"
|
||||||
msgstr "Administrator"
|
msgstr "Administrator"
|
||||||
|
|
||||||
#: ../js/ui/components/polkitAgent.js:165
|
#: ../js/ui/components/polkitAgent.js:171
|
||||||
msgid "Authenticate"
|
msgid "Authenticate"
|
||||||
msgstr "Autentiser"
|
msgstr "Autentiser"
|
||||||
|
|
||||||
@ -729,12 +734,12 @@ msgstr "Autentiser"
|
|||||||
#. * requested authentication was not gained; this can happen
|
#. * requested authentication was not gained; this can happen
|
||||||
#. * because of an authentication error (like invalid password),
|
#. * because of an authentication error (like invalid password),
|
||||||
#. * for instance.
|
#. * for instance.
|
||||||
#: ../js/ui/components/polkitAgent.js:256 ../js/ui/shellMountOperation.js:383
|
#: ../js/ui/components/polkitAgent.js:263 ../js/ui/shellMountOperation.js:383
|
||||||
msgid "Sorry, that didn't work. Please try again."
|
msgid "Sorry, that didn't work. Please try again."
|
||||||
msgstr "Beklager, det virket ikke. Vennligst prøv igjen."
|
msgstr "Beklager, det virket ikke. Vennligst prøv igjen."
|
||||||
|
|
||||||
#. 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:47
|
||||||
#, no-c-format
|
#, no-c-format
|
||||||
msgid "Screencast from %d %t"
|
msgid "Screencast from %d %t"
|
||||||
msgstr "Skjermvideo fra %d %t"
|
msgstr "Skjermvideo fra %d %t"
|
||||||
@ -1000,14 +1005,14 @@ msgstr "Åpne kalender"
|
|||||||
msgid "Open Clocks"
|
msgid "Open Clocks"
|
||||||
msgstr "Åpne Klokker"
|
msgstr "Åpne Klokker"
|
||||||
|
|
||||||
#: ../js/ui/dateMenu.js:105
|
#: ../js/ui/dateMenu.js:104
|
||||||
msgid "Date & Time Settings"
|
msgid "Date & Time Settings"
|
||||||
msgstr "Innstillinger for dato og klokkeslett"
|
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:216
|
||||||
msgid "%A %B %e, %Y"
|
msgid "%A %B %e, %Y"
|
||||||
msgstr "%a %e %B, %Y"
|
msgstr "%a %e %B, %Y"
|
||||||
|
|
||||||
@ -1181,15 +1186,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:1785
|
||||||
msgid "Message Tray"
|
msgid "Message Tray"
|
||||||
msgstr "Meldingstrau"
|
msgstr "Meldingstrau"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:2864
|
#: ../js/ui/messageTray.js:2813
|
||||||
msgid "System Information"
|
msgid "System Information"
|
||||||
msgstr "Systeminformasjon"
|
msgstr "Systeminformasjon"
|
||||||
|
|
||||||
@ -1198,14 +1203,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 +1222,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:635
|
||||||
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:686
|
||||||
msgid "Activities"
|
msgid "Activities"
|
||||||
msgstr "Aktiviteter"
|
msgstr "Aktiviteter"
|
||||||
|
|
||||||
#: ../js/ui/panel.js:983
|
#: ../js/ui/panel.js:982
|
||||||
msgid "Top Bar"
|
msgid "Top Bar"
|
||||||
msgstr "Topp-panel"
|
msgstr "Topp-panel"
|
||||||
|
|
||||||
@ -1244,32 +1249,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:74
|
||||||
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:110
|
||||||
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:641
|
||||||
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 +1285,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:762 ../js/ui/screenShield.js:1198
|
||||||
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:763 ../js/ui/screenShield.js:1199
|
||||||
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 +1309,11 @@ msgstr "Kopier"
|
|||||||
msgid "Paste"
|
msgid "Paste"
|
||||||
msgstr "Lim inn"
|
msgstr "Lim inn"
|
||||||
|
|
||||||
#: ../js/ui/shellEntry.js:105
|
#: ../js/ui/shellEntry.js:101
|
||||||
msgid "Show Text"
|
msgid "Show Text"
|
||||||
msgstr "Vis tekst"
|
msgstr "Vis tekst"
|
||||||
|
|
||||||
#: ../js/ui/shellEntry.js:107
|
#: ../js/ui/shellEntry.js:103
|
||||||
msgid "Hide Text"
|
msgid "Hide Text"
|
||||||
msgstr "Skjul tekst"
|
msgstr "Skjul tekst"
|
||||||
|
|
||||||
@ -1320,7 +1325,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:109
|
||||||
msgid "Unlock"
|
msgid "Unlock"
|
||||||
msgstr "Lås opp"
|
msgstr "Lås opp"
|
||||||
|
|
||||||
@ -1611,7 +1616,7 @@ msgstr "Tilkobling feilet"
|
|||||||
msgid "Activation of network connection failed"
|
msgid "Activation of network connection failed"
|
||||||
msgstr "Aktivering av nettverkstilkobling feilet"
|
msgstr "Aktivering av nettverkstilkobling feilet"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:2276
|
#: ../js/ui/status/network.js:2282
|
||||||
msgid "Networking is disabled"
|
msgid "Networking is disabled"
|
||||||
msgstr "Nettverk er slått av"
|
msgstr "Nettverk er slått av"
|
||||||
|
|
||||||
@ -1725,11 +1730,11 @@ msgstr "Volum"
|
|||||||
msgid "Microphone"
|
msgid "Microphone"
|
||||||
msgstr "Mikrofon"
|
msgstr "Mikrofon"
|
||||||
|
|
||||||
#: ../js/ui/unlockDialog.js:151
|
#: ../js/ui/unlockDialog.js:120
|
||||||
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:141
|
||||||
msgid "Unlock Window"
|
msgid "Unlock Window"
|
||||||
msgstr "Lås opp vindu"
|
msgstr "Lås opp vindu"
|
||||||
|
|
||||||
@ -1757,27 +1762,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 +1791,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 +1821,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 +1830,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"
|
||||||
@ -1880,11 +1887,11 @@ msgstr "Vis mulige modi"
|
|||||||
msgid "Failed to launch '%s'"
|
msgid "Failed to launch '%s'"
|
||||||
msgstr "Klarte ikke å starte «%s»"
|
msgstr "Klarte ikke å starte «%s»"
|
||||||
|
|
||||||
#: ../src/shell-keyring-prompt.c:708
|
#: ../src/shell-keyring-prompt.c:714
|
||||||
msgid "Passwords do not match."
|
msgid "Passwords do not match."
|
||||||
msgstr "Passordene er ikke like."
|
msgstr "Passordene er ikke like."
|
||||||
|
|
||||||
#: ../src/shell-keyring-prompt.c:716
|
#: ../src/shell-keyring-prompt.c:722
|
||||||
msgid "Password cannot be blank"
|
msgid "Password cannot be blank"
|
||||||
msgstr "Passordet kan ikke være tomt"
|
msgstr "Passordet kan ikke være tomt"
|
||||||
|
|
||||||
|
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»"
|
||||||
|
615
po/sr@latin.po
615
po/sr@latin.po
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user