Compare commits
370 Commits
Author | SHA1 | Date | |
---|---|---|---|
d18ec919dd | |||
da3e5f9746 | |||
594a227bc1 | |||
7277744dc0 | |||
e4718d3f7f | |||
5afd04781c | |||
a0868bac6b | |||
265b1f0292 | |||
2c12f3a509 | |||
0141a2be9e | |||
6660342d2f | |||
92667e3b7f | |||
a0632e3e02 | |||
c6d2946ce6 | |||
86304418a9 | |||
2f228e21da | |||
8521556723 | |||
9f5ac0e6d5 | |||
cc38dd1d49 | |||
66a5c0c094 | |||
8e802fd32f | |||
e87656af16 | |||
8327dbd611 | |||
e1b575dddc | |||
018025dada | |||
49fe0335ee | |||
bbe417121c | |||
0068098996 | |||
36d9cc329d | |||
1f2e53dd15 | |||
048a14f1f3 | |||
fd6ef482f0 | |||
d8926b96e2 | |||
934ec3c3fe | |||
216e996f66 | |||
a4b5583995 | |||
b00a1d6b7f | |||
d24abab4a8 | |||
23a9fb0314 | |||
5e26d0c90c | |||
aeb971c33a | |||
8897385714 | |||
e2a17fa8b4 | |||
14da6b68dc | |||
9a01a7ae07 | |||
c3bf4a325d | |||
2d71456944 | |||
9934529a0b | |||
ef6e8f5bb2 | |||
2ce7a3baa6 | |||
c0d224e200 | |||
4b2e5a4375 | |||
fbecbca9a0 | |||
c312891774 | |||
486d4dfb68 | |||
169b00aa64 | |||
f2c1a416bf | |||
28ef88911c | |||
e2161f385d | |||
f0c0687b43 | |||
e76e874093 | |||
d2a0cfb6d4 | |||
e5270cb6ec | |||
ee360d8749 | |||
bb4e6fd2da | |||
651600ac19 | |||
67f4cf3cff | |||
9b76e9f90a | |||
ba919b9c6a | |||
4da2862f8f | |||
b1de1ada25 | |||
1002bbc212 | |||
15e42c4d5f | |||
bb61dd4b44 | |||
2d4ba30ba2 | |||
54f46e8486 | |||
0ee762263a | |||
826682cc07 | |||
8b6e566728 | |||
e4a20e51e2 | |||
173ff91640 | |||
438d0d4feb | |||
8f275a79a9 | |||
a504dd866b | |||
dfc51ef243 | |||
a25d2dc256 | |||
b2ae945cf2 | |||
681861c8c7 | |||
6d40cb98e7 | |||
81d7ab1e49 | |||
2212b4ea71 | |||
5650355da5 | |||
20a9206919 | |||
3533b2a8bc | |||
b8d2238ff0 | |||
96c8870820 | |||
177e9316b0 | |||
27b7e6ef4b | |||
32d686d90f | |||
f812e9be7d | |||
c7185d597b | |||
6380526c12 | |||
fa4f6c4561 | |||
a5b7eaec1a | |||
d165295c83 | |||
5f5874f8ca | |||
ab5e950cd0 | |||
3e760f5ca6 | |||
9e8a24467e | |||
d84d1f79a0 | |||
024ec36cc0 | |||
51b1258866 | |||
ff1b76f4c7 | |||
0389ae5299 | |||
35ab60b712 | |||
0ea15f70c3 | |||
f1c7a36dde | |||
cc9093f118 | |||
775a2ea051 | |||
cb3d5c2b51 | |||
dc1c31d704 | |||
777616d8b0 | |||
8aeebbbf78 | |||
dade67ba5a | |||
921a9071a1 | |||
90a08ba0b6 | |||
4e52ed9df7 | |||
01b51cd081 | |||
d1efc274e5 | |||
d48d787c1e | |||
e4ad31a5dd | |||
b61cb92053 | |||
e72450f5d8 | |||
d9211b8e20 | |||
c16b83fc3e | |||
8b5a44e119 | |||
b0be6b8678 | |||
bb73547acf | |||
d8fc58e174 | |||
b9fdffbb62 | |||
e48a83fcfc | |||
4c7eae7ef2 | |||
75745fc23f | |||
82479db084 | |||
9becb3985d | |||
4cb7df67b7 | |||
e0a12f55b9 | |||
b18240370d | |||
4253df6463 | |||
d8b43865a2 | |||
3eb8b9ef68 | |||
f96077bd0f | |||
741846d1ff | |||
f36d7bd078 | |||
bd51c92d65 | |||
2aed6ade79 | |||
83e5ea4827 | |||
5915348396 | |||
567dc70c9b | |||
8323891294 | |||
5bf8695295 | |||
7012437929 | |||
83ad98d640 | |||
1816f763d2 | |||
1a01f07b2c | |||
23d48fb334 | |||
dada0420b1 | |||
17a336c795 | |||
8c347965d7 | |||
e1816cd228 | |||
3614da6845 | |||
8aa1765f24 | |||
8eb0782f25 | |||
5f6aba7f4b | |||
986b14fb1b | |||
7c03b88b74 | |||
1f277ebcb9 | |||
8c54bc68e0 | |||
6e39be5b19 | |||
cf71ea016f | |||
4affa5528a | |||
8536f9312c | |||
a0e8456cb5 | |||
77074b5646 | |||
cd68ed8297 | |||
eaef067b3e | |||
e23dfe533d | |||
39ecd3b5a8 | |||
f5e07fbeba | |||
ef3077a7fe | |||
4ff489d24b | |||
0ebba112d7 | |||
e7fa83ea1a | |||
b58f08bda1 | |||
3ec764d584 | |||
2c6443fd29 | |||
bb2d7f7e7e | |||
39a57eea4d | |||
d8505934e8 | |||
8f424e7d96 | |||
39fd7b9a05 | |||
60f6715228 | |||
1c36ade125 | |||
ebf132770e | |||
8f902a9379 | |||
6bb905895c | |||
99af774c98 | |||
42a214aa24 | |||
6c3dd2d4e0 | |||
eadc39356f | |||
8eb236ae41 | |||
707cc9e315 | |||
fab25e18da | |||
e01076a48b | |||
38a2f26e44 | |||
88cde2a97d | |||
b4bfe9a0c6 | |||
55df98298a | |||
a101f46544 | |||
afc2253e5d | |||
db4076b697 | |||
313ee70cf7 | |||
61c5f259ec | |||
874cf0ba15 | |||
f1370ef578 | |||
8f136e46d4 | |||
8a732d3c13 | |||
ad3e24e0bb | |||
f85d68aa70 | |||
6c5861ab3d | |||
be52ad999f | |||
5a47ad837b | |||
11e4f5c094 | |||
79c04c93e4 | |||
f015f4574f | |||
3b914ed4f7 | |||
bb7a99968f | |||
fdd6fc976c | |||
c60eb857bf | |||
147d192fa3 | |||
39b823dcec | |||
99ef24ba44 | |||
e34e183282 | |||
4ab275080c | |||
5a3b9a034e | |||
08d753fd29 | |||
7d058901ef | |||
0023059fa3 | |||
58da16c786 | |||
4a38359635 | |||
714bc5f103 | |||
d56411729b | |||
b3a96f2f6c | |||
5f5dc8327f | |||
c9bcb411fc | |||
86c6716786 | |||
46fe11a541 | |||
c2104dbf85 | |||
e23a03d639 | |||
ad92584b72 | |||
bf57397cb8 | |||
19cef181ad | |||
1a255d988b | |||
890a809022 | |||
530e8273ff | |||
62e9978c52 | |||
8d7db75fc5 | |||
6a504f5c62 | |||
b376a5dcdd | |||
dfd00d5483 | |||
13dbc3f15d | |||
22ac75556c | |||
8e665da103 | |||
7846fdbd2c | |||
99d61062e1 | |||
b37496d086 | |||
db2b83edf3 | |||
971179a10a | |||
ea855442be | |||
0a70909f10 | |||
abc43c9ece | |||
5bdaffd36e | |||
4660015bb1 | |||
634e5ff9e0 | |||
c79d24b60e | |||
509464fd61 | |||
d5d9f6283d | |||
560835dd0c | |||
8e40aa96ba | |||
4e7261532c | |||
3836cab769 | |||
79fc1a2383 | |||
c749facedb | |||
83648cf7d0 | |||
16914ddda3 | |||
167610c580 | |||
945caed602 | |||
7d2690ac5a | |||
a23f87de5e | |||
d6bb3de2fd | |||
c02b66bad1 | |||
880b240ecb | |||
078aafb10c | |||
4e7000988d | |||
d6d1fec4bd | |||
27318a8967 | |||
07664e7d2f | |||
6da0ebe35f | |||
af4e84383d | |||
1c1f63a7d7 | |||
8dab692f93 | |||
4de20272e5 | |||
ad75739fc5 | |||
1c5b73bfdf | |||
c045ab6171 | |||
1d23539576 | |||
71ae7e69c5 | |||
4c91db4661 | |||
09c38fda51 | |||
2b65d24ac1 | |||
2d3aff3f04 | |||
01056d72ab | |||
39d59b6eb6 | |||
cd5318baa7 | |||
67eade6482 | |||
30c6e541f1 | |||
e8a023a78f | |||
87ae45a12f | |||
ec66b32df6 | |||
815eaa1d4d | |||
8ecf901dd4 | |||
53b3d2a6c2 | |||
a3c1c09cc1 | |||
71f59de797 | |||
8032e672e9 | |||
f6c84d6185 | |||
e189a34fc0 | |||
aedc2428be | |||
faf00036e2 | |||
d903e831f3 | |||
4eff643d59 | |||
8c72c93aae | |||
d6eea0e380 | |||
1ef5281c55 | |||
77413feb57 | |||
830b4559c0 | |||
4a709792cd | |||
f2d0fcabd1 | |||
9c9da8a176 | |||
b81be42d08 | |||
485cd0f278 | |||
08d2e617e1 | |||
06586eb95d | |||
b00f122fcf | |||
11b3ed276b | |||
dfd887066f | |||
025985eb07 | |||
65a5baa902 | |||
e404369c0f | |||
88c7039ebe | |||
efc0ec4740 | |||
7d1382afd3 | |||
e850d9e29b | |||
464f552dd2 | |||
053e54f944 | |||
f84addcadc | |||
de27e4e1b2 | |||
33c5f5726e | |||
26330fde7e | |||
39cfe488a4 |
1
.gitignore
vendored
1
.gitignore
vendored
@ -32,6 +32,7 @@ data/org.gnome.shell.evolution.calendar.gschema.xml
|
||||
data/org.gnome.shell.evolution.calendar.gschema.valid
|
||||
data/org.gnome.Shell.PortalHelper.desktop
|
||||
data/org.gnome.Shell.PortalHelper.service
|
||||
data/theme/.sass-cache
|
||||
docs/reference/*/*.args
|
||||
docs/reference/*/*.bak
|
||||
docs/reference/*/*.hierarchy
|
||||
|
2
.gitmodules
vendored
2
.gitmodules
vendored
@ -3,4 +3,4 @@
|
||||
url = git://git.gnome.org/libgnome-volume-control
|
||||
[submodule "data/theme/gnome-shell-sass"]
|
||||
path = data/theme/gnome-shell-sass
|
||||
url = https://git.gnome.org/browse/gnome-shell-sass
|
||||
url = git://git.gnome.org/gnome-shell-sass
|
||||
|
146
NEWS
146
NEWS
@ -1,3 +1,149 @@
|
||||
3.16.1
|
||||
======
|
||||
* gdm: Move long session chooser menus to the side [Florian; #734352]
|
||||
* Work around background corruption with NVIDIA driver [Rui; #739178]
|
||||
* Don't allow move-to-workspace for always-sticky windows [Florian; #746782]
|
||||
* Allow switching workspaces with PgUp/PgDown in overview [Devyani; #742581]
|
||||
* Bump time PAM messages are displayed [Sarvjeet; #720885]
|
||||
* Fix "stutter" when moving window past the last workspace [Shivam; #712778]
|
||||
* Fix blurred text on login screen [Clément; #746912]
|
||||
* keyboard: Restore whole MRU list after password mode [Rui; #746605]
|
||||
* Pass event timestamps when activating remote actions [Owen; #747323]
|
||||
* Fix hung login screen when password is typed too quickly [Shivam; #737586]
|
||||
* Make on-screen keyboard work for shell chrome on wayland [Rui; #747274]
|
||||
* Implement reexec_self() for FreeBSD [Ting-Wei; #747788]
|
||||
* Allow to dismiss resident notifications [Florian; #746860]
|
||||
* Temporarily reveal legacy tray when icons are added [Florian; #746025]
|
||||
* Make concealed tray smaller to minimize overlap with apps [Florian; #746787]
|
||||
* Misc. bug fixes [Florian, Rui, Giovanni; #746323, #746579, #746902, #746364,
|
||||
#746509, #747636]
|
||||
|
||||
Contributors:
|
||||
Sarvjeet, Giovanni Campagna, Adel Gadllah, Clément Guérin, Devyani Kota,
|
||||
Ting-Wei Lan, Rui Matos, Shivam Mishra, Florian Müllner, Owen W. Taylor
|
||||
|
||||
Translations:
|
||||
Khaled Hosny [ar], Dušan Kazik [sk], Yuri Myasoedov [ru], Stas Solovey [ru],
|
||||
Hannie Dumoleyn [nl], Rūdolfs Mazurs [lv]
|
||||
|
||||
3.16.0
|
||||
======
|
||||
* Revert erroneous login dialog changes [Ray; #740142]
|
||||
* Improve accessibility of legacy tray [Florian; #746487]
|
||||
* Fix legacy status icons leaking into other monitors [Florian; #745824]
|
||||
|
||||
Contributors:
|
||||
Florian Müllner, Ray Strode
|
||||
|
||||
Translations:
|
||||
Daniel Martinez [an], Sebastian Rasmussen [sv], Fran Dieguez [gl],
|
||||
Andika Triwidada [id], Jordi Mas [ca], Kjartan Maraas [nb],
|
||||
Inaki Larranaga Murgoitio [eu], Muhammet Kara [tr], Khaled Hosny [ar],
|
||||
Bernd Homuth [de], Jiro Matsuzawa [ja]
|
||||
|
||||
3.15.92
|
||||
=======
|
||||
* gdm: Fix user list accessibility [Florian; #729603]
|
||||
* Handle multiline questions in mount operations [Ross; #745713]
|
||||
* Improve classic theme [Jakub; #745686, #745687]
|
||||
* Fix ordering of calendar events [Florian; #745988]
|
||||
* Pick first input source for new windows when per-window [Rui; #746037]
|
||||
* networkAgent: Show a notification for non-user-initiated password requests
|
||||
[Giovanni; #660293]
|
||||
* Fix dismissing calendar events [Florian; #744927]
|
||||
* Add legacy tray to ctrl-alt-tab popup [Florian; #746022]
|
||||
* Manage on-screen-keyboard visibility in gnome-shell [Carlos; #745977]
|
||||
* Add pointer barriers to legacy tray [Cosimo; #746026]
|
||||
* Use fallback when app icon cannot be resolved [Cosimo; #746219]
|
||||
* Fix handling of removed smartcard at startup [Ray; #740143]
|
||||
* gdm: Don't pick a random session for the user [Jasper; #740142]
|
||||
* Make menu selection behavior consistent with GTK [Florian; #745246]
|
||||
* gdm: Fix empty user list on user switching [Ray; #719418]
|
||||
* Misc bug fixes [Florian, Giovanni, Clément, Rui; #745666, #746019, #745861,
|
||||
#746027, #746223, #737502, #746343, #746288]
|
||||
|
||||
Contributors:
|
||||
Giovanni Campagna, Cosimo Cecchi, Piotr Drąg, Adel Gadllah, Carlos Garnacho,
|
||||
Clément Guérin, Ross Lagerwall, Rui Matos, Florian Müllner, Jakub Steiner,
|
||||
Jasper St. Pierre, Ray Strode
|
||||
|
||||
Translations:
|
||||
Piotr Drąg [pl], Changwoo Ryu [ko], Milo Casagrande [it],
|
||||
Baurzhan Muftakhidinov [kk], Мирослав Николић [sr, sr@latin], Balázs Úr [hu],
|
||||
IWAI, Masaharu [ja], Daniel Korostil [uk], Aurimas Černius [lt],
|
||||
Matej Urbančič [sl], Daniel Mustieles [es], Kjartan Maraas [nb],
|
||||
Victor Ibragimov [tg], Claude Paroz [fr], Jordi Mas [ca], Bernd Homuth [de],
|
||||
Muhammet Kara [tr], Frédéric Péters [fr], Jiri Grönroos [fi],
|
||||
Alexander Shopov [bg], Stas Solovey [ru], Trần Ngọc Quân [vi],
|
||||
Samir Ribic [bs], Dušan Kazik [sk], Enrico Nicoletto [pt_BR],
|
||||
Marek Černocký [cs], A S Alam [pa], Ask Hjorth Larsen [da],
|
||||
Tom Tryfonidis [el], Alexandre Franke [fr], Yosef Or Boczko [he],
|
||||
Chao-Hsiung Liao [zh_TW]
|
||||
|
||||
3.15.91
|
||||
=======
|
||||
* Don't disable all shortcuts while non-panel menus are open [Florian; #745039]
|
||||
* Do not wake up the screen for disabled notifications [Florian; #744114]
|
||||
* Add unminimize animation [Florian; #702662]
|
||||
* Change default shortcut for viewing notifications [Florian; #687986]
|
||||
* Add shortcut to dismiss notifications from list [Florian; #745279]
|
||||
* Use Polari instead of Empathy for IRC conversations [Giovanni; #745431]
|
||||
* Add a hideable bottom tray for legacy status icons [Florian; #745162]
|
||||
* Improve accessibility of calendar/message list [Florian; #706903, #745393]
|
||||
* Fix window thumbnail scaling in overview [Sebastian; #744883]
|
||||
* Stop handling non-chat notifications for Empathy [Giovanni; #745503]
|
||||
* Fix mouse interaction with ibus candidate window [Rui; #745167, #745245]
|
||||
* Misc bug fixes and cleanups [Giovanni, Florian, Miguel, Cosimo, Jakub,
|
||||
Michele, Raul, Matthias, Rui; #677412, #744880, #744900, #744894, #744907,
|
||||
#745061, #741111, #744912, #745175, #745246, #744959, #744575, #745570,
|
||||
#652742, #659187, #745412, #745521, #745521, #741665, #745574, #745627,
|
||||
#745494, #745111, #745132, #745110]
|
||||
|
||||
Contributors:
|
||||
Michele, Giovanni Campagna, Cosimo Cecchi, Matthias Clasen,
|
||||
Raul Gutierrez Segales, Sebastian Keller, David Liang, Rui Matos,
|
||||
Florian Müllner, Yosef Or Boczko, Jakub Steiner, Jasper St. Pierre,
|
||||
Rico Tzschichholz, Miguel Vaello Martínez
|
||||
|
||||
Translations:
|
||||
Dušan Kazik [sk], Chao-Hsiung Liao [zh_TW], Muhammet Kara [tr],
|
||||
Balázs Úr [hu], Daniel Mustieles [es], Frédéric Péters [fr],
|
||||
Rafael Ferreira [pt_BR], Aurimas Černius [lt], Milo Casagrande [it],
|
||||
Yosef Or Boczko [he], Stas Solovey [ru], Baurzhan Muftakhidinov [kk],
|
||||
Daniel Korostil [uk], Fran Dieguez [gl], Kjartan Maraas [nb],
|
||||
Tom Tryfonidis [el], Cheng-Chia Tseng [zh_TW], Friedel Wolff [af],
|
||||
Alexandre Franke [fr], Efstathios Iosifidis [el], Aron Xu [zh_CN],
|
||||
Marek Černocký [cs], Enrico Nicoletto [pt_BR]
|
||||
|
||||
3.15.90
|
||||
=======
|
||||
* gdm: Fix reactivity of first user in user list [Ray; #743370]
|
||||
* Prevent DND to dash when favorites are locked down [David; #741325]
|
||||
* Prevent DND in app picker when favorites are locked down [Murray; #741325]
|
||||
* Implement Display panel's OSD monitor labels in the shell [Rui; #743744]
|
||||
* Remove GSystem dependency [Colin; #744457]
|
||||
* Do not duplicate "New Window" action in dash [Florian; #744446]
|
||||
* Fix 'draw-cursor' option of screen recorder [Alexander; #744599]
|
||||
* Fix screencast timestamps [Sebastian; #744642]
|
||||
* Allow keybindings for switching to VT8-VT12 [Ray; #744800]
|
||||
* Implement notification redesign [Florian; #744498, #744815, #744817, #744850]
|
||||
* Fix struts computation of chrome on non-primary monitors [Sylvain; #744183]
|
||||
* Visual refresh based on GTK+ theme redesign [Jakub, Carlos; #737785, #744680]
|
||||
* Misc. bug fixes and cleanups [Ray, Bastien, Cosimo, Rui, Florian; #743371,
|
||||
#736182, #744013, #743993, #744665]
|
||||
|
||||
Contributors:
|
||||
Cosimo Cecchi, Murray Cumming, Sebastian Dröge, David King,
|
||||
Alexander Larsson, Rui Matos, Florian Müllner, Bastien Nocera,
|
||||
Sylvain Pasche, Carlos Soriano, Jakub Steiner, Jasper St. Pierre, Ray Strode,
|
||||
Colin Walters
|
||||
|
||||
Translations:
|
||||
Daniel Martinez [an], Sveinn í Felli [is], GNOME Translation Robot [de],
|
||||
Yosef Or Boczko [he], Kristjan SCHMIDT [eo], Dušan Kazik [sk],
|
||||
Andika Triwidada [id], Marek Černocký [cs], Muhammet Kara [tr],
|
||||
Matej Urbančič [sl], Milo Casagrande [it], Anders Jonsson [sv]
|
||||
|
||||
3.15.4
|
||||
======
|
||||
* Add mode parameter to AcceleratorActivated signal [Florian; #711682]
|
||||
|
@ -4,8 +4,6 @@
|
||||
srcdir=`dirname $0`
|
||||
test -z "$srcdir" && srcdir=.
|
||||
|
||||
PKG_NAME="gnome-shell"
|
||||
|
||||
(test -f $srcdir/configure.ac \
|
||||
&& test -d $srcdir/src) || {
|
||||
echo -n "**Error**: Directory "\`$srcdir\'" does not look like the"
|
||||
@ -26,4 +24,4 @@ which gnome-autogen.sh || {
|
||||
echo "your OS vendor's package manager)."
|
||||
exit 1
|
||||
}
|
||||
USE_GNOME2_MACROS=1 USE_COMMON_DOC_BUILD=yes . gnome-autogen.sh
|
||||
. gnome-autogen.sh
|
||||
|
@ -1,5 +1,5 @@
|
||||
AC_PREREQ(2.63)
|
||||
AC_INIT([gnome-shell],[3.15.4],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
|
||||
AC_INIT([gnome-shell],[3.16.1],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
|
||||
|
||||
AC_CONFIG_HEADERS([config.h])
|
||||
AC_CONFIG_SRCDIR([src/shell-global.c])
|
||||
@ -73,10 +73,10 @@ AS_IF([test x$enable_systemd != xno], [
|
||||
|
||||
AC_MSG_RESULT($enable_systemd)
|
||||
|
||||
CLUTTER_MIN_VERSION=1.15.90
|
||||
CLUTTER_MIN_VERSION=1.21.5
|
||||
GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1
|
||||
GJS_MIN_VERSION=1.39.0
|
||||
MUTTER_MIN_VERSION=3.15.4
|
||||
MUTTER_MIN_VERSION=3.16.1
|
||||
GTK_MIN_VERSION=3.15.0
|
||||
GIO_MIN_VERSION=2.37.0
|
||||
LIBECAL_MIN_VERSION=3.5.3
|
||||
@ -119,7 +119,6 @@ PKG_CHECK_MODULES(SHELL_HOTPLUG_SNIFFER, gio-2.0 gdk-pixbuf-2.0)
|
||||
PKG_CHECK_MODULES(TRAY, gtk+-3.0)
|
||||
PKG_CHECK_MODULES(GVC, libpulse >= $PULSE_MIN_VERS libpulse-mainloop-glib gobject-2.0)
|
||||
PKG_CHECK_MODULES(DESKTOP_SCHEMAS, gsettings-desktop-schemas >= 3.13.1)
|
||||
PKG_CHECK_MODULES(CARIBOU, caribou-1.0 >= 0.4.8)
|
||||
|
||||
AC_ARG_ENABLE(browser-plugin,
|
||||
[AS_HELP_STRING([--enable-browser-plugin],
|
||||
@ -242,6 +241,8 @@ if test -z "$GDBUS_CODEGEN"; then
|
||||
AC_MSG_ERROR([gdbus-codegen not found])
|
||||
fi
|
||||
|
||||
AC_PATH_PROG([SASS],[sass],[])
|
||||
|
||||
AC_CONFIG_FILES([
|
||||
Makefile
|
||||
data/Makefile
|
||||
|
@ -6,7 +6,7 @@
|
||||
package="gnome-shell">
|
||||
|
||||
<KeyListEntry name="toggle-message-tray"
|
||||
_description="Show the message tray"/>
|
||||
_description="Show the notification list"/>
|
||||
|
||||
<KeyListEntry name="focus-active-notification"
|
||||
_description="Focus the active notification"/>
|
||||
|
@ -1,4 +1,5 @@
|
||||
CLEANFILES =
|
||||
NULL =
|
||||
|
||||
desktopdir=$(datadir)/applications
|
||||
desktop_DATA = gnome-shell.desktop gnome-shell-wayland.desktop gnome-shell-extension-prefs.desktop
|
||||
@ -11,7 +12,8 @@ service_DATA = org.gnome.Shell.PortalHelper.service
|
||||
|
||||
CLEANFILES += \
|
||||
org.gnome.Shell.PortalHelper.service \
|
||||
org.gnome.Shell.PortalHelper.desktop
|
||||
org.gnome.Shell.PortalHelper.desktop \
|
||||
$(NULL)
|
||||
|
||||
endif
|
||||
|
||||
@ -33,7 +35,36 @@ introspection_DATA = \
|
||||
org.gnome.Shell.Screencast.xml \
|
||||
org.gnome.Shell.Screenshot.xml \
|
||||
org.gnome.ShellSearchProvider.xml \
|
||||
org.gnome.ShellSearchProvider2.xml
|
||||
org.gnome.ShellSearchProvider2.xml \
|
||||
$(NULL)
|
||||
|
||||
theme_sources = \
|
||||
theme/gnome-shell-high-contrast.scss \
|
||||
theme/gnome-shell.scss \
|
||||
theme/gnome-shell-sass/_colors.scss \
|
||||
theme/gnome-shell-sass/_common.scss \
|
||||
theme/gnome-shell-sass/_drawing.scss \
|
||||
theme/gnome-shell-sass/_high-contrast-colors.scss \
|
||||
$(NULL)
|
||||
|
||||
dist_theme_files = \
|
||||
$(theme_sources) \
|
||||
theme/Gemfile \
|
||||
theme/HACKING \
|
||||
theme/README \
|
||||
theme/gnome-shell-sass/COPYING \
|
||||
theme/gnome-shell-sass/HACKING \
|
||||
theme/gnome-shell-sass/NEWS \
|
||||
theme/gnome-shell-sass/README \
|
||||
theme/gnome-shell-sass/gnome-shell-sass.doap \
|
||||
theme/parse-sass.sh \
|
||||
$(NULL)
|
||||
|
||||
%.css: %.scss $(theme_sources)
|
||||
@if test -n "$(SASS)"; then \
|
||||
if $(AM_V_P); then PS4= set -x; else echo " GEN $@"; fi; \
|
||||
$(SASS) --sourcemap=none -f -q --update $<; \
|
||||
fi
|
||||
|
||||
resource_files = $(shell $(GLIB_COMPILE_RESOURCES) --sourcedir=$(srcdir)/theme --generate-dependencies $(srcdir)/gnome-shell-theme.gresource.xml)
|
||||
gnome-shell-theme.gresource: gnome-shell-theme.gresource.xml $(resource_files)
|
||||
@ -80,12 +111,14 @@ EXTRA_DIST = \
|
||||
$(menu_DATA) \
|
||||
$(convert_DATA) \
|
||||
$(keys_in_files) \
|
||||
$(dist_theme_files) \
|
||||
perf-background.xml.in \
|
||||
org.gnome.Shell.PortalHelper.desktop.in \
|
||||
org.gnome.Shell.PortalHelper.service.in \
|
||||
org.gnome.shell.gschema.xml.in.in \
|
||||
gnome-shell-theme.gresource.xml \
|
||||
$(resource_files)
|
||||
$(resource_files) \
|
||||
$(NULL)
|
||||
|
||||
CLEANFILES += \
|
||||
gnome-shell.desktop.in \
|
||||
@ -98,4 +131,5 @@ CLEANFILES += \
|
||||
gschemas.compiled \
|
||||
org.gnome.shell.gschema.valid \
|
||||
org.gnome.shell.gschema.xml.in \
|
||||
gnome-shell-theme.gresource
|
||||
gnome-shell-theme.gresource \
|
||||
$(NULL)
|
||||
|
@ -19,6 +19,8 @@
|
||||
<file>gnome-shell-high-contrast.css</file>
|
||||
<file>logged-in-indicator.svg</file>
|
||||
<file>more-results.svg</file>
|
||||
<file>no-events.svg</file>
|
||||
<file>no-notifications.svg</file>
|
||||
<file>noise-texture.png</file>
|
||||
<file>page-indicator-active.svg</file>
|
||||
<file>page-indicator-inactive.svg</file>
|
||||
|
@ -112,10 +112,10 @@
|
||||
</_description>
|
||||
</key>
|
||||
<key name="toggle-message-tray" type="as">
|
||||
<default>["<Super>m"]</default>
|
||||
<_summary>Keybinding to toggle the visibility of the message tray</_summary>
|
||||
<default>["<Super>v","<Super>m"]</default>
|
||||
<_summary>Keybinding to toggle the visibility of the notification list</_summary>
|
||||
<_description>
|
||||
Keybinding to toggle the visibility of the message tray.
|
||||
Keybinding to toggle the visibility of the notification list.
|
||||
</_description>
|
||||
</key>
|
||||
<key name="focus-active-notification" type="as">
|
||||
|
1
data/theme/Gemfile
Normal file
1
data/theme/Gemfile
Normal file
@ -0,0 +1 @@
|
||||
gem "sass", "~> 3.4.0"
|
36
data/theme/README
Normal file
36
data/theme/README
Normal file
@ -0,0 +1,36 @@
|
||||
Summary
|
||||
-------
|
||||
|
||||
* Do not edit the CSS directly, edit the source SCSS files and process them with SASS (running
|
||||
`make` should do that when you have the required software installed, as described below;
|
||||
run `/.parse-sass.sh` manually if it doesn't)
|
||||
* To be able to use the lates/adequate version of sass, install ruby, gem, sass & bundle.
|
||||
On Fedora F20, this is done with `sudo dnf install rubygems && gem install bundle && bundle install`
|
||||
from the same directory this README resides in.
|
||||
|
||||
How to tweak the theme
|
||||
----------------------
|
||||
|
||||
Adwaita is a complex theme, so to keep it maintainable it's written and processed in SASS, the
|
||||
generated CSS is then transformed into a gresource file during gtk build and used at runtime in a
|
||||
non-legible or editable form.
|
||||
|
||||
It is very likely your change will happen in the _common.scss file. That's where all the widget
|
||||
selectors are defined. Here's a rundown of the "supporting" stylesheets, that are unlikely to be the
|
||||
right place for a drive by stylesheet fix:
|
||||
|
||||
_colors.scss - global color definitions. We keep the number of defined colors to a necessary minimum,
|
||||
most colors are derived from a handful of basics. It is an exact copy of the gtk+
|
||||
counterpart. Light theme is used for the classic theme and dark is for GNOME3 shell
|
||||
default.
|
||||
|
||||
_drawing.scss - drawing helper mixings/functions to allow easier definition of widget drawing under
|
||||
specific context. This is why Adwaita isn't 15000 LOC.
|
||||
|
||||
_common.scss - actual definitions of style for each widget. This is where you are likely to add/remove
|
||||
your changes.
|
||||
|
||||
You can read about SASS at http://sass-lang.com/documentation/. Once you make your changes to the
|
||||
_common.scss file, you can either run the ./parse-sass.sh script or keep SASS watching for changes as you
|
||||
edit. This is done by running `bundle exec sass --watch --sourcemap=none .` If sass is out of date, or is
|
||||
missing, you can install it with `bundle install`.
|
@ -74,14 +74,19 @@ StEntry {
|
||||
color: #7f7f7f;
|
||||
border-color: #0d0d0d;
|
||||
box-shadow: none; }
|
||||
StEntry StIcon.capslock-warning {
|
||||
icon-size: 16px;
|
||||
warning-color: #f57900;
|
||||
padding: 0 4px; }
|
||||
|
||||
/* Scrollbars */
|
||||
StScrollView.vfade {
|
||||
-st-vfade-offset: 68px; }
|
||||
StScrollView.hfade {
|
||||
-st-hfade-offset: 68px; }
|
||||
|
||||
StScrollBar {
|
||||
padding: 0; }
|
||||
StScrollBar.vfade {
|
||||
-st-vfade-offset: 68px; }
|
||||
StScrollBar.hfade {
|
||||
-st-hfade-offset: 68px; }
|
||||
StScrollView StScrollBar {
|
||||
min-width: 14px;
|
||||
min-height: 14px; }
|
||||
@ -114,13 +119,13 @@ StScrollBar {
|
||||
.check-box StBin {
|
||||
width: 24px;
|
||||
height: 22px;
|
||||
background-image: url("checkbox-off.svg"); }
|
||||
.check-box:focus Stbin {
|
||||
background-image: url("checkbox-off-focused.svg"); }
|
||||
.check-box:checked Stbin {
|
||||
background-image: url("checkbox.svg"); }
|
||||
.check-box:focus:checked Stbin {
|
||||
background-image: url("checkbox-focused.svg"); }
|
||||
background-image: url("resource:///org/gnome/shell/theme/checkbox-off.svg"); }
|
||||
.check-box:focus StBin {
|
||||
background-image: url("resource:///org/gnome/shell/theme/checkbox-off-focused.svg"); }
|
||||
.check-box:checked StBin {
|
||||
background-image: url("resource:///org/gnome/shell/theme/checkbox.svg"); }
|
||||
.check-box:focus:checked StBin {
|
||||
background-image: url("resource:///org/gnome/shell/theme/checkbox-focused.svg"); }
|
||||
|
||||
/* Switches */
|
||||
.toggle-switch {
|
||||
@ -129,14 +134,14 @@ StScrollBar {
|
||||
background-size: contain; }
|
||||
|
||||
.toggle-switch-us {
|
||||
background-image: url("toggle-off-us.svg"); }
|
||||
background-image: url("resource:///org/gnome/shell/theme/toggle-off-us.svg"); }
|
||||
.toggle-switch-us:checked {
|
||||
background-image: url("toggle-on-us.svg"); }
|
||||
background-image: url("resource:///org/gnome/shell/theme/toggle-on-us.svg"); }
|
||||
|
||||
.toggle-switch-intl {
|
||||
background-image: url("toggle-off-intl.svg"); }
|
||||
background-image: url("resource:///org/gnome/shell/theme/toggle-off-intl.svg"); }
|
||||
.toggle-switch-intl:checked {
|
||||
background-image: url("toggle-on-intl.svg"); }
|
||||
background-image: url("resource:///org/gnome/shell/theme/toggle-on-intl.svg"); }
|
||||
|
||||
/* links */
|
||||
.shell-link {
|
||||
@ -169,7 +174,7 @@ StScrollBar {
|
||||
.modal-dialog .run-dialog-button-box {
|
||||
padding-top: 1em; }
|
||||
.modal-dialog .run-dialog-label {
|
||||
font-size: fontsize(12.1);
|
||||
font-size: 12pt;
|
||||
font-weight: bold;
|
||||
color: #d6d6d1;
|
||||
padding-bottom: .4em; }
|
||||
@ -181,7 +186,7 @@ StScrollBar {
|
||||
.show-processes-dialog-subject,
|
||||
.mount-question-dialog-subject,
|
||||
.end-session-dialog-subject {
|
||||
font-size: fontsize(14.3); }
|
||||
font-size: 14pt; }
|
||||
|
||||
/* End Session Dialog */
|
||||
.end-session-dialog {
|
||||
@ -319,7 +324,7 @@ StScrollBar {
|
||||
|
||||
.prompt-dialog-headline {
|
||||
font-weight: bold;
|
||||
color: #b3b3b3; }
|
||||
color: #b2b2a9; }
|
||||
|
||||
.prompt-dialog-description:rtl {
|
||||
text-align: right; }
|
||||
@ -388,16 +393,14 @@ StScrollBar {
|
||||
background-color: black;
|
||||
box-shadow: inset 0 1px 0px #0d0d0d;
|
||||
font-weight: bold; }
|
||||
.popup-menu .popup-menu-item:hover {
|
||||
.popup-menu .popup-menu-item.selected {
|
||||
background-color: rgba(255, 255, 255, 0.1);
|
||||
color: #fff; }
|
||||
.popup-menu .popup-menu-item:active {
|
||||
background-color: #215d9c;
|
||||
color: #ffffff; }
|
||||
.popup-menu .popup-menu-item:active {
|
||||
background-color: #1c5187;
|
||||
color: #ffffff; }
|
||||
.popup-menu .popup-menu-item:insensitive {
|
||||
background-color: rgba(0, 0, 0, 0.5); }
|
||||
.popup-menu .active {
|
||||
background-color: #215d9c; }
|
||||
color: rgba(255, 255, 255, 0.5); }
|
||||
.popup-menu .popup-inactive-menu-item {
|
||||
color: #fff; }
|
||||
.popup-menu .popup-inactive-menu-item:insensitive {
|
||||
@ -440,7 +443,12 @@ StScrollBar {
|
||||
.osd-window {
|
||||
text-align: center;
|
||||
font-weight: bold;
|
||||
spacing: 1em; }
|
||||
spacing: 1em;
|
||||
margin: 32px;
|
||||
min-width: 64px;
|
||||
min-height: 64px; }
|
||||
.osd-window .osd-monitor-label {
|
||||
font-size: 3em; }
|
||||
.osd-window .level {
|
||||
height: 0.6em;
|
||||
border-radius: 0.3em;
|
||||
@ -515,6 +523,7 @@ StScrollBar {
|
||||
border-radius: 8px; }
|
||||
|
||||
.osd-window,
|
||||
.resize-popup,
|
||||
.switcher-list, .workspace-switcher-container {
|
||||
color: #eeeeec;
|
||||
background-color: #2e3436;
|
||||
@ -528,7 +537,7 @@ StScrollBar {
|
||||
border: 1px solid #215d9c; }
|
||||
|
||||
.tile-preview-left.on-primary {
|
||||
border-radius: 6px 6px 0 0 0; }
|
||||
border-radius: 6px 6px 0 0; }
|
||||
|
||||
.tile-preview-right.on-primary {
|
||||
border-radius: 0 6px 0 0; }
|
||||
@ -552,7 +561,7 @@ StScrollBar {
|
||||
-panel-corner-border-color: transparent; }
|
||||
#panel .panel-corner:active, #panel .panel-corner:overview, #panel .panel-corner:focus {
|
||||
-panel-corner-border-color: #256ab1; }
|
||||
#panel .panel-corner.lock-screen, #panel .panel-corner.login-screen, #panel .panel-cornerunlock-screen {
|
||||
#panel .panel-corner.lock-screen, #panel .panel-corner.login-screen, #panel .panel-corner.unlock-screen {
|
||||
-panel-corner-radius: 0;
|
||||
-panel-corner-background-color: transparent;
|
||||
-panel-corner-border-color: transparent; }
|
||||
@ -563,7 +572,9 @@ StScrollBar {
|
||||
color: #ccc;
|
||||
transition-duration: 100ms; }
|
||||
#panel .panel-button .app-menu-icon {
|
||||
-st-icon-style: symbolic; }
|
||||
-st-icon-style: symbolic;
|
||||
margin-left: 4px;
|
||||
margin-right: 4px; }
|
||||
#panel .panel-button:hover {
|
||||
color: white; }
|
||||
#panel .panel-button:active, #panel .panel-button:overview, #panel .panel-button:focus, #panel .panel-button:checked {
|
||||
@ -585,21 +596,58 @@ StScrollBar {
|
||||
#panel .screencast-indicator {
|
||||
color: #f57900; }
|
||||
|
||||
#calendarArea {
|
||||
padding: 0.75em 1.0em; }
|
||||
|
||||
.calendar {
|
||||
padding: .4em 1.75em .8em 1.75em;
|
||||
margin-bottom: 2em; }
|
||||
margin-bottom: 1em; }
|
||||
|
||||
.datemenu-date-label {
|
||||
padding: .4em 1.7em;
|
||||
text-align: center;
|
||||
color: #fff;
|
||||
font-weight: bold;
|
||||
font-size: 110%; }
|
||||
.calendar,
|
||||
.datemenu-today-button,
|
||||
.datemenu-displays-box,
|
||||
.message-list-sections {
|
||||
margin: 0 1.5em; }
|
||||
|
||||
.calendar-vertical-separator {
|
||||
width: .3em;
|
||||
-stipple-width: 1px;
|
||||
-stipple-color: rgba(238, 238, 236, 0.2); }
|
||||
.datemenu-calendar-column {
|
||||
spacing: 0.5em; }
|
||||
|
||||
.datemenu-displays-section {
|
||||
padding-bottom: 3em; }
|
||||
|
||||
.datemenu-today-button,
|
||||
.world-clocks-button,
|
||||
.message-list-section-title {
|
||||
border-radius: 4px;
|
||||
padding: .4em; }
|
||||
|
||||
.message-list-section-list:ltr {
|
||||
padding-left: .4em; }
|
||||
|
||||
.message-list-section-list:rtl {
|
||||
padding-right: .4em; }
|
||||
|
||||
.datemenu-today-button:hover, .datemenu-today-button:focus,
|
||||
.world-clocks-button:hover,
|
||||
.world-clocks-button:focus,
|
||||
.message-list-section-title:hover,
|
||||
.message-list-section-title:focus {
|
||||
background-color: #0d0d0d; }
|
||||
.datemenu-today-button:active,
|
||||
.world-clocks-button:active,
|
||||
.message-list-section-title:active {
|
||||
color: white;
|
||||
background-color: #215d9c; }
|
||||
|
||||
.datemenu-today-button .date-label {
|
||||
font-size: 1.5em; }
|
||||
|
||||
.world-clocks-header,
|
||||
.message-list-section-title {
|
||||
color: #999999;
|
||||
font-weight: bold; }
|
||||
|
||||
.world-clocks-grid {
|
||||
spacing-rows: 0.4em; }
|
||||
|
||||
.calendar-month-label {
|
||||
color: #f2f2f2;
|
||||
@ -610,7 +658,6 @@ StScrollBar {
|
||||
color: white;
|
||||
background-color: transparent;
|
||||
width: 32px;
|
||||
background-position: center;
|
||||
border-radius: 4px; }
|
||||
.pager-button:hover, .pager-button:focus {
|
||||
background-color: rgba(255, 255, 255, 0.05); }
|
||||
@ -618,14 +665,14 @@ StScrollBar {
|
||||
background-color: rgba(0, 0, 0, 0.05); }
|
||||
|
||||
.calendar-change-month-back {
|
||||
background-image: url("calendar-arrow-left.svg"); }
|
||||
background-image: url("resource:///org/gnome/shell/theme/calendar-arrow-left.svg"); }
|
||||
.calendar-change-month-back:rtl {
|
||||
background-image: url("calendar-arrow-right.svg"); }
|
||||
background-image: url("resource:///org/gnome/shell/theme/calendar-arrow-right.svg"); }
|
||||
|
||||
.calendar-change-month-forward {
|
||||
background-image: url("calendar-arrow-right.svg"); }
|
||||
background-image: url("resource:///org/gnome/shell/theme/calendar-arrow-right.svg"); }
|
||||
.calendar-change-month-forward:rtl {
|
||||
background-image: url("calendar-arrow-left.svg"); }
|
||||
background-image: url("resource:///org/gnome/shell/theme/calendar-arrow-left.svg"); }
|
||||
|
||||
.calendar-day-base {
|
||||
font-size: 80%;
|
||||
@ -670,46 +717,63 @@ StScrollBar {
|
||||
color: rgba(255, 255, 255, 0.15);
|
||||
opacity: 0.5; }
|
||||
|
||||
.events-table {
|
||||
width: 15em;
|
||||
spacing-columns: 1em;
|
||||
padding: 0 1.4em; }
|
||||
.events-table:ltr {
|
||||
padding-right: 1.9em; }
|
||||
.events-table:rtl {
|
||||
padding-left: 1.9em; }
|
||||
/* Message list */
|
||||
.message-list {
|
||||
width: 420px; }
|
||||
|
||||
.events-day-header {
|
||||
font-weight: bold;
|
||||
color: #e6e6e6;
|
||||
padding-left: 0;
|
||||
padding-top: 1.2em; }
|
||||
.events-day-header:first-child {
|
||||
padding-top: 0; }
|
||||
.message-list-sections {
|
||||
spacing: 1.5em; }
|
||||
|
||||
.events-day-dayname {
|
||||
color: #e6e6e6;
|
||||
text-align: left;
|
||||
min-width: 20px; }
|
||||
.events-day-dayname:rtl {
|
||||
text-align: right; }
|
||||
.events-day-dayname .events-day-time {
|
||||
text-align: right; }
|
||||
.events-day-dayname .events-day-time:rtl {
|
||||
text-align: left; }
|
||||
.events-day-dayname .events-day-task {
|
||||
color: #e6e6e6; }
|
||||
.events-day-dayname .events-day-task:ltr {
|
||||
padding-left: 8px; }
|
||||
.events-day-dayname .events-day-task:rtl {
|
||||
padding-right: 8px; }
|
||||
.message-list-section,
|
||||
.message-list-section-list {
|
||||
spacing: 0.7em; }
|
||||
|
||||
.message-list-section-title-box {
|
||||
spacing: 0.4em; }
|
||||
|
||||
.message-list-section-close > StIcon {
|
||||
icon-size: 16px;
|
||||
border-radius: 8px;
|
||||
color: #000;
|
||||
background-color: #666666; }
|
||||
|
||||
/* FIXME: how do you do this in sass? */
|
||||
.message-list-section-close:hover > StIcon,
|
||||
.message-list-section-close:focus > StIcon {
|
||||
background-color: #999999; }
|
||||
|
||||
.message {
|
||||
background-color: #0d0d0d;
|
||||
border-radius: 3px; }
|
||||
.message:hover, .message:focus {
|
||||
background-color: #262626; }
|
||||
|
||||
.message-icon-bin {
|
||||
padding: 8px 0px 8px 8px; }
|
||||
.message-icon-bin:rtl {
|
||||
padding: 8px 8px 8px 0px; }
|
||||
|
||||
.message-icon-bin > StIcon {
|
||||
icon-size: 48px; }
|
||||
|
||||
.message-secondary-bin {
|
||||
color: #999999; }
|
||||
|
||||
.message-secondary-bin > StIcon {
|
||||
icon-size: 16px; }
|
||||
|
||||
.message-title {
|
||||
font-weight: bold; }
|
||||
|
||||
.message-content {
|
||||
padding: 8px; }
|
||||
|
||||
.system-switch-user-submenu-icon {
|
||||
icon-size: 24px;
|
||||
border: 1px solid rgba(255, 255, 255, 0.4); }
|
||||
|
||||
#appMenu {
|
||||
spinner-image: url("process-working.svg");
|
||||
spinner-image: url("resource:///org/gnome/shell/theme/process-working.svg");
|
||||
spacing: 4px; }
|
||||
#appMenu .label-shadow {
|
||||
color: transparent; }
|
||||
@ -726,12 +790,12 @@ StScrollBar {
|
||||
padding: 13px;
|
||||
border: 1px solid #0d0d0d; }
|
||||
.system-menu-action:hover, .system-menu-action:focus {
|
||||
color: #ffffff;
|
||||
background-color: #215d9c;
|
||||
background-color: rgba(255, 255, 255, 0.1);
|
||||
color: #fff;
|
||||
border: none;
|
||||
padding: 14px; }
|
||||
.system-menu-action:active {
|
||||
background-color: #1c5187;
|
||||
background-color: #215d9c;
|
||||
color: #ffffff; }
|
||||
.system-menu-action > StIcon {
|
||||
icon-size: 16px; }
|
||||
@ -739,11 +803,11 @@ StScrollBar {
|
||||
.ripple-box {
|
||||
width: 52px;
|
||||
height: 52px;
|
||||
background-image: url("corner-ripple-ltr.png");
|
||||
background-image: url("resource:///org/gnome/shell/theme/corner-ripple-ltr.png");
|
||||
background-size: contain; }
|
||||
|
||||
.ripple-box:rtl {
|
||||
background-image: url("corner-ripple-rtl.png"); }
|
||||
background-image: url("resource:///org/gnome/shell/theme/corner-ripple-rtl.png"); }
|
||||
|
||||
.popup-menu-arrow {
|
||||
width: 16px;
|
||||
@ -752,8 +816,8 @@ StScrollBar {
|
||||
.popup-menu-icon {
|
||||
icon-size: 1.09em; }
|
||||
|
||||
.window-close, .notification-close {
|
||||
background-image: url("close-window.svg");
|
||||
.window-close {
|
||||
background-image: url("resource:///org/gnome/shell/theme/close-window.svg");
|
||||
background-size: 32px;
|
||||
height: 32px;
|
||||
width: 32px; }
|
||||
@ -763,12 +827,6 @@ StScrollBar {
|
||||
.window-close:rtl {
|
||||
-st-background-image-shadow: 2px 2px 6px rgba(0, 0, 0, 0.5); }
|
||||
|
||||
.notification-close {
|
||||
-shell-close-overlap-x: 14px;
|
||||
-shell-close-overlap-y: -12px; }
|
||||
.notification-close:rtl {
|
||||
-shell-close-overlap-x: -14px; }
|
||||
|
||||
/* NETWORK DIALOGS */
|
||||
.nm-dialog {
|
||||
max-height: 500px;
|
||||
@ -826,6 +884,9 @@ StScrollBar {
|
||||
#overview {
|
||||
spacing: 24px; }
|
||||
|
||||
.overview-controls {
|
||||
padding-bottom: 32px; }
|
||||
|
||||
.window-picker {
|
||||
-horizontal-spacing: 32px;
|
||||
-vertical-spacing: 32px;
|
||||
@ -851,14 +912,6 @@ StScrollBar {
|
||||
background-color: #215d9c;
|
||||
color: #ffffff; }
|
||||
|
||||
.messages-indicator {
|
||||
color: rgba(238, 238, 236, 0.8);
|
||||
height: 32px; }
|
||||
|
||||
.messages-indicator-contents {
|
||||
spacing: 12px;
|
||||
padding-bottom: 12px; }
|
||||
|
||||
.search-entry {
|
||||
width: 320px;
|
||||
padding: 7px 9px;
|
||||
@ -914,7 +967,7 @@ StScrollBar {
|
||||
.search-provider-icon-more {
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
background-image: url("more-results.svg"); }
|
||||
background-image: url("resource:///org/gnome/shell/theme/more-results.svg"); }
|
||||
|
||||
/* DASHBOARD */
|
||||
#dash {
|
||||
@ -928,7 +981,7 @@ StScrollBar {
|
||||
#dash:rtl {
|
||||
border-radius: 9px 0 0 9px; }
|
||||
#dash .placeholder {
|
||||
background-image: url("dash-placeholder.svg");
|
||||
background-image: url("resource:///org/gnome/shell/theme/dash-placeholder.svg");
|
||||
background-size: contain;
|
||||
height: 24px; }
|
||||
#dash .empty-dash-drop-target {
|
||||
@ -1052,13 +1105,13 @@ StScrollBar {
|
||||
.page-indicator .page-indicator-icon {
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
background-image: url(page-indicator-inactive.svg); }
|
||||
background-image: url(resource:///org/gnome/shell/theme/page-indicator-inactive.svg); }
|
||||
.page-indicator:hover .page-indicator-icon {
|
||||
background-image: url(page-indicator-hover.svg); }
|
||||
background-image: url(resource:///org/gnome/shell/theme/page-indicator-hover.svg); }
|
||||
.page-indicator:active .page-indicator-icon {
|
||||
background-image: url(page-indicator-active.svg); }
|
||||
background-image: url(resource:///org/gnome/shell/theme/page-indicator-active.svg); }
|
||||
.page-indicator:checked .page-indicator-icon, .page-indicator:checked:active {
|
||||
background-image: url(page-indicator-checked.svg); }
|
||||
background-image: url(resource:///org/gnome/shell/theme/page-indicator-checked.svg); }
|
||||
|
||||
.app-well-app > .overview-icon.overview-icon-with-label,
|
||||
.grid-search-result .overview-icon.overview-icon-with-label {
|
||||
@ -1093,65 +1146,41 @@ StScrollBar {
|
||||
color: #fff; }
|
||||
|
||||
/* NOTIFICATIONS & MESSAGE TRAY */
|
||||
#message-tray {
|
||||
background: #17191a url("noise-texture.png");
|
||||
background-repeat: repeat;
|
||||
height: 72px;
|
||||
box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.5);
|
||||
padding: 4px; }
|
||||
#message-tray .message-tray-summary {
|
||||
height: 72px; }
|
||||
#message-tray .message-tray-menu-button StIcon {
|
||||
padding: 0 20px;
|
||||
color: #fff;
|
||||
icon-size: 24px;
|
||||
opacity: 1; }
|
||||
#message-tray .message-tray-menu-button:hover StIcon {
|
||||
color: white; }
|
||||
#message-tray .message-tray-menu-button:active StIcon {
|
||||
color: #2a76c6; }
|
||||
#message-tray .no-messages-label {
|
||||
color: #e6e6e6; }
|
||||
|
||||
.url-highlighter {
|
||||
link-color: #215d9c; }
|
||||
link-color: #2a76c6; }
|
||||
|
||||
.notification {
|
||||
.notification-banner {
|
||||
font-size: 11pt;
|
||||
width: 34em;
|
||||
border-radius: 6px 6px 0 0;
|
||||
margin: 5px;
|
||||
border-radius: 6px;
|
||||
color: #eeeeec;
|
||||
background-color: #2e3436;
|
||||
border: 1px solid black;
|
||||
border-bottom-width: 0;
|
||||
spacing-rows: 4px;
|
||||
padding: 8px 8px 4px 8px;
|
||||
spacing-columns: 10px; }
|
||||
.notification.multi-line-notification {
|
||||
padding-bottom: 8px; }
|
||||
|
||||
.notification-unexpanded {
|
||||
min-height: 36px;
|
||||
height: 36px; }
|
||||
|
||||
.notification-with-image {
|
||||
min-height: 159px; }
|
||||
|
||||
.notification-body {
|
||||
spacing: 5px; }
|
||||
|
||||
.notification-actions {
|
||||
paddinf-top: 18px;
|
||||
spacing: 6px; }
|
||||
|
||||
.summary-source {
|
||||
border-radius: 0;
|
||||
-st-natural-width: 60px;
|
||||
padding: 9px;
|
||||
transition-duration: 100ms; }
|
||||
|
||||
.summary-source-button:hover .summary-source, .summary-source-button:selected .summary-source, .summary-source-button:focus .summary-source {
|
||||
background-color: #33393c; }
|
||||
border: 1px solid black; }
|
||||
.notification-banner:hover {
|
||||
background-color: #2e3436; }
|
||||
.notification-banner:focus {
|
||||
background-color: #2e3436; }
|
||||
.notification-banner .notification-icon {
|
||||
padding: 5px; }
|
||||
.notification-banner .notification-content {
|
||||
padding: 5px;
|
||||
spacing: 5px; }
|
||||
.notification-banner .secondary-icon {
|
||||
icon-size: 1.09em; }
|
||||
.notification-banner .notification-actions {
|
||||
background-color: black;
|
||||
padding-top: 2px;
|
||||
spacing: 1px; }
|
||||
.notification-banner .notification-button {
|
||||
padding: 4px 4px 5px;
|
||||
background-color: #222728; }
|
||||
.notification-banner .notification-button:first-child {
|
||||
border-radius: 0 0 0 6px; }
|
||||
.notification-banner .notification-button:last-child {
|
||||
border-radius: 0 0 6px 0; }
|
||||
.notification-banner .notification-button:hover, .notification-banner .notification-buttonfocus {
|
||||
background-color: #292f30; }
|
||||
|
||||
.summary-source-counter {
|
||||
font-size: 10pt;
|
||||
@ -1166,61 +1195,20 @@ StScrollBar {
|
||||
box-shadow: 0 2px 2px rgba(0, 0, 0, 0.5);
|
||||
border-radius: 0.9em; }
|
||||
|
||||
.summary-boxpointer {
|
||||
-arrow-border-radius: 15px;
|
||||
-arrow-background-color: #2e3436;
|
||||
-arrow-base: 36px;
|
||||
-arrow-rise: 18px;
|
||||
color: #fff;
|
||||
-boxpointer-gap: 4px; }
|
||||
.summary-boxpointer .notification {
|
||||
border-radius: 9px;
|
||||
border-width: 0;
|
||||
background-color: transparent !important;
|
||||
padding-bottom: 12px; }
|
||||
.summary-boxpointer #summary-right-click-menu {
|
||||
padding-top: 12px;
|
||||
padding-bottom: 12px; }
|
||||
|
||||
.summary-notification-stack-scrollview {
|
||||
max-height: 24em;
|
||||
padding-top: 8px;
|
||||
padding-bottom: 8px; }
|
||||
.summary-notification-stack-scrollview:ltr {
|
||||
padding-right: 8px; }
|
||||
.summary-notification-stack-scrollview:rtl {
|
||||
padding-left: 8px; }
|
||||
|
||||
.notification-scrollview {
|
||||
max-height: 18em;
|
||||
-st-vfade-offset: 24px; }
|
||||
.notification-scrollview:ltr > StScrollBar {
|
||||
padding-left: 6px; }
|
||||
.notification-scrollview:rtl > StScrollBar {
|
||||
padding-right: 6px; }
|
||||
|
||||
.notification-button {
|
||||
height: 24px; }
|
||||
|
||||
.notification-icon-button {
|
||||
border-radius: 5px;
|
||||
padding: 5px;
|
||||
height: 24px;
|
||||
width: 24px; }
|
||||
.notification-icon-button > StIcon {
|
||||
icons-size: 16px;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
padding: 2px; }
|
||||
|
||||
.secondary-icon {
|
||||
icon-size: 1.09em; }
|
||||
|
||||
.chat-body {
|
||||
spacing: 5px; }
|
||||
|
||||
.chat-response {
|
||||
margin: 5px; }
|
||||
|
||||
.chat-log-message {
|
||||
color: #e6e6e6; }
|
||||
|
||||
.chat-empty-line {
|
||||
font-size: 4px; }
|
||||
.chat-new-group {
|
||||
padding-top: 1em; }
|
||||
|
||||
.chat-received {
|
||||
padding-left: 4px; }
|
||||
@ -1244,12 +1232,6 @@ StScrollBar {
|
||||
padding-left: 0;
|
||||
padding-right: 4px; }
|
||||
|
||||
.chat-notification-scrollview {
|
||||
max-height: 22em; }
|
||||
|
||||
.subscription-message {
|
||||
font-style: italic; }
|
||||
|
||||
.hotplug-transient-box {
|
||||
spacing: 6px;
|
||||
padding: 2px 72px 2px 12px; }
|
||||
@ -1289,6 +1271,38 @@ StScrollBar {
|
||||
color: pink; }
|
||||
|
||||
/* Eeeky things */
|
||||
.legacy-tray {
|
||||
background-color: #000;
|
||||
border: 1px solid black;
|
||||
border-bottom-width: 0; }
|
||||
.legacy-tray:ltr {
|
||||
border-radius: 0 6px 0 0;
|
||||
border-left-width: 0; }
|
||||
.legacy-tray:rtl {
|
||||
border-radius: 6px 0 0 0;
|
||||
border-right-width: 0; }
|
||||
|
||||
.legacy-tray-handle,
|
||||
.legacy-tray-icon {
|
||||
padding: 6px; }
|
||||
.legacy-tray-handle StIcon,
|
||||
.legacy-tray-icon StIcon {
|
||||
icon-size: 24px; }
|
||||
.legacy-tray-handle:hover, .legacy-tray-handle:focus,
|
||||
.legacy-tray-icon:hover,
|
||||
.legacy-tray-icon:focus {
|
||||
background-color: rgba(255, 255, 255, 0.1); }
|
||||
|
||||
.legacy-tray-icon-box {
|
||||
spacing: 12px; }
|
||||
.legacy-tray-icon-box:ltr {
|
||||
padding-left: 12px; }
|
||||
.legacy-tray-icon-box:rtl {
|
||||
padding-right: 12px; }
|
||||
.legacy-tray-icon-box StButton {
|
||||
width: 24px;
|
||||
height: 24px; }
|
||||
|
||||
.magnifier-zoom-region {
|
||||
border: 2px solid #215d9c; }
|
||||
.magnifier-zoom-region.full-screen {
|
||||
@ -1371,15 +1385,18 @@ StScrollBar {
|
||||
color: #ffffff; }
|
||||
|
||||
.candidate-page-button-box {
|
||||
height: 2em;
|
||||
width: 80px; }
|
||||
height: 2em; }
|
||||
.vertical .candidate-page-button-box {
|
||||
padding-top: 0.5em; }
|
||||
.horizontal .candidate-page-button-box {
|
||||
padding-left: 0.5em; }
|
||||
|
||||
.candidate-page-button {
|
||||
padding: 4px; }
|
||||
|
||||
.candidate-page-button-previous {
|
||||
border-radius: 4px 0px 0px 4px; }
|
||||
border-radius: 4px 0px 0px 4px;
|
||||
border-right-width: 0; }
|
||||
|
||||
.candidate-page-button-next {
|
||||
border-radius: 0px 4px 4px 0px; }
|
||||
@ -1390,10 +1407,12 @@ StScrollBar {
|
||||
/* Auth Dialogs & Screen Shield */
|
||||
.framed-user-icon {
|
||||
background-size: contain;
|
||||
border: 2px solid black;
|
||||
border: 2px solid #eeeeec;
|
||||
color: #eeeeec;
|
||||
border-radius: 3px; }
|
||||
.framed-user-icon:hover {
|
||||
border-color: #4d4d4d; }
|
||||
border-color: white;
|
||||
color: white; }
|
||||
|
||||
.login-dialog-banner-view {
|
||||
padding-top: 24px;
|
||||
@ -1490,9 +1509,10 @@ StScrollBar {
|
||||
color: #ffffff; }
|
||||
.login-dialog-user-list-item .login-dialog-timed-login-indicator {
|
||||
height: 2px;
|
||||
background-color: transparent; }
|
||||
margin: 2px 0 0 0;
|
||||
background-color: #eeeeec; }
|
||||
.login-dialog-user-list-item:focus .login-dialog-timed-login-indicator {
|
||||
background-color: #2e3436; }
|
||||
background-color: #ffffff; }
|
||||
|
||||
.login-dialog-username,
|
||||
.user-widget-label {
|
||||
@ -1585,7 +1605,7 @@ StScrollBar {
|
||||
box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.4); }
|
||||
|
||||
#lockDialogGroup {
|
||||
background: #2e3436 url(noise-texture.png);
|
||||
background: #2e3436 url(resource:///org/gnome/shell/theme/noise-texture.png);
|
||||
background-repeat: repeat; }
|
||||
|
||||
#screenShieldNotifications StButton#vhandle, #screenShieldNotifications StButton#hhandle {
|
||||
|
Submodule data/theme/gnome-shell-sass updated: f9e45c152f...b890a4003e
@ -74,14 +74,19 @@ StEntry {
|
||||
color: #939695;
|
||||
border-color: #323636;
|
||||
box-shadow: none; }
|
||||
StEntry StIcon.capslock-warning {
|
||||
icon-size: 16px;
|
||||
warning-color: #f57900;
|
||||
padding: 0 4px; }
|
||||
|
||||
/* Scrollbars */
|
||||
StScrollView.vfade {
|
||||
-st-vfade-offset: 68px; }
|
||||
StScrollView.hfade {
|
||||
-st-hfade-offset: 68px; }
|
||||
|
||||
StScrollBar {
|
||||
padding: 0; }
|
||||
StScrollBar.vfade {
|
||||
-st-vfade-offset: 68px; }
|
||||
StScrollBar.hfade {
|
||||
-st-hfade-offset: 68px; }
|
||||
StScrollView StScrollBar {
|
||||
min-width: 14px;
|
||||
min-height: 14px; }
|
||||
@ -114,13 +119,13 @@ StScrollBar {
|
||||
.check-box StBin {
|
||||
width: 24px;
|
||||
height: 22px;
|
||||
background-image: url("checkbox-off.svg"); }
|
||||
.check-box:focus Stbin {
|
||||
background-image: url("checkbox-off-focused.svg"); }
|
||||
.check-box:checked Stbin {
|
||||
background-image: url("checkbox.svg"); }
|
||||
.check-box:focus:checked Stbin {
|
||||
background-image: url("checkbox-focused.svg"); }
|
||||
background-image: url("resource:///org/gnome/shell/theme/checkbox-off.svg"); }
|
||||
.check-box:focus StBin {
|
||||
background-image: url("resource:///org/gnome/shell/theme/checkbox-off-focused.svg"); }
|
||||
.check-box:checked StBin {
|
||||
background-image: url("resource:///org/gnome/shell/theme/checkbox.svg"); }
|
||||
.check-box:focus:checked StBin {
|
||||
background-image: url("resource:///org/gnome/shell/theme/checkbox-focused.svg"); }
|
||||
|
||||
/* Switches */
|
||||
.toggle-switch {
|
||||
@ -129,14 +134,14 @@ StScrollBar {
|
||||
background-size: contain; }
|
||||
|
||||
.toggle-switch-us {
|
||||
background-image: url("toggle-off-us.svg"); }
|
||||
background-image: url("resource:///org/gnome/shell/theme/toggle-off-us.svg"); }
|
||||
.toggle-switch-us:checked {
|
||||
background-image: url("toggle-on-us.svg"); }
|
||||
background-image: url("resource:///org/gnome/shell/theme/toggle-on-us.svg"); }
|
||||
|
||||
.toggle-switch-intl {
|
||||
background-image: url("toggle-off-intl.svg"); }
|
||||
background-image: url("resource:///org/gnome/shell/theme/toggle-off-intl.svg"); }
|
||||
.toggle-switch-intl:checked {
|
||||
background-image: url("toggle-on-intl.svg"); }
|
||||
background-image: url("resource:///org/gnome/shell/theme/toggle-on-intl.svg"); }
|
||||
|
||||
/* links */
|
||||
.shell-link {
|
||||
@ -169,7 +174,7 @@ StScrollBar {
|
||||
.modal-dialog .run-dialog-button-box {
|
||||
padding-top: 1em; }
|
||||
.modal-dialog .run-dialog-label {
|
||||
font-size: fontsize(12.1);
|
||||
font-size: 12pt;
|
||||
font-weight: bold;
|
||||
color: #d6d6d1;
|
||||
padding-bottom: .4em; }
|
||||
@ -181,7 +186,7 @@ StScrollBar {
|
||||
.show-processes-dialog-subject,
|
||||
.mount-question-dialog-subject,
|
||||
.end-session-dialog-subject {
|
||||
font-size: fontsize(14.3); }
|
||||
font-size: 14pt; }
|
||||
|
||||
/* End Session Dialog */
|
||||
.end-session-dialog {
|
||||
@ -319,7 +324,7 @@ StScrollBar {
|
||||
|
||||
.prompt-dialog-headline {
|
||||
font-weight: bold;
|
||||
color: #a6a69b; }
|
||||
color: #b2b2a9; }
|
||||
|
||||
.prompt-dialog-description:rtl {
|
||||
text-align: right; }
|
||||
@ -388,16 +393,14 @@ StScrollBar {
|
||||
background-color: #343a3a;
|
||||
box-shadow: inset 0 1px 0px #282c2c;
|
||||
font-weight: bold; }
|
||||
.popup-menu .popup-menu-item:hover {
|
||||
.popup-menu .popup-menu-item.selected {
|
||||
background-color: rgba(238, 238, 236, 0.1);
|
||||
color: #eeeeec; }
|
||||
.popup-menu .popup-menu-item:active {
|
||||
background-color: #215d9c;
|
||||
color: #ffffff; }
|
||||
.popup-menu .popup-menu-item:active {
|
||||
background-color: #1c5187;
|
||||
color: #ffffff; }
|
||||
.popup-menu .popup-menu-item:insensitive {
|
||||
background-color: rgba(57, 63, 63, 0.5); }
|
||||
.popup-menu .active {
|
||||
background-color: #215d9c; }
|
||||
color: rgba(238, 238, 236, 0.5); }
|
||||
.popup-menu .popup-inactive-menu-item {
|
||||
color: #eeeeec; }
|
||||
.popup-menu .popup-inactive-menu-item:insensitive {
|
||||
@ -440,7 +443,12 @@ StScrollBar {
|
||||
.osd-window {
|
||||
text-align: center;
|
||||
font-weight: bold;
|
||||
spacing: 1em; }
|
||||
spacing: 1em;
|
||||
margin: 32px;
|
||||
min-width: 64px;
|
||||
min-height: 64px; }
|
||||
.osd-window .osd-monitor-label {
|
||||
font-size: 3em; }
|
||||
.osd-window .level {
|
||||
height: 0.6em;
|
||||
border-radius: 0.3em;
|
||||
@ -515,6 +523,7 @@ StScrollBar {
|
||||
border-radius: 8px; }
|
||||
|
||||
.osd-window,
|
||||
.resize-popup,
|
||||
.switcher-list, .workspace-switcher-container {
|
||||
color: #eeeeec;
|
||||
background-color: #2e3436;
|
||||
@ -528,7 +537,7 @@ StScrollBar {
|
||||
border: 1px solid #215d9c; }
|
||||
|
||||
.tile-preview-left.on-primary {
|
||||
border-radius: 6px 6px 0 0 0; }
|
||||
border-radius: 6px 6px 0 0; }
|
||||
|
||||
.tile-preview-right.on-primary {
|
||||
border-radius: 0 6px 0 0; }
|
||||
@ -552,7 +561,7 @@ StScrollBar {
|
||||
-panel-corner-border-color: transparent; }
|
||||
#panel .panel-corner:active, #panel .panel-corner:overview, #panel .panel-corner:focus {
|
||||
-panel-corner-border-color: #256ab1; }
|
||||
#panel .panel-corner.lock-screen, #panel .panel-corner.login-screen, #panel .panel-cornerunlock-screen {
|
||||
#panel .panel-corner.lock-screen, #panel .panel-corner.login-screen, #panel .panel-corner.unlock-screen {
|
||||
-panel-corner-radius: 0;
|
||||
-panel-corner-background-color: transparent;
|
||||
-panel-corner-border-color: transparent; }
|
||||
@ -563,7 +572,9 @@ StScrollBar {
|
||||
color: #ccc;
|
||||
transition-duration: 100ms; }
|
||||
#panel .panel-button .app-menu-icon {
|
||||
-st-icon-style: symbolic; }
|
||||
-st-icon-style: symbolic;
|
||||
margin-left: 4px;
|
||||
margin-right: 4px; }
|
||||
#panel .panel-button:hover {
|
||||
color: white; }
|
||||
#panel .panel-button:active, #panel .panel-button:overview, #panel .panel-button:focus, #panel .panel-button:checked {
|
||||
@ -585,21 +596,58 @@ StScrollBar {
|
||||
#panel .screencast-indicator {
|
||||
color: #f57900; }
|
||||
|
||||
#calendarArea {
|
||||
padding: 0.75em 1.0em; }
|
||||
|
||||
.calendar {
|
||||
padding: .4em 1.75em .8em 1.75em;
|
||||
margin-bottom: 2em; }
|
||||
margin-bottom: 1em; }
|
||||
|
||||
.datemenu-date-label {
|
||||
padding: .4em 1.7em;
|
||||
text-align: center;
|
||||
color: #eeeeec;
|
||||
font-weight: bold;
|
||||
font-size: 110%; }
|
||||
.calendar,
|
||||
.datemenu-today-button,
|
||||
.datemenu-displays-box,
|
||||
.message-list-sections {
|
||||
margin: 0 1.5em; }
|
||||
|
||||
.calendar-vertical-separator {
|
||||
width: .3em;
|
||||
-stipple-width: 1px;
|
||||
-stipple-color: rgba(238, 238, 236, 0.2); }
|
||||
.datemenu-calendar-column {
|
||||
spacing: 0.5em; }
|
||||
|
||||
.datemenu-displays-section {
|
||||
padding-bottom: 3em; }
|
||||
|
||||
.datemenu-today-button,
|
||||
.world-clocks-button,
|
||||
.message-list-section-title {
|
||||
border-radius: 4px;
|
||||
padding: .4em; }
|
||||
|
||||
.message-list-section-list:ltr {
|
||||
padding-left: .4em; }
|
||||
|
||||
.message-list-section-list:rtl {
|
||||
padding-right: .4em; }
|
||||
|
||||
.datemenu-today-button:hover, .datemenu-today-button:focus,
|
||||
.world-clocks-button:hover,
|
||||
.world-clocks-button:focus,
|
||||
.message-list-section-title:hover,
|
||||
.message-list-section-title:focus {
|
||||
background-color: #454c4c; }
|
||||
.datemenu-today-button:active,
|
||||
.world-clocks-button:active,
|
||||
.message-list-section-title:active {
|
||||
color: white;
|
||||
background-color: #215d9c; }
|
||||
|
||||
.datemenu-today-button .date-label {
|
||||
font-size: 1.5em; }
|
||||
|
||||
.world-clocks-header,
|
||||
.message-list-section-title {
|
||||
color: #8e8e80;
|
||||
font-weight: bold; }
|
||||
|
||||
.world-clocks-grid {
|
||||
spacing-rows: 0.4em; }
|
||||
|
||||
.calendar-month-label {
|
||||
color: #e2e2df;
|
||||
@ -610,7 +658,6 @@ StScrollBar {
|
||||
color: white;
|
||||
background-color: transparent;
|
||||
width: 32px;
|
||||
background-position: center;
|
||||
border-radius: 4px; }
|
||||
.pager-button:hover, .pager-button:focus {
|
||||
background-color: rgba(238, 238, 236, 0.05); }
|
||||
@ -618,14 +665,14 @@ StScrollBar {
|
||||
background-color: rgba(57, 63, 63, 0.05); }
|
||||
|
||||
.calendar-change-month-back {
|
||||
background-image: url("calendar-arrow-left.svg"); }
|
||||
background-image: url("resource:///org/gnome/shell/theme/calendar-arrow-left.svg"); }
|
||||
.calendar-change-month-back:rtl {
|
||||
background-image: url("calendar-arrow-right.svg"); }
|
||||
background-image: url("resource:///org/gnome/shell/theme/calendar-arrow-right.svg"); }
|
||||
|
||||
.calendar-change-month-forward {
|
||||
background-image: url("calendar-arrow-right.svg"); }
|
||||
background-image: url("resource:///org/gnome/shell/theme/calendar-arrow-right.svg"); }
|
||||
.calendar-change-month-forward:rtl {
|
||||
background-image: url("calendar-arrow-left.svg"); }
|
||||
background-image: url("resource:///org/gnome/shell/theme/calendar-arrow-left.svg"); }
|
||||
|
||||
.calendar-day-base {
|
||||
font-size: 80%;
|
||||
@ -670,46 +717,63 @@ StScrollBar {
|
||||
color: rgba(238, 238, 236, 0.15);
|
||||
opacity: 0.5; }
|
||||
|
||||
.events-table {
|
||||
width: 15em;
|
||||
spacing-columns: 1em;
|
||||
padding: 0 1.4em; }
|
||||
.events-table:ltr {
|
||||
padding-right: 1.9em; }
|
||||
.events-table:rtl {
|
||||
padding-left: 1.9em; }
|
||||
/* Message list */
|
||||
.message-list {
|
||||
width: 420px; }
|
||||
|
||||
.events-day-header {
|
||||
font-weight: bold;
|
||||
color: #d6d6d1;
|
||||
padding-left: 0;
|
||||
padding-top: 1.2em; }
|
||||
.events-day-header:first-child {
|
||||
padding-top: 0; }
|
||||
.message-list-sections {
|
||||
spacing: 1.5em; }
|
||||
|
||||
.events-day-dayname {
|
||||
color: #d6d6d1;
|
||||
text-align: left;
|
||||
min-width: 20px; }
|
||||
.events-day-dayname:rtl {
|
||||
text-align: right; }
|
||||
.events-day-dayname .events-day-time {
|
||||
text-align: right; }
|
||||
.events-day-dayname .events-day-time:rtl {
|
||||
text-align: left; }
|
||||
.events-day-dayname .events-day-task {
|
||||
color: #d6d6d1; }
|
||||
.events-day-dayname .events-day-task:ltr {
|
||||
padding-left: 8px; }
|
||||
.events-day-dayname .events-day-task:rtl {
|
||||
padding-right: 8px; }
|
||||
.message-list-section,
|
||||
.message-list-section-list {
|
||||
spacing: 0.7em; }
|
||||
|
||||
.message-list-section-title-box {
|
||||
spacing: 0.4em; }
|
||||
|
||||
.message-list-section-close > StIcon {
|
||||
icon-size: 16px;
|
||||
border-radius: 8px;
|
||||
color: #393f3f;
|
||||
background-color: #59594f; }
|
||||
|
||||
/* FIXME: how do you do this in sass? */
|
||||
.message-list-section-close:hover > StIcon,
|
||||
.message-list-section-close:focus > StIcon {
|
||||
background-color: #8e8e80; }
|
||||
|
||||
.message {
|
||||
background-color: #454c4c;
|
||||
border-radius: 3px; }
|
||||
.message:hover, .message:focus {
|
||||
background-color: #5d6767; }
|
||||
|
||||
.message-icon-bin {
|
||||
padding: 8px 0px 8px 8px; }
|
||||
.message-icon-bin:rtl {
|
||||
padding: 8px 8px 8px 0px; }
|
||||
|
||||
.message-icon-bin > StIcon {
|
||||
icon-size: 48px; }
|
||||
|
||||
.message-secondary-bin {
|
||||
color: #8e8e80; }
|
||||
|
||||
.message-secondary-bin > StIcon {
|
||||
icon-size: 16px; }
|
||||
|
||||
.message-title {
|
||||
font-weight: bold; }
|
||||
|
||||
.message-content {
|
||||
padding: 8px; }
|
||||
|
||||
.system-switch-user-submenu-icon {
|
||||
icon-size: 24px;
|
||||
border: 1px solid rgba(238, 238, 236, 0.4); }
|
||||
|
||||
#appMenu {
|
||||
spinner-image: url("process-working.svg");
|
||||
spinner-image: url("resource:///org/gnome/shell/theme/process-working.svg");
|
||||
spacing: 4px; }
|
||||
#appMenu .label-shadow {
|
||||
color: transparent; }
|
||||
@ -726,12 +790,12 @@ StScrollBar {
|
||||
padding: 13px;
|
||||
border: 1px solid #282c2c; }
|
||||
.system-menu-action:hover, .system-menu-action:focus {
|
||||
color: #ffffff;
|
||||
background-color: #215d9c;
|
||||
background-color: rgba(238, 238, 236, 0.1);
|
||||
color: #eeeeec;
|
||||
border: none;
|
||||
padding: 14px; }
|
||||
.system-menu-action:active {
|
||||
background-color: #1c5187;
|
||||
background-color: #215d9c;
|
||||
color: #ffffff; }
|
||||
.system-menu-action > StIcon {
|
||||
icon-size: 16px; }
|
||||
@ -739,11 +803,11 @@ StScrollBar {
|
||||
.ripple-box {
|
||||
width: 52px;
|
||||
height: 52px;
|
||||
background-image: url("corner-ripple-ltr.png");
|
||||
background-image: url("resource:///org/gnome/shell/theme/corner-ripple-ltr.png");
|
||||
background-size: contain; }
|
||||
|
||||
.ripple-box:rtl {
|
||||
background-image: url("corner-ripple-rtl.png"); }
|
||||
background-image: url("resource:///org/gnome/shell/theme/corner-ripple-rtl.png"); }
|
||||
|
||||
.popup-menu-arrow {
|
||||
width: 16px;
|
||||
@ -752,8 +816,8 @@ StScrollBar {
|
||||
.popup-menu-icon {
|
||||
icon-size: 1.09em; }
|
||||
|
||||
.window-close, .notification-close {
|
||||
background-image: url("close-window.svg");
|
||||
.window-close {
|
||||
background-image: url("resource:///org/gnome/shell/theme/close-window.svg");
|
||||
background-size: 32px;
|
||||
height: 32px;
|
||||
width: 32px; }
|
||||
@ -763,12 +827,6 @@ StScrollBar {
|
||||
.window-close:rtl {
|
||||
-st-background-image-shadow: 2px 2px 6px rgba(0, 0, 0, 0.5); }
|
||||
|
||||
.notification-close {
|
||||
-shell-close-overlap-x: 14px;
|
||||
-shell-close-overlap-y: -12px; }
|
||||
.notification-close:rtl {
|
||||
-shell-close-overlap-x: -14px; }
|
||||
|
||||
/* NETWORK DIALOGS */
|
||||
.nm-dialog {
|
||||
max-height: 500px;
|
||||
@ -826,6 +884,9 @@ StScrollBar {
|
||||
#overview {
|
||||
spacing: 24px; }
|
||||
|
||||
.overview-controls {
|
||||
padding-bottom: 32px; }
|
||||
|
||||
.window-picker {
|
||||
-horizontal-spacing: 32px;
|
||||
-vertical-spacing: 32px;
|
||||
@ -851,14 +912,6 @@ StScrollBar {
|
||||
background-color: #215d9c;
|
||||
color: #ffffff; }
|
||||
|
||||
.messages-indicator {
|
||||
color: rgba(238, 238, 236, 0.8);
|
||||
height: 32px; }
|
||||
|
||||
.messages-indicator-contents {
|
||||
spacing: 12px;
|
||||
padding-bottom: 12px; }
|
||||
|
||||
.search-entry {
|
||||
width: 320px;
|
||||
padding: 7px 9px;
|
||||
@ -914,7 +967,7 @@ StScrollBar {
|
||||
.search-provider-icon-more {
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
background-image: url("more-results.svg"); }
|
||||
background-image: url("resource:///org/gnome/shell/theme/more-results.svg"); }
|
||||
|
||||
/* DASHBOARD */
|
||||
#dash {
|
||||
@ -928,7 +981,7 @@ StScrollBar {
|
||||
#dash:rtl {
|
||||
border-radius: 9px 0 0 9px; }
|
||||
#dash .placeholder {
|
||||
background-image: url("dash-placeholder.svg");
|
||||
background-image: url("resource:///org/gnome/shell/theme/dash-placeholder.svg");
|
||||
background-size: contain;
|
||||
height: 24px; }
|
||||
#dash .empty-dash-drop-target {
|
||||
@ -1052,13 +1105,13 @@ StScrollBar {
|
||||
.page-indicator .page-indicator-icon {
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
background-image: url(page-indicator-inactive.svg); }
|
||||
background-image: url(resource:///org/gnome/shell/theme/page-indicator-inactive.svg); }
|
||||
.page-indicator:hover .page-indicator-icon {
|
||||
background-image: url(page-indicator-hover.svg); }
|
||||
background-image: url(resource:///org/gnome/shell/theme/page-indicator-hover.svg); }
|
||||
.page-indicator:active .page-indicator-icon {
|
||||
background-image: url(page-indicator-active.svg); }
|
||||
background-image: url(resource:///org/gnome/shell/theme/page-indicator-active.svg); }
|
||||
.page-indicator:checked .page-indicator-icon, .page-indicator:checked:active {
|
||||
background-image: url(page-indicator-checked.svg); }
|
||||
background-image: url(resource:///org/gnome/shell/theme/page-indicator-checked.svg); }
|
||||
|
||||
.app-well-app > .overview-icon.overview-icon-with-label,
|
||||
.grid-search-result .overview-icon.overview-icon-with-label {
|
||||
@ -1093,65 +1146,41 @@ StScrollBar {
|
||||
color: #eeeeec; }
|
||||
|
||||
/* NOTIFICATIONS & MESSAGE TRAY */
|
||||
#message-tray {
|
||||
background: #17191a url("noise-texture.png");
|
||||
background-repeat: repeat;
|
||||
height: 72px;
|
||||
box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.5);
|
||||
padding: 4px; }
|
||||
#message-tray .message-tray-summary {
|
||||
height: 72px; }
|
||||
#message-tray .message-tray-menu-button StIcon {
|
||||
padding: 0 20px;
|
||||
color: #eeeeec;
|
||||
icon-size: 24px;
|
||||
opacity: 1; }
|
||||
#message-tray .message-tray-menu-button:hover StIcon {
|
||||
color: white; }
|
||||
#message-tray .message-tray-menu-button:active StIcon {
|
||||
color: #2a76c6; }
|
||||
#message-tray .no-messages-label {
|
||||
color: #d6d6d1; }
|
||||
|
||||
.url-highlighter {
|
||||
link-color: #215d9c; }
|
||||
link-color: #2a76c6; }
|
||||
|
||||
.notification {
|
||||
.notification-banner {
|
||||
font-size: 11pt;
|
||||
width: 34em;
|
||||
border-radius: 6px 6px 0 0;
|
||||
margin: 5px;
|
||||
border-radius: 6px;
|
||||
color: #eeeeec;
|
||||
background-color: #2e3436;
|
||||
border: 1px solid #1c1f1f;
|
||||
border-bottom-width: 0;
|
||||
spacing-rows: 4px;
|
||||
padding: 8px 8px 4px 8px;
|
||||
spacing-columns: 10px; }
|
||||
.notification.multi-line-notification {
|
||||
padding-bottom: 8px; }
|
||||
|
||||
.notification-unexpanded {
|
||||
min-height: 36px;
|
||||
height: 36px; }
|
||||
|
||||
.notification-with-image {
|
||||
min-height: 159px; }
|
||||
|
||||
.notification-body {
|
||||
spacing: 5px; }
|
||||
|
||||
.notification-actions {
|
||||
paddinf-top: 18px;
|
||||
spacing: 6px; }
|
||||
|
||||
.summary-source {
|
||||
border-radius: 0;
|
||||
-st-natural-width: 60px;
|
||||
padding: 9px;
|
||||
transition-duration: 100ms; }
|
||||
|
||||
.summary-source-button:hover .summary-source, .summary-source-button:selected .summary-source, .summary-source-button:focus .summary-source {
|
||||
background-color: #33393c; }
|
||||
border: 1px solid #1c1f1f; }
|
||||
.notification-banner:hover {
|
||||
background-color: #2e3436; }
|
||||
.notification-banner:focus {
|
||||
background-color: #2e3436; }
|
||||
.notification-banner .notification-icon {
|
||||
padding: 5px; }
|
||||
.notification-banner .notification-content {
|
||||
padding: 5px;
|
||||
spacing: 5px; }
|
||||
.notification-banner .secondary-icon {
|
||||
icon-size: 1.09em; }
|
||||
.notification-banner .notification-actions {
|
||||
background-color: #1c1f1f;
|
||||
padding-top: 2px;
|
||||
spacing: 1px; }
|
||||
.notification-banner .notification-button {
|
||||
padding: 4px 4px 5px;
|
||||
background-color: #222728; }
|
||||
.notification-banner .notification-button:first-child {
|
||||
border-radius: 0 0 0 6px; }
|
||||
.notification-banner .notification-button:last-child {
|
||||
border-radius: 0 0 6px 0; }
|
||||
.notification-banner .notification-button:hover, .notification-banner .notification-buttonfocus {
|
||||
background-color: #292f30; }
|
||||
|
||||
.summary-source-counter {
|
||||
font-size: 10pt;
|
||||
@ -1166,61 +1195,20 @@ StScrollBar {
|
||||
box-shadow: 0 2px 2px rgba(0, 0, 0, 0.5);
|
||||
border-radius: 0.9em; }
|
||||
|
||||
.summary-boxpointer {
|
||||
-arrow-border-radius: 15px;
|
||||
-arrow-background-color: #2e3436;
|
||||
-arrow-base: 36px;
|
||||
-arrow-rise: 18px;
|
||||
color: #eeeeec;
|
||||
-boxpointer-gap: 4px; }
|
||||
.summary-boxpointer .notification {
|
||||
border-radius: 9px;
|
||||
border-width: 0;
|
||||
background-color: transparent !important;
|
||||
padding-bottom: 12px; }
|
||||
.summary-boxpointer #summary-right-click-menu {
|
||||
padding-top: 12px;
|
||||
padding-bottom: 12px; }
|
||||
|
||||
.summary-notification-stack-scrollview {
|
||||
max-height: 24em;
|
||||
padding-top: 8px;
|
||||
padding-bottom: 8px; }
|
||||
.summary-notification-stack-scrollview:ltr {
|
||||
padding-right: 8px; }
|
||||
.summary-notification-stack-scrollview:rtl {
|
||||
padding-left: 8px; }
|
||||
|
||||
.notification-scrollview {
|
||||
max-height: 18em;
|
||||
-st-vfade-offset: 24px; }
|
||||
.notification-scrollview:ltr > StScrollBar {
|
||||
padding-left: 6px; }
|
||||
.notification-scrollview:rtl > StScrollBar {
|
||||
padding-right: 6px; }
|
||||
|
||||
.notification-button {
|
||||
height: 24px; }
|
||||
|
||||
.notification-icon-button {
|
||||
border-radius: 5px;
|
||||
padding: 5px;
|
||||
height: 24px;
|
||||
width: 24px; }
|
||||
.notification-icon-button > StIcon {
|
||||
icons-size: 16px;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
padding: 2px; }
|
||||
|
||||
.secondary-icon {
|
||||
icon-size: 1.09em; }
|
||||
|
||||
.chat-body {
|
||||
spacing: 5px; }
|
||||
|
||||
.chat-response {
|
||||
margin: 5px; }
|
||||
|
||||
.chat-log-message {
|
||||
color: #d6d6d1; }
|
||||
|
||||
.chat-empty-line {
|
||||
font-size: 4px; }
|
||||
.chat-new-group {
|
||||
padding-top: 1em; }
|
||||
|
||||
.chat-received {
|
||||
padding-left: 4px; }
|
||||
@ -1244,12 +1232,6 @@ StScrollBar {
|
||||
padding-left: 0;
|
||||
padding-right: 4px; }
|
||||
|
||||
.chat-notification-scrollview {
|
||||
max-height: 22em; }
|
||||
|
||||
.subscription-message {
|
||||
font-style: italic; }
|
||||
|
||||
.hotplug-transient-box {
|
||||
spacing: 6px;
|
||||
padding: 2px 72px 2px 12px; }
|
||||
@ -1289,6 +1271,38 @@ StScrollBar {
|
||||
color: pink; }
|
||||
|
||||
/* Eeeky things */
|
||||
.legacy-tray {
|
||||
background-color: #393f3f;
|
||||
border: 1px solid #1c1f1f;
|
||||
border-bottom-width: 0; }
|
||||
.legacy-tray:ltr {
|
||||
border-radius: 0 6px 0 0;
|
||||
border-left-width: 0; }
|
||||
.legacy-tray:rtl {
|
||||
border-radius: 6px 0 0 0;
|
||||
border-right-width: 0; }
|
||||
|
||||
.legacy-tray-handle,
|
||||
.legacy-tray-icon {
|
||||
padding: 6px; }
|
||||
.legacy-tray-handle StIcon,
|
||||
.legacy-tray-icon StIcon {
|
||||
icon-size: 24px; }
|
||||
.legacy-tray-handle:hover, .legacy-tray-handle:focus,
|
||||
.legacy-tray-icon:hover,
|
||||
.legacy-tray-icon:focus {
|
||||
background-color: rgba(238, 238, 236, 0.1); }
|
||||
|
||||
.legacy-tray-icon-box {
|
||||
spacing: 12px; }
|
||||
.legacy-tray-icon-box:ltr {
|
||||
padding-left: 12px; }
|
||||
.legacy-tray-icon-box:rtl {
|
||||
padding-right: 12px; }
|
||||
.legacy-tray-icon-box StButton {
|
||||
width: 24px;
|
||||
height: 24px; }
|
||||
|
||||
.magnifier-zoom-region {
|
||||
border: 2px solid #215d9c; }
|
||||
.magnifier-zoom-region.full-screen {
|
||||
@ -1371,15 +1385,18 @@ StScrollBar {
|
||||
color: #ffffff; }
|
||||
|
||||
.candidate-page-button-box {
|
||||
height: 2em;
|
||||
width: 80px; }
|
||||
height: 2em; }
|
||||
.vertical .candidate-page-button-box {
|
||||
padding-top: 0.5em; }
|
||||
.horizontal .candidate-page-button-box {
|
||||
padding-left: 0.5em; }
|
||||
|
||||
.candidate-page-button {
|
||||
padding: 4px; }
|
||||
|
||||
.candidate-page-button-previous {
|
||||
border-radius: 4px 0px 0px 4px; }
|
||||
border-radius: 4px 0px 0px 4px;
|
||||
border-right-width: 0; }
|
||||
|
||||
.candidate-page-button-next {
|
||||
border-radius: 0px 4px 4px 0px; }
|
||||
@ -1390,10 +1407,12 @@ StScrollBar {
|
||||
/* Auth Dialogs & Screen Shield */
|
||||
.framed-user-icon {
|
||||
background-size: contain;
|
||||
border: 2px solid #1c1f1f;
|
||||
border: 2px solid #eeeeec;
|
||||
color: #eeeeec;
|
||||
border-radius: 3px; }
|
||||
.framed-user-icon:hover {
|
||||
border-color: #656f6f; }
|
||||
border-color: white;
|
||||
color: white; }
|
||||
|
||||
.login-dialog-banner-view {
|
||||
padding-top: 24px;
|
||||
@ -1490,9 +1509,10 @@ StScrollBar {
|
||||
color: #ffffff; }
|
||||
.login-dialog-user-list-item .login-dialog-timed-login-indicator {
|
||||
height: 2px;
|
||||
background-color: transparent; }
|
||||
margin: 2px 0 0 0;
|
||||
background-color: #eeeeec; }
|
||||
.login-dialog-user-list-item:focus .login-dialog-timed-login-indicator {
|
||||
background-color: #2e3436; }
|
||||
background-color: #ffffff; }
|
||||
|
||||
.login-dialog-username,
|
||||
.user-widget-label {
|
||||
@ -1585,7 +1605,7 @@ StScrollBar {
|
||||
box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.4); }
|
||||
|
||||
#lockDialogGroup {
|
||||
background: #2e3436 url(noise-texture.png);
|
||||
background: #2e3436 url(resource:///org/gnome/shell/theme/noise-texture.png);
|
||||
background-repeat: repeat; }
|
||||
|
||||
#screenShieldNotifications StButton#vhandle, #screenShieldNotifications StButton#hhandle {
|
||||
|
119
data/theme/no-events.svg
Normal file
119
data/theme/no-events.svg
Normal file
@ -0,0 +1,119 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="64px"
|
||||
height="64px"
|
||||
id="svg3471"
|
||||
version="1.1"
|
||||
inkscape:version="0.48.5 r10040"
|
||||
sodipodi:docname="New document 5">
|
||||
<defs
|
||||
id="defs3473" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="5.5"
|
||||
inkscape:cx="32"
|
||||
inkscape:cy="32"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="true"
|
||||
inkscape:document-units="px"
|
||||
inkscape:grid-bbox="true"
|
||||
inkscape:window-width="1461"
|
||||
inkscape:window-height="772"
|
||||
inkscape:window-x="37"
|
||||
inkscape:window-y="64"
|
||||
inkscape:window-maximized="0" />
|
||||
<metadata
|
||||
id="metadata3476">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
id="layer1"
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer">
|
||||
<g
|
||||
transform="matrix(4,0,0,4,1.9999997,2.3636364)"
|
||||
id="g19145"
|
||||
style="fill:#bebebe;fill-opacity:1;display:inline">
|
||||
<g
|
||||
id="g19147"
|
||||
inkscape:label="status"
|
||||
style="fill:#bebebe;fill-opacity:1;display:inline"
|
||||
transform="translate(-541.0002,-301)" />
|
||||
<g
|
||||
style="fill:#bebebe;fill-opacity:1"
|
||||
id="g19149"
|
||||
inkscape:label="devices"
|
||||
transform="translate(-541.0002,-301)" />
|
||||
<g
|
||||
style="fill:#bebebe;fill-opacity:1"
|
||||
id="g19151"
|
||||
inkscape:label="apps"
|
||||
transform="translate(-541.0002,-301)" />
|
||||
<g
|
||||
style="fill:#bebebe;fill-opacity:1"
|
||||
id="g19153"
|
||||
inkscape:label="places"
|
||||
transform="translate(-541.0002,-301)" />
|
||||
<g
|
||||
style="fill:#bebebe;fill-opacity:1"
|
||||
id="g19155"
|
||||
inkscape:label="mimetypes"
|
||||
transform="translate(-541.0002,-301)">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 543.0002,301 c -1.05237,0 -2,0.84508 -2,1.9375 l 0,11.125 c 0,1.09242 0.94763,1.9375 2,1.9375 l 11,0 c 1.05237,0 2,-0.84508 2,-1.9375 l 0,-11.125 c 0,-1.09242 -0.94763,-1.9375 -2,-1.9375 l -11,0 z m 0,5 3.03125,0 0,2 -3.03125,0 0,-2 z m 4.03125,0 2.96875,0 0,2 -2.96875,0 0,-2 z m 3.96875,0 3,0 0,2 -3,0 0,-2 z m -8,3 3.03125,0 0,2 -3.03125,0 0,-2 z m 4.03125,0 2.96875,0 0,2 -2.96875,0 0,-2 z m 3.96875,0 3,0 0,2 -3,0 0,-2 z m -8,3 3.03125,0 0,2 -3.03125,0 0,-2 z m 4.03125,0 2.96875,0 0,2 -2.96875,0 0,-2 z m 3.96875,0 3,0 0,2 -3,0 0,-2 z"
|
||||
id="path19157"
|
||||
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans" />
|
||||
<rect
|
||||
height="1.9999993"
|
||||
id="rect19159"
|
||||
style="opacity:0.35;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
||||
width="2.9999993"
|
||||
x="551.00018"
|
||||
y="309" />
|
||||
</g>
|
||||
<g
|
||||
id="g19161"
|
||||
inkscape:label="emblems"
|
||||
style="fill:#bebebe;fill-opacity:1;display:inline"
|
||||
transform="translate(-541.0002,-301)" />
|
||||
<g
|
||||
id="g19163"
|
||||
inkscape:label="emotes"
|
||||
style="fill:#bebebe;fill-opacity:1;display:inline"
|
||||
transform="translate(-541.0002,-301)" />
|
||||
<g
|
||||
id="g19165"
|
||||
inkscape:label="categories"
|
||||
style="fill:#bebebe;fill-opacity:1;display:inline"
|
||||
transform="translate(-541.0002,-301)" />
|
||||
<g
|
||||
id="g19167"
|
||||
inkscape:label="actions"
|
||||
style="fill:#bebebe;fill-opacity:1;display:inline"
|
||||
transform="translate(-541.0002,-301)" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 4.7 KiB |
114
data/theme/no-notifications.svg
Normal file
114
data/theme/no-notifications.svg
Normal file
@ -0,0 +1,114 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="64px"
|
||||
height="64px"
|
||||
id="svg3393"
|
||||
version="1.1"
|
||||
inkscape:version="0.48.5 r10040"
|
||||
sodipodi:docname="New document 2">
|
||||
<defs
|
||||
id="defs3395" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="5.5"
|
||||
inkscape:cx="32"
|
||||
inkscape:cy="32"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="true"
|
||||
inkscape:document-units="px"
|
||||
inkscape:grid-bbox="true"
|
||||
inkscape:window-width="697"
|
||||
inkscape:window-height="613"
|
||||
inkscape:window-x="100"
|
||||
inkscape:window-y="77"
|
||||
inkscape:window-maximized="0" />
|
||||
<metadata
|
||||
id="metadata3398">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
id="layer1"
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer">
|
||||
<g
|
||||
style="display:inline"
|
||||
transform="matrix(4,0,0,4,0.29733827,-0.35415646)"
|
||||
id="g19245">
|
||||
<g
|
||||
id="g19247"
|
||||
inkscape:label="status"
|
||||
style="display:inline"
|
||||
transform="translate(-323.02908,-649.02581)" />
|
||||
<g
|
||||
id="g19249"
|
||||
inkscape:label="devices"
|
||||
transform="translate(-323.02908,-649.02581)" />
|
||||
<g
|
||||
id="g19251"
|
||||
inkscape:label="apps"
|
||||
transform="translate(-323.02908,-649.02581)">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 331.9377,653 c 0.0187,0.16677 0.0625,0.32822 0.0625,0.5 0,2.48528 -2.01472,4.5 -4.5,4.5 -0.11769,0 -0.22834,-0.0224 -0.34375,-0.0312 l 0,2.21875 c 0,1.00412 0.80838,1.8125 1.8125,1.8125 l 1.54511,-5e-5 2,2.04688 2.0625,-2.04688 1.61114,0 c 1.00413,0 1.8125,-0.80838 1.8125,-1.8125 l 0,-5.375 c 0,-1.00412 -0.80837,-1.8125 -1.8125,-1.8125 z"
|
||||
id="path19253"
|
||||
sodipodi:nodetypes="csscsscccssssc"
|
||||
style="opacity:0.5;color:#000000;fill:#c3c3c3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 327.5002,650 c -1.933,0 -3.5,1.567 -3.5,3.5 0,1.933 1.567,3.5 3.5,3.5 1.933,0 3.5,-1.567 3.5,-3.5 0,-1.933 -1.567,-3.5 -3.5,-3.5 z m -0.53125,1 1.03125,0 -0.0625,1.375 a 0.19951718,0.19951718 0 0 0 0,0.0625 0.19951718,0.19951718 0 0 0 0,0.0312 0.19951718,0.19951718 0 0 0 0.125,0.125 0.19951718,0.19951718 0 0 0 0.0312,0 0.19951718,0.19951718 0 0 0 0.0625,0 0.19951718,0.19951718 0 0 0 0.0625,0 0.19951718,0.19951718 0 0 0 0.0312,-0.0312 l 1.15625,-0.75 0.5,0.90625 -1.21875,0.625 a 0.19951718,0.19951718 0 0 0 -0.0312,0 0.19951718,0.19951718 0 0 0 -0.0312,0.0312 0.19951718,0.19951718 0 0 0 -0.0312,0.0937 0.19951718,0.19951718 0 0 0 0,0.0625 0.19951718,0.19951718 0 0 0 0,0.0312 0.19951718,0.19951718 0 0 0 0.0312,0.0625 0.19951718,0.19951718 0 0 0 0.0312,0.0312 0.19951718,0.19951718 0 0 0 0.0312,0.0312 l 1.25,0.625 -0.53125,0.90625 -1.15625,-0.781 a 0.19951718,0.19951718 0 0 0 -0.0312,0 0.19951718,0.19951718 0 0 0 -0.0625,-0.0312 0.19951718,0.19951718 0 0 0 -0.0625,0 0.19951718,0.19951718 0 0 0 -0.125,0.0937 0.19951718,0.19951718 0 0 0 -0.0312,0.0312 0.19951718,0.19951718 0 0 0 0,0.0312 0.19951718,0.19951718 0 0 0 0,0.0625 l 0.0625,1.3751 -1.03125,0 0.0937,-1.375 a 0.19951718,0.19951718 0 0 0 -0.0312,-0.0937 0.19951718,0.19951718 0 0 0 -0.0312,-0.0625 0.19951718,0.19951718 0 0 0 -0.0625,-0.0312 0.19951718,0.19951718 0 0 0 -0.0625,-0.0312 0.19951718,0.19951718 0 0 0 -0.0312,0 0.19951718,0.19951718 0 0 0 -0.0937,0.0312 l -1.1875,0.78125 -0.5,-0.90625 1.25,-0.625 a 0.19951718,0.19951718 0 0 0 0.0312,-0.0312 0.19951718,0.19951718 0 0 0 0.0312,-0.0312 0.19951718,0.19951718 0 0 0 0.0312,-0.0625 0.19951718,0.19951718 0 0 0 0,-0.0312 0.19951718,0.19951718 0 0 0 0,-0.0625 0.19951718,0.19951718 0 0 0 0,-0.0312 0.19951718,0.19951718 0 0 0 -0.0312,-0.0625 0.19951718,0.19951718 0 0 0 -0.0312,-0.0312 0.19951718,0.19951718 0 0 0 -0.0312,0 l -1.25,-0.625 0.5,-0.90625 1.1875,0.75 a 0.19951718,0.19951718 0 0 0 0.0312,0.0312 0.19951718,0.19951718 0 0 0 0.0625,0 0.19951718,0.19951718 0 0 0 0.0625,0 0.19951718,0.19951718 0 0 0 0.0312,0 0.19951718,0.19951718 0 0 0 0.0312,-0.0312 0.19951718,0.19951718 0 0 0 0.0312,-0.0312 0.19951718,0.19951718 0 0 0 0.0312,-0.0312 0.19951718,0.19951718 0 0 0 0,-0.0312 0.19951718,0.19951718 0 0 0 0.0312,-0.0625 0.19951718,0.19951718 0 0 0 0,-0.0312 L 326.96895,651 z"
|
||||
id="path19255"
|
||||
style="color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
|
||||
</g>
|
||||
<g
|
||||
id="g19257"
|
||||
inkscape:label="places"
|
||||
transform="translate(-323.02908,-649.02581)" />
|
||||
<g
|
||||
id="g19259"
|
||||
inkscape:label="mimetypes"
|
||||
transform="translate(-323.02908,-649.02581)" />
|
||||
<g
|
||||
id="g19261"
|
||||
inkscape:label="emblems"
|
||||
style="display:inline"
|
||||
transform="translate(-323.02908,-649.02581)" />
|
||||
<g
|
||||
id="g19263"
|
||||
inkscape:label="emotes"
|
||||
style="display:inline"
|
||||
transform="translate(-323.02908,-649.02581)" />
|
||||
<g
|
||||
id="g19265"
|
||||
inkscape:label="categories"
|
||||
style="display:inline"
|
||||
transform="translate(-323.02908,-649.02581)" />
|
||||
<g
|
||||
id="g19267"
|
||||
inkscape:label="actions"
|
||||
style="display:inline"
|
||||
transform="translate(-323.02908,-649.02581)" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 6.1 KiB |
3
data/theme/parse-sass.sh
Executable file
3
data/theme/parse-sass.sh
Executable file
@ -0,0 +1,3 @@
|
||||
#!/usr/bin/bash
|
||||
|
||||
bundle exec sass --update --sourcemap=none .
|
@ -54,7 +54,6 @@ const Application = new Lang.Class({
|
||||
this._startupUuid = null;
|
||||
this._loaded = false;
|
||||
this._skipMainWindow = false;
|
||||
this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell' });
|
||||
},
|
||||
|
||||
_extensionAvailable: function(uuid) {
|
||||
|
@ -194,17 +194,15 @@ const AuthPrompt = new Lang.Class({
|
||||
},
|
||||
|
||||
_onAskQuestion: function(verifier, serviceName, question, passwordChar) {
|
||||
if (this._preemptiveAnswer) {
|
||||
if (this._queryingService)
|
||||
this._userVerifier.answerQuery(this._queryingService, this._preemptiveAnswer);
|
||||
this._preemptiveAnswer = null;
|
||||
return;
|
||||
}
|
||||
|
||||
if (this._queryingService)
|
||||
this.clear();
|
||||
|
||||
this._queryingService = serviceName;
|
||||
if (this._preemptiveAnswer) {
|
||||
this._userVerifier.answerQuery(this._queryingService, this._preemptiveAnswer);
|
||||
this._preemptiveAnswer = null;
|
||||
return;
|
||||
}
|
||||
this.setPasswordChar(passwordChar);
|
||||
this.setQuestion(question);
|
||||
|
||||
|
@ -22,6 +22,7 @@ const Clutter = imports.gi.Clutter;
|
||||
const Gdm = imports.gi.Gdm;
|
||||
const Gio = imports.gi.Gio;
|
||||
const GLib = imports.gi.GLib;
|
||||
const GObject = imports.gi.GObject;
|
||||
const Gtk = imports.gi.Gtk;
|
||||
const Lang = imports.lang;
|
||||
const Mainloop = imports.mainloop;
|
||||
@ -48,6 +49,7 @@ const _FADE_ANIMATION_TIME = 0.25;
|
||||
const _SCROLL_ANIMATION_TIME = 0.5;
|
||||
const _TIMED_LOGIN_IDLE_THRESHOLD = 5.0;
|
||||
const _LOGO_ICON_HEIGHT = 48;
|
||||
const _MAX_BOTTOM_MENU_ITEMS = 5;
|
||||
|
||||
const UserListItem = new Lang.Class({
|
||||
Name: 'UserListItem',
|
||||
@ -71,6 +73,9 @@ const UserListItem = new Lang.Class({
|
||||
this._userWidget = new UserWidget.UserWidget(this.user);
|
||||
layout.add(this._userWidget.actor);
|
||||
|
||||
this._userWidget.actor.bind_property('label-actor', this.actor, 'label-actor',
|
||||
GObject.BindingFlags.SYNC_CREATE);
|
||||
|
||||
this._timedLoginIndicator = new St.Bin({ style_class: 'login-dialog-timed-login-indicator',
|
||||
scale_x: 0 });
|
||||
layout.add(this._timedLoginIndicator);
|
||||
@ -279,7 +284,16 @@ const SessionMenuButton = new Lang.Class({
|
||||
|
||||
this.actor = new St.Bin({ child: this._button });
|
||||
|
||||
this._menu = new PopupMenu.PopupMenu(this._button, 0, St.Side.TOP);
|
||||
let side = St.Side.TOP;
|
||||
let align = 0;
|
||||
if (Gdm.get_session_ids().length > _MAX_BOTTOM_MENU_ITEMS) {
|
||||
if (this.actor.text_direction == Clutter.TextDirection.RTL)
|
||||
side = St.Side.RIGHT;
|
||||
else
|
||||
side = St.Side.LEFT;
|
||||
align = 0.5;
|
||||
}
|
||||
this._menu = new PopupMenu.PopupMenu(this._button, align, side);
|
||||
Main.uiGroup.add_actor(this._menu.actor);
|
||||
this._menu.actor.hide();
|
||||
|
||||
@ -473,6 +487,10 @@ const LoginDialog = new Lang.Class({
|
||||
this._disableUserList = undefined;
|
||||
this._userListLoaded = false;
|
||||
|
||||
this._realmManager = new Realmd.Manager();
|
||||
this._realmSignalId = this._realmManager.connect('login-format-changed',
|
||||
Lang.bind(this, this._showRealmLoginHint));
|
||||
|
||||
LoginManager.getLoginManager().getCurrentSessionProxy(Lang.bind(this, this._gotGreeterSessionProxy));
|
||||
|
||||
// If the user list is enabled, it should take key focus; make sure the
|
||||
@ -488,7 +506,7 @@ const LoginDialog = new Lang.Class({
|
||||
let [minWidth, minHeight, natWidth, natHeight] = this._bannerView.get_preferred_size();
|
||||
let centerX = dialogBox.x1 + (dialogBox.x2 - dialogBox.x1) / 2;
|
||||
|
||||
actorBox.x1 = centerX - natWidth / 2;
|
||||
actorBox.x1 = Math.floor(centerX - natWidth / 2);
|
||||
actorBox.y1 = dialogBox.y1 + Main.layoutManager.panelBox.height;
|
||||
actorBox.x2 = actorBox.x1 + natWidth;
|
||||
actorBox.y2 = actorBox.y1 + natHeight;
|
||||
@ -502,7 +520,7 @@ const LoginDialog = new Lang.Class({
|
||||
let [minWidth, minHeight, natWidth, natHeight] = this._logoBin.get_preferred_size();
|
||||
let centerX = dialogBox.x1 + (dialogBox.x2 - dialogBox.x1) / 2;
|
||||
|
||||
actorBox.x1 = centerX - natWidth / 2;
|
||||
actorBox.x1 = Math.floor(centerX - natWidth / 2);
|
||||
actorBox.y1 = dialogBox.y2 - natHeight;
|
||||
actorBox.x2 = actorBox.x1 + natWidth;
|
||||
actorBox.y2 = actorBox.y1 + natHeight;
|
||||
@ -517,8 +535,8 @@ const LoginDialog = new Lang.Class({
|
||||
let centerX = dialogBox.x1 + (dialogBox.x2 - dialogBox.x1) / 2;
|
||||
let centerY = dialogBox.y1 + (dialogBox.y2 - dialogBox.y1) / 2;
|
||||
|
||||
actorBox.x1 = centerX - natWidth / 2;
|
||||
actorBox.y1 = centerY - natHeight / 2;
|
||||
actorBox.x1 = Math.floor(centerX - natWidth / 2);
|
||||
actorBox.y1 = Math.floor(centerY - natHeight / 2);
|
||||
actorBox.x2 = actorBox.x1 + natWidth;
|
||||
actorBox.y2 = actorBox.y1 + natHeight;
|
||||
|
||||
@ -573,7 +591,7 @@ const LoginDialog = new Lang.Class({
|
||||
let leftOverTopSpace = leftOverYSpace / 2;
|
||||
|
||||
// Then, shift the banner into the middle of that extra space
|
||||
let yShift = leftOverTopSpace / 2;
|
||||
let yShift = Math.floor(leftOverTopSpace / 2);
|
||||
|
||||
bannerAllocation.y1 += yShift;
|
||||
bannerAllocation.y2 += yShift;
|
||||
@ -599,8 +617,8 @@ const LoginDialog = new Lang.Class({
|
||||
let centerGap = wideSpacing / 8;
|
||||
|
||||
// place the banner along the left edge of the center margin
|
||||
bannerAllocation.x2 = centerX - centerGap / 2;
|
||||
bannerAllocation.x1 = bannerAllocation.x2 - wideBannerWidth;
|
||||
bannerAllocation.x2 = Math.floor(centerX - centerGap / 2);
|
||||
bannerAllocation.x1 = Math.floor(bannerAllocation.x2 - wideBannerWidth);
|
||||
|
||||
// figure out how tall it would like to be and try to accomodate
|
||||
// but don't let it get too close to the logo
|
||||
@ -608,11 +626,11 @@ const LoginDialog = new Lang.Class({
|
||||
|
||||
let maxWideHeight = dialogHeight - 3 * logoHeight;
|
||||
wideBannerHeight = Math.min(maxWideHeight, wideBannerHeight);
|
||||
bannerAllocation.y1 = centerY - wideBannerHeight / 2;
|
||||
bannerAllocation.y1 = Math.floor(centerY - wideBannerHeight / 2);
|
||||
bannerAllocation.y2 = bannerAllocation.y1 + wideBannerHeight;
|
||||
|
||||
// place the auth prompt along the right edge of the center margin
|
||||
authPromptAllocation.x1 = centerX + centerGap / 2;
|
||||
authPromptAllocation.x1 = Math.floor(centerX + centerGap / 2);
|
||||
authPromptAllocation.x2 = authPromptAllocation.x1 + authPromptWidth;
|
||||
} else {
|
||||
// If we aren't going to do a wide view, then we need to limit
|
||||
@ -622,7 +640,7 @@ const LoginDialog = new Lang.Class({
|
||||
leftOverYSpace += bannerHeight;
|
||||
|
||||
// Then figure out how much of that space is up top
|
||||
let availableTopSpace = leftOverYSpace / 2;
|
||||
let availableTopSpace = Math.floor(leftOverYSpace / 2);
|
||||
|
||||
// Then give all of that space to the banner
|
||||
bannerAllocation.y2 = bannerAllocation.y1 + availableTopSpace;
|
||||
@ -633,7 +651,7 @@ const LoginDialog = new Lang.Class({
|
||||
let leftOverYSpace = dialogHeight - userSelectionHeight - logoHeight;
|
||||
|
||||
if (leftOverYSpace > 0) {
|
||||
let topExpansion = leftOverYSpace / 2;
|
||||
let topExpansion = Math.floor(leftOverYSpace / 2);
|
||||
let bottomExpansion = topExpansion;
|
||||
|
||||
userSelectionAllocation.y1 -= topExpansion;
|
||||
@ -826,25 +844,22 @@ const LoginDialog = new Lang.Class({
|
||||
this._authPrompt.setPasswordChar('');
|
||||
this._authPrompt.setQuestion(_("Username: "));
|
||||
|
||||
let realmManager = new Realmd.Manager();
|
||||
let realmSignalId = realmManager.connect('login-format-changed',
|
||||
Lang.bind(this, this._showRealmLoginHint));
|
||||
this._showRealmLoginHint(realmManager.loginFormat);
|
||||
this._showRealmLoginHint(this._realmManager.loginFormat);
|
||||
|
||||
let nextSignalId = this._authPrompt.connect('next',
|
||||
Lang.bind(this, function() {
|
||||
this._authPrompt.disconnect(nextSignalId);
|
||||
this._authPrompt.updateSensitivity(false);
|
||||
let answer = this._authPrompt.getAnswer();
|
||||
this._user = this._userManager.get_user(answer);
|
||||
this._authPrompt.clear();
|
||||
this._authPrompt.startSpinning();
|
||||
this._authPrompt.begin({ userName: answer });
|
||||
this._updateCancelButton();
|
||||
|
||||
realmManager.disconnect(realmSignalId)
|
||||
realmManager.release();
|
||||
}));
|
||||
if (this._nextSignalId)
|
||||
this._authPrompt.disconnect(this._nextSignalId);
|
||||
this._nextSignalId = this._authPrompt.connect('next',
|
||||
Lang.bind(this, function() {
|
||||
this._authPrompt.disconnect(this._nextSignalId);
|
||||
this._nextSignalId = 0;
|
||||
this._authPrompt.updateSensitivity(false);
|
||||
let answer = this._authPrompt.getAnswer();
|
||||
this._user = this._userManager.get_user(answer);
|
||||
this._authPrompt.clear();
|
||||
this._authPrompt.startSpinning();
|
||||
this._authPrompt.begin({ userName: answer });
|
||||
this._updateCancelButton();
|
||||
}));
|
||||
this._updateCancelButton();
|
||||
|
||||
this._authPrompt.updateSensitivity(true);
|
||||
@ -1082,18 +1097,11 @@ const LoginDialog = new Lang.Class({
|
||||
},
|
||||
|
||||
_onUserListActivated: function(activatedItem) {
|
||||
let tasks = [function() {
|
||||
return GdmUtil.cloneAndFadeOutActor(this._userSelectionBox);
|
||||
},
|
||||
function() {
|
||||
this._setUserListExpanded(false);
|
||||
}];
|
||||
|
||||
this._user = activatedItem.user;
|
||||
|
||||
this._updateCancelButton();
|
||||
|
||||
let batch = new Batch.ConcurrentBatch(this, [new Batch.ConsecutiveBatch(this, tasks),
|
||||
let batch = new Batch.ConcurrentBatch(this, [GdmUtil.cloneAndFadeOutActor(this._userSelectionBox),
|
||||
this._beginVerificationForItem(activatedItem)]);
|
||||
batch.run();
|
||||
},
|
||||
@ -1127,6 +1135,12 @@ const LoginDialog = new Lang.Class({
|
||||
this._greeterSessionProxy.disconnect(this._greeterSessionProxyChangedId);
|
||||
this._greeterSessionProxy = null;
|
||||
}
|
||||
if (this._realmManager) {
|
||||
this._realmManager.disconnect(this._realmSignalId);
|
||||
this._realmSignalId = 0;
|
||||
this._realmManager.release();
|
||||
this._realmManager = null;
|
||||
}
|
||||
},
|
||||
|
||||
_loadUserList: function() {
|
||||
|
@ -35,8 +35,8 @@ const ALLOWED_FAILURES_KEY = 'allowed-failures';
|
||||
const LOGO_KEY = 'logo';
|
||||
const DISABLE_USER_LIST_KEY = 'disable-user-list';
|
||||
|
||||
// Give user 16ms to read each character of a PAM message
|
||||
const USER_READ_TIME = 16
|
||||
// Give user 48ms to read each character of a PAM message
|
||||
const USER_READ_TIME = 48
|
||||
|
||||
const MessageType = {
|
||||
NONE: 0,
|
||||
@ -410,7 +410,7 @@ const ShellUserVerifier = new Lang.Class({
|
||||
_updateDefaultService: function() {
|
||||
if (this._settings.get_boolean(PASSWORD_AUTHENTICATION_KEY))
|
||||
this._defaultService = PASSWORD_SERVICE_NAME;
|
||||
else if (this.smartcardDetected)
|
||||
else if (this._settings.get_boolean(SMARTCARD_AUTHENTICATION_KEY))
|
||||
this._defaultService = SMARTCARD_SERVICE_NAME;
|
||||
else if (this._haveFingerprintReader)
|
||||
this._defaultService = FINGERPRINT_SERVICE_NAME;
|
||||
|
@ -57,6 +57,7 @@
|
||||
<file>ui/layout.js</file>
|
||||
<file>ui/lightbox.js</file>
|
||||
<file>ui/lookingGlass.js</file>
|
||||
<file>ui/legacyTray.js</file>
|
||||
<file>ui/magnifier.js</file>
|
||||
<file>ui/magnifierDBus.js</file>
|
||||
<file>ui/main.js</file>
|
||||
|
103
js/misc/util.js
103
js/misc/util.js
@ -4,10 +4,12 @@ const Clutter = imports.gi.Clutter;
|
||||
const Gio = imports.gi.Gio;
|
||||
const GLib = imports.gi.GLib;
|
||||
const Lang = imports.lang;
|
||||
const Shell = imports.gi.Shell;
|
||||
const St = imports.gi.St;
|
||||
|
||||
const Main = imports.ui.main;
|
||||
const Tweener = imports.ui.tweener;
|
||||
const Params = imports.misc.params;
|
||||
|
||||
const SCROLL_TIME = 0.1;
|
||||
|
||||
@ -38,6 +40,8 @@ const _urlRegexp = new RegExp(
|
||||
')' +
|
||||
')', 'gi');
|
||||
|
||||
let _desktopSettings = null;
|
||||
|
||||
// findUrls:
|
||||
// @str: string to find URLs in
|
||||
//
|
||||
@ -157,6 +161,105 @@ function _handleSpawnError(command, err) {
|
||||
Main.notifyError(title, err.message);
|
||||
}
|
||||
|
||||
function formatTime(time, params) {
|
||||
let date;
|
||||
// HACK: The built-in Date type sucks at timezones, which we need for the
|
||||
// world clock; it's often more convenient though, so allow either
|
||||
// Date or GLib.DateTime as parameter
|
||||
if (time instanceof Date)
|
||||
date = GLib.DateTime.new_from_unix_local(time.getTime() / 1000);
|
||||
else
|
||||
date = time;
|
||||
|
||||
let now = GLib.DateTime.new_now_local();
|
||||
|
||||
let daysAgo = now.difference(date) / (24 * 60 * 60 * 1000 * 1000);
|
||||
|
||||
let format;
|
||||
|
||||
if (_desktopSettings == null)
|
||||
_desktopSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.interface' });
|
||||
let clockFormat = _desktopSettings.get_string('clock-format');
|
||||
let hasAmPm = date.format('%p') != '';
|
||||
|
||||
params = Params.parse(params, { timeOnly: false });
|
||||
|
||||
if (clockFormat == '24h' || !hasAmPm) {
|
||||
// Show only the time if date is on today
|
||||
if (daysAgo < 1 || params.timeOnly)
|
||||
/* Translators: Time in 24h format */
|
||||
format = N_("%H\u2236%M");
|
||||
// Show the word "Yesterday" and time if date is on yesterday
|
||||
else if (daysAgo <2)
|
||||
/* Translators: this is the word "Yesterday" followed by a
|
||||
time string in 24h format. i.e. "Yesterday, 14:30" */
|
||||
// xgettext:no-c-format
|
||||
format = N_("Yesterday, %H\u2236%M");
|
||||
// Show a week day and time if date is in the last week
|
||||
else if (daysAgo < 7)
|
||||
/* Translators: this is the week day name followed by a time
|
||||
string in 24h format. i.e. "Monday, 14:30" */
|
||||
// xgettext:no-c-format
|
||||
format = N_("%A, %H\u2236%M");
|
||||
else if (date.get_year() == now.get_year())
|
||||
/* Translators: this is the month name and day number
|
||||
followed by a time string in 24h format.
|
||||
i.e. "May 25, 14:30" */
|
||||
// xgettext:no-c-format
|
||||
format = N_("%B %d, %H\u2236%M");
|
||||
else
|
||||
/* Translators: this is the month name, day number, year
|
||||
number followed by a time string in 24h format.
|
||||
i.e. "May 25 2012, 14:30" */
|
||||
// xgettext:no-c-format
|
||||
format = N_("%B %d %Y, %H\u2236%M");
|
||||
} else {
|
||||
// Show only the time if date is on today
|
||||
if (daysAgo < 1 || params.timeOnly)
|
||||
/* Translators: Time in 12h format */
|
||||
format = N_("%l\u2236%M %p");
|
||||
// Show the word "Yesterday" and time if date is on yesterday
|
||||
else if (daysAgo <2)
|
||||
/* Translators: this is the word "Yesterday" followed by a
|
||||
time string in 12h format. i.e. "Yesterday, 2:30 pm" */
|
||||
// xgettext:no-c-format
|
||||
format = N_("Yesterday, %l\u2236%M %p");
|
||||
// Show a week day and time if date is in the last week
|
||||
else if (daysAgo < 7)
|
||||
/* Translators: this is the week day name followed by a time
|
||||
string in 12h format. i.e. "Monday, 2:30 pm" */
|
||||
// xgettext:no-c-format
|
||||
format = N_("%A, %l\u2236%M %p");
|
||||
else if (date.get_year() == now.get_year())
|
||||
/* Translators: this is the month name and day number
|
||||
followed by a time string in 12h format.
|
||||
i.e. "May 25, 2:30 pm" */
|
||||
// xgettext:no-c-format
|
||||
format = N_("%B %d, %l\u2236%M %p");
|
||||
else
|
||||
/* Translators: this is the month name, day number, year
|
||||
number followed by a time string in 12h format.
|
||||
i.e. "May 25 2012, 2:30 pm"*/
|
||||
// xgettext:no-c-format
|
||||
format = N_("%B %d %Y, %l\u2236%M %p");
|
||||
}
|
||||
return date.format(Shell.util_translate_time_string(format));
|
||||
}
|
||||
|
||||
function createTimeLabel(date, params) {
|
||||
if (_desktopSettings == null)
|
||||
_desktopSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.interface' });
|
||||
|
||||
let label = new St.Label({ text: formatTime(date, params) });
|
||||
let id = _desktopSettings.connect('changed::clock-format', function() {
|
||||
label.text = formatTime(date, params);
|
||||
});
|
||||
label.connect('destroy', function() {
|
||||
_desktopSettings.disconnect(id);
|
||||
});
|
||||
return label;
|
||||
}
|
||||
|
||||
// lowerBound:
|
||||
// @array: an array or array-like object, already sorted
|
||||
// according to @cmp
|
||||
|
@ -366,8 +366,6 @@ const AllView = new Lang.Class({
|
||||
Extends: BaseAppView,
|
||||
|
||||
_init: function() {
|
||||
this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell' });
|
||||
|
||||
this.parent({ usePagination: true }, null);
|
||||
this._scrollView = new St.ScrollView({ style_class: 'all-apps',
|
||||
x_expand: true,
|
||||
@ -525,7 +523,7 @@ const AllView = new Lang.Class({
|
||||
// at least on single-monitor setups.
|
||||
// This also disables drag-to-launch on multi-monitor setups,
|
||||
// but we hope that is not used much.
|
||||
let favoritesWritable = this._settings.is_writable('favorite-apps');
|
||||
let favoritesWritable = global.settings.is_writable('favorite-apps');
|
||||
|
||||
apps.forEach(Lang.bind(this, function(appId) {
|
||||
let app = appSys.lookup_app(appId);
|
||||
@ -541,6 +539,13 @@ const AllView = new Lang.Class({
|
||||
|
||||
// Overriden from BaseAppView
|
||||
animate: function (animationDirection, onComplete) {
|
||||
this._scrollView.reactive = false;
|
||||
let completionFunc = Lang.bind(this, function() {
|
||||
this._scrollView.reactive = true;
|
||||
if (onComplete)
|
||||
onComplete();
|
||||
});
|
||||
|
||||
if (animationDirection == IconGrid.AnimationDirection.OUT &&
|
||||
this._displayingPopup && this._currentPopup) {
|
||||
this._currentPopup.popdown();
|
||||
@ -551,10 +556,10 @@ const AllView = new Lang.Class({
|
||||
// signal handler, call again animate which will
|
||||
// call the parent given that popup is already
|
||||
// closed.
|
||||
this.animate(animationDirection, onComplete);
|
||||
this.animate(animationDirection, completionFunc);
|
||||
}));
|
||||
} else {
|
||||
this.parent(animationDirection, onComplete);
|
||||
this.parent(animationDirection, completionFunc);
|
||||
if (animationDirection == IconGrid.AnimationDirection.OUT)
|
||||
this._pageIndicators.animateIndicators(animationDirection);
|
||||
}
|
||||
@ -641,7 +646,7 @@ const AllView = new Lang.Class({
|
||||
},
|
||||
|
||||
_onScroll: function(actor, event) {
|
||||
if (this._displayingPopup)
|
||||
if (this._displayingPopup || !this._scrollView.reactive)
|
||||
return Clutter.EVENT_STOP;
|
||||
|
||||
let direction = event.get_scroll_direction();
|
||||
@ -776,8 +781,6 @@ const FrequentView = new Lang.Class({
|
||||
_init: function() {
|
||||
this.parent(null, { fillParent: true });
|
||||
|
||||
this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell' });
|
||||
|
||||
this.actor = new St.Widget({ style_class: 'frequent-apps',
|
||||
layout_manager: new Clutter.BinLayout(),
|
||||
x_expand: true, y_expand: true });
|
||||
@ -820,7 +823,7 @@ const FrequentView = new Lang.Class({
|
||||
// at least on single-monitor setups.
|
||||
// This also disables drag-to-launch on multi-monitor setups,
|
||||
// but we hope that is not used much.
|
||||
let favoritesWritable = this._settings.is_writable('favorite-apps');
|
||||
let favoritesWritable = global.settings.is_writable('favorite-apps');
|
||||
|
||||
for (let i = 0; i < mostUsed.length; i++) {
|
||||
if (!mostUsed[i].get_app_info().should_show())
|
||||
@ -1702,7 +1705,10 @@ const AppIcon = new Lang.Class({
|
||||
if (!isPoppedUp)
|
||||
this._onMenuPoppedDown();
|
||||
}));
|
||||
Main.overview.connect('hiding', Lang.bind(this, function () { this._menu.close(); }));
|
||||
let id = Main.overview.connect('hiding', Lang.bind(this, function () { this._menu.close(); }));
|
||||
this.actor.connect('destroy', function() {
|
||||
Main.overview.disconnect(id);
|
||||
});
|
||||
|
||||
this._menuManager.addMenu(this._menu);
|
||||
}
|
||||
@ -1794,8 +1800,6 @@ const AppIconMenu = new Lang.Class({
|
||||
|
||||
this.actor.add_style_class_name('app-well-menu');
|
||||
|
||||
this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell' });
|
||||
|
||||
// Chain our visibility and lifecycle to that of the source
|
||||
source.actor.connect('notify::mapped', Lang.bind(this, function () {
|
||||
if (!source.actor.mapped)
|
||||
@ -1857,7 +1861,7 @@ const AppIconMenu = new Lang.Class({
|
||||
}));
|
||||
}
|
||||
|
||||
let canFavorite = this._settings.is_writable('favorite-apps');
|
||||
let canFavorite = global.settings.is_writable('favorite-apps');
|
||||
|
||||
if (canFavorite) {
|
||||
this._appendSeparator();
|
||||
|
@ -527,6 +527,10 @@ const BackgroundSource = new Lang.Class({
|
||||
let file = null;
|
||||
let style;
|
||||
|
||||
// We don't watch changes to settings here,
|
||||
// instead we rely on Background to watch those
|
||||
// and emit 'changed' at the right time
|
||||
|
||||
if (this._overrideImage != null) {
|
||||
file = Gio.File.new_for_path(this._overrideImage);
|
||||
style = GDesktopEnums.BackgroundStyle.ZOOM; // Hardcode
|
||||
|
1421
js/ui/calendar.js
1421
js/ui/calendar.js
File diff suppressed because it is too large
Load Diff
@ -326,15 +326,21 @@ const AutorunNotification = new Lang.Class({
|
||||
this._manager = manager;
|
||||
this._mount = source.mount;
|
||||
|
||||
source.apps.forEach(Lang.bind(this, function (app) {
|
||||
// set the notification to urgent, so that it expands out
|
||||
this.setUrgency(MessageTray.Urgency.CRITICAL);
|
||||
},
|
||||
|
||||
createBanner: function() {
|
||||
let banner = new MessageTray.NotificationBanner(this);
|
||||
|
||||
this.source.apps.forEach(Lang.bind(this, function (app) {
|
||||
let actor = this._buttonForApp(app);
|
||||
|
||||
if (actor)
|
||||
this.addButton(actor);
|
||||
banner.addButton(actor);
|
||||
}));
|
||||
|
||||
// set the notification to urgent, so that it expands out
|
||||
this.setUrgency(MessageTray.Urgency.CRITICAL);
|
||||
return banner;
|
||||
},
|
||||
|
||||
_buttonForApp: function(app) {
|
||||
@ -352,6 +358,7 @@ const AutorunNotification = new Lang.Class({
|
||||
let button = new St.Button({ child: box,
|
||||
x_fill: true,
|
||||
x_align: St.Align.START,
|
||||
x_expand: true,
|
||||
button_mask: St.ButtonMask.ONE,
|
||||
style_class: 'hotplug-notification-item button' });
|
||||
|
||||
@ -363,7 +370,7 @@ const AutorunNotification = new Lang.Class({
|
||||
return button;
|
||||
},
|
||||
|
||||
_onClicked: function() {
|
||||
activate: function() {
|
||||
this.parent();
|
||||
|
||||
let app = Gio.app_info_get_default_for_type('inode/directory', false);
|
||||
|
@ -12,6 +12,8 @@ const Shell = imports.gi.Shell;
|
||||
const St = imports.gi.St;
|
||||
|
||||
const Config = imports.misc.config;
|
||||
const Main = imports.ui.main;
|
||||
const MessageTray = imports.ui.messageTray;
|
||||
const ModalDialog = imports.ui.modalDialog;
|
||||
const PopupMenu = imports.ui.popupMenu;
|
||||
const ShellEntry = imports.ui.shellEntry;
|
||||
@ -338,6 +340,7 @@ const NetworkSecretDialog = new Lang.Class({
|
||||
content.message = _("PIN code is needed for the mobile broadband device");
|
||||
content.secrets.push({ label: _("PIN: "), key: 'pin',
|
||||
value: gsmSetting.pin || '', password: true });
|
||||
break;
|
||||
}
|
||||
// fall through
|
||||
case 'cdma':
|
||||
@ -610,6 +613,7 @@ const NetworkAgent = new Lang.Class({
|
||||
|
||||
this._dialogs = { };
|
||||
this._vpnRequests = { };
|
||||
this._notifications = { };
|
||||
|
||||
this._native.connect('new-request', Lang.bind(this, this._newRequest));
|
||||
this._native.connect('cancel-request', Lang.bind(this, this._cancelRequest));
|
||||
@ -632,21 +636,92 @@ const NetworkAgent = new Lang.Class({
|
||||
this._vpnRequests[requestId].cancel(true);
|
||||
this._vpnRequests = { };
|
||||
|
||||
for (requestId in this._notifications)
|
||||
this._notifications[requestId].destroy();
|
||||
this._notifications = { };
|
||||
|
||||
this._enabled = false;
|
||||
},
|
||||
|
||||
_showNotification: function(requestId, connection, settingName, hints, flags) {
|
||||
let source = new MessageTray.Source(_("Network Manager"), 'network-transmit-receive');
|
||||
source.policy = new MessageTray.NotificationApplicationPolicy('gnome-network-panel');
|
||||
|
||||
let title, body;
|
||||
|
||||
let connectionSetting = connection.get_setting_connection();
|
||||
let connectionType = connectionSetting.get_connection_type();
|
||||
switch (connectionType) {
|
||||
case '802-11-wireless':
|
||||
let wirelessSetting = connection.get_setting_wireless();
|
||||
let ssid = NetworkManager.utils_ssid_to_utf8(wirelessSetting.get_ssid());
|
||||
title = _("Authentication required by wireless network");
|
||||
body = _("Passwords or encryption keys are required to access the wireless network “%s”.").format(ssid);
|
||||
break;
|
||||
case '802-3-ethernet':
|
||||
title = _("Wired 802.1X authentication");
|
||||
body = _("A password is required to connect to “%s”.".format(connection.get_id()));
|
||||
break;
|
||||
case 'pppoe':
|
||||
title = _("DSL authentication");
|
||||
body = _("A password is required to connect to “%s”.".format(connection.get_id()));
|
||||
break;
|
||||
case 'gsm':
|
||||
if (hints.indexOf('pin') != -1) {
|
||||
let gsmSetting = connection.get_setting_gsm();
|
||||
title = _("PIN code required");
|
||||
message = _("PIN code is needed for the mobile broadband device");
|
||||
break;
|
||||
}
|
||||
// fall through
|
||||
case 'cdma':
|
||||
case 'bluetooth':
|
||||
title = _("Mobile broadband network password");
|
||||
message = _("A password is required to connect to “%s”.").format(connectionSetting.get_id());
|
||||
break;
|
||||
default:
|
||||
log('Invalid connection type: ' + connectionType);
|
||||
this._native.respond(requestId, Shell.NetworkAgentResponse.INTERNAL_ERROR);
|
||||
return;
|
||||
}
|
||||
|
||||
let notification = new MessageTray.Notification(source, title, body);
|
||||
|
||||
notification.connect('activated', Lang.bind(this, function() {
|
||||
notification.answered = true;
|
||||
this._handleRequest(requestId, connection, settingName, hints, flags);
|
||||
}));
|
||||
|
||||
this._notifications[requestId] = notification;
|
||||
notification.connect('destroy', Lang.bind(this, function() {
|
||||
if (!notification.answered)
|
||||
this._native.respond(requestId, Shell.NetworkAgentResponse.USER_CANCELED);
|
||||
delete this._notifications[requestId];
|
||||
}));
|
||||
|
||||
Main.messageTray.add(source);
|
||||
source.notify(notification);
|
||||
},
|
||||
|
||||
_newRequest: function(agent, requestId, connection, settingName, hints, flags) {
|
||||
if (!this._enabled) {
|
||||
agent.respond(requestId, Shell.NetworkAgentResponse.USER_CANCELED);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!(flags & NMClient.SecretAgentGetSecretsFlags.USER_REQUESTED))
|
||||
this._showNotification(requestId, connection, settingName, hints, flags);
|
||||
else
|
||||
this._handleRequest(requestId, connection, settingName, hints, flags);
|
||||
},
|
||||
|
||||
_handleRequest: function(requestId, connection, settingName, hints, flags) {
|
||||
if (settingName == 'vpn') {
|
||||
this._vpnRequest(requestId, connection, hints, flags);
|
||||
return;
|
||||
}
|
||||
|
||||
let dialog = new NetworkSecretDialog(agent, requestId, connection, settingName, hints);
|
||||
let dialog = new NetworkSecretDialog(this._native, requestId, connection, settingName, hints);
|
||||
dialog.connect('destroy', Lang.bind(this, function() {
|
||||
delete this._dialogs[requestId];
|
||||
}));
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -27,8 +27,8 @@ const CtrlAltTabManager = new Lang.Class({
|
||||
_init: function() {
|
||||
this._items = [];
|
||||
this.addGroup(global.window_group, _("Windows"),
|
||||
'emblem-documents-symbolic', { sortGroup: SortGroup.TOP,
|
||||
focusCallback: Lang.bind(this, this._focusWindows) });
|
||||
'focus-windows-symbolic', { sortGroup: SortGroup.TOP,
|
||||
focusCallback: Lang.bind(this, this._focusWindows) });
|
||||
},
|
||||
|
||||
addGroup: function(root, name, icon, params) {
|
||||
|
@ -270,7 +270,7 @@ const ShowAppsIcon = new Lang.Class({
|
||||
if (app == null)
|
||||
return false;
|
||||
|
||||
if (!this._settings.is_writable('favorite-apps'))
|
||||
if (!global.settings.is_writable('favorite-apps'))
|
||||
return false;
|
||||
|
||||
let id = app.get_id();
|
||||
@ -428,8 +428,6 @@ const Dash = new Lang.Class({
|
||||
|
||||
this._workId = Main.initializeDeferredWork(this._box, Lang.bind(this, this._redisplay));
|
||||
|
||||
this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell' });
|
||||
|
||||
this._appSystem = Shell.AppSystem.get_default();
|
||||
|
||||
this._appSystem.connect('installed-changed', Lang.bind(this, function() {
|
||||
@ -519,10 +517,13 @@ const Dash = new Lang.Class({
|
||||
this._syncLabel(item, appIcon);
|
||||
}));
|
||||
|
||||
Main.overview.connect('hiding', Lang.bind(this, function() {
|
||||
let id = Main.overview.connect('hiding', Lang.bind(this, function() {
|
||||
this._labelShowing = false;
|
||||
item.hideLabel();
|
||||
}));
|
||||
item.child.connect('destroy', function() {
|
||||
Main.overview.disconnect(id);
|
||||
});
|
||||
|
||||
if (appIcon) {
|
||||
appIcon.connect('sync-tooltip', Lang.bind(this, function() {
|
||||
@ -859,7 +860,7 @@ const Dash = new Lang.Class({
|
||||
if (app == null || app.is_window_backed())
|
||||
return DND.DragMotionResult.NO_DROP;
|
||||
|
||||
if (!this._settings.is_writable('favorite-apps'))
|
||||
if (!global.settings.is_writable('favorite-apps'))
|
||||
return DND.DragMotionResult.NO_DROP;
|
||||
|
||||
let favorites = AppFavorites.getAppFavorites().getFavorites();
|
||||
@ -938,7 +939,7 @@ const Dash = new Lang.Class({
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!this._settings.is_writable('favorite-apps'))
|
||||
if (!global.settings.is_writable('favorite-apps'))
|
||||
return false;
|
||||
|
||||
let id = app.get_id();
|
||||
|
@ -4,6 +4,8 @@ const GLib = imports.gi.GLib;
|
||||
const Gio = imports.gi.Gio;
|
||||
const GnomeDesktop = imports.gi.GnomeDesktop;
|
||||
const GObject = imports.gi.GObject;
|
||||
const Gtk = imports.gi.Gtk;
|
||||
const GWeather = imports.gi.GWeather;
|
||||
const Lang = imports.lang;
|
||||
const Mainloop = imports.mainloop;
|
||||
const Cairo = imports.cairo;
|
||||
@ -19,22 +21,293 @@ const PanelMenu = imports.ui.panelMenu;
|
||||
const PopupMenu = imports.ui.popupMenu;
|
||||
const Calendar = imports.ui.calendar;
|
||||
|
||||
function _onVertSepRepaint(area) {
|
||||
let cr = area.get_context();
|
||||
let themeNode = area.get_theme_node();
|
||||
let [width, height] = area.get_surface_size();
|
||||
let stippleColor = themeNode.get_color('-stipple-color');
|
||||
let stippleWidth = themeNode.get_length('-stipple-width');
|
||||
let x = Math.floor(width/2) + 0.5;
|
||||
cr.moveTo(x, 0);
|
||||
cr.lineTo(x, height);
|
||||
Clutter.cairo_set_source_color(cr, stippleColor);
|
||||
cr.setDash([1, 3], 1); // Hard-code for now
|
||||
cr.setLineWidth(stippleWidth);
|
||||
cr.stroke();
|
||||
cr.$dispose();
|
||||
function _isToday(date) {
|
||||
let now = new Date();
|
||||
return now.getYear() == date.getYear() &&
|
||||
now.getMonth() == date.getMonth() &&
|
||||
now.getDate() == date.getDate();
|
||||
}
|
||||
|
||||
const TodayButton = new Lang.Class({
|
||||
Name: 'TodayButton',
|
||||
|
||||
_init: function(calendar) {
|
||||
// Having the ability to go to the current date if the user is already
|
||||
// on the current date can be confusing. So don't make the button reactive
|
||||
// until the selected date changes.
|
||||
this.actor = new St.Button({ style_class: 'datemenu-today-button',
|
||||
x_align: St.Align.START,
|
||||
can_focus: true,
|
||||
reactive: false
|
||||
});
|
||||
this.actor.connect('clicked', Lang.bind(this,
|
||||
function() {
|
||||
this._calendar.setDate(new Date(), false);
|
||||
}));
|
||||
|
||||
let hbox = new St.BoxLayout({ vertical: true });
|
||||
this.actor.add_actor(hbox);
|
||||
|
||||
this._dayLabel = new St.Label({ style_class: 'day-label',
|
||||
x_align: Clutter.ActorAlign.START });
|
||||
hbox.add_actor(this._dayLabel);
|
||||
|
||||
this._dateLabel = new St.Label({ style_class: 'date-label' });
|
||||
hbox.add_actor(this._dateLabel);
|
||||
|
||||
this._calendar = calendar;
|
||||
this._calendar.connect('selected-date-changed', Lang.bind(this,
|
||||
function(calendar, date) {
|
||||
// Make the button reactive only if the selected date is not the
|
||||
// current date.
|
||||
this.actor.reactive = !_isToday(date)
|
||||
}));
|
||||
},
|
||||
|
||||
setDate: function(date) {
|
||||
this._dayLabel.set_text(date.toLocaleFormat('%A'));
|
||||
|
||||
/* 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").
|
||||
*/
|
||||
let dateFormat = Shell.util_translate_time_string (N_("%B %e %Y"));
|
||||
this._dateLabel.set_text(date.toLocaleFormat(dateFormat));
|
||||
|
||||
/* Translators: This is the accessible name of the date button shown
|
||||
* below the time in the shell; it should combine the weekday and the
|
||||
* date, e.g. "Tuesday February 17 2015".
|
||||
*/
|
||||
let dateFormat = Shell.util_translate_time_string (N_("%A %B %e %Y"));
|
||||
this.actor.accessible_name = date.toLocaleFormat(dateFormat);
|
||||
}
|
||||
});
|
||||
|
||||
const WorldClocksSection = new Lang.Class({
|
||||
Name: 'WorldClocksSection',
|
||||
|
||||
_init: function() {
|
||||
this._clock = new GnomeDesktop.WallClock();
|
||||
this._settings = null;
|
||||
this._clockNotifyId = 0;
|
||||
this._changedId = 0;
|
||||
|
||||
this._locations = [];
|
||||
|
||||
this.actor = new St.Button({ style_class: 'world-clocks-button',
|
||||
x_fill: true,
|
||||
can_focus: true });
|
||||
this.actor.connect('clicked', Lang.bind(this,
|
||||
function() {
|
||||
let app = this._getClockApp();
|
||||
app.activate();
|
||||
|
||||
Main.overview.hide();
|
||||
Main.panel.closeCalendar();
|
||||
}));
|
||||
|
||||
let layout = new Clutter.GridLayout({ orientation: Clutter.Orientation.VERTICAL });
|
||||
this._grid = new St.Widget({ style_class: 'world-clocks-grid',
|
||||
layout_manager: layout });
|
||||
layout.hookup_style(this._grid);
|
||||
|
||||
this.actor.child = this._grid;
|
||||
|
||||
Shell.AppSystem.get_default().connect('installed-changed',
|
||||
Lang.bind(this, this._sync));
|
||||
this._sync();
|
||||
},
|
||||
|
||||
_getClockApp: function() {
|
||||
return Shell.AppSystem.get_default().lookup_app('org.gnome.clocks.desktop');
|
||||
},
|
||||
|
||||
_sync: function() {
|
||||
this.actor.visible = (this._getClockApp() != null);
|
||||
|
||||
if (this.actor.visible) {
|
||||
if (!this._settings) {
|
||||
this._settings = new Gio.Settings({ schema_id: 'org.gnome.clocks' });
|
||||
this._changedId =
|
||||
this._settings.connect('changed::world-clocks',
|
||||
Lang.bind(this, this._clocksChanged));
|
||||
this._clocksChanged();
|
||||
}
|
||||
} else {
|
||||
if (this._settings)
|
||||
this._settings.disconnect(this._changedId);
|
||||
this._settings = null;
|
||||
this._changedId = 0;
|
||||
}
|
||||
},
|
||||
|
||||
_clocksChanged: function() {
|
||||
this._grid.destroy_all_children();
|
||||
this._locations = [];
|
||||
|
||||
let world = GWeather.Location.get_world();
|
||||
let clocks = this._settings.get_value('world-clocks').deep_unpack();
|
||||
for (let i = 0; i < clocks.length; i++) {
|
||||
let l = world.deserialize(clocks[i].location);
|
||||
this._locations.push({ location: l });
|
||||
}
|
||||
|
||||
this._locations.sort(function(a, b) {
|
||||
return a.location.get_timezone().get_offset() -
|
||||
b.location.get_timezone().get_offset();
|
||||
});
|
||||
|
||||
let layout = this._grid.layout_manager;
|
||||
let title = (this._locations.length == 0) ? _("Add world clocks…")
|
||||
: _("World Clocks");
|
||||
let header = new St.Label({ style_class: 'world-clocks-header',
|
||||
x_align: Clutter.ActorAlign.START,
|
||||
text: title });
|
||||
layout.attach(header, 0, 0, 2, 1);
|
||||
this.actor.label_actor = header;
|
||||
|
||||
for (let i = 0; i < this._locations.length; i++) {
|
||||
let l = this._locations[i].location;
|
||||
|
||||
let label = new St.Label({ style_class: 'world-clocks-city',
|
||||
text: l.get_city_name(),
|
||||
x_align: Clutter.ActorAlign.START,
|
||||
x_expand: true });
|
||||
|
||||
let time = new St.Label({ style_class: 'world-clocks-time',
|
||||
x_align: Clutter.ActorAlign.END,
|
||||
x_expand: true });
|
||||
|
||||
if (this._grid.text_direction == Clutter.TextDirection.RTL) {
|
||||
layout.attach(time, 0, i + 1, 1, 1);
|
||||
layout.attach(label, 1, i + 1, 1, 1);
|
||||
} else {
|
||||
layout.attach(label, 0, i + 1, 1, 1);
|
||||
layout.attach(time, 1, i + 1, 1, 1);
|
||||
}
|
||||
|
||||
this._locations[i].actor = time;
|
||||
}
|
||||
|
||||
if (this._grid.get_n_children() > 1) {
|
||||
if (!this._clockNotifyId)
|
||||
this._clockNotifyId =
|
||||
this._clock.connect('notify::clock', Lang.bind(this, this._updateLabels));
|
||||
this._updateLabels();
|
||||
} else {
|
||||
if (this._clockNotifyId)
|
||||
this._clock.disconnect(this._clockNotifyId);
|
||||
this._clockNotifyId = 0;
|
||||
}
|
||||
},
|
||||
|
||||
_updateLabels: function() {
|
||||
for (let i = 0; i < this._locations.length; i++) {
|
||||
let l = this._locations[i];
|
||||
let tz = GLib.TimeZone.new(l.location.get_timezone().get_tzid());
|
||||
let now = GLib.DateTime.new_now(tz);
|
||||
l.actor.text = Util.formatTime(now, { timeOnly: true });
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
const MessagesIndicator = new Lang.Class({
|
||||
Name: 'MessagesIndicator',
|
||||
|
||||
_init: function() {
|
||||
this.actor = new St.Label({ text: '⚫', visible: false, y_expand: true,
|
||||
y_align: Clutter.ActorAlign.CENTER });
|
||||
|
||||
this._sources = [];
|
||||
|
||||
Main.messageTray.connect('source-added', Lang.bind(this, this._onSourceAdded));
|
||||
Main.messageTray.connect('source-removed', Lang.bind(this, this._onSourceRemoved));
|
||||
Main.messageTray.connect('queue-changed', Lang.bind(this, this._updateCount));
|
||||
|
||||
let sources = Main.messageTray.getSources();
|
||||
sources.forEach(Lang.bind(this, function(source) { this._onSourceAdded(null, source); }));
|
||||
},
|
||||
|
||||
_onSourceAdded: function(tray, source) {
|
||||
source.connect('count-updated', Lang.bind(this, this._updateCount));
|
||||
this._sources.push(source);
|
||||
this._updateCount();
|
||||
},
|
||||
|
||||
_onSourceRemoved: function(tray, source) {
|
||||
this._sources.splice(this._sources.indexOf(source), 1);
|
||||
this._updateCount();
|
||||
},
|
||||
|
||||
_updateCount: function() {
|
||||
let count = 0;
|
||||
this._sources.forEach(Lang.bind(this,
|
||||
function(source) {
|
||||
count += source.unseenCount;
|
||||
}));
|
||||
count -= Main.messageTray.queueCount;
|
||||
|
||||
this.actor.visible = (count > 0);
|
||||
}
|
||||
});
|
||||
|
||||
const IndicatorPad = new Lang.Class({
|
||||
Name: 'IndicatorPad',
|
||||
Extends: St.Widget,
|
||||
|
||||
_init: function(actor) {
|
||||
this._source = actor;
|
||||
this._source.connect('notify::visible',
|
||||
Lang.bind(this, this.queue_relayout));
|
||||
this.parent();
|
||||
},
|
||||
|
||||
vfunc_get_preferred_width: function(container, forHeight) {
|
||||
if (this._source.visible)
|
||||
return this._source.get_preferred_width(forHeight);
|
||||
return [0, 0];
|
||||
},
|
||||
|
||||
vfunc_get_preferred_height: function(container, forWidth) {
|
||||
if (this._source.visible)
|
||||
return this._source.get_preferred_height(forWidth);
|
||||
return [0, 0];
|
||||
}
|
||||
});
|
||||
|
||||
const FreezableBinLayout = new Lang.Class({
|
||||
Name: 'FreezableBinLayout',
|
||||
Extends: Clutter.BinLayout,
|
||||
|
||||
_init: function() {
|
||||
this.parent();
|
||||
|
||||
this._frozen = false;
|
||||
this._savedWidth = [NaN, NaN];
|
||||
this._savedHeight = [NaN, NaN];
|
||||
},
|
||||
|
||||
set frozen(v) {
|
||||
if (this._frozen == v)
|
||||
return;
|
||||
|
||||
this._frozen = v;
|
||||
if (!this._frozen)
|
||||
this.layout_changed();
|
||||
},
|
||||
|
||||
vfunc_get_preferred_width: function(container, forHeight) {
|
||||
if (!this._frozen || this._savedWidth.some(isNaN))
|
||||
this._savedWidth = this.parent(container, forHeight);
|
||||
return this._savedWidth;
|
||||
},
|
||||
|
||||
vfunc_get_preferred_height: function(container, forWidth) {
|
||||
if (!this._frozen || this._savedHeight.some(isNaN))
|
||||
this._savedHeight = this.parent(container, forWidth);
|
||||
return this._savedHeight;
|
||||
}
|
||||
});
|
||||
|
||||
const DateMenuButton = new Lang.Class({
|
||||
Name: 'DateMenuButton',
|
||||
Extends: PanelMenu.Button,
|
||||
@ -44,92 +317,78 @@ const DateMenuButton = new Lang.Class({
|
||||
let hbox;
|
||||
let vbox;
|
||||
|
||||
let menuAlignment = 0.25;
|
||||
let menuAlignment = 0.5;
|
||||
if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL)
|
||||
menuAlignment = 1.0 - menuAlignment;
|
||||
this.parent(menuAlignment);
|
||||
|
||||
this._clockDisplay = new St.Label({ y_align: Clutter.ActorAlign.CENTER });
|
||||
this._indicator = new MessagesIndicator();
|
||||
|
||||
let box = new St.BoxLayout();
|
||||
box.add_actor(new IndicatorPad(this._indicator.actor));
|
||||
box.add_actor(this._clockDisplay);
|
||||
box.add_actor(this._indicator.actor);
|
||||
|
||||
this.actor.label_actor = this._clockDisplay;
|
||||
this.actor.add_actor(this._clockDisplay);
|
||||
this.actor.add_actor(box);
|
||||
this.actor.add_style_class_name ('clock-display');
|
||||
|
||||
|
||||
let layout = new FreezableBinLayout();
|
||||
let bin = new St.Widget({ layout_manager: layout });
|
||||
this.menu.box.add_child(bin);
|
||||
|
||||
hbox = new St.BoxLayout({ name: 'calendarArea' });
|
||||
this.menu.box.add_child(hbox);
|
||||
bin.add_actor(hbox);
|
||||
|
||||
// Fill up the first column
|
||||
|
||||
vbox = new St.BoxLayout({vertical: true});
|
||||
hbox.add(vbox);
|
||||
|
||||
// Date
|
||||
// Having the ability to go to the current date if the user is already
|
||||
// on the current date can be confusing. So don't make the button reactive
|
||||
// until the selected date changes.
|
||||
this._date = new St.Button({ style_class: 'datemenu-date-label',
|
||||
reactive: false
|
||||
});
|
||||
this._date.connect('clicked',
|
||||
Lang.bind(this, function() {
|
||||
this._calendar.setDate(new Date(), false);
|
||||
}));
|
||||
vbox.add(this._date, { x_fill: false });
|
||||
|
||||
this._eventList = new Calendar.EventsList();
|
||||
this._calendar = new Calendar.Calendar();
|
||||
|
||||
this._calendar.connect('selected-date-changed',
|
||||
Lang.bind(this, function(calendar, date) {
|
||||
this._eventList.setDate(date);
|
||||
|
||||
// Make the button reactive only if the selected date is not the current date.
|
||||
this._date.can_focus = this._date.reactive = !this._isToday(date)
|
||||
layout.frozen = !_isToday(date);
|
||||
this._messageList.setDate(date);
|
||||
}));
|
||||
vbox.add(this._calendar.actor);
|
||||
|
||||
let separator = new PopupMenu.PopupSeparatorMenuItem();
|
||||
vbox.add(separator.actor, { y_align: St.Align.END, expand: true, y_fill: false });
|
||||
|
||||
this._openCalendarItem = new PopupMenu.PopupMenuItem(_("Open Calendar"));
|
||||
this._openCalendarItem.connect('activate', Lang.bind(this, this._onOpenCalendarActivate));
|
||||
vbox.add(this._openCalendarItem.actor, {y_align: St.Align.END, expand: true, y_fill: false});
|
||||
|
||||
this._openClocksItem = new PopupMenu.PopupMenuItem(_("Open Clocks"));
|
||||
this._openClocksItem.connect('activate', Lang.bind(this, this._onOpenClocksActivate));
|
||||
vbox.add(this._openClocksItem.actor, {y_align: St.Align.END, expand: true, y_fill: false});
|
||||
|
||||
Shell.AppSystem.get_default().connect('installed-changed',
|
||||
Lang.bind(this, this._appInstalledChanged));
|
||||
|
||||
item = this.menu.addSettingsAction(_("Date & Time Settings"), 'gnome-datetime-panel.desktop');
|
||||
if (item) {
|
||||
item.actor.show_on_set_parent = false;
|
||||
item.actor.reparent(vbox);
|
||||
this._dateAndTimeSeparator = separator;
|
||||
}
|
||||
|
||||
this._separator = new St.DrawingArea({ style_class: 'calendar-vertical-separator',
|
||||
pseudo_class: 'highlighted' });
|
||||
this._separator.connect('repaint', Lang.bind(this, _onVertSepRepaint));
|
||||
hbox.add(this._separator);
|
||||
|
||||
// Fill up the second column
|
||||
hbox.add(this._eventList.actor, { expand: true, y_fill: false, y_align: St.Align.START });
|
||||
|
||||
// Whenever the menu is opened, select today
|
||||
this.menu.connect('open-state-changed', Lang.bind(this, function(menu, isOpen) {
|
||||
// Whenever the menu is opened, select today
|
||||
if (isOpen) {
|
||||
let now = new Date();
|
||||
this._calendar.setDate(now);
|
||||
|
||||
/* 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").
|
||||
*/
|
||||
let dateFormat = Shell.util_translate_time_string (N_("%A %B %e, %Y"));
|
||||
this._date.set_label(now.toLocaleFormat(dateFormat));
|
||||
this._date.setDate(now);
|
||||
this._messageList.setDate(now);
|
||||
}
|
||||
// Block notification banners while the menu is open
|
||||
Main.messageTray.bannerBlocked = isOpen;
|
||||
}));
|
||||
|
||||
// Fill up the first column
|
||||
this._messageList = new Calendar.MessageList();
|
||||
hbox.add(this._messageList.actor, { expand: true, y_fill: false, y_align: St.Align.START });
|
||||
|
||||
// Fill up the second column
|
||||
vbox = new St.BoxLayout({ style_class: 'datemenu-calendar-column',
|
||||
vertical: true });
|
||||
hbox.add(vbox);
|
||||
|
||||
this._date = new TodayButton(this._calendar);
|
||||
vbox.add_actor(this._date.actor);
|
||||
|
||||
vbox.add(this._calendar.actor);
|
||||
|
||||
this._displaysSection = new St.ScrollView({ style_class: 'datemenu-displays-section vfade',
|
||||
x_expand: true, x_fill: true,
|
||||
overlay_scrollbars: true });
|
||||
this._displaysSection.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC);
|
||||
vbox.add_actor(this._displaysSection);
|
||||
|
||||
let displaysBox = new St.BoxLayout({ vertical: true,
|
||||
style_class: 'datemenu-displays-box' });
|
||||
this._displaysSection.add_actor(displaysBox);
|
||||
|
||||
this._clocksItem = new WorldClocksSection();
|
||||
displaysBox.add(this._clocksItem.actor, { x_fill: true });
|
||||
|
||||
|
||||
// Done with hbox for calendar and event list
|
||||
|
||||
this._clock = new GnomeDesktop.WallClock();
|
||||
@ -139,36 +398,6 @@ const DateMenuButton = new Lang.Class({
|
||||
this._sessionUpdated();
|
||||
},
|
||||
|
||||
_isToday: function(date) {
|
||||
let now = new Date();
|
||||
return now.getYear() == date.getYear() &&
|
||||
now.getMonth() == date.getMonth() &&
|
||||
now.getDate() == date.getDate();
|
||||
},
|
||||
|
||||
_appInstalledChanged: function() {
|
||||
this._calendarApp = undefined;
|
||||
this._updateEventsVisibility();
|
||||
},
|
||||
|
||||
_updateEventsVisibility: function() {
|
||||
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._eventList.actor.visible = visible;
|
||||
if (visible) {
|
||||
let alignment = 0.25;
|
||||
if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL)
|
||||
alignment = 1.0 - alignment;
|
||||
this.menu._arrowAlignment = alignment;
|
||||
} else {
|
||||
this.menu._arrowAlignment = 0.5;
|
||||
}
|
||||
},
|
||||
|
||||
_getEventSource: function() {
|
||||
return new Calendar.DBusEventSource();
|
||||
},
|
||||
@ -178,12 +407,9 @@ const DateMenuButton = new Lang.Class({
|
||||
this._eventSource.destroy();
|
||||
|
||||
this._calendar.setEventSource(eventSource);
|
||||
this._eventList.setEventSource(eventSource);
|
||||
this._messageList.setEventSource(eventSource);
|
||||
|
||||
this._eventSource = eventSource;
|
||||
this._eventSource.connect('notify::has-calendars', Lang.bind(this, function() {
|
||||
this._updateEventsVisibility();
|
||||
}));
|
||||
},
|
||||
|
||||
_sessionUpdated: function() {
|
||||
@ -195,44 +421,10 @@ const DateMenuButton = new Lang.Class({
|
||||
eventSource = new Calendar.EmptyEventSource();
|
||||
}
|
||||
this._setEventSource(eventSource);
|
||||
this._updateEventsVisibility();
|
||||
|
||||
// This needs to be handled manually, as the code to
|
||||
// autohide separators doesn't work across the vbox
|
||||
this._dateAndTimeSeparator.actor.visible = Main.sessionMode.allowSettings;
|
||||
},
|
||||
|
||||
_getCalendarApp: function() {
|
||||
if (this._calendarApp !== undefined)
|
||||
return this._calendarApp;
|
||||
|
||||
let apps = Gio.AppInfo.get_recommended_for_type('text/calendar');
|
||||
if (apps && (apps.length > 0)) {
|
||||
let app = Gio.AppInfo.get_default_for_type('text/calendar', false);
|
||||
let defaultInRecommended = apps.some(function(a) { return a.equal(app); });
|
||||
this._calendarApp = defaultInRecommended ? app : apps[0];
|
||||
} else {
|
||||
this._calendarApp = null;
|
||||
}
|
||||
return this._calendarApp;
|
||||
},
|
||||
|
||||
_getClockApp: function() {
|
||||
return Shell.AppSystem.get_default().lookup_app('org.gnome.clocks.desktop');
|
||||
},
|
||||
|
||||
_onOpenCalendarActivate: function() {
|
||||
this.menu.close();
|
||||
|
||||
let app = this._getCalendarApp();
|
||||
if (app.get_id() == 'evolution.desktop')
|
||||
app = Gio.DesktopAppInfo.new('evolution-calendar.desktop');
|
||||
app.launch([], global.create_app_launch_context(0, -1));
|
||||
},
|
||||
|
||||
_onOpenClocksActivate: function() {
|
||||
this.menu.close();
|
||||
let app = this._getClockApp();
|
||||
app.activate();
|
||||
// Displays are not actually expected to launch Settings when activated
|
||||
// but the corresponding app (clocks, weather); however we can consider
|
||||
// that display-specific settings, so re-use "allowSettings" here ...
|
||||
this._displaysSection.visible = Main.sessionMode.allowSettings;
|
||||
}
|
||||
});
|
||||
|
@ -211,7 +211,7 @@ const InstallExtensionDialog = new Lang.Class({
|
||||
let icon = new St.Icon({ gicon: gicon });
|
||||
box.add(icon);
|
||||
|
||||
let label = new St.Label({ style_class: 'prompt-dialog-headline',
|
||||
let label = new St.Label({ style_class: 'prompt-dialog-headline headline',
|
||||
text: message });
|
||||
box.add(label);
|
||||
},
|
||||
|
@ -6,6 +6,7 @@ const Gdk = imports.gi.Gdk;
|
||||
const Gio = imports.gi.Gio;
|
||||
const GLib = imports.gi.GLib;
|
||||
const Lang = imports.lang;
|
||||
const Meta = imports.gi.Meta;
|
||||
const Shell = imports.gi.Shell;
|
||||
const Signals = imports.signals;
|
||||
const St = imports.gi.St;
|
||||
@ -60,14 +61,7 @@ const CaribouDaemonIface = '<node> \
|
||||
</interface> \
|
||||
</node>';
|
||||
|
||||
const CursorManagerIface = '<node> \
|
||||
<interface name="org.gnome.SettingsDaemon.Cursor"> \
|
||||
<property name="ShowOSK" type="b" access="read" /> \
|
||||
</interface> \
|
||||
</node>';
|
||||
|
||||
const CaribouDaemonProxy = Gio.DBusProxy.makeProxyWrapper(CaribouDaemonIface);
|
||||
const CursorManagerProxy = Gio.DBusProxy.makeProxyWrapper(CursorManagerIface);
|
||||
|
||||
const Key = new Lang.Class({
|
||||
Name: 'Key',
|
||||
@ -188,17 +182,22 @@ const Keyboard = new Lang.Class({
|
||||
Lang.bind(this, this._sync),
|
||||
Lang.bind(this, this._sync));
|
||||
this._daemonProxy = null;
|
||||
this._cursorProxy = new CursorManagerProxy(Gio.DBus.session, CURSOR_BUS_NAME,
|
||||
CURSOR_OBJECT_PATH,
|
||||
Lang.bind(this, function(proxy, error) {
|
||||
if (error) {
|
||||
log(error.message);
|
||||
return;
|
||||
}
|
||||
this._cursorProxy.connect('g-properties-changed',
|
||||
Lang.bind(this, this._sync));
|
||||
this._sync();
|
||||
}));
|
||||
this._lastDeviceId = null;
|
||||
|
||||
if (Meta.is_wayland_compositor() &&
|
||||
Caribou.DisplayAdapter.set_default)
|
||||
Caribou.DisplayAdapter.set_default(new ShellWaylandAdapter());
|
||||
|
||||
Meta.get_backend().connect('last-device-changed', Lang.bind(this,
|
||||
function (backend, deviceId) {
|
||||
let manager = Clutter.DeviceManager.get_default();
|
||||
let device = manager.get_device(deviceId);
|
||||
|
||||
if (device.get_device_name().indexOf('XTEST') < 0) {
|
||||
this._lastDeviceId = deviceId;
|
||||
this._sync();
|
||||
}
|
||||
}));
|
||||
this._sync();
|
||||
|
||||
this._showIdleId = 0;
|
||||
@ -217,9 +216,22 @@ const Keyboard = new Lang.Class({
|
||||
this._redraw();
|
||||
},
|
||||
|
||||
_lastDeviceIsTouchscreen: function () {
|
||||
if (!this._lastDeviceId)
|
||||
return false;
|
||||
|
||||
let manager = Clutter.DeviceManager.get_default();
|
||||
let device = manager.get_device(this._lastDeviceId);
|
||||
|
||||
if (!device)
|
||||
return false;
|
||||
|
||||
return device.get_device_type() == Clutter.InputDeviceType.TOUCHSCREEN_DEVICE;
|
||||
},
|
||||
|
||||
_sync: function () {
|
||||
this._enableKeyboard = this._a11yApplicationsSettings.get_boolean(SHOW_KEYBOARD) ||
|
||||
this._cursorProxy.ShowOSK;
|
||||
this._lastDeviceIsTouchscreen();
|
||||
if (!this._enableKeyboard && !this._keyboard)
|
||||
return;
|
||||
if (this._enableKeyboard && this._keyboard &&
|
||||
@ -717,3 +729,24 @@ const KeyboardSource = new Lang.Class({
|
||||
this._keyboard.show(Main.layoutManager.bottomIndex);
|
||||
}
|
||||
});
|
||||
|
||||
const ShellWaylandAdapter = new Lang.Class({
|
||||
Name: 'ShellWaylandAdapter',
|
||||
Extends: Caribou.XAdapter,
|
||||
|
||||
vfunc_keyval_press: function(keyval) {
|
||||
let focus = global.stage.get_key_focus();
|
||||
if (focus instanceof Clutter.Text)
|
||||
Shell.util_text_insert_keyval(focus, keyval);
|
||||
else
|
||||
this.parent(keyval);
|
||||
},
|
||||
|
||||
vfunc_keyval_release: function(keyval) {
|
||||
let focus = global.stage.get_key_focus();
|
||||
if (focus instanceof Clutter.Text)
|
||||
return; // do nothing
|
||||
else
|
||||
this.parent(keyval);
|
||||
},
|
||||
});
|
||||
|
134
js/ui/layout.js
134
js/ui/layout.js
@ -11,6 +11,7 @@ const St = imports.gi.St;
|
||||
|
||||
const Background = imports.ui.background;
|
||||
const BackgroundMenu = imports.ui.backgroundMenu;
|
||||
const LoginManager = imports.misc.loginManager;
|
||||
|
||||
const DND = imports.ui.dnd;
|
||||
const Main = imports.ui.main;
|
||||
@ -21,11 +22,6 @@ const STARTUP_ANIMATION_TIME = 0.5;
|
||||
const KEYBOARD_ANIMATION_TIME = 0.15;
|
||||
const BACKGROUND_FADE_ANIMATION_TIME = 1.0;
|
||||
|
||||
// The message tray takes this much pressure
|
||||
// in the pressure barrier at once to release it.
|
||||
const MESSAGE_TRAY_PRESSURE_THRESHOLD = 250; // pixels
|
||||
const MESSAGE_TRAY_PRESSURE_TIMEOUT = 1000; // ms
|
||||
|
||||
const HOT_CORNER_PRESSURE_THRESHOLD = 100; // pixels
|
||||
const HOT_CORNER_PRESSURE_TIMEOUT = 1000; // ms
|
||||
|
||||
@ -50,11 +46,16 @@ const MonitorConstraint = new Lang.Class({
|
||||
'index': GObject.ParamSpec.int('index',
|
||||
'Monitor index', 'Track specific monitor',
|
||||
GObject.ParamFlags.READABLE | GObject.ParamFlags.WRITABLE,
|
||||
-1, 64, -1)},
|
||||
-1, 64, -1),
|
||||
'work-area': GObject.ParamSpec.boolean('work-area',
|
||||
'Work-area', 'Track monitor\'s work-area',
|
||||
GObject.ParamFlags.READABLE | GObject.ParamFlags.WRITABLE,
|
||||
false)},
|
||||
|
||||
_init: function(props) {
|
||||
this._primary = false;
|
||||
this._index = -1;
|
||||
this._workArea = false;
|
||||
|
||||
this.parent(props);
|
||||
},
|
||||
@ -84,6 +85,19 @@ const MonitorConstraint = new Lang.Class({
|
||||
this.notify('index');
|
||||
},
|
||||
|
||||
get work_area() {
|
||||
return this._workArea;
|
||||
},
|
||||
|
||||
set work_area(v) {
|
||||
if (v == this._workArea)
|
||||
return;
|
||||
this._workArea = v;
|
||||
if (this.actor)
|
||||
this.actor.queue_relayout();
|
||||
this.notify('work-area');
|
||||
},
|
||||
|
||||
vfunc_set_actor: function(actor) {
|
||||
if (actor) {
|
||||
if (!this._monitorsChangedId) {
|
||||
@ -91,10 +105,21 @@ const MonitorConstraint = new Lang.Class({
|
||||
this.actor.queue_relayout();
|
||||
}));
|
||||
}
|
||||
|
||||
if (!this._workareasChangedId) {
|
||||
this._workareasChangedId = global.screen.connect('workareas-changed', Lang.bind(this, function() {
|
||||
if (this._workArea)
|
||||
this.actor.queue_relayout();
|
||||
}));
|
||||
}
|
||||
} else {
|
||||
if (this._monitorsChangedId)
|
||||
Main.layoutManager.disconnect(this._monitorsChangedId);
|
||||
this._monitorsChangedId = 0;
|
||||
|
||||
if (this._workareasChangedId)
|
||||
global.screen.disconnect(this._workareasChangedId);
|
||||
this._workareasChangedId = 0;
|
||||
}
|
||||
|
||||
this.parent(actor);
|
||||
@ -104,15 +129,21 @@ const MonitorConstraint = new Lang.Class({
|
||||
if (!this._primary && this._index < 0)
|
||||
return;
|
||||
|
||||
let monitor;
|
||||
if (this._primary) {
|
||||
monitor = Main.layoutManager.primaryMonitor;
|
||||
let index;
|
||||
if (this._primary)
|
||||
index = Main.layoutManager.primaryIndex;
|
||||
else
|
||||
index = Math.min(this._index, Main.layoutManager.monitors.length - 1);
|
||||
|
||||
let rect;
|
||||
if (this._workArea) {
|
||||
let ws = global.screen.get_workspace_by_index(0);
|
||||
rect = ws.get_work_area_for_monitor(index);
|
||||
} else {
|
||||
let index = Math.min(this._index, Main.layoutManager.monitors.length - 1);
|
||||
monitor = Main.layoutManager.monitors[index];
|
||||
rect = Main.layoutManager.monitors[index];
|
||||
}
|
||||
|
||||
actorBox.init_rect(monitor.x, monitor.y, monitor.width, monitor.height);
|
||||
actorBox.init_rect(rect.x, rect.y, rect.width, rect.height);
|
||||
}
|
||||
});
|
||||
|
||||
@ -135,6 +166,7 @@ const Monitor = new Lang.Class({
|
||||
const defaultParams = {
|
||||
trackFullscreen: false,
|
||||
affectsStruts: false,
|
||||
affectsInputRegion: true
|
||||
};
|
||||
|
||||
const LayoutManager = new Lang.Class({
|
||||
@ -149,7 +181,6 @@ const LayoutManager = new Lang.Class({
|
||||
|
||||
this._keyboardIndex = -1;
|
||||
this._rightPanelBarrier = null;
|
||||
this._trayBarrier = null;
|
||||
|
||||
this._inOverview = false;
|
||||
this._updateRegionIdle = 0;
|
||||
@ -206,11 +237,6 @@ const LayoutManager = new Lang.Class({
|
||||
this.panelBox.connect('allocation-changed',
|
||||
Lang.bind(this, this._panelBoxChanged));
|
||||
|
||||
this.trayBox = new St.Widget({ name: 'trayBox',
|
||||
layout_manager: new Clutter.BinLayout() });
|
||||
this.addChrome(this.trayBox);
|
||||
this._setupTrayPressure();
|
||||
|
||||
this.modalDialogGroup = new St.Widget({ name: 'modalDialogGroup',
|
||||
layout_manager: new Clutter.BinLayout() });
|
||||
this.uiGroup.add_actor(this.modalDialogGroup);
|
||||
@ -248,6 +274,18 @@ const LayoutManager = new Lang.Class({
|
||||
global.screen.connect('in-fullscreen-changed',
|
||||
Lang.bind(this, this._updateFullscreen));
|
||||
this._monitorsChanged();
|
||||
|
||||
// NVIDIA drivers don't preserve FBO contents across
|
||||
// suspend/resume, see
|
||||
// https://bugzilla.gnome.org/show_bug.cgi?id=739178
|
||||
if (Shell.util_need_background_refresh()) {
|
||||
LoginManager.getLoginManager().connect('prepare-for-sleep',
|
||||
function(lm, suspending) {
|
||||
if (suspending)
|
||||
return;
|
||||
Meta.Background.refresh_all();
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
// This is called by Main after everything else is constructed
|
||||
@ -423,10 +461,6 @@ const LayoutManager = new Lang.Class({
|
||||
this.panelBox.set_size(this.primaryMonitor.width, -1);
|
||||
|
||||
this.keyboardIndex = this.primaryIndex;
|
||||
|
||||
this.trayBox.set_position(this.bottomMonitor.x,
|
||||
this.bottomMonitor.y + this.bottomMonitor.height);
|
||||
this.trayBox.set_size(this.bottomMonitor.width, -1);
|
||||
},
|
||||
|
||||
_panelBoxChanged: function() {
|
||||
@ -455,50 +489,9 @@ const LayoutManager = new Lang.Class({
|
||||
}
|
||||
},
|
||||
|
||||
_setupTrayPressure: function() {
|
||||
this._trayPressure = new PressureBarrier(MESSAGE_TRAY_PRESSURE_THRESHOLD,
|
||||
MESSAGE_TRAY_PRESSURE_TIMEOUT,
|
||||
Shell.ActionMode.NORMAL |
|
||||
Shell.ActionMode.OVERVIEW);
|
||||
this._trayPressure.setEventFilter(this._trayBarrierEventFilter);
|
||||
this._trayPressure.connect('trigger', function(barrier) {
|
||||
if (Main.layoutManager.bottomMonitor.inFullscreen)
|
||||
return;
|
||||
|
||||
Main.messageTray.openTray();
|
||||
});
|
||||
},
|
||||
|
||||
_updateTrayBarrier: function() {
|
||||
let monitor = this.bottomMonitor;
|
||||
|
||||
if (this._trayBarrier) {
|
||||
this._trayPressure.removeBarrier(this._trayBarrier);
|
||||
this._trayBarrier.destroy();
|
||||
this._trayBarrier = null;
|
||||
}
|
||||
|
||||
this._trayBarrier = new Meta.Barrier({ display: global.display,
|
||||
x1: monitor.x, x2: monitor.x + monitor.width,
|
||||
y1: monitor.y + monitor.height, y2: monitor.y + monitor.height,
|
||||
directions: Meta.BarrierDirection.NEGATIVE_Y });
|
||||
this._trayPressure.addBarrier(this._trayBarrier);
|
||||
},
|
||||
|
||||
_trayBarrierEventFilter: function(event) {
|
||||
// Throw out all events where the pointer was grabbed by another
|
||||
// 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() {
|
||||
this._updateMonitors();
|
||||
this._updateBoxes();
|
||||
this._updateTrayBarrier();
|
||||
this._updateHotCorners();
|
||||
this._updateBackgrounds();
|
||||
this._updateFullscreen();
|
||||
@ -608,7 +601,6 @@ const LayoutManager = new Lang.Class({
|
||||
// the UI group to get the correct allocation for the struts.
|
||||
this._updateRegions();
|
||||
|
||||
this.trayBox.hide();
|
||||
this.keyboardBox.hide();
|
||||
|
||||
let monitor = this.primaryMonitor;
|
||||
@ -675,7 +667,6 @@ const LayoutManager = new Lang.Class({
|
||||
|
||||
this._startingUp = false;
|
||||
|
||||
this.trayBox.show();
|
||||
this.keyboardBox.show();
|
||||
|
||||
if (!Main.sessionMode.isGreeter) {
|
||||
@ -748,10 +739,11 @@ const LayoutManager = new Lang.Class({
|
||||
// @actor: an actor to add to the chrome
|
||||
// @params: (optional) additional params
|
||||
//
|
||||
// Adds @actor to the chrome, and extends the input region
|
||||
// to include it. Changes in @actor's size, position, and
|
||||
// visibility will automatically result in appropriate changes
|
||||
// to the input region.
|
||||
// Adds @actor to the chrome, and (unless %affectsInputRegion in
|
||||
// @params is %false) extends the input region to include it.
|
||||
// Changes in @actor's size, position, and visibility will
|
||||
// automatically result in appropriate changes to the input
|
||||
// region.
|
||||
//
|
||||
// If %affectsStruts in @params is %true (and @actor is along a
|
||||
// screen edge), then @actor's size and position will also affect
|
||||
@ -953,7 +945,7 @@ const LayoutManager = new Lang.Class({
|
||||
|
||||
for (i = 0; i < this._trackedActors.length; i++) {
|
||||
let actorData = this._trackedActors[i];
|
||||
if (!wantsInputRegion && !actorData.affectsStruts)
|
||||
if (!(actorData.affectsInputRegion && wantsInputRegion) && !actorData.affectsStruts)
|
||||
continue;
|
||||
|
||||
let [x, y] = actorData.actor.get_transformed_position();
|
||||
@ -963,7 +955,7 @@ const LayoutManager = new Lang.Class({
|
||||
w = Math.round(w);
|
||||
h = Math.round(h);
|
||||
|
||||
if (wantsInputRegion && actorData.actor.get_paint_visibility())
|
||||
if (actorData.affectsInputRegion && wantsInputRegion && actorData.actor.get_paint_visibility())
|
||||
rects.push(new Meta.Rectangle({ x: x, y: y, width: w, height: h }));
|
||||
|
||||
if (actorData.affectsStruts) {
|
||||
|
273
js/ui/legacyTray.js
Normal file
273
js/ui/legacyTray.js
Normal file
@ -0,0 +1,273 @@
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const GLib = imports.gi.GLib;
|
||||
const GObject = imports.gi.GObject;
|
||||
const Meta = imports.gi.Meta;
|
||||
const Shell = imports.gi.Shell;
|
||||
const St = imports.gi.St;
|
||||
|
||||
const CtrlAltTab = imports.ui.ctrlAltTab;
|
||||
const Lang = imports.lang;
|
||||
const Layout = imports.ui.layout;
|
||||
const Main = imports.ui.main;
|
||||
const Overview = imports.ui.overview;
|
||||
const OverviewControls = imports.ui.overviewControls;
|
||||
const Tweener = imports.ui.tweener;
|
||||
|
||||
const STANDARD_TRAY_ICON_IMPLEMENTATIONS = {
|
||||
'bluetooth-applet': 'bluetooth',
|
||||
'gnome-volume-control-applet': 'volume', // renamed to gnome-sound-applet
|
||||
// when moved to control center
|
||||
'gnome-sound-applet': 'volume',
|
||||
'nm-applet': 'network',
|
||||
'gnome-power-manager': 'battery',
|
||||
'keyboard': 'keyboard',
|
||||
'a11y-keyboard': 'a11y',
|
||||
'kbd-scrolllock': 'keyboard',
|
||||
'kbd-numlock': 'keyboard',
|
||||
'kbd-capslock': 'keyboard',
|
||||
'ibus-ui-gtk': 'keyboard'
|
||||
};
|
||||
|
||||
// Offset of the original position from the bottom-right corner
|
||||
const CONCEALED_WIDTH = 3;
|
||||
const REVEAL_ANIMATION_TIME = 0.2;
|
||||
const TEMP_REVEAL_TIME = 2;
|
||||
|
||||
const BARRIER_THRESHOLD = 70;
|
||||
const BARRIER_TIMEOUT = 1000;
|
||||
|
||||
const LegacyTray = new Lang.Class({
|
||||
Name: 'LegacyTray',
|
||||
|
||||
_init: function() {
|
||||
this.actor = new St.Widget({ clip_to_allocation: true,
|
||||
layout_manager: new Clutter.BinLayout() });
|
||||
let constraint = new Layout.MonitorConstraint({ primary: true,
|
||||
work_area: true });
|
||||
this.actor.add_constraint(constraint);
|
||||
|
||||
this._slideLayout = new OverviewControls.SlideLayout();
|
||||
this._slideLayout.translationX = 0;
|
||||
this._slideLayout.slideDirection = OverviewControls.SlideDirection.LEFT;
|
||||
|
||||
this._slider = new St.Widget({ style_class: 'legacy-tray',
|
||||
x_expand: true, y_expand: true,
|
||||
x_align: Clutter.ActorAlign.START,
|
||||
y_align: Clutter.ActorAlign.END,
|
||||
layout_manager: this._slideLayout });
|
||||
this.actor.add_actor(this._slider);
|
||||
this._slider.connect('notify::allocation', Lang.bind(this, this._syncBarrier));
|
||||
|
||||
this._box = new St.BoxLayout();
|
||||
this._slider.add_actor(this._box);
|
||||
|
||||
this._concealHandle = new St.Button({ style_class: 'legacy-tray-handle',
|
||||
/* translators: 'Hide' is a verb */
|
||||
accessible_name: _("Hide tray"),
|
||||
can_focus: true });
|
||||
this._concealHandle.child = new St.Icon({ icon_name: 'go-previous-symbolic' });
|
||||
this._box.add_child(this._concealHandle);
|
||||
|
||||
this._iconBox = new St.BoxLayout({ style_class: 'legacy-tray-icon-box' });
|
||||
this._box.add_actor(this._iconBox);
|
||||
|
||||
this._revealHandle = new St.Button({ style_class: 'legacy-tray-handle' });
|
||||
this._revealHandle.child = new St.Icon({ icon_name: 'go-next-symbolic' });
|
||||
this._box.add_child(this._revealHandle);
|
||||
|
||||
this._revealHandle.bind_property('visible',
|
||||
this._concealHandle, 'visible',
|
||||
GObject.BindingFlags.BIDIRECTIONAL |
|
||||
GObject.BindingFlags.INVERT_BOOLEAN);
|
||||
this._revealHandle.connect('notify::visible',
|
||||
Lang.bind(this, this._sync));
|
||||
this._revealHandle.connect('notify::hover',
|
||||
Lang.bind(this ,this._sync));
|
||||
this._revealHandle.connect('clicked', Lang.bind(this,
|
||||
function() {
|
||||
this._concealHandle.show();
|
||||
}));
|
||||
this._concealHandle.connect('clicked', Lang.bind(this,
|
||||
function() {
|
||||
this._revealHandle.show();
|
||||
}));
|
||||
|
||||
this._horizontalBarrier = null;
|
||||
this._pressureBarrier = new Layout.PressureBarrier(BARRIER_THRESHOLD,
|
||||
BARRIER_TIMEOUT,
|
||||
Shell.ActionMode.NORMAL);
|
||||
this._pressureBarrier.connect('trigger', Lang.bind(this, function() {
|
||||
this._concealHandle.show();
|
||||
}));
|
||||
|
||||
Main.layoutManager.addChrome(this.actor, { affectsInputRegion: false });
|
||||
Main.layoutManager.trackChrome(this._slider, { affectsInputRegion: true });
|
||||
Main.uiGroup.set_child_below_sibling(this.actor, Main.layoutManager.modalDialogGroup);
|
||||
Main.ctrlAltTabManager.addGroup(this.actor,
|
||||
_("Status Icons"), 'focus-legacy-systray-symbolic',
|
||||
{ sortGroup: CtrlAltTab.SortGroup.BOTTOM });
|
||||
|
||||
this._trayManager = new Shell.TrayManager();
|
||||
this._trayIconAddedId = this._trayManager.connect('tray-icon-added', Lang.bind(this, this._onTrayIconAdded));
|
||||
this._trayIconRemovedId = this._trayManager.connect('tray-icon-removed', Lang.bind(this, this._onTrayIconRemoved));
|
||||
this._trayManager.manage_screen(global.screen, this.actor);
|
||||
|
||||
Main.overview.connect('showing', Lang.bind(this,
|
||||
function() {
|
||||
Tweener.removeTweens(this._slider);
|
||||
Tweener.addTween(this._slider, { opacity: 0,
|
||||
time: Overview.ANIMATION_TIME,
|
||||
transition: 'easeOutQuad' });
|
||||
}));
|
||||
Main.overview.connect('shown', Lang.bind(this, this._sync));
|
||||
Main.overview.connect('hiding', Lang.bind(this,
|
||||
function() {
|
||||
this._sync();
|
||||
Tweener.removeTweens(this._slider);
|
||||
Tweener.addTween(this._slider, { opacity: 255,
|
||||
time: Overview.ANIMATION_TIME,
|
||||
transition: 'easeOutQuad' });
|
||||
}));
|
||||
|
||||
Main.layoutManager.connect('monitors-changed',
|
||||
Lang.bind(this, this._sync));
|
||||
global.screen.connect('in-fullscreen-changed',
|
||||
Lang.bind(this, this._sync));
|
||||
Main.sessionMode.connect('updated', Lang.bind(this, this._sync));
|
||||
|
||||
this._sync();
|
||||
},
|
||||
|
||||
_onTrayIconAdded: function(tm, icon) {
|
||||
let wmClass = icon.wm_class ? icon.wm_class.toLowerCase() : '';
|
||||
if (STANDARD_TRAY_ICON_IMPLEMENTATIONS[wmClass] !== undefined)
|
||||
return;
|
||||
|
||||
let button = new St.Button({ child: icon,
|
||||
style_class: 'legacy-tray-icon',
|
||||
button_mask: St.ButtonMask.ONE |
|
||||
St.ButtonMask.TWO |
|
||||
St.ButtonMask.THREE,
|
||||
can_focus: true,
|
||||
x_fill: true, y_fill: true });
|
||||
|
||||
let app = Shell.WindowTracker.get_default().get_app_from_pid(icon.pid);
|
||||
if (!app)
|
||||
app = Shell.AppSystem.get_default().lookup_startup_wmclass(wmClass);
|
||||
if (!app)
|
||||
app = Shell.AppSystem.get_default().lookup_desktop_wmclass(wmClass);
|
||||
if (app)
|
||||
button.accessible_name = app.get_name();
|
||||
else
|
||||
button.accessible_name = icon.title;
|
||||
|
||||
button.connect('clicked',
|
||||
function() {
|
||||
icon.click(Clutter.get_current_event());
|
||||
});
|
||||
button.connect('key-press-event',
|
||||
function() {
|
||||
icon.click(Clutter.get_current_event());
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
});
|
||||
button.connect('key-focus-in', Lang.bind(this,
|
||||
function() {
|
||||
this._concealHandle.show();
|
||||
}));
|
||||
|
||||
this._iconBox.add_actor(button);
|
||||
|
||||
if (!this._concealHandle.visible) {
|
||||
this._concealHandle.show();
|
||||
GLib.timeout_add_seconds(GLib.PRIORITY_DEFAULT, TEMP_REVEAL_TIME,
|
||||
Lang.bind(this, function() {
|
||||
this._concealHandle.hide();
|
||||
return GLib.SOURCE_REMOVE;
|
||||
}));
|
||||
}
|
||||
},
|
||||
|
||||
_onTrayIconRemoved: function(tm, icon) {
|
||||
if (!this.actor.contains(icon))
|
||||
return;
|
||||
|
||||
icon.get_parent().destroy();
|
||||
this._sync();
|
||||
},
|
||||
|
||||
_syncBarrier: function() {
|
||||
let rtl = (this._slider.get_text_direction() == Clutter.TextDirection.RTL);
|
||||
let [x, y] = this._slider.get_transformed_position();
|
||||
let [w, h] = this._slider.get_transformed_size();
|
||||
|
||||
let x1 = Math.round(x);
|
||||
if (rtl)
|
||||
x1 += Math.round(w);
|
||||
|
||||
let x2 = x1;
|
||||
let y1 = Math.round(y);
|
||||
let y2 = y1 + Math.round(h);
|
||||
|
||||
if (this._horizontalBarrier &&
|
||||
this._horizontalBarrier.x1 == x1 &&
|
||||
this._horizontalBarrier.y1 == y1 &&
|
||||
this._horizontalBarrier.x2 == x2 &&
|
||||
this._horizontalBarrier.y2 == y2)
|
||||
return;
|
||||
|
||||
this._unsetBarrier();
|
||||
|
||||
let directions = (rtl ? Meta.BarrierDirection.NEGATIVE_X : Meta.BarrierDirection.POSITIVE_X);
|
||||
this._horizontalBarrier = new Meta.Barrier({ display: global.display,
|
||||
x1: x1, x2: x2,
|
||||
y1: y1, y2: y2,
|
||||
directions: directions });
|
||||
this._pressureBarrier.addBarrier(this._horizontalBarrier);
|
||||
},
|
||||
|
||||
_unsetBarrier: function() {
|
||||
if (this._horizontalBarrier == null)
|
||||
return;
|
||||
|
||||
this._pressureBarrier.removeBarrier(this._horizontalBarrier);
|
||||
this._horizontalBarrier.destroy();
|
||||
this._horizontalBarrier = null;
|
||||
},
|
||||
|
||||
_sync: function() {
|
||||
// FIXME: we no longer treat tray icons as notifications
|
||||
let allowed = Main.sessionMode.hasNotifications;
|
||||
let hasIcons = this._iconBox.get_n_children() > 0;
|
||||
let inOverview = Main.overview.visible && !Main.overview.animationInProgress;
|
||||
let inFullscreen = Main.layoutManager.primaryMonitor.inFullscreen;
|
||||
this.actor.visible = allowed && hasIcons && !inOverview && !inFullscreen;
|
||||
|
||||
if (!hasIcons)
|
||||
this._concealHandle.hide();
|
||||
|
||||
let targetSlide;
|
||||
if (this._concealHandle.visible) {
|
||||
targetSlide = 1.0;
|
||||
} else if (!hasIcons) {
|
||||
targetSlide = 0.0;
|
||||
} else {
|
||||
let [, boxWidth] = this._box.get_preferred_width(-1);
|
||||
let [, handleWidth] = this._revealHandle.get_preferred_width(-1);
|
||||
|
||||
if (this._revealHandle.hover)
|
||||
targetSlide = handleWidth / boxWidth;
|
||||
else
|
||||
targetSlide = CONCEALED_WIDTH / boxWidth;
|
||||
}
|
||||
|
||||
if (this.actor.visible) {
|
||||
Tweener.addTween(this._slideLayout,
|
||||
{ slideX: targetSlide,
|
||||
time: REVEAL_ANIMATION_TIME,
|
||||
transition: 'easeOutQuad' });
|
||||
} else {
|
||||
this._slideLayout.slideX = targetSlide;
|
||||
this._unsetBarrier();
|
||||
}
|
||||
}
|
||||
});
|
@ -444,55 +444,6 @@ const Magnifier = new Lang.Class({
|
||||
this._appSettings = new Gio.Settings({ schema_id: APPLICATIONS_SCHEMA });
|
||||
this._settings = new Gio.Settings({ schema_id: MAGNIFIER_SCHEMA });
|
||||
|
||||
if (zoomRegion) {
|
||||
// Mag factor is accurate to two decimal places.
|
||||
let aPref = parseFloat(this._settings.get_double(MAG_FACTOR_KEY).toFixed(2));
|
||||
if (aPref != 0.0)
|
||||
zoomRegion.setMagFactor(aPref, aPref);
|
||||
|
||||
aPref = this._settings.get_enum(SCREEN_POSITION_KEY);
|
||||
if (aPref)
|
||||
zoomRegion.setScreenPosition(aPref);
|
||||
|
||||
zoomRegion.setLensMode(this._settings.get_boolean(LENS_MODE_KEY));
|
||||
zoomRegion.setClampScrollingAtEdges(!this._settings.get_boolean(CLAMP_MODE_KEY));
|
||||
|
||||
aPref = this._settings.get_enum(MOUSE_TRACKING_KEY);
|
||||
if (aPref)
|
||||
zoomRegion.setMouseTrackingMode(aPref);
|
||||
|
||||
aPref = this._settings.get_enum(FOCUS_TRACKING_KEY);
|
||||
if (aPref)
|
||||
zoomRegion.setFocusTrackingMode(aPref);
|
||||
|
||||
aPref = this._settings.get_enum(CARET_TRACKING_KEY);
|
||||
if (aPref)
|
||||
zoomRegion.setCaretTrackingMode(aPref);
|
||||
|
||||
aPref = this._settings.get_boolean(INVERT_LIGHTNESS_KEY);
|
||||
if (aPref)
|
||||
zoomRegion.setInvertLightness(aPref);
|
||||
|
||||
aPref = this._settings.get_double(COLOR_SATURATION_KEY);
|
||||
if (aPref)
|
||||
zoomRegion.setColorSaturation(aPref);
|
||||
|
||||
let bc = {};
|
||||
bc.r = this._settings.get_double(BRIGHT_RED_KEY);
|
||||
bc.g = this._settings.get_double(BRIGHT_GREEN_KEY);
|
||||
bc.b = this._settings.get_double(BRIGHT_BLUE_KEY);
|
||||
zoomRegion.setBrightness(bc);
|
||||
|
||||
bc.r = this._settings.get_double(CONTRAST_RED_KEY);
|
||||
bc.g = this._settings.get_double(CONTRAST_GREEN_KEY);
|
||||
bc.b = this._settings.get_double(CONTRAST_BLUE_KEY);
|
||||
zoomRegion.setContrast(bc);
|
||||
}
|
||||
|
||||
let showCrosshairs = this._settings.get_boolean(SHOW_CROSS_HAIRS_KEY);
|
||||
this.addCrosshairs();
|
||||
this.setCrosshairsVisible(showCrosshairs);
|
||||
|
||||
this._appSettings.connect('changed::' + SHOW_KEY,
|
||||
Lang.bind(this, function() {
|
||||
this.setActive(this._appSettings.get_boolean(SHOW_KEY));
|
||||
@ -561,6 +512,56 @@ const Magnifier = new Lang.Class({
|
||||
Lang.bind(this, function() {
|
||||
this.setCrosshairsClip(this._settings.get_boolean(CROSS_HAIRS_CLIP_KEY));
|
||||
}));
|
||||
|
||||
if (zoomRegion) {
|
||||
// Mag factor is accurate to two decimal places.
|
||||
let aPref = parseFloat(this._settings.get_double(MAG_FACTOR_KEY).toFixed(2));
|
||||
if (aPref != 0.0)
|
||||
zoomRegion.setMagFactor(aPref, aPref);
|
||||
|
||||
aPref = this._settings.get_enum(SCREEN_POSITION_KEY);
|
||||
if (aPref)
|
||||
zoomRegion.setScreenPosition(aPref);
|
||||
|
||||
zoomRegion.setLensMode(this._settings.get_boolean(LENS_MODE_KEY));
|
||||
zoomRegion.setClampScrollingAtEdges(!this._settings.get_boolean(CLAMP_MODE_KEY));
|
||||
|
||||
aPref = this._settings.get_enum(MOUSE_TRACKING_KEY);
|
||||
if (aPref)
|
||||
zoomRegion.setMouseTrackingMode(aPref);
|
||||
|
||||
aPref = this._settings.get_enum(FOCUS_TRACKING_KEY);
|
||||
if (aPref)
|
||||
zoomRegion.setFocusTrackingMode(aPref);
|
||||
|
||||
aPref = this._settings.get_enum(CARET_TRACKING_KEY);
|
||||
if (aPref)
|
||||
zoomRegion.setCaretTrackingMode(aPref);
|
||||
|
||||
aPref = this._settings.get_boolean(INVERT_LIGHTNESS_KEY);
|
||||
if (aPref)
|
||||
zoomRegion.setInvertLightness(aPref);
|
||||
|
||||
aPref = this._settings.get_double(COLOR_SATURATION_KEY);
|
||||
if (aPref)
|
||||
zoomRegion.setColorSaturation(aPref);
|
||||
|
||||
let bc = {};
|
||||
bc.r = this._settings.get_double(BRIGHT_RED_KEY);
|
||||
bc.g = this._settings.get_double(BRIGHT_GREEN_KEY);
|
||||
bc.b = this._settings.get_double(BRIGHT_BLUE_KEY);
|
||||
zoomRegion.setBrightness(bc);
|
||||
|
||||
bc.r = this._settings.get_double(CONTRAST_RED_KEY);
|
||||
bc.g = this._settings.get_double(CONTRAST_GREEN_KEY);
|
||||
bc.b = this._settings.get_double(CONTRAST_BLUE_KEY);
|
||||
zoomRegion.setContrast(bc);
|
||||
}
|
||||
|
||||
let showCrosshairs = this._settings.get_boolean(SHOW_CROSS_HAIRS_KEY);
|
||||
this.addCrosshairs();
|
||||
this.setCrosshairsVisible(showCrosshairs);
|
||||
|
||||
return this._appSettings.get_boolean(SHOW_KEY);
|
||||
},
|
||||
|
||||
|
@ -18,6 +18,7 @@ const Environment = imports.ui.environment;
|
||||
const ExtensionSystem = imports.ui.extensionSystem;
|
||||
const ExtensionDownloader = imports.ui.extensionDownloader;
|
||||
const Keyboard = imports.ui.keyboard;
|
||||
const LegacyTray = imports.ui.legacyTray;
|
||||
const MessageTray = imports.ui.messageTray;
|
||||
const ModalDialog = imports.ui.modalDialog;
|
||||
const OsdWindow = imports.ui.osdWindow;
|
||||
@ -52,6 +53,7 @@ let overview = null;
|
||||
let runDialog = null;
|
||||
let lookingGlass = null;
|
||||
let wm = null;
|
||||
let legacyTray = null;
|
||||
let messageTray = null;
|
||||
let screenShield = null;
|
||||
let notificationDaemon = null;
|
||||
@ -159,8 +161,9 @@ function _initializeUI() {
|
||||
if (LoginManager.canLock())
|
||||
screenShield = new ScreenShield.ScreenShield();
|
||||
|
||||
panel = new Panel.Panel();
|
||||
legacyTray = new LegacyTray.LegacyTray();
|
||||
messageTray = new MessageTray.MessageTray();
|
||||
panel = new Panel.Panel();
|
||||
keyboard = new Keyboard.Keyboard();
|
||||
notificationDaemon = new NotificationDaemon.NotificationDaemon();
|
||||
windowAttentionHandler = new WindowAttentionHandler.WindowAttentionHandler();
|
||||
@ -526,6 +529,7 @@ function activateWindow(window, time, workspaceNum) {
|
||||
}
|
||||
|
||||
overview.hide();
|
||||
panel.closeCalendar();
|
||||
}
|
||||
|
||||
// TODO - replace this timeout with some system to guess when the user might
|
||||
|
2080
js/ui/messageTray.js
2080
js/ui/messageTray.js
File diff suppressed because it is too large
Load Diff
@ -212,13 +212,10 @@ const FdoNotificationDaemon = new Lang.Class({
|
||||
|
||||
// Filter out chat, presence, calls and invitation notifications from
|
||||
// Empathy, since we handle that information from telepathyClient.js
|
||||
if (appName == 'Empathy' && (hints['category'] == 'im.received' ||
|
||||
hints['category'] == 'x-empathy.im.room-invitation' ||
|
||||
hints['category'] == 'x-empathy.call.incoming' ||
|
||||
hints['category'] == 'x-empathy.transfer.incoming' ||
|
||||
hints['category'] == 'x-empathy.im.subscription-request' ||
|
||||
hints['category'] == 'presence.online' ||
|
||||
hints['category'] == 'presence.offline')) {
|
||||
//
|
||||
// Note that empathy uses im.received for one to one chats and
|
||||
// x-empathy.im.mentioned for multi-user, so we're good here
|
||||
if (appName == 'Empathy' && hints['category'] == 'im.received') {
|
||||
// Ignore replacesId since we already sent back a
|
||||
// NotificationClosed for that id.
|
||||
id = this._nextNotificationId++;
|
||||
@ -374,11 +371,11 @@ const FdoNotificationDaemon = new Lang.Class({
|
||||
}
|
||||
|
||||
if (hasDefaultAction) {
|
||||
notification.connect('clicked', Lang.bind(this, function() {
|
||||
notification.connect('activated', Lang.bind(this, function() {
|
||||
this._emitActionInvoked(ndata.id, 'default');
|
||||
}));
|
||||
} else {
|
||||
notification.connect('clicked', Lang.bind(this, function() {
|
||||
notification.connect('activated', Lang.bind(this, function() {
|
||||
source.open();
|
||||
}));
|
||||
}
|
||||
@ -551,16 +548,13 @@ const FdoNotificationDaemonSource = new Lang.Class({
|
||||
this.destroyNonResidentNotifications();
|
||||
},
|
||||
|
||||
_lastNotificationRemoved: function() {
|
||||
this.destroy();
|
||||
},
|
||||
|
||||
openApp: function() {
|
||||
if (this.app == null)
|
||||
return;
|
||||
|
||||
this.app.activate();
|
||||
Main.overview.hide();
|
||||
Main.panel.closeCalendar();
|
||||
},
|
||||
|
||||
destroy: function() {
|
||||
@ -648,7 +642,7 @@ const GtkNotificationDaemonNotification = new Lang.Class({
|
||||
this._activateAction(action.unpack(), actionTarget);
|
||||
},
|
||||
|
||||
_onClicked: function() {
|
||||
activate: function() {
|
||||
this._activateAction(this._defaultAction, this._defaultActionTarget);
|
||||
this.parent();
|
||||
},
|
||||
@ -715,11 +709,17 @@ const GtkNotificationDaemonAppSource = new Lang.Class({
|
||||
activateAction: function(actionId, target) {
|
||||
let app = this._createApp();
|
||||
app.ActivateActionRemote(actionId, target ? [target] : [], getPlatformData());
|
||||
|
||||
Main.overview.hide();
|
||||
Main.panel.closeCalendar();
|
||||
},
|
||||
|
||||
open: function() {
|
||||
let app = this._createApp();
|
||||
app.ActivateRemote(getPlatformData());
|
||||
|
||||
Main.overview.hide();
|
||||
Main.panel.closeCalendar();
|
||||
},
|
||||
|
||||
addNotification: function(notificationId, notificationParams, showBanner) {
|
||||
|
@ -259,8 +259,6 @@ const Overview = new Lang.Class({
|
||||
this._overview.add(this._controls.actor, { y_fill: true, expand: true });
|
||||
this._controls.actor.connect('scroll-event', Lang.bind(this, this._onScrollEvent));
|
||||
|
||||
this._stack.add_actor(this._controls.indicatorActor);
|
||||
|
||||
// TODO - recalculate everything when desktop size changes
|
||||
this.dashIconSize = this._dash.iconSize;
|
||||
this._dash.connect('icon-size-changed',
|
||||
|
@ -391,108 +391,6 @@ const DashSpacer = new Lang.Class({
|
||||
}
|
||||
});
|
||||
|
||||
const MessagesIndicator = new Lang.Class({
|
||||
Name: 'MessagesIndicator',
|
||||
|
||||
_init: function(viewSelector) {
|
||||
this._count = 0;
|
||||
this._sources = [];
|
||||
this._viewSelector = viewSelector;
|
||||
|
||||
this._container = new St.BoxLayout({ style_class: 'messages-indicator-contents',
|
||||
reactive: true,
|
||||
track_hover: true,
|
||||
x_expand: true,
|
||||
y_expand: true,
|
||||
x_align: Clutter.ActorAlign.CENTER });
|
||||
|
||||
this._icon = new St.Icon({ icon_name: 'user-idle-symbolic',
|
||||
icon_size: 16 });
|
||||
this._container.add_actor(this._icon);
|
||||
|
||||
this._label = new St.Label();
|
||||
this._container.add_actor(this._label);
|
||||
|
||||
this._highlight = new St.Widget({ style_class: 'messages-indicator-highlight',
|
||||
x_expand: true,
|
||||
y_expand: true,
|
||||
y_align: Clutter.ActorAlign.END,
|
||||
visible: false });
|
||||
|
||||
this._container.connect('notify::hover', Lang.bind(this,
|
||||
function() {
|
||||
this._highlight.visible = this._container.hover;
|
||||
}));
|
||||
|
||||
let clickAction = new Clutter.ClickAction();
|
||||
this._container.add_action(clickAction);
|
||||
clickAction.connect('clicked', Lang.bind(this,
|
||||
function() {
|
||||
Main.messageTray.openTray();
|
||||
}));
|
||||
|
||||
Main.messageTray.connect('showing', Lang.bind(this,
|
||||
function() {
|
||||
this._highlight.visible = false;
|
||||
this._container.hover = false;
|
||||
}));
|
||||
|
||||
let layout = new Clutter.BinLayout();
|
||||
this.actor = new St.Widget({ layout_manager: layout,
|
||||
style_class: 'messages-indicator',
|
||||
y_expand: true,
|
||||
y_align: Clutter.ActorAlign.END,
|
||||
visible: false });
|
||||
this.actor.add_actor(this._container);
|
||||
this.actor.add_actor(this._highlight);
|
||||
|
||||
Main.messageTray.connect('source-added', Lang.bind(this, this._onSourceAdded));
|
||||
Main.messageTray.connect('source-removed', Lang.bind(this, this._onSourceRemoved));
|
||||
|
||||
let sources = Main.messageTray.getSources();
|
||||
sources.forEach(Lang.bind(this, function(source) { this._onSourceAdded(null, source); }));
|
||||
|
||||
this._viewSelector.connect('page-changed', Lang.bind(this, this._updateVisibility));
|
||||
Main.overview.connect('showing', Lang.bind(this, this._updateVisibility));
|
||||
},
|
||||
|
||||
_onSourceAdded: function(tray, source) {
|
||||
source.connect('count-updated', Lang.bind(this, this._updateCount));
|
||||
this._sources.push(source);
|
||||
this._updateCount();
|
||||
},
|
||||
|
||||
_onSourceRemoved: function(tray, source) {
|
||||
this._sources.splice(this._sources.indexOf(source), 1);
|
||||
this._updateCount();
|
||||
},
|
||||
|
||||
_updateCount: function() {
|
||||
let count = 0;
|
||||
let hasChats = false;
|
||||
this._sources.forEach(Lang.bind(this,
|
||||
function(source) {
|
||||
count += source.indicatorCount;
|
||||
hasChats |= source.isChat;
|
||||
}));
|
||||
|
||||
this._count = count;
|
||||
this._label.text = ngettext("%d new message",
|
||||
"%d new messages",
|
||||
count).format(count);
|
||||
|
||||
this._icon.visible = hasChats;
|
||||
this._updateVisibility();
|
||||
},
|
||||
|
||||
_updateVisibility: function() {
|
||||
let activePage = this._viewSelector.getActivePage();
|
||||
let visible = ((this._count > 0) && (activePage == ViewSelector.ViewPage.WINDOWS));
|
||||
|
||||
this.actor.visible = visible;
|
||||
}
|
||||
});
|
||||
|
||||
const ControlsLayout = new Lang.Class({
|
||||
Name: 'ControlsLayout',
|
||||
Extends: Clutter.BinLayout,
|
||||
@ -521,9 +419,6 @@ const ControlsManager = new Lang.Class({
|
||||
this.viewSelector.connect('page-changed', Lang.bind(this, this._setVisibility));
|
||||
this.viewSelector.connect('page-empty', Lang.bind(this, this._onPageEmpty));
|
||||
|
||||
this._indicator = new MessagesIndicator(this.viewSelector);
|
||||
this.indicatorActor = this._indicator.actor;
|
||||
|
||||
let layout = new ControlsLayout();
|
||||
this.actor = new St.Widget({ layout_manager: layout,
|
||||
reactive: true,
|
||||
|
@ -117,7 +117,8 @@ const AppMenuButton = new Lang.Class({
|
||||
this._iconBox = new St.Bin({ style_class: 'app-menu-icon' });
|
||||
this._container.add_actor(this._iconBox);
|
||||
|
||||
this._label = new St.Label();
|
||||
this._label = new St.Label({ y_expand: true,
|
||||
y_align: Clutter.ActorAlign.CENTER });
|
||||
this._container.add_actor(this._label);
|
||||
this._arrow = PopupMenu.arrowIcon(St.Side.BOTTOM);
|
||||
this._container.add_actor(this._arrow);
|
||||
@ -723,7 +724,7 @@ const Panel = new Lang.Class({
|
||||
|
||||
this.statusArea = {};
|
||||
|
||||
this.menuManager = new PopupMenu.PopupMenuManager(this, { actionMode: Shell.ActionMode.TOPBAR_POPUP });
|
||||
this.menuManager = new PopupMenu.PopupMenuManager(this);
|
||||
|
||||
this._leftBox = new St.BoxLayout({ name: 'panelLeft' });
|
||||
this.actor.add_actor(this._leftBox);
|
||||
@ -751,7 +752,7 @@ const Panel = new Lang.Class({
|
||||
}));
|
||||
|
||||
Main.layoutManager.panelBox.add(this.actor);
|
||||
Main.ctrlAltTabManager.addGroup(this.actor, _("Top Bar"), 'emblem-system-symbolic',
|
||||
Main.ctrlAltTabManager.addGroup(this.actor, _("Top Bar"), 'focus-top-bar-symbolic',
|
||||
{ sortGroup: CtrlAltTab.SortGroup.TOP });
|
||||
|
||||
Main.sessionMode.connect('updated', Lang.bind(this, this._updatePanel));
|
||||
@ -877,9 +878,8 @@ const Panel = new Lang.Class({
|
||||
return Clutter.EVENT_STOP;
|
||||
},
|
||||
|
||||
toggleAppMenu: function() {
|
||||
let indicator = this.statusArea.appMenu;
|
||||
if (!indicator) // appMenu not supported by current session mode
|
||||
_toggleMenu: function(indicator) {
|
||||
if (!indicator) // menu not supported by current session mode
|
||||
return;
|
||||
|
||||
let menu = indicator.menu;
|
||||
@ -891,6 +891,26 @@ const Panel = new Lang.Class({
|
||||
menu.actor.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
|
||||
},
|
||||
|
||||
toggleAppMenu: function() {
|
||||
this._toggleMenu(this.statusArea.appMenu);
|
||||
},
|
||||
|
||||
toggleCalendar: function() {
|
||||
this._toggleMenu(this.statusArea.dateMenu);
|
||||
},
|
||||
|
||||
closeCalendar: function() {
|
||||
let indicator = this.statusArea.dateMenu;
|
||||
if (!indicator) // calendar not supported by current session mode
|
||||
return;
|
||||
|
||||
let menu = indicator.menu;
|
||||
if (!indicator.actor.reactive)
|
||||
return;
|
||||
|
||||
menu.close();
|
||||
},
|
||||
|
||||
set boxOpacity(value) {
|
||||
let isReactive = value > 0;
|
||||
|
||||
|
@ -12,7 +12,6 @@ const BoxPointer = imports.ui.boxpointer;
|
||||
const GrabHelper = imports.ui.grabHelper;
|
||||
const Main = imports.ui.main;
|
||||
const Params = imports.misc.params;
|
||||
const Separator = imports.ui.separator;
|
||||
const Tweener = imports.ui.tweener;
|
||||
|
||||
const Ornament = {
|
||||
@ -170,10 +169,10 @@ const PopupBaseMenuItem = new Lang.Class({
|
||||
if (activeChanged) {
|
||||
this.active = active;
|
||||
if (active) {
|
||||
this.actor.add_style_class_name('active');
|
||||
this.actor.add_style_class_name('selected');
|
||||
this.actor.grab_key_focus();
|
||||
} else {
|
||||
this.actor.remove_style_class_name('active');
|
||||
this.actor.remove_style_class_name('selected');
|
||||
// Remove the CSS active state if the user press the button and
|
||||
// while holding moves to another menu item, so we don't paint all items.
|
||||
// The correct behaviour would be to set the new item with the CSS
|
||||
@ -264,7 +263,9 @@ const PopupSeparatorMenuItem = new Lang.Class({
|
||||
Lang.bind(this, this._syncVisibility));
|
||||
this._syncVisibility();
|
||||
|
||||
this._separator = new St.Widget({ style_class: 'popup-separator-menu-item' });
|
||||
this._separator = new St.Widget({ style_class: 'popup-separator-menu-item',
|
||||
y_expand: true,
|
||||
y_align: Clutter.ActorAlign.CENTER });
|
||||
this.actor.add(this._separator, { expand: true });
|
||||
},
|
||||
|
||||
@ -1159,6 +1160,8 @@ const PopupMenuManager = new Lang.Class({
|
||||
Name: 'PopupMenuManager',
|
||||
|
||||
_init: function(owner, grabParams) {
|
||||
grabParams = Params.parse(grabParams,
|
||||
{ actionMode: Shell.ActionMode.POPUP });
|
||||
this._owner = owner;
|
||||
this._grabHelper = new GrabHelper.GrabHelper(owner.actor, grabParams);
|
||||
this._menus = [];
|
||||
|
@ -63,7 +63,7 @@ const SearchProvider2Iface = '<node> \
|
||||
var SearchProviderProxyInfo = Gio.DBusInterfaceInfo.new_for_xml(SearchProviderIface);
|
||||
var SearchProvider2ProxyInfo = Gio.DBusInterfaceInfo.new_for_xml(SearchProvider2Iface);
|
||||
|
||||
function loadRemoteSearchProviders(callback) {
|
||||
function loadRemoteSearchProviders(searchSettings, callback) {
|
||||
let objectPaths = {};
|
||||
let loadedProviders = [];
|
||||
|
||||
@ -124,7 +124,6 @@ function loadRemoteSearchProviders(callback) {
|
||||
}
|
||||
}
|
||||
|
||||
let searchSettings = new Gio.Settings({ schema_id: Search.SEARCH_PROVIDERS_SCHEMA });
|
||||
if (searchSettings.get_boolean('disable-external')) {
|
||||
callback([]);
|
||||
return;
|
||||
@ -236,8 +235,10 @@ const RemoteSearchProvider = new Lang.Class({
|
||||
|
||||
_getResultsFinished: function(results, error, callback) {
|
||||
if (error) {
|
||||
if (!error.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
|
||||
log('Received error from DBus search provider %s: %s'.format(this.id, String(error)));
|
||||
if (error.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
|
||||
return;
|
||||
|
||||
log('Received error from DBus search provider %s: %s'.format(this.id, String(error)));
|
||||
callback([]);
|
||||
return;
|
||||
}
|
||||
|
@ -272,6 +272,10 @@ const RunDialog = new Lang.Class({
|
||||
},
|
||||
|
||||
_restart: function() {
|
||||
if (Meta.is_wayland_compositor()) {
|
||||
this._showError('Restart is not available on Wayland');
|
||||
return;
|
||||
}
|
||||
this._shouldFadeOut = false;
|
||||
this.close();
|
||||
Meta.restart(_("Restarting…"));
|
||||
|
@ -60,9 +60,6 @@ const CURTAIN_SLIDE_TIME = 0.3;
|
||||
const Clock = new Lang.Class({
|
||||
Name: 'ScreenShieldClock',
|
||||
|
||||
CLOCK_FORMAT_KEY: 'clock-format',
|
||||
CLOCK_SHOW_SECONDS_KEY: 'clock-show-seconds',
|
||||
|
||||
_init: function() {
|
||||
this.actor = new St.BoxLayout({ style_class: 'screen-shield-clock',
|
||||
vertical: true });
|
||||
@ -274,7 +271,8 @@ const NotificationsBox = new Lang.Class({
|
||||
});
|
||||
|
||||
this._updateVisibility();
|
||||
this.emit('wake-up-screen');
|
||||
if (obj.sourceBox.visible)
|
||||
this.emit('wake-up-screen');
|
||||
}
|
||||
},
|
||||
|
||||
|
@ -283,8 +283,8 @@ const SelectArea = new Lang.Class({
|
||||
_getGeometry: function() {
|
||||
return { x: Math.min(this._startX, this._lastX),
|
||||
y: Math.min(this._startY, this._lastY),
|
||||
width: Math.abs(this._startX - this._lastX),
|
||||
height: Math.abs(this._startY - this._lastY) };
|
||||
width: Math.abs(this._startX - this._lastX) + 1,
|
||||
height: Math.abs(this._startY - this._lastY) + 1 };
|
||||
},
|
||||
|
||||
_onMotionEvent: function(actor, event) {
|
||||
@ -292,6 +292,8 @@ const SelectArea = new Lang.Class({
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
|
||||
[this._lastX, this._lastY] = event.get_coords();
|
||||
this._lastX = Math.floor(this._lastX);
|
||||
this._lastY = Math.floor(this._lastY);
|
||||
let geometry = this._getGeometry();
|
||||
|
||||
this._rubberband.set_position(geometry.x, geometry.y);
|
||||
@ -302,6 +304,8 @@ const SelectArea = new Lang.Class({
|
||||
|
||||
_onButtonPress: function(actor, event) {
|
||||
[this._startX, this._startY] = event.get_coords();
|
||||
this._startX = Math.floor(this._startX);
|
||||
this._startY = Math.floor(this._startY);
|
||||
this._rubberband.set_position(this._startX, this._startY);
|
||||
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
|
@ -205,6 +205,13 @@ const SearchResultsBase = new Lang.Class({
|
||||
callback(false);
|
||||
return;
|
||||
}
|
||||
if (metas.some(function(meta) {
|
||||
return !meta.name || !meta.id;
|
||||
})) {
|
||||
log('Invalid result meta returned from search provider ' + this.provider.id);
|
||||
callback(false);
|
||||
return;
|
||||
}
|
||||
|
||||
metasNeeded.forEach(Lang.bind(this, function(resultId, i) {
|
||||
let meta = metas[i];
|
||||
@ -409,6 +416,7 @@ const SearchResults = new Lang.Class({
|
||||
|
||||
this._searchSettings = new Gio.Settings({ schema_id: SEARCH_PROVIDERS_SCHEMA });
|
||||
this._searchSettings.connect('changed::disabled', Lang.bind(this, this._reloadRemoteProviders));
|
||||
this._searchSettings.connect('changed::enabled', Lang.bind(this, this._reloadRemoteProviders));
|
||||
this._searchSettings.connect('changed::disable-external', Lang.bind(this, this._reloadRemoteProviders));
|
||||
this._searchSettings.connect('changed::sort-order', Lang.bind(this, this._reloadRemoteProviders));
|
||||
|
||||
@ -427,7 +435,7 @@ const SearchResults = new Lang.Class({
|
||||
this._unregisterProvider(provider);
|
||||
}));
|
||||
|
||||
RemoteSearch.loadRemoteSearchProviders(Lang.bind(this, function(providers) {
|
||||
RemoteSearch.loadRemoteSearchProviders(this._searchSettings, Lang.bind(this, function(providers) {
|
||||
providers.forEach(Lang.bind(this, this._registerProvider));
|
||||
}));
|
||||
},
|
||||
|
@ -49,9 +49,9 @@ function _setButtonsForChoices(dialog, choices) {
|
||||
function _setLabelsForMessage(dialog, message) {
|
||||
let labels = message.split('\n');
|
||||
|
||||
_setLabelText(dialog.subjectLabel, labels[0]);
|
||||
if (labels.length > 1)
|
||||
_setLabelText(dialog.descriptionLabel, labels[1]);
|
||||
_setLabelText(dialog.subjectLabel, labels.shift());
|
||||
if (labels.length > 0)
|
||||
_setLabelText(dialog.descriptionLabel, labels.join('\n'));
|
||||
}
|
||||
|
||||
function _createIcon(gicon) {
|
||||
@ -347,7 +347,7 @@ const ShellMountPasswordDialog = new Lang.Class({
|
||||
mainContentBox.add(this._messageBox,
|
||||
{ y_align: St.Align.START, expand: true, x_fill: true, y_fill: true });
|
||||
|
||||
let subject = new St.Label({ style_class: 'prompt-dialog-headline' });
|
||||
let subject = new St.Label({ style_class: 'prompt-dialog-headline headline' });
|
||||
this._messageBox.add(subject,
|
||||
{ y_fill: false,
|
||||
y_align: St.Align.START });
|
||||
|
@ -119,23 +119,46 @@ const ATIndicator = new Lang.Class({
|
||||
|
||||
_buildItem: function(string, schema, key) {
|
||||
let settings = new Gio.Settings({ schema_id: schema });
|
||||
settings.connect('changed::'+key, Lang.bind(this, function() {
|
||||
widget.setToggleState(settings.get_boolean(key));
|
||||
|
||||
this._queueSyncMenuVisibility();
|
||||
}));
|
||||
|
||||
let widget = this._buildItemExtended(string,
|
||||
settings.get_boolean(key),
|
||||
settings.is_writable(key),
|
||||
function(enabled) {
|
||||
return settings.set_boolean(key, enabled);
|
||||
});
|
||||
settings.connect('changed::'+key, Lang.bind(this, function() {
|
||||
widget.setToggleState(settings.get_boolean(key));
|
||||
|
||||
this._queueSyncMenuVisibility();
|
||||
}));
|
||||
return widget;
|
||||
},
|
||||
|
||||
_buildHCItem: function() {
|
||||
let interfaceSettings = new Gio.Settings({ schema_id: DESKTOP_INTERFACE_SCHEMA });
|
||||
let wmSettings = new Gio.Settings({ schema_id: WM_SCHEMA });
|
||||
interfaceSettings.connect('changed::' + KEY_GTK_THEME, Lang.bind(this, function() {
|
||||
let value = interfaceSettings.get_string(KEY_GTK_THEME);
|
||||
if (value == HIGH_CONTRAST_THEME) {
|
||||
highContrast.setToggleState(true);
|
||||
} else {
|
||||
highContrast.setToggleState(false);
|
||||
gtkTheme = value;
|
||||
}
|
||||
|
||||
this._queueSyncMenuVisibility();
|
||||
}));
|
||||
interfaceSettings.connect('changed::' + KEY_ICON_THEME, function() {
|
||||
let value = interfaceSettings.get_string(KEY_ICON_THEME);
|
||||
if (value != HIGH_CONTRAST_THEME)
|
||||
iconTheme = value;
|
||||
});
|
||||
wmSettings.connect('changed::' + KEY_WM_THEME, function() {
|
||||
let value = wmSettings.get_string(KEY_WM_THEME);
|
||||
if (value != HIGH_CONTRAST_THEME)
|
||||
wmTheme = value;
|
||||
});
|
||||
|
||||
let gtkTheme = interfaceSettings.get_string(KEY_GTK_THEME);
|
||||
let iconTheme = interfaceSettings.get_string(KEY_ICON_THEME);
|
||||
let wmTheme = wmSettings.get_string(KEY_WM_THEME);
|
||||
@ -161,32 +184,18 @@ const ATIndicator = new Lang.Class({
|
||||
wmSettings.reset(KEY_WM_THEME);
|
||||
}
|
||||
});
|
||||
interfaceSettings.connect('changed::' + KEY_GTK_THEME, Lang.bind(this, function() {
|
||||
let value = interfaceSettings.get_string(KEY_GTK_THEME);
|
||||
if (value == HIGH_CONTRAST_THEME) {
|
||||
highContrast.setToggleState(true);
|
||||
} else {
|
||||
highContrast.setToggleState(false);
|
||||
gtkTheme = value;
|
||||
}
|
||||
|
||||
this._queueSyncMenuVisibility();
|
||||
}));
|
||||
interfaceSettings.connect('changed::' + KEY_ICON_THEME, function() {
|
||||
let value = interfaceSettings.get_string(KEY_ICON_THEME);
|
||||
if (value != HIGH_CONTRAST_THEME)
|
||||
iconTheme = value;
|
||||
});
|
||||
wmSettings.connect('changed::' + KEY_WM_THEME, function() {
|
||||
let value = wmSettings.get_string(KEY_WM_THEME);
|
||||
if (value != HIGH_CONTRAST_THEME)
|
||||
wmTheme = value;
|
||||
});
|
||||
return highContrast;
|
||||
},
|
||||
|
||||
_buildFontItem: function() {
|
||||
let settings = new Gio.Settings({ schema_id: DESKTOP_INTERFACE_SCHEMA });
|
||||
settings.connect('changed::' + KEY_TEXT_SCALING_FACTOR, Lang.bind(this, function() {
|
||||
let factor = settings.get_double(KEY_TEXT_SCALING_FACTOR);
|
||||
let active = (factor > 1.0);
|
||||
widget.setToggleState(active);
|
||||
|
||||
this._queueSyncMenuVisibility();
|
||||
}));
|
||||
|
||||
let factor = settings.get_double(KEY_TEXT_SCALING_FACTOR);
|
||||
let initial_setting = (factor > 1.0);
|
||||
@ -200,13 +209,6 @@ const ATIndicator = new Lang.Class({
|
||||
else
|
||||
settings.reset(KEY_TEXT_SCALING_FACTOR);
|
||||
});
|
||||
settings.connect('changed::' + KEY_TEXT_SCALING_FACTOR, Lang.bind(this, function() {
|
||||
let factor = settings.get_double(KEY_TEXT_SCALING_FACTOR);
|
||||
let active = (factor > 1.0);
|
||||
widget.setToggleState(active);
|
||||
|
||||
this._queueSyncMenuVisibility();
|
||||
}));
|
||||
return widget;
|
||||
}
|
||||
});
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const Gio = imports.gi.Gio;
|
||||
const GLib = imports.gi.GLib;
|
||||
const Lang = imports.lang;
|
||||
const Meta = imports.gi.Meta;
|
||||
const Shell = imports.gi.Shell;
|
||||
@ -18,10 +19,6 @@ const PanelMenu = imports.ui.panelMenu;
|
||||
const SwitcherPopup = imports.ui.switcherPopup;
|
||||
const Util = imports.misc.util;
|
||||
|
||||
const DESKTOP_INPUT_SOURCES_SCHEMA = 'org.gnome.desktop.input-sources';
|
||||
const KEY_INPUT_SOURCES = 'sources';
|
||||
const KEY_KEYBOARD_OPTIONS = 'xkb-options';
|
||||
|
||||
const INPUT_SOURCE_TYPE_XKB = 'xkb';
|
||||
const INPUT_SOURCE_TYPE_IBUS = 'ibus';
|
||||
|
||||
@ -142,6 +139,149 @@ const InputSourceSwitcher = new Lang.Class({
|
||||
}
|
||||
});
|
||||
|
||||
const InputSourceSettings = new Lang.Class({
|
||||
Name: 'InputSourceSettings',
|
||||
Abstract: true,
|
||||
|
||||
_emitInputSourcesChanged: function() {
|
||||
this.emit('input-sources-changed');
|
||||
},
|
||||
|
||||
_emitKeyboardOptionsChanged: function() {
|
||||
this.emit('keyboard-options-changed');
|
||||
},
|
||||
|
||||
_emitPerWindowChanged: function() {
|
||||
this.emit('per-window-changed');
|
||||
},
|
||||
|
||||
get inputSources() {
|
||||
return [];
|
||||
},
|
||||
|
||||
get keyboardOptions() {
|
||||
return [];
|
||||
},
|
||||
|
||||
get perWindow() {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
Signals.addSignalMethods(InputSourceSettings.prototype);
|
||||
|
||||
const InputSourceSystemSettings = new Lang.Class({
|
||||
Name: 'InputSourceSystemSettings',
|
||||
Extends: InputSourceSettings,
|
||||
|
||||
_BUS_NAME: 'org.freedesktop.locale1',
|
||||
_BUS_PATH: '/org/freedesktop/locale1',
|
||||
_BUS_IFACE: 'org.freedesktop.locale1',
|
||||
_BUS_PROPS_IFACE: 'org.freedesktop.DBus.Properties',
|
||||
|
||||
_init: function() {
|
||||
this._layouts = '';
|
||||
this._variants = '';
|
||||
this._options = '';
|
||||
|
||||
this._reload();
|
||||
|
||||
Gio.DBus.system.signal_subscribe(this._BUS_NAME,
|
||||
this._BUS_PROPS_IFACE,
|
||||
'PropertiesChanged',
|
||||
this._BUS_PATH,
|
||||
null,
|
||||
Gio.DBusSignalFlags.NONE,
|
||||
Lang.bind(this, this._reload));
|
||||
},
|
||||
|
||||
_reload: function() {
|
||||
Gio.DBus.system.call(this._BUS_NAME,
|
||||
this._BUS_PATH,
|
||||
this._BUS_PROPS_IFACE,
|
||||
'GetAll',
|
||||
new GLib.Variant('(s)', [this._BUS_IFACE]),
|
||||
null, Gio.DBusCallFlags.NONE, -1, null,
|
||||
Lang.bind(this, function(conn, result) {
|
||||
let props;
|
||||
try {
|
||||
props = conn.call_finish(result).deep_unpack()[0];
|
||||
} catch(e) {
|
||||
log('Could not get properties from ' + this._BUS_NAME);
|
||||
return;
|
||||
}
|
||||
let layouts = props['X11Layout'].unpack();
|
||||
let variants = props['X11Variant'].unpack();
|
||||
let options = props['X11Options'].unpack();
|
||||
|
||||
if (layouts != this._layouts ||
|
||||
variants != this._variants) {
|
||||
this._layouts = layouts;
|
||||
this._variants = variants;
|
||||
this._emitInputSourcesChanged();
|
||||
}
|
||||
if (options != this._options) {
|
||||
this._options = options;
|
||||
this._emitKeyboardOptionsChanged();
|
||||
}
|
||||
}));
|
||||
},
|
||||
|
||||
get inputSources() {
|
||||
let sourcesList = [];
|
||||
let layouts = this._layouts.split(',');
|
||||
let variants = this._variants.split(',');
|
||||
|
||||
for (let i = 0; i < layouts.length && !!layouts[i]; i++) {
|
||||
let id = layouts[i];
|
||||
if (!!variants[i])
|
||||
id += '+' + variants[i];
|
||||
sourcesList.push({ type: INPUT_SOURCE_TYPE_XKB, id: id });
|
||||
}
|
||||
return sourcesList;
|
||||
},
|
||||
|
||||
get keyboardOptions() {
|
||||
return this._options.split(',');
|
||||
}
|
||||
});
|
||||
|
||||
const InputSourceSessionSettings = new Lang.Class({
|
||||
Name: 'InputSourceSessionSettings',
|
||||
Extends: InputSourceSettings,
|
||||
|
||||
_DESKTOP_INPUT_SOURCES_SCHEMA: 'org.gnome.desktop.input-sources',
|
||||
_KEY_INPUT_SOURCES: 'sources',
|
||||
_KEY_KEYBOARD_OPTIONS: 'xkb-options',
|
||||
_KEY_PER_WINDOW: 'per-window',
|
||||
|
||||
_init: function() {
|
||||
this._settings = new Gio.Settings({ schema_id: this._DESKTOP_INPUT_SOURCES_SCHEMA });
|
||||
this._settings.connect('changed::' + this._KEY_INPUT_SOURCES, Lang.bind(this, this._emitInputSourcesChanged));
|
||||
this._settings.connect('changed::' + this._KEY_KEYBOARD_OPTIONS, Lang.bind(this, this._emitKeyboardOptionsChanged));
|
||||
this._settings.connect('changed::' + this._KEY_PER_WINDOW, Lang.bind(this, this._emitPerWindowChanged));
|
||||
},
|
||||
|
||||
get inputSources() {
|
||||
let sourcesList = [];
|
||||
let sources = this._settings.get_value(this._KEY_INPUT_SOURCES);
|
||||
let nSources = sources.n_children();
|
||||
|
||||
for (let i = 0; i < nSources; i++) {
|
||||
let [type, id] = sources.get_child_value(i).deep_unpack();
|
||||
sourcesList.push({ type: type, id: id });
|
||||
}
|
||||
return sourcesList;
|
||||
},
|
||||
|
||||
get keyboardOptions() {
|
||||
return this._settings.get_strv(this._KEY_KEYBOARD_OPTIONS);
|
||||
},
|
||||
|
||||
get perWindow() {
|
||||
return this._settings.get_boolean(this._KEY_PER_WINDOW);
|
||||
}
|
||||
});
|
||||
|
||||
const InputSourceManager = new Lang.Class({
|
||||
Name: 'InputSourceManager',
|
||||
|
||||
@ -155,11 +295,11 @@ const InputSourceManager = new Lang.Class({
|
||||
this._ibusSources = {};
|
||||
|
||||
this._currentSource = null;
|
||||
this._backupSource = null;
|
||||
|
||||
// All valid input sources currently in the gsettings
|
||||
// KEY_INPUT_SOURCES list ordered by most recently used
|
||||
this._mruSources = [];
|
||||
this._mruSourcesBackup = null;
|
||||
this._keybindingAction =
|
||||
Main.wm.addKeybinding('switch-input-source',
|
||||
new Gio.Settings({ schema_id: "org.gnome.desktop.wm.keybindings" }),
|
||||
@ -172,9 +312,12 @@ const InputSourceManager = new Lang.Class({
|
||||
Meta.KeyBindingFlags.IS_REVERSED,
|
||||
Shell.ActionMode.ALL,
|
||||
Lang.bind(this, this._switchInputSource));
|
||||
this._settings = new Gio.Settings({ schema_id: DESKTOP_INPUT_SOURCES_SCHEMA });
|
||||
this._settings.connect('changed::' + KEY_INPUT_SOURCES, Lang.bind(this, this._inputSourcesChanged));
|
||||
this._settings.connect('changed::' + KEY_KEYBOARD_OPTIONS, Lang.bind(this, this._keyboardOptionsChanged));
|
||||
if (Main.sessionMode.isGreeter)
|
||||
this._settings = new InputSourceSystemSettings();
|
||||
else
|
||||
this._settings = new InputSourceSessionSettings();
|
||||
this._settings.connect('input-sources-changed', Lang.bind(this, this._inputSourcesChanged));
|
||||
this._settings.connect('keyboard-options-changed', Lang.bind(this, this._keyboardOptionsChanged));
|
||||
|
||||
this._xkbInfo = KeyboardManager.getXkbInfo();
|
||||
this._keyboardManager = KeyboardManager.getKeyboardManager();
|
||||
@ -192,13 +335,13 @@ const InputSourceManager = new Lang.Class({
|
||||
this._focusWindowNotifyId = 0;
|
||||
this._overviewShowingId = 0;
|
||||
this._overviewHiddenId = 0;
|
||||
this._settings.connect('changed::per-window', Lang.bind(this, this._sourcesPerWindowChanged));
|
||||
this._settings.connect('per-window-changed', Lang.bind(this, this._sourcesPerWindowChanged));
|
||||
this._sourcesPerWindowChanged();
|
||||
this._disableIBus = false;
|
||||
},
|
||||
|
||||
reload: function() {
|
||||
this._keyboardManager.setKeyboardOptions(this._settings.get_strv(KEY_KEYBOARD_OPTIONS));
|
||||
this._keyboardManager.setKeyboardOptions(this._settings.keyboardOptions);
|
||||
this._inputSourcesChanged();
|
||||
},
|
||||
|
||||
@ -242,8 +385,7 @@ const InputSourceManager = new Lang.Class({
|
||||
// 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.actionMode == Shell.ActionMode.MESSAGE_TRAY ||
|
||||
Main.actionMode == Shell.ActionMode.TOPBAR_POPUP) {
|
||||
if (Main.actionMode == Shell.ActionMode.POPUP) {
|
||||
this._modifiersSwitcher();
|
||||
return;
|
||||
}
|
||||
@ -254,7 +396,7 @@ const InputSourceManager = new Lang.Class({
|
||||
},
|
||||
|
||||
_keyboardOptionsChanged: function() {
|
||||
this._keyboardManager.setKeyboardOptions(this._settings.get_strv(KEY_KEYBOARD_OPTIONS));
|
||||
this._keyboardManager.setKeyboardOptions(this._settings.keyboardOptions);
|
||||
this._keyboardManager.reapply();
|
||||
},
|
||||
|
||||
@ -295,8 +437,8 @@ const InputSourceManager = new Lang.Class({
|
||||
},
|
||||
|
||||
_inputSourcesChanged: function() {
|
||||
let sources = this._settings.get_value(KEY_INPUT_SOURCES);
|
||||
let nSources = sources.n_children();
|
||||
let sources = this._settings.inputSources;
|
||||
let nSources = sources.length;
|
||||
|
||||
this._inputSources = {};
|
||||
this._ibusSources = {};
|
||||
@ -305,7 +447,8 @@ const InputSourceManager = new Lang.Class({
|
||||
for (let i = 0; i < nSources; i++) {
|
||||
let displayName;
|
||||
let shortName;
|
||||
let [type, id] = sources.get_child_value(i).deep_unpack();
|
||||
let type = sources[i].type;
|
||||
let id = sources[i].id;
|
||||
let exists = false;
|
||||
|
||||
if (type == INPUT_SOURCE_TYPE_XKB) {
|
||||
@ -373,6 +516,11 @@ const InputSourceManager = new Lang.Class({
|
||||
|
||||
this._keyboardManager.setUserLayouts(sourcesList.map(function(x) { return x.xkbId; }));
|
||||
|
||||
if (!this._disableIBus && this._mruSourcesBackup) {
|
||||
this._mruSources = this._mruSourcesBackup;
|
||||
this._mruSourcesBackup = null;
|
||||
}
|
||||
|
||||
let mruSources = [];
|
||||
for (let i = 0; i < this._mruSources.length; i++) {
|
||||
for (let j = 0; j < sourcesList.length; j++)
|
||||
@ -384,20 +532,8 @@ const InputSourceManager = new Lang.Class({
|
||||
}
|
||||
this._mruSources = mruSources.concat(sourcesList);
|
||||
|
||||
if (this._mruSources.length > 0) {
|
||||
if (!this._disableIBus && this._backupSource) {
|
||||
for (let i = 0; i < this._mruSources.length; i++) {
|
||||
if (this._mruSources[i].type == this._backupSource.type &&
|
||||
this._mruSources[i].id == this._backupSource.id) {
|
||||
let currentSource = this._mruSources.splice(i, 1);
|
||||
this._mruSources = currentSource.concat(this._mruSources);
|
||||
break;
|
||||
}
|
||||
}
|
||||
this._backupSource = null;
|
||||
}
|
||||
if (this._mruSources.length > 0)
|
||||
this._mruSources[0].activate();
|
||||
}
|
||||
|
||||
// All ibus engines are preloaded here to reduce the launching time
|
||||
// when users switch the input sources.
|
||||
@ -462,27 +598,30 @@ const InputSourceManager = new Lang.Class({
|
||||
if (this._disableIBus)
|
||||
return;
|
||||
this._disableIBus = true;
|
||||
this._backupSource = this._currentSource;
|
||||
this._mruSourcesBackup = this._mruSources.slice();
|
||||
} else {
|
||||
if (!this._disableIBus)
|
||||
return;
|
||||
this._disableIBus = false;
|
||||
}
|
||||
// If this._mruSources is not cleared before this.reload() is called,
|
||||
// the order is different from the original one as IM sources will
|
||||
// be appended to XKB sources.
|
||||
this._mruSources = [];
|
||||
this.reload();
|
||||
},
|
||||
|
||||
_getNewInputSource: function(current) {
|
||||
for (let i in this._inputSources) {
|
||||
let is = this._inputSources[i];
|
||||
if (is.type == current.type &&
|
||||
is.id == current.id)
|
||||
return is;
|
||||
let sourceIndexes = Object.keys(this._inputSources);
|
||||
if (sourceIndexes.length == 0)
|
||||
return null;
|
||||
|
||||
if (current) {
|
||||
for (let i in this._inputSources) {
|
||||
let is = this._inputSources[i];
|
||||
if (is.type == current.type &&
|
||||
is.id == current.id)
|
||||
return is;
|
||||
}
|
||||
}
|
||||
return this._currentSource;
|
||||
|
||||
return this._inputSources[sourceIndexes[0]];
|
||||
},
|
||||
|
||||
_getCurrentWindow: function() {
|
||||
@ -497,20 +636,17 @@ const InputSourceManager = new Lang.Class({
|
||||
if (!window)
|
||||
return;
|
||||
|
||||
if (!window._inputSources) {
|
||||
window._inputSources = this._inputSources;
|
||||
window._currentSource = this._currentSource;
|
||||
} else if (window._inputSources == this._inputSources) {
|
||||
window._currentSource.activate();
|
||||
} else {
|
||||
if (window._inputSources != this._inputSources) {
|
||||
window._inputSources = this._inputSources;
|
||||
window._currentSource = this._getNewInputSource(window._currentSource);
|
||||
window._currentSource.activate();
|
||||
}
|
||||
|
||||
if (window._currentSource)
|
||||
window._currentSource.activate();
|
||||
},
|
||||
|
||||
_sourcesPerWindowChanged: function() {
|
||||
this._sourcesPerWindow = this._settings.get_boolean('per-window');
|
||||
this._sourcesPerWindow = this._settings.perWindow;
|
||||
|
||||
if (this._sourcesPerWindow && this._focusWindowNotifyId == 0) {
|
||||
this._focusWindowNotifyId = global.display.connect('notify::focus-window',
|
||||
|
@ -17,9 +17,7 @@ const PanelMenu = imports.ui.panelMenu;
|
||||
const PopupMenu = imports.ui.popupMenu;
|
||||
|
||||
const LOCKDOWN_SCHEMA = 'org.gnome.desktop.lockdown';
|
||||
const SCREENSAVER_SCHEMA = 'org.gnome.desktop.screensaver';
|
||||
const LOGIN_SCREEN_SCHEMA = 'org.gnome.login-screen';
|
||||
const PRIVACY_SCHEMA = 'org.gnome.desktop.privacy'
|
||||
const DISABLE_USER_SWITCH_KEY = 'disable-user-switching';
|
||||
const DISABLE_LOCK_SCREEN_KEY = 'disable-lock-screen';
|
||||
const DISABLE_LOG_OUT_KEY = 'disable-log-out';
|
||||
@ -95,10 +93,8 @@ const Indicator = new Lang.Class({
|
||||
_init: function() {
|
||||
this.parent();
|
||||
|
||||
this._screenSaverSettings = new Gio.Settings({ schema_id: SCREENSAVER_SCHEMA });
|
||||
this._loginScreenSettings = new Gio.Settings({ schema_id: LOGIN_SCREEN_SCHEMA });
|
||||
this._lockdownSettings = new Gio.Settings({ schema_id: LOCKDOWN_SCHEMA });
|
||||
this._privacySettings = new Gio.Settings({ schema_id: PRIVACY_SCHEMA });
|
||||
this._orientationSettings = new Gio.Settings({ schema_id: 'org.gnome.settings-daemon.peripherals.touchscreen' });
|
||||
|
||||
this._session = new GnomeSession.SessionManager();
|
||||
@ -129,6 +125,7 @@ const Indicator = new Lang.Class({
|
||||
Lang.bind(this, this._updateMultiUser));
|
||||
this._updateSwitchUser();
|
||||
this._updateMultiUser();
|
||||
this._updateLockScreen();
|
||||
|
||||
// Whether shutdown is available or not depends on both lockdown
|
||||
// settings (disable-log-out) and Polkit policy - the latter doesn't
|
||||
|
@ -6,6 +6,7 @@ const Clutter = imports.gi.Clutter;
|
||||
const AccountsService = imports.gi.AccountsService;
|
||||
const GLib = imports.gi.GLib;
|
||||
const Gio = imports.gi.Gio;
|
||||
const GObject = imports.gi.GObject;
|
||||
const Lang = imports.lang;
|
||||
const St = imports.gi.St;
|
||||
|
||||
@ -117,6 +118,7 @@ const UserWidgetLabel = new Lang.Class({
|
||||
this._currentLabel = this._realNameLabel;
|
||||
else
|
||||
this._currentLabel = this._userNameLabel;
|
||||
this.label_actor = this._currentLabel;
|
||||
|
||||
let childBox = new Clutter.ActorBox();
|
||||
childBox.x1 = 0;
|
||||
@ -158,6 +160,9 @@ const UserWidget = new Lang.Class({
|
||||
this._label = new UserWidgetLabel(user);
|
||||
this.actor.add_child(this._label);
|
||||
|
||||
this._label.bind_property('label-actor', this.actor, 'label-actor',
|
||||
GObject.BindingFlags.SYNC_CREATE);
|
||||
|
||||
this._userLoadedId = this._user.connect('notify::is-loaded', Lang.bind(this, this._updateUser));
|
||||
this._userChangedId = this._user.connect('changed', Lang.bind(this, this._updateUser));
|
||||
this._updateUser();
|
||||
|
@ -152,7 +152,7 @@ const ViewSelector = new Lang.Class({
|
||||
|
||||
this._workspacesDisplay = new WorkspacesView.WorkspacesDisplay();
|
||||
this._workspacesPage = this._addPage(this._workspacesDisplay.actor,
|
||||
_("Windows"), 'emblem-documents-symbolic');
|
||||
_("Windows"), 'focus-windows-symbolic');
|
||||
|
||||
this.appDisplay = new AppDisplay.AppDisplay();
|
||||
this._appsPage = this._addPage(this.appDisplay.actor,
|
||||
@ -214,10 +214,13 @@ const ViewSelector = new Lang.Class({
|
||||
Shell.ActionMode.OVERVIEW,
|
||||
Lang.bind(Main.overview, Main.overview.toggle));
|
||||
|
||||
let gesture;
|
||||
|
||||
gesture = new EdgeDragAction.EdgeDragAction(St.Side.LEFT,
|
||||
Shell.ActionMode.NORMAL);
|
||||
let side;
|
||||
if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL)
|
||||
side = St.Side.RIGHT;
|
||||
else
|
||||
side = St.Side.LEFT;
|
||||
let gesture = new EdgeDragAction.EdgeDragAction(side,
|
||||
Shell.ActionMode.NORMAL);
|
||||
gesture.connect('activated', Lang.bind(this, function() {
|
||||
if (Main.overview.visible)
|
||||
Main.overview.hide();
|
||||
@ -552,7 +555,9 @@ const ViewSelector = new Lang.Class({
|
||||
_onCapturedEvent: function(actor, event) {
|
||||
if (event.type() == Clutter.EventType.BUTTON_PRESS) {
|
||||
let source = event.get_source();
|
||||
if (source != this._text && this._text.text == '' &&
|
||||
if (source != this._text &&
|
||||
this._text.text == '' &&
|
||||
!this._text.has_preedit () &&
|
||||
!Main.layoutManager.keyboardBox.contains(source)) {
|
||||
// the user clicked outside after activating the entry, but
|
||||
// with no search term entered and no keyboard button pressed
|
||||
|
@ -39,7 +39,7 @@ const WindowAttentionHandler = new Lang.Class({
|
||||
let [title, banner] = this._getTitleAndBanner(app, window);
|
||||
|
||||
let notification = new MessageTray.Notification(source, title, banner);
|
||||
notification.connect('clicked', function() {
|
||||
notification.connect('activated', function() {
|
||||
source.open();
|
||||
});
|
||||
notification.setForFeedback(true);
|
||||
|
@ -197,6 +197,8 @@ const WorkspaceTracker = new Lang.Class({
|
||||
this._workspaces = [];
|
||||
this._checkWorkspacesId = 0;
|
||||
|
||||
this._pauseWorkspaceCheck = false;
|
||||
|
||||
let tracker = Shell.WindowTracker.get_default();
|
||||
tracker.connect('startup-sequence-changed', Lang.bind(this, this._queueCheckWorkspaces));
|
||||
|
||||
@ -220,6 +222,14 @@ const WorkspaceTracker = new Lang.Class({
|
||||
return new Gio.Settings({ schema_id: 'org.gnome.mutter' });
|
||||
},
|
||||
|
||||
blockUpdates: function() {
|
||||
this._pauseWorkspaceCheck = true;
|
||||
},
|
||||
|
||||
unblockUpdates: function() {
|
||||
this._pauseWorkspaceCheck = false;
|
||||
},
|
||||
|
||||
_checkWorkspaces: function() {
|
||||
let i;
|
||||
let emptyWorkspaces = [];
|
||||
@ -229,6 +239,10 @@ const WorkspaceTracker = new Lang.Class({
|
||||
return false;
|
||||
}
|
||||
|
||||
// Update workspaces only if Dynamic Workspace Management has not been paused by some other function
|
||||
if (this._pauseWorkspaceCheck)
|
||||
return true;
|
||||
|
||||
for (i = 0; i < this._workspaces.length; i++) {
|
||||
let lastRemoved = this._workspaces[i]._lastRemovedWindow;
|
||||
if ((lastRemoved &&
|
||||
@ -616,6 +630,7 @@ const WindowManager = new Lang.Class({
|
||||
this._shellwm = global.window_manager;
|
||||
|
||||
this._minimizing = [];
|
||||
this._unminimizing = [];
|
||||
this._maximizing = [];
|
||||
this._unmaximizing = [];
|
||||
this._mapping = [];
|
||||
@ -626,6 +641,8 @@ const WindowManager = new Lang.Class({
|
||||
|
||||
this._allowedKeybindings = {};
|
||||
|
||||
this._isWorkspacePrepended = false;
|
||||
|
||||
this._switchData = null;
|
||||
this._shellwm.connect('kill-switch-workspace', Lang.bind(this, this._switchWorkspaceDone));
|
||||
this._shellwm.connect('kill-window-effects', Lang.bind(this, function (shellwm, actor) {
|
||||
@ -641,6 +658,7 @@ const WindowManager = new Lang.Class({
|
||||
this._shellwm.connect('hide-tile-preview', Lang.bind(this, this._hideTilePreview));
|
||||
this._shellwm.connect('show-window-menu', Lang.bind(this, this._showWindowMenu));
|
||||
this._shellwm.connect('minimize', Lang.bind(this, this._minimizeWindow));
|
||||
this._shellwm.connect('unminimize', Lang.bind(this, this._unminimizeWindow));
|
||||
this._shellwm.connect('maximize', Lang.bind(this, this._maximizeWindow));
|
||||
this._shellwm.connect('unmaximize', Lang.bind(this, this._unmaximizeWindow));
|
||||
this._shellwm.connect('map', Lang.bind(this, this._mapWindow));
|
||||
@ -831,9 +849,17 @@ const WindowManager = new Lang.Class({
|
||||
new Gio.Settings({ schema_id: SHELL_KEYBINDINGS_SCHEMA }),
|
||||
Meta.KeyBindingFlags.NONE,
|
||||
Shell.ActionMode.NORMAL |
|
||||
Shell.ActionMode.TOPBAR_POPUP,
|
||||
Shell.ActionMode.POPUP,
|
||||
Lang.bind(this, this._toggleAppMenu));
|
||||
|
||||
this.addKeybinding('toggle-message-tray',
|
||||
new Gio.Settings({ schema_id: SHELL_KEYBINDINGS_SCHEMA }),
|
||||
Meta.KeyBindingFlags.NONE,
|
||||
Shell.ActionMode.NORMAL |
|
||||
Shell.ActionMode.OVERVIEW |
|
||||
Shell.ActionMode.POPUP,
|
||||
Lang.bind(this, this._toggleCalendar));
|
||||
|
||||
global.display.connect('show-resize-popup', Lang.bind(this, this._showResizePopup));
|
||||
|
||||
Main.overview.connect('showing', Lang.bind(this, function() {
|
||||
@ -905,6 +931,8 @@ const WindowManager = new Lang.Class({
|
||||
if (!Meta.prefs_get_dynamic_workspaces())
|
||||
return;
|
||||
|
||||
global.screen.append_new_workspace(false, global.get_current_time());
|
||||
|
||||
let windows = global.get_window_actors().map(function(winActor) {
|
||||
return winActor.meta_window;
|
||||
});
|
||||
@ -1065,6 +1093,84 @@ const WindowManager = new Lang.Class({
|
||||
}
|
||||
},
|
||||
|
||||
_unminimizeWindow : function(shellwm, actor) {
|
||||
let types = [Meta.WindowType.NORMAL,
|
||||
Meta.WindowType.MODAL_DIALOG,
|
||||
Meta.WindowType.DIALOG];
|
||||
if (!this._shouldAnimateActor(actor, types)) {
|
||||
shellwm.completed_unminimize(actor);
|
||||
return;
|
||||
}
|
||||
|
||||
this._unminimizing.push(actor);
|
||||
|
||||
if (actor.meta_window.is_monitor_sized()) {
|
||||
actor.opacity = 0;
|
||||
actor.set_scale(1.0, 1.0);
|
||||
Tweener.addTween(actor,
|
||||
{ opacity: 255,
|
||||
time: MINIMIZE_WINDOW_ANIMATION_TIME,
|
||||
transition: 'easeOutQuad',
|
||||
onComplete: this._unminimizeWindowDone,
|
||||
onCompleteScope: this,
|
||||
onCompleteParams: [shellwm, actor],
|
||||
onOverwrite: this._unminimizeWindowOverwritten,
|
||||
onOverwriteScope: this,
|
||||
onOverwriteParams: [shellwm, actor]
|
||||
});
|
||||
} else {
|
||||
let [success, geom] = actor.meta_window.get_icon_geometry();
|
||||
if (success) {
|
||||
actor.set_position(geom.x, geom.y);
|
||||
actor.set_scale(geom.width / actor.width,
|
||||
geom.height / actor.height);
|
||||
} else {
|
||||
let monitor = Main.layoutManager.monitors[actor.meta_window.get_monitor()];
|
||||
actor.set_position(monitor.x, monitor.y);
|
||||
if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL)
|
||||
actor.x += monitor.width;
|
||||
actor.set_scale(0, 0);
|
||||
}
|
||||
|
||||
let rect = actor.meta_window.get_frame_rect();
|
||||
let [xDest, yDest] = [rect.x, rect.y];
|
||||
|
||||
actor.show();
|
||||
Tweener.addTween(actor,
|
||||
{ scale_x: 1.0,
|
||||
scale_y: 1.0,
|
||||
x: xDest,
|
||||
y: yDest,
|
||||
time: MINIMIZE_WINDOW_ANIMATION_TIME,
|
||||
transition: 'easeInExpo',
|
||||
onComplete: this._unminimizeWindowDone,
|
||||
onCompleteScope: this,
|
||||
onCompleteParams: [shellwm, actor],
|
||||
onOverwrite: this._unminimizeWindowOverwritten,
|
||||
onOverwriteScope: this,
|
||||
onOverwriteParams: [shellwm, actor]
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
_unminimizeWindowDone : function(shellwm, actor) {
|
||||
if (this._removeEffect(this._unminimizing, actor)) {
|
||||
Tweener.removeTweens(actor);
|
||||
actor.set_scale(1.0, 1.0);
|
||||
actor.set_opacity(255);
|
||||
actor.set_pivot_point(0, 0);
|
||||
|
||||
shellwm.completed_unminimize(actor);
|
||||
}
|
||||
},
|
||||
|
||||
_unminimizeWindowOverwritten : function(shellwm, actor) {
|
||||
if (this._removeEffect(this._unminimizing, actor)) {
|
||||
shellwm.completed_unminimize(actor);
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
_maximizeWindow : function(shellwm, actor, targetX, targetY, targetWidth, targetHeight) {
|
||||
shellwm.completed_maximize(actor);
|
||||
},
|
||||
@ -1514,6 +1620,10 @@ const WindowManager = new Lang.Class({
|
||||
Main.panel.toggleAppMenu();
|
||||
},
|
||||
|
||||
_toggleCalendar: function(display, screen, window, event, binding) {
|
||||
Main.panel.toggleCalendar();
|
||||
},
|
||||
|
||||
_toggleTweens: function() {
|
||||
this._tweensPaused = !this._tweensPaused;
|
||||
const OrigTweener = imports.tweener.tweener;
|
||||
@ -1534,14 +1644,26 @@ const WindowManager = new Lang.Class({
|
||||
let newWs;
|
||||
let direction;
|
||||
|
||||
if (action == 'move') {
|
||||
// "Moving" a window to another workspace doesn't make sense when
|
||||
// it cannot be unstuck, and is potentially confusing if a new
|
||||
// workspaces is added at the start/end
|
||||
if (window.is_always_on_all_workspaces() ||
|
||||
(Meta.prefs_get_workspaces_only_on_primary() &&
|
||||
window.get_monitor() != Main.layoutManager.primaryIndex))
|
||||
return;
|
||||
}
|
||||
|
||||
if (target == 'last') {
|
||||
direction = Meta.MotionDirection.DOWN;
|
||||
newWs = screen.get_workspace_by_index(screen.n_workspaces - 1);
|
||||
} else if (isNaN(target)) {
|
||||
// Prepend a new workspace dynamically
|
||||
if (screen.get_active_workspace_index() == 0 &&
|
||||
action == 'move' && target == 'up')
|
||||
action == 'move' && target == 'up' && this._isWorkspacePrepended == false) {
|
||||
this.insertWorkspace(0);
|
||||
this._isWorkspacePrepended = true;
|
||||
}
|
||||
|
||||
direction = Meta.MotionDirection[target.toUpperCase()];
|
||||
newWs = screen.get_active_workspace().get_neighbor(direction);
|
||||
@ -1566,9 +1688,12 @@ const WindowManager = new Lang.Class({
|
||||
|
||||
if (!Main.overview.visible) {
|
||||
if (this._workspaceSwitcherPopup == null) {
|
||||
this._workspaceTracker.blockUpdates();
|
||||
this._workspaceSwitcherPopup = new WorkspaceSwitcherPopup.WorkspaceSwitcherPopup();
|
||||
this._workspaceSwitcherPopup.connect('destroy', Lang.bind(this, function() {
|
||||
this._workspaceTracker.unblockUpdates();
|
||||
this._workspaceSwitcherPopup = null;
|
||||
this._isWorkspacePrepended = false;
|
||||
}));
|
||||
}
|
||||
this._workspaceSwitcherPopup.display(direction, newWs.index());
|
||||
|
@ -156,7 +156,6 @@ const WindowClone = new Lang.Class({
|
||||
this.actor.add_action(clickAction);
|
||||
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
|
||||
this.actor.connect('key-press-event', Lang.bind(this, this._onKeyPress));
|
||||
this.actor.connect('enter-event', Lang.bind(this, this._onEnter));
|
||||
|
||||
this._draggable = DND.makeDraggable(this.actor,
|
||||
{ restoreOnSuccess: true,
|
||||
@ -353,10 +352,6 @@ const WindowClone = new Lang.Class({
|
||||
return false;
|
||||
},
|
||||
|
||||
_onEnter: function() {
|
||||
this.actor.grab_key_focus();
|
||||
},
|
||||
|
||||
_onClicked: function(action, actor) {
|
||||
this._activate();
|
||||
},
|
||||
@ -917,14 +912,18 @@ const LayoutStrategy = new Lang.Class({
|
||||
let slots = [];
|
||||
|
||||
// Do this in three parts.
|
||||
let height = 0;
|
||||
let heightWithoutSpacing = 0;
|
||||
for (let i = 0; i < rows.length; i++) {
|
||||
let row = rows[i];
|
||||
height += row.height + this._rowSpacing;
|
||||
heightWithoutSpacing += row.height;
|
||||
}
|
||||
|
||||
height -= this._rowSpacing;
|
||||
let verticalSpacing = (rows.length - 1) * this._rowSpacing;
|
||||
let additionalVerticalScale = Math.min(1, (area.height - verticalSpacing) / heightWithoutSpacing);
|
||||
|
||||
// keep track how much smaller the grid becomes due to scaling
|
||||
// so it can be centered again
|
||||
let compensation = 0
|
||||
let y = 0;
|
||||
|
||||
for (let i = 0; i < rows.length; i++) {
|
||||
@ -932,13 +931,27 @@ const LayoutStrategy = new Lang.Class({
|
||||
|
||||
// If this window layout row doesn't fit in the actual
|
||||
// geometry, then apply an additional scale to it.
|
||||
row.additionalScale = Math.min(1, area.width / row.width, area.height / height);
|
||||
let horizontalSpacing = (row.windows.length - 1) * this._columnSpacing;
|
||||
let widthWithoutSpacing = row.width - horizontalSpacing;
|
||||
let additionalHorizontalScale = Math.min(1, (area.width - horizontalSpacing) / widthWithoutSpacing);
|
||||
|
||||
row.x = area.x + (Math.max(area.width - row.width, 0) / 2) * row.additionalScale;
|
||||
row.y = area.y + (y + Math.max(area.height - height, 0) / 2) * row.additionalScale;
|
||||
y += row.height + this._rowSpacing;
|
||||
if (additionalHorizontalScale < additionalVerticalScale) {
|
||||
row.additionalScale = additionalHorizontalScale;
|
||||
// Only consider the scaling in addition to the vertical scaling for centering.
|
||||
compensation += (additionalVerticalScale - additionalHorizontalScale) * row.height;
|
||||
} else {
|
||||
row.additionalScale = additionalVerticalScale;
|
||||
// No compensation when scaling vertically since centering based on a too large
|
||||
// height would undo what vertical scaling is trying to achieve.
|
||||
}
|
||||
|
||||
row.x = area.x + (Math.max(area.width - (widthWithoutSpacing * row.additionalScale + horizontalSpacing), 0) / 2)
|
||||
row.y = area.y + (Math.max(area.height - (heightWithoutSpacing + verticalSpacing), 0) / 2) + y;
|
||||
y += row.height * row.additionalScale + this._rowSpacing;
|
||||
}
|
||||
|
||||
compensation = compensation / 2;
|
||||
|
||||
for (let i = 0; i < rows.length; i++) {
|
||||
let row = rows[i];
|
||||
let x = row.x;
|
||||
@ -953,7 +966,7 @@ const LayoutStrategy = new Lang.Class({
|
||||
let cloneWidth = window.width * s;
|
||||
|
||||
let cloneX = x + (cellWidth - cloneWidth) / 2;
|
||||
let cloneY = row.y + row.height - cellHeight;
|
||||
let cloneY = row.y + row.height * row.additionalScale - cellHeight + compensation;
|
||||
|
||||
slots.push([cloneX, cloneY, s, window]);
|
||||
x += cellWidth + this._columnSpacing;
|
||||
|
@ -97,8 +97,6 @@ const WorkspacesView = new Lang.Class({
|
||||
this._scrolling = false; // swipe-scrolling
|
||||
this._animatingScroll = false; // programatically updating the adjustment
|
||||
|
||||
this._settings = new Gio.Settings({ schema_id: OVERRIDE_SCHEMA });
|
||||
|
||||
let activeWorkspaceIndex = global.screen.get_active_workspace_index();
|
||||
this.scrollAdjustment = new St.Adjustment({ value: activeWorkspaceIndex,
|
||||
lower: 0,
|
||||
@ -418,7 +416,7 @@ const WorkspacesDisplay = new Lang.Class({
|
||||
this.actor.connect('notify::allocation', Lang.bind(this, this._updateWorkspacesActualGeometry));
|
||||
this.actor.connect('parent-set', Lang.bind(this, this._parentSet));
|
||||
|
||||
let clickAction = new Clutter.ClickAction()
|
||||
let clickAction = new Clutter.ClickAction();
|
||||
clickAction.connect('clicked', Lang.bind(this, function(action) {
|
||||
// Only switch to the workspace when there's no application
|
||||
// windows open. The problem is that it's too easy to miss
|
||||
@ -464,6 +462,7 @@ const WorkspacesDisplay = new Lang.Class({
|
||||
|
||||
this._notifyOpacityId = 0;
|
||||
this._scrollEventId = 0;
|
||||
this._keyPressEventId = 0;
|
||||
|
||||
this._fullGeometry = null;
|
||||
},
|
||||
@ -495,6 +494,9 @@ const WorkspacesDisplay = new Lang.Class({
|
||||
Lang.bind(this, this._onRestacked));
|
||||
if (this._scrollEventId == 0)
|
||||
this._scrollEventId = Main.overview.connect('scroll-event', Lang.bind(this, this._onScrollEvent));
|
||||
|
||||
if (this._keyPressEventId == 0)
|
||||
this._keyPressEventId = global.stage.connect('key-press-event', Lang.bind(this, this._onKeyPressEvent));
|
||||
},
|
||||
|
||||
animateFromOverview: function(fadeOnPrimary) {
|
||||
@ -517,7 +519,10 @@ const WorkspacesDisplay = new Lang.Class({
|
||||
Main.overview.disconnect(this._scrollEventId);
|
||||
this._scrollEventId = 0;
|
||||
}
|
||||
|
||||
if (this._keyPressEventId > 0) {
|
||||
global.stage.disconnect(this._keyPressEventId);
|
||||
this._keyPressEventId = 0;
|
||||
}
|
||||
for (let i = 0; i < this._workspacesViews.length; i++)
|
||||
this._workspacesViews[i].destroy();
|
||||
this._workspacesViews = [];
|
||||
@ -670,6 +675,25 @@ const WorkspacesDisplay = new Lang.Class({
|
||||
}
|
||||
Main.wm.actionMoveWorkspace(ws);
|
||||
return Clutter.EVENT_STOP;
|
||||
},
|
||||
|
||||
_onKeyPressEvent: function(actor, event) {
|
||||
if (!this.actor.mapped)
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
let activeWs = global.screen.get_active_workspace();
|
||||
let ws;
|
||||
switch (event.get_key_symbol()) {
|
||||
case Clutter.KEY_Page_Up:
|
||||
ws = activeWs.get_neighbor(Meta.MotionDirection.UP);
|
||||
break;
|
||||
case Clutter.KEY_Page_Down:
|
||||
ws = activeWs.get_neighbor(Meta.MotionDirection.DOWN);
|
||||
break;
|
||||
default:
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
}
|
||||
Main.wm.actionMoveWorkspace(ws);
|
||||
return Clutter.EVENT_STOP;
|
||||
}
|
||||
});
|
||||
Signals.addSignalMethods(WorkspacesDisplay.prototype);
|
||||
|
@ -7,6 +7,7 @@ be
|
||||
bg
|
||||
bn
|
||||
bn_IN
|
||||
bs
|
||||
ca
|
||||
ca@valencia
|
||||
cs
|
||||
|
@ -30,6 +30,7 @@ js/ui/endSessionDialog.js
|
||||
js/ui/extensionDownloader.js
|
||||
js/ui/extensionSystem.js
|
||||
js/ui/keyboard.js
|
||||
js/ui/legacyTray.js
|
||||
js/ui/lookingGlass.js
|
||||
js/ui/main.js
|
||||
js/ui/messageTray.js
|
||||
|
@ -1,2 +1,4 @@
|
||||
data/org.gnome.shell.evolution.calendar.gschema.xml.in
|
||||
src/calendar-server/evolution-calendar.desktop.in
|
||||
# Meh, autofools :-(
|
||||
sub/src/calendar-server/evolution-calendar.desktop.in
|
||||
|
1169
po/pt_BR.po
1169
po/pt_BR.po
File diff suppressed because it is too large
Load Diff
972
po/sr@latin.po
972
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