Compare commits
1380 Commits
Author | SHA1 | Date | |
---|---|---|---|
6dd973be12 | |||
98be314e64 | |||
c0ef30d416 | |||
fd103ff703 | |||
49c144a64c | |||
2c2479581a | |||
f15650e060 | |||
78d58deb5a | |||
f4237a4ae7 | |||
40616015e5 | |||
43ec5280b4 | |||
5f8a511483 | |||
f036786d4a | |||
bf2a824fd1 | |||
d439456048 | |||
4543ca1620 | |||
7da5a76aaa | |||
0b02f757f8 | |||
1939e22c22 | |||
8143f734f8 | |||
156032a7ec | |||
5c37facc08 | |||
59fc26f821 | |||
9822c4c1d6 | |||
1510640067 | |||
15f0e05db4 | |||
e2ecae466b | |||
f453b3780f | |||
b5f5a594ba | |||
6321bbb773 | |||
3eb80dc6c0 | |||
023b50e7a7 | |||
9a7dbfba99 | |||
a7021f993d | |||
1ef8722c52 | |||
ce7ff27c0c | |||
de4c0bdca6 | |||
ab0e98dfdd | |||
2ae63691e9 | |||
9ecacdbded | |||
9d01828b5b | |||
7f381dd2fe | |||
fcdb73752e | |||
ec9b2cef7d | |||
18f36b68ee | |||
f88e963edf | |||
6ecbaac0a8 | |||
7015bb2ca9 | |||
703187e996 | |||
d86a4dc43b | |||
f5a28c2f24 | |||
9f0bb526f7 | |||
80151a7d64 | |||
5a414fff44 | |||
2d11b5cea0 | |||
ecddf1fffd | |||
90c55e1977 | |||
8331436ab3 | |||
289f982949 | |||
e914d11a5f | |||
e5ed0ab60f | |||
5ec0ad4e9c | |||
bddc2c0016 | |||
56f4ce37cd | |||
053b8da89c | |||
c9d5677c2f | |||
6ab9c56d05 | |||
e90d6dceab | |||
82435450b9 | |||
389091a05c | |||
d4a76429ae | |||
5068b275fa | |||
de694f47c8 | |||
31959cbb04 | |||
fa14b3b115 | |||
6fc5b0477b | |||
96e14dcbe7 | |||
6914f8fb32 | |||
24a8b12e8b | |||
5b39afc32f | |||
fa60c95639 | |||
f9e632e99b | |||
bb89c04611 | |||
729a17bd2d | |||
9dcffda3df | |||
1e4e33a183 | |||
82013d59ec | |||
d3e95735ec | |||
d8b6f2294a | |||
8af1d195d3 | |||
d82d862547 | |||
9cc143aaee | |||
9912d22901 | |||
62bb4f4db6 | |||
921b2a9c21 | |||
d40af89df6 | |||
29d37d4fd5 | |||
68854f6d0a | |||
7031d021f4 | |||
a02399eea4 | |||
accad67e1f | |||
d9631fe109 | |||
df8d797bc4 | |||
23b3476105 | |||
ddbdfa82f2 | |||
88cd943c3d | |||
e717779651 | |||
f7d6d1db72 | |||
06a758f903 | |||
3b81465d32 | |||
75574fbd6a | |||
fdaa01a00c | |||
d78d754d01 | |||
52f604757c | |||
595065b420 | |||
b4b1caf5a3 | |||
9c3b3320f8 | |||
7d95275076 | |||
e8a2c06e4e | |||
b35dfc8914 | |||
c899453800 | |||
2339351499 | |||
63bd6efae4 | |||
f2a9467f91 | |||
0ad9c51d9b | |||
b2b2f65214 | |||
b5d3c4e165 | |||
5c3de58279 | |||
093b73b616 | |||
5067ac1598 | |||
f794b6c522 | |||
709aa011aa | |||
ebda516aef | |||
7253c9b06a | |||
96c2db6c20 | |||
5dd861dff0 | |||
1532ac3726 | |||
c42f5e2b1e | |||
090063a1cc | |||
9fc6caeffb | |||
79eedd93ab | |||
d903978937 | |||
b8eeac6fcf | |||
5a621c57ef | |||
11e71845d2 | |||
7992d7c9b3 | |||
86995d724e | |||
b0d21c3a37 | |||
6d704cddea | |||
1518a778ed | |||
41c57695a8 | |||
44bb0f6a95 | |||
abe0ff4f62 | |||
4b1ba2c05c | |||
cf010cfd8f | |||
f96b0d43fa | |||
f1ee6c69d7 | |||
7f2101d2a0 | |||
6c472d8889 | |||
6816aea906 | |||
1218e68b93 | |||
b3b30f239d | |||
4fd5eee2c6 | |||
64bbad1bac | |||
8a911cdb5d | |||
2d849759c8 | |||
56c28fbb03 | |||
e39f4ec0d6 | |||
1095489cee | |||
d587ba712c | |||
1be5b67f45 | |||
b03e00dbee | |||
a93b262e8f | |||
e8e51c05d5 | |||
56a6073729 | |||
5723fccf32 | |||
31597c5a41 | |||
5eabb45ff4 | |||
62901cac58 | |||
508e3e518e | |||
c067b07185 | |||
814e9bbe96 | |||
619a69d53c | |||
7b60d36181 | |||
cdc9d2c26f | |||
dff3e4e0b9 | |||
942831f6ee | |||
a9b816ab36 | |||
a432653c87 | |||
c1e478eb53 | |||
5f73693391 | |||
1fd5196818 | |||
679c21b27f | |||
25678747cc | |||
0320a04a8b | |||
fc90833475 | |||
1dd12d2d78 | |||
08ad345f23 | |||
775d77bf6d | |||
737ba1483c | |||
734511a9ae | |||
825f1cc072 | |||
4181035981 | |||
ae0eeb0dca | |||
2aceeac7e0 | |||
3b75881c05 | |||
c987d3d2c9 | |||
26e7962dfe | |||
7f4e914b00 | |||
6878ee99d9 | |||
865a1cf587 | |||
96a49770a4 | |||
c67eabaf62 | |||
6c9a7ce84e | |||
033277b68f | |||
2582d16ca7 | |||
9e32ba61fd | |||
6a2af25d48 | |||
a593e4587b | |||
76c4b0a960 | |||
5202181a4d | |||
c64a38f7da | |||
6b71b79d28 | |||
e845f4105a | |||
d461d02cdc | |||
88b1a5d3a0 | |||
8d6efde091 | |||
3ca77e9fe0 | |||
161926c581 | |||
59a70fbc63 | |||
d220e353e0 | |||
593b4318a3 | |||
f77333e4d7 | |||
b5860d687d | |||
fbf5f98eea | |||
1c7a3ee61b | |||
74bd009c86 | |||
516d19eb39 | |||
330a28742f | |||
90f7dfd783 | |||
69a9c222d0 | |||
b3d74bdb0f | |||
77e0c38d82 | |||
bcec9f35d5 | |||
150252391f | |||
d4541a6f81 | |||
c1eaa8e52d | |||
9d77fa8341 | |||
0a8d81c095 | |||
faa0ddafff | |||
a426295168 | |||
0d0e90ce9a | |||
7991a53189 | |||
4427197343 | |||
4c2fd513f4 | |||
b099e9a69c | |||
5962be3904 | |||
b18735da52 | |||
60e7db7126 | |||
ccaae5d3cc | |||
c1758c4d69 | |||
d815c5dfc0 | |||
b73c96d14c | |||
32fdc22811 | |||
4e57b45142 | |||
1ba014d9db | |||
f33560f014 | |||
b50d7143d1 | |||
28d098394a | |||
755698a756 | |||
2a01606c59 | |||
e2f88d67f7 | |||
358133e82f | |||
526f2c8bcf | |||
79aa404c14 | |||
2339c39ae6 | |||
a782de6e06 | |||
0f8718287a | |||
2b459ff202 | |||
fbc5e3709e | |||
326d5c7fb8 | |||
d1c71fd00d | |||
292ac413c8 | |||
fdf988c04d | |||
a00a186772 | |||
e3330b638a | |||
bdc15d680a | |||
82e20f94f4 | |||
5221744d1d | |||
293d1697fe | |||
9c8a470934 | |||
9c4e875de4 | |||
0e922eee36 | |||
875a1d6159 | |||
e995730a4d | |||
3d209838a1 | |||
69396bbc1f | |||
a0140fb2c7 | |||
d8e7fc403b | |||
3d6fdc8ae2 | |||
47b109d25b | |||
6ed7034a6b | |||
4e07d0b073 | |||
708f65e388 | |||
8783654b38 | |||
4c72244c2e | |||
9e0e7a4067 | |||
a256a35779 | |||
d5cac6559d | |||
ce262b36d4 | |||
02a72b12bb | |||
7f7d18749e | |||
2e1e00c3de | |||
e2838a7e06 | |||
ad2cb22785 | |||
7ad6bd95f7 | |||
50d37e74a3 | |||
c22287b517 | |||
73cffb3c7f | |||
4bada06917 | |||
31a4705789 | |||
60c00f0472 | |||
e7bf23890b | |||
15d387df5f | |||
e02d6e5285 | |||
19d0169de4 | |||
7a2d4959f2 | |||
6b3c9539f6 | |||
7e7e3ec016 | |||
83fb34608c | |||
a72f0604dc | |||
4dfad536a3 | |||
0dca5e513b | |||
7090592477 | |||
63f2fdd1a4 | |||
e94de67bd2 | |||
817ff52414 | |||
a55599a239 | |||
94114d82ff | |||
7cc88f96c4 | |||
447bf55e45 | |||
9d53a7700a | |||
51145a3d41 | |||
1297315cc2 | |||
b859a7f763 | |||
41baf0fc74 | |||
c324395ee6 | |||
aecd1c126a | |||
9b7304488e | |||
6362b3d057 | |||
0142fae742 | |||
73680e2433 | |||
e38c26894b | |||
28ca96064b | |||
be95a63a03 | |||
2a3a5dfc0b | |||
94a0ae1ec3 | |||
44fb014a0d | |||
8007f4dda3 | |||
ff425d1db7 | |||
9a65f20d91 | |||
0770383f78 | |||
06fdf2fdc8 | |||
7a20683728 | |||
8e443a2aff | |||
fcbb942e24 | |||
1508d76d32 | |||
ef9dee2a05 | |||
2714d8d0ce | |||
243dae14ea | |||
2cce1b9ea0 | |||
89f4e983d6 | |||
f680cf6050 | |||
4cd4678194 | |||
082bc20bb9 | |||
32ea7d763a | |||
44e80f4c46 | |||
cad5e06041 | |||
65d93eacd3 | |||
8369dc6b64 | |||
a0c31478c0 | |||
647c8df12f | |||
6ab045b9ad | |||
2ebac8c186 | |||
06478f242a | |||
6557ae0a2b | |||
adbec80596 | |||
2369ef1296 | |||
ce0ea0434e | |||
ede6ec2a28 | |||
b4b19b551d | |||
dc295927ed | |||
539cbf3593 | |||
b477d215a8 | |||
5de85c708f | |||
ad80cc8950 | |||
bc3a506e68 | |||
92d740ba21 | |||
d65199d2ac | |||
257b99ebd1 | |||
c8be854365 | |||
436b764952 | |||
86063f15ed | |||
716f209537 | |||
7bba7fbf37 | |||
a102c99c07 | |||
5761db5981 | |||
5d33820bd6 | |||
301acc920d | |||
495f9cba72 | |||
726fc1d4f7 | |||
dd6452fe2a | |||
19aa57454b | |||
c9555a3537 | |||
6f473a4f29 | |||
f785f4ad02 | |||
35d0ba4454 | |||
c3428f1efa | |||
9cc1e6b85c | |||
74e1058183 | |||
7c9f76944b | |||
d393ca4f09 | |||
a786f0bcd2 | |||
199bc85bce | |||
d15b46f5cb | |||
c0861b1227 | |||
f97a3522e5 | |||
577e261d1a | |||
33fcff8a1a | |||
cd30572b70 | |||
bc711b6dec | |||
01f5065b87 | |||
9c2bf17ad7 | |||
5385b36a81 | |||
72ed9da1fc | |||
d79924bdd1 | |||
3b7a4b08e2 | |||
09af4433b0 | |||
50df3084f7 | |||
e90734913d | |||
af18a0cf40 | |||
3d399796a6 | |||
60a2794c8b | |||
e039871298 | |||
e057333bf3 | |||
e0c0d9223e | |||
ada21c975f | |||
b4df747464 | |||
9a38011e1e | |||
e0f1fc2694 | |||
da5390340e | |||
3a6b41495a | |||
ce5875f365 | |||
4373d390dc | |||
9ed512e5c5 | |||
c5856196a7 | |||
afc3a8a7e7 | |||
4714c73f0f | |||
742155c384 | |||
2d814bfc5e | |||
8f8e512b37 | |||
3c828c8387 | |||
7c96b39bef | |||
64dbc8aa7f | |||
5649b9c64a | |||
3d0aab3b66 | |||
ce419da6ec | |||
63b49c65ab | |||
ff5bd0b925 | |||
0892220f63 | |||
1c95c9e3ff | |||
4b80cbe1cd | |||
46f3712421 | |||
18aa4ff30c | |||
8a75143a6e | |||
384a6e8684 | |||
a0008f7471 | |||
b53f95a9a0 | |||
1af88e52dd | |||
535028c9a7 | |||
df816368a5 | |||
f34202c3c8 | |||
28c61754a1 | |||
6e46166df4 | |||
15feaa1074 | |||
d7c532daee | |||
427ec6834d | |||
e594b30ead | |||
f43a8a75e4 | |||
645aa01efd | |||
252dce1ec2 | |||
da0066eb84 | |||
adc811ff8f | |||
5117ccdeef | |||
19816523c7 | |||
846e3f8243 | |||
d3c050b88d | |||
f3d1c78c7d | |||
c4f2bb5fe0 | |||
fec511c786 | |||
8a6157c7c1 | |||
d3bb7903e2 | |||
239b67eff6 | |||
0e0caee6ba | |||
62606c68b9 | |||
da831e894c | |||
4b166dcc79 | |||
796fdca5c5 | |||
c6f22826cf | |||
4e491b6f75 | |||
0569bb18f5 | |||
0353ebde5d | |||
b5130c5943 | |||
d54db8ffb3 | |||
0ff5fc8dbb | |||
32ec9959ef | |||
838721fc31 | |||
63e9c98248 | |||
6df30cbb64 | |||
c102a89962 | |||
ff5e39ab79 | |||
607b2efcce | |||
27d010110a | |||
e13602b896 | |||
6777670f0d | |||
b05739fa7e | |||
38854fb06a | |||
b091cfea80 | |||
a8955ffe05 | |||
475fd72ae1 | |||
31675d1812 | |||
cbb0c1c091 | |||
c1234f7793 | |||
1e6c44cb6b | |||
2202b9330f | |||
0b332fc019 | |||
4f4163eb05 | |||
649d360289 | |||
9bcdd9c274 | |||
fbc60199bc | |||
785c813771 | |||
75f8279a19 | |||
5d07832e96 | |||
7395aaf9b4 | |||
2c070d38fb | |||
2c5bc4a1a9 | |||
fa82af251f | |||
e08f2a4a04 | |||
30e17036e8 | |||
c75785efff | |||
3bf89055e3 | |||
a76869216a | |||
a9fd8bfa5e | |||
02a7b0dcfd | |||
dd8c06f2c5 | |||
c63b7f0c3f | |||
a46ea3f8a0 | |||
93071d9167 | |||
2b2e9d4098 | |||
0429aad8bf | |||
2e74920a64 | |||
b5bf82b5db | |||
98cdd44543 | |||
304b68eff9 | |||
18074951b9 | |||
0008ef70e1 | |||
c3cdbd0dac | |||
aefd61c3db | |||
f7752ac699 | |||
d017e6749c | |||
ddfdfaed78 | |||
a870a4d6de | |||
e6e786a19c | |||
01975b61f5 | |||
3c61bef92d | |||
050f2090fb | |||
7746f1a5c4 | |||
97a1cdbe7a | |||
b1dcea7cf1 | |||
9f6f48025d | |||
5e66ac2674 | |||
93c66b3537 | |||
e0d7d28c20 | |||
a82c564a73 | |||
6a40e72329 | |||
3737a9950c | |||
7784bc0905 | |||
49607e1313 | |||
a81f18592a | |||
2ff988ef37 | |||
5136369c18 | |||
7557207b47 | |||
f9d1e2fec0 | |||
f9a03f212c | |||
d200fb1d14 | |||
eb844b095a | |||
dc638c04a6 | |||
b3cbce97ed | |||
14a32c128d | |||
2e332ffd12 | |||
71d9d483f2 | |||
1ef6262139 | |||
da7db509e7 | |||
2a525bd8e8 | |||
51da2bf363 | |||
d2c0ade880 | |||
bcc3eccdab | |||
e581e249ad | |||
c131c44ef6 | |||
cdd23d9cc7 | |||
dc110db4e0 | |||
678670bf1b | |||
07fc15a1eb | |||
83005e27da | |||
56b20ef779 | |||
04adeec8f5 | |||
62d640cd9e | |||
9d7ad6748c | |||
accd24e379 | |||
75d797a0ac | |||
e1e321d3a7 | |||
f14f238150 | |||
ab3200019a | |||
28c028f7ac | |||
08a159d0d8 | |||
26aa32c6cc | |||
09e6bb5d56 | |||
e661d904de | |||
407d51e871 | |||
c4a07fad83 | |||
9ea8fdc1d1 | |||
3d6bf43649 | |||
7bc1d57ad7 | |||
68b671a4f4 | |||
1de1fd44c5 | |||
e5101eb407 | |||
48e0d86340 | |||
c64cf30160 | |||
ff9d777c01 | |||
d8c33deb33 | |||
c03ff0bd4f | |||
d597633d8f | |||
4f6eb49be3 | |||
d23bd4c4a6 | |||
7f12265685 | |||
250023b823 | |||
3b52691ab4 | |||
b6cd548186 | |||
b3fabf11b1 | |||
15be562fdf | |||
599fa0b76c | |||
c520eb4de0 | |||
e33c68a415 | |||
97bd224261 | |||
503e086c56 | |||
7dd6b7f04f | |||
0b05b7a527 | |||
7e5274619a | |||
900957d658 | |||
e006b9b400 | |||
d042dd73aa | |||
347972e45f | |||
7e803fdf23 | |||
ccacb5f6de | |||
5117139add | |||
d5c0514e21 | |||
d81a6bdf41 | |||
2812afed22 | |||
f5bd86fa11 | |||
b625f1692c | |||
36ac1f8902 | |||
bec4b5c127 | |||
78cd8b9f9a | |||
205880e74e | |||
009d021e4f | |||
39a840e2c3 | |||
56d0d7253b | |||
7a29cc47d4 | |||
d769b72c43 | |||
a3439a5230 | |||
9f45161133 | |||
ed99bef458 | |||
c9ad54cd82 | |||
d7e42d5d6e | |||
5b339c8371 | |||
9c6e68f3e7 | |||
70526a8025 | |||
c405081d89 | |||
384e01b368 | |||
f819654ec8 | |||
4670db6629 | |||
6ebabd50c6 | |||
0c22a21a24 | |||
70a0c4211c | |||
a21af541c4 | |||
e07ba91486 | |||
a22e9ce9cd | |||
d4ce51b1b7 | |||
830005069c | |||
8c49267658 | |||
d0bab1f7ac | |||
f00826f3fb | |||
717c0ea19f | |||
3cd8dd0f32 | |||
aedd616346 | |||
b3de3ff00b | |||
b66dff8aed | |||
ff814df03a | |||
c9a528025c | |||
5f3ec8a6f1 | |||
becd29c50a | |||
a029a35050 | |||
d6a78d61d1 | |||
9be46bd212 | |||
4df3afced0 | |||
90f8e1df80 | |||
ea2ac89e61 | |||
695bfb9616 | |||
5dbdde8c15 | |||
854bfc17ed | |||
c8b192bcae | |||
f07306897f | |||
44d731fff5 | |||
52f939f64c | |||
f1d12c18d8 | |||
373ebb50eb | |||
b0b5be63b9 | |||
68f439425b | |||
cae4d92191 | |||
f336295475 | |||
06d0e7d74a | |||
5e0e3edc7b | |||
02a51bfa65 | |||
dbd04df311 | |||
e6adcd99c7 | |||
3171819c36 | |||
e4976b535d | |||
06d1602f17 | |||
603d0dfbc3 | |||
0b6c5b4620 | |||
d7894dbc44 | |||
d25d8126ea | |||
2402d3e115 | |||
ac4284d348 | |||
f9ef80749a | |||
22f0d3076e | |||
127b6dca1c | |||
8cfff33291 | |||
21f534c7f0 | |||
9faa1db942 | |||
2fc9bffb23 | |||
f16eae45a2 | |||
622e73c34c | |||
eb1c3d7045 | |||
fc26895f70 | |||
ca224b379f | |||
42b609b852 | |||
a24169e2aa | |||
144d1dca88 | |||
38ab6ba3ec | |||
bc6a0626c1 | |||
497f4f4a3c | |||
8c8c89a5f1 | |||
d658a5148a | |||
2c3e0dab0f | |||
e2400e35bd | |||
fc4562491b | |||
6e3bedb888 | |||
2b8332df5e | |||
795e7d4b59 | |||
522d46a525 | |||
dcecf5e350 | |||
a61c929450 | |||
5992e9f524 | |||
ee4cd05ebd | |||
af5e65fd79 | |||
284cbf3ea7 | |||
c3e68955e3 | |||
ffa28e7ee7 | |||
78d81f909c | |||
34551bf48b | |||
e02cd53ac5 | |||
b7f5154bd3 | |||
d80247918c | |||
bb8c2d3e13 | |||
6e0e37519d | |||
5c19ae5878 | |||
8713473c64 | |||
a4b4f2f6fd | |||
03f22135b5 | |||
5b79f657eb | |||
4fc0c513af | |||
f5c058a036 | |||
0dac0ad516 | |||
5d4d1e26fd | |||
2f0039e7dd | |||
9202309bed | |||
7e0e224e0e | |||
35825cf0c7 | |||
b2d79b6362 | |||
f5e1dc86cd | |||
8c51f0076f | |||
8347152730 | |||
3d77dd8f51 | |||
82e6935281 | |||
61070e6ec0 | |||
128697d6a7 | |||
424fa01eca | |||
775187b2e4 | |||
99b5e10acf | |||
208ed6e90d | |||
de8d4c4cd8 | |||
3ae591434d | |||
61fb62f969 | |||
c4584c20dc | |||
c6eb95ff3a | |||
ab68360d53 | |||
58a733dc93 | |||
db8f6b4848 | |||
e72d388a67 | |||
b5dd4d1456 | |||
a7562b4148 | |||
358f64d66b | |||
2a7f9f70b8 | |||
c91085caf7 | |||
21ddbf0b8f | |||
2ad2853278 | |||
e16f63a8e4 | |||
c39ffa111f | |||
5182129196 | |||
02bad8e92b | |||
500ea13155 | |||
ce8e7481e7 | |||
528f2e3cdc | |||
408211ba73 | |||
e02467eada | |||
3e93a1bdd6 | |||
a69a9ba51a | |||
1c0e0191e0 | |||
f233122d4d | |||
72bfa91259 | |||
ef195f0185 | |||
47da6b139e | |||
2705434955 | |||
a7e030d0f9 | |||
8a44170f83 | |||
2ea6ae05e5 | |||
5c0eba7d3b | |||
f81887772a | |||
9aa3d864dc | |||
2425b11df6 | |||
1cb644529f | |||
6cff0fd994 | |||
437256e0f1 | |||
841e0132e9 | |||
1545596c7e | |||
38406e070c | |||
9b07ce1d0d | |||
bf8d30603e | |||
bd6e7f14d1 | |||
5226d8b086 | |||
bd92331780 | |||
387f5143f0 | |||
b7867fe44c | |||
ddea54a539 | |||
84da49c715 | |||
513dff45c1 | |||
3d697baa26 | |||
9eda10d091 | |||
0f82da8735 | |||
296b61b61c | |||
974a896dbc | |||
093fd54e2b | |||
5ae3e5aeb7 | |||
af28a219be | |||
1883df2927 | |||
3274f270e3 | |||
c97626e516 | |||
9c483dd9a6 | |||
8fd6e93fbe | |||
8416ba25de | |||
63f6ff9151 | |||
59c2ace98c | |||
cf4465027a | |||
a23b293fe2 | |||
c039a3ddda | |||
ebe071bd50 | |||
2edfd458b7 | |||
3b750aa815 | |||
d96f97e55a | |||
55ac2f46ba | |||
262c04ab91 | |||
c80e7784fb | |||
763567377f | |||
ea9dcbf8b7 | |||
2b383bf73e | |||
b8dcbfebb2 | |||
a257aa35d5 | |||
941513b280 | |||
a9bb0558bc | |||
58834b80d7 | |||
b125a0e371 | |||
980ac0da8a | |||
f15fb0bd73 | |||
7d25592165 | |||
9ee36f2b71 | |||
f3e226103f | |||
a03e5662e2 | |||
16bb3efeb9 | |||
e01d867e69 | |||
1d4dfd7d5f | |||
da05d1d864 | |||
6499424eba | |||
824a602963 | |||
0092d8fff3 | |||
5fbe454836 | |||
23a59d387b | |||
6b2a68e553 | |||
82950ecea0 | |||
2da4df219c | |||
8b5597fd8d | |||
82ae06ad55 | |||
c594b66a2a | |||
13e3318e4d | |||
4aa4bb4a6a | |||
4a74df86e2 | |||
30ebc9c241 | |||
e0f6cf538d | |||
ba71382c72 | |||
87eb0d7e2f | |||
da199242b2 | |||
5e3d378667 | |||
a6d2735373 | |||
2ea435a928 | |||
75ba75900c | |||
7bacf4e344 | |||
258993d8ad | |||
ff19e411a2 | |||
e86c2826ef | |||
64741e41df | |||
fceac27412 | |||
0a394799da | |||
b83f2c0e33 | |||
225f825faf | |||
ed054f4f40 | |||
a1244a9b26 | |||
3a3714f4ff | |||
be483c4137 | |||
3492121c3f | |||
364f1453c1 | |||
9392e50cf1 | |||
f60a6ab465 | |||
f3a92d558d | |||
d387d4a60d | |||
4503ca4ca0 | |||
eeb10c0ce3 | |||
c69fcc2ef8 | |||
7d67d88ae8 | |||
310622b14e | |||
00065b84e1 | |||
4f7a8902f8 | |||
d20a6e0988 | |||
96fa7b7e77 | |||
61e4d40852 | |||
cc826f77fb | |||
1de288c5bb | |||
fe986faa2d | |||
f11b404622 | |||
508668107b | |||
674454621f | |||
2c907bd422 | |||
4eb6c0c4ee | |||
dd2eff2b6f | |||
d8960b396b | |||
4c29604e1e | |||
ede0bf2d88 | |||
893bfdf85f | |||
ac7a4c27fd | |||
4fe0233139 | |||
f9f9c7fe5b | |||
f1b90f174a | |||
3dd74c86c1 | |||
0edbdc529e | |||
b08523b170 | |||
cd2f8d8177 | |||
a1e8c79d38 | |||
34fc454764 | |||
e98a434ede | |||
02cdc065e7 | |||
77eb8f98c0 | |||
68679e1e7e | |||
05f2dbf205 | |||
45779bc7be | |||
1bf27b1f18 | |||
3ecdfaffd2 | |||
ee8fd1e613 | |||
ccfd5e35d6 | |||
b2eab65a81 | |||
00814dd159 | |||
57f9ffcaa7 | |||
ce83f378a5 | |||
30c7545ff3 | |||
a13357c2a8 | |||
75dc5c16c8 | |||
acd5d70209 | |||
669d20bcf0 | |||
793a8005a5 | |||
23b81fb241 | |||
73ba9d33eb | |||
75e2a7228c | |||
91d70f2487 | |||
779b1ae8e5 | |||
346ffd14d7 | |||
558b51f555 | |||
ef18b7ea25 | |||
0044e225aa | |||
c25c143b24 | |||
b87da87252 | |||
f9258bb5e3 | |||
3d747b00e6 | |||
450345b4d0 | |||
7563e1ebcd | |||
f96cc4dd69 | |||
c65a9c4d2e | |||
c01bd37edc | |||
021cecbce2 | |||
2a0cb7ff05 | |||
0085a94706 | |||
5db38194dc | |||
2a26143149 | |||
62f22557aa | |||
516ea5a02e | |||
9154471aba | |||
fbf6746acf | |||
a36686a6aa | |||
fd837d74d1 | |||
fd57334395 | |||
85100cb65f | |||
c70f6278d6 | |||
e573441bac | |||
5ed9571b37 | |||
9d203ddc0f | |||
508a13ae72 | |||
c0b50cbdf2 | |||
06f78549bd | |||
67afd7a6d8 | |||
ffa8c2f2b1 | |||
3803a880e8 | |||
965aedb0bb | |||
80911535a7 | |||
ca401d5036 | |||
a1c091d98d | |||
e1e08f0a68 | |||
1a4f629554 | |||
4113be770b | |||
cf3f4850b8 | |||
14f374096a | |||
6fef5c37f7 | |||
6e7455aa1e | |||
03bf6fa399 | |||
f777e761c0 | |||
31201d9618 | |||
d95d78ac15 | |||
bef4f17c49 | |||
f4b7ab0cb6 | |||
a180dde01c | |||
385c918e2e | |||
d7401c8646 | |||
a456d5eb19 | |||
6c08799c7b | |||
8d7bb6496c | |||
f0496a2d3c | |||
6664553b7e | |||
2a950ca3b3 | |||
463cd6382c | |||
78db025b10 | |||
f3265c28a9 | |||
a6e5e459d3 | |||
9ba399bf18 | |||
a52c91e9e5 | |||
9a7b47c23f | |||
18f7d20006 | |||
3f0ee88657 | |||
c634718dfa | |||
df6b31de05 | |||
b8e29ae8c7 | |||
cdba8e5cea | |||
4fccdaafb7 | |||
df0b465e76 | |||
aacdd4fd5e | |||
5f68c3a324 | |||
8ceae3b054 | |||
3fc5afaff1 | |||
8b7464c648 | |||
3e602b1765 | |||
5858028411 | |||
2c682ace81 | |||
45f3106814 | |||
aa947f9948 | |||
0c72d1fcbd | |||
6d22670307 | |||
0b9e68e305 | |||
da8155cbe5 | |||
5b7a052e18 | |||
6f26e39082 | |||
489b96a310 | |||
e65d90d624 | |||
9c74e22313 | |||
48a1fce151 | |||
83e7f6f496 | |||
3c5c3a6597 | |||
1c3ea1649f | |||
48a54e8ac4 | |||
113a854048 | |||
882f5fa79e | |||
9acdb8012c | |||
731d64e0e4 | |||
ccf1bd9f27 | |||
c164a8fe03 | |||
1a39666f7c | |||
f2731d4d6a | |||
3e63fb7abe | |||
8b4249ef26 | |||
bf0be6ef12 | |||
294702d3f1 | |||
58f3b7c748 | |||
e25502aeb2 | |||
ffe4eaf00d | |||
2f88a7a1e1 | |||
cd7d564125 | |||
ede81017ec | |||
a539e6236a | |||
90b7710834 | |||
f8cc8f1dc1 | |||
f8e5e3e435 | |||
508e751ffd | |||
207c847762 | |||
3c980566d3 | |||
50b59e0ca6 | |||
14c52bb00a | |||
9720b32987 | |||
674ae262c8 | |||
db297e7fdb | |||
d57c146514 | |||
ec5a4328e3 | |||
e4ee72c481 | |||
31f1e9ff0a | |||
d6c049a8c9 | |||
44047ac881 | |||
464d5d8a13 | |||
29811a85dc | |||
36ee4e6c3b | |||
2036e4c85c | |||
f24034de84 | |||
522ff86081 | |||
669e3c8ed9 | |||
ce850f464c | |||
03eaa61cef | |||
e10e953d24 | |||
2b47bb3d82 | |||
73d819116c | |||
c8dd984663 | |||
6087eb6d0e | |||
97b43d1d36 | |||
57ebadbaf8 | |||
cad7bb1151 | |||
9a376d47c5 | |||
b79adc05f4 | |||
f765c5e319 | |||
edc445c0c9 | |||
ab6b0f3f7f | |||
5e7902e733 | |||
f9f821aa55 | |||
9ed4b2a5ae | |||
0130ced790 | |||
8dab07af82 | |||
f6cd3fa5ed | |||
faae1a028e | |||
f5e32184fe | |||
18c7138237 | |||
3f0fbae7e2 | |||
7f1a258ff9 | |||
35b38d5cb2 | |||
09e8a437d4 | |||
d2bedcc182 | |||
84eda6e459 | |||
f5e7530fc7 | |||
f983b34784 | |||
36bbe64898 | |||
627a393ed6 | |||
a025b151ef | |||
18b6f13395 | |||
051413550f | |||
3e10574736 | |||
9a3041004b | |||
87f71b8ce1 | |||
825146f1e3 | |||
52995416fd | |||
6c43d0247a | |||
9aa98d9f0c | |||
c3a29d6df1 | |||
82f84416a9 | |||
9dd3162dbe | |||
7ef519756a | |||
3bbe74d1c1 | |||
409f6718b8 | |||
9c0e179080 | |||
b3b278d41f | |||
0f466dbafb | |||
fbb4a9a3a6 | |||
8ddae5cd71 | |||
b0915c7b60 | |||
831bb4e334 | |||
4e025506fa | |||
abccf451bf | |||
14954117c0 | |||
629f408fe5 | |||
86c6ab3c01 | |||
4a6ff94701 | |||
e480b08d58 | |||
caf53861d1 | |||
d0480648ba | |||
eb8cfe799f | |||
b9f2541880 | |||
bde9b08bfe | |||
8a4c862633 | |||
785c90f4b8 | |||
dd6a11e4c7 | |||
64e9503adb | |||
36c885bf34 | |||
ad7cde805d | |||
2c2c67f4dc | |||
cc4f8dfab0 | |||
0fb13608c5 | |||
09dbe17da0 | |||
fdd347c9aa | |||
572095515b | |||
f2d4aa0822 | |||
030a22d795 | |||
c70afcdb44 | |||
526d6c03b8 | |||
261b55300d | |||
e13bfd9a17 | |||
e096d18bac | |||
9460f0e4f3 | |||
e6591f52ac | |||
07e3d1fd5c | |||
1fbc6b24c8 | |||
982777be94 | |||
6610a34ad0 | |||
bfa8a0441a | |||
7723622ec7 | |||
6bcc8c70ef | |||
d114d5f95a | |||
b5c734da42 | |||
2077bb94c1 | |||
65a4ee7fb4 | |||
debf293298 | |||
a0df3e7d1e | |||
0d67c2d164 | |||
682bd7b622 | |||
fa0e54edbb | |||
5a0b209663 | |||
7e8859fd0e | |||
444fa2e0ab | |||
a31455b921 | |||
ac0213a516 | |||
45a6e2c305 | |||
11cbd396c0 | |||
a343445cd2 | |||
be3d62487c | |||
58905bd01a | |||
08506eac2d | |||
02c6b0374d | |||
0722c06275 | |||
17a4044d97 | |||
27a7194634 | |||
d73f560bcc | |||
e92f43b83e | |||
fed79ce4e6 | |||
fc45cf03bf | |||
efde11a0f3 | |||
fb951ff9b5 | |||
f5865e895e | |||
b8c2d4c6c7 | |||
778ad49ab4 | |||
fe7dd1305f | |||
378a3df5ea | |||
e63b81d69c | |||
c2fa2cdd8a | |||
6f215427f8 | |||
67ed4e0570 | |||
8a15178557 | |||
f3ecfab378 | |||
804563d5b2 | |||
c3e5d983b9 | |||
d21edcfed5 | |||
9b69a45eee | |||
7424ee755a | |||
ff664fd1d8 | |||
fd3f03580d | |||
a09150846a | |||
f2a9c55637 | |||
eaa3f83e46 | |||
e786cc1454 | |||
cd0c632fcb | |||
d5f248cb82 | |||
6a800abe06 | |||
fe265554a7 | |||
7305466765 | |||
9ac55a98f1 | |||
a1149fb6ad | |||
dfc4cc4aaf | |||
ef7541291b | |||
248a3e6b7e | |||
6b1e381750 | |||
feaf6108f9 | |||
9ad104585d | |||
7c44af3616 | |||
0599bf41b0 | |||
eac303f84c | |||
7bdd1c625c | |||
0003760fd9 | |||
eafb8c8e38 | |||
60c8105559 | |||
54626c6f7e | |||
cca528a630 | |||
530193a3a2 | |||
52e3149040 | |||
ad297ea9dc | |||
2015fc97dc | |||
35889a0f7d | |||
dcd84a4b53 | |||
01374989b1 | |||
f300462003 | |||
1e4da1b99c | |||
e1de6cb98d | |||
59a18c4ead | |||
b881e4b62a | |||
7060ae077b | |||
a7b0910566 | |||
60706f72d4 | |||
2e77f6b34b | |||
50d5030949 | |||
03dbb0f931 | |||
249619fabd | |||
60d1f7797c | |||
dc4b8c876e | |||
1724723e63 | |||
02455b1e28 | |||
47a9b97f8b | |||
0aa29daa72 | |||
182b1c1941 | |||
bbc8010de3 | |||
15baa56584 | |||
a72683707f | |||
f4baa4ddf8 | |||
f9eb36434f | |||
bc5e16bcea | |||
86e04048ff | |||
d7c0ff5e89 | |||
51e1efa277 | |||
67f636cc68 | |||
fcdfebd0e7 | |||
069ec3b910 | |||
1092f55b54 | |||
8a8abf12f9 | |||
f044e29526 | |||
4f703019ca | |||
0e6baec350 | |||
08690d658f | |||
674325e96c | |||
f8aa486ad1 | |||
be78f0f36a | |||
9917f05be8 | |||
d23228522c | |||
8c9896561e | |||
23cdb2125e | |||
43fc598bd5 | |||
2105d2f952 |
28
.gitignore
vendored
@ -6,21 +6,10 @@
|
|||||||
ABOUT-NLS
|
ABOUT-NLS
|
||||||
ChangeLog
|
ChangeLog
|
||||||
INSTALL
|
INSTALL
|
||||||
Makefile
|
|
||||||
Makefile.in
|
|
||||||
aclocal.m4
|
aclocal.m4
|
||||||
autom4te.cache
|
autom4te.cache
|
||||||
config.h
|
data/org.gnome.Shell.desktop
|
||||||
config.h.in
|
data/org.gnome.Shell.desktop.in
|
||||||
config.log
|
|
||||||
config.status
|
|
||||||
config
|
|
||||||
configure
|
|
||||||
data/50-gnome-shell-*.xml
|
|
||||||
data/gnome-shell.desktop
|
|
||||||
data/gnome-shell.desktop.in
|
|
||||||
data/gnome-shell-wayland.desktop
|
|
||||||
data/gnome-shell-wayland.desktop.in
|
|
||||||
data/gnome-shell-extension-prefs.desktop
|
data/gnome-shell-extension-prefs.desktop
|
||||||
data/gnome-shell-extension-prefs.desktop.in
|
data/gnome-shell-extension-prefs.desktop.in
|
||||||
data/gnome-shell-theme.gresource
|
data/gnome-shell-theme.gresource
|
||||||
@ -28,8 +17,6 @@ data/gschemas.compiled
|
|||||||
data/perf-background.xml
|
data/perf-background.xml
|
||||||
data/org.gnome.shell.gschema.xml
|
data/org.gnome.shell.gschema.xml
|
||||||
data/org.gnome.shell.gschema.valid
|
data/org.gnome.shell.gschema.valid
|
||||||
data/org.gnome.shell.evolution.calendar.gschema.xml
|
|
||||||
data/org.gnome.shell.evolution.calendar.gschema.valid
|
|
||||||
data/org.gnome.Shell.PortalHelper.desktop
|
data/org.gnome.Shell.PortalHelper.desktop
|
||||||
data/org.gnome.Shell.PortalHelper.service
|
data/org.gnome.Shell.PortalHelper.service
|
||||||
data/theme/.sass-cache
|
data/theme/.sass-cache
|
||||||
@ -46,15 +33,9 @@ docs/reference/*/*.types
|
|||||||
docs/reference/*/html/
|
docs/reference/*/html/
|
||||||
docs/reference/*/xml/
|
docs/reference/*/xml/
|
||||||
docs/reference/shell/doc-gen-*
|
docs/reference/shell/doc-gen-*
|
||||||
gtk-doc.make
|
|
||||||
js/misc/config.js
|
js/misc/config.js
|
||||||
js/js-resources.c
|
js/js-resources.c
|
||||||
js/js-resources.h
|
js/js-resources.h
|
||||||
intltool-extract.in
|
|
||||||
intltool-merge.in
|
|
||||||
intltool-update.in
|
|
||||||
libtool
|
|
||||||
m4/
|
|
||||||
man/gnome-shell.1
|
man/gnome-shell.1
|
||||||
omf.make
|
omf.make
|
||||||
po/*.gmo
|
po/*.gmo
|
||||||
@ -63,7 +44,6 @@ po/*.header
|
|||||||
po/*.sed
|
po/*.sed
|
||||||
po/*.sin
|
po/*.sin
|
||||||
po/.intltool-merge-cache
|
po/.intltool-merge-cache
|
||||||
po/Makefile.in.in
|
|
||||||
po/Makevars.template
|
po/Makevars.template
|
||||||
po/POTFILES
|
po/POTFILES
|
||||||
po/Rules-quot
|
po/Rules-quot
|
||||||
@ -73,10 +53,7 @@ src/*.gir
|
|||||||
src/*.typelib
|
src/*.typelib
|
||||||
src/*-enum-types.[ch]
|
src/*-enum-types.[ch]
|
||||||
src/*-marshal.[ch]
|
src/*-marshal.[ch]
|
||||||
src/Makefile
|
|
||||||
src/Makefile.in
|
|
||||||
src/calendar-server/evolution-calendar.desktop
|
src/calendar-server/evolution-calendar.desktop
|
||||||
src/calendar-server/evolution-calendar.desktop.in
|
|
||||||
src/calendar-server/org.gnome.Shell.CalendarServer.service
|
src/calendar-server/org.gnome.Shell.CalendarServer.service
|
||||||
src/gnome-shell
|
src/gnome-shell
|
||||||
src/gnome-shell-calendar-server
|
src/gnome-shell-calendar-server
|
||||||
@ -99,7 +76,6 @@ src/st-scroll-view-fade-generated.c
|
|||||||
src/stamp-st-scroll-view-fade-generated.c
|
src/stamp-st-scroll-view-fade-generated.c
|
||||||
stamp-h1
|
stamp-h1
|
||||||
tests/run-test.sh
|
tests/run-test.sh
|
||||||
xmldocs.make
|
|
||||||
*~
|
*~
|
||||||
*.patch
|
*.patch
|
||||||
*.sw?
|
*.sw?
|
||||||
|
8
.gitmodules
vendored
@ -1,6 +1,6 @@
|
|||||||
[submodule "src/gvc"]
|
|
||||||
path = src/gvc
|
|
||||||
url = git://git.gnome.org/libgnome-volume-control
|
|
||||||
[submodule "data/theme/gnome-shell-sass"]
|
[submodule "data/theme/gnome-shell-sass"]
|
||||||
path = data/theme/gnome-shell-sass
|
path = data/theme/gnome-shell-sass
|
||||||
url = git://git.gnome.org/gnome-shell-sass
|
url = https://git.gnome.org/browse/gnome-shell-sass
|
||||||
|
[submodule "subprojects/gvc"]
|
||||||
|
path = subprojects/gvc
|
||||||
|
url = https://git.gnome.org/browse/libgnome-volume-control
|
||||||
|
12
HACKING
@ -132,7 +132,7 @@ There are many approaches to classes in JavaScript. We use our own class framewo
|
|||||||
(sigh), which is built in gjs. The advantage is that it supports inheriting from
|
(sigh), which is built in gjs. The advantage is that it supports inheriting from
|
||||||
GObjects, although this feature isn't used very often in the Shell itself.
|
GObjects, although this feature isn't used very often in the Shell itself.
|
||||||
|
|
||||||
const IconLabelMenuItem = new Lang.Class({
|
var IconLabelMenuItem = new Lang.Class({
|
||||||
Name: 'IconLabelMenuItem',
|
Name: 'IconLabelMenuItem',
|
||||||
Extends: PopupMenu.PopupMenuBaseItem,
|
Extends: PopupMenu.PopupMenuBaseItem,
|
||||||
|
|
||||||
@ -169,7 +169,7 @@ GObject Introspection is a powerful feature that allows us to have native
|
|||||||
bindings for almost any library built around GObject. If a library requires
|
bindings for almost any library built around GObject. If a library requires
|
||||||
you to inherit from a type to use it, you can do so:
|
you to inherit from a type to use it, you can do so:
|
||||||
|
|
||||||
const MyClutterActor = new Lang.Class({
|
var MyClutterActor = new Lang.Class({
|
||||||
Name: 'MyClutterActor',
|
Name: 'MyClutterActor',
|
||||||
Extends: Clutter.Actor,
|
Extends: Clutter.Actor,
|
||||||
|
|
||||||
@ -215,7 +215,7 @@ that has a property called `actor`. We call this wrapper class the "delegate".
|
|||||||
We sometimes use expando properties to set a property called `_delegate` on
|
We sometimes use expando properties to set a property called `_delegate` on
|
||||||
the actor itself:
|
the actor itself:
|
||||||
|
|
||||||
const MyClass = new Lang.Class({
|
var MyClass = new Lang.Class({
|
||||||
Name: 'MyClass',
|
Name: 'MyClass',
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
@ -264,7 +264,7 @@ prototype:
|
|||||||
const Lang = imports.lang;
|
const Lang = imports.lang;
|
||||||
const FnorbLib = imports.fborbLib;
|
const FnorbLib = imports.fborbLib;
|
||||||
|
|
||||||
const MyClass = new Lang.Class({
|
var MyClass = new Lang.Class({
|
||||||
_init: function() {
|
_init: function() {
|
||||||
let fnorb = new FnorbLib.Fnorb();
|
let fnorb = new FnorbLib.Fnorb();
|
||||||
fnorb.connect('frobate', Lang.bind(this, this._onFnorbFrobate));
|
fnorb.connect('frobate', Lang.bind(this, this._onFnorbFrobate));
|
||||||
@ -304,9 +304,9 @@ designed around setting properties, like Tweener. If you want to animate an
|
|||||||
arbitrary property, create a getter and setter, and use Tweener to animate the
|
arbitrary property, create a getter and setter, and use Tweener to animate the
|
||||||
property.
|
property.
|
||||||
|
|
||||||
const ANIMATION_TIME = 2000;
|
var ANIMATION_TIME = 2000;
|
||||||
|
|
||||||
const MyClass = new Lang.Class({
|
var MyClass = new Lang.Class({
|
||||||
Name: 'MyClass',
|
Name: 'MyClass',
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
|
33
Makefile.am
@ -1,33 +0,0 @@
|
|||||||
# Point to our macro directory and pick up user flags from the environment
|
|
||||||
ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS}
|
|
||||||
|
|
||||||
SUBDIRS = data js src tests po docs
|
|
||||||
|
|
||||||
if BUILD_BROWSER_PLUGIN
|
|
||||||
SUBDIRS += browser-plugin
|
|
||||||
endif
|
|
||||||
|
|
||||||
if ENABLE_MAN
|
|
||||||
SUBDIRS += man
|
|
||||||
endif
|
|
||||||
|
|
||||||
EXTRA_DIST = \
|
|
||||||
.project \
|
|
||||||
.settings \
|
|
||||||
autogen.sh \
|
|
||||||
tools/check-for-missing.py
|
|
||||||
|
|
||||||
# These are files checked into Git that we don't want to distribute
|
|
||||||
DIST_EXCLUDE = \
|
|
||||||
.gitignore \
|
|
||||||
.gitmodules \
|
|
||||||
gnome-shell.doap \
|
|
||||||
HACKING \
|
|
||||||
MAINTAINERS \
|
|
||||||
tools/build/*
|
|
||||||
|
|
||||||
distcheck-hook:
|
|
||||||
@echo "Checking disted files against files in git"
|
|
||||||
@$(srcdir)/tools/check-for-missing.py $(srcdir) $(distdir) $(DIST_EXCLUDE)
|
|
||||||
|
|
||||||
DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc --enable-man
|
|
761
NEWS
@ -1,3 +1,764 @@
|
|||||||
|
3.26.2
|
||||||
|
======
|
||||||
|
* Dump javascript stack on aborts, traps and segfaults [Marco; #789237]
|
||||||
|
* Misc. bug fixes [Jonas, Florian, Alessandro; #788607, #789018, #789231,
|
||||||
|
#788542, #789103]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Jonas Ådahl, Alessandro Bono, Florian Müllner, Marco Trevisan (Treviño)
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Xavi Ivars [ca@valencia], Fabio Tomat [fur], Matej Urbančič [sl],
|
||||||
|
Hannie Dumoleyn [nl]
|
||||||
|
|
||||||
|
3.26.1
|
||||||
|
======
|
||||||
|
* Don't detach launched apps to not break pkexec and friends [Florian; #763531]
|
||||||
|
* Allow search providers to not autostart [Bastien, Florian; #785380, #787986]
|
||||||
|
* Fix crash when tray icons are hidden/shown in quick succession [Ray; #787361]
|
||||||
|
* Make window group switcher more consistent [Didier; #786009]
|
||||||
|
* Improve legibility of the top bar when translucent [Jakub; #787940]
|
||||||
|
* Don't crash when running outside a logind session [Florian; #788046]
|
||||||
|
* Allow to run headless [Mario, Jonas; #730551]
|
||||||
|
* Update calendar on timezone changes [Martin; #678507]
|
||||||
|
* Improve keyboard navigation of window previews [Florian; #786546]
|
||||||
|
* Run unit tests on `meson test` [Florian; #786497]
|
||||||
|
* Misc. bug fixes [Florian, Marc-Antoine, Mario, Jakub, Krzesimir; #787423,
|
||||||
|
#766368, #787580, #787907, #787901, #788039, #788003, #786343, #787902,
|
||||||
|
#788265, #788339, #787905, #788282, #787676]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Martin Andersson, Florian Müllner, Bastien Nocera, Krzesimir Nowak,
|
||||||
|
Marc-Antoine Perennou, Didier Roche, Mario Sanchez Prada, Jakub Steiner,
|
||||||
|
Ray Strode
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Efstathios Iosifidis [el], Khaled Hosny [ar], Stas Solovey [ru],
|
||||||
|
Arash Mousavi [fa], Sveinn í Felli [is], Athul R T [ml],
|
||||||
|
Cheng-Chia Tseng [zh_TW], Anders Jonsson [sv]
|
||||||
|
|
||||||
|
3.26.0
|
||||||
|
======
|
||||||
|
* Misc. bug fixes [Ray, Michael, Jonas; #786332] #786783, #786886, #786868]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Jonas Ådahl, Michael Catanzaro, Sebastian Keller, Ray Strode
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Daniel Mustieles [es], Fran Dieguez [gl], Baurzhan Muftakhidinov [kk],
|
||||||
|
Marek Cernocky [cs], Andika Triwidada [id], Aurimas Černius [lt],
|
||||||
|
Piotr Drąg [pl], Trần Ngọc Quân [vi], Jordi Mas [ca], Fabio Tomat [fur],
|
||||||
|
gogo [hr], Dušan Kazik [sk], Piotr Drąg [ne], Emin Tufan Çetin [tr],
|
||||||
|
Ask Hjorth Larsen [da], Cheng-Chia Tseng [zh_TW], Rūdolfs Mazurs [lv],
|
||||||
|
Balázs Meskó [hu], Matej Urbančič [sl], Jiri Grönroos [fi],
|
||||||
|
Милош Поповић [sr], Милош Поповић [sr@latin], Rafael Fontenelle [pt_BR],
|
||||||
|
Wolfgang Stöggl [de], Milo Casagrande [it], hanniedu [nl],
|
||||||
|
Yuras Shumovich [be], Changwoo Ryu [ko], Alain Lojewski [fr],
|
||||||
|
Alexander Shopov [bg], Daniel Korostil [uk], Kris Thomsen [da],
|
||||||
|
A S Alam [pa], Sebastian Rasmussen [sv], Inaki Larranaga Murgoitio [eu],
|
||||||
|
Jiro Matsuzawa [ja]
|
||||||
|
|
||||||
|
3.25.91
|
||||||
|
=======
|
||||||
|
* Open context menu of highlighted search result on Shift+F10 [Florian; #675315]
|
||||||
|
* Fix mid-sentence capitalization in weather forecasts [Florian; #779873]
|
||||||
|
* Add switcher popup to cycle through monitor configurations [Rui; #783550]
|
||||||
|
* Offer system actions in search [Rares; #691900]
|
||||||
|
* Misc. bug fixes [Mario, Florian, Rui; #777519, #786120, #786145, #786419,
|
||||||
|
#786526, #786520, #786520, #786146]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Emmanuele Bassi, Marek Cernocky, Piotr Drąg, Carlos Garnacho, Rui Matos,
|
||||||
|
Florian Müllner, Mario Sanchez Prada, Rares Visalom
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Marek Cernocky [cs], Piotr Drąg [pl], Muhammet Kara [tr],
|
||||||
|
Мирослав Николић [sr, sr@latin], Kukuh Syafaat [id],
|
||||||
|
Baurzhan Muftakhidinov [kk], Aurimas Černius [lt], Fran Dieguez [gl],
|
||||||
|
gogo [hr], Jordi Mas [ca]
|
||||||
|
|
||||||
|
3.25.90
|
||||||
|
=======
|
||||||
|
* Add permission dialog for inhibiting shortucts [Florian; #783342]
|
||||||
|
* Improve window picker layout [Florian, Jakub; #783953]
|
||||||
|
* Remove legacy status icon tray [Florian; #785956]
|
||||||
|
* Drop autotools support [Florian; #785153]
|
||||||
|
* Misc. bug fixes [Florian, Carlos, Cosimo; #785090, #785309, #767805,
|
||||||
|
#747794, #785358, #785556]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Emmanuele Bassi, Cosimo Cecchi, Carlos Garnacho, Florian Müllner,
|
||||||
|
Jakub Steiner
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Fabio Tomat [fur], Pawan Chitrakar [ne], Aurimas Černius [lt], gogo [hr],
|
||||||
|
Daniel Mustieles [es], Baurzhan Muftakhidinov [kk], Matej Urbančič [sl],
|
||||||
|
Marek Cernocky [cs], Dušan Kazik [sk], Jordi Mas [ca], Fran Dieguez [gl],
|
||||||
|
Andika Triwidada [id], Anders Jonsson [sv], Balázs Meskó [hu]
|
||||||
|
|
||||||
|
3.25.4
|
||||||
|
======
|
||||||
|
* gdm: Fix "Not listed" focus indication [Florian; #784040]
|
||||||
|
* Fix missing icons in freedesktop notifications [Florian; #784245]
|
||||||
|
* gdm: Disable user list when empty [Xiaoguang; #731320]
|
||||||
|
* gdm: Allow empty reponse to PAM messages [Ray; #784360]
|
||||||
|
* Fix blocked clicks in shutdown dialog [Florian; #781738]
|
||||||
|
* Show OSD popup when changing volume via scroll wheel [Florian; #781028]
|
||||||
|
* Refine list search results [Rares; #749957]
|
||||||
|
* Replace mutter's unresponsive app dialog [Carlos; #762083]
|
||||||
|
* Improve handling of extension errors [Florian; #781728]
|
||||||
|
* Implement tablet rings/strips configuration [Carlos; #782033]
|
||||||
|
* Adjust to mozjs52 update in gjs [Florian; #785084, #785090]
|
||||||
|
* Support the meson build system [Florian; #783229]
|
||||||
|
* Misc. bug fixes [Ray, Florian, Jonas, Marco, Shih-Yuan, Joaquim, Carlos S.;
|
||||||
|
#780403, #772589, #784130, #783975, #784353, #784361, #772284, #765011,
|
||||||
|
#765011, #765011, #784985, #781471, #785047, #736148, #736148]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Jonas Ådahl, Alessandro Bono, Michael Catanzaro, Carlos Garnacho,
|
||||||
|
Shih-Yuan Lee (FourDollars), Florian Müllner, Joaquim Rocha,
|
||||||
|
Mario Sanchez Prada, Carlos Soriano, Ray Strode, Marco Trevisan (Treviño),
|
||||||
|
Rares Visalom, Xiaoguang Wang
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Jeremy Bicha po/es, he.po, Kukuh Syafaat [id], Fabio Tomat [fur]
|
||||||
|
|
||||||
|
3.25.3
|
||||||
|
======
|
||||||
|
* Bypass proxies for captive portal [Bastien; #769692]
|
||||||
|
* Correctly handle "text-shadow: none;" [Matt; #783485]
|
||||||
|
* Add StEntry:hint-actor property [Mario; #783484]
|
||||||
|
* Support text-shadow CSS property in StEntry [Mario; #783484]
|
||||||
|
* Misc. bug fixes [Jonas, Florian, Bastien, Ting-Wei, Cosimo, Mario, Sebastian;
|
||||||
|
#777732, #783202, #783210, #783206, #783286, #783439, #783483, #783823,
|
||||||
|
#781950]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Jonas Ådahl, Cosimo Cecchi, Sebastian Keller, Ting-Wei Lan, Florian Müllner,
|
||||||
|
Bastien Nocera, Mario Sanchez Prada, Matt Watson
|
||||||
|
|
||||||
|
3.25.2
|
||||||
|
======
|
||||||
|
* Fix StEntry::primary-icon-clicked emission [Florian; #782190]
|
||||||
|
* Add an optional icon parameter to PopupMenu.addAction() [Mario; #782166]
|
||||||
|
* Allow search providers to include clipboard text with results [Daiki; #775099]
|
||||||
|
* Reduce dependency on Caribou [Carlos; #777342]
|
||||||
|
* Add transparency to top bar when free floating [Alessandro; #747163]
|
||||||
|
* Animate maximize/unmaximize operations [Alessandro; #766685]
|
||||||
|
* Misc. bug fixes [Florian, Matthias, Jeremy, Michael, Carlos, Lan; #782000,
|
||||||
|
#780215, #782802, #782637, #782930, #755164, #780215, #782982]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Jeremy Bicha, Michael Biebl, Alessandro Bono, Carlos Garnacho, Ting-Wei Lan,
|
||||||
|
Matthias Liertzer, Florian Müllner, Mario Sanchez Prada, Daiki Ueno
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Jordi Mas [ca], Christian Stadelmann [de], Милош Поповић [sr],
|
||||||
|
Милош Поповић [sr@latin], Furkan Ahmet Kara [tr]
|
||||||
|
|
||||||
|
3.25.1
|
||||||
|
======
|
||||||
|
* Close Wifi selection dialog on lock [Florian; #780054]
|
||||||
|
* Fix DND over window previews in overview [Florian; #737166]
|
||||||
|
* Do not lock the screen when disabled by lockdown settings [Florian; #780212]
|
||||||
|
* Follow GNOME Weather's location permissions [Florian; #780252]
|
||||||
|
* Fix portals that require a new window to be loaded [Catalin; #759044]
|
||||||
|
* Fix restricting menus to screen height on HiDPI displays [Cosimo; #753305]
|
||||||
|
* Misc. bug fixes and cleanups [Florian, Cosimo, Bastien, Catalin, Carlos G.,
|
||||||
|
Jonas, Carlos S., Xiaoguang, Rares, Emilio; #780063, #780321, #780381,
|
||||||
|
#780453, #758873, #780606, #642652, #777732, #780157, #781482, #780404,
|
||||||
|
#781545, #781728]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Jonas Ådahl, Cosimo Cecchi, Philip Chimento, Carlos Garnacho, Catalin Iacob,
|
||||||
|
Florian Müllner, Bastien Nocera, Emilio Pozuelo Monfort, Carlos Soriano,
|
||||||
|
Rares Visalom, Xiaoguang Wang
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Marek Cernocky [cs], Piotr Drąg [pl], Anders Jonsson [sv], Stas Solovey [ru],
|
||||||
|
Rafael Fontenelle [pt_BR], Baurzhan Muftakhidinov [kk], Daniel Korostil [uk],
|
||||||
|
Kukuh Syafaat [id], Milo Casagrande [it], Jiri Grönroos [fi],
|
||||||
|
Daniel Mustieles [es], Balázs Úr [hu], Guillaume Bernard [fr],
|
||||||
|
Changwoo Ryu [ko], Mario Blättermann [de], Fran Dieguez [gl],
|
||||||
|
Dušan Kazik [sk], Yuras Shumovich [be], Fabio Tomat [fur],
|
||||||
|
Kjartan Maraas [nb], Aurimas Černius [lt], Trần Ngọc Quân [vi],
|
||||||
|
Rūdolfs Mazurs [lv], Γιάννης Κουτσούκος [el], gogo [hr], Марко Костић [sr],
|
||||||
|
Jordi Mas [ca], Khaled Hosny [ar]
|
||||||
|
|
||||||
|
3.24.0
|
||||||
|
======
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
GNOME Translation Robot [tg], Мирослав Николић [sr, sr@latin],
|
||||||
|
Guillaume Bernard [fr], Rūdolfs Mazurs [lv], Emin Tufan Çetin [tr],
|
||||||
|
sujiniku [ja], Daniel Korostil [uk]
|
||||||
|
|
||||||
|
3.23.92
|
||||||
|
=======
|
||||||
|
* Implement DND to overview on wayland [Hyungwon; #765003]
|
||||||
|
* Make telepathy optional at runtime [Florian; #771721, #779878]
|
||||||
|
* Don't show forecasts for NYC when geoclue gets stuck [Sebastian; #779898]
|
||||||
|
* Add bottom edge drag gesture to bring up the OSK [Jan-Michael; #757712]
|
||||||
|
* Allow switching between pads in the same group [Carlos; #779986]
|
||||||
|
* Ignore showBanners policy for critical notifications [Florian; #779974]
|
||||||
|
* Misc. bug fixes [Florian; #779435, #779819, #779820]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Jan-Michael Brummer, Allan Day, Carlos Garnacho, Hyungwon Hwang,
|
||||||
|
Sebastian Keller, Florian Müllner
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Enrico Nicoletto [pt_BR], Jiri Grönroos [fi], Chao-Hsiung Liao [zh_TW],
|
||||||
|
Piotr Drąg [pl], Piotr Drąg [he], Balázs Meskó [hu], Kris Thomsen [da],
|
||||||
|
Yuras Shumovich [be], Sveinn í Felli [is], Inaki Larranaga Murgoitio [eu],
|
||||||
|
Changwoo Ryu [ko], Jordi Mas [ca], Aurimas Černius [lt],
|
||||||
|
Мирослав Николић [sr, sr@latin], Christian Kirbach [de], Anders Jonsson [sv],
|
||||||
|
Fabio Tomat [fur], GNOME Translation Robot [gd], Dušan Kazik [sk],
|
||||||
|
Kukuh Syafaat [id], Marek Černocký [cs], Stas Solovey [ru],
|
||||||
|
Milo Casagrande [it], Fran Dieguez [gl], Daniel Boles [gl], A S Alam [pa],
|
||||||
|
Daniel Mustieles [es]
|
||||||
|
|
||||||
|
3.23.91
|
||||||
|
=======
|
||||||
|
* Use the original timestamps for restored notifications [Florian; #766410]
|
||||||
|
* Add weather information to date+time drop-down [Florian; #754031]
|
||||||
|
* Refine message list layout in date+time drop-down [Florian; #775763]
|
||||||
|
* Make next/prev media controls insensitive when unavailable [Florian; #773884]
|
||||||
|
* Misc. bug fixes [Piotr, Bastien, Florian; #772210, #769546, #775799]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Piotr Drąg, Carlos Garnacho, Florian Müllner, Bastien Nocera
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Baurzhan Muftakhidinov [kk], Jordi Mas [ca], Ask Hjorth Larsen [da],
|
||||||
|
Inaki Larranaga Murgoitio [eu], Daniel Mustieles [es], Dušan Kazik [sk],
|
||||||
|
Aurimas Černius [lt], Jiri Grönroos [fi], Kjartan Maraas [nb],
|
||||||
|
Piotr Drąg [pl], Daniel Korostil [uk], Kukuh Syafaat [id],
|
||||||
|
Milo Casagrande [it], Fabio Tomat [fur], Rafael Fontenelle [pt_BR],
|
||||||
|
Fran Dieguez [gl], Мирослав Николић [sr, sr@latin], Balázs Meskó [hu],
|
||||||
|
Chao-Hsiung Liao [zh_TW]
|
||||||
|
|
||||||
|
3.23.90
|
||||||
|
=======
|
||||||
|
* Handle Ctrl+Q and Ctrl+W in portal window [Bastien; #764133]
|
||||||
|
* Allow to scroll through ibus candidates with mouse [Peng; #776032]
|
||||||
|
* Reload apps on .desktop file content changes [Adrian; #773636]
|
||||||
|
* Use private data/cache directories in portal helper [Bastien; #775639]
|
||||||
|
* Fix subsurfaces not showing up in previews [Rui; #756715]
|
||||||
|
* Fix theme node transitions [Florian; #778145]
|
||||||
|
* Update pad (o)leds on mode switches [Carlos; #776543]
|
||||||
|
* Add security indicators to defend against malicious portals [Bastien; #749197]
|
||||||
|
* Don't allow type ahead at the login screen [Ray; #766139]
|
||||||
|
* Don't fail to load because of TLS errors [Bastien; #778253]
|
||||||
|
* Ensure the network lists remains sorted on rename [Benjamin; #778686]
|
||||||
|
* Toggle power-off/suspend button on long-press [Florian; #721173]
|
||||||
|
* Add "kill-switch" for user extensions [Florian; #778664]
|
||||||
|
* Add night light indicator to status area [Florian; #741224]
|
||||||
|
* Misc. bug fixes [Michael, Bastien, Carlos, Rui, Florian, Alan, Philip, Jonas;
|
||||||
|
#759793, #735233, #762444, #777784, #777934, #778158, #776199, #778425,
|
||||||
|
#771098, #778552, #777317, #778660, #778661, #745626, #778672]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Jonas Ådahl, Benjamin Berg, Michael Catanzaro, Philip Chimento,
|
||||||
|
Alan Coopersmith, Piotr Drąg, Carlos Garnacho, Yuri Konotopov,
|
||||||
|
Lionel Landwerlin, Rui Matos, Florian Müllner, Bastien Nocera,
|
||||||
|
Adrian Perez de Castro, Robert Roth, Ray Strode, Peng Wu
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Jiri Grönroos [fi], Balázs Meskó [hu], Gábor Kelemen [hu],
|
||||||
|
Daniel Mustieles [es], Dušan Kazik [sk],
|
||||||
|
Piotr Drąg [ar, eu, fa, hr, pa, pt, sr, sr@latin], Rafael Fontenelle [pt_BR],
|
||||||
|
Jordi Mas [ca], Piotr Drąg [pl], Alexandre Franke [fr],
|
||||||
|
Baurzhan Muftakhidinov [kk], Yuras Shumovich [be], Mandy Wang [zh_CN],
|
||||||
|
Marek Černocký [cs], Kukuh Syafaat [id], Kjartan Maraas [nb],
|
||||||
|
Daniel Korostil [uk]
|
||||||
|
|
||||||
|
3.23.3
|
||||||
|
======
|
||||||
|
* Fix replacing of GNotifications [Florian; #775149]
|
||||||
|
* Prepare for mozjs31 GJS [Philip; #775374]
|
||||||
|
* Misc. bug fixes [Niels, Jonas; #775507, #776130]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Jonas Ådahl, Michael Catanzaro, Philip Chimento, Niels De Graef,
|
||||||
|
Carlos Garnacho, Florian Müllner
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Muhammet Kara [tr], Christian Kirbach [de], Baurzhan Muftakhidinov [kk],
|
||||||
|
Cheng-Chia Tseng [zh_TW], A S Alam [pa], Gianvito Cavasoli [it]
|
||||||
|
|
||||||
|
3.23.2
|
||||||
|
======
|
||||||
|
* Implement Pad configuration OSD [Carlos; #771067]
|
||||||
|
* Show overview on three-finger touchpad pinch [Carlos; #765937]
|
||||||
|
* Summarize network sections with too many devices [Florian; #773892]
|
||||||
|
* Always show primary network icon when connected [Florian; #773890]
|
||||||
|
* Fix fullscreen transitions on wayland [Rui; #770345]
|
||||||
|
* Work around portal failures by using a URL without HTPPS redirect [Debarshi; #769940]
|
||||||
|
* Fix app view hiding when no usage data is available [Florian, Xiaoguang; #774381]
|
||||||
|
* Misc. bug fixes [Florian, Ray; #773875, #740043, #773893, #774643, #774805]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Carlos Garnacho, Rui Matos, Florian Müllner, Debarshi Ray, Ray Strode,
|
||||||
|
Xiaoguang Wang
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Balázs Meskó [hu], Fabio Tomat [fur], Marek Cernocky [cs], Stas Solovey [ru],
|
||||||
|
Daniel Mustieles [es], Marek Černocký [cs], Piotr Drąg [pl],
|
||||||
|
Rafael Fontenelle [pt_BR], Baurzhan Muftakhidinov [kk], Jiri Grönroos [fi],
|
||||||
|
Kjartan Maraas [nb]
|
||||||
|
|
||||||
|
3.23.1
|
||||||
|
======
|
||||||
|
* Request periodic scans while WiFi list is open [Dan; #767918]
|
||||||
|
* Include extension UUID in structured log metadata [Jonh; #770717]
|
||||||
|
* Line-wrap PAM messages on login screen [Tao; #764445]
|
||||||
|
* Add a way to launch an app on the discrete GPU [Bastien; #773117]
|
||||||
|
* Only allow graphs to lift screen shield when locked [Florian; #773328]
|
||||||
|
* Add reload option to gnome-shell-extension-tool [Jonh; #772593]
|
||||||
|
* Update background animations when resuming from suspend [Florian; #773265]
|
||||||
|
* Misc. bug fixes [Cosimo, Bastien, Florian, Philip, Carlos; #772723, #772287,
|
||||||
|
#756432, #772386, #772386, #773085, #773634]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Cosimo Cecchi, Philip Chimento, Carlos Garcia Campos, Florian Müllner,
|
||||||
|
Bastien Nocera, Jonh Wendell, Dan Williams, Tao Yang
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Fabio Tomat [fur], Philip Chimento [zh_CN], YunQiang Su [zh_CN],
|
||||||
|
Jordi Mas [ca], Piotr Drąg [pl], Muhammet Kara [tr], Marek Černocký [cs],
|
||||||
|
Daniel Korostil [uk], Dušan Kazik [sk]
|
||||||
|
|
||||||
|
3.22.1
|
||||||
|
======
|
||||||
|
* Fix hidden network indicator on startup [Florian; #772249]
|
||||||
|
* Fix order of windows with modal dialogs in window switcher [Florian; #747153]
|
||||||
|
* Fix feedback loop between StClipboard and X11 bridge [Carlos; #760745]
|
||||||
|
* Reliably match windows from Flatpak apps [Florian; #772615]
|
||||||
|
* Misc. bug fixes [Philip; #742249]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Philip Chimento, Carlos Garnacho, Florian Müllner
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Inaki Larranaga Murgoitio [eu], Khaled Hosny [ar], BM [uz@cyrillic],
|
||||||
|
Milo Casagrande [it], Cheng-Chia Tseng [zh_TW], gogo [hr]
|
||||||
|
|
||||||
|
3.22.0
|
||||||
|
======
|
||||||
|
* Misc. bug fixes [Florian, Rui; #771391, #771536] #771656]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Rui Matos, Florian Müllner
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Ask Hjorth Larsen [da], GNOME Translation Robot [gd], Alexandre Franke [fr],
|
||||||
|
Daniel Korostil [uk], Jordi Mas [ca], Khaled Hosny [ar], David King [en_GB]
|
||||||
|
|
||||||
|
3.21.92
|
||||||
|
=======
|
||||||
|
* Adjust screen capture to work with multiple stage views [Jonas; #770128]
|
||||||
|
* Improve handling of cycle shortcuts [Florian; #771063]
|
||||||
|
* Fix windows not getting undimmed in some cases [Rui; #770163, #752524]
|
||||||
|
* Disable extension version check by default [Florian; #770887]
|
||||||
|
* Misc. bug fixes [Rui, Florian, Michael; #770382, #770888, #770328]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Jonas Ådahl, Michael Catanzaro, Fran Dieguez, Olivier Fourdan, Rui Matos,
|
||||||
|
Florian Müllner
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Changwoo Ryu [ko], Baurzhan Muftakhidinov [kk], Aurimas Černius [lt],
|
||||||
|
Muhammet Kara [tr], Trần Ngọc Quân [vi], A S Alam [pa], Yosef Or Boczko [he],
|
||||||
|
Anders Jonsson [sv], Tiago Santos [pt], Hannie Dumoleyn [nl],
|
||||||
|
Rūdolfs Mazurs [lv], Claude Paroz [fr], Arash Mousavi [fa],
|
||||||
|
Fran Dieguez [gl], Stas Solovey [ru], Tom Tryfonidis [el]
|
||||||
|
|
||||||
|
3.21.91
|
||||||
|
=======
|
||||||
|
Translations:
|
||||||
|
Mario Blättermann [de], Jiri Grönroos [fi], Dušan Kazik [sk],
|
||||||
|
Andika Triwidada [id], Daniel Mustieles [es], Fabio Tomat [fur],
|
||||||
|
Enrico Nicoletto [pt_BR], Matej Urbančič [sl], Мирослав Николић [sr, sr@latin]
|
||||||
|
|
||||||
|
3.21.90.1
|
||||||
|
=========
|
||||||
|
Contributors:
|
||||||
|
Piotr Drąg
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Marek Černocký [cs], Balázs Úr [hu]
|
||||||
|
|
||||||
|
3.21.90
|
||||||
|
=======
|
||||||
|
* Improve on-screen keyboard on wayland [Carlos; #765009]
|
||||||
|
* Misc. bug fixes [Florian; #769156, #769216, #769074]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Carlos Garnacho, Florian Müllner
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Fabio Tomat [fur], Tiago Santos [pt], Daniel Mustieles [es],
|
||||||
|
Bernd Homuth [de], Aurimas Černius [lt], Balázs Úr [hu],
|
||||||
|
Yosef Or Boczko [he], Jiri Grönroos [fi], Marek Cernocky [cs],
|
||||||
|
Muhammet Kara [tr], Enrico Nicoletto [pt_BR], Andika Triwidada [id]
|
||||||
|
|
||||||
|
3.21.4
|
||||||
|
======
|
||||||
|
* overview: Fix switching workspaces when scrolling on non-primary monitors
|
||||||
|
[Florian; #766883, #768316]
|
||||||
|
* Fix crash when using screen recorder under wayland [Rui; #767001]
|
||||||
|
* Update theme on video memory purge errors [Rui; #739178]
|
||||||
|
* Free old backgrounds immediately [Hyungwon; #766353]
|
||||||
|
* Add support for system upgrades to end session dialog [Kalev; #763611]
|
||||||
|
* Fix maximized windows flickering to the wrong size on restart [Owen; #761566]
|
||||||
|
* Hide ignored events in calendar as well [Florian; #768538]
|
||||||
|
* calendar: Only hide dismissed occurrence of recurring event [Florian; #748226]
|
||||||
|
* Provide org.freedesktop.impl.portal.access implementation [Florian; #768669]
|
||||||
|
* Misc. bug fixes and cleanups [Rui, Florian, Marinus, Jonas; #767954, #768317,
|
||||||
|
#746867, #762206, #768956, #768979]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Jonas Ådahl, Piotr Drąg, Hyungwon Hwang, Kalev Lember, Rui Matos,
|
||||||
|
Florian Müllner, Marinus Schraal, Owen W. Taylor
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Andika Triwidada [id], Daniel Mustieles [es], Bruce Cowan [en_GB],
|
||||||
|
Dušan Kazik [sk], Piotr Drąg [pl], Chao-Hsiung Liao [zh_HK]
|
||||||
|
|
||||||
|
3.21.3
|
||||||
|
======
|
||||||
|
* Do not disable suspend action when locked [Florian; #725960]
|
||||||
|
* Remember input sources MRU list [Cosimo; #766826]
|
||||||
|
* networkAgent: Handle VPN service aliases [David; #658484]
|
||||||
|
* Plug a memory leak [Hans; #710230]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Cosimo Cecchi, Florian Müllner, Hans Petter Jansson, David Woodhouse
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Tiago Santos [pt], Cédric Valmary [oc], Muhammet Kara [tr],
|
||||||
|
Daniel Mustieles [es], Rafael Fontenelle [pt_BR]
|
||||||
|
|
||||||
|
3.21.2
|
||||||
|
======
|
||||||
|
* Fix sorting of hidden apps in app switcher [Florian; #766238]
|
||||||
|
* Set logind's LockedHint property when locked [Victor; #764773]
|
||||||
|
* Allocate framebuffers early to fix a crash on NVIDIA [Martin; #764898]
|
||||||
|
* Fix cycle-windows/cycle-group keybindings [Florian; #730739]
|
||||||
|
* Switch to shared desktop schema for calendar settings [Iain; #766318]
|
||||||
|
* Misc. bug fixes [Florian, Cosimo, Michele; #766325, #758471, #757556,
|
||||||
|
#757019, #766598]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Cosimo Cecchi, Michele Gaio, Iain Lane, Florian Müllner, Martin Szulecki,
|
||||||
|
Victor Toso
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Tiago Santos [pt], Kjartan Maraas [nb], Jiro Matsuzawa [ja],
|
||||||
|
Cédric Valmary [oc], Sveinn í Felli [is]
|
||||||
|
|
||||||
|
3.21.1
|
||||||
|
======
|
||||||
|
* Save screencasts in HOME if XDG_VIDEO_DIR doesn't exist [Florian; #765015]
|
||||||
|
* Don't show orientation lock when g-s-d won't rotate [Florian; #765267]
|
||||||
|
* Misc. bug fixes [Heiher, Florian, Marek, Rui; #722752, #765061, #763068,
|
||||||
|
#765607, #757676, #760439]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Heiher, Marek Chalupa, Rui Matos, Florian Müllner
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Arash Mousavi [fa], Kristjan SCHMIDT [eo], GNOME Translation Robot [gd]
|
||||||
|
|
||||||
|
3.20.1
|
||||||
|
======
|
||||||
|
* Plug a memory leak [Aaron; #735705]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Aaron Plattner
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Daniel Korostil [uk], Matej Urbančič [sl], Inaki Larranaga Murgoitio [eu],
|
||||||
|
Cheng-Chia Tseng [zh_TW], Fabio Tomat [fur], Trần Ngọc Quân [vi],
|
||||||
|
YunQiang Su [zh_CN], Marek Černocký [cs], Arash Mousavi [fa],
|
||||||
|
Alexander Shopov [bg], Khaled Hosny [ar]
|
||||||
|
|
||||||
|
3.20.0
|
||||||
|
======
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Changwoo Ryu [ko], Baurzhan Muftakhidinov [kk], Milo Casagrande [it],
|
||||||
|
Anders Jonsson [sv], Muhammet Kara [tr], Alexandre Franke [fr],
|
||||||
|
Rūdolfs Mazurs [lv], Ask Hjorth Larsen [da], Jiro Matsuzawa [ja]
|
||||||
|
|
||||||
|
3.19.92
|
||||||
|
=======
|
||||||
|
* Update location dialog according to latest mockups [Zeeshan; #762480]
|
||||||
|
* Fix deleting chat notifications in calendar [Florian; #747991]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Zeeshan Ali (Khattak), Florian Müllner
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Rūdolfs Mazurs [lv], Changwoo Ryu [ko], Matej Urbančič [sl],
|
||||||
|
Justin van Steijn [nl], Fabio Tomat [fur], Kris Thomsen [da],
|
||||||
|
Marek Černocký [cs], Piotr Drąg [pl], Dušan Kazik [sk],
|
||||||
|
Мирослав Николић [sr, sr@latin], Balázs Úr [hu], Yosef Or Boczko [he],
|
||||||
|
Daniel Mustieles [es], Fran Dieguez [gl], Bernd Homuth [de],
|
||||||
|
Tom Tryfonidis [el], Jiri Grönroos [fi], Gil Forcada [ca],
|
||||||
|
Artur Morais [pt_BR], Aurimas Černius [lt], Stas Solovey [ru]
|
||||||
|
|
||||||
|
3.19.91
|
||||||
|
=======
|
||||||
|
* location: Ask user only once [Zeeshan; #762559]
|
||||||
|
* Fix jiggling when auto-hiding legacy tray [Florian; #747957]
|
||||||
|
* Misc. bug fixes [Florian, Michael, Ting-Wei; #762475, #762507, #755659]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Zeeshan Ali (Khattak), Michael Catanzaro, Ting-Wei Lan, Florian Müllner
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Мирослав Николић [sr, sr@latin], Piotr Drąg [pl], A S Alam [pa],
|
||||||
|
Artur de Aquino Morais [pt_BR], Daniel Mustieles [es],
|
||||||
|
Chao-Hsiung Liao [zh_TW], Daniel Korostil [uk], Fran Dieguez [gl],
|
||||||
|
Tom Tryfonidis [el], Bernd Homuth [de], Sebastian Rasmussen [sv],
|
||||||
|
Jordi Mas [ca], Piotr Drąg [ga], Cédric Valmary [oc], Gábor Kelemen [hu],
|
||||||
|
Baurzhan Muftakhidinov [kk], Friedel Wolff [af], Marek Černocký [cs],
|
||||||
|
Mingye Wang (Arthur2e5) [zh_CN], Aron Xu [zh_CN], Khaled Hosny [ar],
|
||||||
|
Aurimas Černius [lt], Stas Solovey [ru], Yosef Or Boczko [he]
|
||||||
|
|
||||||
|
3.19.90
|
||||||
|
=======
|
||||||
|
* Correctly identify VPN secret requests [Lubomir; #760999]
|
||||||
|
* Improve week number presentation [Jakub; #683245]
|
||||||
|
* Add audio device selection dialog [Florian; #760284]
|
||||||
|
* Add media controls to the time and date drop down [Florian; #756491]
|
||||||
|
* Fix IBus candidate popup position under wayland [Rui; #753476]
|
||||||
|
* Ask user to grant applications access to location [Zeeshan; #762119]
|
||||||
|
* Misc. bug fixes [Mario, Jakub, Florian; #761208, #761772, #762270]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Zeeshan Ali (Khattak), Michael Catanzaro, Rui Matos, Florian Müllner,
|
||||||
|
Lubomir Rintel, Mario Sanchez Prada, Jakub Steiner
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Alexander Shopov [bg], Balázs Meskó [hu], Fabio Tomat [fur],
|
||||||
|
Dušan Kazik [sk], Piotr Drąg [pl], Alexandre Franke [fr],
|
||||||
|
Mario Blättermann [de], Milo Casagrande [it], Jordi Mas [ca]
|
||||||
|
|
||||||
|
3.19.4
|
||||||
|
======
|
||||||
|
* gdm: Do not allow bypassing disabled Sign In button [Michael; #746180]
|
||||||
|
* Style week numbers in calendar [Jakub; #683245]
|
||||||
|
* Misc. bug fixes [Christophe, Jakub, Rui; #759708, #760577, #760945]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Michael Catanzaro, Marek Černocký, Christophe Fergeau, Rui Matos,
|
||||||
|
Jakub Steiner
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Aurimas Černius [lt], Enrico Nicoletto [pt_BR], Andika Triwidada [id],
|
||||||
|
Mario Blättermann [de], Marek Černocký [cs], Kjartan Maraas [nb],
|
||||||
|
Muhammet Kara [tr], Stas Solovey [ru]
|
||||||
|
|
||||||
|
3.19.3
|
||||||
|
======
|
||||||
|
* Fix thumbnail scaling in window switcher on HiDPI [Florian; #758676]
|
||||||
|
* Update animated backgrounds on timezone changes [Florian; #758939]
|
||||||
|
* loginDialog: Update user list on user changes [Michael; #758568]
|
||||||
|
* Fix touch interaction on wayland [Carlos; #756748]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Michael Catanzaro, Carlos Garnacho, Kalev Lember, Florian Müllner
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Daniel Korostil [uk], Muhammet Kara [tr], Dušan Kazik [sk],
|
||||||
|
Baurzhan Muftakhidinov [kk], Marek Černocký [cs]
|
||||||
|
|
||||||
|
3.19.2
|
||||||
|
======
|
||||||
|
* Make gnome-shell DBus activatable [Ray; #741666]
|
||||||
|
* Fix browser plugin crash in Firefox [Carlos; #737932, #757940]
|
||||||
|
* Optionally show battery percentage in system status area [Bastien; #735771]
|
||||||
|
* Misc. bug fixes [Kalev, Florian, Bastien; #757418, #757668, #757779, #757816,
|
||||||
|
#745626, #758220]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Michael Biebl, Michael Catanzaro, Piotr Drąg, Carlos Garcia Campos,
|
||||||
|
Kalev Lember, Florian Müllner, Bastien Nocera, Ray Strode
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Pedro Albuquerque [pt], liushuyu [zh_CN], Yosef Or Boczko [he],
|
||||||
|
Jiri Grönroos [fi], Kjartan Maraas [nb], GNOME Translation Robot [gd],
|
||||||
|
Daniel Mustieles [es], Marek Černocký [cs], Kristjan SCHMIDT [eo],
|
||||||
|
Stas Solovey [ru]
|
||||||
|
|
||||||
|
3.19.1
|
||||||
|
======
|
||||||
|
* Respect text-scaling factor under wayland [Owen; #756447]
|
||||||
|
* Show the Bluetooth submenu when there were setup devices [Bastien; #723848]
|
||||||
|
* Misc. bug fixes [Florian, Cosimo, Rui, Ray, Owen, Jakub, Bastien;
|
||||||
|
#756697, #756714, #756605, #754814, #738942, #756983, #756925,
|
||||||
|
#757011, #673235, #757150]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Cosimo Cecchi, Rui Matos, Florian Müllner, Bastien Nocera, Jakub Steiner,
|
||||||
|
Ray Strode, Owen W. Taylor
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Kjartan Maraas [nb], Khaled Hosny [ar], Balázs Meskó [hu],
|
||||||
|
Daniel Șerbănescu [ro], Marek Černocký [cs]
|
||||||
|
|
||||||
|
3.18.1
|
||||||
|
======
|
||||||
|
* Fix screen freezes when a notification is pushed [Carlos; #755425]
|
||||||
|
* Fix overzealous ellipsization in system status menu [Adel, Florian; #708472]
|
||||||
|
* Hide app menu when disabled by setting [Florian; #745919]
|
||||||
|
* Fix lightbox effect when animations are disabled [Rui; #755827]
|
||||||
|
* Do not mark hotplug notifications as critical [Florian; #657923]
|
||||||
|
* Fix icons getting cut off in dash [Florian; #745649]
|
||||||
|
* Animate fullscreen/unfullscreen operations [Cosimo; #707248]
|
||||||
|
* Misc. bug fixes [Florian, Owen; #748919, #674799, #754581]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Emmanuele Bassi, Michael Catanzaro, Cosimo Cecchi, Matthias Clasen,
|
||||||
|
Adel Gadllah, Carlos Garnacho, Ekaterina Gerasimova, Rui Matos,
|
||||||
|
Florian Müllner, Owen W. Taylor
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Марко Костић [sr], Милош Поповић [sr@latin], Khaled Hosny [ar],
|
||||||
|
Trần Ngọc Quân [vi], Petr Kovar [cs], Alexandre Franke [fr],
|
||||||
|
Fran Dieguez [gl], Anders Jonsson [sv], Piotr Drąg [pl], Dušan Kazik [sk],
|
||||||
|
Milo Casagrande [it], Changwoo Ryu [ko], Stas Solovey [ru],
|
||||||
|
Rafael Fontenelle [pt_BR], Tom Tryfonidis [el], Aurimas Černius [lt],
|
||||||
|
Seán de Búrca [ga], Christian Kirbach [de], Jiri Grönroos [fi],
|
||||||
|
Pedro Albuquerque [pt], Baurzhan Muftakhidinov [kk], Daniel Mustieles [es],
|
||||||
|
Marek Černocký [cs], Ask Hjorth Larsen [da], Inaki Larranaga Murgoitio [eu]
|
||||||
|
|
||||||
|
3.18.0
|
||||||
|
======
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Sendy Aditya Suryana [id], Kris Thomsen [da], Seán de Búrca [ga],
|
||||||
|
Andika Triwidada [id], Enrico Nicoletto [pt_BR], Anders Jonsson [sv],
|
||||||
|
Rūdolfs Mazurs [lv]
|
||||||
|
|
||||||
|
3.17.92
|
||||||
|
=======
|
||||||
|
* Fix race when loading multiple background animations [Josselin; #741453]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Michael Biebl, Josselin Mouette, Florian Müllner
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Baurzhan Muftakhidinov [kk], Changwoo Ryu [ko], Christian Kirbach [de],
|
||||||
|
Kjartan Maraas [nb], Jiri Grönroos [fi], Arash Mousavi [fa],
|
||||||
|
Jiro Matsuzawa [ja], Marek Černocký [cs], Milo Casagrande [it]
|
||||||
|
|
||||||
|
3.17.91
|
||||||
|
=======
|
||||||
|
* Fix login screen spinner causing wakeups while VT-switched away
|
||||||
|
[Ray, Rui; #753891]
|
||||||
|
* Fix scrolling of user list on login screen [Florian; #754525]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Piotr Drąg, Rui Matos, Florian Müllner, Ray Strode
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Dušan Kazik [sk], Jordi Mas [ca], Aurimas Černius [lt], Stas Solovey [ru],
|
||||||
|
Piotr Drąg [pl], Pedro Albuquerque [pt], Daniel Mustieles [es],
|
||||||
|
Chao-Hsiung Liao [zh_TW], Muhammet Kara [tr], Fran Dieguez [gl],
|
||||||
|
Hannie Dumoleyn [nl], Yosef Or Boczko [he], Tom Tryfonidis [el],
|
||||||
|
A S Alam [pa], Balázs Úr [hu], Alexandre Franke [fr], Frédéric Péters [fr]
|
||||||
|
|
||||||
|
3.17.90
|
||||||
|
=======
|
||||||
|
* Avoid caret/focus viewport changes during pointer movement [Rui; #752138]
|
||||||
|
* Match GTK+'s modal dialogs for system modal dialogs [Carlos; #746108]
|
||||||
|
* Refine message list style [Florian; #749958]
|
||||||
|
* Fix type-ahead behavior for backspace and compose key [Rui; #753319, #753320]
|
||||||
|
* Refine the system status menu [Florian; #751377]
|
||||||
|
* Misc. bug fixes and cleanups [Bastien, Ray, Florian, Jakub; #752779, #752739,
|
||||||
|
#741366, #651503, #753064, #753181, #752881]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Rui Matos, Florian Müllner, Bastien Nocera, Carlos Soriano, Jakub Steiner,
|
||||||
|
Ray Strode, Rico Tzschichholz
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Marek Černocký [cs], Kjartan Maraas [nb], Jordi Mas [ca], Muhammet Kara [tr],
|
||||||
|
Enrico Nicoletto [pt_BR]
|
||||||
|
|
||||||
|
3.17.4
|
||||||
|
======
|
||||||
|
* Fix fuzziness of app menu icon [Jakub; #747932]
|
||||||
|
* Implement 4 finger swipe gesture for touchpads [Carlos; #752250]
|
||||||
|
* Misc. bug fixes [Florian, Alexandre, Piotr, Ray, Mario; #751921, #659969,
|
||||||
|
#752438, #752675]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Piotr Drąg, Alexandre Franke, Carlos Garnacho, Florian Müllner,
|
||||||
|
Mario Sanchez Prada, Jakub Steiner, Jasper St. Pierre, Ray Strode
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Benjamin Steinwender [de], Pedro Albuquerque [pt], Fabio Tomat [fur],
|
||||||
|
Matej Urbančič [sl], Daniel Mustieles [es], Yosef Or Boczko [he],
|
||||||
|
Daniel Martinez [an]
|
||||||
|
|
||||||
|
3.17.3
|
||||||
|
======
|
||||||
|
* Handle touch events in OSK on wayland [Rui; #750287]
|
||||||
|
* Reinstate left/right movement to window menu [Ron; #751344]
|
||||||
|
* Allow extensions to disable "Window is ready" notification [Adel; #748846]
|
||||||
|
* Misc. bug fixes [Watson, Michael, Ray, Rui, Florian, Cosimo; #750465,
|
||||||
|
#751016, #751517, #750714, #751541, #751599]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Michael Biebl, Cosimo Cecchi, Adel Gadllah, Rui Matos, Florian Müllner,
|
||||||
|
Ray Strode, Wim Taymans, Ron Yorston, Watson Yuuma Sato
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Sebastian Rasmussen [sv], Dimitris Spingos [el], Muhammet Kara [tr],
|
||||||
|
Stas Solovey [ru], Benjamin Steinwender [de], Balázs Úr [hu],
|
||||||
|
Victor Ibragimov [tg], Dušan Kazik [sk], Pedro Albuquerque [pt]
|
||||||
|
|
||||||
|
3.17.2
|
||||||
|
======
|
||||||
|
* Remove StTable widget [Florian; #703833]
|
||||||
|
* Increase visibility of expanders in alt-tab popup [Jakub; #745058]
|
||||||
|
* Ensure suspend inhibitors are released when VT switched away [Rui; #749228]
|
||||||
|
* Use iio-sensor-proxy directly for orientation lock [Bastien; #749671]
|
||||||
|
* Misc. bug fixes [Florian, Lan, Carlos; #749279, #749383, #749529, #749490,
|
||||||
|
#749742]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Carlos Garnacho, Ting-Wei Lan, Rui Matos, Florian Müllner, Bastien Nocera,
|
||||||
|
Jakub Steiner
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Yosef Or Boczko [he], sun [zh_CN], Felipe Braga [pt_BR],
|
||||||
|
Victor Ibragimov [tg], Gábor Kelemen [hu], Cédric Valmary [oc],
|
||||||
|
Dušan Kazik [sk], Kjartan Maraas [nb], Bruno Ramalhete [pt],
|
||||||
|
Matej Urbančič [sl], Daniel Mustieles [es]
|
||||||
|
|
||||||
|
3.17.1
|
||||||
|
======
|
||||||
|
* Add Display Settings entry to background menu [Meet; #697346]
|
||||||
|
* Add window menu option to move to different monitor [Isaac; #633994]
|
||||||
|
* Improve switch style in default/highContrast themes [Jakub; #746294, #747912]
|
||||||
|
* Make event highlight in calendar more prominent [Jakub; #747715]
|
||||||
|
* Fix keyboard focus when focusing a notification banner [Florian; #747205]
|
||||||
|
* Move notification banners below the dateMenu [Meet, Florian; #745910]
|
||||||
|
* Misc. bug fixes [Mario, Rui; #748338, #748541]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Isaac Ge, Rui Matos, Florian Müllner, Meet Parikh, Mario Sanchez Prada,
|
||||||
|
Jakub Steiner, Jasper St. Pierre
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Sveinn í Felli [is], Marek Černocký [cs], laurent Soleil [oc]
|
||||||
|
|
||||||
3.16.1
|
3.16.1
|
||||||
======
|
======
|
||||||
* gdm: Move long session chooser menus to the side [Florian; #734352]
|
* gdm: Move long session chooser menus to the side [Florian; #734352]
|
||||||
|
27
autogen.sh
@ -1,27 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
# Run this to generate all the initial makefiles, etc.
|
|
||||||
|
|
||||||
srcdir=`dirname $0`
|
|
||||||
test -z "$srcdir" && srcdir=.
|
|
||||||
|
|
||||||
(test -f $srcdir/configure.ac \
|
|
||||||
&& test -d $srcdir/src) || {
|
|
||||||
echo -n "**Error**: Directory "\`$srcdir\'" does not look like the"
|
|
||||||
echo " top-level gnome-shell directory"
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
# Fetch submodules if needed
|
|
||||||
if test ! -f src/gvc/Makefile.am || test ! -f data/theme/gnome-shell-sass/COPYING;
|
|
||||||
then
|
|
||||||
echo "+ Setting up submodules"
|
|
||||||
git submodule init
|
|
||||||
fi
|
|
||||||
git submodule update
|
|
||||||
|
|
||||||
which gnome-autogen.sh || {
|
|
||||||
echo "You need to install gnome-common from GNOME Git (or from"
|
|
||||||
echo "your OS vendor's package manager)."
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
. gnome-autogen.sh
|
|
@ -1,20 +0,0 @@
|
|||||||
|
|
||||||
mozillalibdir = $(BROWSER_PLUGIN_DIR)
|
|
||||||
|
|
||||||
mozillalib_LTLIBRARIES = libgnome-shell-browser-plugin.la
|
|
||||||
|
|
||||||
libgnome_shell_browser_plugin_la_LDFLAGS = -module -avoid-version -no-undefined
|
|
||||||
|
|
||||||
libgnome_shell_browser_plugin_la_LIBADD = \
|
|
||||||
$(BROWSER_PLUGIN_LIBS)
|
|
||||||
|
|
||||||
libgnome_shell_browser_plugin_la_SOURCES = \
|
|
||||||
browser-plugin.c \
|
|
||||||
npapi/npapi.h \
|
|
||||||
npapi/npfunctions.h \
|
|
||||||
npapi/npruntime.h \
|
|
||||||
npapi/nptypes.h
|
|
||||||
|
|
||||||
libgnome_shell_browser_plugin_la_CFLAGS = \
|
|
||||||
$(BROWSER_PLUGIN_CFLAGS) \
|
|
||||||
-DG_LOG_DOMAIN=\"GnomeShellBrowserPlugin\"
|
|
@ -33,20 +33,16 @@
|
|||||||
#include <json-glib/json-glib.h>
|
#include <json-glib/json-glib.h>
|
||||||
|
|
||||||
#define ORIGIN "extensions.gnome.org"
|
#define ORIGIN "extensions.gnome.org"
|
||||||
#define PLUGIN_NAME "Gnome Shell Integration"
|
#define PLUGIN_NAME "GNOME Shell Integration"
|
||||||
#define PLUGIN_DESCRIPTION "This plugin provides integration with Gnome Shell " \
|
#define PLUGIN_DESCRIPTION "This plugin provides integration with GNOME Shell " \
|
||||||
"for live extension enabling and disabling. " \
|
"for live extension enabling and disabling. " \
|
||||||
"It can be used only by extensions.gnome.org"
|
"It can be used only by extensions.gnome.org"
|
||||||
#define PLUGIN_MIME_STRING "application/x-gnome-shell-integration::Gnome Shell Integration Dummy Content-Type";
|
#define PLUGIN_MIME_STRING "application/x-gnome-shell-integration::GNOME Shell Integration Dummy Content-Type";
|
||||||
|
|
||||||
#define PLUGIN_API_VERSION 5
|
#define PLUGIN_API_VERSION 5
|
||||||
|
|
||||||
#define EXTENSION_DISABLE_VERSION_CHECK_KEY "disable-extension-version-validation"
|
#define EXTENSION_DISABLE_VERSION_CHECK_KEY "disable-extension-version-validation"
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
GDBusProxy *proxy;
|
|
||||||
} PluginData;
|
|
||||||
|
|
||||||
static NPNetscapeFuncs funcs;
|
static NPNetscapeFuncs funcs;
|
||||||
|
|
||||||
static inline gchar *
|
static inline gchar *
|
||||||
@ -145,121 +141,6 @@ check_origin_and_protocol (NPP instance)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* =============== public entry points =================== */
|
|
||||||
|
|
||||||
NPError
|
|
||||||
NP_Initialize(NPNetscapeFuncs *pfuncs, NPPluginFuncs *plugin)
|
|
||||||
{
|
|
||||||
/* global initialization routine, called once when plugin
|
|
||||||
is loaded */
|
|
||||||
|
|
||||||
g_debug ("plugin loaded");
|
|
||||||
|
|
||||||
memcpy (&funcs, pfuncs, sizeof (funcs));
|
|
||||||
|
|
||||||
plugin->size = sizeof(NPPluginFuncs);
|
|
||||||
plugin->newp = NPP_New;
|
|
||||||
plugin->destroy = NPP_Destroy;
|
|
||||||
plugin->getvalue = NPP_GetValue;
|
|
||||||
plugin->setwindow = NPP_SetWindow;
|
|
||||||
|
|
||||||
return NPERR_NO_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
NPError
|
|
||||||
NP_Shutdown(void)
|
|
||||||
{
|
|
||||||
return NPERR_NO_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char*
|
|
||||||
NP_GetMIMEDescription(void)
|
|
||||||
{
|
|
||||||
return PLUGIN_MIME_STRING;
|
|
||||||
}
|
|
||||||
|
|
||||||
NPError
|
|
||||||
NP_GetValue(void *instance,
|
|
||||||
NPPVariable variable,
|
|
||||||
void *value)
|
|
||||||
{
|
|
||||||
switch (variable) {
|
|
||||||
case NPPVpluginNameString:
|
|
||||||
*(char**)value = PLUGIN_NAME;
|
|
||||||
break;
|
|
||||||
case NPPVpluginDescriptionString:
|
|
||||||
*(char**)value = PLUGIN_DESCRIPTION;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NPERR_NO_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
NPError
|
|
||||||
NPP_New(NPMIMEType mimetype,
|
|
||||||
NPP instance,
|
|
||||||
uint16_t mode,
|
|
||||||
int16_t argc,
|
|
||||||
char **argn,
|
|
||||||
char **argv,
|
|
||||||
NPSavedData *saved)
|
|
||||||
{
|
|
||||||
/* instance initialization function */
|
|
||||||
PluginData *data;
|
|
||||||
GError *error = NULL;
|
|
||||||
|
|
||||||
g_debug ("plugin created");
|
|
||||||
|
|
||||||
if (!check_origin_and_protocol (instance))
|
|
||||||
return NPERR_GENERIC_ERROR;
|
|
||||||
|
|
||||||
data = g_slice_new (PluginData);
|
|
||||||
instance->pdata = data;
|
|
||||||
|
|
||||||
data->proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
|
|
||||||
G_DBUS_PROXY_FLAGS_NONE,
|
|
||||||
NULL, /* interface info */
|
|
||||||
"org.gnome.Shell",
|
|
||||||
"/org/gnome/Shell",
|
|
||||||
"org.gnome.Shell.Extensions",
|
|
||||||
NULL, /* GCancellable */
|
|
||||||
&error);
|
|
||||||
if (!data->proxy)
|
|
||||||
{
|
|
||||||
/* ignore error if the shell is not running, otherwise warn */
|
|
||||||
if (error->domain != G_DBUS_ERROR ||
|
|
||||||
error->code != G_DBUS_ERROR_NAME_HAS_NO_OWNER)
|
|
||||||
{
|
|
||||||
g_warning ("Failed to set up Shell proxy: %s", error->message);
|
|
||||||
}
|
|
||||||
g_clear_error (&error);
|
|
||||||
return NPERR_GENERIC_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
g_debug ("plugin created successfully");
|
|
||||||
|
|
||||||
return NPERR_NO_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
NPError
|
|
||||||
NPP_Destroy(NPP instance,
|
|
||||||
NPSavedData **saved)
|
|
||||||
{
|
|
||||||
/* instance finalization function */
|
|
||||||
|
|
||||||
PluginData *data = instance->pdata;
|
|
||||||
|
|
||||||
g_debug ("plugin destroyed");
|
|
||||||
|
|
||||||
g_object_unref (data->proxy);
|
|
||||||
|
|
||||||
g_slice_free (PluginData, data);
|
|
||||||
|
|
||||||
return NPERR_NO_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* =================== scripting interface =================== */
|
/* =================== scripting interface =================== */
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@ -330,45 +211,18 @@ static NPObject *
|
|||||||
plugin_object_allocate (NPP instance,
|
plugin_object_allocate (NPP instance,
|
||||||
NPClass *klass)
|
NPClass *klass)
|
||||||
{
|
{
|
||||||
PluginData *data = instance->pdata;
|
PluginObject *obj = (PluginObject *) funcs.memalloc (sizeof (PluginObject));
|
||||||
PluginObject *obj = g_slice_new0 (PluginObject);
|
|
||||||
|
|
||||||
|
memset (obj, 0, sizeof (PluginObject));
|
||||||
obj->instance = instance;
|
obj->instance = instance;
|
||||||
obj->proxy = g_object_ref (data->proxy);
|
|
||||||
obj->settings = g_settings_new (SHELL_SCHEMA);
|
|
||||||
obj->signal_id = g_signal_connect (obj->proxy, "g-signal",
|
|
||||||
G_CALLBACK (on_shell_signal), obj);
|
|
||||||
|
|
||||||
obj->watch_name_id = g_bus_watch_name (G_BUS_TYPE_SESSION,
|
return (NPObject*) obj;
|
||||||
"org.gnome.Shell",
|
|
||||||
G_BUS_NAME_WATCHER_FLAGS_NONE,
|
|
||||||
on_shell_appeared,
|
|
||||||
NULL,
|
|
||||||
obj,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
g_debug ("plugin object created");
|
|
||||||
|
|
||||||
return (NPObject*)obj;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
plugin_object_deallocate (NPObject *npobj)
|
plugin_object_deallocate (NPObject *npobj)
|
||||||
{
|
{
|
||||||
PluginObject *obj = (PluginObject*)npobj;
|
funcs.memfree (npobj);
|
||||||
|
|
||||||
g_signal_handler_disconnect (obj->proxy, obj->signal_id);
|
|
||||||
g_object_unref (obj->proxy);
|
|
||||||
|
|
||||||
if (obj->listener)
|
|
||||||
funcs.releaseobject (obj->listener);
|
|
||||||
|
|
||||||
if (obj->watch_name_id)
|
|
||||||
g_bus_unwatch_name (obj->watch_name_id);
|
|
||||||
|
|
||||||
g_debug ("plugin object destroyed");
|
|
||||||
|
|
||||||
g_slice_free (PluginObject, obj);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline gboolean
|
static inline gboolean
|
||||||
@ -1019,6 +873,149 @@ init_methods_and_properties (void)
|
|||||||
onextension_changed_id = funcs.getstringidentifier ("onchange");
|
onextension_changed_id = funcs.getstringidentifier ("onchange");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* =============== public entry points =================== */
|
||||||
|
|
||||||
|
NPError
|
||||||
|
NP_Initialize(NPNetscapeFuncs *pfuncs, NPPluginFuncs *plugin)
|
||||||
|
{
|
||||||
|
/* global initialization routine, called once when plugin
|
||||||
|
is loaded */
|
||||||
|
|
||||||
|
g_debug ("plugin loaded");
|
||||||
|
|
||||||
|
memcpy (&funcs, pfuncs, sizeof (funcs));
|
||||||
|
|
||||||
|
plugin->size = sizeof(NPPluginFuncs);
|
||||||
|
plugin->newp = NPP_New;
|
||||||
|
plugin->destroy = NPP_Destroy;
|
||||||
|
plugin->getvalue = NPP_GetValue;
|
||||||
|
plugin->setwindow = NPP_SetWindow;
|
||||||
|
plugin->event = NPP_HandleEvent;
|
||||||
|
|
||||||
|
return NPERR_NO_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
NPError
|
||||||
|
NP_Shutdown(void)
|
||||||
|
{
|
||||||
|
return NPERR_NO_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char*
|
||||||
|
NP_GetMIMEDescription(void)
|
||||||
|
{
|
||||||
|
return PLUGIN_MIME_STRING;
|
||||||
|
}
|
||||||
|
|
||||||
|
NPError
|
||||||
|
NP_GetValue(void *instance,
|
||||||
|
NPPVariable variable,
|
||||||
|
void *value)
|
||||||
|
{
|
||||||
|
switch (variable) {
|
||||||
|
case NPPVpluginNameString:
|
||||||
|
*(char**)value = PLUGIN_NAME;
|
||||||
|
break;
|
||||||
|
case NPPVpluginDescriptionString:
|
||||||
|
*(char**)value = PLUGIN_DESCRIPTION;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NPERR_NO_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
NPError
|
||||||
|
NPP_New(NPMIMEType mimetype,
|
||||||
|
NPP instance,
|
||||||
|
uint16_t mode,
|
||||||
|
int16_t argc,
|
||||||
|
char **argn,
|
||||||
|
char **argv,
|
||||||
|
NPSavedData *saved)
|
||||||
|
{
|
||||||
|
/* instance initialization function */
|
||||||
|
PluginObject *obj;
|
||||||
|
GError *error = NULL;
|
||||||
|
|
||||||
|
g_debug ("plugin created");
|
||||||
|
|
||||||
|
if (!check_origin_and_protocol (instance))
|
||||||
|
return NPERR_GENERIC_ERROR;
|
||||||
|
|
||||||
|
/* set windowless mode */
|
||||||
|
funcs.setvalue(instance, NPPVpluginWindowBool, NULL);
|
||||||
|
|
||||||
|
g_debug ("creating scriptable object");
|
||||||
|
init_methods_and_properties ();
|
||||||
|
obj = (PluginObject *) funcs.createobject (instance, &plugin_class);
|
||||||
|
instance->pdata = obj;
|
||||||
|
|
||||||
|
obj->proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
|
||||||
|
G_DBUS_PROXY_FLAGS_NONE,
|
||||||
|
NULL, /* interface info */
|
||||||
|
"org.gnome.Shell",
|
||||||
|
"/org/gnome/Shell",
|
||||||
|
"org.gnome.Shell.Extensions",
|
||||||
|
NULL, /* GCancellable */
|
||||||
|
&error);
|
||||||
|
if (!obj->proxy)
|
||||||
|
{
|
||||||
|
/* ignore error if the shell is not running, otherwise warn */
|
||||||
|
if (!g_error_matches (error, G_DBUS_ERROR, G_DBUS_ERROR_NAME_HAS_NO_OWNER))
|
||||||
|
{
|
||||||
|
g_warning ("Failed to set up Shell proxy: %s", error->message);
|
||||||
|
}
|
||||||
|
g_clear_error (&error);
|
||||||
|
return NPERR_GENERIC_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
obj->settings = g_settings_new (SHELL_SCHEMA);
|
||||||
|
obj->signal_id = g_signal_connect (obj->proxy, "g-signal",
|
||||||
|
G_CALLBACK (on_shell_signal), obj);
|
||||||
|
obj->watch_name_id = g_bus_watch_name (G_BUS_TYPE_SESSION,
|
||||||
|
"org.gnome.Shell",
|
||||||
|
G_BUS_NAME_WATCHER_FLAGS_NONE,
|
||||||
|
on_shell_appeared,
|
||||||
|
NULL,
|
||||||
|
obj,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
g_debug ("plugin created successfully");
|
||||||
|
|
||||||
|
return NPERR_NO_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
NPError
|
||||||
|
NPP_Destroy(NPP instance,
|
||||||
|
NPSavedData **saved)
|
||||||
|
{
|
||||||
|
/* instance finalization function */
|
||||||
|
PluginObject *obj = (PluginObject *) instance->pdata;
|
||||||
|
|
||||||
|
if (!obj)
|
||||||
|
return NPERR_INVALID_INSTANCE_ERROR;
|
||||||
|
|
||||||
|
g_debug ("plugin destroyed");
|
||||||
|
|
||||||
|
g_signal_handler_disconnect (obj->proxy, obj->signal_id);
|
||||||
|
g_object_unref (obj->proxy);
|
||||||
|
|
||||||
|
if (obj->listener)
|
||||||
|
funcs.releaseobject (obj->listener);
|
||||||
|
|
||||||
|
if (obj->restart_listener)
|
||||||
|
funcs.releaseobject (obj->restart_listener);
|
||||||
|
|
||||||
|
if (obj->watch_name_id)
|
||||||
|
g_bus_unwatch_name (obj->watch_name_id);
|
||||||
|
|
||||||
|
funcs.releaseobject((NPObject *)obj);
|
||||||
|
|
||||||
|
return NPERR_NO_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
NPError
|
NPError
|
||||||
NPP_GetValue(NPP instance,
|
NPP_GetValue(NPP instance,
|
||||||
NPPVariable variable,
|
NPPVariable variable,
|
||||||
@ -1029,13 +1026,11 @@ NPP_GetValue(NPP instance,
|
|||||||
switch (variable) {
|
switch (variable) {
|
||||||
case NPPVpluginScriptableNPObject:
|
case NPPVpluginScriptableNPObject:
|
||||||
g_debug ("creating scriptable object");
|
g_debug ("creating scriptable object");
|
||||||
init_methods_and_properties ();
|
if (!instance->pdata)
|
||||||
|
return NPERR_INVALID_INSTANCE_ERROR;
|
||||||
|
|
||||||
*(NPObject**)value = funcs.createobject (instance, &plugin_class);
|
funcs.retainobject (instance->pdata);
|
||||||
break;
|
*(NPObject**)value = instance->pdata;
|
||||||
|
|
||||||
case NPPVpluginNeedsXEmbed:
|
|
||||||
*(bool *)value = TRUE;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@ -1053,3 +1048,11 @@ NPP_SetWindow(NPP instance,
|
|||||||
{
|
{
|
||||||
return NPERR_NO_ERROR;
|
return NPERR_NO_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int16_t
|
||||||
|
NPP_HandleEvent(NPP instance,
|
||||||
|
void *event)
|
||||||
|
{
|
||||||
|
/* Ignore the event */
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
19
browser-plugin/meson.build
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
plugin_sources = [
|
||||||
|
'browser-plugin.c',
|
||||||
|
'npapi/npapi.h',
|
||||||
|
'npapi/npfunctions.h',
|
||||||
|
'npapi/npruntime.h',
|
||||||
|
'npapi/nptypes.h'
|
||||||
|
]
|
||||||
|
|
||||||
|
shared_module('gnome-shell-browser-plugin', plugin_sources,
|
||||||
|
dependencies: [gio_dep, json_glib_dep],
|
||||||
|
c_args: ['-DG_LOG_DOMAIN="GnomeShellBrowserPlugin"'],
|
||||||
|
# Browsers can unload and reload the module while browsing, which is not
|
||||||
|
# supported by GObject.
|
||||||
|
# We pass -Wl,-z,nodelete to the linker to ensure the module is never
|
||||||
|
# unloaded. See https://bugzilla.gnome.org/show_bug.cgi?id=737932.
|
||||||
|
link_args: ['-Wl,-z,nodelete'],
|
||||||
|
install: true,
|
||||||
|
install_dir: plugindir
|
||||||
|
)
|
26
config.h.meson
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
/* The prefix for our gettext translation domains. */
|
||||||
|
#mesondefine GETTEXT_PACKAGE
|
||||||
|
|
||||||
|
/* Version number of package */
|
||||||
|
#mesondefine VERSION
|
||||||
|
|
||||||
|
/* Version number of package */
|
||||||
|
#mesondefine PACKAGE_VERSION
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `fdwalk' function. */
|
||||||
|
#mesondefine HAVE_FDWALK
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `mallinfo' function. */
|
||||||
|
#mesondefine HAVE_MALLINFO
|
||||||
|
|
||||||
|
/* Define to 1 fi you have the <sys/resource.h> header file. */
|
||||||
|
#mesondefine HAVE_SYS_RESOURCE_H
|
||||||
|
|
||||||
|
/* Define if we have NetworkManager */
|
||||||
|
#mesondefine HAVE_NETWORKMANAGER
|
||||||
|
|
||||||
|
/* Define if we have systemd */
|
||||||
|
#mesondefine HAVE_SYSTEMD
|
||||||
|
|
||||||
|
/* Define if _NL_TIME_FIRST_WEEKDATE is available */
|
||||||
|
#mesondefine HAVE__NL_TIME_FIRST_WEEKDAY
|
158
configure
vendored
Executable file
@ -0,0 +1,158 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# configure script adapter for Meson
|
||||||
|
# Based on build-api: https://github.com/cgwalters/build-api
|
||||||
|
# Copyright 2010, 2011, 2013 Colin Walters <walters@verbum.org>
|
||||||
|
# Copyright 2016, 2017 Emmanuele Bassi
|
||||||
|
# Licensed under the new-BSD license (http://www.opensource.org/licenses/bsd-license.php)
|
||||||
|
|
||||||
|
# Build API variables:
|
||||||
|
|
||||||
|
# Little helper function for reading args from the commandline.
|
||||||
|
# it automatically handles -a b and -a=b variants, and returns 1 if
|
||||||
|
# we need to shift $3.
|
||||||
|
read_arg() {
|
||||||
|
# $1 = arg name
|
||||||
|
# $2 = arg value
|
||||||
|
# $3 = arg parameter
|
||||||
|
local rematch='^[^=]*=(.*)$'
|
||||||
|
if [[ $2 =~ $rematch ]]; then
|
||||||
|
read "$1" <<< "${BASH_REMATCH[1]}"
|
||||||
|
else
|
||||||
|
read "$1" <<< "$3"
|
||||||
|
# There is no way to shift our callers args, so
|
||||||
|
# return 1 to indicate they should do it instead.
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
sanitycheck() {
|
||||||
|
# $1 = arg name
|
||||||
|
# $1 = arg command
|
||||||
|
# $2 = arg alternates
|
||||||
|
local cmd=$( which $2 2>/dev/null )
|
||||||
|
|
||||||
|
if [ -x "$cmd" ]; then
|
||||||
|
read "$1" <<< "$cmd"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
test -z $3 || {
|
||||||
|
for alt in $3; do
|
||||||
|
cmd=$( which $alt 2>/dev/null )
|
||||||
|
|
||||||
|
if [ -x "$cmd" ]; then
|
||||||
|
read "$1" <<< "$cmd"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
echo -e "\e[1;31mERROR\e[0m: Command '$2' not found"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
sanitycheck MESON 'meson'
|
||||||
|
sanitycheck NINJA 'ninja' 'ninja-build'
|
||||||
|
|
||||||
|
enable_docs='-Denable-gtk-doc=false'
|
||||||
|
enable_man='-Denable-man=false'
|
||||||
|
enable_introspection=''
|
||||||
|
|
||||||
|
while (($# > 0)); do
|
||||||
|
case "${1%%=*}" in
|
||||||
|
--prefix) read_arg prefix "$@" || shift;;
|
||||||
|
--bindir) read_arg bindir "$@" || shift;;
|
||||||
|
--sbindir) read_arg sbindir "$@" || shift;;
|
||||||
|
--libexecdir) read_arg libexecdir "$@" || shift;;
|
||||||
|
--datarootdir) read_arg datarootdir "$@" || shift;;
|
||||||
|
--datadir) read_arg datadir "$@" || shift;;
|
||||||
|
--sysconfdir) read_arg sysconfdir "$@" || shift;;
|
||||||
|
--libdir) read_arg libdir "$@" || shift;;
|
||||||
|
--mandir) read_arg mandir "$@" || shift;;
|
||||||
|
--includedir) read_arg includedir "$@" || shift;;
|
||||||
|
--enable-gtk-doc) enable_docs='-Denable-gtk-doc=true';;
|
||||||
|
--disable-gtk-doc) enable_docs='-Denable-gtk-doc=false';;
|
||||||
|
--enable-man) enable_man='-Denable-man=true';;
|
||||||
|
--disable-man) enable_man='-Denable-man=false';;
|
||||||
|
--enable-introspection) enable_introspection='';;
|
||||||
|
--disable-introspection) enable_introspection='-Ddisable_introspection=true';;
|
||||||
|
*) echo -e "\e[1;33mINFO\e[0m: Ignoring unknown option '$1'";;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
# Defaults
|
||||||
|
test -z ${prefix} && prefix="/usr/local"
|
||||||
|
test -z ${bindir} && bindir=${prefix}/bin
|
||||||
|
test -z ${sbindir} && sbindir=${prefix}/sbin
|
||||||
|
test -z ${libexecdir} && libexecdir=${prefix}/bin
|
||||||
|
test -z ${datarootdir} && datarootdir=${prefix}/share
|
||||||
|
test -z ${datadir} && datadir=${datarootdir}
|
||||||
|
test -z ${sysconfdir} && sysconfdir=${prefix}/etc
|
||||||
|
test -z ${libdir} && libdir=${prefix}/lib
|
||||||
|
test -z ${mandir} && mandir=${prefix}/share/man
|
||||||
|
test -z ${includedir} && includedir=${prefix}/include
|
||||||
|
|
||||||
|
# The source directory is the location of this file
|
||||||
|
srcdir=$(dirname $0)
|
||||||
|
|
||||||
|
# The build directory is the current location
|
||||||
|
builddir=`pwd`
|
||||||
|
|
||||||
|
# If we're calling this file from the source directory then
|
||||||
|
# we automatically create a build directory and ensure that
|
||||||
|
# both Meson and Ninja invocations are relative to that
|
||||||
|
# location
|
||||||
|
if [[ -f "${builddir}/meson.build" ]]; then
|
||||||
|
mkdir -p _build
|
||||||
|
builddir="${builddir}/_build"
|
||||||
|
NINJA_OPT="-C ${builddir}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Wrapper Makefile for Ninja
|
||||||
|
cat > Makefile <<END
|
||||||
|
# Generated by configure; do not edit
|
||||||
|
|
||||||
|
all:
|
||||||
|
CC="\$(CC)" CXX="\$(CXX)" ${NINJA} ${NINJA_OPT}
|
||||||
|
|
||||||
|
install:
|
||||||
|
DESTDIR="\$(DESTDIR)" ${NINJA} ${NINJA_OPT} install
|
||||||
|
|
||||||
|
check:
|
||||||
|
${MESON} test ${NINJA_OPT}
|
||||||
|
END
|
||||||
|
|
||||||
|
echo "Summary:"
|
||||||
|
echo " meson:....... ${MESON}"
|
||||||
|
echo " ninja:....... ${NINJA}"
|
||||||
|
echo " prefix:...... ${prefix}"
|
||||||
|
echo " bindir:...... ${bindir}"
|
||||||
|
echo " sbindir:..... ${sbindir}"
|
||||||
|
echo " libexecdir:.. ${libexecdir}"
|
||||||
|
echo " datarootdir:. ${datarootdir}"
|
||||||
|
echo " datadir:..... ${datadir}"
|
||||||
|
echo " sysconfdir:.. ${sysconfdir}"
|
||||||
|
echo " libdir:...... ${libdir}"
|
||||||
|
echo " mandir:...... ${mandir}"
|
||||||
|
echo " includedir:.. ${includedir}"
|
||||||
|
echo " additional:.."
|
||||||
|
echo " - ${enable_docs} ${enable_man} ${enable_introspection}"
|
||||||
|
|
||||||
|
exec ${MESON} \
|
||||||
|
--prefix=${prefix} \
|
||||||
|
--libdir=${libdir} \
|
||||||
|
--libexecdir=${libexecdir} \
|
||||||
|
--datadir=${datadir} \
|
||||||
|
--sysconfdir=${sysconfdir} \
|
||||||
|
--bindir=${bindir} \
|
||||||
|
--includedir=${includedir} \
|
||||||
|
--mandir=${mandir} \
|
||||||
|
--default-library shared \
|
||||||
|
${enable_docs} \
|
||||||
|
${enable_man} \
|
||||||
|
${enable_introspection} \
|
||||||
|
${builddir} \
|
||||||
|
${srcdir}
|
||||||
|
|
||||||
|
# vim: ai ts=8 noet sts=2 ft=sh
|
276
configure.ac
@ -1,276 +0,0 @@
|
|||||||
AC_PREREQ(2.63)
|
|
||||||
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])
|
|
||||||
AC_CONFIG_MACRO_DIR([m4])
|
|
||||||
AC_CONFIG_AUX_DIR([config])
|
|
||||||
|
|
||||||
AC_SUBST([PACKAGE_NAME], ["$PACKAGE_NAME"])
|
|
||||||
AC_SUBST([PACKAGE_VERSION], ["$PACKAGE_VERSION"])
|
|
||||||
|
|
||||||
AM_INIT_AUTOMAKE([1.11 no-dist-gzip dist-xz tar-ustar foreign])
|
|
||||||
AM_MAINTAINER_MODE([enable])
|
|
||||||
|
|
||||||
m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])
|
|
||||||
|
|
||||||
# Checks for programs.
|
|
||||||
AC_PROG_CC
|
|
||||||
AC_PROG_CXX
|
|
||||||
|
|
||||||
# Initialize libtool
|
|
||||||
LT_PREREQ([2.2.6])
|
|
||||||
LT_INIT([disable-static])
|
|
||||||
|
|
||||||
# i18n
|
|
||||||
IT_PROG_INTLTOOL([0.40])
|
|
||||||
|
|
||||||
GETTEXT_PACKAGE=gnome-shell
|
|
||||||
AC_SUBST(GETTEXT_PACKAGE)
|
|
||||||
AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE",
|
|
||||||
[The prefix for our gettext translation domains.])
|
|
||||||
|
|
||||||
PKG_PROG_PKG_CONFIG([0.22])
|
|
||||||
|
|
||||||
AC_PATH_PROG([XSLTPROC], [xsltproc])
|
|
||||||
|
|
||||||
GLIB_GSETTINGS
|
|
||||||
|
|
||||||
# Get a value to substitute into gnome-shell.in
|
|
||||||
AM_PATH_PYTHON([3])
|
|
||||||
AC_SUBST(PYTHON)
|
|
||||||
|
|
||||||
# We need at least this, since gst_plugin_register_static() was added
|
|
||||||
# in 0.10.16, but nothing older than 0.10.21 has been tested.
|
|
||||||
GSTREAMER_MIN_VERSION=0.11.92
|
|
||||||
|
|
||||||
recorder_modules=
|
|
||||||
build_recorder=false
|
|
||||||
AC_MSG_CHECKING([for GStreamer (needed for recording functionality)])
|
|
||||||
if $PKG_CONFIG --exists gstreamer-1.0 '>=' $GSTREAMER_MIN_VERSION ; then
|
|
||||||
AC_MSG_RESULT(yes)
|
|
||||||
build_recorder=true
|
|
||||||
recorder_modules="gstreamer-1.0 gstreamer-base-1.0 x11 gtk+-3.0"
|
|
||||||
PKG_CHECK_MODULES(TEST_SHELL_RECORDER, $recorder_modules clutter-1.0)
|
|
||||||
else
|
|
||||||
AC_MSG_RESULT(no)
|
|
||||||
fi
|
|
||||||
|
|
||||||
AM_CONDITIONAL(BUILD_RECORDER, $build_recorder)
|
|
||||||
|
|
||||||
AC_ARG_ENABLE([systemd],
|
|
||||||
AS_HELP_STRING([--enable-systemd], [Use systemd]),
|
|
||||||
[enable_systemd=$enableval],
|
|
||||||
[enable_systemd=auto])
|
|
||||||
AS_IF([test x$enable_systemd != xno], [
|
|
||||||
AC_MSG_CHECKING([for libsystemd-journal])
|
|
||||||
PKG_CHECK_EXISTS([libsystemd-journal],
|
|
||||||
[have_systemd=yes
|
|
||||||
AC_DEFINE([HAVE_SYSTEMD], [1], [Define if we have systemd])],
|
|
||||||
[have_systemd=no])
|
|
||||||
AC_MSG_RESULT($have_systemd)
|
|
||||||
])
|
|
||||||
|
|
||||||
AC_MSG_RESULT($enable_systemd)
|
|
||||||
|
|
||||||
CLUTTER_MIN_VERSION=1.21.5
|
|
||||||
GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1
|
|
||||||
GJS_MIN_VERSION=1.39.0
|
|
||||||
MUTTER_MIN_VERSION=3.16.1
|
|
||||||
GTK_MIN_VERSION=3.15.0
|
|
||||||
GIO_MIN_VERSION=2.37.0
|
|
||||||
LIBECAL_MIN_VERSION=3.5.3
|
|
||||||
LIBEDATASERVER_MIN_VERSION=3.13.90
|
|
||||||
TELEPATHY_GLIB_MIN_VERSION=0.17.5
|
|
||||||
POLKIT_MIN_VERSION=0.100
|
|
||||||
STARTUP_NOTIFICATION_MIN_VERSION=0.11
|
|
||||||
GCR_MIN_VERSION=3.7.5
|
|
||||||
GNOME_DESKTOP_REQUIRED_VERSION=3.7.90
|
|
||||||
NETWORKMANAGER_MIN_VERSION=0.9.8
|
|
||||||
PULSE_MIN_VERS=2.0
|
|
||||||
|
|
||||||
# Collect more than 20 libraries for a prize!
|
|
||||||
SHARED_PCS="gio-unix-2.0 >= $GIO_MIN_VERSION
|
|
||||||
libxml-2.0
|
|
||||||
gtk+-3.0 >= $GTK_MIN_VERSION
|
|
||||||
atk-bridge-2.0
|
|
||||||
gjs-internals-1.0 >= $GJS_MIN_VERSION
|
|
||||||
$recorder_modules
|
|
||||||
gdk-x11-3.0 libsoup-2.4
|
|
||||||
clutter-x11-1.0 >= $CLUTTER_MIN_VERSION
|
|
||||||
clutter-glx-1.0 >= $CLUTTER_MIN_VERSION
|
|
||||||
libstartup-notification-1.0 >= $STARTUP_NOTIFICATION_MIN_VERSION
|
|
||||||
gobject-introspection-1.0 >= $GOBJECT_INTROSPECTION_MIN_VERSION
|
|
||||||
libcanberra libcanberra-gtk3
|
|
||||||
telepathy-glib >= $TELEPATHY_GLIB_MIN_VERSION
|
|
||||||
polkit-agent-1 >= $POLKIT_MIN_VERSION
|
|
||||||
gcr-base-3 >= $GCR_MIN_VERSION"
|
|
||||||
if test x$have_systemd = xyes; then
|
|
||||||
SHARED_PCS="${SHARED_PCS} libsystemd-journal"
|
|
||||||
fi
|
|
||||||
|
|
||||||
PKG_CHECK_MODULES(GNOME_SHELL, $SHARED_PCS)
|
|
||||||
PKG_CHECK_MODULES(MUTTER, libmutter >= $MUTTER_MIN_VERSION)
|
|
||||||
|
|
||||||
PKG_CHECK_MODULES(GNOME_SHELL_JS, gio-2.0 gjs-internals-1.0 >= $GJS_MIN_VERSION)
|
|
||||||
PKG_CHECK_MODULES(ST, clutter-1.0 gtk+-3.0 libcroco-0.6 >= 0.6.8 x11)
|
|
||||||
PKG_CHECK_MODULES(SHELL_PERF_HELPER, gtk+-3.0 gio-2.0)
|
|
||||||
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)
|
|
||||||
|
|
||||||
AC_ARG_ENABLE(browser-plugin,
|
|
||||||
[AS_HELP_STRING([--enable-browser-plugin],
|
|
||||||
[Enable browser plugin [default=yes]])],,
|
|
||||||
enable_browser_plugin=yes)
|
|
||||||
AS_IF([test x$enable_browser_plugin = xyes], [
|
|
||||||
PKG_CHECK_MODULES(BROWSER_PLUGIN, gio-2.0 >= $GIO_MIN_VERSION json-glib-1.0 >= 0.13.2)
|
|
||||||
])
|
|
||||||
AM_CONDITIONAL(BUILD_BROWSER_PLUGIN, test x$enable_browser_plugin = xyes)
|
|
||||||
|
|
||||||
PKG_CHECK_MODULES(BLUETOOTH, gnome-bluetooth-1.0 >= 3.9.0,
|
|
||||||
[AC_DEFINE([HAVE_BLUETOOTH],[1],[Define if you have libgnome-bluetooth-applet])
|
|
||||||
AC_SUBST([HAVE_BLUETOOTH],[1])],
|
|
||||||
[AC_DEFINE([HAVE_BLUETOOTH],[0])
|
|
||||||
AC_SUBST([HAVE_BLUETOOTH],[0])])
|
|
||||||
|
|
||||||
PKG_CHECK_MODULES(CALENDAR_SERVER, libecal-1.2 >= $LIBECAL_MIN_VERSION libedataserver-1.2 >= $LIBEDATASERVER_MIN_VERSION gio-2.0)
|
|
||||||
AC_SUBST(CALENDAR_SERVER_CFLAGS)
|
|
||||||
AC_SUBST(CALENDAR_SERVER_LIBS)
|
|
||||||
|
|
||||||
GNOME_KEYBINDINGS_KEYSDIR=`$PKG_CONFIG --variable keysdir gnome-keybindings`
|
|
||||||
AC_SUBST([GNOME_KEYBINDINGS_KEYSDIR])
|
|
||||||
|
|
||||||
GOBJECT_INTROSPECTION_CHECK([$GOBJECT_INTROSPECTION_MIN_VERSION])
|
|
||||||
|
|
||||||
MUTTER_GIR_DIR=`$PKG_CONFIG --variable=girdir libmutter`
|
|
||||||
AC_SUBST(MUTTER_GIR_DIR)
|
|
||||||
|
|
||||||
MUTTER_TYPELIB_DIR=`$PKG_CONFIG --variable=typelibdir libmutter`
|
|
||||||
AC_SUBST(MUTTER_TYPELIB_DIR)
|
|
||||||
|
|
||||||
GJS_CONSOLE=`$PKG_CONFIG --variable=gjs_console gjs-1.0`
|
|
||||||
AC_SUBST(GJS_CONSOLE)
|
|
||||||
|
|
||||||
GLIB_COMPILE_RESOURCES=`$PKG_CONFIG --variable glib_compile_resources gio-2.0`
|
|
||||||
AC_SUBST(GLIB_COMPILE_RESOURCES)
|
|
||||||
|
|
||||||
AC_CHECK_FUNCS(fdwalk)
|
|
||||||
AC_CHECK_FUNCS(mallinfo)
|
|
||||||
AC_CHECK_HEADERS([sys/resource.h])
|
|
||||||
|
|
||||||
# _NL_TIME_FIRST_WEEKDAY is an enum and not a define
|
|
||||||
AC_MSG_CHECKING([for _NL_TIME_FIRST_WEEKDAY])
|
|
||||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <langinfo.h>]],
|
|
||||||
[[nl_langinfo(_NL_TIME_FIRST_WEEKDAY);]])],
|
|
||||||
[langinfo_ok=yes], [langinfo_ok=no])
|
|
||||||
AC_MSG_RESULT($langinfo_ok)
|
|
||||||
if test "$langinfo_ok" = "yes"; then
|
|
||||||
AC_DEFINE([HAVE__NL_TIME_FIRST_WEEKDAY], [1],
|
|
||||||
[Define if _NL_TIME_FIRST_WEEKDAY is available])
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_ARG_ENABLE(networkmanager,
|
|
||||||
AS_HELP_STRING([--disable-networkmanager],
|
|
||||||
[disable NetworkManager support @<:@default=auto@:>@]),,
|
|
||||||
[enable_networkmanager=auto])
|
|
||||||
|
|
||||||
if test "x$enable_networkmanager" != "xno"; then
|
|
||||||
PKG_CHECK_MODULES(NETWORKMANAGER,
|
|
||||||
[libnm-glib
|
|
||||||
libnm-util >= $NETWORKMANAGER_MIN_VERSION
|
|
||||||
libnm-gtk >= $NETWORKMANAGER_MIN_VERSION
|
|
||||||
libsecret-unstable],
|
|
||||||
[have_networkmanager=yes],
|
|
||||||
[have_networkmanager=no])
|
|
||||||
|
|
||||||
GNOME_SHELL_CFLAGS="$GNOME_SHELL_CFLAGS $NETWORKMANAGER_CFLAGS"
|
|
||||||
GNOME_SHELL_LIBS="$GNOME_SHELL_LIBS $NETWORKMANAGER_LIBS"
|
|
||||||
else
|
|
||||||
have_networkmanager="no (disabled)"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "x$have_networkmanager" = "xyes"; then
|
|
||||||
AC_DEFINE(HAVE_NETWORKMANAGER, [1], [Define if we have NetworkManager])
|
|
||||||
AC_SUBST([HAVE_NETWORKMANAGER], [1])
|
|
||||||
else
|
|
||||||
if test "x$enable_networkmanager" = "xyes"; then
|
|
||||||
AC_MSG_ERROR([Couldn't find NetworkManager.])
|
|
||||||
fi
|
|
||||||
AC_SUBST([HAVE_NETWORKMANAGER], [0])
|
|
||||||
fi
|
|
||||||
|
|
||||||
AM_CONDITIONAL(HAVE_NETWORKMANAGER, test "$have_networkmanager" = "yes")
|
|
||||||
|
|
||||||
# Sets GLIB_GENMARSHAL and GLIB_MKENUMS
|
|
||||||
AM_PATH_GLIB_2_0()
|
|
||||||
|
|
||||||
GTK_DOC_CHECK([1.15], [--flavour no-tmpl])
|
|
||||||
|
|
||||||
AC_ARG_ENABLE(man,
|
|
||||||
[AS_HELP_STRING([--enable-man],
|
|
||||||
[generate man pages [default=yes]])],,
|
|
||||||
enable_man=yes)
|
|
||||||
if test "$enable_man" != no; then
|
|
||||||
AC_PATH_PROG([XSLTPROC], [xsltproc])
|
|
||||||
if test -z "$XSLTPROC"; then
|
|
||||||
AC_MSG_ERROR([xsltproc is required for --enable-man])
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
AM_CONDITIONAL(ENABLE_MAN, test "$enable_man" != no)
|
|
||||||
|
|
||||||
GNOME_COMPILE_WARNINGS([error])
|
|
||||||
case "$WARN_CFLAGS" in
|
|
||||||
*-Werror*)
|
|
||||||
WARN_CFLAGS="$WARN_CFLAGS -Wno-error=deprecated-declarations"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
AM_CFLAGS="$AM_CFLAGS $WARN_CFLAGS"
|
|
||||||
AC_SUBST(AM_CFLAGS)
|
|
||||||
|
|
||||||
if test -z "${BROWSER_PLUGIN_DIR}"; then
|
|
||||||
BROWSER_PLUGIN_DIR="\${libdir}/mozilla/plugins"
|
|
||||||
fi
|
|
||||||
AC_ARG_VAR([BROWSER_PLUGIN_DIR],[Where to install the plugin to])
|
|
||||||
|
|
||||||
AC_ARG_VAR([GDBUS_CODEGEN],[the gdbus-codegen programme])
|
|
||||||
AC_PATH_PROG([GDBUS_CODEGEN],[gdbus-codegen],[])
|
|
||||||
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
|
|
||||||
docs/Makefile
|
|
||||||
docs/reference/Makefile
|
|
||||||
docs/reference/shell/Makefile
|
|
||||||
docs/reference/shell/shell-docs.sgml
|
|
||||||
docs/reference/st/Makefile
|
|
||||||
docs/reference/st/st-docs.sgml
|
|
||||||
js/Makefile
|
|
||||||
src/calendar-server/evolution-calendar.desktop.in
|
|
||||||
src/Makefile
|
|
||||||
src/gvc/Makefile
|
|
||||||
browser-plugin/Makefile
|
|
||||||
tests/Makefile
|
|
||||||
po/Makefile.in
|
|
||||||
man/Makefile
|
|
||||||
])
|
|
||||||
AC_OUTPUT
|
|
||||||
|
|
||||||
echo "
|
|
||||||
Build configuration:
|
|
||||||
|
|
||||||
Prefix: ${prefix}
|
|
||||||
Source code location: ${srcdir}
|
|
||||||
Compiler: ${CC}
|
|
||||||
Compiler Warnings: $enable_compile_warnings
|
|
||||||
|
|
||||||
Support for NetworkManager: $have_networkmanager
|
|
||||||
Support for GStreamer recording: $build_recorder
|
|
||||||
"
|
|
@ -1,24 +1,24 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<KeyListEntries schema="org.gnome.shell.keybindings"
|
<KeyListEntries schema="org.gnome.shell.keybindings"
|
||||||
group="system"
|
group="system"
|
||||||
_name="System"
|
name="System"
|
||||||
wm_name="GNOME Shell"
|
wm_name="GNOME Shell"
|
||||||
package="gnome-shell">
|
package="gnome-shell">
|
||||||
|
|
||||||
<KeyListEntry name="toggle-message-tray"
|
<KeyListEntry name="toggle-message-tray"
|
||||||
_description="Show the notification list"/>
|
description="Show the notification list"/>
|
||||||
|
|
||||||
<KeyListEntry name="focus-active-notification"
|
<KeyListEntry name="focus-active-notification"
|
||||||
_description="Focus the active notification"/>
|
description="Focus the active notification"/>
|
||||||
|
|
||||||
<KeyListEntry name="toggle-overview"
|
<KeyListEntry name="toggle-overview"
|
||||||
_description="Show the overview"/>
|
description="Show the overview"/>
|
||||||
|
|
||||||
<KeyListEntry name="toggle-application-view"
|
<KeyListEntry name="toggle-application-view"
|
||||||
_description="Show all applications"/>
|
description="Show all applications"/>
|
||||||
|
|
||||||
<KeyListEntry name="open-application-menu"
|
<KeyListEntry name="open-application-menu"
|
||||||
_description="Open the application menu"/>
|
description="Open the application menu"/>
|
||||||
|
|
||||||
</KeyListEntries>
|
</KeyListEntries>
|
||||||
|
|
135
data/Makefile.am
@ -1,135 +0,0 @@
|
|||||||
CLEANFILES =
|
|
||||||
NULL =
|
|
||||||
|
|
||||||
desktopdir=$(datadir)/applications
|
|
||||||
desktop_DATA = gnome-shell.desktop gnome-shell-wayland.desktop gnome-shell-extension-prefs.desktop
|
|
||||||
|
|
||||||
if HAVE_NETWORKMANAGER
|
|
||||||
desktop_DATA += org.gnome.Shell.PortalHelper.desktop
|
|
||||||
|
|
||||||
servicedir = $(datadir)/dbus-1/services
|
|
||||||
service_DATA = org.gnome.Shell.PortalHelper.service
|
|
||||||
|
|
||||||
CLEANFILES += \
|
|
||||||
org.gnome.Shell.PortalHelper.service \
|
|
||||||
org.gnome.Shell.PortalHelper.desktop \
|
|
||||||
$(NULL)
|
|
||||||
|
|
||||||
endif
|
|
||||||
|
|
||||||
%.service: %.service.in
|
|
||||||
$(AM_V_GEN) sed -e "s|@libexecdir[@]|$(libexecdir)|" \
|
|
||||||
$< > $@ || rm $@
|
|
||||||
|
|
||||||
# We substitute in bindir so it works as an autostart
|
|
||||||
# file when built in a non-system prefix
|
|
||||||
%.desktop.in:%.desktop.in.in
|
|
||||||
$(AM_V_GEN) sed -e "s|@bindir[@]|$(bindir)|" \
|
|
||||||
-e "s|@VERSION[@]|$(VERSION)|" \
|
|
||||||
$< > $@ || rm $@
|
|
||||||
|
|
||||||
@INTLTOOL_DESKTOP_RULE@
|
|
||||||
|
|
||||||
introspectiondir = $(datadir)/dbus-1/interfaces
|
|
||||||
introspection_DATA = \
|
|
||||||
org.gnome.Shell.Screencast.xml \
|
|
||||||
org.gnome.Shell.Screenshot.xml \
|
|
||||||
org.gnome.ShellSearchProvider.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)
|
|
||||||
$(AM_V_GEN) $(GLIB_COMPILE_RESOURCES) --target=$@ --sourcedir=$(srcdir)/theme $<
|
|
||||||
resourcedir = $(pkgdatadir)
|
|
||||||
resource_DATA = gnome-shell-theme.gresource
|
|
||||||
|
|
||||||
backgrounddir = $(pkgdatadir)
|
|
||||||
background_DATA = perf-background.xml
|
|
||||||
|
|
||||||
perf-background.xml: perf-background.xml.in
|
|
||||||
$(AM_V_GEN) sed -e "s|@datadir[@]|$(datadir)|" \
|
|
||||||
$< > $@ || rm $@
|
|
||||||
|
|
||||||
keysdir = @GNOME_KEYBINDINGS_KEYSDIR@
|
|
||||||
keys_in_files = 50-gnome-shell-system.xml.in
|
|
||||||
keys_DATA = $(keys_in_files:.xml.in=.xml)
|
|
||||||
|
|
||||||
gsettings_SCHEMAS = org.gnome.shell.gschema.xml
|
|
||||||
|
|
||||||
@INTLTOOL_XML_NOMERGE_RULE@
|
|
||||||
|
|
||||||
%.gschema.xml.in: %.gschema.xml.in.in Makefile
|
|
||||||
$(AM_V_GEN) sed -e 's|@GETTEXT_PACKAGE[@]|$(GETTEXT_PACKAGE)|g' \
|
|
||||||
$< > $@ || rm $@
|
|
||||||
|
|
||||||
@GSETTINGS_RULES@
|
|
||||||
|
|
||||||
# We need to compile schemas at make time
|
|
||||||
# to run from source tree
|
|
||||||
gschemas.compiled: $(gsettings_SCHEMAS:.xml=.valid)
|
|
||||||
$(AM_V_GEN) $(GLIB_COMPILE_SCHEMAS) --targetdir=. .
|
|
||||||
|
|
||||||
all-local: gschemas.compiled
|
|
||||||
|
|
||||||
convertdir = $(datadir)/GConf/gsettings
|
|
||||||
convert_DATA = gnome-shell-overrides.convert
|
|
||||||
|
|
||||||
EXTRA_DIST = \
|
|
||||||
gnome-shell.desktop.in.in \
|
|
||||||
gnome-shell-wayland.desktop.in.in \
|
|
||||||
gnome-shell-extension-prefs.desktop.in.in \
|
|
||||||
$(introspection_DATA) \
|
|
||||||
$(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) \
|
|
||||||
$(NULL)
|
|
||||||
|
|
||||||
CLEANFILES += \
|
|
||||||
gnome-shell.desktop.in \
|
|
||||||
gnome-shell-wayland.desktop.in \
|
|
||||||
gnome-shell-extension-prefs.in \
|
|
||||||
$(desktop_DATA) \
|
|
||||||
$(keys_DATA) \
|
|
||||||
$(gsettings_SCHEMAS) \
|
|
||||||
perf-background.xml \
|
|
||||||
gschemas.compiled \
|
|
||||||
org.gnome.shell.gschema.valid \
|
|
||||||
org.gnome.shell.gschema.xml.in \
|
|
||||||
gnome-shell-theme.gresource \
|
|
||||||
$(NULL)
|
|
@ -1,7 +1,7 @@
|
|||||||
[Desktop Entry]
|
[Desktop Entry]
|
||||||
Type=Application
|
Type=Application
|
||||||
_Name=GNOME Shell Extension Preferences
|
Name=Shell Extensions
|
||||||
_Comment=Configure GNOME Shell Extensions
|
Comment=Configure GNOME Shell Extensions
|
||||||
Exec=@bindir@/gnome-shell-extension-prefs %u
|
Exec=@bindir@/gnome-shell-extension-prefs %u
|
||||||
X-GNOME-Bugzilla-Bugzilla=GNOME
|
X-GNOME-Bugzilla-Bugzilla=GNOME
|
||||||
X-GNOME-Bugzilla-Product=gnome-shell
|
X-GNOME-Bugzilla-Product=gnome-shell
|
||||||
|
@ -9,6 +9,8 @@
|
|||||||
<file>checkbox-off.svg</file>
|
<file>checkbox-off.svg</file>
|
||||||
<file>checkbox.svg</file>
|
<file>checkbox.svg</file>
|
||||||
<file>close-window.svg</file>
|
<file>close-window.svg</file>
|
||||||
|
<file>close-window-active.svg</file>
|
||||||
|
<file>close-window-hover.svg</file>
|
||||||
<file>close.svg</file>
|
<file>close.svg</file>
|
||||||
<file>corner-ripple-ltr.png</file>
|
<file>corner-ripple-ltr.png</file>
|
||||||
<file>corner-ripple-rtl.png</file>
|
<file>corner-ripple-rtl.png</file>
|
||||||
@ -18,10 +20,11 @@
|
|||||||
<file>gnome-shell.css</file>
|
<file>gnome-shell.css</file>
|
||||||
<file>gnome-shell-high-contrast.css</file>
|
<file>gnome-shell-high-contrast.css</file>
|
||||||
<file>logged-in-indicator.svg</file>
|
<file>logged-in-indicator.svg</file>
|
||||||
<file>more-results.svg</file>
|
<file alias="icons/message-indicator-symbolic.svg">message-indicator-symbolic.svg</file>
|
||||||
<file>no-events.svg</file>
|
<file>no-events.svg</file>
|
||||||
<file>no-notifications.svg</file>
|
<file>no-notifications.svg</file>
|
||||||
<file>noise-texture.png</file>
|
<file>noise-texture.png</file>
|
||||||
|
<file>pad-osd.css</file>
|
||||||
<file>page-indicator-active.svg</file>
|
<file>page-indicator-active.svg</file>
|
||||||
<file>page-indicator-inactive.svg</file>
|
<file>page-indicator-inactive.svg</file>
|
||||||
<file>page-indicator-checked.svg</file>
|
<file>page-indicator-checked.svg</file>
|
||||||
@ -32,8 +35,10 @@
|
|||||||
<file>summary-counter.svg</file>
|
<file>summary-counter.svg</file>
|
||||||
<file>toggle-off-us.svg</file>
|
<file>toggle-off-us.svg</file>
|
||||||
<file>toggle-off-intl.svg</file>
|
<file>toggle-off-intl.svg</file>
|
||||||
|
<file>toggle-off-hc.svg</file>
|
||||||
<file>toggle-on-us.svg</file>
|
<file>toggle-on-us.svg</file>
|
||||||
<file>toggle-on-intl.svg</file>
|
<file>toggle-on-intl.svg</file>
|
||||||
|
<file>toggle-on-hc.svg</file>
|
||||||
<file>ws-switch-arrow-up.png</file>
|
<file>ws-switch-arrow-up.png</file>
|
||||||
<file>ws-switch-arrow-down.png</file>
|
<file>ws-switch-arrow-down.png</file>
|
||||||
</gresource>
|
</gresource>
|
||||||
|
@ -1,15 +0,0 @@
|
|||||||
[Desktop Entry]
|
|
||||||
Type=Application
|
|
||||||
_Name=GNOME Shell (wayland compositor)
|
|
||||||
_Comment=Window management and application launching
|
|
||||||
Exec=@bindir@/gnome-shell --wayland --display-server
|
|
||||||
X-GNOME-Bugzilla-Bugzilla=GNOME
|
|
||||||
X-GNOME-Bugzilla-Product=gnome-shell
|
|
||||||
X-GNOME-Bugzilla-Component=general
|
|
||||||
X-GNOME-Bugzilla-Version=@VERSION@
|
|
||||||
Categories=GNOME;GTK;Core;
|
|
||||||
OnlyShowIn=GNOME;
|
|
||||||
NoDisplay=true
|
|
||||||
X-GNOME-Autostart-Phase=DisplayServer
|
|
||||||
X-GNOME-Autostart-Notify=true
|
|
||||||
X-GNOME-AutoRestart=false
|
|
4
data/gnome-shell.portal
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
[portal]
|
||||||
|
DBusName=org.freedesktop.impl.portal.desktop.gnome
|
||||||
|
Interfaces=org.freedesktop.impl.portal.Access
|
||||||
|
UseIn=gnome
|
95
data/meson.build
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
desktop_files = [
|
||||||
|
'org.gnome.Shell.desktop',
|
||||||
|
'gnome-shell-extension-prefs.desktop'
|
||||||
|
]
|
||||||
|
service_files = []
|
||||||
|
|
||||||
|
if have_networkmanager
|
||||||
|
desktop_files += 'org.gnome.Shell.PortalHelper.desktop'
|
||||||
|
service_files += 'org.gnome.Shell.PortalHelper.service'
|
||||||
|
endif
|
||||||
|
|
||||||
|
desktopconf = configuration_data()
|
||||||
|
# We substitute in bindir so it works as an autostart
|
||||||
|
# file when built in a non-system prefix
|
||||||
|
desktopconf.set('bindir', bindir)
|
||||||
|
desktopconf.set('VERSION', meson.project_version())
|
||||||
|
foreach desktop_file : desktop_files
|
||||||
|
i18n.merge_file('desktop',
|
||||||
|
input: configure_file(
|
||||||
|
input: desktop_file + '.in.in',
|
||||||
|
output: desktop_file + '.in',
|
||||||
|
configuration: desktopconf
|
||||||
|
),
|
||||||
|
output: desktop_file,
|
||||||
|
po_dir: '../po',
|
||||||
|
install: true,
|
||||||
|
install_dir: desktopdir,
|
||||||
|
type: 'desktop'
|
||||||
|
)
|
||||||
|
endforeach
|
||||||
|
|
||||||
|
serviceconf = configuration_data()
|
||||||
|
serviceconf.set('libexecdir', libexecdir)
|
||||||
|
foreach service_file : service_files
|
||||||
|
configure_file(
|
||||||
|
input: service_file + '.in',
|
||||||
|
output: service_file,
|
||||||
|
configuration: serviceconf,
|
||||||
|
install_dir: servicedir
|
||||||
|
)
|
||||||
|
endforeach
|
||||||
|
|
||||||
|
|
||||||
|
dbus_interfaces = [
|
||||||
|
'org.gnome.Shell.PadOsd.xml',
|
||||||
|
'org.gnome.Shell.Screencast.xml',
|
||||||
|
'org.gnome.Shell.Screenshot.xml',
|
||||||
|
'org.gnome.ShellSearchProvider.xml',
|
||||||
|
'org.gnome.ShellSearchProvider2.xml'
|
||||||
|
]
|
||||||
|
install_data(dbus_interfaces, install_dir: ifacedir)
|
||||||
|
|
||||||
|
|
||||||
|
subdir('theme')
|
||||||
|
|
||||||
|
theme_resources = gnome.compile_resources(
|
||||||
|
'gnome-shell-theme', 'gnome-shell-theme.gresource.xml',
|
||||||
|
source_dir: 'theme',
|
||||||
|
dependencies: theme_deps,
|
||||||
|
gresource_bundle: true,
|
||||||
|
install: true,
|
||||||
|
install_dir: pkgdatadir
|
||||||
|
)
|
||||||
|
|
||||||
|
perfconf = configuration_data()
|
||||||
|
perfconf.set('datadir', datadir)
|
||||||
|
configure_file(
|
||||||
|
input: 'perf-background.xml.in',
|
||||||
|
output: 'perf-background.xml',
|
||||||
|
configuration: perfconf,
|
||||||
|
install_dir: pkgdatadir
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
install_data('gnome-shell.portal', install_dir: portaldir)
|
||||||
|
install_data('50-gnome-shell-system.xml', install_dir: keysdir)
|
||||||
|
|
||||||
|
|
||||||
|
schemaconf = configuration_data()
|
||||||
|
schemaconf.set('GETTEXT_PACKAGE', meson.project_name())
|
||||||
|
schema = configure_file(
|
||||||
|
input: 'org.gnome.shell.gschema.xml.in',
|
||||||
|
output: 'org.gnome.shell.gschema.xml',
|
||||||
|
configuration: schemaconf,
|
||||||
|
install_dir: schemadir
|
||||||
|
)
|
||||||
|
|
||||||
|
# for unit tests - gnome.compile_schemas() only looks in srcdir
|
||||||
|
custom_target('compile-schemas',
|
||||||
|
input: schema,
|
||||||
|
output: 'gschemas.compiled',
|
||||||
|
command: [find_program('glib-compile-schemas'), meson.current_build_dir()],
|
||||||
|
build_by_default: true)
|
||||||
|
|
||||||
|
install_data('gnome-shell-overrides.convert', install_dir: convertdir)
|
28
data/org.gnome.Shell.PadOsd.xml
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
<!DOCTYPE node PUBLIC
|
||||||
|
'-//freedesktop//DTD D-BUS Object Introspection 1.0//EN'
|
||||||
|
'http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd'>
|
||||||
|
<node>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
org.gnome.Shell.PadOSD:
|
||||||
|
@short_description: Pad OSD interface
|
||||||
|
|
||||||
|
The interface used to show button map OSD on pad devices.
|
||||||
|
-->
|
||||||
|
<interface name='org.gnome.Shell.Wacom.PadOsd'>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Show:
|
||||||
|
@device_node: device node file, usually in /dev/input/...
|
||||||
|
@edition_mode: whether toggling edition mode on when showing
|
||||||
|
|
||||||
|
Shows the pad button map OSD for the requested device, the OSD
|
||||||
|
will be shown according the current device settings (output
|
||||||
|
mapping, left handed mode, ...)
|
||||||
|
-->
|
||||||
|
<method name='Show'>
|
||||||
|
<arg name='device_node' direction='in' type='o'/>
|
||||||
|
<arg name='edition_mode' direction='in' type='b'/>
|
||||||
|
</method>
|
||||||
|
</interface>
|
||||||
|
</node>
|
@ -1,9 +1,10 @@
|
|||||||
[Desktop Entry]
|
[Desktop Entry]
|
||||||
_Name=Network Login
|
Name=Network Login
|
||||||
Type=Application
|
Type=Application
|
||||||
Exec=gapplication launch org.gnome.Shell.PortalHelper
|
Exec=gapplication launch org.gnome.Shell.PortalHelper
|
||||||
DBusActivatable=true
|
DBusActivatable=true
|
||||||
NoDisplay=true
|
NoDisplay=true
|
||||||
|
# Translators: Do NOT translate or transliterate this text (this is an icon file name)!
|
||||||
Icon=network-workgroup
|
Icon=network-workgroup
|
||||||
StartupNotify=true
|
StartupNotify=true
|
||||||
OnlyShowIn=GNOME;
|
OnlyShowIn=GNOME;
|
@ -1,7 +1,7 @@
|
|||||||
[Desktop Entry]
|
[Desktop Entry]
|
||||||
Type=Application
|
Type=Application
|
||||||
_Name=GNOME Shell
|
Name=GNOME Shell
|
||||||
_Comment=Window management and application launching
|
Comment=Window management and application launching
|
||||||
Exec=@bindir@/gnome-shell
|
Exec=@bindir@/gnome-shell
|
||||||
X-GNOME-Bugzilla-Bugzilla=GNOME
|
X-GNOME-Bugzilla-Bugzilla=GNOME
|
||||||
X-GNOME-Bugzilla-Product=gnome-shell
|
X-GNOME-Bugzilla-Product=gnome-shell
|
||||||
@ -10,7 +10,7 @@ X-GNOME-Bugzilla-Version=@VERSION@
|
|||||||
Categories=GNOME;GTK;Core;
|
Categories=GNOME;GTK;Core;
|
||||||
OnlyShowIn=GNOME;
|
OnlyShowIn=GNOME;
|
||||||
NoDisplay=true
|
NoDisplay=true
|
||||||
X-GNOME-Autostart-Phase=WindowManager
|
X-GNOME-Autostart-Phase=DisplayServer
|
||||||
X-GNOME-Provides=panel;windowmanager;
|
X-GNOME-Provides=panel;windowmanager;
|
||||||
X-GNOME-Autostart-Notify=true
|
X-GNOME-Autostart-Notify=true
|
||||||
X-GNOME-AutoRestart=false
|
X-GNOME-AutoRestart=false
|
@ -3,132 +3,139 @@
|
|||||||
gettext-domain="@GETTEXT_PACKAGE@">
|
gettext-domain="@GETTEXT_PACKAGE@">
|
||||||
<key name="development-tools" type="b">
|
<key name="development-tools" type="b">
|
||||||
<default>true</default>
|
<default>true</default>
|
||||||
<_summary>
|
<summary>
|
||||||
Enable internal tools useful for developers and testers from Alt-F2
|
Enable internal tools useful for developers and testers from Alt-F2
|
||||||
</_summary>
|
</summary>
|
||||||
<_description>
|
<description>
|
||||||
Allows access to internal debugging and monitoring tools
|
Allows access to internal debugging and monitoring tools
|
||||||
using the Alt-F2 dialog.
|
using the Alt-F2 dialog.
|
||||||
</_description>
|
</description>
|
||||||
</key>
|
</key>
|
||||||
<key name="enabled-extensions" type="as">
|
<key name="enabled-extensions" type="as">
|
||||||
<default>[]</default>
|
<default>[]</default>
|
||||||
<_summary>UUIDs of extensions to enable</_summary>
|
<summary>UUIDs of extensions to enable</summary>
|
||||||
<_description>
|
<description>
|
||||||
GNOME Shell extensions have a UUID property; this key lists extensions
|
GNOME Shell extensions have a UUID property; this key lists extensions
|
||||||
which should be loaded. Any extension that wants to be loaded needs
|
which should be loaded. Any extension that wants to be loaded needs
|
||||||
to be in this list. You can also manipulate this list with the
|
to be in this list. You can also manipulate this list with the
|
||||||
EnableExtension and DisableExtension D-Bus methods on org.gnome.Shell.
|
EnableExtension and DisableExtension D-Bus methods on org.gnome.Shell.
|
||||||
</_description>
|
</description>
|
||||||
|
</key>
|
||||||
|
<key name="disable-user-extensions" type="b">
|
||||||
|
<default>false</default>
|
||||||
|
<summary>Disable user extensions</summary>
|
||||||
|
<description>
|
||||||
|
Disable all extensions the user has enabled without affecting
|
||||||
|
the “enabled-extension” setting.
|
||||||
|
</description>
|
||||||
</key>
|
</key>
|
||||||
<key name="disable-extension-version-validation" type="b">
|
<key name="disable-extension-version-validation" type="b">
|
||||||
<default>false</default>
|
<default>true</default>
|
||||||
<_summary>Disables the validation of extension version compatibility</_summary>
|
<summary>Disables the validation of extension version compatibility</summary>
|
||||||
<_description>
|
<description>
|
||||||
GNOME Shell will only load extensions that claim to support the current
|
GNOME Shell will only load extensions that claim to support the current
|
||||||
running version. Enabling this option will disable this check and try to
|
running version. Enabling this option will disable this check and try to
|
||||||
load all extensions regardless of the versions they claim to support.
|
load all extensions regardless of the versions they claim to support.
|
||||||
</_description>
|
</description>
|
||||||
</key>
|
</key>
|
||||||
<key name="favorite-apps" type="as">
|
<key name="favorite-apps" type="as">
|
||||||
<default>[ 'epiphany.desktop', 'evolution.desktop', 'rhythmbox.desktop', 'shotwell.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.Software.desktop' ]</default>
|
<default>[ 'epiphany.desktop', 'evolution.desktop', 'rhythmbox.desktop', 'shotwell.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.Software.desktop' ]</default>
|
||||||
<_summary>List of desktop file IDs for favorite applications</_summary>
|
<summary>List of desktop file IDs for favorite applications</summary>
|
||||||
<_description>
|
<description>
|
||||||
The applications corresponding to these identifiers
|
The applications corresponding to these identifiers
|
||||||
will be displayed in the favorites area.
|
will be displayed in the favorites area.
|
||||||
</_description>
|
</description>
|
||||||
</key>
|
</key>
|
||||||
<key name="app-picker-view" type="u">
|
<key name="app-picker-view" type="u">
|
||||||
<default>0</default>
|
<default>0</default>
|
||||||
<_summary>App Picker View</_summary>
|
<summary>App Picker View</summary>
|
||||||
<_description>
|
<description>
|
||||||
Index of the currently selected view in the application picker.
|
Index of the currently selected view in the application picker.
|
||||||
</_description>
|
</description>
|
||||||
</key>
|
</key>
|
||||||
<key name="command-history" type="as">
|
<key name="command-history" type="as">
|
||||||
<default>[]</default>
|
<default>[]</default>
|
||||||
<_summary>History for command (Alt-F2) dialog</_summary>
|
<summary>History for command (Alt-F2) dialog</summary>
|
||||||
</key>
|
</key>
|
||||||
<key name="looking-glass-history" type="as">
|
<key name="looking-glass-history" type="as">
|
||||||
<default>[]</default>
|
<default>[]</default>
|
||||||
<_summary>History for the looking glass dialog</_summary>
|
<!-- Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass -->
|
||||||
|
<summary>History for the looking glass dialog</summary>
|
||||||
</key>
|
</key>
|
||||||
<key name="always-show-log-out" type="b">
|
<key name="always-show-log-out" type="b">
|
||||||
<default>false</default>
|
<default>false</default>
|
||||||
<_summary>Always show the 'Log out' menu item in the user menu.</_summary>
|
<summary>Always show the “Log out” menu item in the user menu.</summary>
|
||||||
<_description>
|
<description>
|
||||||
This key overrides the automatic hiding of the 'Log out'
|
This key overrides the automatic hiding of the “Log out”
|
||||||
menu item in single-user, single-session situations.
|
menu item in single-user, single-session situations.
|
||||||
</_description>
|
</description>
|
||||||
</key>
|
</key>
|
||||||
<key name="remember-mount-password" type="b">
|
<key name="remember-mount-password" type="b">
|
||||||
<default>false</default>
|
<default>false</default>
|
||||||
<_summary>Whether to remember password for mounting encrypted or remote filesystems</_summary>
|
<summary>Whether to remember password for mounting encrypted or remote filesystems</summary>
|
||||||
<_description>
|
<description>
|
||||||
The shell will request a password when an encrypted device or a
|
The shell will request a password when an encrypted device or a
|
||||||
remote filesystem is mounted. If the password can be saved for
|
remote filesystem is mounted. If the password can be saved for
|
||||||
future use a 'Remember Password' checkbox will be present.
|
future use a “Remember Password” checkbox will be present.
|
||||||
This key sets the default state of the checkbox.
|
This key sets the default state of the checkbox.
|
||||||
</_description>
|
</description>
|
||||||
|
</key>
|
||||||
|
<key name="had-bluetooth-devices-setup" type="b">
|
||||||
|
<default>false</default>
|
||||||
|
<summary>Whether the default Bluetooth adapter had set up devices associated to it</summary>
|
||||||
|
<description>
|
||||||
|
The shell will only show a Bluetooth menu item if a Bluetooth
|
||||||
|
adapter is powered, or if there were devices set up associated
|
||||||
|
with the default adapter. This will be reset if the default
|
||||||
|
adapter is ever seen not to have devices associated to it.
|
||||||
|
</description>
|
||||||
</key>
|
</key>
|
||||||
<child name="calendar" schema="org.gnome.shell.calendar"/>
|
|
||||||
<child name="keybindings" schema="org.gnome.shell.keybindings"/>
|
<child name="keybindings" schema="org.gnome.shell.keybindings"/>
|
||||||
<child name="keyboard" schema="org.gnome.shell.keyboard"/>
|
<child name="keyboard" schema="org.gnome.shell.keyboard"/>
|
||||||
</schema>
|
</schema>
|
||||||
|
|
||||||
<schema id="org.gnome.shell.calendar" path="/org/gnome/shell/calendar/"
|
|
||||||
gettext-domain="@GETTEXT_PACKAGE@">
|
|
||||||
<key name="show-weekdate" type="b">
|
|
||||||
<default>false</default>
|
|
||||||
<_summary>Show the week date in the calendar</_summary>
|
|
||||||
<_description>
|
|
||||||
If true, display the ISO week date in the calendar.
|
|
||||||
</_description>
|
|
||||||
</key>
|
|
||||||
</schema>
|
|
||||||
|
|
||||||
<schema id="org.gnome.shell.keybindings" path="/org/gnome/shell/keybindings/"
|
<schema id="org.gnome.shell.keybindings" path="/org/gnome/shell/keybindings/"
|
||||||
gettext-domain="@GETTEXT_PACKAGE@">
|
gettext-domain="@GETTEXT_PACKAGE@">
|
||||||
<key name="open-application-menu" type="as">
|
<key name="open-application-menu" type="as">
|
||||||
<default>["<Super>F10"]</default>
|
<default>["<Super>F10"]</default>
|
||||||
<_summary>Keybinding to open the application menu</_summary>
|
<summary>Keybinding to open the application menu</summary>
|
||||||
<_description>
|
<description>
|
||||||
Keybinding to open the application menu.
|
Keybinding to open the application menu.
|
||||||
</_description>
|
</description>
|
||||||
</key>
|
</key>
|
||||||
<key name="toggle-application-view" type="as">
|
<key name="toggle-application-view" type="as">
|
||||||
<default>["<Super>a"]</default>
|
<default>["<Super>a"]</default>
|
||||||
<_summary>Keybinding to open the "Show Applications" view</_summary>
|
<summary>Keybinding to open the “Show Applications” view</summary>
|
||||||
<_description>
|
<description>
|
||||||
Keybinding to open the "Show Applications" view of the Activities
|
Keybinding to open the “Show Applications” view of the Activities
|
||||||
Overview.
|
Overview.
|
||||||
</_description>
|
</description>
|
||||||
</key>
|
</key>
|
||||||
<key name="toggle-overview" type="as">
|
<key name="toggle-overview" type="as">
|
||||||
<default>["<Super>s"]</default>
|
<default>["<Super>s"]</default>
|
||||||
<_summary>Keybinding to open the overview</_summary>
|
<summary>Keybinding to open the overview</summary>
|
||||||
<_description>
|
<description>
|
||||||
Keybinding to open the Activities Overview.
|
Keybinding to open the Activities Overview.
|
||||||
</_description>
|
</description>
|
||||||
</key>
|
</key>
|
||||||
<key name="toggle-message-tray" type="as">
|
<key name="toggle-message-tray" type="as">
|
||||||
<default>["<Super>v","<Super>m"]</default>
|
<default>["<Super>v","<Super>m"]</default>
|
||||||
<_summary>Keybinding to toggle the visibility of the notification list</_summary>
|
<summary>Keybinding to toggle the visibility of the notification list</summary>
|
||||||
<_description>
|
<description>
|
||||||
Keybinding to toggle the visibility of the notification list.
|
Keybinding to toggle the visibility of the notification list.
|
||||||
</_description>
|
</description>
|
||||||
</key>
|
</key>
|
||||||
<key name="focus-active-notification" type="as">
|
<key name="focus-active-notification" type="as">
|
||||||
<default>["<Super>n"]</default>
|
<default>["<Super>n"]</default>
|
||||||
<_summary>Keybinding to focus the active notification</_summary>
|
<summary>Keybinding to focus the active notification</summary>
|
||||||
<_description>
|
<description>
|
||||||
Keybinding to focus the active notification.
|
Keybinding to focus the active notification.
|
||||||
</_description>
|
</description>
|
||||||
</key>
|
</key>
|
||||||
<key name="pause-resume-tweens" type="as">
|
<key name="pause-resume-tweens" type="as">
|
||||||
<default>[]</default>
|
<default>[]</default>
|
||||||
<_summary>Keybinding that pauses and resumes all running tweens, for debugging purposes</_summary>
|
<summary>Keybinding that pauses and resumes all running tweens, for debugging purposes</summary>
|
||||||
<_description></_description>
|
<description></description>
|
||||||
</key>
|
</key>
|
||||||
</schema>
|
</schema>
|
||||||
|
|
||||||
@ -136,10 +143,10 @@
|
|||||||
gettext-domain="@GETTEXT_PACKAGE@">
|
gettext-domain="@GETTEXT_PACKAGE@">
|
||||||
<key name="keyboard-type" type="s">
|
<key name="keyboard-type" type="s">
|
||||||
<default>'touch'</default>
|
<default>'touch'</default>
|
||||||
<_summary>Which keyboard to use</_summary>
|
<summary>Which keyboard to use</summary>
|
||||||
<_description>
|
<description>
|
||||||
The type of keyboard to use.
|
The type of keyboard to use.
|
||||||
</_description>
|
</description>
|
||||||
</key>
|
</key>
|
||||||
</schema>
|
</schema>
|
||||||
|
|
||||||
@ -148,11 +155,11 @@
|
|||||||
gettext-domain="@GETTEXT_PACKAGE@">
|
gettext-domain="@GETTEXT_PACKAGE@">
|
||||||
<key type="b" name="current-workspace-only">
|
<key type="b" name="current-workspace-only">
|
||||||
<default>false</default>
|
<default>false</default>
|
||||||
<_summary>Limit switcher to current workspace.</_summary>
|
<summary>Limit switcher to current workspace.</summary>
|
||||||
<_description>
|
<description>
|
||||||
If true, only applications that have windows on the current workspace are shown in the switcher.
|
If true, only applications that have windows on the current workspace are shown in the switcher.
|
||||||
Otherwise, all applications are included.
|
Otherwise, all applications are included.
|
||||||
</_description>
|
</description>
|
||||||
</key>
|
</key>
|
||||||
</schema>
|
</schema>
|
||||||
|
|
||||||
@ -166,20 +173,20 @@
|
|||||||
gettext-domain="@GETTEXT_PACKAGE@">
|
gettext-domain="@GETTEXT_PACKAGE@">
|
||||||
<key name="app-icon-mode" enum="org.gnome.shell.window-switcher.AppIconMode">
|
<key name="app-icon-mode" enum="org.gnome.shell.window-switcher.AppIconMode">
|
||||||
<default>'both'</default>
|
<default>'both'</default>
|
||||||
<_summary>The application icon mode.</_summary>
|
<summary>The application icon mode.</summary>
|
||||||
<_description>
|
<description>
|
||||||
Configures how the windows are shown in the switcher. Valid possibilities
|
Configures how the windows are shown in the switcher. Valid possibilities
|
||||||
are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-only'
|
are “thumbnail-only” (shows a thumbnail of the window), “app-icon-only”
|
||||||
(shows only the application icon) or 'both'.
|
(shows only the application icon) or “both”.
|
||||||
</_description>
|
</description>
|
||||||
</key>
|
</key>
|
||||||
<key type="b" name="current-workspace-only">
|
<key type="b" name="current-workspace-only">
|
||||||
<default>true</default>
|
<default>true</default>
|
||||||
<_summary>Limit switcher to current workspace.</_summary>
|
<summary>Limit switcher to current workspace.</summary>
|
||||||
<_description>
|
<description>
|
||||||
If true, only windows from the current workspace are shown in the switcher.
|
If true, only windows from the current workspace are shown in the switcher.
|
||||||
Otherwise, all windows are included.
|
Otherwise, all windows are included.
|
||||||
</_description>
|
</description>
|
||||||
</key>
|
</key>
|
||||||
</schema>
|
</schema>
|
||||||
|
|
||||||
@ -187,43 +194,43 @@
|
|||||||
gettext-domain="@GETTEXT_PACKAGE@">
|
gettext-domain="@GETTEXT_PACKAGE@">
|
||||||
<key name="attach-modal-dialogs" type="b">
|
<key name="attach-modal-dialogs" type="b">
|
||||||
<default>true</default>
|
<default>true</default>
|
||||||
<_summary>Attach modal dialog to the parent window</_summary>
|
<summary>Attach modal dialog to the parent window</summary>
|
||||||
<_description>
|
<description>
|
||||||
This key overrides the key in org.gnome.mutter when running
|
This key overrides the key in org.gnome.mutter when running
|
||||||
GNOME Shell.
|
GNOME Shell.
|
||||||
</_description>
|
</description>
|
||||||
</key>
|
</key>
|
||||||
|
|
||||||
<key name="edge-tiling" type="b">
|
<key name="edge-tiling" type="b">
|
||||||
<default>true</default>
|
<default>true</default>
|
||||||
<_summary>Enable edge tiling when dropping windows on screen edges</_summary>
|
<summary>Enable edge tiling when dropping windows on screen edges</summary>
|
||||||
<_description>
|
<description>
|
||||||
This key overrides the key in org.gnome.mutter when running GNOME Shell.
|
This key overrides the key in org.gnome.mutter when running GNOME Shell.
|
||||||
</_description>
|
</description>
|
||||||
</key>
|
</key>
|
||||||
|
|
||||||
<key name="dynamic-workspaces" type="b">
|
<key name="dynamic-workspaces" type="b">
|
||||||
<default>true</default>
|
<default>true</default>
|
||||||
<_summary>Workspaces are managed dynamically</_summary>
|
<summary>Workspaces are managed dynamically</summary>
|
||||||
<_description>
|
<description>
|
||||||
This key overrides the key in org.gnome.mutter when running GNOME Shell.
|
This key overrides the key in org.gnome.mutter when running GNOME Shell.
|
||||||
</_description>
|
</description>
|
||||||
</key>
|
</key>
|
||||||
|
|
||||||
<key name="workspaces-only-on-primary" type="b">
|
<key name="workspaces-only-on-primary" type="b">
|
||||||
<default>true</default>
|
<default>true</default>
|
||||||
<_summary>Workspaces only on primary monitor</_summary>
|
<summary>Workspaces only on primary monitor</summary>
|
||||||
<_description>
|
<description>
|
||||||
This key overrides the key in org.gnome.mutter when running GNOME Shell.
|
This key overrides the key in org.gnome.mutter when running GNOME Shell.
|
||||||
</_description>
|
</description>
|
||||||
</key>
|
</key>
|
||||||
|
|
||||||
<key name="focus-change-on-pointer-rest" type="b">
|
<key name="focus-change-on-pointer-rest" type="b">
|
||||||
<default>true</default>
|
<default>true</default>
|
||||||
<_summary>Delay focus changes in mouse mode until the pointer stops moving</_summary>
|
<summary>Delay focus changes in mouse mode until the pointer stops moving</summary>
|
||||||
<_description>
|
<description>
|
||||||
This key overrides the key in org.gnome.mutter when running GNOME Shell.
|
This key overrides the key in org.gnome.mutter when running GNOME Shell.
|
||||||
</_description>
|
</description>
|
||||||
</key>
|
</key>
|
||||||
</schema>
|
</schema>
|
||||||
</schemalist>
|
</schemalist>
|
@ -1 +0,0 @@
|
|||||||
gem "sass", "~> 3.4.0"
|
|
@ -3,10 +3,10 @@ Summary
|
|||||||
|
|
||||||
* Do not edit the CSS directly, edit the source SCSS files and process them with SASS (running
|
* 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;
|
`make` should do that when you have the required software installed, as described below;
|
||||||
run `/.parse-sass.sh` manually if it doesn't)
|
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.
|
* Most SASS preprocessors should produce similar results, however the build system
|
||||||
On Fedora F20, this is done with `sudo dnf install rubygems && gem install bundle && bundle install`
|
integration and 'parse-sass.sh' script use sassc. You should be able to install
|
||||||
from the same directory this README resides in.
|
it with `pkcon install sassc` or your distribution's package manager.
|
||||||
|
|
||||||
How to tweak the theme
|
How to tweak the theme
|
||||||
----------------------
|
----------------------
|
||||||
@ -31,6 +31,4 @@ _common.scss - actual definitions of style for each widget. This is where
|
|||||||
your changes.
|
your changes.
|
||||||
|
|
||||||
You can read about SASS at http://sass-lang.com/documentation/. Once you make your changes to the
|
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
|
_common.scss file, you can either run make or the ./parse-sass.sh script.
|
||||||
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`.
|
|
||||||
|
@ -10,11 +10,11 @@
|
|||||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
width="29"
|
width="24"
|
||||||
height="29"
|
height="24"
|
||||||
id="svg10621"
|
id="svg10621"
|
||||||
version="1.1"
|
version="1.1"
|
||||||
inkscape:version="0.48.2 r9819"
|
inkscape:version="0.91 r13725"
|
||||||
sodipodi:docname="calendar-today.svg">
|
sodipodi:docname="calendar-today.svg">
|
||||||
<defs
|
<defs
|
||||||
id="defs10623">
|
id="defs10623">
|
||||||
@ -118,17 +118,6 @@
|
|||||||
fx="51"
|
fx="51"
|
||||||
fy="30"
|
fy="30"
|
||||||
r="42" />
|
r="42" />
|
||||||
<radialGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient34508-1-3"
|
|
||||||
id="radialGradient3113"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
gradientTransform="matrix(0.72146227,0,0,0.27484277,14.205424,21.754717)"
|
|
||||||
cx="51"
|
|
||||||
cy="30"
|
|
||||||
fx="51"
|
|
||||||
fy="30"
|
|
||||||
r="42" />
|
|
||||||
</defs>
|
</defs>
|
||||||
<sodipodi:namedview
|
<sodipodi:namedview
|
||||||
id="base"
|
id="base"
|
||||||
@ -137,22 +126,23 @@
|
|||||||
borderopacity="1.0"
|
borderopacity="1.0"
|
||||||
inkscape:pageopacity="0"
|
inkscape:pageopacity="0"
|
||||||
inkscape:pageshadow="2"
|
inkscape:pageshadow="2"
|
||||||
inkscape:zoom="15.839192"
|
inkscape:zoom="8"
|
||||||
inkscape:cx="20.652108"
|
inkscape:cx="-23.537329"
|
||||||
inkscape:cy="11.839084"
|
inkscape:cy="-31.442864"
|
||||||
inkscape:document-units="px"
|
inkscape:document-units="px"
|
||||||
inkscape:current-layer="layer1"
|
inkscape:current-layer="layer1"
|
||||||
showgrid="true"
|
showgrid="false"
|
||||||
fit-margin-top="0"
|
fit-margin-top="0"
|
||||||
fit-margin-left="0"
|
fit-margin-left="0"
|
||||||
fit-margin-right="0"
|
fit-margin-right="0"
|
||||||
fit-margin-bottom="0"
|
fit-margin-bottom="0"
|
||||||
inkscape:window-width="1280"
|
inkscape:window-width="2133"
|
||||||
inkscape:window-height="741"
|
inkscape:window-height="1241"
|
||||||
inkscape:window-x="0"
|
inkscape:window-x="238"
|
||||||
inkscape:window-y="27"
|
inkscape:window-y="88"
|
||||||
inkscape:window-maximized="1"
|
inkscape:window-maximized="0"
|
||||||
borderlayer="true">
|
borderlayer="true"
|
||||||
|
inkscape:showpageshadow="false">
|
||||||
<inkscape:grid
|
<inkscape:grid
|
||||||
type="xygrid"
|
type="xygrid"
|
||||||
id="grid3109"
|
id="grid3109"
|
||||||
@ -169,7 +159,7 @@
|
|||||||
<dc:format>image/svg+xml</dc:format>
|
<dc:format>image/svg+xml</dc:format>
|
||||||
<dc:type
|
<dc:type
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
<dc:title />
|
<dc:title></dc:title>
|
||||||
</cc:Work>
|
</cc:Work>
|
||||||
</rdf:RDF>
|
</rdf:RDF>
|
||||||
</metadata>
|
</metadata>
|
||||||
@ -177,28 +167,12 @@
|
|||||||
inkscape:label="Layer 1"
|
inkscape:label="Layer 1"
|
||||||
inkscape:groupmode="layer"
|
inkscape:groupmode="layer"
|
||||||
id="layer1"
|
id="layer1"
|
||||||
transform="translate(-469.08263,-532.99307)">
|
transform="translate(-469.08263,-537.99307)">
|
||||||
<path
|
<circle
|
||||||
sodipodi:type="arc"
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:0.23756906;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
style="opacity:0.4625;color:#000000;fill:url(#radialGradient3113);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
id="path7305"
|
||||||
id="path34506-3"
|
cx="481.57138"
|
||||||
sodipodi:cx="51"
|
cy="559.4649"
|
||||||
sodipodi:cy="30"
|
r="1.5" />
|
||||||
sodipodi:rx="42"
|
|
||||||
sodipodi:ry="16"
|
|
||||||
d="M 9,29.999999 A 42,16 0 0 1 93,30 l -42,0 z"
|
|
||||||
sodipodi:start="3.1415927"
|
|
||||||
sodipodi:end="6.2831853"
|
|
||||||
transform="matrix(0.43692393,0,0,1.3783114,461.29951,517.6437)"
|
|
||||||
inkscape:export-filename="/home/jimmac/src/cvs/gnome/gnome-shell-design/mockups/motion/textures/panel.png"
|
|
||||||
inkscape:export-xdpi="90"
|
|
||||||
inkscape:export-ydpi="90" />
|
|
||||||
<rect
|
|
||||||
style="fill:#ffffff;fill-opacity:0.50196078;stroke-width:0.43599999;stroke-miterlimit:4;stroke-dasharray:none"
|
|
||||||
id="rect2996"
|
|
||||||
width="31"
|
|
||||||
height="3"
|
|
||||||
x="468.08264"
|
|
||||||
y="558.99304" />
|
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
Before Width: | Height: | Size: 6.1 KiB After Width: | Height: | Size: 5.6 KiB |
81
data/theme/close-window-active.svg
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
|
||||||
|
|
||||||
|
<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"
|
||||||
|
version="1.0"
|
||||||
|
id="Foreground"
|
||||||
|
x="0px"
|
||||||
|
y="0px"
|
||||||
|
width="32"
|
||||||
|
height="32"
|
||||||
|
viewBox="0 0 32 32"
|
||||||
|
enable-background="new 0 0 16 16"
|
||||||
|
xml:space="preserve"
|
||||||
|
sodipodi:version="0.32"
|
||||||
|
inkscape:version="0.92.2 5c3e80d, 2017-08-06"
|
||||||
|
sodipodi:docname="close-window-active.svg"
|
||||||
|
inkscape:output_extension="org.inkscape.output.svg.inkscape"><metadata
|
||||||
|
id="metadata2399"><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><defs
|
||||||
|
id="defs2397"><linearGradient
|
||||||
|
id="linearGradient3173"><stop
|
||||||
|
style="stop-color:#c4c4c4;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop3175" /><stop
|
||||||
|
style="stop-color:#ffffff;stop-opacity:1;"
|
||||||
|
offset="1"
|
||||||
|
id="stop3177" /></linearGradient><inkscape:perspective
|
||||||
|
sodipodi:type="inkscape:persp3d"
|
||||||
|
inkscape:vp_x="0 : 11 : 1"
|
||||||
|
inkscape:vp_y="0 : 1375 : 0"
|
||||||
|
inkscape:vp_z="22 : 11 : 1"
|
||||||
|
inkscape:persp3d-origin="11 : 7.3333334 : 1"
|
||||||
|
id="perspective2401" /></defs><sodipodi:namedview
|
||||||
|
inkscape:window-height="1106"
|
||||||
|
inkscape:window-width="1700"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
guidetolerance="10.0"
|
||||||
|
gridtolerance="10.0"
|
||||||
|
objecttolerance="10.0"
|
||||||
|
borderopacity="1.0"
|
||||||
|
bordercolor="#666666"
|
||||||
|
pagecolor="#797979"
|
||||||
|
id="base"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="4"
|
||||||
|
inkscape:cx="28.483745"
|
||||||
|
inkscape:cy="67.714004"
|
||||||
|
inkscape:window-x="1427"
|
||||||
|
inkscape:window-y="127"
|
||||||
|
inkscape:current-layer="Foreground"
|
||||||
|
showguides="true"
|
||||||
|
inkscape:guide-bbox="true"
|
||||||
|
borderlayer="true"
|
||||||
|
inkscape:showpageshadow="false"
|
||||||
|
inkscape:window-maximized="0"
|
||||||
|
inkscape:document-rotation="0"><inkscape:grid
|
||||||
|
type="xygrid"
|
||||||
|
id="grid11246"
|
||||||
|
empspacing="32"
|
||||||
|
visible="true"
|
||||||
|
enabled="true"
|
||||||
|
snapvisiblegridlinesonly="true" /></sodipodi:namedview><path
|
||||||
|
d="m 4.4362021,16 c 0,-6.410121 5.1728276,-11.60728 11.5529359,-11.60728 6.380109,0 11.552937,5.197159 11.552937,11.60728 0,6.410122 -5.172828,11.607281 -11.552937,11.607281 C 9.6090297,27.607281 4.4362021,22.410122 4.4362021,16 Z"
|
||||||
|
id="path883"
|
||||||
|
style="color:#000000;clip-rule:evenodd;display:inline;overflow:visible;visibility:visible;fill:#a5c8ec;fill-opacity:1;fill-rule:nonzero;stroke:#2975c4;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
|
||||||
|
sodipodi:nodetypes="csssc"
|
||||||
|
inkscape:connector-curvature="0" /><path
|
||||||
|
d="m 11.718386,11.764547 h 1.055207 c 0.01091,-1.26e-4 0.02193,-4.86e-4 0.03298,0 0.269026,0.01183 0.538019,0.135679 0.725455,0.329752 l 2.407192,2.407192 2.440166,-2.407192 c 0.28029,-0.243226 0.471333,-0.322366 0.725455,-0.329752 h 1.055207 v 1.055208 c 0,0.302285 -0.03623,0.581049 -0.263801,0.791405 l -2.407191,2.407191 2.374217,2.374216 c 0.198577,0.198559 0.296768,0.478484 0.296775,0.758432 v 1.055206 h -1.055211 c -0.279947,-10e-6 -0.559877,-0.09824 -0.75843,-0.296777 l -2.407192,-2.407192 -2.407192,2.407192 c -0.198551,0.198579 -0.478493,0.296777 -0.758429,0.296777 H 11.71839 v -1.055206 c -3e-6,-0.279936 0.0982,-0.559873 0.296777,-0.758432 L 14.422359,16.018351 12.015167,13.61116 C 11.79279,13.405784 11.69527,13.116003 11.71839,12.819755 Z"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path887"
|
||||||
|
style="color:#bebebe;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:'Andale Mono';-inkscape-font-specification:'Andale Mono';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#4a90d9;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.87958801;marker:none;enable-background:new"
|
||||||
|
sodipodi:nodetypes="ccsccccccccccccccccccccccc" /></svg>
|
After Width: | Height: | Size: 4.6 KiB |
81
data/theme/close-window-hover.svg
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
|
||||||
|
|
||||||
|
<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"
|
||||||
|
version="1.0"
|
||||||
|
id="Foreground"
|
||||||
|
x="0px"
|
||||||
|
y="0px"
|
||||||
|
width="32"
|
||||||
|
height="32"
|
||||||
|
viewBox="0 0 32 32"
|
||||||
|
enable-background="new 0 0 16 16"
|
||||||
|
xml:space="preserve"
|
||||||
|
sodipodi:version="0.32"
|
||||||
|
inkscape:version="0.92.2 5c3e80d, 2017-08-06"
|
||||||
|
sodipodi:docname="close-window-hover.svg"
|
||||||
|
inkscape:output_extension="org.inkscape.output.svg.inkscape"><metadata
|
||||||
|
id="metadata2399"><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 /></cc:Work></rdf:RDF></metadata><defs
|
||||||
|
id="defs2397"><linearGradient
|
||||||
|
id="linearGradient3173"><stop
|
||||||
|
style="stop-color:#c4c4c4;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop3175" /><stop
|
||||||
|
style="stop-color:#ffffff;stop-opacity:1;"
|
||||||
|
offset="1"
|
||||||
|
id="stop3177" /></linearGradient><inkscape:perspective
|
||||||
|
sodipodi:type="inkscape:persp3d"
|
||||||
|
inkscape:vp_x="0 : 11 : 1"
|
||||||
|
inkscape:vp_y="0 : 1375 : 0"
|
||||||
|
inkscape:vp_z="22 : 11 : 1"
|
||||||
|
inkscape:persp3d-origin="11 : 7.3333334 : 1"
|
||||||
|
id="perspective2401" /></defs><sodipodi:namedview
|
||||||
|
inkscape:window-height="1106"
|
||||||
|
inkscape:window-width="1700"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
guidetolerance="10.0"
|
||||||
|
gridtolerance="10.0"
|
||||||
|
objecttolerance="10.0"
|
||||||
|
borderopacity="1.0"
|
||||||
|
bordercolor="#666666"
|
||||||
|
pagecolor="#797979"
|
||||||
|
id="base"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="4"
|
||||||
|
inkscape:cx="28.483745"
|
||||||
|
inkscape:cy="67.714004"
|
||||||
|
inkscape:window-x="1427"
|
||||||
|
inkscape:window-y="127"
|
||||||
|
inkscape:current-layer="Foreground"
|
||||||
|
showguides="true"
|
||||||
|
inkscape:guide-bbox="true"
|
||||||
|
borderlayer="true"
|
||||||
|
inkscape:showpageshadow="false"
|
||||||
|
inkscape:window-maximized="0"
|
||||||
|
inkscape:document-rotation="0"><inkscape:grid
|
||||||
|
type="xygrid"
|
||||||
|
id="grid11246"
|
||||||
|
empspacing="32"
|
||||||
|
visible="true"
|
||||||
|
enabled="true"
|
||||||
|
snapvisiblegridlinesonly="true" /></sodipodi:namedview><path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="csssc"
|
||||||
|
style="color:#000000;clip-rule:evenodd;display:inline;overflow:visible;visibility:visible;fill:#2975c4;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
|
||||||
|
id="path822"
|
||||||
|
d="m 4.4362021,16 c 0,-6.410121 5.1728276,-11.60728 11.5529359,-11.60728 6.380109,0 11.552937,5.197159 11.552937,11.60728 0,6.410122 -5.172828,11.607281 -11.552937,11.607281 C 9.6090297,27.607281 4.4362021,22.410122 4.4362021,16 Z" /><path
|
||||||
|
sodipodi:nodetypes="ccsccccccccccccccccccccccc"
|
||||||
|
style="color:#bebebe;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:'Andale Mono';-inkscape-font-specification:'Andale Mono';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.87958801;marker:none;enable-background:new"
|
||||||
|
id="path826"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
d="m 11.718386,11.764547 h 1.055207 c 0.01091,-1.26e-4 0.02193,-4.86e-4 0.03298,0 0.269026,0.01183 0.538019,0.135679 0.725455,0.329752 l 2.407192,2.407192 2.440166,-2.407192 c 0.28029,-0.243226 0.471333,-0.322366 0.725455,-0.329752 h 1.055207 v 1.055208 c 0,0.302285 -0.03623,0.581049 -0.263801,0.791405 l -2.407191,2.407191 2.374217,2.374216 c 0.198577,0.198559 0.296768,0.478484 0.296775,0.758432 v 1.055206 h -1.055211 c -0.279947,-10e-6 -0.559877,-0.09824 -0.75843,-0.296777 l -2.407192,-2.407192 -2.407192,2.407192 c -0.198551,0.198579 -0.478493,0.296777 -0.758429,0.296777 H 11.71839 v -1.055206 c -3e-6,-0.279936 0.0982,-0.559873 0.296777,-0.758432 L 14.422359,16.018351 12.015167,13.61116 C 11.79279,13.405784 11.69527,13.116003 11.71839,12.819755 Z" /></svg>
|
After Width: | Height: | Size: 4.6 KiB |
@ -7,7 +7,6 @@
|
|||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
version="1.0"
|
version="1.0"
|
||||||
@ -16,16 +15,16 @@
|
|||||||
y="0px"
|
y="0px"
|
||||||
width="32"
|
width="32"
|
||||||
height="32"
|
height="32"
|
||||||
viewBox="0 0 23.272727 23.272727"
|
viewBox="0 0 32 32"
|
||||||
enable-background="new 0 0 16 16"
|
enable-background="new 0 0 16 16"
|
||||||
xml:space="preserve"
|
xml:space="preserve"
|
||||||
sodipodi:version="0.32"
|
sodipodi:version="0.32"
|
||||||
inkscape:version="0.48+devel r10081 custom"
|
inkscape:version="0.92.2 5c3e80d, 2017-08-06"
|
||||||
sodipodi:docname="close-window.svg"
|
sodipodi:docname="close-window.svg"
|
||||||
inkscape:output_extension="org.inkscape.output.svg.inkscape"><metadata
|
inkscape:output_extension="org.inkscape.output.svg.inkscape"><metadata
|
||||||
id="metadata2399"><rdf:RDF><cc:Work
|
id="metadata2399"><rdf:RDF><cc:Work
|
||||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
|
||||||
id="defs2397"><linearGradient
|
id="defs2397"><linearGradient
|
||||||
id="linearGradient3173"><stop
|
id="linearGradient3173"><stop
|
||||||
style="stop-color:#c4c4c4;stop-opacity:1;"
|
style="stop-color:#c4c4c4;stop-opacity:1;"
|
||||||
@ -35,51 +34,13 @@
|
|||||||
offset="1"
|
offset="1"
|
||||||
id="stop3177" /></linearGradient><inkscape:perspective
|
id="stop3177" /></linearGradient><inkscape:perspective
|
||||||
sodipodi:type="inkscape:persp3d"
|
sodipodi:type="inkscape:persp3d"
|
||||||
inkscape:vp_x="0 : 8 : 1"
|
inkscape:vp_x="0 : 11 : 1"
|
||||||
inkscape:vp_y="0 : 1000 : 0"
|
inkscape:vp_y="0 : 1375 : 0"
|
||||||
inkscape:vp_z="16 : 8 : 1"
|
inkscape:vp_z="22 : 11 : 1"
|
||||||
inkscape:persp3d-origin="8 : 5.3333333 : 1"
|
inkscape:persp3d-origin="11 : 7.3333334 : 1"
|
||||||
id="perspective2401" /><filter
|
id="perspective2401" /></defs><sodipodi:namedview
|
||||||
color-interpolation-filters="sRGB"
|
inkscape:window-height="1106"
|
||||||
inkscape:collect="always"
|
inkscape:window-width="1700"
|
||||||
id="filter16494-4"
|
|
||||||
x="-0.20989846"
|
|
||||||
width="1.4197969"
|
|
||||||
y="-0.20903821"
|
|
||||||
height="1.4180764"><feGaussianBlur
|
|
||||||
inkscape:collect="always"
|
|
||||||
stdDeviation="1.3282637"
|
|
||||||
id="feGaussianBlur16496-8" /></filter><radialGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient16498-6"
|
|
||||||
id="radialGradient16504-1"
|
|
||||||
cx="7.6582627"
|
|
||||||
cy="5.8191104"
|
|
||||||
fx="7.6582627"
|
|
||||||
fy="5.8191104"
|
|
||||||
r="8.6928644"
|
|
||||||
gradientTransform="matrix(1.0474339,0,0,1.0517402,-0.3632615,-0.42032492)"
|
|
||||||
gradientUnits="userSpaceOnUse" /><linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
id="linearGradient16498-6"><stop
|
|
||||||
style="stop-color:#7b7b7b;stop-opacity:1"
|
|
||||||
offset="0"
|
|
||||||
id="stop16500-8" /><stop
|
|
||||||
style="stop-color:#101010;stop-opacity:1"
|
|
||||||
offset="1"
|
|
||||||
id="stop16502-0" /></linearGradient><filter
|
|
||||||
color-interpolation-filters="sRGB"
|
|
||||||
inkscape:collect="always"
|
|
||||||
id="filter16524-9"
|
|
||||||
x="-0.212979"
|
|
||||||
width="1.425958"
|
|
||||||
y="-0.21305652"
|
|
||||||
height="1.426113"><feGaussianBlur
|
|
||||||
inkscape:collect="always"
|
|
||||||
stdDeviation="0.71020915"
|
|
||||||
id="feGaussianBlur16526-0" /></filter></defs><sodipodi:namedview
|
|
||||||
inkscape:window-height="1114"
|
|
||||||
inkscape:window-width="1463"
|
|
||||||
inkscape:pageshadow="2"
|
inkscape:pageshadow="2"
|
||||||
inkscape:pageopacity="0"
|
inkscape:pageopacity="0"
|
||||||
guidetolerance="10.0"
|
guidetolerance="10.0"
|
||||||
@ -87,66 +48,38 @@
|
|||||||
objecttolerance="10.0"
|
objecttolerance="10.0"
|
||||||
borderopacity="1.0"
|
borderopacity="1.0"
|
||||||
bordercolor="#666666"
|
bordercolor="#666666"
|
||||||
pagecolor="#000000"
|
pagecolor="#797979"
|
||||||
id="base"
|
id="base"
|
||||||
showgrid="false"
|
showgrid="false"
|
||||||
inkscape:zoom="1"
|
inkscape:zoom="4"
|
||||||
inkscape:cx="10.720189"
|
inkscape:cx="28.483745"
|
||||||
inkscape:cy="13.739577"
|
inkscape:cy="67.714004"
|
||||||
inkscape:window-x="0"
|
inkscape:window-x="1427"
|
||||||
inkscape:window-y="26"
|
inkscape:window-y="127"
|
||||||
inkscape:current-layer="Foreground"
|
inkscape:current-layer="Foreground"
|
||||||
showguides="true"
|
showguides="true"
|
||||||
inkscape:guide-bbox="true"
|
inkscape:guide-bbox="true"
|
||||||
borderlayer="true"
|
borderlayer="true"
|
||||||
inkscape:showpageshadow="false"
|
inkscape:showpageshadow="false"
|
||||||
inkscape:window-maximized="0"><inkscape:grid
|
inkscape:window-maximized="0"
|
||||||
|
inkscape:document-rotation="0"><inkscape:grid
|
||||||
type="xygrid"
|
type="xygrid"
|
||||||
id="grid11246"
|
id="grid11246"
|
||||||
empspacing="5"
|
empspacing="32"
|
||||||
visible="true"
|
visible="true"
|
||||||
enabled="true"
|
enabled="true"
|
||||||
snapvisiblegridlinesonly="true" /></sodipodi:namedview>
|
snapvisiblegridlinesonly="true" /></sodipodi:namedview><path
|
||||||
|
d="m 4.4362021,15.860384 c 0,-6.410121 5.1728276,-11.60728 11.5529359,-11.60728 6.380109,0 11.552937,5.197159 11.552937,11.60728 0,6.410122 -5.172828,11.607281 -11.552937,11.607281 -6.3801083,0 -11.5529359,-5.197159 -11.5529359,-11.607281 z"
|
||||||
<g
|
|
||||||
style="display:inline"
|
|
||||||
id="g16402-8"
|
|
||||||
transform="translate(4.7533483,2.8238929)"><g
|
|
||||||
id="g3175-4"><path
|
|
||||||
sodipodi:type="inkscape:offset"
|
|
||||||
inkscape:radius="0"
|
|
||||||
inkscape:original="M 7.65625 0.125 C 3.2589349 0.125 -0.3125 3.7070002 -0.3125 8.125 C -0.3125 12.543001 3.2589349 16.125 7.65625 16.125 C 12.053566 16.125 15.625 12.543001 15.625 8.125 C 15.625 3.7070002 12.053566 0.125 7.65625 0.125 z "
|
|
||||||
xlink:href="#path2394-32"
|
|
||||||
style="opacity:0.52994014;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2.18181825;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter16494-4);enable-background:accumulate"
|
|
||||||
id="path16480-5"
|
|
||||||
inkscape:href="#path2394-32"
|
|
||||||
d="m 7.65625,0.125 c -4.3973151,0 -7.96875,3.5820002 -7.96875,8 0,4.418001 3.5714349,8 7.96875,8 4.397316,0 7.96875,-3.581999 7.96875,-8 0,-4.4179998 -3.571434,-8 -7.96875,-8 z"
|
|
||||||
transform="translate(0,1.028519)" /><path
|
|
||||||
clip-rule="evenodd"
|
|
||||||
d="m -0.30428257,8.1237596 c 0,-4.4179998 3.56522987,-7.9999996 7.96254497,-7.9999996 4.3973156,0 7.9625456,3.5819998 7.9625456,7.9999996 0,4.4180014 -3.56523,8.0000004 -7.9625456,8.0000004 -4.3973151,0 -7.96254497,-3.581999 -7.96254497,-8.0000004 z"
|
|
||||||
id="path2394-32"
|
id="path2394-32"
|
||||||
style="color:#000000;fill:url(#radialGradient16504-1);fill-opacity:1;fill-rule:nonzero;stroke:#eeeeec;stroke-width:1.4545455;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
style="color:#000000;clip-rule:evenodd;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#2975c4;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
|
||||||
sodipodi:nodetypes="csssc"
|
sodipodi:nodetypes="csssc"
|
||||||
inkscape:connector-curvature="0" /><g
|
inkscape:connector-curvature="0" /><path
|
||||||
id="g3172-6" /></g><g
|
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.49900004;fill:#4a90d9;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.74932218;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
|
||||||
transform="matrix(0.72727273,0,0,0.72727273,2.368236,2.1803254)"
|
d="m 6.4654832,15.001321 c -0.025906,0.288419 -0.044417,0.579469 -0.044417,0.874662 0,5.313347 4.2883848,9.621271 9.5768588,9.621271 5.288466,0 9.575143,-4.307924 9.575143,-9.621271 0,-0.295193 -0.01852,-0.586243 -0.04441,-0.874662 -0.440376,4.903023 -4.536071,8.746611 -9.53073,8.746611 -4.994659,0 -9.0920617,-3.843588 -9.5324391,-8.746611 z"
|
||||||
style="fill:#ffffff;fill-opacity:1;display:inline"
|
id="path2561"
|
||||||
id="g27275-6-6"
|
inkscape:connector-curvature="0" /><path
|
||||||
inkscape:label="window-close"><g
|
d="m 11.718386,11.639547 h 1.055207 c 0.01091,-1.26e-4 0.02193,-4.86e-4 0.03298,0 0.269026,0.01183 0.538019,0.135679 0.725455,0.329752 l 2.407192,2.407192 2.440166,-2.407192 c 0.28029,-0.243226 0.471333,-0.322366 0.725455,-0.329752 h 1.055207 v 1.055208 c 0,0.302285 -0.03623,0.581049 -0.263801,0.791405 l -2.407191,2.407191 2.374217,2.374216 c 0.198577,0.198559 0.296768,0.478484 0.296775,0.758432 v 1.055206 h -1.055211 c -0.279947,-10e-6 -0.559877,-0.09824 -0.75843,-0.296777 l -2.407192,-2.407192 -2.407192,2.407192 c -0.198551,0.198579 -0.478493,0.296777 -0.758429,0.296777 H 11.71839 v -1.055206 c -3e-6,-0.279936 0.0982,-0.559873 0.296777,-0.758432 L 14.422359,15.893351 12.015167,13.48616 C 11.79279,13.280784 11.69527,12.991003 11.71839,12.694755 Z"
|
||||||
style="fill:#ffffff;fill-opacity:1;display:inline"
|
|
||||||
id="g27277-1-1"
|
|
||||||
transform="translate(-41,-760)"><path
|
|
||||||
sodipodi:type="inkscape:offset"
|
|
||||||
inkscape:radius="0"
|
|
||||||
inkscape:original="M 44.21875 764.1875 L 44.21875 765.1875 C 44.19684 765.46825 44.289258 765.74287 44.5 765.9375 L 46.78125 768.21875 L 44.5 770.46875 C 44.31181 770.65692 44.218747 770.92221 44.21875 771.1875 L 44.21875 772.1875 L 45.21875 772.1875 C 45.48404 772.1875 45.749336 772.09444 45.9375 771.90625 L 48.21875 769.625 L 50.5 771.90625 C 50.688164 772.0944 50.953449 772.18749 51.21875 772.1875 L 52.21875 772.1875 L 52.21875 771.1875 C 52.218742 770.9222 52.125688 770.65692 51.9375 770.46875 L 49.6875 768.21875 L 51.96875 765.9375 C 52.18441 765.73815 52.21875 765.47397 52.21875 765.1875 L 52.21875 764.1875 L 51.21875 764.1875 C 50.977922 764.1945 50.796875 764.2695 50.53125 764.5 L 48.21875 766.78125 L 45.9375 764.5 C 45.75987 764.31608 45.504951 764.1987 45.25 764.1875 C 45.23954 764.18704 45.22912 764.18738 45.21875 764.1875 L 44.21875 764.1875 z "
|
|
||||||
xlink:href="#path27279-0-5"
|
|
||||||
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;color:#bebebe;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.78124988;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter16524-9);enable-background:new;font-family:Andale Mono;-inkscape-font-specification:Andale Mono"
|
|
||||||
id="path16506-5"
|
|
||||||
inkscape:href="#path27279-0-5"
|
|
||||||
d="m 44.21875,764.1875 0,1 c -0.02191,0.28075 0.07051,0.55537 0.28125,0.75 l 2.28125,2.28125 -2.28125,2.25 c -0.18819,0.18817 -0.281253,0.45346 -0.28125,0.71875 l 0,1 1,0 c 0.26529,0 0.530586,-0.0931 0.71875,-0.28125 L 48.21875,769.625 50.5,771.90625 c 0.188164,0.18815 0.453449,0.28124 0.71875,0.28125 l 1,0 0,-1 c -8e-6,-0.2653 -0.09306,-0.53058 -0.28125,-0.71875 l -2.25,-2.25 2.28125,-2.28125 c 0.21566,-0.19935 0.25,-0.46353 0.25,-0.75 l 0,-1 -1,0 c -0.240828,0.007 -0.421875,0.082 -0.6875,0.3125 l -2.3125,2.28125 L 45.9375,764.5 c -0.17763,-0.18392 -0.432549,-0.3013 -0.6875,-0.3125 -0.01046,-4.6e-4 -0.02088,-1.2e-4 -0.03125,0 l -1,0 z"
|
|
||||||
transform="translate(0,1.3535534)" /><path
|
|
||||||
sodipodi:nodetypes="ccsccccccccccccccccccccccc"
|
|
||||||
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;color:#bebebe;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.78124988;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Andale Mono;-inkscape-font-specification:Andale Mono"
|
|
||||||
id="path27279-0-5"
|
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
d="m 44.226475,764.17222 1,0 c 0.01037,-1.2e-4 0.02079,-4.6e-4 0.03125,0 0.254951,0.0112 0.50987,0.12858 0.6875,0.3125 l 2.28125,2.28125 2.3125,-2.28125 c 0.265625,-0.2305 0.446672,-0.3055 0.6875,-0.3125 l 1,0 0,1 c 0,0.28647 -0.03434,0.55065 -0.25,0.75 l -2.28125,2.28125 2.25,2.25 c 0.188188,0.18817 0.281242,0.45345 0.28125,0.71875 l 0,1 -1,0 c -0.265301,-1e-5 -0.530586,-0.0931 -0.71875,-0.28125 l -2.28125,-2.28125 -2.28125,2.28125 c -0.188164,0.18819 -0.45346,0.28125 -0.71875,0.28125 l -1,0 0,-1 c -3e-6,-0.26529 0.09306,-0.53058 0.28125,-0.71875 l 2.28125,-2.25 -2.28125,-2.28125 c -0.210742,-0.19463 -0.30316,-0.46925 -0.28125,-0.75 l 0,-1 z" /></g></g></g></svg>
|
id="path27279-0-5"
|
||||||
|
style="color:#bebebe;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:'Andale Mono';-inkscape-font-specification:'Andale Mono';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#4a90d9;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.87958801;marker:none;enable-background:new"
|
||||||
|
sodipodi:nodetypes="ccsccccccccccccccccccccccc" /></svg>
|
Before Width: | Height: | Size: 9.4 KiB After Width: | Height: | Size: 5.3 KiB |
@ -6,3 +6,9 @@
|
|||||||
stage {
|
stage {
|
||||||
-st-icon-style: symbolic;
|
-st-icon-style: symbolic;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.toggle-switch { width: 48px; }
|
||||||
|
.toggle-switch-us, .toggle-switch-intl {
|
||||||
|
background-image: url("resource:///org/gnome/shell/theme/toggle-off-hc.svg");
|
||||||
|
&:checked { background-image: url("resource:///org/gnome/shell/theme/toggle-on-hc.svg"); }
|
||||||
|
}
|
||||||
|
@ -37,14 +37,13 @@ stage {
|
|||||||
icon-shadow: 0 1px black; }
|
icon-shadow: 0 1px black; }
|
||||||
.button:focus {
|
.button:focus {
|
||||||
color: #eeeeec;
|
color: #eeeeec;
|
||||||
border-color: #215d9c;
|
|
||||||
box-shadow: inset 0 1px #454f52;
|
|
||||||
text-shadow: 0 1px black;
|
text-shadow: 0 1px black;
|
||||||
icon-shadow: 0 1px black; }
|
icon-shadow: 0 1px black;
|
||||||
|
box-shadow: inset 0px 0px 0px 1px #215d9c; }
|
||||||
.button:insensitive {
|
.button:insensitive {
|
||||||
color: #939695;
|
color: #949796;
|
||||||
border-color: rgba(0, 0, 0, 0.7);
|
border-color: rgba(0, 0, 0, 0.7);
|
||||||
background-color: rgba(66, 71, 73, 0.7);
|
background-color: rgba(66, 72, 73, 0.7);
|
||||||
box-shadow: none;
|
box-shadow: none;
|
||||||
text-shadow: none;
|
text-shadow: none;
|
||||||
icon-shadow: none; }
|
icon-shadow: none; }
|
||||||
@ -52,9 +51,46 @@ stage {
|
|||||||
color: white;
|
color: white;
|
||||||
border-color: rgba(0, 0, 0, 0.7);
|
border-color: rgba(0, 0, 0, 0.7);
|
||||||
background-color: #222728;
|
background-color: #222728;
|
||||||
|
box-shadow: inset 0 0 black;
|
||||||
|
text-shadow: none;
|
||||||
|
icon-shadow: none; }
|
||||||
|
|
||||||
|
.modal-dialog-linked-button {
|
||||||
|
border-right-width: 1px;
|
||||||
|
color: #eeeeec;
|
||||||
|
background-color: #2e3436;
|
||||||
|
border-color: rgba(0, 0, 0, 0.7);
|
||||||
|
box-shadow: inset 0 1px #454f52;
|
||||||
|
text-shadow: 0 1px black;
|
||||||
|
icon-shadow: 0 1px black;
|
||||||
|
padding: 12px; }
|
||||||
|
.modal-dialog-linked-button:insensitive {
|
||||||
|
color: #949796;
|
||||||
|
border-color: rgba(0, 0, 0, 0.7);
|
||||||
|
background-color: rgba(66, 72, 73, 0.7);
|
||||||
box-shadow: none;
|
box-shadow: none;
|
||||||
text-shadow: none;
|
text-shadow: none;
|
||||||
icon-shadow: none; }
|
icon-shadow: none; }
|
||||||
|
.modal-dialog-linked-button:active {
|
||||||
|
color: white;
|
||||||
|
border-color: rgba(0, 0, 0, 0.7);
|
||||||
|
background-color: #222728;
|
||||||
|
box-shadow: inset 0 0 black;
|
||||||
|
text-shadow: none;
|
||||||
|
icon-shadow: none; }
|
||||||
|
.modal-dialog-linked-button:focus {
|
||||||
|
color: #eeeeec;
|
||||||
|
text-shadow: 0 1px black;
|
||||||
|
icon-shadow: 0 1px black;
|
||||||
|
box-shadow: inset 0px 0px 0px 1px #215d9c; }
|
||||||
|
.modal-dialog-linked-button:first-child {
|
||||||
|
border-radius: 0px 0px 0px 6px; }
|
||||||
|
.modal-dialog-linked-button:last-child {
|
||||||
|
border-right-width: 0px;
|
||||||
|
border-radius: 0px 0px 6px 0px; }
|
||||||
|
.modal-dialog-linked-button:first-child:last-child {
|
||||||
|
border-right-width: 0px;
|
||||||
|
border-radius: 0px 0px 6px 6px; }
|
||||||
|
|
||||||
/* Entries */
|
/* Entries */
|
||||||
StEntry {
|
StEntry {
|
||||||
@ -71,8 +107,8 @@ StEntry {
|
|||||||
box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.4);
|
box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.4);
|
||||||
border-color: rgba(154, 154, 142, 0.5); }
|
border-color: rgba(154, 154, 142, 0.5); }
|
||||||
StEntry:insensitive {
|
StEntry:insensitive {
|
||||||
color: #939695;
|
color: #949796;
|
||||||
border-color: #323636;
|
border-color: #333636;
|
||||||
box-shadow: none; }
|
box-shadow: none; }
|
||||||
StEntry StIcon.capslock-warning {
|
StEntry StIcon.capslock-warning {
|
||||||
icon-size: 16px;
|
icon-size: 16px;
|
||||||
@ -82,6 +118,7 @@ StEntry {
|
|||||||
/* Scrollbars */
|
/* Scrollbars */
|
||||||
StScrollView.vfade {
|
StScrollView.vfade {
|
||||||
-st-vfade-offset: 68px; }
|
-st-vfade-offset: 68px; }
|
||||||
|
|
||||||
StScrollView.hfade {
|
StScrollView.hfade {
|
||||||
-st-hfade-offset: 68px; }
|
-st-hfade-offset: 68px; }
|
||||||
|
|
||||||
@ -95,10 +132,10 @@ StScrollBar {
|
|||||||
background-color: transparent; }
|
background-color: transparent; }
|
||||||
StScrollBar StButton#vhandle, StScrollBar StButton#hhandle {
|
StScrollBar StButton#vhandle, StScrollBar StButton#hhandle {
|
||||||
border-radius: 8px;
|
border-radius: 8px;
|
||||||
background-color: #393f3f;
|
background-color: #a6a8a7;
|
||||||
margin: 3px; }
|
margin: 3px; }
|
||||||
StScrollBar StButton#vhandle:hover, StScrollBar StButton#hhandle:hover {
|
StScrollBar StButton#vhandle:hover, StScrollBar StButton#hhandle:hover {
|
||||||
background-color: #515a5a; }
|
background-color: #cacbc9; }
|
||||||
StScrollBar StButton#vhandle:active, StScrollBar StButton#hhandle:active {
|
StScrollBar StButton#vhandle:active, StScrollBar StButton#hhandle:active {
|
||||||
background-color: #215d9c; }
|
background-color: #215d9c; }
|
||||||
|
|
||||||
@ -106,7 +143,7 @@ StScrollBar {
|
|||||||
.slider {
|
.slider {
|
||||||
height: 1em;
|
height: 1em;
|
||||||
-slider-height: 0.3em;
|
-slider-height: 0.3em;
|
||||||
-slider-background-color: #323636;
|
-slider-background-color: #333636;
|
||||||
-slider-border-color: #1c1f1f;
|
-slider-border-color: #1c1f1f;
|
||||||
-slider-active-background-color: #215d9c;
|
-slider-active-background-color: #215d9c;
|
||||||
-slider-active-border-color: #184472;
|
-slider-active-border-color: #184472;
|
||||||
@ -116,14 +153,18 @@ StScrollBar {
|
|||||||
/* Check Boxes */
|
/* Check Boxes */
|
||||||
.check-box StBoxLayout {
|
.check-box StBoxLayout {
|
||||||
spacing: .8em; }
|
spacing: .8em; }
|
||||||
|
|
||||||
.check-box StBin {
|
.check-box StBin {
|
||||||
width: 24px;
|
width: 24px;
|
||||||
height: 22px;
|
height: 22px;
|
||||||
background-image: url("resource:///org/gnome/shell/theme/checkbox-off.svg"); }
|
background-image: url("resource:///org/gnome/shell/theme/checkbox-off.svg"); }
|
||||||
|
|
||||||
.check-box:focus StBin {
|
.check-box:focus StBin {
|
||||||
background-image: url("resource:///org/gnome/shell/theme/checkbox-off-focused.svg"); }
|
background-image: url("resource:///org/gnome/shell/theme/checkbox-off-focused.svg"); }
|
||||||
|
|
||||||
.check-box:checked StBin {
|
.check-box:checked StBin {
|
||||||
background-image: url("resource:///org/gnome/shell/theme/checkbox.svg"); }
|
background-image: url("resource:///org/gnome/shell/theme/checkbox.svg"); }
|
||||||
|
|
||||||
.check-box:focus:checked StBin {
|
.check-box:focus:checked StBin {
|
||||||
background-image: url("resource:///org/gnome/shell/theme/checkbox-focused.svg"); }
|
background-image: url("resource:///org/gnome/shell/theme/checkbox-focused.svg"); }
|
||||||
|
|
||||||
@ -160,10 +201,11 @@ StScrollBar {
|
|||||||
background-color: white; }
|
background-color: white; }
|
||||||
|
|
||||||
.modal-dialog {
|
.modal-dialog {
|
||||||
border-radius: 5px;
|
border-radius: 9px;
|
||||||
color: #eeeeec;
|
color: #eeeeec;
|
||||||
background-color: rgba(23, 25, 26, 0.95);
|
background-color: rgba(23, 25, 26, 0.95);
|
||||||
border: 3px solid rgba(238, 238, 236, 0.5);
|
border: 1px solid rgba(238, 238, 236, 0.2); }
|
||||||
|
.modal-dialog .modal-dialog-content-box {
|
||||||
padding: 24px; }
|
padding: 24px; }
|
||||||
.modal-dialog .run-dialog-entry {
|
.modal-dialog .run-dialog-entry {
|
||||||
width: 20em;
|
width: 20em;
|
||||||
@ -179,19 +221,34 @@ StScrollBar {
|
|||||||
color: #d6d6d1;
|
color: #d6d6d1;
|
||||||
padding-bottom: .4em; }
|
padding-bottom: .4em; }
|
||||||
|
|
||||||
.button-dialog-button-box {
|
.mount-dialog-subject,
|
||||||
spacing: 18px;
|
|
||||||
padding-top: 48px; }
|
|
||||||
|
|
||||||
.show-processes-dialog-subject,
|
|
||||||
.mount-question-dialog-subject,
|
|
||||||
.end-session-dialog-subject {
|
.end-session-dialog-subject {
|
||||||
font-size: 14pt; }
|
font-size: 14pt; }
|
||||||
|
|
||||||
|
/* Message Dialog */
|
||||||
|
.message-dialog-main-layout {
|
||||||
|
padding: 12px 20px 0;
|
||||||
|
spacing: 12px; }
|
||||||
|
|
||||||
|
.message-dialog-content {
|
||||||
|
max-width: 28em;
|
||||||
|
spacing: 20px; }
|
||||||
|
|
||||||
|
.message-dialog-icon {
|
||||||
|
min-width: 48px;
|
||||||
|
icon-size: 48px; }
|
||||||
|
|
||||||
|
.message-dialog-title {
|
||||||
|
font-weight: bold; }
|
||||||
|
|
||||||
|
.message-dialog-subtitle {
|
||||||
|
color: #8e8e80;
|
||||||
|
font-weight: bold; }
|
||||||
|
|
||||||
/* End Session Dialog */
|
/* End Session Dialog */
|
||||||
.end-session-dialog {
|
.end-session-dialog {
|
||||||
spacing: 42px;
|
spacing: 42px;
|
||||||
border: 3px solid rgba(238, 238, 236, 0.2); }
|
border: 1px solid rgba(238, 238, 236, 0.2); }
|
||||||
|
|
||||||
.end-session-dialog-list {
|
.end-session-dialog-list {
|
||||||
padding-top: 20px; }
|
padding-top: 20px; }
|
||||||
@ -256,74 +313,61 @@ StScrollBar {
|
|||||||
.shell-mount-operation-icon {
|
.shell-mount-operation-icon {
|
||||||
icon-size: 48px; }
|
icon-size: 48px; }
|
||||||
|
|
||||||
.show-processes-dialog,
|
.mount-dialog {
|
||||||
.mount-question-dialog {
|
|
||||||
spacing: 24px; }
|
spacing: 24px; }
|
||||||
|
.mount-dialog .message-dialog-title {
|
||||||
.show-processes-dialog-subject,
|
|
||||||
.mount-question-dialog-subject {
|
|
||||||
padding-top: 10px;
|
padding-top: 10px;
|
||||||
padding-left: 17px;
|
padding-left: 17px;
|
||||||
padding-bottom: 6px; }
|
padding-bottom: 6px;
|
||||||
|
max-width: 34em; }
|
||||||
.mount-question-dialog-subject {
|
.mount-dialog .message-dialog-title:rtl {
|
||||||
max-width: 500px; }
|
padding-left: 0px;
|
||||||
|
padding-right: 17px; }
|
||||||
.show-processes-dialog-subject:rtl,
|
.mount-dialog .message-dialog-body {
|
||||||
.mount-question-dialog-subject:rtl {
|
padding-left: 17px;
|
||||||
|
width: 28em; }
|
||||||
|
.mount-dialog .message-dialog-body:rtl {
|
||||||
padding-left: 0px;
|
padding-left: 0px;
|
||||||
padding-right: 17px; }
|
padding-right: 17px; }
|
||||||
|
|
||||||
.show-processes-dialog-description,
|
.mount-dialog-app-list {
|
||||||
.mount-question-dialog-description {
|
|
||||||
padding-left: 17px;
|
|
||||||
width: 28em; }
|
|
||||||
|
|
||||||
.show-processes-dialog-description:rtl,
|
|
||||||
.mount-question-dialog-description:rtl {
|
|
||||||
padding-right: 17px; }
|
|
||||||
|
|
||||||
.show-processes-dialog-app-list {
|
|
||||||
max-height: 200px;
|
max-height: 200px;
|
||||||
padding-top: 24px;
|
padding-top: 24px;
|
||||||
padding-left: 49px;
|
padding-left: 49px;
|
||||||
padding-right: 32px; }
|
padding-right: 32px; }
|
||||||
|
|
||||||
.show-processes-dialog-app-list:rtl {
|
.mount-dialog-app-list:rtl {
|
||||||
padding-right: 49px;
|
padding-right: 49px;
|
||||||
padding-left: 32px; }
|
padding-left: 32px; }
|
||||||
|
|
||||||
.show-processes-dialog-app-list-item {
|
.mount-dialog-app-list-item {
|
||||||
color: #d6d6d1; }
|
color: #d6d6d1; }
|
||||||
.show-processes-dialog-app-list-item:hover {
|
.mount-dialog-app-list-item:hover {
|
||||||
color: #eeeeec; }
|
color: #eeeeec; }
|
||||||
.show-processes-dialog-app-list-item:ltr {
|
.mount-dialog-app-list-item:ltr {
|
||||||
padding-right: 1em; }
|
padding-right: 1em; }
|
||||||
.show-processes-dialog-app-list-item:rtl {
|
.mount-dialog-app-list-item:rtl {
|
||||||
padding-left: 1em; }
|
padding-left: 1em; }
|
||||||
|
|
||||||
.show-processes-dialog-app-list-item-icon:ltr {
|
.mount-dialog-app-list-item-icon:ltr {
|
||||||
padding-right: 17px; }
|
padding-right: 17px; }
|
||||||
.show-processes-dialog-app-list-item-icon:rtl {
|
|
||||||
|
.mount-dialog-app-list-item-icon:rtl {
|
||||||
padding-left: 17px; }
|
padding-left: 17px; }
|
||||||
|
|
||||||
.show-processes-dialog-app-list-item-name {
|
.mount-dialog-app-list-item-name {
|
||||||
font-size: 10pt; }
|
font-size: 10pt; }
|
||||||
|
|
||||||
/* Password or Authentication Dialog */
|
/* Password or Authentication Dialog */
|
||||||
.prompt-dialog {
|
.prompt-dialog {
|
||||||
width: 500px;
|
width: 34em;
|
||||||
border: 3px solid rgba(238, 238, 236, 0.2); }
|
border: 3px solid rgba(238, 238, 236, 0.2); }
|
||||||
|
.prompt-dialog .message-dialog-main-layout {
|
||||||
.prompt-dialog-main-layout {
|
|
||||||
spacing: 24px;
|
spacing: 24px;
|
||||||
padding: 10px; }
|
padding: 10px; }
|
||||||
|
.prompt-dialog .message-dialog-content {
|
||||||
.prompt-dialog-message-layout {
|
|
||||||
spacing: 16px; }
|
spacing: 16px; }
|
||||||
|
.prompt-dialog .message-dialog-title {
|
||||||
.prompt-dialog-headline {
|
|
||||||
font-weight: bold;
|
|
||||||
color: #b2b2a9; }
|
color: #b2b2a9; }
|
||||||
|
|
||||||
.prompt-dialog-description:rtl {
|
.prompt-dialog-description:rtl {
|
||||||
@ -366,6 +410,54 @@ StScrollBar {
|
|||||||
width: 48px;
|
width: 48px;
|
||||||
height: 48px; }
|
height: 48px; }
|
||||||
|
|
||||||
|
/* Audio selection dialog */
|
||||||
|
.audio-device-selection-dialog {
|
||||||
|
spacing: 30px; }
|
||||||
|
|
||||||
|
.audio-selection-content {
|
||||||
|
spacing: 20px;
|
||||||
|
padding: 24px; }
|
||||||
|
|
||||||
|
.audio-selection-title {
|
||||||
|
font-weight: bold;
|
||||||
|
text-align: center; }
|
||||||
|
|
||||||
|
.audio-selection-box {
|
||||||
|
spacing: 20px; }
|
||||||
|
|
||||||
|
.audio-selection-device {
|
||||||
|
border: 1px solid rgba(238, 238, 236, 0.2);
|
||||||
|
border-radius: 12px; }
|
||||||
|
.audio-selection-device:active, .audio-selection-device:hover, .audio-selection-device:focus {
|
||||||
|
background-color: #215d9c; }
|
||||||
|
|
||||||
|
.audio-selection-device-box {
|
||||||
|
padding: 20px;
|
||||||
|
spacing: 20px; }
|
||||||
|
|
||||||
|
.audio-selection-device-icon {
|
||||||
|
icon-size: 64px; }
|
||||||
|
|
||||||
|
/* Access Dialog */
|
||||||
|
.access-dialog {
|
||||||
|
spacing: 30px; }
|
||||||
|
|
||||||
|
/* Geolocation Dialog */
|
||||||
|
.geolocation-dialog {
|
||||||
|
spacing: 30px; }
|
||||||
|
|
||||||
|
/* Extension Dialog */
|
||||||
|
.extension-dialog .message-dialog-main-layout {
|
||||||
|
spacing: 24px;
|
||||||
|
padding: 10px; }
|
||||||
|
|
||||||
|
.extension-dialog .message-dialog-title {
|
||||||
|
color: #b2b2a9; }
|
||||||
|
|
||||||
|
/* Inhibit-Shortcuts Dialog */
|
||||||
|
.inhibit-shortcuts-dialog {
|
||||||
|
spacing: 30px; }
|
||||||
|
|
||||||
/* Network Agent Dialog */
|
/* Network Agent Dialog */
|
||||||
.network-dialog-secret-table {
|
.network-dialog-secret-table {
|
||||||
spacing-rows: 15px;
|
spacing-rows: 15px;
|
||||||
@ -375,9 +467,9 @@ StScrollBar {
|
|||||||
spacing-rows: 15px;
|
spacing-rows: 15px;
|
||||||
spacing-columns: 1em; }
|
spacing-columns: 1em; }
|
||||||
|
|
||||||
/* Popvers/Menus */
|
/* Popovers/Menus */
|
||||||
.popup-menu {
|
.popup-menu {
|
||||||
min-width: 200px; }
|
min-width: 15em; }
|
||||||
.popup-menu .popup-sub-menu {
|
.popup-menu .popup-sub-menu {
|
||||||
background-color: #343a3a;
|
background-color: #343a3a;
|
||||||
box-shadow: inset 0 -1px 0px #282c2c; }
|
box-shadow: inset 0 -1px 0px #282c2c; }
|
||||||
@ -411,7 +503,7 @@ StScrollBar {
|
|||||||
|
|
||||||
.popup-menu-ornament {
|
.popup-menu-ornament {
|
||||||
text-align: right;
|
text-align: right;
|
||||||
width: 1em; }
|
width: 1.2em; }
|
||||||
|
|
||||||
.popup-menu-boxpointer,
|
.popup-menu-boxpointer,
|
||||||
.candidate-popup-boxpointer {
|
.candidate-popup-boxpointer {
|
||||||
@ -454,6 +546,21 @@ StScrollBar {
|
|||||||
border-radius: 0.3em;
|
border-radius: 0.3em;
|
||||||
background-color: rgba(11, 12, 13, 0.5);
|
background-color: rgba(11, 12, 13, 0.5);
|
||||||
color: #eeeeec; }
|
color: #eeeeec; }
|
||||||
|
.osd-window .level-bar {
|
||||||
|
background-color: #eeeeec;
|
||||||
|
border-radius: 0.3em; }
|
||||||
|
|
||||||
|
/* Pad OSD */
|
||||||
|
.pad-osd-window {
|
||||||
|
padding: 32px;
|
||||||
|
background-color: rgba(0, 0, 0, 0.8); }
|
||||||
|
.pad-osd-window .pad-osd-title-box {
|
||||||
|
spacing: 12px; }
|
||||||
|
.pad-osd-window .pad-osd-title-menu-box {
|
||||||
|
spacing: 6px; }
|
||||||
|
|
||||||
|
.combo-box-label {
|
||||||
|
width: 15em; }
|
||||||
|
|
||||||
/* App Switcher */
|
/* App Switcher */
|
||||||
.switcher-popup {
|
.switcher-popup {
|
||||||
@ -488,9 +595,8 @@ StScrollBar {
|
|||||||
|
|
||||||
.switcher-arrow {
|
.switcher-arrow {
|
||||||
border-color: transparent;
|
border-color: transparent;
|
||||||
color: #1c1f1f; }
|
color: rgba(238, 238, 236, 0.8); }
|
||||||
|
.switcher-arrow:highlighted {
|
||||||
.switcher-arrow:highlighted {
|
|
||||||
color: #eeeeec; }
|
color: #eeeeec; }
|
||||||
|
|
||||||
.input-source-switcher-symbol {
|
.input-source-switcher-symbol {
|
||||||
@ -498,6 +604,10 @@ StScrollBar {
|
|||||||
width: 96px;
|
width: 96px;
|
||||||
height: 96px; }
|
height: 96px; }
|
||||||
|
|
||||||
|
/* Window Cycler */
|
||||||
|
.cycler-highlight {
|
||||||
|
border: 5px solid #215d9c; }
|
||||||
|
|
||||||
/* Workspace Switcher */
|
/* Workspace Switcher */
|
||||||
.workspace-switcher-group {
|
.workspace-switcher-group {
|
||||||
padding: 12px; }
|
padding: 12px; }
|
||||||
@ -537,7 +647,7 @@ StScrollBar {
|
|||||||
border: 1px solid #215d9c; }
|
border: 1px solid #215d9c; }
|
||||||
|
|
||||||
.tile-preview-left.on-primary {
|
.tile-preview-left.on-primary {
|
||||||
border-radius: 6px 6px 0 0; }
|
border-radius: 6px 0 0 0; }
|
||||||
|
|
||||||
.tile-preview-right.on-primary {
|
.tile-preview-right.on-primary {
|
||||||
border-radius: 0 6px 0 0; }
|
border-radius: 0 6px 0 0; }
|
||||||
@ -547,7 +657,9 @@ StScrollBar {
|
|||||||
|
|
||||||
/* TOP BAR */
|
/* TOP BAR */
|
||||||
#panel {
|
#panel {
|
||||||
background-color: black;
|
background-color: rgba(0, 0, 0, 0.35);
|
||||||
|
/* transition from solid to transparent */
|
||||||
|
transition-duration: 500ms;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
height: 1.86em; }
|
height: 1.86em; }
|
||||||
#panel.unlock-screen, #panel.login-screen, #panel.lock-screen {
|
#panel.unlock-screen, #panel.login-screen, #panel.lock-screen {
|
||||||
@ -556,7 +668,7 @@ StScrollBar {
|
|||||||
spacing: 4px; }
|
spacing: 4px; }
|
||||||
#panel .panel-corner {
|
#panel .panel-corner {
|
||||||
-panel-corner-radius: 6px;
|
-panel-corner-radius: 6px;
|
||||||
-panel-corner-background-color: black;
|
-panel-corner-background-color: rgba(0, 0, 0, 0.35);
|
||||||
-panel-corner-border-width: 2px;
|
-panel-corner-border-width: 2px;
|
||||||
-panel-corner-border-color: transparent; }
|
-panel-corner-border-color: transparent; }
|
||||||
#panel .panel-corner:active, #panel .panel-corner:overview, #panel .panel-corner:focus {
|
#panel .panel-corner:active, #panel .panel-corner:overview, #panel .panel-corner:focus {
|
||||||
@ -569,14 +681,24 @@ StScrollBar {
|
|||||||
-natural-hpadding: 12px;
|
-natural-hpadding: 12px;
|
||||||
-minimum-hpadding: 6px;
|
-minimum-hpadding: 6px;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
color: #ccc;
|
color: #eee;
|
||||||
|
text-shadow: 0px 1px 2px rgba(0, 0, 0, 0.9);
|
||||||
transition-duration: 100ms; }
|
transition-duration: 100ms; }
|
||||||
#panel .panel-button .app-menu-icon {
|
#panel .panel-button .app-menu-icon {
|
||||||
-st-icon-style: symbolic;
|
-st-icon-style: symbolic;
|
||||||
margin-left: 4px;
|
margin-left: 4px;
|
||||||
margin-right: 4px; }
|
margin-right: 4px; }
|
||||||
|
#panel .panel-button .system-status-icon,
|
||||||
|
#panel .panel-button .app-menu-icon > StIcon,
|
||||||
|
#panel .panel-button .popup-menu-arrow {
|
||||||
|
icon-shadow: 0px 1px 2px rgba(0, 0, 0, 0.9); }
|
||||||
#panel .panel-button:hover {
|
#panel .panel-button:hover {
|
||||||
color: white; }
|
color: white;
|
||||||
|
text-shadow: 0px 1px 6px black; }
|
||||||
|
#panel .panel-button:hover .system-status-icon,
|
||||||
|
#panel .panel-button:hover .app-menu-icon > StIcon,
|
||||||
|
#panel .panel-button:hover .popup-menu-arrow {
|
||||||
|
icon-shadow: 0px 1px 6px black; }
|
||||||
#panel .panel-button:active, #panel .panel-button:overview, #panel .panel-button:focus, #panel .panel-button:checked {
|
#panel .panel-button:active, #panel .panel-button:overview, #panel .panel-button:focus, #panel .panel-button:checked {
|
||||||
background-color: rgba(0, 0, 0, 0.01);
|
background-color: rgba(0, 0, 0, 0.01);
|
||||||
box-shadow: inset 0 -2px 0px #256ab1;
|
box-shadow: inset 0 -2px 0px #256ab1;
|
||||||
@ -586,15 +708,40 @@ StScrollBar {
|
|||||||
#panel .panel-button .system-status-icon {
|
#panel .panel-button .system-status-icon {
|
||||||
icon-size: 1.09em;
|
icon-size: 1.09em;
|
||||||
padding: 0 5px; }
|
padding: 0 5px; }
|
||||||
.unlock-screen #panel .panel-button, .login-screen #panel .panel-button, .lock-screen #panel .panel-button {
|
.unlock-screen #panel .panel-button,
|
||||||
|
.login-screen #panel .panel-button,
|
||||||
|
.lock-screen #panel .panel-button {
|
||||||
color: white; }
|
color: white; }
|
||||||
.unlock-screen #panel .panel-button:focus, .unlock-screen #panel .panel-button:hover, .unlock-screen #panel .panel-button:active, .login-screen #panel .panel-button:focus, .login-screen #panel .panel-button:hover, .login-screen #panel .panel-button:active, .lock-screen #panel .panel-button:focus, .lock-screen #panel .panel-button:hover, .lock-screen #panel .panel-button:active {
|
.unlock-screen #panel .panel-button:focus, .unlock-screen #panel .panel-button:hover, .unlock-screen #panel .panel-button:active,
|
||||||
|
.login-screen #panel .panel-button:focus,
|
||||||
|
.login-screen #panel .panel-button:hover,
|
||||||
|
.login-screen #panel .panel-button:active,
|
||||||
|
.lock-screen #panel .panel-button:focus,
|
||||||
|
.lock-screen #panel .panel-button:hover,
|
||||||
|
.lock-screen #panel .panel-button:active {
|
||||||
color: white; }
|
color: white; }
|
||||||
#panel .panel-status-indicators-box,
|
#panel .panel-status-indicators-box,
|
||||||
#panel .panel-status-menu-box {
|
#panel .panel-status-menu-box {
|
||||||
spacing: 2px; }
|
spacing: 2px; }
|
||||||
|
#panel .power-status.panel-status-indicators-box {
|
||||||
|
spacing: 0; }
|
||||||
#panel .screencast-indicator {
|
#panel .screencast-indicator {
|
||||||
color: #f57900; }
|
color: #f57900; }
|
||||||
|
#panel.solid {
|
||||||
|
background-color: black;
|
||||||
|
/* transition from transparent to solid */
|
||||||
|
transition-duration: 300ms; }
|
||||||
|
#panel.solid .panel-corner {
|
||||||
|
-panel-corner-background-color: black; }
|
||||||
|
#panel.solid .panel-button {
|
||||||
|
color: #ccc;
|
||||||
|
text-shadow: none; }
|
||||||
|
#panel.solid .panel-button:hover {
|
||||||
|
color: white; }
|
||||||
|
#panel.solid .system-status-icon,
|
||||||
|
#panel.solid .app-menu-icon > StIcon,
|
||||||
|
#panel.solid .popup-menu-arrow {
|
||||||
|
icon-shadow: none; }
|
||||||
|
|
||||||
#calendarArea {
|
#calendarArea {
|
||||||
padding: 0.75em 1.0em; }
|
padding: 0.75em 1.0em; }
|
||||||
@ -614,9 +761,20 @@ StScrollBar {
|
|||||||
.datemenu-displays-section {
|
.datemenu-displays-section {
|
||||||
padding-bottom: 3em; }
|
padding-bottom: 3em; }
|
||||||
|
|
||||||
|
.datemenu-displays-box {
|
||||||
|
spacing: 1em; }
|
||||||
|
|
||||||
|
.datemenu-calendar-column {
|
||||||
|
border: 0 solid #454c4c; }
|
||||||
|
.datemenu-calendar-column:ltr {
|
||||||
|
border-left-width: 1px; }
|
||||||
|
.datemenu-calendar-column:rtl {
|
||||||
|
border-right-width: 1px; }
|
||||||
|
|
||||||
.datemenu-today-button,
|
.datemenu-today-button,
|
||||||
.world-clocks-button,
|
.world-clocks-button,
|
||||||
.message-list-section-title {
|
.weather-button,
|
||||||
|
.events-section-title {
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
padding: .4em; }
|
padding: .4em; }
|
||||||
|
|
||||||
@ -629,12 +787,16 @@ StScrollBar {
|
|||||||
.datemenu-today-button:hover, .datemenu-today-button:focus,
|
.datemenu-today-button:hover, .datemenu-today-button:focus,
|
||||||
.world-clocks-button:hover,
|
.world-clocks-button:hover,
|
||||||
.world-clocks-button:focus,
|
.world-clocks-button:focus,
|
||||||
.message-list-section-title:hover,
|
.weather-button:hover,
|
||||||
.message-list-section-title:focus {
|
.weather-button:focus,
|
||||||
|
.events-section-title:hover,
|
||||||
|
.events-section-title:focus {
|
||||||
background-color: #454c4c; }
|
background-color: #454c4c; }
|
||||||
|
|
||||||
.datemenu-today-button:active,
|
.datemenu-today-button:active,
|
||||||
.world-clocks-button:active,
|
.world-clocks-button:active,
|
||||||
.message-list-section-title:active {
|
.weather-button:active,
|
||||||
|
.events-section-title:active {
|
||||||
color: white;
|
color: white;
|
||||||
background-color: #215d9c; }
|
background-color: #215d9c; }
|
||||||
|
|
||||||
@ -642,13 +804,17 @@ StScrollBar {
|
|||||||
font-size: 1.5em; }
|
font-size: 1.5em; }
|
||||||
|
|
||||||
.world-clocks-header,
|
.world-clocks-header,
|
||||||
.message-list-section-title {
|
.weather-header,
|
||||||
|
.events-section-title {
|
||||||
color: #8e8e80;
|
color: #8e8e80;
|
||||||
font-weight: bold; }
|
font-weight: bold; }
|
||||||
|
|
||||||
.world-clocks-grid {
|
.world-clocks-grid {
|
||||||
spacing-rows: 0.4em; }
|
spacing-rows: 0.4em; }
|
||||||
|
|
||||||
|
.weather-box {
|
||||||
|
spacing: 0.4em; }
|
||||||
|
|
||||||
.calendar-month-label {
|
.calendar-month-label {
|
||||||
color: #e2e2df;
|
color: #e2e2df;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
@ -684,7 +850,7 @@ StScrollBar {
|
|||||||
border-radius: 1.4em; }
|
border-radius: 1.4em; }
|
||||||
.calendar-day-base:hover, .calendar-day-base:focus {
|
.calendar-day-base:hover, .calendar-day-base:focus {
|
||||||
background-color: #454c4c; }
|
background-color: #454c4c; }
|
||||||
.calendar-day-base:active {
|
.calendar-day-base:active, .calendar-day-base:selected {
|
||||||
color: white;
|
color: white;
|
||||||
background-color: #215d9c;
|
background-color: #215d9c;
|
||||||
border-color: transparent; }
|
border-color: transparent; }
|
||||||
@ -703,74 +869,113 @@ StScrollBar {
|
|||||||
border-left-width: 1px; }
|
border-left-width: 1px; }
|
||||||
|
|
||||||
.calendar-nonwork-day {
|
.calendar-nonwork-day {
|
||||||
color: #939695; }
|
color: #949796; }
|
||||||
|
|
||||||
.calendar-today {
|
.calendar-today {
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
border: 1px solid rgba(28, 31, 31, 0.5); }
|
border: 1px solid rgba(28, 31, 31, 0.5); }
|
||||||
|
|
||||||
.calendar-day-with-events {
|
.calendar-day-with-events {
|
||||||
color: #e2e2df;
|
color: white;
|
||||||
font-weight: bold; }
|
font-weight: bold;
|
||||||
|
background-image: url("resource:///org/gnome/shell/theme/calendar-today.svg"); }
|
||||||
|
|
||||||
.calendar-other-month-day {
|
.calendar-other-month-day {
|
||||||
color: rgba(238, 238, 236, 0.15);
|
color: rgba(238, 238, 236, 0.15);
|
||||||
opacity: 0.5; }
|
opacity: 0.5; }
|
||||||
|
|
||||||
|
.calendar-week-number {
|
||||||
|
font-size: 70%;
|
||||||
|
font-weight: bold;
|
||||||
|
width: 2.3em;
|
||||||
|
height: 1.8em;
|
||||||
|
border-radius: 2px;
|
||||||
|
padding: 0.5em 0 0;
|
||||||
|
margin: 6px;
|
||||||
|
background-color: rgba(238, 238, 236, 0.3);
|
||||||
|
color: #393f3f; }
|
||||||
|
|
||||||
/* Message list */
|
/* Message list */
|
||||||
.message-list {
|
.message-list {
|
||||||
width: 420px; }
|
width: 31.5em; }
|
||||||
|
|
||||||
|
.message-list-clear-button.button {
|
||||||
|
background-color: transparent;
|
||||||
|
margin: 1.5em 1.5em 0; }
|
||||||
|
.message-list-clear-button.button:hover, .message-list-clear-button.button:focus {
|
||||||
|
background-color: #454c4c; }
|
||||||
|
|
||||||
.message-list-sections {
|
.message-list-sections {
|
||||||
spacing: 1.5em; }
|
spacing: 1em; }
|
||||||
|
|
||||||
.message-list-section,
|
.message-list-section,
|
||||||
.message-list-section-list {
|
.message-list-section-list {
|
||||||
spacing: 0.7em; }
|
|
||||||
|
|
||||||
.message-list-section-title-box {
|
|
||||||
spacing: 0.4em; }
|
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 {
|
.message {
|
||||||
background-color: #454c4c;
|
|
||||||
border-radius: 3px; }
|
border-radius: 3px; }
|
||||||
.message:hover, .message:focus {
|
.message:hover, .message:focus {
|
||||||
background-color: #5d6767; }
|
background-color: #454c4c; }
|
||||||
|
|
||||||
.message-icon-bin {
|
.message-icon-bin {
|
||||||
padding: 8px 0px 8px 8px; }
|
padding: 0.68em 0.2em 0.68em 0.68em; }
|
||||||
.message-icon-bin:rtl {
|
.message-icon-bin:rtl {
|
||||||
padding: 8px 8px 8px 0px; }
|
padding: 0.68em 0.68em 0.68em 0.2em; }
|
||||||
|
|
||||||
.message-icon-bin > StIcon {
|
.message-icon-bin > StIcon {
|
||||||
icon-size: 48px; }
|
color: #bebeb6;
|
||||||
|
icon-size: 1.09em;
|
||||||
|
-st-icon-style: symbolic; }
|
||||||
|
|
||||||
.message-secondary-bin {
|
.message-secondary-bin {
|
||||||
color: #8e8e80; }
|
padding: 0 0.82em; }
|
||||||
|
|
||||||
|
.message-secondary-bin > .event-time {
|
||||||
|
color: #8e8e80;
|
||||||
|
font-size: 0.7em;
|
||||||
|
/* HACK: the label should be baseline-aligned with a 1em label,
|
||||||
|
fake this with some bottom padding */
|
||||||
|
padding-bottom: 0.13em; }
|
||||||
|
|
||||||
.message-secondary-bin > StIcon {
|
.message-secondary-bin > StIcon {
|
||||||
icon-size: 16px; }
|
icon-size: 1.09em; }
|
||||||
|
|
||||||
.message-title {
|
.message-title {
|
||||||
font-weight: bold; }
|
color: #e2e2df; }
|
||||||
|
|
||||||
.message-content {
|
.message-content {
|
||||||
|
color: #bebeb6;
|
||||||
|
padding: 10px; }
|
||||||
|
|
||||||
|
.message-media-control {
|
||||||
|
padding: 12px;
|
||||||
|
color: #bebeb6; }
|
||||||
|
.message-media-control:last-child:ltr {
|
||||||
|
padding-right: 18px; }
|
||||||
|
.message-media-control:last-child:rtl {
|
||||||
|
padding-left: 18px; }
|
||||||
|
.message-media-control:hover {
|
||||||
|
color: #eeeeec; }
|
||||||
|
.message-media-control:insensitive {
|
||||||
|
color: #8e8e80; }
|
||||||
|
|
||||||
|
.media-message-cover-icon {
|
||||||
|
icon-size: 48px !important; }
|
||||||
|
.media-message-cover-icon.fallback {
|
||||||
|
color: #515a5a;
|
||||||
|
background-color: #393f3f;
|
||||||
|
border: 2px solid #393f3f;
|
||||||
|
border-radius: 2px;
|
||||||
|
icon-size: 16px;
|
||||||
padding: 8px; }
|
padding: 8px; }
|
||||||
|
|
||||||
.system-switch-user-submenu-icon {
|
.system-switch-user-submenu-icon.user-icon {
|
||||||
icon-size: 24px;
|
icon-size: 20px;
|
||||||
border: 1px solid rgba(238, 238, 236, 0.4); }
|
padding: 0 2px; }
|
||||||
|
|
||||||
|
.system-switch-user-submenu-icon.default-icon {
|
||||||
|
icon-size: 16px;
|
||||||
|
padding: 0 4px; }
|
||||||
|
|
||||||
#appMenu {
|
#appMenu {
|
||||||
spinner-image: url("resource:///org/gnome/shell/theme/process-working.svg");
|
spinner-image: url("resource:///org/gnome/shell/theme/process-working.svg");
|
||||||
@ -779,7 +984,7 @@ StScrollBar {
|
|||||||
color: transparent; }
|
color: transparent; }
|
||||||
|
|
||||||
.aggregate-menu {
|
.aggregate-menu {
|
||||||
width: 360px; }
|
min-width: 21em; }
|
||||||
.aggregate-menu .popup-menu-icon {
|
.aggregate-menu .popup-menu-icon {
|
||||||
padding: 0 4px; }
|
padding: 0 4px; }
|
||||||
|
|
||||||
@ -820,21 +1025,22 @@ StScrollBar {
|
|||||||
background-image: url("resource:///org/gnome/shell/theme/close-window.svg");
|
background-image: url("resource:///org/gnome/shell/theme/close-window.svg");
|
||||||
background-size: 32px;
|
background-size: 32px;
|
||||||
height: 32px;
|
height: 32px;
|
||||||
width: 32px; }
|
width: 32px;
|
||||||
|
|
||||||
.window-close {
|
|
||||||
-shell-close-overlap: 16px; }
|
-shell-close-overlap: 16px; }
|
||||||
.window-close:rtl {
|
.window-close:hover {
|
||||||
-st-background-image-shadow: 2px 2px 6px rgba(0, 0, 0, 0.5); }
|
background-image: url("resource:///org/gnome/shell/theme/close-window-hover.svg"); }
|
||||||
|
.window-close:active {
|
||||||
|
background-image: url("resource:///org/gnome/shell/theme/close-window-active.svg"); }
|
||||||
|
|
||||||
/* NETWORK DIALOGS */
|
/* NETWORK DIALOGS */
|
||||||
.nm-dialog {
|
.nm-dialog {
|
||||||
max-height: 500px;
|
max-height: 34em;
|
||||||
min-height: 450px;
|
min-height: 31em;
|
||||||
min-width: 470px; }
|
min-width: 32em; }
|
||||||
|
|
||||||
.nm-dialog-content {
|
.nm-dialog-content {
|
||||||
spacing: 20px; }
|
spacing: 20px;
|
||||||
|
padding: 24px; }
|
||||||
|
|
||||||
.nm-dialog-header-hbox {
|
.nm-dialog-header-hbox {
|
||||||
spacing: 10px; }
|
spacing: 10px; }
|
||||||
@ -888,13 +1094,11 @@ StScrollBar {
|
|||||||
padding-bottom: 32px; }
|
padding-bottom: 32px; }
|
||||||
|
|
||||||
.window-picker {
|
.window-picker {
|
||||||
-horizontal-spacing: 32px;
|
-horizontal-spacing: 16px;
|
||||||
-vertical-spacing: 32px;
|
-vertical-spacing: 16px;
|
||||||
padding-left: 32px;
|
padding: 0 16px 16px; }
|
||||||
padding-right: 32px;
|
|
||||||
padding-bottom: 48px; }
|
|
||||||
.window-picker.external-monitor {
|
.window-picker.external-monitor {
|
||||||
padding: 32px; }
|
padding: 16px; }
|
||||||
|
|
||||||
.window-clone-border {
|
.window-clone-border {
|
||||||
border: 4px solid #215d9c;
|
border: 4px solid #215d9c;
|
||||||
@ -903,22 +1107,22 @@ StScrollBar {
|
|||||||
|
|
||||||
.window-caption {
|
.window-caption {
|
||||||
spacing: 25px;
|
spacing: 25px;
|
||||||
color: #eeeeec;
|
color: #ffffff;
|
||||||
background-color: rgba(46, 52, 54, 0.7);
|
|
||||||
border-radius: 8px;
|
|
||||||
padding: 4px 12px;
|
|
||||||
-shell-caption-spacing: 12px; }
|
|
||||||
.window-caption:hover {
|
|
||||||
background-color: #215d9c;
|
background-color: #215d9c;
|
||||||
color: #ffffff; }
|
border-radius: 8px;
|
||||||
|
padding: 4px 12px; }
|
||||||
|
|
||||||
.search-entry {
|
.search-entry {
|
||||||
width: 320px;
|
width: 320px;
|
||||||
padding: 7px 9px;
|
padding: 7px 9px;
|
||||||
border-radius: 6px; }
|
border-radius: 6px;
|
||||||
|
border-color: #747467;
|
||||||
|
color: #eeeeec;
|
||||||
|
background-color: #2e3436; }
|
||||||
.search-entry:focus {
|
.search-entry:focus {
|
||||||
padding: 6px 8px;
|
padding: 6px 8px;
|
||||||
border-width: 2px; }
|
border-width: 2px;
|
||||||
|
border-color: #215d9c; }
|
||||||
.search-entry .search-entry-icon {
|
.search-entry .search-entry-icon {
|
||||||
icon-size: 1em;
|
icon-size: 1em;
|
||||||
padding: 0 4px;
|
padding: 0 4px;
|
||||||
@ -944,31 +1148,30 @@ StScrollBar {
|
|||||||
spacing: 3px; }
|
spacing: 3px; }
|
||||||
|
|
||||||
.search-section-separator {
|
.search-section-separator {
|
||||||
-gradient-height: 1px;
|
height: 2px;
|
||||||
-gradient-start: rgba(255, 255, 255, 0);
|
background-color: rgba(255, 255, 255, 0.2); }
|
||||||
-gradient-end: rgba(255, 255, 255, 0.1);
|
|
||||||
-margin-horizontal: 1.5em;
|
|
||||||
height: 1px; }
|
|
||||||
|
|
||||||
.list-search-result-content {
|
.list-search-result-content {
|
||||||
spacing: 12px;
|
spacing: 30px; }
|
||||||
padding: 12px; }
|
|
||||||
|
|
||||||
.list-search-result-title {
|
.list-search-result-title {
|
||||||
font-size: 1.5em;
|
color: #e2e2df;
|
||||||
color: #e2e2df; }
|
spacing: 12px; }
|
||||||
|
|
||||||
.list-search-result-description {
|
.list-search-result-description {
|
||||||
color: #cacac4; }
|
color: rgba(202, 202, 196, 0.5); }
|
||||||
|
|
||||||
|
.list-search-provider-details {
|
||||||
|
width: 150px;
|
||||||
|
color: #e2e2df;
|
||||||
|
margin-top: 0.24em; }
|
||||||
|
|
||||||
|
.list-search-provider-content {
|
||||||
|
spacing: 20px; }
|
||||||
|
|
||||||
.search-provider-icon {
|
.search-provider-icon {
|
||||||
padding: 15px; }
|
padding: 15px; }
|
||||||
|
|
||||||
.search-provider-icon-more {
|
|
||||||
width: 16px;
|
|
||||||
height: 16px;
|
|
||||||
background-image: url("resource:///org/gnome/shell/theme/more-results.svg"); }
|
|
||||||
|
|
||||||
/* DASHBOARD */
|
/* DASHBOARD */
|
||||||
#dash {
|
#dash {
|
||||||
font-size: 9pt;
|
font-size: 9pt;
|
||||||
@ -1007,6 +1210,12 @@ StScrollBar {
|
|||||||
.icon-grid .overview-icon {
|
.icon-grid .overview-icon {
|
||||||
icon-size: 96px; }
|
icon-size: 96px; }
|
||||||
|
|
||||||
|
.system-action-icon {
|
||||||
|
background-color: black;
|
||||||
|
color: white;
|
||||||
|
border-radius: 99px;
|
||||||
|
icon-size: 48px; }
|
||||||
|
|
||||||
.app-view-controls {
|
.app-view-controls {
|
||||||
padding-bottom: 32px; }
|
padding-bottom: 32px; }
|
||||||
|
|
||||||
@ -1016,7 +1225,7 @@ StScrollBar {
|
|||||||
color: white;
|
color: white;
|
||||||
border-color: rgba(0, 0, 0, 0.7);
|
border-color: rgba(0, 0, 0, 0.7);
|
||||||
background-color: #222728;
|
background-color: #222728;
|
||||||
box-shadow: none;
|
box-shadow: inset 0 0 black;
|
||||||
text-shadow: none;
|
text-shadow: none;
|
||||||
icon-shadow: none; }
|
icon-shadow: none; }
|
||||||
.app-view-control:first-child {
|
.app-view-control:first-child {
|
||||||
@ -1029,6 +1238,7 @@ StScrollBar {
|
|||||||
.list-search-result:active,
|
.list-search-result:active,
|
||||||
.list-search-result:checked {
|
.list-search-result:checked {
|
||||||
background-color: rgba(23, 25, 26, 0.9); }
|
background-color: rgba(23, 25, 26, 0.9); }
|
||||||
|
|
||||||
.search-provider-icon:focus, .search-provider-icon:selected, .search-provider-icon:hover,
|
.search-provider-icon:focus, .search-provider-icon:selected, .search-provider-icon:hover,
|
||||||
.list-search-result:focus,
|
.list-search-result:focus,
|
||||||
.list-search-result:selected,
|
.list-search-result:selected,
|
||||||
@ -1036,7 +1246,8 @@ StScrollBar {
|
|||||||
background-color: rgba(238, 238, 236, 0.1);
|
background-color: rgba(238, 238, 236, 0.1);
|
||||||
transition-duration: 200ms; }
|
transition-duration: 200ms; }
|
||||||
|
|
||||||
.app-well-app:active .overview-icon, .app-well-app:checked .overview-icon,
|
.app-well-app:active .overview-icon,
|
||||||
|
.app-well-app:checked .overview-icon,
|
||||||
.app-well-app.app-folder:active .overview-icon,
|
.app-well-app.app-folder:active .overview-icon,
|
||||||
.app-well-app.app-folder:checked .overview-icon,
|
.app-well-app.app-folder:checked .overview-icon,
|
||||||
.show-apps:active .overview-icon,
|
.show-apps:active .overview-icon,
|
||||||
@ -1045,7 +1256,10 @@ StScrollBar {
|
|||||||
.grid-search-result:checked .overview-icon {
|
.grid-search-result:checked .overview-icon {
|
||||||
background-color: rgba(23, 25, 26, 0.9);
|
background-color: rgba(23, 25, 26, 0.9);
|
||||||
box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.7); }
|
box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.7); }
|
||||||
.app-well-app:hover .overview-icon, .app-well-app:focus .overview-icon, .app-well-app:selected .overview-icon,
|
|
||||||
|
.app-well-app:hover .overview-icon,
|
||||||
|
.app-well-app:focus .overview-icon,
|
||||||
|
.app-well-app:selected .overview-icon,
|
||||||
.app-well-app.app-folder:hover .overview-icon,
|
.app-well-app.app-folder:hover .overview-icon,
|
||||||
.app-well-app.app-folder:focus .overview-icon,
|
.app-well-app.app-folder:focus .overview-icon,
|
||||||
.app-well-app.app-folder:selected .overview-icon,
|
.app-well-app.app-folder:selected .overview-icon,
|
||||||
@ -1125,6 +1339,10 @@ StScrollBar {
|
|||||||
border-radius: 9px 0 0 9px; }
|
border-radius: 9px 0 0 9px; }
|
||||||
.workspace-thumbnails:rtl {
|
.workspace-thumbnails:rtl {
|
||||||
border-radius: 0 9px 9px 0; }
|
border-radius: 0 9px 9px 0; }
|
||||||
|
.workspace-thumbnails .placeholder {
|
||||||
|
background-image: url("resource:///org/gnome/shell/theme/dash-placeholder.svg");
|
||||||
|
background-size: contain;
|
||||||
|
height: 24px; }
|
||||||
|
|
||||||
.workspace-thumbnail-indicator {
|
.workspace-thumbnail-indicator {
|
||||||
border: 4px solid #215d9c;
|
border: 4px solid #215d9c;
|
||||||
@ -1271,38 +1489,6 @@ StScrollBar {
|
|||||||
color: pink; }
|
color: pink; }
|
||||||
|
|
||||||
/* Eeeky things */
|
/* 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 {
|
.magnifier-zoom-region {
|
||||||
border: 2px solid #215d9c; }
|
border: 2px solid #215d9c; }
|
||||||
.magnifier-zoom-region.full-screen {
|
.magnifier-zoom-region.full-screen {
|
||||||
@ -1335,10 +1521,9 @@ StScrollBar {
|
|||||||
color: white; }
|
color: white; }
|
||||||
.keyboard-key:focus {
|
.keyboard-key:focus {
|
||||||
color: #eeeeec;
|
color: #eeeeec;
|
||||||
border-color: #215d9c;
|
|
||||||
box-shadow: inset 0 1px #454f52;
|
|
||||||
text-shadow: 0 1px black;
|
text-shadow: 0 1px black;
|
||||||
icon-shadow: 0 1px black; }
|
icon-shadow: 0 1px black;
|
||||||
|
box-shadow: inset 0px 0px 0px 1px #215d9c; }
|
||||||
.keyboard-key:hover, .keyboard-key:checked {
|
.keyboard-key:hover, .keyboard-key:checked {
|
||||||
color: white;
|
color: white;
|
||||||
border-color: rgba(0, 0, 0, 0.7);
|
border-color: rgba(0, 0, 0, 0.7);
|
||||||
@ -1350,7 +1535,7 @@ StScrollBar {
|
|||||||
color: white;
|
color: white;
|
||||||
border-color: rgba(0, 0, 0, 0.7);
|
border-color: rgba(0, 0, 0, 0.7);
|
||||||
background-color: #222728;
|
background-color: #222728;
|
||||||
box-shadow: none;
|
box-shadow: inset 0 0 black;
|
||||||
text-shadow: none;
|
text-shadow: none;
|
||||||
icon-shadow: none; }
|
icon-shadow: none; }
|
||||||
.keyboard-key:grayed {
|
.keyboard-key:grayed {
|
||||||
@ -1443,13 +1628,13 @@ StScrollBar {
|
|||||||
color: white;
|
color: white;
|
||||||
border-color: rgba(0, 0, 0, 0.7);
|
border-color: rgba(0, 0, 0, 0.7);
|
||||||
background-color: #1c5187;
|
background-color: #1c5187;
|
||||||
box-shadow: none;
|
box-shadow: inset 0 0 black;
|
||||||
text-shadow: none;
|
text-shadow: none;
|
||||||
icon-shadow: none; }
|
icon-shadow: none; }
|
||||||
.login-dialog .modal-dialog-button:default:insensitive {
|
.login-dialog .modal-dialog-button:default:insensitive {
|
||||||
color: #939695;
|
color: #949796;
|
||||||
border-color: rgba(0, 0, 0, 0.7);
|
border-color: rgba(0, 0, 0, 0.7);
|
||||||
background-color: rgba(66, 71, 73, 0.7);
|
background-color: rgba(66, 72, 73, 0.7);
|
||||||
box-shadow: none;
|
box-shadow: none;
|
||||||
text-shadow: none;
|
text-shadow: none;
|
||||||
icon-shadow: none; }
|
icon-shadow: none; }
|
||||||
@ -1472,9 +1657,11 @@ StScrollBar {
|
|||||||
|
|
||||||
.login-dialog-user-selection-box {
|
.login-dialog-user-selection-box {
|
||||||
padding: 100px 0px; }
|
padding: 100px 0px; }
|
||||||
.login-dialog-user-selection-box .login-dialog-not-listed-label {
|
|
||||||
|
.login-dialog-not-listed-label {
|
||||||
padding-left: 2px; }
|
padding-left: 2px; }
|
||||||
.login-dialog-not-listed-button:focus .login-dialog-user-selection-box .login-dialog-not-listed-label, .login-dialog-not-listed-button:hover .login-dialog-user-selection-box .login-dialog-not-listed-label {
|
.login-dialog-not-listed-button:focus .login-dialog-not-listed-label,
|
||||||
|
.login-dialog-not-listed-button:hover .login-dialog-not-listed-label {
|
||||||
color: #eeeeec; }
|
color: #eeeeec; }
|
||||||
|
|
||||||
.login-dialog-not-listed-label {
|
.login-dialog-not-listed-label {
|
||||||
@ -1490,7 +1677,7 @@ StScrollBar {
|
|||||||
spacing: 12px;
|
spacing: 12px;
|
||||||
padding: .2em;
|
padding: .2em;
|
||||||
width: 23em; }
|
width: 23em; }
|
||||||
.login-dialog-user-list:expanded .login-dialog-user-list-item:focus {
|
.login-dialog-user-list:expanded .login-dialog-user-list-item:selected {
|
||||||
background-color: #215d9c;
|
background-color: #215d9c;
|
||||||
color: #ffffff; }
|
color: #ffffff; }
|
||||||
.login-dialog-user-list:expanded .login-dialog-user-list-item:logged-in {
|
.login-dialog-user-list:expanded .login-dialog-user-list-item:logged-in {
|
||||||
@ -1504,9 +1691,6 @@ StScrollBar {
|
|||||||
padding-right: 1em; }
|
padding-right: 1em; }
|
||||||
.login-dialog-user-list-item:rtl {
|
.login-dialog-user-list-item:rtl {
|
||||||
padding-left: 1em; }
|
padding-left: 1em; }
|
||||||
.login-dialog-user-list-item:hover {
|
|
||||||
background-color: #215d9c;
|
|
||||||
color: #ffffff; }
|
|
||||||
.login-dialog-user-list-item .login-dialog-timed-login-indicator {
|
.login-dialog-user-list-item .login-dialog-timed-login-indicator {
|
||||||
height: 2px;
|
height: 2px;
|
||||||
margin: 2px 0 0 0;
|
margin: 2px 0 0 0;
|
||||||
@ -1524,6 +1708,7 @@ StScrollBar {
|
|||||||
|
|
||||||
.user-widget-label:ltr {
|
.user-widget-label:ltr {
|
||||||
padding-left: 18px; }
|
padding-left: 18px; }
|
||||||
|
|
||||||
.user-widget-label:rtl {
|
.user-widget-label:rtl {
|
||||||
padding-right: 18px; }
|
padding-right: 18px; }
|
||||||
|
|
||||||
@ -1651,6 +1836,7 @@ StScrollBar {
|
|||||||
.lg-dialog StEntry {
|
.lg-dialog StEntry {
|
||||||
selection-background-color: #bbbbbb;
|
selection-background-color: #bbbbbb;
|
||||||
selected-color: #333333; }
|
selected-color: #333333; }
|
||||||
|
|
||||||
.lg-dialog .shell-link {
|
.lg-dialog .shell-link {
|
||||||
color: #999999; }
|
color: #999999; }
|
||||||
.lg-dialog .shell-link:hover {
|
.lg-dialog .shell-link:hover {
|
||||||
|
21
data/theme/meson.build
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
theme_sources = files([
|
||||||
|
'gnome-shell-high-contrast.scss',
|
||||||
|
'gnome-shell.scss',
|
||||||
|
'gnome-shell-sass/_colors.scss',
|
||||||
|
'gnome-shell-sass/_common.scss',
|
||||||
|
'gnome-shell-sass/_drawing.scss',
|
||||||
|
'gnome-shell-sass/_high-contrast-colors.scss'
|
||||||
|
])
|
||||||
|
|
||||||
|
theme_deps = []
|
||||||
|
|
||||||
|
if sassc.found()
|
||||||
|
parse_sass = files('parse-sass.sh')
|
||||||
|
|
||||||
|
theme_deps += custom_target('update-theme',
|
||||||
|
output: 'theme-update.stamp',
|
||||||
|
depend_files: theme_sources,
|
||||||
|
command: [parse_sass, '@OUTPUT@'],
|
||||||
|
build_by_default: true
|
||||||
|
)
|
||||||
|
endif
|
40
data/theme/message-indicator-symbolic.svg
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="16"
|
||||||
|
height="16"
|
||||||
|
viewBox="0 0 4.2333333 4.2333333"
|
||||||
|
version="1.1"
|
||||||
|
id="svg8">
|
||||||
|
<defs
|
||||||
|
id="defs2" />
|
||||||
|
<metadata
|
||||||
|
id="metadata5">
|
||||||
|
<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"
|
||||||
|
style="display:inline"
|
||||||
|
transform="translate(0,-292.76667)">
|
||||||
|
<path
|
||||||
|
style="fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:0.17969394"
|
||||||
|
d="m 3.1749998,294.88333 a 1.0583333,1.0583333 0 0 1 -1.0583332,1.05833 1.0583333,1.0583333 0 0 1 -1.0583333,-1.05833 1.0583333,1.0583333 0 0 1 1.0583333,-1.05833 1.0583333,1.0583333 0 0 1 1.0583332,1.05833 z"
|
||||||
|
id="path4485" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.3 KiB |
@ -1,114 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
|
||||||
|
|
||||||
<svg
|
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
|
||||||
xmlns:cc="http://creativecommons.org/ns#"
|
|
||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
width="16"
|
|
||||||
height="16"
|
|
||||||
id="svg12430"
|
|
||||||
version="1.1"
|
|
||||||
inkscape:version="0.48.4 r9939"
|
|
||||||
sodipodi:docname="more-results.svg">
|
|
||||||
<defs
|
|
||||||
id="defs12432" />
|
|
||||||
<sodipodi:namedview
|
|
||||||
id="base"
|
|
||||||
pagecolor="#7a7a7a"
|
|
||||||
bordercolor="#666666"
|
|
||||||
borderopacity="1.0"
|
|
||||||
inkscape:pageopacity="1"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:zoom="90.509668"
|
|
||||||
inkscape:cx="6.5009792"
|
|
||||||
inkscape:cy="8.3589595"
|
|
||||||
inkscape:document-units="px"
|
|
||||||
inkscape:current-layer="g14642-3-0"
|
|
||||||
showgrid="false"
|
|
||||||
borderlayer="true"
|
|
||||||
inkscape:showpageshadow="false"
|
|
||||||
inkscape:window-width="1440"
|
|
||||||
inkscape:window-height="840"
|
|
||||||
inkscape:window-x="0"
|
|
||||||
inkscape:window-y="27"
|
|
||||||
inkscape:window-maximized="1">
|
|
||||||
<inkscape:grid
|
|
||||||
type="xygrid"
|
|
||||||
id="grid13002" />
|
|
||||||
</sodipodi:namedview>
|
|
||||||
<metadata
|
|
||||||
id="metadata12435">
|
|
||||||
<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 />
|
|
||||||
</cc:Work>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
<g
|
|
||||||
inkscape:label="Layer 1"
|
|
||||||
inkscape:groupmode="layer"
|
|
||||||
id="layer1"
|
|
||||||
transform="translate(0,-1036.3622)">
|
|
||||||
<g
|
|
||||||
style="display:inline"
|
|
||||||
transform="translate(-141.99984,638.37113)"
|
|
||||||
inkscape:label="zoom-in"
|
|
||||||
id="g14642-3-0">
|
|
||||||
<path
|
|
||||||
sodipodi:type="inkscape:offset"
|
|
||||||
inkscape:radius="0"
|
|
||||||
inkscape:original="M 145.1875 400 C 144.5248 400 144 400.54899 144 401.21875 L 144 410.78125 C 144 411.45101 144.5248 412 145.1875 412 L 154.8125 412 C 155.4752 412 156 411.45101 156 410.78125 L 156 401.21875 C 156 400.54899 155.4752 400 154.8125 400 L 145.1875 400 z M 149 403 L 151 403 L 151 405 L 153 405 L 153 407 L 151 407 L 151 409 L 149 409 L 149 407 L 147 407 L 147 405 L 149 405 L 149 403 z "
|
|
||||||
xlink:href="#rect11749-5-0-1-8"
|
|
||||||
style="color:#bebebe;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;opacity:0.8"
|
|
||||||
id="path13004"
|
|
||||||
inkscape:href="#rect11749-5-0-1-8"
|
|
||||||
d="M 145.1875,400 C 144.5248,400 144,400.54899 144,401.21875 l 0,9.5625 c 0,0.66976 0.5248,1.21875 1.1875,1.21875 l 9.625,0 c 0.6627,0 1.1875,-0.54899 1.1875,-1.21875 l 0,-9.5625 C 156,400.54899 155.4752,400 154.8125,400 L 145.1875,400 z m 3.8125,3 2,0 0,2 2,0 0,2 -2,0 0,2 -2,0 0,-2 -2,0 0,-2 2,0 L 149,403 Z"
|
|
||||||
transform="translate(0,1)" />
|
|
||||||
<use
|
|
||||||
x="0"
|
|
||||||
y="0"
|
|
||||||
xlink:href="#path13004"
|
|
||||||
id="use11960"
|
|
||||||
transform="translate(1,-1)"
|
|
||||||
width="16"
|
|
||||||
height="16" />
|
|
||||||
<use
|
|
||||||
x="0"
|
|
||||||
y="0"
|
|
||||||
xlink:href="#use11960"
|
|
||||||
id="use11962"
|
|
||||||
transform="translate(-2,0)"
|
|
||||||
width="16"
|
|
||||||
height="16" />
|
|
||||||
<path
|
|
||||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
|
||||||
d="M 7 5 L 7 7 L 5 7 L 5 9 L 7 9 L 7 11 L 9 11 L 9 9 L 11 9 L 11 7 L 9 7 L 9 5 L 7 5 z "
|
|
||||||
transform="translate(141.99984,397.99107)"
|
|
||||||
id="rect3757" />
|
|
||||||
<path
|
|
||||||
inkscape:connector-curvature="0"
|
|
||||||
style="color:#bebebe;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible"
|
|
||||||
d="M 145.1875,400 C 144.5248,400 144,400.54899 144,401.21875 l 0,9.5625 c 0,0.66976 0.5248,1.21875 1.1875,1.21875 l 9.625,0 c 0.6627,0 1.1875,-0.54899 1.1875,-1.21875 l 0,-9.5625 C 156,400.54899 155.4752,400 154.8125,400 L 145.1875,400 z m 3.8125,3 2,0 0,2 2,0 0,2 -2,0 0,2 -2,0 0,-2 -2,0 0,-2 2,0 L 149,403 Z"
|
|
||||||
id="rect11749-5-0-1-8" />
|
|
||||||
<rect
|
|
||||||
style="fill:none;stroke:none"
|
|
||||||
id="rect3620-5-4"
|
|
||||||
width="15.981825"
|
|
||||||
height="16"
|
|
||||||
x="142"
|
|
||||||
y="398"
|
|
||||||
rx="0"
|
|
||||||
ry="0" />
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 4.4 KiB |
30
data/theme/pad-osd.css
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
.Leader {
|
||||||
|
stroke-width: .5 !important;
|
||||||
|
stroke: #535353;
|
||||||
|
fill: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.Button {
|
||||||
|
stroke-width: .25;
|
||||||
|
stroke: #ededed;
|
||||||
|
fill: #ededed;
|
||||||
|
}
|
||||||
|
|
||||||
|
.Ring {
|
||||||
|
stroke-width: .5 !important;
|
||||||
|
stroke: #535353 !important;
|
||||||
|
fill: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.Label {
|
||||||
|
stroke: none !important;
|
||||||
|
stroke-width: .1 !important;
|
||||||
|
font-size: .1 !important;
|
||||||
|
fill: transparent !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.TouchStrip, .TouchRing {
|
||||||
|
stroke-width: .1 !important;
|
||||||
|
stroke: #ededed !important;
|
||||||
|
fill: #535353 !important;
|
||||||
|
}
|
@ -1,3 +1,10 @@
|
|||||||
#!/usr/bin/bash
|
#!/bin/sh
|
||||||
|
|
||||||
bundle exec sass --update --sourcemap=none .
|
srcdir=`dirname $0`
|
||||||
|
stamp=${1}
|
||||||
|
for scss in $srcdir/*.scss
|
||||||
|
do
|
||||||
|
sassc -a $scss ${scss%%.scss}.css || exit 1
|
||||||
|
done
|
||||||
|
|
||||||
|
[ "$stamp" ] && touch $stamp
|
||||||
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 98 KiB |
133
data/theme/toggle-off-hc.svg
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
<?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="48"
|
||||||
|
height="22"
|
||||||
|
id="svg2857"
|
||||||
|
version="1.1"
|
||||||
|
inkscape:version="0.91 r13725"
|
||||||
|
sodipodi:docname="toggle-off-hc.svg">
|
||||||
|
<defs
|
||||||
|
id="defs2859">
|
||||||
|
<inkscape:perspective
|
||||||
|
sodipodi:type="inkscape:persp3d"
|
||||||
|
inkscape:vp_x="0 : 526.18109 : 1"
|
||||||
|
inkscape:vp_y="0 : 1000 : 0"
|
||||||
|
inkscape:vp_z="744.09448 : 526.18109 : 1"
|
||||||
|
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
|
||||||
|
id="perspective2865" />
|
||||||
|
<inkscape:perspective
|
||||||
|
id="perspective2843"
|
||||||
|
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||||
|
inkscape:vp_z="1 : 0.5 : 1"
|
||||||
|
inkscape:vp_y="0 : 1000 : 0"
|
||||||
|
inkscape:vp_x="0 : 0.5 : 1"
|
||||||
|
sodipodi:type="inkscape:persp3d" />
|
||||||
|
<inkscape:path-effect
|
||||||
|
effect="spiro"
|
||||||
|
id="path-effect77541-4"
|
||||||
|
is_visible="true" />
|
||||||
|
</defs>
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#000000"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="1"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="1"
|
||||||
|
inkscape:cx="-6.1820581"
|
||||||
|
inkscape:cy="-16.463788"
|
||||||
|
inkscape:document-units="px"
|
||||||
|
inkscape:current-layer="g37994"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:window-width="2560"
|
||||||
|
inkscape:window-height="1364"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="27"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
borderlayer="true"
|
||||||
|
inkscape:showpageshadow="false"
|
||||||
|
inkscape:snap-nodes="false"
|
||||||
|
inkscape:snap-bbox="true"
|
||||||
|
showborder="true">
|
||||||
|
<inkscape:grid
|
||||||
|
type="xygrid"
|
||||||
|
id="grid12954"
|
||||||
|
empspacing="5"
|
||||||
|
visible="true"
|
||||||
|
enabled="true"
|
||||||
|
snapvisiblegridlinesonly="true" />
|
||||||
|
</sodipodi:namedview>
|
||||||
|
<metadata
|
||||||
|
id="metadata2862">
|
||||||
|
<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
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(-444.64286,-781.36218)">
|
||||||
|
<g
|
||||||
|
transform="matrix(0.6526046,0,0,0.80554422,99.592644,-636.32172)"
|
||||||
|
id="g37994">
|
||||||
|
<g
|
||||||
|
transform="matrix(1.5323214,0,0,1.2413968,-324.76058,489.69039)"
|
||||||
|
id="toggle-off"
|
||||||
|
inkscape:label="#g8477">
|
||||||
|
<circle
|
||||||
|
cy="1033.993"
|
||||||
|
cx="571.95966"
|
||||||
|
id="path8444"
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#555753;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
r="7" />
|
||||||
|
<rect
|
||||||
|
ry="2.0108337"
|
||||||
|
rx="1.9562569"
|
||||||
|
y="1031.9885"
|
||||||
|
x="565.0083"
|
||||||
|
height="4.0216675"
|
||||||
|
width="34.850178"
|
||||||
|
id="rect8461"
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#555753;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
transform="matrix(1.5323214,0,0,1.2413968,-324.85635,491.16456)"
|
||||||
|
id="toggle-on"
|
||||||
|
inkscape:label="#g8481">
|
||||||
|
<rect
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#3465a4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
id="rect8475"
|
||||||
|
width="34.850178"
|
||||||
|
height="4.0216675"
|
||||||
|
x="565.0083"
|
||||||
|
y="1070.9279"
|
||||||
|
rx="1.9562569"
|
||||||
|
ry="2.0108337" />
|
||||||
|
<circle
|
||||||
|
transform="scale(-1,1)"
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#3465a4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
id="circle8463"
|
||||||
|
cx="-591.0213"
|
||||||
|
cy="1072.9402"
|
||||||
|
r="9" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 6.1 KiB |
113
data/theme/toggle-on-hc.svg
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
<?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="48"
|
||||||
|
height="22"
|
||||||
|
id="svg2857"
|
||||||
|
version="1.1"
|
||||||
|
inkscape:version="0.91 r13725"
|
||||||
|
sodipodi:docname="toggle-on-hc.svg">
|
||||||
|
<defs
|
||||||
|
id="defs2859">
|
||||||
|
<inkscape:perspective
|
||||||
|
sodipodi:type="inkscape:persp3d"
|
||||||
|
inkscape:vp_x="0 : 526.18109 : 1"
|
||||||
|
inkscape:vp_y="0 : 1000 : 0"
|
||||||
|
inkscape:vp_z="744.09448 : 526.18109 : 1"
|
||||||
|
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
|
||||||
|
id="perspective2865" />
|
||||||
|
<inkscape:perspective
|
||||||
|
id="perspective2843"
|
||||||
|
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||||
|
inkscape:vp_z="1 : 0.5 : 1"
|
||||||
|
inkscape:vp_y="0 : 1000 : 0"
|
||||||
|
inkscape:vp_x="0 : 0.5 : 1"
|
||||||
|
sodipodi:type="inkscape:persp3d" />
|
||||||
|
<inkscape:path-effect
|
||||||
|
effect="spiro"
|
||||||
|
id="path-effect77541-4"
|
||||||
|
is_visible="true" />
|
||||||
|
</defs>
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#000000"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="1"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="1"
|
||||||
|
inkscape:cx="-222.95215"
|
||||||
|
inkscape:cy="3.9378433"
|
||||||
|
inkscape:document-units="px"
|
||||||
|
inkscape:current-layer="g37994"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:window-width="2560"
|
||||||
|
inkscape:window-height="1364"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="27"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
borderlayer="true"
|
||||||
|
inkscape:showpageshadow="false"
|
||||||
|
inkscape:snap-nodes="false"
|
||||||
|
inkscape:snap-bbox="true"
|
||||||
|
showborder="true">
|
||||||
|
<inkscape:grid
|
||||||
|
type="xygrid"
|
||||||
|
id="grid12954"
|
||||||
|
empspacing="5"
|
||||||
|
visible="true"
|
||||||
|
enabled="true"
|
||||||
|
snapvisiblegridlinesonly="true" />
|
||||||
|
</sodipodi:namedview>
|
||||||
|
<metadata
|
||||||
|
id="metadata2862">
|
||||||
|
<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
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(-444.64286,-781.36218)">
|
||||||
|
<g
|
||||||
|
transform="matrix(0.6526046,0,0,0.80554422,99.592644,-636.32172)"
|
||||||
|
id="g37994">
|
||||||
|
<g
|
||||||
|
transform="matrix(1.5323214,0,0,1.2413968,-324.85635,441.50868)"
|
||||||
|
id="toggle-on"
|
||||||
|
inkscape:label="#g8481">
|
||||||
|
<rect
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#3465a4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
id="rect8475"
|
||||||
|
width="34.850178"
|
||||||
|
height="4.0216675"
|
||||||
|
x="565.0083"
|
||||||
|
y="1070.9279"
|
||||||
|
rx="1.9562569"
|
||||||
|
ry="2.0108337" />
|
||||||
|
<circle
|
||||||
|
transform="scale(-1,1)"
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#3465a4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
id="circle8463"
|
||||||
|
cx="-591.0213"
|
||||||
|
cy="1072.9402"
|
||||||
|
r="9" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 4.4 KiB |
@ -14,7 +14,7 @@
|
|||||||
height="22"
|
height="22"
|
||||||
id="svg2857"
|
id="svg2857"
|
||||||
version="1.1"
|
version="1.1"
|
||||||
inkscape:version="0.48.5 r10040"
|
inkscape:version="0.91 r13725"
|
||||||
sodipodi:docname="toggle-on-intl.svg">
|
sodipodi:docname="toggle-on-intl.svg">
|
||||||
<defs
|
<defs
|
||||||
id="defs2859">
|
id="defs2859">
|
||||||
@ -52,7 +52,7 @@
|
|||||||
<stop
|
<stop
|
||||||
id="stop77465"
|
id="stop77465"
|
||||||
offset="1"
|
offset="1"
|
||||||
style="stop-color:#204a87;stop-opacity:1" />
|
style="stop-color:#205b9a;stop-opacity:1" />
|
||||||
</linearGradient>
|
</linearGradient>
|
||||||
<linearGradient
|
<linearGradient
|
||||||
inkscape:collect="always"
|
inkscape:collect="always"
|
||||||
@ -88,14 +88,14 @@
|
|||||||
borderopacity="1.0"
|
borderopacity="1.0"
|
||||||
inkscape:pageopacity="1"
|
inkscape:pageopacity="1"
|
||||||
inkscape:pageshadow="2"
|
inkscape:pageshadow="2"
|
||||||
inkscape:zoom="32"
|
inkscape:zoom="1"
|
||||||
inkscape:cx="17.255148"
|
inkscape:cx="37.410841"
|
||||||
inkscape:cy="8.9252639"
|
inkscape:cy="16.009314"
|
||||||
inkscape:document-units="px"
|
inkscape:document-units="px"
|
||||||
inkscape:current-layer="g37994"
|
inkscape:current-layer="g37994"
|
||||||
showgrid="true"
|
showgrid="false"
|
||||||
inkscape:window-width="2560"
|
inkscape:window-width="2560"
|
||||||
inkscape:window-height="1375"
|
inkscape:window-height="1376"
|
||||||
inkscape:window-x="0"
|
inkscape:window-x="0"
|
||||||
inkscape:window-y="27"
|
inkscape:window-y="27"
|
||||||
inkscape:window-maximized="1"
|
inkscape:window-maximized="1"
|
||||||
|
Before Width: | Height: | Size: 6.8 KiB After Width: | Height: | Size: 6.8 KiB |
@ -14,7 +14,7 @@
|
|||||||
height="22"
|
height="22"
|
||||||
id="svg2857"
|
id="svg2857"
|
||||||
version="1.1"
|
version="1.1"
|
||||||
inkscape:version="0.48.5 r10040"
|
inkscape:version="0.91 r13725"
|
||||||
sodipodi:docname="toggle-on-us.svg">
|
sodipodi:docname="toggle-on-us.svg">
|
||||||
<defs
|
<defs
|
||||||
id="defs2859">
|
id="defs2859">
|
||||||
@ -32,28 +32,6 @@
|
|||||||
inkscape:vp_y="0 : 1000 : 0"
|
inkscape:vp_y="0 : 1000 : 0"
|
||||||
inkscape:vp_x="0 : 0.5 : 1"
|
inkscape:vp_x="0 : 0.5 : 1"
|
||||||
sodipodi:type="inkscape:persp3d" />
|
sodipodi:type="inkscape:persp3d" />
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient77461"
|
|
||||||
id="linearGradient77551"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
gradientTransform="matrix(1.3066667,0,0,1,-841.64667,-483)"
|
|
||||||
x1="1164.7644"
|
|
||||||
y1="962.93695"
|
|
||||||
x2="1164.7644"
|
|
||||||
y2="970.51404" />
|
|
||||||
<linearGradient
|
|
||||||
id="linearGradient77461"
|
|
||||||
inkscape:collect="always">
|
|
||||||
<stop
|
|
||||||
id="stop77463"
|
|
||||||
offset="0"
|
|
||||||
style="stop-color:#182f4c;stop-opacity:1" />
|
|
||||||
<stop
|
|
||||||
id="stop77465"
|
|
||||||
offset="1"
|
|
||||||
style="stop-color:#204a87;stop-opacity:1" />
|
|
||||||
</linearGradient>
|
|
||||||
<linearGradient
|
<linearGradient
|
||||||
inkscape:collect="always"
|
inkscape:collect="always"
|
||||||
xlink:href="#linearGradient76469-7-7-4"
|
xlink:href="#linearGradient76469-7-7-4"
|
||||||
@ -80,6 +58,38 @@
|
|||||||
effect="spiro"
|
effect="spiro"
|
||||||
id="path-effect77541-4"
|
id="path-effect77541-4"
|
||||||
is_visible="true" />
|
is_visible="true" />
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient77461-1"
|
||||||
|
inkscape:collect="always">
|
||||||
|
<stop
|
||||||
|
id="stop77463-1"
|
||||||
|
offset="0"
|
||||||
|
style="stop-color:#182f4c;stop-opacity:1" />
|
||||||
|
<stop
|
||||||
|
id="stop77465-4"
|
||||||
|
offset="1"
|
||||||
|
style="stop-color:#205b9a;stop-opacity:1" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient77461-1"
|
||||||
|
id="linearGradient77551-6-5"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.8527367,0,0,0.80554422,-969.41608,-778.00299)"
|
||||||
|
x1="1164.7644"
|
||||||
|
y1="962.93695"
|
||||||
|
x2="1164.7644"
|
||||||
|
y2="970.51404" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient77461-1"
|
||||||
|
id="linearGradient11198"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(1.3066667,0,0,1,-1066.3709,794.25325)"
|
||||||
|
x1="1322.5831"
|
||||||
|
y1="-312.51855"
|
||||||
|
x2="1322.5831"
|
||||||
|
y2="-306.53461" />
|
||||||
</defs>
|
</defs>
|
||||||
<sodipodi:namedview
|
<sodipodi:namedview
|
||||||
id="base"
|
id="base"
|
||||||
@ -89,13 +99,13 @@
|
|||||||
inkscape:pageopacity="1"
|
inkscape:pageopacity="1"
|
||||||
inkscape:pageshadow="2"
|
inkscape:pageshadow="2"
|
||||||
inkscape:zoom="1"
|
inkscape:zoom="1"
|
||||||
inkscape:cx="33.380898"
|
inkscape:cx="-26.798898"
|
||||||
inkscape:cy="6.9658271"
|
inkscape:cy="5.3753009"
|
||||||
inkscape:document-units="px"
|
inkscape:document-units="px"
|
||||||
inkscape:current-layer="g37994"
|
inkscape:current-layer="g37994"
|
||||||
showgrid="false"
|
showgrid="false"
|
||||||
inkscape:window-width="2560"
|
inkscape:window-width="2560"
|
||||||
inkscape:window-height="1375"
|
inkscape:window-height="1376"
|
||||||
inkscape:window-x="0"
|
inkscape:window-x="0"
|
||||||
inkscape:window-y="27"
|
inkscape:window-y="27"
|
||||||
inkscape:window-maximized="1"
|
inkscape:window-maximized="1"
|
||||||
@ -152,7 +162,7 @@
|
|||||||
height="25"
|
height="25"
|
||||||
width="98"
|
width="98"
|
||||||
id="rect38000"
|
id="rect38000"
|
||||||
style="color:#000000;fill:url(#linearGradient77551);fill-opacity:1;fill-rule:nonzero;stroke:#182f4c;stroke-width:1.37920964;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
|
style="color:#000000;fill:url(#linearGradient11198);fill-opacity:1;fill-rule:nonzero;stroke:#182f4c;stroke-width:1.37920964;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;clip-rule:nonzero;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;filter-blend-mode:normal;filter-gaussianBlur-deviation:0;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto" />
|
||||||
</g>
|
</g>
|
||||||
<g
|
<g
|
||||||
transform="translate(2.0625,-2)"
|
transform="translate(2.0625,-2)"
|
||||||
|
Before Width: | Height: | Size: 7.0 KiB After Width: | Height: | Size: 7.7 KiB |
@ -1 +0,0 @@
|
|||||||
SUBDIRS = reference
|
|
@ -1 +0,0 @@
|
|||||||
SUBDIRS = shell st
|
|
5
docs/reference/meson.build
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
version_conf = configuration_data()
|
||||||
|
version_conf.set('VERSION', meson.project_version())
|
||||||
|
|
||||||
|
subdir('shell')
|
||||||
|
subdir('st')
|
@ -1,139 +0,0 @@
|
|||||||
## Process this file with automake to produce Makefile.in
|
|
||||||
|
|
||||||
# We require automake 1.6 at least.
|
|
||||||
AUTOMAKE_OPTIONS = 1.6
|
|
||||||
|
|
||||||
# This is a blank Makefile.am for using gtk-doc.
|
|
||||||
# Copy this to your project's API docs directory and modify the variables to
|
|
||||||
# suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples
|
|
||||||
# of using the various options.
|
|
||||||
|
|
||||||
# The name of the module, e.g. 'glib'.
|
|
||||||
DOC_MODULE=shell
|
|
||||||
|
|
||||||
# Uncomment for versioned docs and specify the version of the module, e.g. '2'.
|
|
||||||
#DOC_MODULE_VERSION=2
|
|
||||||
|
|
||||||
|
|
||||||
# The top-level SGML file. You can change this if you want to.
|
|
||||||
DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.sgml
|
|
||||||
|
|
||||||
# Directories containing the source code
|
|
||||||
# gtk-doc will search all .c and .h files beneath these paths
|
|
||||||
# for inline comments documenting functions and macros.
|
|
||||||
DOC_SOURCE_DIR=$(top_srcdir)/src
|
|
||||||
|
|
||||||
# Extra options to pass to gtkdoc-scangobj. Not normally needed.
|
|
||||||
SCANGOBJ_OPTIONS=
|
|
||||||
|
|
||||||
# Extra options to supply to gtkdoc-scan.
|
|
||||||
# e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED"
|
|
||||||
SCAN_OPTIONS=--rebuild-types
|
|
||||||
|
|
||||||
# Extra options to supply to gtkdoc-mkdb.
|
|
||||||
# e.g. MKDB_OPTIONS=--xml-mode --output-format=xml
|
|
||||||
MKDB_OPTIONS=--xml-mode --output-format=xml
|
|
||||||
|
|
||||||
# Extra options to supply to gtkdoc-mktmpl
|
|
||||||
# e.g. MKTMPL_OPTIONS=--only-section-tmpl
|
|
||||||
MKTMPL_OPTIONS=
|
|
||||||
|
|
||||||
# Extra options to supply to gtkdoc-mkhtml
|
|
||||||
MKHTML_OPTIONS=
|
|
||||||
|
|
||||||
# Extra options to supply to gtkdoc-fixref. Not normally needed.
|
|
||||||
# e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html
|
|
||||||
FIXXREF_OPTIONS=
|
|
||||||
|
|
||||||
# Used for dependencies. The docs will be rebuilt if any of these change.
|
|
||||||
# e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h
|
|
||||||
# e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c
|
|
||||||
HFILE_GLOB=$(top_srcdir)/src/*.h
|
|
||||||
CFILE_GLOB=$(top_srcdir)/src/*.c
|
|
||||||
|
|
||||||
# Extra header to include when scanning, which are not under DOC_SOURCE_DIR
|
|
||||||
# e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h
|
|
||||||
EXTRA_HFILES=
|
|
||||||
|
|
||||||
# Header files or dirs to ignore when scanning. Use base file/dir names
|
|
||||||
# e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h private_code
|
|
||||||
IGNORE_HFILES= \
|
|
||||||
calendar-server \
|
|
||||||
gvc \
|
|
||||||
hotplug-sniffer \
|
|
||||||
st \
|
|
||||||
tray \
|
|
||||||
gactionmuxer.h \
|
|
||||||
gactionobservable.h \
|
|
||||||
gactionobserver.h \
|
|
||||||
shell-network-agent.h \
|
|
||||||
shell-recorder-src.h
|
|
||||||
|
|
||||||
if !BUILD_RECORDER
|
|
||||||
IGNORE_HFILES += shell-recorder.h
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Images to copy into HTML directory.
|
|
||||||
# e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png
|
|
||||||
HTML_IMAGES=
|
|
||||||
|
|
||||||
doc-gen-org.gnome.Shell.SearchProvider.xml: $(top_srcdir)/data/org.gnome.ShellSearchProvider.xml
|
|
||||||
gdbus-codegen \
|
|
||||||
--interface-prefix org.gnome.ShellSearchProvider. \
|
|
||||||
--generate-docbook doc-gen \
|
|
||||||
$(top_srcdir)/data/org.gnome.ShellSearchProvider.xml
|
|
||||||
|
|
||||||
doc-gen-org.gnome.Shell.SearchProvider2.xml: $(top_srcdir)/data/org.gnome.ShellSearchProvider2.xml
|
|
||||||
gdbus-codegen \
|
|
||||||
--interface-prefix org.gnome.ShellSearchProvider2. \
|
|
||||||
--generate-docbook doc-gen \
|
|
||||||
$(top_srcdir)/data/org.gnome.ShellSearchProvider2.xml
|
|
||||||
|
|
||||||
doc-gen-org.gnome.Shell.Screenshot.xml: $(top_srcdir)/data/org.gnome.Shell.Screenshot.xml
|
|
||||||
gdbus-codegen \
|
|
||||||
--interface-prefix org.gnome.Shell.Screenshot. \
|
|
||||||
--generate-docbook doc-gen \
|
|
||||||
$(top_srcdir)/data/org.gnome.Shell.Screenshot.xml
|
|
||||||
|
|
||||||
# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE).
|
|
||||||
# e.g. content_files=running.sgml building.sgml changes-2.0.sgml
|
|
||||||
content_files= \
|
|
||||||
doc-gen-org.gnome.Shell.SearchProvider.xml \
|
|
||||||
doc-gen-org.gnome.Shell.SearchProvider2.xml \
|
|
||||||
doc-gen-org.gnome.Shell.Screenshot.xml
|
|
||||||
|
|
||||||
# SGML files where gtk-doc abbrevations (#GtkWidget) are expanded
|
|
||||||
# These files must be listed here *and* in content_files
|
|
||||||
# e.g. expand_content_files=running.sgml
|
|
||||||
expand_content_files=
|
|
||||||
|
|
||||||
# CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library.
|
|
||||||
# Only needed if you are using gtkdoc-scangobj to dynamically query widget
|
|
||||||
# signals and properties.
|
|
||||||
# e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS)
|
|
||||||
# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib)
|
|
||||||
GTKDOC_CFLAGS=$(GNOME_SHELL_CFLAGS)
|
|
||||||
GTKDOC_LIBS=$(GNOME_SHELL_LIBS) $(top_builddir)/src/libgnome-shell-menu.la $(top_builddir)/src/libgnome-shell-base.la $(top_builddir)/src/libgnome-shell.la
|
|
||||||
|
|
||||||
# This includes the standard gtk-doc make rules, copied by gtkdocize.
|
|
||||||
include $(top_srcdir)/gtk-doc.make
|
|
||||||
|
|
||||||
# Other files to distribute
|
|
||||||
# e.g. EXTRA_DIST += version.xml.in
|
|
||||||
EXTRA_DIST +=
|
|
||||||
|
|
||||||
# Files not to distribute
|
|
||||||
# for --rebuild-types in $(SCAN_OPTIONS), e.g. $(DOC_MODULE).types
|
|
||||||
# for --rebuild-sections in $(SCAN_OPTIONS) e.g. $(DOC_MODULE)-sections.txt
|
|
||||||
DISTCLEANFILES = $(DOC_MODULES).types
|
|
||||||
|
|
||||||
# Comment this out if you want 'make check' to test you doc status
|
|
||||||
# and run some sanity checks
|
|
||||||
if ENABLE_GTK_DOC
|
|
||||||
TESTS_ENVIRONMENT = cd $(srcdir) && \
|
|
||||||
DOC_MODULE=$(DOC_MODULE) DOC_MAIN_SGML_FILE=$(DOC_MAIN_SGML_FILE) \
|
|
||||||
SRCDIR=$(abs_srcdir) BUILDDIR=$(abs_builddir)
|
|
||||||
#TESTS = $(GTKDOC_CHECK)
|
|
||||||
endif
|
|
||||||
|
|
||||||
-include $(top_srcdir)/git.mk
|
|
57
docs/reference/shell/meson.build
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
private_headers = [
|
||||||
|
'gactionmuxer.h',
|
||||||
|
'gactionobservable.h',
|
||||||
|
'gactionobserver.h',
|
||||||
|
'shell-network-agent.h',
|
||||||
|
'shell-recorder-src.h'
|
||||||
|
]
|
||||||
|
|
||||||
|
if not enable_recorder
|
||||||
|
private_headers += 'shell-recorder.h'
|
||||||
|
endif
|
||||||
|
|
||||||
|
exclude_directories = [
|
||||||
|
'calendar-server',
|
||||||
|
'hotplug-sniffer',
|
||||||
|
'st',
|
||||||
|
'tray'
|
||||||
|
]
|
||||||
|
|
||||||
|
ifaces = [
|
||||||
|
['org.gnome.Shell.Screenshot', 'org.gnome.Shell.Screenshot.xml'],
|
||||||
|
['org.gnome.ShellSearchProvider', 'org.gnome.Shell.SearchProvider.xml'],
|
||||||
|
['org.gnome.ShellSearchProvider2', 'org.gnome.Shell.SearchProvider2.xml']
|
||||||
|
]
|
||||||
|
foreach iface : ifaces
|
||||||
|
custom_target(iface[0] + ' docs',
|
||||||
|
input: '../../../data/@0@.xml'.format(iface[0]),
|
||||||
|
output: 'doc-gen-' + iface[1],
|
||||||
|
command: [
|
||||||
|
'gdbus-codegen',
|
||||||
|
'--interface-prefix=@0@.'.format(iface),
|
||||||
|
'--generate-docbook', 'doc-gen',
|
||||||
|
'--output-directory', '@OUTDIR@',
|
||||||
|
'@INPUT@'
|
||||||
|
],
|
||||||
|
build_by_default: true
|
||||||
|
)
|
||||||
|
endforeach
|
||||||
|
|
||||||
|
configure_file(
|
||||||
|
input: 'version.xml.in',
|
||||||
|
output: 'version.xml',
|
||||||
|
configuration: version_conf
|
||||||
|
)
|
||||||
|
|
||||||
|
gnome.gtkdoc('shell',
|
||||||
|
main_sgml: 'shell-docs.sgml',
|
||||||
|
src_dir: [
|
||||||
|
join_paths(meson.source_root(), 'src'),
|
||||||
|
join_paths(meson.build_root(), 'src')
|
||||||
|
],
|
||||||
|
scan_args: [
|
||||||
|
'--ignore-headers=' + ' '.join(private_headers + exclude_directories),
|
||||||
|
'--rebuild-types'
|
||||||
|
],
|
||||||
|
install: true
|
||||||
|
)
|
@ -3,12 +3,13 @@
|
|||||||
"http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd"
|
"http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd"
|
||||||
[
|
[
|
||||||
<!ENTITY % local.common.attrib "xmlns:xi CDATA #FIXED 'http://www.w3.org/2003/XInclude'">
|
<!ENTITY % local.common.attrib "xmlns:xi CDATA #FIXED 'http://www.w3.org/2003/XInclude'">
|
||||||
|
<!ENTITY version SYSTEM "version.xml">
|
||||||
]>
|
]>
|
||||||
<book id="index">
|
<book id="index">
|
||||||
<bookinfo>
|
<bookinfo>
|
||||||
<title>Shell Reference Manual</title>
|
<title>Shell Reference Manual</title>
|
||||||
<releaseinfo>
|
<releaseinfo>
|
||||||
for Shell @VERSION@.
|
for Shell &version;.
|
||||||
<!--The latest version of this documentation can be found on-line at
|
<!--The latest version of this documentation can be found on-line at
|
||||||
<ulink role="online-location" url="http://[SERVER]/shell/index.html">http://[SERVER]/shell/</ulink>.-->
|
<ulink role="online-location" url="http://[SERVER]/shell/index.html">http://[SERVER]/shell/</ulink>.-->
|
||||||
</releaseinfo>
|
</releaseinfo>
|
||||||
@ -50,12 +51,16 @@
|
|||||||
<xi:include href="xml/shell-util.xml"/>
|
<xi:include href="xml/shell-util.xml"/>
|
||||||
<xi:include href="xml/shell-mount-operation.xml"/>
|
<xi:include href="xml/shell-mount-operation.xml"/>
|
||||||
<xi:include href="xml/shell-polkit-authentication-agent.xml"/>
|
<xi:include href="xml/shell-polkit-authentication-agent.xml"/>
|
||||||
<xi:include href="xml/shell-tp-client.xml"/>
|
|
||||||
</chapter>
|
</chapter>
|
||||||
|
<!-- FIXME:
|
||||||
|
Not generated at the moment, find out whether to blame gtk-doc or meson
|
||||||
|
-->
|
||||||
|
<!--
|
||||||
<chapter id="object-tree">
|
<chapter id="object-tree">
|
||||||
<title>Object Hierarchy</title>
|
<title>Object Hierarchy</title>
|
||||||
<xi:include href="xml/tree_index.sgml"/>
|
<xi:include href="xml/tree_index.sgml"/>
|
||||||
</chapter>
|
</chapter>
|
||||||
|
-->
|
||||||
<index id="api-index-full">
|
<index id="api-index-full">
|
||||||
<title>API Index</title>
|
<title>API Index</title>
|
||||||
<xi:include href="xml/api-index-full.xml"><xi:fallback /></xi:include>
|
<xi:include href="xml/api-index-full.xml"><xi:fallback /></xi:include>
|
1
docs/reference/shell/version.xml.in
Normal file
@ -0,0 +1 @@
|
|||||||
|
@VERSION@
|
@ -1,104 +0,0 @@
|
|||||||
## Process this file with automake to produce Makefile.in
|
|
||||||
|
|
||||||
# We require automake 1.6 at least.
|
|
||||||
AUTOMAKE_OPTIONS = 1.6
|
|
||||||
|
|
||||||
# This is a blank Makefile.am for using gtk-doc.
|
|
||||||
# Copy this to your project's API docs directory and modify the variables to
|
|
||||||
# suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples
|
|
||||||
# of using the various options.
|
|
||||||
|
|
||||||
# The name of the module, e.g. 'glib'.
|
|
||||||
DOC_MODULE=st
|
|
||||||
|
|
||||||
# Uncomment for versioned docs and specify the version of the module, e.g. '2'.
|
|
||||||
#DOC_MODULE_VERSION=2
|
|
||||||
|
|
||||||
|
|
||||||
# The top-level SGML file. You can change this if you want to.
|
|
||||||
DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.sgml
|
|
||||||
|
|
||||||
# Directories containing the source code
|
|
||||||
# gtk-doc will search all .c and .h files beneath these paths
|
|
||||||
# for inline comments documenting functions and macros.
|
|
||||||
DOC_SOURCE_DIR=$(top_srcdir)/src/st
|
|
||||||
|
|
||||||
# Extra options to pass to gtkdoc-scangobj. Not normally needed.
|
|
||||||
SCANGOBJ_OPTIONS=
|
|
||||||
|
|
||||||
# Extra options to supply to gtkdoc-scan.
|
|
||||||
# e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED"
|
|
||||||
SCAN_OPTIONS=--rebuild-types --rebuild-sections
|
|
||||||
|
|
||||||
# Extra options to supply to gtkdoc-mkdb.
|
|
||||||
# e.g. MKDB_OPTIONS=--xml-mode --output-format=xml
|
|
||||||
MKDB_OPTIONS=--xml-mode --output-format=xml
|
|
||||||
|
|
||||||
# Extra options to supply to gtkdoc-mktmpl
|
|
||||||
# e.g. MKTMPL_OPTIONS=--only-section-tmpl
|
|
||||||
MKTMPL_OPTIONS=
|
|
||||||
|
|
||||||
# Extra options to supply to gtkdoc-mkhtml
|
|
||||||
MKHTML_OPTIONS=
|
|
||||||
|
|
||||||
# Extra options to supply to gtkdoc-fixref. Not normally needed.
|
|
||||||
# e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html
|
|
||||||
FIXXREF_OPTIONS=
|
|
||||||
|
|
||||||
# Used for dependencies. The docs will be rebuilt if any of these change.
|
|
||||||
# e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h
|
|
||||||
# e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c
|
|
||||||
HFILE_GLOB=$(top_srcdir)/src/st/*.h
|
|
||||||
CFILE_GLOB=$(top_srcdir)/src/st/*.c
|
|
||||||
|
|
||||||
# Extra header to include when scanning, which are not under DOC_SOURCE_DIR
|
|
||||||
# e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h
|
|
||||||
EXTRA_HFILES=
|
|
||||||
|
|
||||||
# Header files or dirs to ignore when scanning. Use base file/dir names
|
|
||||||
# e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h private_code
|
|
||||||
IGNORE_HFILES=st-private.h st-theme-node-private.h
|
|
||||||
|
|
||||||
# Images to copy into HTML directory.
|
|
||||||
# e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png
|
|
||||||
HTML_IMAGES=
|
|
||||||
|
|
||||||
# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE).
|
|
||||||
# e.g. content_files=running.sgml building.sgml changes-2.0.sgml
|
|
||||||
content_files=
|
|
||||||
|
|
||||||
# SGML files where gtk-doc abbrevations (#GtkWidget) are expanded
|
|
||||||
# These files must be listed here *and* in content_files
|
|
||||||
# e.g. expand_content_files=running.sgml
|
|
||||||
expand_content_files=
|
|
||||||
|
|
||||||
# CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library.
|
|
||||||
# Only needed if you are using gtkdoc-scangobj to dynamically query widget
|
|
||||||
# signals and properties.
|
|
||||||
# e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS)
|
|
||||||
# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib)
|
|
||||||
GTKDOC_CFLAGS=
|
|
||||||
GTKDOC_LIBS=$(top_builddir)/src/libst-1.0.la
|
|
||||||
|
|
||||||
# This includes the standard gtk-doc make rules, copied by gtkdocize.
|
|
||||||
include $(top_srcdir)/gtk-doc.make
|
|
||||||
|
|
||||||
# Other files to distribute
|
|
||||||
# e.g. EXTRA_DIST += version.xml.in
|
|
||||||
EXTRA_DIST +=
|
|
||||||
|
|
||||||
# Files not to distribute
|
|
||||||
# for --rebuild-types in $(SCAN_OPTIONS), e.g. $(DOC_MODULE).types
|
|
||||||
# for --rebuild-sections in $(SCAN_OPTIONS) e.g. $(DOC_MODULE)-sections.txt
|
|
||||||
DISTCLEANFILES = $(DOC_MODULE).types $(DOC_MODULE)-sections.txt
|
|
||||||
|
|
||||||
# Comment this out if you want 'make check' to test you doc status
|
|
||||||
# and run some sanity checks
|
|
||||||
if ENABLE_GTK_DOC
|
|
||||||
TESTS_ENVIRONMENT = cd $(srcdir) && \
|
|
||||||
DOC_MODULE=$(DOC_MODULE) DOC_MAIN_SGML_FILE=$(DOC_MAIN_SGML_FILE) \
|
|
||||||
SRCDIR=$(abs_srcdir) BUILDDIR=$(abs_builddir)
|
|
||||||
#TESTS = $(GTKDOC_CHECK)
|
|
||||||
endif
|
|
||||||
|
|
||||||
-include $(top_srcdir)/git.mk
|
|
24
docs/reference/st/meson.build
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
private_headers = [
|
||||||
|
'st-private.h',
|
||||||
|
'st-theme-node-private.h'
|
||||||
|
]
|
||||||
|
|
||||||
|
configure_file(
|
||||||
|
input: 'version.xml.in',
|
||||||
|
output: 'version.xml',
|
||||||
|
configuration: version_conf
|
||||||
|
)
|
||||||
|
|
||||||
|
gnome.gtkdoc('st',
|
||||||
|
main_sgml: 'st-docs.sgml',
|
||||||
|
src_dir: [
|
||||||
|
join_paths(meson.source_root(), 'src', 'st'),
|
||||||
|
join_paths(meson.build_root(), 'src', 'st')
|
||||||
|
],
|
||||||
|
scan_args: [
|
||||||
|
'--ignore-headers=' + ' '.join(private_headers),
|
||||||
|
'--rebuild-sections',
|
||||||
|
'--rebuild-types'
|
||||||
|
],
|
||||||
|
install: true
|
||||||
|
)
|
@ -3,12 +3,13 @@
|
|||||||
"http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd"
|
"http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd"
|
||||||
[
|
[
|
||||||
<!ENTITY % local.common.attrib "xmlns:xi CDATA #FIXED 'http://www.w3.org/2003/XInclude'">
|
<!ENTITY % local.common.attrib "xmlns:xi CDATA #FIXED 'http://www.w3.org/2003/XInclude'">
|
||||||
|
<!ENTITY version SYSTEM "version.xml">
|
||||||
]>
|
]>
|
||||||
<book id="index">
|
<book id="index">
|
||||||
<bookinfo>
|
<bookinfo>
|
||||||
<title>St Reference Manual</title>
|
<title>St Reference Manual</title>
|
||||||
<releaseinfo>
|
<releaseinfo>
|
||||||
for St @VERSION@.
|
for St &version;.
|
||||||
<!--The latest version of this documentation can be found on-line at
|
<!--The latest version of this documentation can be found on-line at
|
||||||
<ulink role="online-location" url="http://[SERVER]/st/index.html">http://[SERVER]/st/</ulink>.-->
|
<ulink role="online-location" url="http://[SERVER]/st/index.html">http://[SERVER]/st/</ulink>.-->
|
||||||
</releaseinfo>
|
</releaseinfo>
|
||||||
@ -35,7 +36,6 @@
|
|||||||
<xi:include href="xml/st-bin.xml"/>
|
<xi:include href="xml/st-bin.xml"/>
|
||||||
<xi:include href="xml/st-box-layout.xml"/>
|
<xi:include href="xml/st-box-layout.xml"/>
|
||||||
<xi:include href="xml/st-scroll-view.xml"/>
|
<xi:include href="xml/st-scroll-view.xml"/>
|
||||||
<xi:include href="xml/st-table.xml"/>
|
|
||||||
</chapter>
|
</chapter>
|
||||||
|
|
||||||
<chapter id="styling">
|
<chapter id="styling">
|
||||||
@ -47,10 +47,15 @@
|
|||||||
<xi:include href="xml/st-texture-cache.xml"/>
|
<xi:include href="xml/st-texture-cache.xml"/>
|
||||||
</chapter>
|
</chapter>
|
||||||
</part>
|
</part>
|
||||||
|
<!-- FIXME:
|
||||||
|
Not generated at the moment, find out whether to blame gtk-doc or meson
|
||||||
|
-->
|
||||||
|
<!--
|
||||||
<chapter id="object-tree">
|
<chapter id="object-tree">
|
||||||
<title>Object Hierarchy</title>
|
<title>Object Hierarchy</title>
|
||||||
<xi:include href="xml/tree_index.sgml"/>
|
<xi:include href="xml/tree_index.sgml"/>
|
||||||
</chapter>
|
</chapter>
|
||||||
|
-->
|
||||||
<index id="api-index-full">
|
<index id="api-index-full">
|
||||||
<title>API Index</title>
|
<title>API Index</title>
|
||||||
<xi:include href="xml/api-index-full.xml"><xi:fallback /></xi:include>
|
<xi:include href="xml/api-index-full.xml"><xi:fallback /></xi:include>
|
1
docs/reference/st/version.xml.in
Normal file
@ -0,0 +1 @@
|
|||||||
|
@VERSION@
|
@ -1,38 +0,0 @@
|
|||||||
NULL =
|
|
||||||
BUILT_SOURCES =
|
|
||||||
|
|
||||||
misc/config.js: misc/config.js.in Makefile
|
|
||||||
[ -d $(@D) ] || $(mkdir_p) $(@D) ; \
|
|
||||||
sed -e "s|[@]PACKAGE_NAME@|$(PACKAGE_NAME)|g" \
|
|
||||||
-e "s|[@]PACKAGE_VERSION@|$(PACKAGE_VERSION)|g" \
|
|
||||||
-e "s|[@]HAVE_BLUETOOTH@|$(HAVE_BLUETOOTH)|g" \
|
|
||||||
-e "s|[@]HAVE_NETWORKMANAGER@|$(HAVE_NETWORKMANAGER)|g" \
|
|
||||||
-e "s|[@]GETTEXT_PACKAGE@|$(GETTEXT_PACKAGE)|g" \
|
|
||||||
-e "s|[@]datadir@|$(datadir)|g" \
|
|
||||||
-e "s|[@]libexecdir@|$(libexecdir)|g" \
|
|
||||||
-e "s|[@]sysconfdir@|$(sysconfdir)|g" \
|
|
||||||
$< > $@
|
|
||||||
|
|
||||||
js_resource_files = $(shell $(GLIB_COMPILE_RESOURCES) --sourcedir=$(srcdir) --sourcedir=$(builddir) --generate-dependencies $(srcdir)/js-resources.gresource.xml)
|
|
||||||
js-resources.h: js-resources.gresource.xml $(js_resource_files) misc/config.js
|
|
||||||
$(AM_V_GEN) $(GLIB_COMPILE_RESOURCES) --target=$@ --sourcedir=$(srcdir) --sourcedir=$(builddir) --generate --c-name shell_js_resources $<
|
|
||||||
js-resources.c: js-resources.gresource.xml $(js_resource_files) misc/config.js
|
|
||||||
$(AM_V_GEN) $(GLIB_COMPILE_RESOURCES) --target=$@ --sourcedir=$(srcdir) --sourcedir=$(builddir) --generate --c-name shell_js_resources $<
|
|
||||||
|
|
||||||
js_built_sources = js-resources.c js-resources.h
|
|
||||||
|
|
||||||
BUILT_SOURCES += $(js_built_sources)
|
|
||||||
|
|
||||||
all-local: $(js_built_sources)
|
|
||||||
|
|
||||||
js_resource_dist_files = $(filter-out misc/config.js, $(js_resource_files))
|
|
||||||
|
|
||||||
EXTRA_DIST = \
|
|
||||||
$(js_resource_dist_files) \
|
|
||||||
js-resources.gresource.xml \
|
|
||||||
misc/config.js.in \
|
|
||||||
$(NULL)
|
|
||||||
|
|
||||||
CLEANFILES = \
|
|
||||||
$(js_built_sources) \
|
|
||||||
$(NULL)
|
|
@ -5,6 +5,7 @@ const GLib = imports.gi.GLib;
|
|||||||
const GObject = imports.gi.GObject;
|
const GObject = imports.gi.GObject;
|
||||||
const Gio = imports.gi.Gio;
|
const Gio = imports.gi.Gio;
|
||||||
const Gtk = imports.gi.Gtk;
|
const Gtk = imports.gi.Gtk;
|
||||||
|
const Gdk = imports.gi.Gdk;
|
||||||
const Pango = imports.gi.Pango;
|
const Pango = imports.gi.Pango;
|
||||||
const Format = imports.format;
|
const Format = imports.format;
|
||||||
|
|
||||||
@ -23,11 +24,6 @@ const GnomeShellIface = '<node> \
|
|||||||
</interface> \
|
</interface> \
|
||||||
</node>';
|
</node>';
|
||||||
|
|
||||||
const customCss = '.prefs-button { \
|
|
||||||
padding: 8px; \
|
|
||||||
border-radius: 20px; \
|
|
||||||
}';
|
|
||||||
|
|
||||||
const GnomeShellProxy = Gio.DBusProxy.makeProxyWrapper(GnomeShellIface);
|
const GnomeShellProxy = Gio.DBusProxy.makeProxyWrapper(GnomeShellIface);
|
||||||
|
|
||||||
function stripPrefix(string, prefix) {
|
function stripPrefix(string, prefix) {
|
||||||
@ -36,7 +32,7 @@ function stripPrefix(string, prefix) {
|
|||||||
return string;
|
return string;
|
||||||
}
|
}
|
||||||
|
|
||||||
const Application = new Lang.Class({
|
var Application = new Lang.Class({
|
||||||
Name: 'Application',
|
Name: 'Application',
|
||||||
_init: function() {
|
_init: function() {
|
||||||
GLib.set_prgname('gnome-shell-extension-prefs');
|
GLib.set_prgname('gnome-shell-extension-prefs');
|
||||||
@ -97,9 +93,11 @@ const Application = new Lang.Class({
|
|||||||
widget = this._buildErrorUI(extension, e);
|
widget = this._buildErrorUI(extension, e);
|
||||||
}
|
}
|
||||||
|
|
||||||
let dialog = new Gtk.Dialog({ use_header_bar: true,
|
let dialog = new Gtk.Window({ modal: !this._skipMainWindow,
|
||||||
modal: true,
|
type_hint: Gdk.WindowTypeHint.DIALOG });
|
||||||
title: extension.metadata.name });
|
dialog.set_titlebar(new Gtk.HeaderBar({ show_close_button: true,
|
||||||
|
title: extension.metadata.name,
|
||||||
|
visible: true }));
|
||||||
|
|
||||||
if (this._skipMainWindow) {
|
if (this._skipMainWindow) {
|
||||||
this.application.add_window(dialog);
|
this.application.add_window(dialog);
|
||||||
@ -112,7 +110,7 @@ const Application = new Lang.Class({
|
|||||||
}
|
}
|
||||||
|
|
||||||
dialog.set_default_size(600, 400);
|
dialog.set_default_size(600, 400);
|
||||||
dialog.get_content_area().add(widget);
|
dialog.add(widget);
|
||||||
dialog.show();
|
dialog.show();
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -148,16 +146,21 @@ const Application = new Lang.Class({
|
|||||||
this._window = new Gtk.ApplicationWindow({ application: app,
|
this._window = new Gtk.ApplicationWindow({ application: app,
|
||||||
window_position: Gtk.WindowPosition.CENTER });
|
window_position: Gtk.WindowPosition.CENTER });
|
||||||
|
|
||||||
this._window.set_size_request(800, 500);
|
this._window.set_default_size(800, 500);
|
||||||
|
|
||||||
this._titlebar = new Gtk.HeaderBar({ show_close_button: true,
|
this._titlebar = new Gtk.HeaderBar({ show_close_button: true,
|
||||||
title: _("GNOME Shell Extensions") });
|
title: _("Shell Extensions") });
|
||||||
this._window.set_titlebar(this._titlebar);
|
this._window.set_titlebar(this._titlebar);
|
||||||
|
|
||||||
let scroll = new Gtk.ScrolledWindow({ hscrollbar_policy: Gtk.PolicyType.NEVER,
|
let killSwitch = new Gtk.Switch({ valign: Gtk.Align.CENTER });
|
||||||
shadow_type: Gtk.ShadowType.IN,
|
this._titlebar.pack_end(killSwitch);
|
||||||
halign: Gtk.Align.CENTER,
|
|
||||||
margin: 18 });
|
this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell' });
|
||||||
|
this._settings.bind('disable-user-extensions', killSwitch, 'active',
|
||||||
|
Gio.SettingsBindFlags.DEFAULT |
|
||||||
|
Gio.SettingsBindFlags.INVERT_BOOLEAN);
|
||||||
|
|
||||||
|
let scroll = new Gtk.ScrolledWindow({ hscrollbar_policy: Gtk.PolicyType.NEVER });
|
||||||
this._window.add(scroll);
|
this._window.add(scroll);
|
||||||
|
|
||||||
this._extensionSelector = new Gtk.ListBox({ selection_mode: Gtk.SelectionMode.NONE });
|
this._extensionSelector = new Gtk.ListBox({ selection_mode: Gtk.SelectionMode.NONE });
|
||||||
@ -176,21 +179,6 @@ const Application = new Lang.Class({
|
|||||||
this._window.show_all();
|
this._window.show_all();
|
||||||
},
|
},
|
||||||
|
|
||||||
_addCustomStyle: function() {
|
|
||||||
let provider = new Gtk.CssProvider();
|
|
||||||
|
|
||||||
try {
|
|
||||||
provider.load_from_data(customCss, -1);
|
|
||||||
} catch(e) {
|
|
||||||
log('Failed to add application style');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
let screen = this._window.window.get_screen();
|
|
||||||
let priority = Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION;
|
|
||||||
Gtk.StyleContext.add_provider_for_screen(screen, provider, priority);
|
|
||||||
},
|
|
||||||
|
|
||||||
_sortList: function(row1, row2) {
|
_sortList: function(row1, row2) {
|
||||||
let name1 = ExtensionUtils.extensions[row1.uuid].metadata.name;
|
let name1 = ExtensionUtils.extensions[row1.uuid].metadata.name;
|
||||||
let name2 = ExtensionUtils.extensions[row2.uuid].metadata.name;
|
let name2 = ExtensionUtils.extensions[row2.uuid].metadata.name;
|
||||||
@ -239,7 +227,6 @@ const Application = new Lang.Class({
|
|||||||
|
|
||||||
_onStartup: function(app) {
|
_onStartup: function(app) {
|
||||||
this._buildUI(app);
|
this._buildUI(app);
|
||||||
this._addCustomStyle();
|
|
||||||
this._scanExtensions();
|
this._scanExtensions();
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -266,7 +253,19 @@ const Application = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const ExtensionRow = new Lang.Class({
|
var DescriptionLabel = new Lang.Class({
|
||||||
|
Name: 'DescriptionLabel',
|
||||||
|
Extends: Gtk.Label,
|
||||||
|
|
||||||
|
vfunc_get_preferred_height_for_width: function(width) {
|
||||||
|
// Hack: Request the maximum height allowed by the line limit
|
||||||
|
if (this.lines > 0)
|
||||||
|
return this.parent(0);
|
||||||
|
return this.parent(width);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var ExtensionRow = new Lang.Class({
|
||||||
Name: 'ExtensionRow',
|
Name: 'ExtensionRow',
|
||||||
Extends: Gtk.ListBoxRow,
|
Extends: Gtk.ListBoxRow,
|
||||||
|
|
||||||
@ -284,6 +283,10 @@ const ExtensionRow = new Lang.Class({
|
|||||||
Lang.bind(this, function() {
|
Lang.bind(this, function() {
|
||||||
this._switch.sensitive = this._canEnable();
|
this._switch.sensitive = this._canEnable();
|
||||||
}));
|
}));
|
||||||
|
this._settings.connect('changed::disable-user-extensions',
|
||||||
|
Lang.bind(this, function() {
|
||||||
|
this._switch.sensitive = this._canEnable();
|
||||||
|
}));
|
||||||
|
|
||||||
this._buildUI();
|
this._buildUI();
|
||||||
},
|
},
|
||||||
@ -292,7 +295,8 @@ const ExtensionRow = new Lang.Class({
|
|||||||
let extension = ExtensionUtils.extensions[this.uuid];
|
let extension = ExtensionUtils.extensions[this.uuid];
|
||||||
|
|
||||||
let hbox = new Gtk.Box({ orientation: Gtk.Orientation.HORIZONTAL,
|
let hbox = new Gtk.Box({ orientation: Gtk.Orientation.HORIZONTAL,
|
||||||
hexpand: true, margin: 12, spacing: 6 });
|
hexpand: true, margin_end: 24, spacing: 24,
|
||||||
|
margin: 12 });
|
||||||
this.add(hbox);
|
this.add(hbox);
|
||||||
|
|
||||||
let vbox = new Gtk.Box({ orientation: Gtk.Orientation.VERTICAL,
|
let vbox = new Gtk.Box({ orientation: Gtk.Orientation.VERTICAL,
|
||||||
@ -306,9 +310,9 @@ const ExtensionRow = new Lang.Class({
|
|||||||
vbox.add(label);
|
vbox.add(label);
|
||||||
|
|
||||||
let desc = extension.metadata.description.split('\n')[0];
|
let desc = extension.metadata.description.split('\n')[0];
|
||||||
label = new Gtk.Label({ label: desc,
|
label = new DescriptionLabel({ label: desc, wrap: true, lines: 2,
|
||||||
ellipsize: Pango.EllipsizeMode.END,
|
ellipsize: Pango.EllipsizeMode.END,
|
||||||
halign: Gtk.Align.START });
|
xalign: 0, yalign: 0 });
|
||||||
vbox.add(label);
|
vbox.add(label);
|
||||||
|
|
||||||
let button = new Gtk.Button({ valign: Gtk.Align.CENTER,
|
let button = new Gtk.Button({ valign: Gtk.Align.CENTER,
|
||||||
@ -316,7 +320,7 @@ const ExtensionRow = new Lang.Class({
|
|||||||
button.add(new Gtk.Image({ icon_name: 'emblem-system-symbolic',
|
button.add(new Gtk.Image({ icon_name: 'emblem-system-symbolic',
|
||||||
icon_size: Gtk.IconSize.BUTTON,
|
icon_size: Gtk.IconSize.BUTTON,
|
||||||
visible: true }));
|
visible: true }));
|
||||||
button.get_style_context().add_class('prefs-button');
|
button.get_style_context().add_class('circular');
|
||||||
hbox.add(button);
|
hbox.add(button);
|
||||||
|
|
||||||
this.prefsButton = button;
|
this.prefsButton = button;
|
||||||
@ -339,7 +343,8 @@ const ExtensionRow = new Lang.Class({
|
|||||||
let extension = ExtensionUtils.extensions[this.uuid];
|
let extension = ExtensionUtils.extensions[this.uuid];
|
||||||
let checkVersion = !this._settings.get_boolean('disable-extension-version-validation');
|
let checkVersion = !this._settings.get_boolean('disable-extension-version-validation');
|
||||||
|
|
||||||
return !(checkVersion && ExtensionUtils.isOutOfDate(extension));
|
return !this._settings.get_boolean('disable-user-extensions') &&
|
||||||
|
!(checkVersion && ExtensionUtils.isOutOfDate(extension));
|
||||||
},
|
},
|
||||||
|
|
||||||
_isEnabled: function() {
|
_isEnabled: function() {
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
const Clutter = imports.gi.Clutter;
|
const Clutter = imports.gi.Clutter;
|
||||||
const Gio = imports.gi.Gio;
|
const Gio = imports.gi.Gio;
|
||||||
const Lang = imports.lang;
|
const Lang = imports.lang;
|
||||||
|
const Pango = imports.gi.Pango;
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
const St = imports.gi.St;
|
const St = imports.gi.St;
|
||||||
|
|
||||||
@ -14,30 +15,30 @@ const ShellEntry = imports.ui.shellEntry;
|
|||||||
const Tweener = imports.ui.tweener;
|
const Tweener = imports.ui.tweener;
|
||||||
const UserWidget = imports.ui.userWidget;
|
const UserWidget = imports.ui.userWidget;
|
||||||
|
|
||||||
const DEFAULT_BUTTON_WELL_ICON_SIZE = 24;
|
var DEFAULT_BUTTON_WELL_ICON_SIZE = 16;
|
||||||
const DEFAULT_BUTTON_WELL_ANIMATION_DELAY = 1.0;
|
var DEFAULT_BUTTON_WELL_ANIMATION_DELAY = 1.0;
|
||||||
const DEFAULT_BUTTON_WELL_ANIMATION_TIME = 0.3;
|
var DEFAULT_BUTTON_WELL_ANIMATION_TIME = 0.3;
|
||||||
|
|
||||||
const MESSAGE_FADE_OUT_ANIMATION_TIME = 0.5;
|
var MESSAGE_FADE_OUT_ANIMATION_TIME = 0.5;
|
||||||
|
|
||||||
const AuthPromptMode = {
|
var AuthPromptMode = {
|
||||||
UNLOCK_ONLY: 0,
|
UNLOCK_ONLY: 0,
|
||||||
UNLOCK_OR_LOG_IN: 1
|
UNLOCK_OR_LOG_IN: 1
|
||||||
};
|
};
|
||||||
|
|
||||||
const AuthPromptStatus = {
|
var AuthPromptStatus = {
|
||||||
NOT_VERIFYING: 0,
|
NOT_VERIFYING: 0,
|
||||||
VERIFYING: 1,
|
VERIFYING: 1,
|
||||||
VERIFICATION_FAILED: 2,
|
VERIFICATION_FAILED: 2,
|
||||||
VERIFICATION_SUCCEEDED: 3
|
VERIFICATION_SUCCEEDED: 3
|
||||||
};
|
};
|
||||||
|
|
||||||
const BeginRequestType = {
|
var BeginRequestType = {
|
||||||
PROVIDE_USERNAME: 0,
|
PROVIDE_USERNAME: 0,
|
||||||
DONT_PROVIDE_USERNAME: 1
|
DONT_PROVIDE_USERNAME: 1
|
||||||
};
|
};
|
||||||
|
|
||||||
const AuthPrompt = new Lang.Class({
|
var AuthPrompt = new Lang.Class({
|
||||||
Name: 'AuthPrompt',
|
Name: 'AuthPrompt',
|
||||||
|
|
||||||
_init: function(gdmClient, mode) {
|
_init: function(gdmClient, mode) {
|
||||||
@ -113,6 +114,7 @@ const AuthPrompt = new Lang.Class({
|
|||||||
this._message = new St.Label({ opacity: 0,
|
this._message = new St.Label({ opacity: 0,
|
||||||
styleClass: 'login-dialog-message' });
|
styleClass: 'login-dialog-message' });
|
||||||
this._message.clutter_text.line_wrap = true;
|
this._message.clutter_text.line_wrap = true;
|
||||||
|
this._message.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
||||||
this.actor.add(this._message, { x_fill: false, x_align: St.Align.START, y_align: St.Align.START });
|
this.actor.add(this._message, { x_fill: false, x_align: St.Align.START, y_align: St.Align.START });
|
||||||
|
|
||||||
this._buttonBox = new St.BoxLayout({ style_class: 'login-dialog-button-box',
|
this._buttonBox = new St.BoxLayout({ style_class: 'login-dialog-button-box',
|
||||||
@ -186,9 +188,10 @@ const AuthPrompt = new Lang.Class({
|
|||||||
if (!this._userVerifier.hasPendingMessages)
|
if (!this._userVerifier.hasPendingMessages)
|
||||||
this._fadeOutMessage();
|
this._fadeOutMessage();
|
||||||
|
|
||||||
this._updateNextButtonSensitivity(this._entry.text.length > 0);
|
this._updateNextButtonSensitivity(this._entry.text.length > 0 || this.verificationStatus == AuthPromptStatus.VERIFYING);
|
||||||
}));
|
}));
|
||||||
this._entry.clutter_text.connect('activate', Lang.bind(this, function() {
|
this._entry.clutter_text.connect('activate', Lang.bind(this, function() {
|
||||||
|
if (this.nextButton.reactive)
|
||||||
this.emit('next');
|
this.emit('next');
|
||||||
}));
|
}));
|
||||||
},
|
},
|
||||||
@ -258,6 +261,7 @@ const AuthPrompt = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_onVerificationComplete: function() {
|
_onVerificationComplete: function() {
|
||||||
|
this.setActorInDefaultButtonWell(null);
|
||||||
this.verificationStatus = AuthPromptStatus.VERIFICATION_SUCCEEDED;
|
this.verificationStatus = AuthPromptStatus.VERIFICATION_SUCCEEDED;
|
||||||
this.cancelButton.reactive = false;
|
this.cancelButton.reactive = false;
|
||||||
},
|
},
|
||||||
@ -281,6 +285,12 @@ const AuthPrompt = new Lang.Class({
|
|||||||
if (oldActor)
|
if (oldActor)
|
||||||
Tweener.removeTweens(oldActor);
|
Tweener.removeTweens(oldActor);
|
||||||
|
|
||||||
|
let wasSpinner;
|
||||||
|
if (oldActor == this._spinner.actor)
|
||||||
|
wasSpinner = true;
|
||||||
|
else
|
||||||
|
wasSpinner = false;
|
||||||
|
|
||||||
let isSpinner;
|
let isSpinner;
|
||||||
if (actor == this._spinner.actor)
|
if (actor == this._spinner.actor)
|
||||||
isSpinner = true;
|
isSpinner = true;
|
||||||
@ -290,6 +300,11 @@ const AuthPrompt = new Lang.Class({
|
|||||||
if (this._defaultButtonWellActor != actor && oldActor) {
|
if (this._defaultButtonWellActor != actor && oldActor) {
|
||||||
if (!animate) {
|
if (!animate) {
|
||||||
oldActor.opacity = 0;
|
oldActor.opacity = 0;
|
||||||
|
|
||||||
|
if (wasSpinner) {
|
||||||
|
if (this._spinner)
|
||||||
|
this._spinner.stop();
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
Tweener.addTween(oldActor,
|
Tweener.addTween(oldActor,
|
||||||
{ opacity: 0,
|
{ opacity: 0,
|
||||||
@ -298,7 +313,7 @@ const AuthPrompt = new Lang.Class({
|
|||||||
transition: 'linear',
|
transition: 'linear',
|
||||||
onCompleteScope: this,
|
onCompleteScope: this,
|
||||||
onComplete: function() {
|
onComplete: function() {
|
||||||
if (isSpinner) {
|
if (wasSpinner) {
|
||||||
if (this._spinner)
|
if (this._spinner)
|
||||||
this._spinner.stop();
|
this._spinner.stop();
|
||||||
}
|
}
|
||||||
@ -401,7 +416,7 @@ const AuthPrompt = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
updateSensitivity: function(sensitive) {
|
updateSensitivity: function(sensitive) {
|
||||||
this._updateNextButtonSensitivity(sensitive);
|
this._updateNextButtonSensitivity(sensitive && (this._entry.text.length > 0 || this.verificationStatus == AuthPromptStatus.VERIFYING));
|
||||||
this._entry.reactive = sensitive;
|
this._entry.reactive = sensitive;
|
||||||
this._entry.clutter_text.editable = sensitive;
|
this._entry.clutter_text.editable = sensitive;
|
||||||
},
|
},
|
||||||
@ -432,8 +447,9 @@ const AuthPrompt = new Lang.Class({
|
|||||||
let oldStatus = this.verificationStatus;
|
let oldStatus = this.verificationStatus;
|
||||||
this.verificationStatus = AuthPromptStatus.NOT_VERIFYING;
|
this.verificationStatus = AuthPromptStatus.NOT_VERIFYING;
|
||||||
this.cancelButton.reactive = true;
|
this.cancelButton.reactive = true;
|
||||||
|
this.nextButton.label = _("Next");
|
||||||
|
|
||||||
if (oldStatus == AuthPromptStatus.VERIFYING)
|
if (this._userVerifier)
|
||||||
this._userVerifier.cancel();
|
this._userVerifier.cancel();
|
||||||
|
|
||||||
this._queryingService = null;
|
this._queryingService = null;
|
||||||
@ -488,6 +504,7 @@ const AuthPrompt = new Lang.Class({
|
|||||||
|
|
||||||
finish: function(onComplete) {
|
finish: function(onComplete) {
|
||||||
if (!this._userVerifier.hasPendingMessages) {
|
if (!this._userVerifier.hasPendingMessages) {
|
||||||
|
this._userVerifier.clear();
|
||||||
onComplete();
|
onComplete();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -495,12 +512,13 @@ const AuthPrompt = new Lang.Class({
|
|||||||
let signalId = this._userVerifier.connect('no-more-messages',
|
let signalId = this._userVerifier.connect('no-more-messages',
|
||||||
Lang.bind(this, function() {
|
Lang.bind(this, function() {
|
||||||
this._userVerifier.disconnect(signalId);
|
this._userVerifier.disconnect(signalId);
|
||||||
|
this._userVerifier.clear();
|
||||||
onComplete();
|
onComplete();
|
||||||
}));
|
}));
|
||||||
},
|
},
|
||||||
|
|
||||||
cancel: function() {
|
cancel: function() {
|
||||||
if (this.verificationStatus == AuthPromptStatus.NOT_VERIFYING || this.verificationStatus == AuthPromptStatus.VERIFICATION_SUCCEEDED) {
|
if (this.verificationStatus == AuthPromptStatus.VERIFICATION_SUCCEEDED) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this.reset();
|
this.reset();
|
||||||
|
@ -16,10 +16,38 @@
|
|||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* In order for transformation animations to look good, they need to be
|
||||||
|
* incremental and have some order to them (e.g., fade out hidden items,
|
||||||
|
* then shrink to close the void left over). Chaining animations in this way can
|
||||||
|
* be error-prone and wordy using just Tweener callbacks.
|
||||||
|
*
|
||||||
|
* The classes in this file help with this:
|
||||||
|
*
|
||||||
|
* - Task. encapsulates schedulable work to be run in a specific scope.
|
||||||
|
*
|
||||||
|
* - ConsecutiveBatch. runs a series of tasks in order and completes
|
||||||
|
* when the last in the series finishes.
|
||||||
|
*
|
||||||
|
* - ConcurrentBatch. runs a set of tasks at the same time and completes
|
||||||
|
* when the last to finish completes.
|
||||||
|
*
|
||||||
|
* - Hold. prevents a batch from completing the pending task until
|
||||||
|
* the hold is released.
|
||||||
|
*
|
||||||
|
* The tasks associated with a batch are specified in a list at batch
|
||||||
|
* construction time as either task objects or plain functions.
|
||||||
|
* Batches are task objects, themselves, so they can be nested.
|
||||||
|
*
|
||||||
|
* These classes aren't specific to GDM, but were found to be unintuitive and so
|
||||||
|
* are not used elsewhere. These APIs may ultimately get dropped entirely and
|
||||||
|
* replaced by something else.
|
||||||
|
*/
|
||||||
|
|
||||||
const Lang = imports.lang;
|
const Lang = imports.lang;
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
|
|
||||||
const Task = new Lang.Class({
|
var Task = new Lang.Class({
|
||||||
Name: 'Task',
|
Name: 'Task',
|
||||||
|
|
||||||
_init: function(scope, handler) {
|
_init: function(scope, handler) {
|
||||||
@ -40,7 +68,7 @@ const Task = new Lang.Class({
|
|||||||
});
|
});
|
||||||
Signals.addSignalMethods(Task.prototype);
|
Signals.addSignalMethods(Task.prototype);
|
||||||
|
|
||||||
const Hold = new Lang.Class({
|
var Hold = new Lang.Class({
|
||||||
Name: 'Hold',
|
Name: 'Hold',
|
||||||
Extends: Task,
|
Extends: Task,
|
||||||
|
|
||||||
@ -82,7 +110,7 @@ const Hold = new Lang.Class({
|
|||||||
});
|
});
|
||||||
Signals.addSignalMethods(Hold.prototype);
|
Signals.addSignalMethods(Hold.prototype);
|
||||||
|
|
||||||
const Batch = new Lang.Class({
|
var Batch = new Lang.Class({
|
||||||
Name: 'Batch',
|
Name: 'Batch',
|
||||||
Extends: Task,
|
Extends: Task,
|
||||||
|
|
||||||
@ -157,7 +185,7 @@ const Batch = new Lang.Class({
|
|||||||
});
|
});
|
||||||
Signals.addSignalMethods(Batch.prototype);
|
Signals.addSignalMethods(Batch.prototype);
|
||||||
|
|
||||||
const ConcurrentBatch = new Lang.Class({
|
var ConcurrentBatch = new Lang.Class({
|
||||||
Name: 'ConcurrentBatch',
|
Name: 'ConcurrentBatch',
|
||||||
Extends: Batch,
|
Extends: Batch,
|
||||||
|
|
||||||
@ -176,7 +204,7 @@ const ConcurrentBatch = new Lang.Class({
|
|||||||
});
|
});
|
||||||
Signals.addSignalMethods(ConcurrentBatch.prototype);
|
Signals.addSignalMethods(ConcurrentBatch.prototype);
|
||||||
|
|
||||||
const ConsecutiveBatch = new Lang.Class({
|
var ConsecutiveBatch = new Lang.Class({
|
||||||
Name: 'ConsecutiveBatch',
|
Name: 'ConsecutiveBatch',
|
||||||
Extends: Batch,
|
Extends: Batch,
|
||||||
|
|
||||||
|
@ -23,6 +23,12 @@ function FprintManager() {
|
|||||||
g_object_path: '/net/reactivated/Fprint/Manager',
|
g_object_path: '/net/reactivated/Fprint/Manager',
|
||||||
g_flags: (Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES) });
|
g_flags: (Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES) });
|
||||||
|
|
||||||
|
try {
|
||||||
self.init(null);
|
self.init(null);
|
||||||
|
} catch(e) {
|
||||||
|
log('Failed to connect to Fprint service: ' + e.message);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
@ -51,7 +51,7 @@ const _TIMED_LOGIN_IDLE_THRESHOLD = 5.0;
|
|||||||
const _LOGO_ICON_HEIGHT = 48;
|
const _LOGO_ICON_HEIGHT = 48;
|
||||||
const _MAX_BOTTOM_MENU_ITEMS = 5;
|
const _MAX_BOTTOM_MENU_ITEMS = 5;
|
||||||
|
|
||||||
const UserListItem = new Lang.Class({
|
var UserListItem = new Lang.Class({
|
||||||
Name: 'UserListItem',
|
Name: 'UserListItem',
|
||||||
|
|
||||||
_init: function(user) {
|
_init: function(user) {
|
||||||
@ -70,6 +70,16 @@ const UserListItem = new Lang.Class({
|
|||||||
this.actor.connect('destroy',
|
this.actor.connect('destroy',
|
||||||
Lang.bind(this, this._onDestroy));
|
Lang.bind(this, this._onDestroy));
|
||||||
|
|
||||||
|
this.actor.connect('key-focus-in', () => {
|
||||||
|
this._setSelected(true);
|
||||||
|
});
|
||||||
|
this.actor.connect('key-focus-out', () => {
|
||||||
|
this._setSelected(false);
|
||||||
|
});
|
||||||
|
this.actor.connect('notify::hover', () => {
|
||||||
|
this._setSelected(this.actor.hover);
|
||||||
|
});
|
||||||
|
|
||||||
this._userWidget = new UserWidget.UserWidget(this.user);
|
this._userWidget = new UserWidget.UserWidget(this.user);
|
||||||
layout.add(this._userWidget.actor);
|
layout.add(this._userWidget.actor);
|
||||||
|
|
||||||
@ -96,13 +106,22 @@ const UserListItem = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_onDestroy: function() {
|
_onDestroy: function() {
|
||||||
this._user.disconnect(this._userChangedId);
|
this.user.disconnect(this._userChangedId);
|
||||||
},
|
},
|
||||||
|
|
||||||
_onClicked: function() {
|
_onClicked: function() {
|
||||||
this.emit('activate');
|
this.emit('activate');
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_setSelected: function(selected) {
|
||||||
|
if (selected) {
|
||||||
|
this.actor.add_style_pseudo_class('selected');
|
||||||
|
this.actor.grab_key_focus();
|
||||||
|
} else {
|
||||||
|
this.actor.remove_style_pseudo_class('selected');
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
showTimedLoginIndicator: function(time) {
|
showTimedLoginIndicator: function(time) {
|
||||||
let hold = new Batch.Hold();
|
let hold = new Batch.Hold();
|
||||||
|
|
||||||
@ -126,7 +145,7 @@ const UserListItem = new Lang.Class({
|
|||||||
});
|
});
|
||||||
Signals.addSignalMethods(UserListItem.prototype);
|
Signals.addSignalMethods(UserListItem.prototype);
|
||||||
|
|
||||||
const UserList = new Lang.Class({
|
var UserList = new Lang.Class({
|
||||||
Name: 'UserList',
|
Name: 'UserList',
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
@ -212,6 +231,10 @@ const UserList = new Lang.Class({
|
|||||||
return item;
|
return item;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
containsUser: function(user) {
|
||||||
|
return this._items[user.get_user_name()] != null;
|
||||||
|
},
|
||||||
|
|
||||||
addUser: function(user) {
|
addUser: function(user) {
|
||||||
if (!user.is_loaded)
|
if (!user.is_loaded)
|
||||||
return;
|
return;
|
||||||
@ -265,11 +288,15 @@ const UserList = new Lang.Class({
|
|||||||
|
|
||||||
item.actor.destroy();
|
item.actor.destroy();
|
||||||
delete this._items[userName];
|
delete this._items[userName];
|
||||||
|
},
|
||||||
|
|
||||||
|
numItems: function() {
|
||||||
|
return Object.keys(this._items).length;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
Signals.addSignalMethods(UserList.prototype);
|
Signals.addSignalMethods(UserList.prototype);
|
||||||
|
|
||||||
const SessionMenuButton = new Lang.Class({
|
var SessionMenuButton = new Lang.Class({
|
||||||
Name: 'SessionMenuButton',
|
Name: 'SessionMenuButton',
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
@ -375,7 +402,7 @@ const SessionMenuButton = new Lang.Class({
|
|||||||
});
|
});
|
||||||
Signals.addSignalMethods(SessionMenuButton.prototype);
|
Signals.addSignalMethods(SessionMenuButton.prototype);
|
||||||
|
|
||||||
const LoginDialog = new Lang.Class({
|
var LoginDialog = new Lang.Class({
|
||||||
Name: 'LoginDialog',
|
Name: 'LoginDialog',
|
||||||
|
|
||||||
_init: function(parentActor) {
|
_init: function(parentActor) {
|
||||||
@ -535,6 +562,9 @@ const LoginDialog = new Lang.Class({
|
|||||||
let centerX = dialogBox.x1 + (dialogBox.x2 - dialogBox.x1) / 2;
|
let centerX = dialogBox.x1 + (dialogBox.x2 - dialogBox.x1) / 2;
|
||||||
let centerY = dialogBox.y1 + (dialogBox.y2 - dialogBox.y1) / 2;
|
let centerY = dialogBox.y1 + (dialogBox.y2 - dialogBox.y1) / 2;
|
||||||
|
|
||||||
|
natWidth = Math.min(natWidth, dialogBox.x2 - dialogBox.x1);
|
||||||
|
natHeight = Math.min(natHeight, dialogBox.y2 - dialogBox.y1);
|
||||||
|
|
||||||
actorBox.x1 = Math.floor(centerX - natWidth / 2);
|
actorBox.x1 = Math.floor(centerX - natWidth / 2);
|
||||||
actorBox.y1 = Math.floor(centerY - natHeight / 2);
|
actorBox.y1 = Math.floor(centerY - natHeight / 2);
|
||||||
actorBox.x2 = actorBox.x1 + natWidth;
|
actorBox.x2 = actorBox.x1 + natWidth;
|
||||||
@ -584,7 +614,14 @@ const LoginDialog = new Lang.Class({
|
|||||||
// try a different layout, or if we have what extra space we
|
// try a different layout, or if we have what extra space we
|
||||||
// can hand out
|
// can hand out
|
||||||
if (bannerAllocation) {
|
if (bannerAllocation) {
|
||||||
let leftOverYSpace = dialogHeight - bannerHeight - authPromptHeight - logoHeight;
|
let bannerSpace;
|
||||||
|
|
||||||
|
if (authPromptAllocation)
|
||||||
|
bannerSpace = authPromptAllocation.y1 - bannerAllocation.y1;
|
||||||
|
else
|
||||||
|
bannerSpace = 0;
|
||||||
|
|
||||||
|
let leftOverYSpace = bannerSpace - bannerHeight;
|
||||||
|
|
||||||
if (leftOverYSpace > 0) {
|
if (leftOverYSpace > 0) {
|
||||||
// First figure out how much left over space is up top
|
// First figure out how much left over space is up top
|
||||||
@ -693,6 +730,10 @@ const LoginDialog = new Lang.Class({
|
|||||||
_updateDisableUserList: function() {
|
_updateDisableUserList: function() {
|
||||||
let disableUserList = this._settings.get_boolean(GdmUtil.DISABLE_USER_LIST_KEY);
|
let disableUserList = this._settings.get_boolean(GdmUtil.DISABLE_USER_LIST_KEY);
|
||||||
|
|
||||||
|
// Disable user list when there are no users.
|
||||||
|
if (this._userListLoaded && this._userList.numItems() == 0)
|
||||||
|
disableUserList = true;
|
||||||
|
|
||||||
if (disableUserList != this._disableUserList) {
|
if (disableUserList != this._disableUserList) {
|
||||||
this._disableUserList = disableUserList;
|
this._disableUserList = disableUserList;
|
||||||
|
|
||||||
@ -761,10 +802,12 @@ const LoginDialog = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_onPrompted: function() {
|
_onPrompted: function() {
|
||||||
|
if (this._shouldShowSessionMenuButton()) {
|
||||||
this._sessionMenuButton.updateSensitivity(true);
|
this._sessionMenuButton.updateSensitivity(true);
|
||||||
|
|
||||||
if (this._shouldShowSessionMenuButton())
|
|
||||||
this._authPrompt.setActorInDefaultButtonWell(this._sessionMenuButton.actor);
|
this._authPrompt.setActorInDefaultButtonWell(this._sessionMenuButton.actor);
|
||||||
|
} else {
|
||||||
|
this._sessionMenuButton.updateSensitivity(false);
|
||||||
|
}
|
||||||
this._showPrompt();
|
this._showPrompt();
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -790,6 +833,11 @@ const LoginDialog = new Lang.Class({
|
|||||||
|
|
||||||
this._user = null;
|
this._user = null;
|
||||||
|
|
||||||
|
if (this._nextSignalId) {
|
||||||
|
this._authPrompt.disconnect(this._nextSignalId);
|
||||||
|
this._nextSignalId = 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (beginRequest == AuthPrompt.BeginRequestType.PROVIDE_USERNAME) {
|
if (beginRequest == AuthPrompt.BeginRequestType.PROVIDE_USERNAME) {
|
||||||
if (!this._disableUserList)
|
if (!this._disableUserList)
|
||||||
this._showUserList();
|
this._showUserList();
|
||||||
@ -862,12 +910,13 @@ const LoginDialog = new Lang.Class({
|
|||||||
}));
|
}));
|
||||||
this._updateCancelButton();
|
this._updateCancelButton();
|
||||||
|
|
||||||
|
this._sessionMenuButton.updateSensitivity(false);
|
||||||
this._authPrompt.updateSensitivity(true);
|
this._authPrompt.updateSensitivity(true);
|
||||||
this._showPrompt();
|
this._showPrompt();
|
||||||
},
|
},
|
||||||
|
|
||||||
_loginScreenSessionActivated: function() {
|
_loginScreenSessionActivated: function() {
|
||||||
if (this._authPrompt.verificationStatus != AuthPrompt.AuthPromptStatus.VERIFICATION_SUCCEEDED)
|
if (this.actor.opacity == 255 && this._authPrompt.verificationStatus == AuthPrompt.AuthPromptStatus.NOT_VERIFYING)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Tweener.addTween(this.actor,
|
Tweener.addTween(this.actor,
|
||||||
@ -884,6 +933,7 @@ const LoginDialog = new Lang.Class({
|
|||||||
},
|
},
|
||||||
onUpdateScope: this,
|
onUpdateScope: this,
|
||||||
onComplete: function() {
|
onComplete: function() {
|
||||||
|
if (this._authPrompt.verificationStatus != AuthPrompt.AuthPromptStatus.NOT_VERIFYING)
|
||||||
this._authPrompt.reset();
|
this._authPrompt.reset();
|
||||||
},
|
},
|
||||||
onCompleteScope: this });
|
onCompleteScope: this });
|
||||||
@ -913,11 +963,7 @@ const LoginDialog = new Lang.Class({
|
|||||||
},
|
},
|
||||||
onUpdateScope: this,
|
onUpdateScope: this,
|
||||||
onComplete: function() {
|
onComplete: function() {
|
||||||
let id = Mainloop.idle_add(Lang.bind(this, function() {
|
|
||||||
this._greeter.call_start_session_when_ready_sync(serviceName, true, null);
|
this._greeter.call_start_session_when_ready_sync(serviceName, true, null);
|
||||||
return GLib.SOURCE_REMOVE;
|
|
||||||
}));
|
|
||||||
GLib.Source.set_name_by_id(id, '[gnome-shell] this._greeter.call_start_session_when_ready_sync');
|
|
||||||
},
|
},
|
||||||
onCompleteScope: this });
|
onCompleteScope: this });
|
||||||
},
|
},
|
||||||
@ -1119,6 +1165,10 @@ const LoginDialog = new Lang.Class({
|
|||||||
this._userManager.disconnect(this._userRemovedId);
|
this._userManager.disconnect(this._userRemovedId);
|
||||||
this._userRemovedId = 0;
|
this._userRemovedId = 0;
|
||||||
}
|
}
|
||||||
|
if (this._userChangedId) {
|
||||||
|
this._userManager.disconnect(this._userChangedId);
|
||||||
|
this._userChangedId = 0;
|
||||||
|
}
|
||||||
this._textureCache.disconnect(this._updateLogoTextureId);
|
this._textureCache.disconnect(this._updateLogoTextureId);
|
||||||
Main.layoutManager.disconnect(this._startupCompleteId);
|
Main.layoutManager.disconnect(this._startupCompleteId);
|
||||||
if (this._settings) {
|
if (this._settings) {
|
||||||
@ -1155,14 +1205,27 @@ const LoginDialog = new Lang.Class({
|
|||||||
this._userList.addUser(users[i]);
|
this._userList.addUser(users[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this._updateDisableUserList();
|
||||||
|
|
||||||
this._userAddedId = this._userManager.connect('user-added',
|
this._userAddedId = this._userManager.connect('user-added',
|
||||||
Lang.bind(this, function(userManager, user) {
|
Lang.bind(this, function(userManager, user) {
|
||||||
this._userList.addUser(user);
|
this._userList.addUser(user);
|
||||||
|
this._updateDisableUserList();
|
||||||
}));
|
}));
|
||||||
|
|
||||||
this._userRemovedId = this._userManager.connect('user-removed',
|
this._userRemovedId = this._userManager.connect('user-removed',
|
||||||
Lang.bind(this, function(userManager, user) {
|
Lang.bind(this, function(userManager, user) {
|
||||||
this._userList.removeUser(user);
|
this._userList.removeUser(user);
|
||||||
|
this._updateDisableUserList();
|
||||||
|
}));
|
||||||
|
|
||||||
|
this._userChangedId = this._userManager.connect('user-changed',
|
||||||
|
Lang.bind(this, function(userManager, user) {
|
||||||
|
if (this._userList.containsUser(user) && user.locked)
|
||||||
|
this._userList.removeUser(user);
|
||||||
|
else if (!this._userList.containsUser(user) && !user.locked)
|
||||||
|
this._userList.addUser(user);
|
||||||
|
this._updateDisableUserList();
|
||||||
}));
|
}));
|
||||||
|
|
||||||
return GLib.SOURCE_REMOVE;
|
return GLib.SOURCE_REMOVE;
|
||||||
@ -1197,7 +1260,7 @@ const LoginDialog = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
addCharacter: function(unichar) {
|
addCharacter: function(unichar) {
|
||||||
this._authPrompt.addCharacter(unichar);
|
// Don't allow type ahead at the login screen
|
||||||
},
|
},
|
||||||
|
|
||||||
finish: function(onComplete) {
|
finish: function(onComplete) {
|
||||||
|
@ -27,7 +27,7 @@ function OVirtCredentials() {
|
|||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
const OVirtCredentialsManager = new Lang.Class({
|
var OVirtCredentialsManager = new Lang.Class({
|
||||||
Name: 'OVirtCredentialsManager',
|
Name: 'OVirtCredentialsManager',
|
||||||
_init: function() {
|
_init: function() {
|
||||||
this._token = null;
|
this._token = null;
|
||||||
|
@ -59,7 +59,7 @@ const RealmIface = '<node> \
|
|||||||
</node>';
|
</node>';
|
||||||
const Realm = Gio.DBusProxy.makeProxyWrapper(RealmIface);
|
const Realm = Gio.DBusProxy.makeProxyWrapper(RealmIface);
|
||||||
|
|
||||||
const Manager = new Lang.Class({
|
var Manager = new Lang.Class({
|
||||||
Name: 'Manager',
|
Name: 'Manager',
|
||||||
|
|
||||||
_init: function(parentActor) {
|
_init: function(parentActor) {
|
||||||
|
@ -17,28 +17,28 @@ const ShellEntry = imports.ui.shellEntry;
|
|||||||
const SmartcardManager = imports.misc.smartcardManager;
|
const SmartcardManager = imports.misc.smartcardManager;
|
||||||
const Tweener = imports.ui.tweener;
|
const Tweener = imports.ui.tweener;
|
||||||
|
|
||||||
const PASSWORD_SERVICE_NAME = 'gdm-password';
|
var PASSWORD_SERVICE_NAME = 'gdm-password';
|
||||||
const FINGERPRINT_SERVICE_NAME = 'gdm-fingerprint';
|
var FINGERPRINT_SERVICE_NAME = 'gdm-fingerprint';
|
||||||
const SMARTCARD_SERVICE_NAME = 'gdm-smartcard';
|
var SMARTCARD_SERVICE_NAME = 'gdm-smartcard';
|
||||||
const OVIRT_SERVICE_NAME = 'gdm-ovirtcred';
|
var OVIRT_SERVICE_NAME = 'gdm-ovirtcred';
|
||||||
const FADE_ANIMATION_TIME = 0.16;
|
var FADE_ANIMATION_TIME = 0.16;
|
||||||
const CLONE_FADE_ANIMATION_TIME = 0.25;
|
var CLONE_FADE_ANIMATION_TIME = 0.25;
|
||||||
|
|
||||||
const LOGIN_SCREEN_SCHEMA = 'org.gnome.login-screen';
|
var LOGIN_SCREEN_SCHEMA = 'org.gnome.login-screen';
|
||||||
const PASSWORD_AUTHENTICATION_KEY = 'enable-password-authentication';
|
var PASSWORD_AUTHENTICATION_KEY = 'enable-password-authentication';
|
||||||
const FINGERPRINT_AUTHENTICATION_KEY = 'enable-fingerprint-authentication';
|
var FINGERPRINT_AUTHENTICATION_KEY = 'enable-fingerprint-authentication';
|
||||||
const SMARTCARD_AUTHENTICATION_KEY = 'enable-smartcard-authentication';
|
var SMARTCARD_AUTHENTICATION_KEY = 'enable-smartcard-authentication';
|
||||||
const BANNER_MESSAGE_KEY = 'banner-message-enable';
|
var BANNER_MESSAGE_KEY = 'banner-message-enable';
|
||||||
const BANNER_MESSAGE_TEXT_KEY = 'banner-message-text';
|
var BANNER_MESSAGE_TEXT_KEY = 'banner-message-text';
|
||||||
const ALLOWED_FAILURES_KEY = 'allowed-failures';
|
var ALLOWED_FAILURES_KEY = 'allowed-failures';
|
||||||
|
|
||||||
const LOGO_KEY = 'logo';
|
var LOGO_KEY = 'logo';
|
||||||
const DISABLE_USER_LIST_KEY = 'disable-user-list';
|
var DISABLE_USER_LIST_KEY = 'disable-user-list';
|
||||||
|
|
||||||
// Give user 48ms to read each character of a PAM message
|
// Give user 48ms to read each character of a PAM message
|
||||||
const USER_READ_TIME = 48
|
var USER_READ_TIME = 48
|
||||||
|
|
||||||
const MessageType = {
|
var MessageType = {
|
||||||
NONE: 0,
|
NONE: 0,
|
||||||
ERROR: 1,
|
ERROR: 1,
|
||||||
INFO: 2,
|
INFO: 2,
|
||||||
@ -119,7 +119,7 @@ function cloneAndFadeOutActor(actor) {
|
|||||||
return hold;
|
return hold;
|
||||||
}
|
}
|
||||||
|
|
||||||
const ShellUserVerifier = new Lang.Class({
|
var ShellUserVerifier = new Lang.Class({
|
||||||
Name: 'ShellUserVerifier',
|
Name: 'ShellUserVerifier',
|
||||||
|
|
||||||
_init: function(client, params) {
|
_init: function(client, params) {
|
||||||
@ -128,18 +128,22 @@ const ShellUserVerifier = new Lang.Class({
|
|||||||
|
|
||||||
this._client = client;
|
this._client = client;
|
||||||
|
|
||||||
|
this._defaultService = null;
|
||||||
|
this._preemptingService = null;
|
||||||
|
|
||||||
this._settings = new Gio.Settings({ schema_id: LOGIN_SCREEN_SCHEMA });
|
this._settings = new Gio.Settings({ schema_id: LOGIN_SCREEN_SCHEMA });
|
||||||
this._settings.connect('changed',
|
this._settings.connect('changed',
|
||||||
Lang.bind(this, this._updateDefaultService));
|
Lang.bind(this, this._updateDefaultService));
|
||||||
this._updateDefaultService();
|
this._updateDefaultService();
|
||||||
|
|
||||||
this._fprintManager = new Fprint.FprintManager();
|
this._fprintManager = Fprint.FprintManager();
|
||||||
this._smartcardManager = SmartcardManager.getSmartcardManager();
|
this._smartcardManager = SmartcardManager.getSmartcardManager();
|
||||||
|
|
||||||
// We check for smartcards right away, since an inserted smartcard
|
// We check for smartcards right away, since an inserted smartcard
|
||||||
// at startup should result in immediately initiating authentication.
|
// at startup should result in immediately initiating authentication.
|
||||||
// This is different than fingeprint readers, where we only check them
|
// This is different than fingerprint readers, where we only check them
|
||||||
// after a user has been picked.
|
// after a user has been picked.
|
||||||
|
this.smartcardDetected = false;
|
||||||
this._checkForSmartcard();
|
this._checkForSmartcard();
|
||||||
|
|
||||||
this._smartcardInsertedId = this._smartcardManager.connect('smartcard-inserted',
|
this._smartcardInsertedId = this._smartcardManager.connect('smartcard-inserted',
|
||||||
@ -293,7 +297,8 @@ const ShellUserVerifier = new Lang.Class({
|
|||||||
_checkForFingerprintReader: function() {
|
_checkForFingerprintReader: function() {
|
||||||
this._haveFingerprintReader = false;
|
this._haveFingerprintReader = false;
|
||||||
|
|
||||||
if (!this._settings.get_boolean(FINGERPRINT_AUTHENTICATION_KEY)) {
|
if (!this._settings.get_boolean(FINGERPRINT_AUTHENTICATION_KEY) ||
|
||||||
|
this._fprintManager == null) {
|
||||||
this._updateDefaultService();
|
this._updateDefaultService();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -539,6 +544,7 @@ const ShellUserVerifier = new Lang.Class({
|
|||||||
let signalId = this.connect('no-more-messages',
|
let signalId = this.connect('no-more-messages',
|
||||||
Lang.bind(this, function() {
|
Lang.bind(this, function() {
|
||||||
this.disconnect(signalId);
|
this.disconnect(signalId);
|
||||||
|
if (this._cancellable && !this._cancellable.is_cancelled())
|
||||||
this._retry();
|
this._retry();
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
@ -23,26 +23,33 @@
|
|||||||
<file>misc/modemManager.js</file>
|
<file>misc/modemManager.js</file>
|
||||||
<file>misc/objectManager.js</file>
|
<file>misc/objectManager.js</file>
|
||||||
<file>misc/params.js</file>
|
<file>misc/params.js</file>
|
||||||
|
<file>misc/permissionStore.js</file>
|
||||||
<file>misc/smartcardManager.js</file>
|
<file>misc/smartcardManager.js</file>
|
||||||
|
<file>misc/systemActions.js</file>
|
||||||
<file>misc/util.js</file>
|
<file>misc/util.js</file>
|
||||||
|
<file>misc/weather.js</file>
|
||||||
|
|
||||||
<file>perf/core.js</file>
|
<file>perf/core.js</file>
|
||||||
<file>perf/hwtest.js</file>
|
<file>perf/hwtest.js</file>
|
||||||
|
|
||||||
<file>portalHelper/main.js</file>
|
<file>portalHelper/main.js</file>
|
||||||
|
|
||||||
|
<file>ui/accessDialog.js</file>
|
||||||
<file>ui/altTab.js</file>
|
<file>ui/altTab.js</file>
|
||||||
<file>ui/animation.js</file>
|
<file>ui/animation.js</file>
|
||||||
<file>ui/appDisplay.js</file>
|
<file>ui/appDisplay.js</file>
|
||||||
<file>ui/appFavorites.js</file>
|
<file>ui/appFavorites.js</file>
|
||||||
|
<file>ui/audioDeviceSelection.js</file>
|
||||||
<file>ui/backgroundMenu.js</file>
|
<file>ui/backgroundMenu.js</file>
|
||||||
<file>ui/background.js</file>
|
<file>ui/background.js</file>
|
||||||
<file>ui/boxpointer.js</file>
|
<file>ui/boxpointer.js</file>
|
||||||
<file>ui/calendar.js</file>
|
<file>ui/calendar.js</file>
|
||||||
<file>ui/checkBox.js</file>
|
<file>ui/checkBox.js</file>
|
||||||
|
<file>ui/closeDialog.js</file>
|
||||||
<file>ui/ctrlAltTab.js</file>
|
<file>ui/ctrlAltTab.js</file>
|
||||||
<file>ui/dash.js</file>
|
<file>ui/dash.js</file>
|
||||||
<file>ui/dateMenu.js</file>
|
<file>ui/dateMenu.js</file>
|
||||||
|
<file>ui/dialog.js</file>
|
||||||
<file>ui/dnd.js</file>
|
<file>ui/dnd.js</file>
|
||||||
<file>ui/edgeDragAction.js</file>
|
<file>ui/edgeDragAction.js</file>
|
||||||
<file>ui/endSessionDialog.js</file>
|
<file>ui/endSessionDialog.js</file>
|
||||||
@ -53,21 +60,24 @@
|
|||||||
<file>ui/grabHelper.js</file>
|
<file>ui/grabHelper.js</file>
|
||||||
<file>ui/ibusCandidatePopup.js</file>
|
<file>ui/ibusCandidatePopup.js</file>
|
||||||
<file>ui/iconGrid.js</file>
|
<file>ui/iconGrid.js</file>
|
||||||
|
<file>ui/inhibitShortcutsDialog.js</file>
|
||||||
<file>ui/keyboard.js</file>
|
<file>ui/keyboard.js</file>
|
||||||
<file>ui/layout.js</file>
|
<file>ui/layout.js</file>
|
||||||
<file>ui/lightbox.js</file>
|
<file>ui/lightbox.js</file>
|
||||||
<file>ui/lookingGlass.js</file>
|
<file>ui/lookingGlass.js</file>
|
||||||
<file>ui/legacyTray.js</file>
|
|
||||||
<file>ui/magnifier.js</file>
|
<file>ui/magnifier.js</file>
|
||||||
<file>ui/magnifierDBus.js</file>
|
<file>ui/magnifierDBus.js</file>
|
||||||
<file>ui/main.js</file>
|
<file>ui/main.js</file>
|
||||||
<file>ui/messageTray.js</file>
|
<file>ui/messageTray.js</file>
|
||||||
|
<file>ui/messageList.js</file>
|
||||||
<file>ui/modalDialog.js</file>
|
<file>ui/modalDialog.js</file>
|
||||||
|
<file>ui/mpris.js</file>
|
||||||
<file>ui/notificationDaemon.js</file>
|
<file>ui/notificationDaemon.js</file>
|
||||||
<file>ui/osdWindow.js</file>
|
<file>ui/osdWindow.js</file>
|
||||||
<file>ui/osdMonitorLabeler.js</file>
|
<file>ui/osdMonitorLabeler.js</file>
|
||||||
<file>ui/overview.js</file>
|
<file>ui/overview.js</file>
|
||||||
<file>ui/overviewControls.js</file>
|
<file>ui/overviewControls.js</file>
|
||||||
|
<file>ui/padOsd.js</file>
|
||||||
<file>ui/panel.js</file>
|
<file>ui/panel.js</file>
|
||||||
<file>ui/panelMenu.js</file>
|
<file>ui/panelMenu.js</file>
|
||||||
<file>ui/pointerWatcher.js</file>
|
<file>ui/pointerWatcher.js</file>
|
||||||
@ -80,13 +90,13 @@
|
|||||||
<file>ui/screenshot.js</file>
|
<file>ui/screenshot.js</file>
|
||||||
<file>ui/scripting.js</file>
|
<file>ui/scripting.js</file>
|
||||||
<file>ui/search.js</file>
|
<file>ui/search.js</file>
|
||||||
<file>ui/separator.js</file>
|
|
||||||
<file>ui/sessionMode.js</file>
|
<file>ui/sessionMode.js</file>
|
||||||
<file>ui/shellDBus.js</file>
|
<file>ui/shellDBus.js</file>
|
||||||
<file>ui/shellEntry.js</file>
|
<file>ui/shellEntry.js</file>
|
||||||
<file>ui/shellMountOperation.js</file>
|
<file>ui/shellMountOperation.js</file>
|
||||||
<file>ui/slider.js</file>
|
<file>ui/slider.js</file>
|
||||||
<file>ui/switcherPopup.js</file>
|
<file>ui/switcherPopup.js</file>
|
||||||
|
<file>ui/switchMonitor.js</file>
|
||||||
<file>ui/tweener.js</file>
|
<file>ui/tweener.js</file>
|
||||||
<file>ui/unlockDialog.js</file>
|
<file>ui/unlockDialog.js</file>
|
||||||
<file>ui/userWidget.js</file>
|
<file>ui/userWidget.js</file>
|
||||||
@ -112,6 +122,7 @@
|
|||||||
<file>ui/status/brightness.js</file>
|
<file>ui/status/brightness.js</file>
|
||||||
<file>ui/status/location.js</file>
|
<file>ui/status/location.js</file>
|
||||||
<file>ui/status/keyboard.js</file>
|
<file>ui/status/keyboard.js</file>
|
||||||
|
<file>ui/status/nightLight.js</file>
|
||||||
<file>ui/status/network.js</file>
|
<file>ui/status/network.js</file>
|
||||||
<file>ui/status/power.js</file>
|
<file>ui/status/power.js</file>
|
||||||
<file>ui/status/rfkill.js</file>
|
<file>ui/status/rfkill.js</file>
|
||||||
|
8
js/meson.build
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
subdir('misc')
|
||||||
|
|
||||||
|
js_resources = gnome.compile_resources(
|
||||||
|
'js-resources', 'js-resources.gresource.xml',
|
||||||
|
source_dir: ['.', meson.current_build_dir()],
|
||||||
|
c_name: 'shell_js_resources',
|
||||||
|
dependencies: [config_js]
|
||||||
|
)
|
@ -1,17 +1,19 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
|
||||||
/* The name of this package (not localized) */
|
/* The name of this package (not localized) */
|
||||||
const PACKAGE_NAME = '@PACKAGE_NAME@';
|
var PACKAGE_NAME = '@PACKAGE_NAME@';
|
||||||
/* The version of this package */
|
/* The version of this package */
|
||||||
const PACKAGE_VERSION = '@PACKAGE_VERSION@';
|
var PACKAGE_VERSION = '@PACKAGE_VERSION@';
|
||||||
/* 1 if gnome-bluetooth is available, 0 otherwise */
|
/* 1 if gnome-bluetooth is available, 0 otherwise */
|
||||||
const HAVE_BLUETOOTH = @HAVE_BLUETOOTH@;
|
var HAVE_BLUETOOTH = @HAVE_BLUETOOTH@;
|
||||||
/* 1 if networkmanager is available, 0 otherwise */
|
/* 1 if networkmanager is available, 0 otherwise */
|
||||||
const HAVE_NETWORKMANAGER = @HAVE_NETWORKMANAGER@;
|
var HAVE_NETWORKMANAGER = @HAVE_NETWORKMANAGER@;
|
||||||
/* gettext package */
|
/* gettext package */
|
||||||
const GETTEXT_PACKAGE = '@GETTEXT_PACKAGE@';
|
var GETTEXT_PACKAGE = '@GETTEXT_PACKAGE@';
|
||||||
/* locale dir */
|
/* locale dir */
|
||||||
const LOCALEDIR = '@datadir@/locale';
|
var LOCALEDIR = '@datadir@/locale';
|
||||||
/* other standard directories */
|
/* other standard directories */
|
||||||
const LIBEXECDIR = '@libexecdir@';
|
var LIBEXECDIR = '@libexecdir@';
|
||||||
const SYSCONFDIR = '@sysconfdir@';
|
var SYSCONFDIR = '@sysconfdir@';
|
||||||
|
/* g-i package versions */
|
||||||
|
var LIBMUTTER_API_VERSION = '@LIBMUTTER_API_VERSION@'
|
||||||
|
@ -6,29 +6,38 @@
|
|||||||
const Lang = imports.lang;
|
const Lang = imports.lang;
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
|
|
||||||
const GLib = imports.gi.GLib;
|
|
||||||
const Gio = imports.gi.Gio;
|
const Gio = imports.gi.Gio;
|
||||||
const ShellJS = imports.gi.ShellJS;
|
|
||||||
|
|
||||||
const Config = imports.misc.config;
|
const Config = imports.misc.config;
|
||||||
const FileUtils = imports.misc.fileUtils;
|
const FileUtils = imports.misc.fileUtils;
|
||||||
|
|
||||||
const ExtensionType = {
|
var ExtensionType = {
|
||||||
SYSTEM: 1,
|
SYSTEM: 1,
|
||||||
PER_USER: 2
|
PER_USER: 2
|
||||||
};
|
};
|
||||||
|
|
||||||
// Maps uuid -> metadata object
|
// Maps uuid -> metadata object
|
||||||
const extensions = {};
|
var extensions = {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* getCurrentExtension:
|
||||||
|
*
|
||||||
|
* Returns the current extension, or null if not called from an extension.
|
||||||
|
*/
|
||||||
function getCurrentExtension() {
|
function getCurrentExtension() {
|
||||||
let stack = (new Error()).stack;
|
let stack = (new Error()).stack.split('\n');
|
||||||
|
let extensionStackLine;
|
||||||
|
|
||||||
// Assuming we're importing this directly from an extension (and we shouldn't
|
// Search for an occurrence of an extension stack frame
|
||||||
// ever not be), its UUID should be directly in the path here.
|
// Start at 1 because 0 is the stack frame of this function
|
||||||
let extensionStackLine = stack.split('\n')[1];
|
for (let i = 1; i < stack.length; i++) {
|
||||||
|
if (stack[i].indexOf('/gnome-shell/extensions/') > -1) {
|
||||||
|
extensionStackLine = stack[i];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (!extensionStackLine)
|
if (!extensionStackLine)
|
||||||
throw new Error('Could not find current extension');
|
return null;
|
||||||
|
|
||||||
// The stack line is like:
|
// The stack line is like:
|
||||||
// init([object Object])@/home/user/data/gnome-shell/extensions/u@u.id/prefs.js:8
|
// init([object Object])@/home/user/data/gnome-shell/extensions/u@u.id/prefs.js:8
|
||||||
@ -38,7 +47,7 @@ function getCurrentExtension() {
|
|||||||
// @/home/user/data/gnome-shell/extensions/u@u.id/prefs.js:8
|
// @/home/user/data/gnome-shell/extensions/u@u.id/prefs.js:8
|
||||||
let match = new RegExp('@(.+):\\d+').exec(extensionStackLine);
|
let match = new RegExp('@(.+):\\d+').exec(extensionStackLine);
|
||||||
if (!match)
|
if (!match)
|
||||||
throw new Error('Could not find current extension');
|
return null;
|
||||||
|
|
||||||
let path = match[1];
|
let path = match[1];
|
||||||
let file = Gio.File.new_for_path(path);
|
let file = Gio.File.new_for_path(path);
|
||||||
@ -52,7 +61,7 @@ function getCurrentExtension() {
|
|||||||
file = file.get_parent();
|
file = file.get_parent();
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new Error('Could not find current extension');
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -140,15 +149,16 @@ function createExtensionObject(uuid, dir, type) {
|
|||||||
return extension;
|
return extension;
|
||||||
}
|
}
|
||||||
|
|
||||||
var _extension = null;
|
|
||||||
|
|
||||||
function installImporter(extension) {
|
function installImporter(extension) {
|
||||||
_extension = extension;
|
let oldSearchPath = imports.searchPath.slice(); // make a copy
|
||||||
ShellJS.add_extension_importer('imports.misc.extensionUtils._extension', 'imports', extension.path);
|
imports.searchPath = [extension.dir.get_parent().get_path()];
|
||||||
_extension = null;
|
// importing a "subdir" creates a new importer object that doesn't affect
|
||||||
|
// the global one
|
||||||
|
extension.imports = imports[extension.uuid];
|
||||||
|
imports.searchPath = oldSearchPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
const ExtensionFinder = new Lang.Class({
|
var ExtensionFinder = new Lang.Class({
|
||||||
Name: 'ExtensionFinder',
|
Name: 'ExtensionFinder',
|
||||||
|
|
||||||
_loadExtension: function(extensionDir, info, perUserDir) {
|
_loadExtension: function(extensionDir, info, perUserDir) {
|
||||||
|
@ -16,7 +16,7 @@ const PresenceIface = '<node> \
|
|||||||
</interface> \
|
</interface> \
|
||||||
</node>';
|
</node>';
|
||||||
|
|
||||||
const PresenceStatus = {
|
var PresenceStatus = {
|
||||||
AVAILABLE: 0,
|
AVAILABLE: 0,
|
||||||
INVISIBLE: 1,
|
INVISIBLE: 1,
|
||||||
BUSY: 2,
|
BUSY: 2,
|
||||||
|
@ -5,9 +5,9 @@ const Signals = imports.signals;
|
|||||||
const Clutter = imports.gi.Clutter;
|
const Clutter = imports.gi.Clutter;
|
||||||
const Params = imports.misc.params;
|
const Params = imports.misc.params;
|
||||||
|
|
||||||
const DEFAULT_LIMIT = 512;
|
var DEFAULT_LIMIT = 512;
|
||||||
|
|
||||||
const HistoryManager = new Lang.Class({
|
var HistoryManager = new Lang.Class({
|
||||||
Name: 'HistoryManager',
|
Name: 'HistoryManager',
|
||||||
|
|
||||||
_init: function(params) {
|
_init: function(params) {
|
||||||
@ -69,7 +69,7 @@ const HistoryManager = new Lang.Class({
|
|||||||
this._indexChanged();
|
this._indexChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
return this._historyIndex[this._history.length];
|
return this._historyIndex ? this._history[this._historyIndex -1] : null;
|
||||||
},
|
},
|
||||||
|
|
||||||
addItem: function(input) {
|
addItem: function(input) {
|
||||||
|
@ -6,10 +6,11 @@ const Lang = imports.lang;
|
|||||||
const Mainloop = imports.mainloop;
|
const Mainloop = imports.mainloop;
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
|
|
||||||
|
let IBusCandidatePopup;
|
||||||
try {
|
try {
|
||||||
var IBus = imports.gi.IBus;
|
var IBus = imports.gi.IBus;
|
||||||
_checkIBusVersion(1, 5, 2);
|
_checkIBusVersion(1, 5, 2);
|
||||||
const IBusCandidatePopup = imports.ui.ibusCandidatePopup;
|
IBusCandidatePopup = imports.ui.ibusCandidatePopup;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
var IBus = null;
|
var IBus = null;
|
||||||
log(e);
|
log(e);
|
||||||
@ -35,7 +36,7 @@ function getIBusManager() {
|
|||||||
return _ibusManager;
|
return _ibusManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
const IBusManager = new Lang.Class({
|
var IBusManager = new Lang.Class({
|
||||||
Name: 'IBusManager',
|
Name: 'IBusManager',
|
||||||
|
|
||||||
// This is the longest we'll keep the keyboard frozen until an input
|
// This is the longest we'll keep the keyboard frozen until an input
|
||||||
@ -189,7 +190,7 @@ const IBusManager = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
getEngineDesc: function(id) {
|
getEngineDesc: function(id) {
|
||||||
if (!IBus || !this._ready)
|
if (!IBus || !this._ready || !this._engines.hasOwnProperty(id))
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
return this._engines[id];
|
return this._engines[id];
|
||||||
|
@ -7,9 +7,9 @@ const Meta = imports.gi.Meta;
|
|||||||
|
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
|
|
||||||
const DEFAULT_LOCALE = 'en_US';
|
var DEFAULT_LOCALE = 'en_US';
|
||||||
const DEFAULT_LAYOUT = 'us';
|
var DEFAULT_LAYOUT = 'us';
|
||||||
const DEFAULT_VARIANT = '';
|
var DEFAULT_VARIANT = '';
|
||||||
|
|
||||||
let _xkbInfo = null;
|
let _xkbInfo = null;
|
||||||
|
|
||||||
@ -38,7 +38,7 @@ function holdKeyboard() {
|
|||||||
global.display.freeze_keyboard(global.get_current_time());
|
global.display.freeze_keyboard(global.get_current_time());
|
||||||
}
|
}
|
||||||
|
|
||||||
const KeyboardManager = new Lang.Class({
|
var KeyboardManager = new Lang.Class({
|
||||||
Name: 'KeyboardManager',
|
Name: 'KeyboardManager',
|
||||||
|
|
||||||
// The XKB protocol doesn't allow for more that 4 layouts in a
|
// The XKB protocol doesn't allow for more that 4 layouts in a
|
||||||
@ -128,7 +128,8 @@ const KeyboardManager = new Lang.Class({
|
|||||||
if (!found)
|
if (!found)
|
||||||
[, , id] = GnomeDesktop.get_input_source_from_locale(DEFAULT_LOCALE);
|
[, , id] = GnomeDesktop.get_input_source_from_locale(DEFAULT_LOCALE);
|
||||||
|
|
||||||
let [found, , , _layout, _variant] = this._xkbInfo.get_layout_info(id);
|
let _layout, _variant;
|
||||||
|
[found, , , _layout, _variant] = this._xkbInfo.get_layout_info(id);
|
||||||
if (found)
|
if (found)
|
||||||
return { layout: _layout, variant: _variant };
|
return { layout: _layout, variant: _variant };
|
||||||
else
|
else
|
||||||
|
@ -40,6 +40,9 @@ const SystemdLoginSessionIface = '<node> \
|
|||||||
<signal name="Lock" /> \
|
<signal name="Lock" /> \
|
||||||
<signal name="Unlock" /> \
|
<signal name="Unlock" /> \
|
||||||
<property name="Active" type="b" access="read" /> \
|
<property name="Active" type="b" access="read" /> \
|
||||||
|
<method name="SetLockedHint"> \
|
||||||
|
<arg type="b" direction="in"/> \
|
||||||
|
</method> \
|
||||||
</interface> \
|
</interface> \
|
||||||
</node>';
|
</node>';
|
||||||
|
|
||||||
@ -99,7 +102,7 @@ function getLoginManager() {
|
|||||||
return _loginManager;
|
return _loginManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
const LoginManagerSystemd = new Lang.Class({
|
var LoginManagerSystemd = new Lang.Class({
|
||||||
Name: 'LoginManagerSystemd',
|
Name: 'LoginManagerSystemd',
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
@ -116,7 +119,13 @@ const LoginManagerSystemd = new Lang.Class({
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this._proxy.GetSessionRemote(GLib.getenv('XDG_SESSION_ID'), Lang.bind(this,
|
let sessionId = GLib.getenv('XDG_SESSION_ID');
|
||||||
|
if (!sessionId) {
|
||||||
|
log('Unset XDG_SESSION_ID, getCurrentSessionProxy() called outside a user session.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this._proxy.GetSessionRemote(sessionId, Lang.bind(this,
|
||||||
function(result, error) {
|
function(result, error) {
|
||||||
if (error) {
|
if (error) {
|
||||||
logError(error, 'Could not get a proxy for the current session');
|
logError(error, 'Could not get a proxy for the current session');
|
||||||
@ -131,10 +140,13 @@ const LoginManagerSystemd = new Lang.Class({
|
|||||||
|
|
||||||
canSuspend: function(asyncCallback) {
|
canSuspend: function(asyncCallback) {
|
||||||
this._proxy.CanSuspendRemote(function(result, error) {
|
this._proxy.CanSuspendRemote(function(result, error) {
|
||||||
if (error)
|
if (error) {
|
||||||
asyncCallback(false);
|
asyncCallback(false, false);
|
||||||
else
|
} else {
|
||||||
asyncCallback(result[0] != 'no');
|
let needsAuth = result[0] == 'challenge';
|
||||||
|
let canSuspend = needsAuth || result[0] == 'yes';
|
||||||
|
asyncCallback(canSuspend, needsAuth);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -177,7 +189,7 @@ const LoginManagerSystemd = new Lang.Class({
|
|||||||
});
|
});
|
||||||
Signals.addSignalMethods(LoginManagerSystemd.prototype);
|
Signals.addSignalMethods(LoginManagerSystemd.prototype);
|
||||||
|
|
||||||
const LoginManagerDummy = new Lang.Class({
|
var LoginManagerDummy = new Lang.Class({
|
||||||
Name: 'LoginManagerDummy',
|
Name: 'LoginManagerDummy',
|
||||||
|
|
||||||
getCurrentSessionProxy: function(callback) {
|
getCurrentSessionProxy: function(callback) {
|
||||||
@ -187,7 +199,7 @@ const LoginManagerDummy = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
canSuspend: function(asyncCallback) {
|
canSuspend: function(asyncCallback) {
|
||||||
asyncCallback(false);
|
asyncCallback(false, false);
|
||||||
},
|
},
|
||||||
|
|
||||||
listSessions: function(asyncCallback) {
|
listSessions: function(asyncCallback) {
|
||||||
|
16
js/misc/meson.build
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
jsconf = configuration_data()
|
||||||
|
jsconf.set('PACKAGE_NAME', meson.project_name())
|
||||||
|
jsconf.set('PACKAGE_VERSION', meson.project_version())
|
||||||
|
jsconf.set('GETTEXT_PACKAGE', meson.project_name())
|
||||||
|
jsconf.set('LIBMUTTER_API_VERSION', mutter_api_version)
|
||||||
|
jsconf.set10('HAVE_BLUETOOTH', bt_dep.found())
|
||||||
|
jsconf.set10('HAVE_NETWORKMANAGER', have_networkmanager)
|
||||||
|
jsconf.set('datadir', datadir)
|
||||||
|
jsconf.set('libexecdir', libexecdir)
|
||||||
|
jsconf.set('sysconfdir', sysconfdir)
|
||||||
|
|
||||||
|
config_js = configure_file(
|
||||||
|
input: 'config.js.in',
|
||||||
|
output: 'config.js',
|
||||||
|
configuration: jsconf
|
||||||
|
)
|
@ -130,7 +130,7 @@ const ModemCdmaInterface = '<node> \
|
|||||||
|
|
||||||
const ModemCdmaProxy = Gio.DBusProxy.makeProxyWrapper(ModemCdmaInterface);
|
const ModemCdmaProxy = Gio.DBusProxy.makeProxyWrapper(ModemCdmaInterface);
|
||||||
|
|
||||||
const ModemGsm = new Lang.Class({
|
var ModemGsm = new Lang.Class({
|
||||||
Name: 'ModemGsm',
|
Name: 'ModemGsm',
|
||||||
|
|
||||||
_init: function(path) {
|
_init: function(path) {
|
||||||
@ -172,7 +172,7 @@ const ModemGsm = new Lang.Class({
|
|||||||
});
|
});
|
||||||
Signals.addSignalMethods(ModemGsm.prototype);
|
Signals.addSignalMethods(ModemGsm.prototype);
|
||||||
|
|
||||||
const ModemCdma = new Lang.Class({
|
var ModemCdma = new Lang.Class({
|
||||||
Name: 'ModemCdma',
|
Name: 'ModemCdma',
|
||||||
|
|
||||||
_init: function(path) {
|
_init: function(path) {
|
||||||
@ -244,7 +244,7 @@ const BroadbandModemCdmaInterface = '<node> \
|
|||||||
</node>';
|
</node>';
|
||||||
const BroadbandModemCdmaProxy = Gio.DBusProxy.makeProxyWrapper(BroadbandModemCdmaInterface);
|
const BroadbandModemCdmaProxy = Gio.DBusProxy.makeProxyWrapper(BroadbandModemCdmaInterface);
|
||||||
|
|
||||||
const BroadbandModem = new Lang.Class({
|
var BroadbandModem = new Lang.Class({
|
||||||
Name: 'BroadbandModem',
|
Name: 'BroadbandModem',
|
||||||
|
|
||||||
_init: function(path, capabilities) {
|
_init: function(path, capabilities) {
|
||||||
|
@ -26,7 +26,7 @@ const ObjectManagerIface = '<node> \
|
|||||||
|
|
||||||
const ObjectManagerInfo = Gio.DBusInterfaceInfo.new_for_xml(ObjectManagerIface);
|
const ObjectManagerInfo = Gio.DBusInterfaceInfo.new_for_xml(ObjectManagerIface);
|
||||||
|
|
||||||
const ObjectManager = new Lang.Class({
|
var ObjectManager = new Lang.Class({
|
||||||
Name: 'ObjectManager',
|
Name: 'ObjectManager',
|
||||||
_init: function(params) {
|
_init: function(params) {
|
||||||
params = Params.parse(params, { connection: null,
|
params = Params.parse(params, { connection: null,
|
||||||
@ -46,7 +46,7 @@ const ObjectManager = new Lang.Class({
|
|||||||
g_interface_info: ObjectManagerInfo,
|
g_interface_info: ObjectManagerInfo,
|
||||||
g_name: this._serviceName,
|
g_name: this._serviceName,
|
||||||
g_object_path: this._managerPath,
|
g_object_path: this._managerPath,
|
||||||
g_flags: Gio.DBusProxyFlags.NONE });
|
g_flags: Gio.DBusProxyFlags.DO_NOT_AUTO_START });
|
||||||
|
|
||||||
this._interfaceInfos = {};
|
this._interfaceInfos = {};
|
||||||
this._objects = {};
|
this._objects = {};
|
||||||
@ -65,6 +65,9 @@ const ObjectManager = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_tryToCompleteLoad: function() {
|
_tryToCompleteLoad: function() {
|
||||||
|
if (this._numLoadInhibitors == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
this._numLoadInhibitors--;
|
this._numLoadInhibitors--;
|
||||||
if (this._numLoadInhibitors == 0) {
|
if (this._numLoadInhibitors == 0) {
|
||||||
if (this._onLoaded)
|
if (this._onLoaded)
|
||||||
@ -86,7 +89,7 @@ const ObjectManager = new Lang.Class({
|
|||||||
g_object_path: objectPath,
|
g_object_path: objectPath,
|
||||||
g_interface_name: interfaceName,
|
g_interface_name: interfaceName,
|
||||||
g_interface_info: info,
|
g_interface_info: info,
|
||||||
g_flags: Gio.DBusProxyFlags.NONE });
|
g_flags: Gio.DBusProxyFlags.DO_NOT_AUTO_START });
|
||||||
|
|
||||||
proxy.init_async(GLib.PRIORITY_DEFAULT,
|
proxy.init_async(GLib.PRIORITY_DEFAULT,
|
||||||
this._cancellable,
|
this._cancellable,
|
||||||
@ -181,6 +184,18 @@ const ObjectManager = new Lang.Class({
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this._managerProxy.connect('notify::g-name-owner', Lang.bind(this, function() {
|
||||||
|
if (this._managerProxy.g_name_owner)
|
||||||
|
this._onNameAppeared();
|
||||||
|
else
|
||||||
|
this._onNameVanished();
|
||||||
|
}));
|
||||||
|
|
||||||
|
if (this._managerProxy.g_name_owner)
|
||||||
|
this._onNameAppeared();
|
||||||
|
},
|
||||||
|
|
||||||
|
_onNameAppeared: function() {
|
||||||
this._managerProxy.GetManagedObjectsRemote(Lang.bind(this, function(result, error) {
|
this._managerProxy.GetManagedObjectsRemote(Lang.bind(this, function(result, error) {
|
||||||
if (!result) {
|
if (!result) {
|
||||||
if (error) {
|
if (error) {
|
||||||
@ -193,6 +208,11 @@ const ObjectManager = new Lang.Class({
|
|||||||
|
|
||||||
let [objects] = result;
|
let [objects] = result;
|
||||||
|
|
||||||
|
if (!objects) {
|
||||||
|
this._tryToCompleteLoad();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
let objectPaths = Object.keys(objects);
|
let objectPaths = Object.keys(objects);
|
||||||
for (let i = 0; i < objectPaths.length; i++) {
|
for (let i = 0; i < objectPaths.length; i++) {
|
||||||
let objectPath = objectPaths[i];
|
let objectPath = objectPaths[i];
|
||||||
@ -213,6 +233,21 @@ const ObjectManager = new Lang.Class({
|
|||||||
}));
|
}));
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_onNameVanished: function() {
|
||||||
|
let objectPaths = Object.keys(this._objects);
|
||||||
|
for (let i = 0; i < objectPaths.length; i++) {
|
||||||
|
let object = this._objects[objectPaths];
|
||||||
|
|
||||||
|
let interfaceNames = Object.keys(object);
|
||||||
|
for (let j = 0; i < interfaceNames.length; i++) {
|
||||||
|
let interfaceName = interfaceNames[i];
|
||||||
|
|
||||||
|
if (object[interfaceName])
|
||||||
|
this._removeInterface(objectPath, interfaceName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
_registerInterfaces: function(interfaces) {
|
_registerInterfaces: function(interfaces) {
|
||||||
for (let i = 0; i < interfaces.length; i++) {
|
for (let i = 0; i < interfaces.length; i++) {
|
||||||
let info = Gio.DBusInterfaceInfo.new_for_xml(interfaces[i]);
|
let info = Gio.DBusInterfaceInfo.new_for_xml(interfaces[i]);
|
||||||
|
37
js/misc/permissionStore.js
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
|
||||||
|
const Gio = imports.gi.Gio;
|
||||||
|
|
||||||
|
const PermissionStoreIface = '<node> \
|
||||||
|
<interface name="org.freedesktop.impl.portal.PermissionStore"> \
|
||||||
|
<method name="Lookup"> \
|
||||||
|
<arg name="table" type="s" direction="in"/> \
|
||||||
|
<arg name="id" type="s" direction="in"/> \
|
||||||
|
<arg name="permissions" type="a{sas}" direction="out"/> \
|
||||||
|
<arg name="data" type="v" direction="out"/> \
|
||||||
|
</method> \
|
||||||
|
<method name="Set"> \
|
||||||
|
<arg name="table" type="s" direction="in"/> \
|
||||||
|
<arg name="create" type="b" direction="in"/> \
|
||||||
|
<arg name="id" type="s" direction="in"/> \
|
||||||
|
<arg name="app_permissions" type="a{sas}" direction="in"/> \
|
||||||
|
<arg name="data" type="v" direction="in"/> \
|
||||||
|
</method> \
|
||||||
|
<signal name="Changed"> \
|
||||||
|
<arg name="table" type="s" direction="out"/> \
|
||||||
|
<arg name="id" type="s" direction="out"/> \
|
||||||
|
<arg name="deleted" type="b" direction="out"/> \
|
||||||
|
<arg name="data" type="v" direction="out"/> \
|
||||||
|
<arg name="permissions" type="a{sas}" direction="out"/> \
|
||||||
|
</signal> \
|
||||||
|
</interface> \
|
||||||
|
</node>';
|
||||||
|
|
||||||
|
const PermissionStoreProxy = Gio.DBusProxy.makeProxyWrapper(PermissionStoreIface);
|
||||||
|
|
||||||
|
function PermissionStore(initCallback, cancellable) {
|
||||||
|
return new PermissionStoreProxy(Gio.DBus.session,
|
||||||
|
'org.freedesktop.impl.portal.PermissionStore',
|
||||||
|
'/org/freedesktop/impl/portal/PermissionStore',
|
||||||
|
initCallback, cancellable);
|
||||||
|
};
|
@ -25,7 +25,7 @@ function getSmartcardManager() {
|
|||||||
return _smartcardManager;
|
return _smartcardManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
const SmartcardManager = new Lang.Class({
|
var SmartcardManager = new Lang.Class({
|
||||||
Name: 'SmartcardManager',
|
Name: 'SmartcardManager',
|
||||||
_init: function() {
|
_init: function() {
|
||||||
this._objectManager = new ObjectManager.ObjectManager({ connection: Gio.DBus.session,
|
this._objectManager = new ObjectManager.ObjectManager({ connection: Gio.DBus.session,
|
||||||
|
440
js/misc/systemActions.js
Normal file
@ -0,0 +1,440 @@
|
|||||||
|
const AccountsService = imports.gi.AccountsService;
|
||||||
|
const Clutter = imports.gi.Clutter;
|
||||||
|
const Gdm = imports.gi.Gdm;
|
||||||
|
const Gio = imports.gi.Gio;
|
||||||
|
const GLib = imports.gi.GLib;
|
||||||
|
const Lang = imports.lang;
|
||||||
|
const Meta = imports.gi.Meta;
|
||||||
|
const GObject = imports.gi.GObject;
|
||||||
|
|
||||||
|
const GnomeSession = imports.misc.gnomeSession;
|
||||||
|
const LoginManager = imports.misc.loginManager;
|
||||||
|
const Main = imports.ui.main;
|
||||||
|
|
||||||
|
const LOCKDOWN_SCHEMA = 'org.gnome.desktop.lockdown';
|
||||||
|
const LOGIN_SCREEN_SCHEMA = 'org.gnome.login-screen';
|
||||||
|
const DISABLE_USER_SWITCH_KEY = 'disable-user-switching';
|
||||||
|
const DISABLE_LOCK_SCREEN_KEY = 'disable-lock-screen';
|
||||||
|
const DISABLE_LOG_OUT_KEY = 'disable-log-out';
|
||||||
|
const DISABLE_RESTART_KEY = 'disable-restart-buttons';
|
||||||
|
const ALWAYS_SHOW_LOG_OUT_KEY = 'always-show-log-out';
|
||||||
|
|
||||||
|
const SENSOR_BUS_NAME = 'net.hadess.SensorProxy';
|
||||||
|
const SENSOR_OBJECT_PATH = '/net/hadess/SensorProxy';
|
||||||
|
|
||||||
|
const SensorProxyInterface = '<node> \
|
||||||
|
<interface name="net.hadess.SensorProxy"> \
|
||||||
|
<property name="HasAccelerometer" type="b" access="read"/> \
|
||||||
|
</interface> \
|
||||||
|
</node>';
|
||||||
|
|
||||||
|
const POWER_OFF_ACTION_ID = 'power-off';
|
||||||
|
const LOCK_SCREEN_ACTION_ID = 'lock-screen';
|
||||||
|
const LOGOUT_ACTION_ID = 'logout';
|
||||||
|
const SUSPEND_ACTION_ID = 'suspend';
|
||||||
|
const SWITCH_USER_ACTION_ID = 'switch-user';
|
||||||
|
const LOCK_ORIENTATION_ACTION_ID = 'lock-orientation';
|
||||||
|
|
||||||
|
const SensorProxy = Gio.DBusProxy.makeProxyWrapper(SensorProxyInterface);
|
||||||
|
|
||||||
|
let _singleton = null;
|
||||||
|
|
||||||
|
function getDefault() {
|
||||||
|
if (_singleton == null)
|
||||||
|
_singleton = new SystemActions();
|
||||||
|
|
||||||
|
return _singleton;
|
||||||
|
}
|
||||||
|
|
||||||
|
const SystemActions = new Lang.Class({
|
||||||
|
Name: 'SystemActions',
|
||||||
|
Extends: GObject.Object,
|
||||||
|
Properties: {
|
||||||
|
'can-power-off': GObject.ParamSpec.boolean('can-power-off',
|
||||||
|
'can-power-off',
|
||||||
|
'can-power-off',
|
||||||
|
GObject.ParamFlags.READABLE,
|
||||||
|
false),
|
||||||
|
'can-suspend': GObject.ParamSpec.boolean('can-suspend',
|
||||||
|
'can-suspend',
|
||||||
|
'can-suspend',
|
||||||
|
GObject.ParamFlags.READABLE,
|
||||||
|
false),
|
||||||
|
'can-lock-screen': GObject.ParamSpec.boolean('can-lock-screen',
|
||||||
|
'can-lock-screen',
|
||||||
|
'can-lock-screen',
|
||||||
|
GObject.ParamFlags.READABLE,
|
||||||
|
false),
|
||||||
|
'can-switch-user': GObject.ParamSpec.boolean('can-switch-user',
|
||||||
|
'can-switch-user',
|
||||||
|
'can-switch-user',
|
||||||
|
GObject.ParamFlags.READABLE,
|
||||||
|
false),
|
||||||
|
'can-logout': GObject.ParamSpec.boolean('can-logout',
|
||||||
|
'can-logout',
|
||||||
|
'can-logout',
|
||||||
|
GObject.ParamFlags.READABLE,
|
||||||
|
false),
|
||||||
|
'can-lock-orientation': GObject.ParamSpec.boolean('can-lock-orientation',
|
||||||
|
'can-lock-orientation',
|
||||||
|
'can-lock-orientation',
|
||||||
|
GObject.ParamFlags.READABLE,
|
||||||
|
false),
|
||||||
|
'orientation-lock-icon': GObject.ParamSpec.string('orientation-lock-icon',
|
||||||
|
'orientation-lock-icon',
|
||||||
|
'orientation-lock-icon',
|
||||||
|
GObject.ParamFlags.READWRITE,
|
||||||
|
null)
|
||||||
|
},
|
||||||
|
|
||||||
|
_init: function() {
|
||||||
|
this.parent();
|
||||||
|
|
||||||
|
this._canHavePowerOff = true;
|
||||||
|
this._canHaveSuspend = true;
|
||||||
|
|
||||||
|
this._actions = new Map();
|
||||||
|
this._actions.set(POWER_OFF_ACTION_ID,
|
||||||
|
{ // Translators: The name of the power-off action in search
|
||||||
|
name: C_("search-result", "Power off"),
|
||||||
|
iconName: 'system-shutdown-symbolic',
|
||||||
|
// Translators: A list of keywords that match the power-off action, separated by semicolons
|
||||||
|
keywords: _("power off;shutdown").split(';'),
|
||||||
|
available: false });
|
||||||
|
this._actions.set(LOCK_SCREEN_ACTION_ID,
|
||||||
|
{ // Translators: The name of the lock screen action in search
|
||||||
|
name: C_("search-result", "Lock screen"),
|
||||||
|
iconName: 'system-lock-screen-symbolic',
|
||||||
|
// Translators: A list of keywords that match the lock screen action, separated by semicolons
|
||||||
|
keywords: _("lock screen").split(';'),
|
||||||
|
available: false });
|
||||||
|
this._actions.set(LOGOUT_ACTION_ID,
|
||||||
|
{ // Translators: The name of the logout action in search
|
||||||
|
name: C_("search-result", "Log out"),
|
||||||
|
iconName: 'application-exit-symbolic',
|
||||||
|
// Translators: A list of keywords that match the logout action, separated by semicolons
|
||||||
|
keywords: _("logout;sign off").split(';'),
|
||||||
|
available: false });
|
||||||
|
this._actions.set(SUSPEND_ACTION_ID,
|
||||||
|
{ // Translators: The name of the suspend action in search
|
||||||
|
name: C_("search-result", "Suspend"),
|
||||||
|
iconName: 'media-playback-pause-symbolic',
|
||||||
|
// Translators: A list of keywords that match the suspend action, separated by semicolons
|
||||||
|
keywords: _("suspend;sleep").split(';'),
|
||||||
|
available: false });
|
||||||
|
this._actions.set(SWITCH_USER_ACTION_ID,
|
||||||
|
{ // Translators: The name of the switch user action in search
|
||||||
|
name: C_("search-result", "Switch user"),
|
||||||
|
iconName: 'system-switch-user-symbolic',
|
||||||
|
// Translators: A list of keywords that match the switch user action, separated by semicolons
|
||||||
|
keywords: _("switch user").split(';'),
|
||||||
|
available: false });
|
||||||
|
this._actions.set(LOCK_ORIENTATION_ACTION_ID,
|
||||||
|
{ // Translators: The name of the lock orientation action in search
|
||||||
|
name: C_("search-result", "Lock orientation"),
|
||||||
|
iconName: '',
|
||||||
|
// Translators: A list of keywords that match the lock orientation action, separated by semicolons
|
||||||
|
keywords: _("lock orientation").split(';'),
|
||||||
|
available: false });
|
||||||
|
|
||||||
|
this._loginScreenSettings = new Gio.Settings({ schema_id: LOGIN_SCREEN_SCHEMA });
|
||||||
|
this._lockdownSettings = new Gio.Settings({ schema_id: LOCKDOWN_SCHEMA });
|
||||||
|
this._orientationSettings = new Gio.Settings({ schema_id: 'org.gnome.settings-daemon.peripherals.touchscreen' });
|
||||||
|
|
||||||
|
this._session = new GnomeSession.SessionManager();
|
||||||
|
this._loginManager = LoginManager.getLoginManager();
|
||||||
|
this._monitorManager = Meta.MonitorManager.get();
|
||||||
|
|
||||||
|
this._userManager = AccountsService.UserManager.get_default();
|
||||||
|
|
||||||
|
this._userManager.connect('notify::is-loaded',
|
||||||
|
() => { this._updateMultiUser(); });
|
||||||
|
this._userManager.connect('notify::has-multiple-users',
|
||||||
|
() => { this._updateMultiUser(); });
|
||||||
|
this._userManager.connect('user-added',
|
||||||
|
() => { this._updateMultiUser(); });
|
||||||
|
this._userManager.connect('user-removed',
|
||||||
|
() => { this._updateMultiUser(); });
|
||||||
|
|
||||||
|
this._lockdownSettings.connect('changed::' + DISABLE_USER_SWITCH_KEY,
|
||||||
|
() => { this._updateSwitchUser(); });
|
||||||
|
this._lockdownSettings.connect('changed::' + DISABLE_LOG_OUT_KEY,
|
||||||
|
() => { this._updateLogout(); });
|
||||||
|
global.settings.connect('changed::' + ALWAYS_SHOW_LOG_OUT_KEY,
|
||||||
|
() => { this._updateLogout(); });
|
||||||
|
|
||||||
|
this._lockdownSettings.connect('changed::' + DISABLE_LOCK_SCREEN_KEY,
|
||||||
|
() => { this._updateLockScreen(); });
|
||||||
|
|
||||||
|
this._lockdownSettings.connect('changed::' + DISABLE_LOG_OUT_KEY,
|
||||||
|
() => { this._updateHaveShutdown(); });
|
||||||
|
|
||||||
|
this.forceUpdate();
|
||||||
|
|
||||||
|
this._orientationSettings.connect('changed::orientation-lock',
|
||||||
|
() => { this._updateOrientationLock();
|
||||||
|
this._updateOrientationLockIcon(); });
|
||||||
|
Main.layoutManager.connect('monitors-changed',
|
||||||
|
() => { this._updateOrientationLock(); });
|
||||||
|
Gio.DBus.system.watch_name(SENSOR_BUS_NAME,
|
||||||
|
Gio.BusNameWatcherFlags.NONE,
|
||||||
|
() => { this._sensorProxyAppeared(); },
|
||||||
|
() => {
|
||||||
|
this._sensorProxy = null;
|
||||||
|
this._updateOrientationLock();
|
||||||
|
});
|
||||||
|
this._updateOrientationLock();
|
||||||
|
this._updateOrientationLockIcon();
|
||||||
|
|
||||||
|
Main.sessionMode.connect('updated', () => { this._sessionUpdated(); });
|
||||||
|
this._sessionUpdated();
|
||||||
|
},
|
||||||
|
|
||||||
|
get can_power_off() {
|
||||||
|
return this._actions.get(POWER_OFF_ACTION_ID).available;
|
||||||
|
},
|
||||||
|
|
||||||
|
get can_suspend() {
|
||||||
|
return this._actions.get(SUSPEND_ACTION_ID).available;
|
||||||
|
},
|
||||||
|
|
||||||
|
get can_lock_screen() {
|
||||||
|
return this._actions.get(LOCK_SCREEN_ACTION_ID).available;
|
||||||
|
},
|
||||||
|
|
||||||
|
get can_switch_user() {
|
||||||
|
return this._actions.get(SWITCH_USER_ACTION_ID).available;
|
||||||
|
},
|
||||||
|
|
||||||
|
get can_logout() {
|
||||||
|
return this._actions.get(LOGOUT_ACTION_ID).available;
|
||||||
|
},
|
||||||
|
|
||||||
|
get can_lock_orientation() {
|
||||||
|
return this._actions.get(LOCK_ORIENTATION_ACTION_ID).available;
|
||||||
|
},
|
||||||
|
|
||||||
|
get orientation_lock_icon() {
|
||||||
|
return this._actions.get(LOCK_ORIENTATION_ACTION_ID).iconName;
|
||||||
|
},
|
||||||
|
|
||||||
|
_sensorProxyAppeared: function() {
|
||||||
|
this._sensorProxy = new SensorProxy(Gio.DBus.system, SENSOR_BUS_NAME, SENSOR_OBJECT_PATH,
|
||||||
|
(proxy, error) => {
|
||||||
|
if (error) {
|
||||||
|
log(error.message);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this._sensorProxy.connect('g-properties-changed',
|
||||||
|
() => { this._updateOrientationLock(); });
|
||||||
|
this._updateOrientationLock();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
_updateOrientationLock: function() {
|
||||||
|
let available = false;
|
||||||
|
if (this._sensorProxy)
|
||||||
|
available = this._sensorProxy.HasAccelerometer &&
|
||||||
|
this._monitorManager.get_is_builtin_display_on();
|
||||||
|
|
||||||
|
this._actions.get(LOCK_ORIENTATION_ACTION_ID).available = available;
|
||||||
|
|
||||||
|
this.notify('can-lock-orientation');
|
||||||
|
},
|
||||||
|
|
||||||
|
_updateOrientationLockIcon: function() {
|
||||||
|
let locked = this._orientationSettings.get_boolean('orientation-lock');
|
||||||
|
let iconName = locked ? 'rotation-locked-symbolic'
|
||||||
|
: 'rotation-allowed-symbolic';
|
||||||
|
this._actions.get(LOCK_ORIENTATION_ACTION_ID).iconName = iconName;
|
||||||
|
|
||||||
|
this.notify('orientation-lock-icon');
|
||||||
|
},
|
||||||
|
|
||||||
|
_sessionUpdated: function() {
|
||||||
|
this._updateLockScreen();
|
||||||
|
this._updatePowerOff();
|
||||||
|
this._updateSuspend();
|
||||||
|
this._updateMultiUser();
|
||||||
|
},
|
||||||
|
|
||||||
|
forceUpdate: function() {
|
||||||
|
// Whether those actions are available or not depends on both lockdown
|
||||||
|
// settings and Polkit policy - we don't get change notifications for the
|
||||||
|
// latter, so their value may be outdated; force an update now
|
||||||
|
this._updateHaveShutdown();
|
||||||
|
this._updateHaveSuspend();
|
||||||
|
},
|
||||||
|
|
||||||
|
getMatchingActions: function(terms) {
|
||||||
|
// terms is a list of strings
|
||||||
|
terms = terms.map((term) => { return term.toLowerCase(); });
|
||||||
|
|
||||||
|
let results = [];
|
||||||
|
|
||||||
|
for (let [key, {available, keywords}] of this._actions)
|
||||||
|
if (available && terms.every(t => keywords.some(k => (k.indexOf(t) >= 0))))
|
||||||
|
results.push(key);
|
||||||
|
|
||||||
|
return results;
|
||||||
|
},
|
||||||
|
|
||||||
|
getName: function(id) {
|
||||||
|
return this._actions.get(id).name;
|
||||||
|
},
|
||||||
|
|
||||||
|
getIconName: function(id) {
|
||||||
|
return this._actions.get(id).iconName;
|
||||||
|
},
|
||||||
|
|
||||||
|
activateAction: function(id) {
|
||||||
|
switch (id) {
|
||||||
|
case POWER_OFF_ACTION_ID:
|
||||||
|
this.activatePowerOff();
|
||||||
|
break;
|
||||||
|
case LOCK_SCREEN_ACTION_ID:
|
||||||
|
this.activateLockScreen();
|
||||||
|
break;
|
||||||
|
case LOGOUT_ACTION_ID:
|
||||||
|
this.activateLogout();
|
||||||
|
break;
|
||||||
|
case SUSPEND_ACTION_ID:
|
||||||
|
this.activateSuspend();
|
||||||
|
break;
|
||||||
|
case SWITCH_USER_ACTION_ID:
|
||||||
|
this.activateSwitchUser();
|
||||||
|
break;
|
||||||
|
case LOCK_ORIENTATION_ACTION_ID:
|
||||||
|
this.activateLockOrientation();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_updateLockScreen() {
|
||||||
|
let showLock = !Main.sessionMode.isLocked && !Main.sessionMode.isGreeter;
|
||||||
|
let allowLockScreen = !this._lockdownSettings.get_boolean(DISABLE_LOCK_SCREEN_KEY);
|
||||||
|
this._actions.get(LOCK_SCREEN_ACTION_ID).available = showLock && allowLockScreen && LoginManager.canLock();
|
||||||
|
this.notify('can-lock-screen');
|
||||||
|
},
|
||||||
|
|
||||||
|
_updateHaveShutdown: function() {
|
||||||
|
this._session.CanShutdownRemote((result, error) => {
|
||||||
|
if (error)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this._canHavePowerOff = result[0];
|
||||||
|
this._updatePowerOff();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
_updatePowerOff: function() {
|
||||||
|
let disabled = Main.sessionMode.isLocked ||
|
||||||
|
(Main.sessionMode.isGreeter &&
|
||||||
|
this._loginScreenSettings.get_boolean(DISABLE_RESTART_KEY));
|
||||||
|
this._actions.get(POWER_OFF_ACTION_ID).available = this._canHavePowerOff && !disabled;
|
||||||
|
this.notify('can-power-off');
|
||||||
|
},
|
||||||
|
|
||||||
|
_updateHaveSuspend: function() {
|
||||||
|
this._loginManager.canSuspend(
|
||||||
|
(canSuspend, needsAuth) => {
|
||||||
|
this._canHaveSuspend = canSuspend;
|
||||||
|
this._suspendNeedsAuth = needsAuth;
|
||||||
|
this._updateSuspend();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
_updateSuspend: function() {
|
||||||
|
let disabled = (Main.sessionMode.isLocked &&
|
||||||
|
this._suspendNeedsAuth) ||
|
||||||
|
(Main.sessionMode.isGreeter &&
|
||||||
|
this._loginScreenSettings.get_boolean(DISABLE_RESTART_KEY));
|
||||||
|
this._actions.get(SUSPEND_ACTION_ID).available = this._canHaveSuspend && !disabled;
|
||||||
|
this.notify('can-suspend');
|
||||||
|
},
|
||||||
|
|
||||||
|
_updateMultiUser: function() {
|
||||||
|
this._updateLogout();
|
||||||
|
this._updateSwitchUser();
|
||||||
|
},
|
||||||
|
|
||||||
|
_updateSwitchUser: function() {
|
||||||
|
let allowSwitch = !this._lockdownSettings.get_boolean(DISABLE_USER_SWITCH_KEY);
|
||||||
|
let multiUser = this._userManager.can_switch() && this._userManager.has_multiple_users;
|
||||||
|
let shouldShowInMode = !Main.sessionMode.isLocked && !Main.sessionMode.isGreeter;
|
||||||
|
|
||||||
|
let visible = allowSwitch && multiUser && shouldShowInMode;
|
||||||
|
this._actions.get(SWITCH_USER_ACTION_ID).available = visible;
|
||||||
|
this.notify('can-switch-user');
|
||||||
|
|
||||||
|
return visible;
|
||||||
|
},
|
||||||
|
|
||||||
|
_updateLogout: function() {
|
||||||
|
let user = this._userManager.get_user(GLib.get_user_name());
|
||||||
|
|
||||||
|
let allowLogout = !this._lockdownSettings.get_boolean(DISABLE_LOG_OUT_KEY);
|
||||||
|
let alwaysShow = global.settings.get_boolean(ALWAYS_SHOW_LOG_OUT_KEY);
|
||||||
|
let systemAccount = user.system_account;
|
||||||
|
let localAccount = user.local_account;
|
||||||
|
let multiUser = this._userManager.has_multiple_users;
|
||||||
|
let multiSession = Gdm.get_session_ids().length > 1;
|
||||||
|
let shouldShowInMode = !Main.sessionMode.isLocked && !Main.sessionMode.isGreeter;
|
||||||
|
|
||||||
|
let visible = allowLogout && (alwaysShow || multiUser || multiSession || systemAccount || !localAccount) && shouldShowInMode;
|
||||||
|
this._actions.get(LOGOUT_ACTION_ID).available = visible;
|
||||||
|
this.notify('can-logout');
|
||||||
|
|
||||||
|
return visible;
|
||||||
|
},
|
||||||
|
|
||||||
|
activateLockOrientation: function() {
|
||||||
|
if (!this._actions.get(LOCK_ORIENTATION_ACTION_ID).available)
|
||||||
|
throw new Error('The lock-orientation action is not available!');
|
||||||
|
|
||||||
|
let locked = this._orientationSettings.get_boolean('orientation-lock');
|
||||||
|
this._orientationSettings.set_boolean('orientation-lock', !locked);
|
||||||
|
},
|
||||||
|
|
||||||
|
activateLockScreen: function() {
|
||||||
|
if (!this._actions.get(LOCK_SCREEN_ACTION_ID).available)
|
||||||
|
throw new Error('The lock-screen action is not available!');
|
||||||
|
|
||||||
|
Main.screenShield.lock(true);
|
||||||
|
},
|
||||||
|
|
||||||
|
activateSwitchUser: function() {
|
||||||
|
if (!this._actions.get(SWITCH_USER_ACTION_ID).available)
|
||||||
|
throw new Error('The switch-user action is not available!');
|
||||||
|
|
||||||
|
if (Main.screenShield)
|
||||||
|
Main.screenShield.lock(false);
|
||||||
|
|
||||||
|
Clutter.threads_add_repaint_func_full(Clutter.RepaintFlags.POST_PAINT, function() {
|
||||||
|
Gdm.goto_login_session_sync(null);
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
activateLogout: function() {
|
||||||
|
if (!this._actions.get(LOGOUT_ACTION_ID).available)
|
||||||
|
throw new Error('The logout action is not available!');
|
||||||
|
|
||||||
|
Main.overview.hide();
|
||||||
|
this._session.LogoutRemote(0);
|
||||||
|
},
|
||||||
|
|
||||||
|
activatePowerOff: function() {
|
||||||
|
if (!this._actions.get(POWER_OFF_ACTION_ID).available)
|
||||||
|
throw new Error('The power-off action is not available!');
|
||||||
|
|
||||||
|
this._session.ShutdownRemote(0);
|
||||||
|
},
|
||||||
|
|
||||||
|
activateSuspend: function() {
|
||||||
|
if (!this._actions.get(SUSPEND_ACTION_ID).available)
|
||||||
|
throw new Error('The suspend action is not available!');
|
||||||
|
|
||||||
|
this._loginManager.suspend();
|
||||||
|
}
|
||||||
|
});
|
141
js/misc/util.js
@ -1,9 +1,12 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
|
||||||
const Clutter = imports.gi.Clutter;
|
const Clutter = imports.gi.Clutter;
|
||||||
|
const Gettext = imports.gettext;
|
||||||
const Gio = imports.gi.Gio;
|
const Gio = imports.gi.Gio;
|
||||||
const GLib = imports.gi.GLib;
|
const GLib = imports.gi.GLib;
|
||||||
const Lang = imports.lang;
|
const Lang = imports.lang;
|
||||||
|
const Mainloop = imports.mainloop;
|
||||||
|
const Signals = imports.signals;
|
||||||
const Shell = imports.gi.Shell;
|
const Shell = imports.gi.Shell;
|
||||||
const St = imports.gi.St;
|
const St = imports.gi.St;
|
||||||
|
|
||||||
@ -11,7 +14,7 @@ const Main = imports.ui.main;
|
|||||||
const Tweener = imports.ui.tweener;
|
const Tweener = imports.ui.tweener;
|
||||||
const Params = imports.misc.params;
|
const Params = imports.misc.params;
|
||||||
|
|
||||||
const SCROLL_TIME = 0.1;
|
var SCROLL_TIME = 0.1;
|
||||||
|
|
||||||
// http://daringfireball.net/2010/07/improved_regex_for_matching_urls
|
// http://daringfireball.net/2010/07/improved_regex_for_matching_urls
|
||||||
const _balancedParens = '\\((?:[^\\s()<>]+|(?:\\(?:[^\\s()<>]+\\)))*\\)';
|
const _balancedParens = '\\((?:[^\\s()<>]+|(?:\\(?:[^\\s()<>]+\\)))*\\)';
|
||||||
@ -161,6 +164,41 @@ function _handleSpawnError(command, err) {
|
|||||||
Main.notifyError(title, err.message);
|
Main.notifyError(title, err.message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function formatTimeSpan(date) {
|
||||||
|
let now = GLib.DateTime.new_now_local();
|
||||||
|
|
||||||
|
let timespan = now.difference(date);
|
||||||
|
|
||||||
|
let minutesAgo = timespan / GLib.TIME_SPAN_MINUTE;
|
||||||
|
let hoursAgo = timespan / GLib.TIME_SPAN_HOUR;
|
||||||
|
let daysAgo = timespan / GLib.TIME_SPAN_DAY;
|
||||||
|
let weeksAgo = daysAgo / 7;
|
||||||
|
let monthsAgo = daysAgo / 30;
|
||||||
|
let yearsAgo = weeksAgo / 52;
|
||||||
|
|
||||||
|
if (minutesAgo < 5)
|
||||||
|
return _("Just now");
|
||||||
|
if (hoursAgo < 1)
|
||||||
|
return Gettext.ngettext("%d minute ago",
|
||||||
|
"%d minutes ago", minutesAgo).format(minutesAgo);
|
||||||
|
if (daysAgo < 1)
|
||||||
|
return Gettext.ngettext("%d hour ago",
|
||||||
|
"%d hours ago", hoursAgo).format(hoursAgo);
|
||||||
|
if (daysAgo < 2)
|
||||||
|
return _("Yesterday");
|
||||||
|
if (daysAgo < 15)
|
||||||
|
return Gettext.ngettext("%d day ago",
|
||||||
|
"%d days ago", daysAgo).format(daysAgo);
|
||||||
|
if (weeksAgo < 8)
|
||||||
|
return Gettext.ngettext("%d week ago",
|
||||||
|
"%d weeks ago", weeksAgo).format(weeksAgo);
|
||||||
|
if (yearsAgo < 1)
|
||||||
|
return Gettext.ngettext("%d month ago",
|
||||||
|
"%d months ago", monthsAgo).format(monthsAgo);
|
||||||
|
return Gettext.ngettext("%d year ago",
|
||||||
|
"%d years ago", yearsAgo).format(yearsAgo);
|
||||||
|
}
|
||||||
|
|
||||||
function formatTime(time, params) {
|
function formatTime(time, params) {
|
||||||
let date;
|
let date;
|
||||||
// HACK: The built-in Date type sucks at timezones, which we need for the
|
// HACK: The built-in Date type sucks at timezones, which we need for the
|
||||||
@ -180,11 +218,10 @@ function formatTime(time, params) {
|
|||||||
if (_desktopSettings == null)
|
if (_desktopSettings == null)
|
||||||
_desktopSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.interface' });
|
_desktopSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.interface' });
|
||||||
let clockFormat = _desktopSettings.get_string('clock-format');
|
let clockFormat = _desktopSettings.get_string('clock-format');
|
||||||
let hasAmPm = date.format('%p') != '';
|
|
||||||
|
|
||||||
params = Params.parse(params, { timeOnly: false });
|
params = Params.parse(params, { timeOnly: false });
|
||||||
|
|
||||||
if (clockFormat == '24h' || !hasAmPm) {
|
if (clockFormat == '24h') {
|
||||||
// Show only the time if date is on today
|
// Show only the time if date is on today
|
||||||
if (daysAgo < 1 || params.timeOnly)
|
if (daysAgo < 1 || params.timeOnly)
|
||||||
/* Translators: Time in 24h format */
|
/* Translators: Time in 24h format */
|
||||||
@ -243,7 +280,10 @@ function formatTime(time, params) {
|
|||||||
// xgettext:no-c-format
|
// xgettext:no-c-format
|
||||||
format = N_("%B %d %Y, %l\u2236%M %p");
|
format = N_("%B %d %Y, %l\u2236%M %p");
|
||||||
}
|
}
|
||||||
return date.format(Shell.util_translate_time_string(format));
|
|
||||||
|
let formattedTime = date.format(Shell.util_translate_time_string(format));
|
||||||
|
// prepend LTR-mark to colon/ratio to force a text direction on times
|
||||||
|
return formattedTime.replace(/([:\u2236])/g, '\u200e$1');
|
||||||
}
|
}
|
||||||
|
|
||||||
function createTimeLabel(date, params) {
|
function createTimeLabel(date, params) {
|
||||||
@ -310,7 +350,7 @@ function insertSorted(array, val, cmp) {
|
|||||||
return pos;
|
return pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
const CloseButton = new Lang.Class({
|
var CloseButton = new Lang.Class({
|
||||||
Name: 'CloseButton',
|
Name: 'CloseButton',
|
||||||
Extends: St.Button,
|
Extends: St.Button,
|
||||||
|
|
||||||
@ -398,3 +438,94 @@ function ensureActorVisibleInScrollView(scrollView, actor) {
|
|||||||
time: SCROLL_TIME,
|
time: SCROLL_TIME,
|
||||||
transition: 'easeOutQuad' });
|
transition: 'easeOutQuad' });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var AppSettingsMonitor = new Lang.Class({
|
||||||
|
Name: 'AppSettingsMonitor',
|
||||||
|
|
||||||
|
_init: function(appId, schemaId) {
|
||||||
|
this._appId = appId;
|
||||||
|
this._schemaId = schemaId;
|
||||||
|
|
||||||
|
this._app = null;
|
||||||
|
this._settings = null;
|
||||||
|
this._handlers = [];
|
||||||
|
|
||||||
|
this._schemaSource = Gio.SettingsSchemaSource.get_default();
|
||||||
|
|
||||||
|
this._appSystem = Shell.AppSystem.get_default();
|
||||||
|
this._appSystem.connect('installed-changed',
|
||||||
|
Lang.bind(this, this._onInstalledChanged));
|
||||||
|
this._onInstalledChanged();
|
||||||
|
},
|
||||||
|
|
||||||
|
get available() {
|
||||||
|
return this._app != null && this._settings != null;
|
||||||
|
},
|
||||||
|
|
||||||
|
activateApp: function() {
|
||||||
|
if (this._app)
|
||||||
|
this._app.activate();
|
||||||
|
},
|
||||||
|
|
||||||
|
watchSetting: function(key, callback) {
|
||||||
|
let handler = { id: 0, key: key, callback: callback };
|
||||||
|
this._handlers.push(handler);
|
||||||
|
|
||||||
|
this._connectHandler(handler);
|
||||||
|
},
|
||||||
|
|
||||||
|
_connectHandler: function(handler) {
|
||||||
|
if (!this._settings || handler.id > 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
handler.id = this._settings.connect('changed::' + handler.key,
|
||||||
|
handler.callback);
|
||||||
|
handler.callback(this._settings, handler.key);
|
||||||
|
},
|
||||||
|
|
||||||
|
_disconnectHandler: function(handler) {
|
||||||
|
if (this._settings && handler.id > 0)
|
||||||
|
this._settings.disconnect(handler.id);
|
||||||
|
handler.id = 0;
|
||||||
|
},
|
||||||
|
|
||||||
|
_onInstalledChanged: function() {
|
||||||
|
let hadApp = (this._app != null);
|
||||||
|
this._app = this._appSystem.lookup_app(this._appId);
|
||||||
|
let haveApp = (this._app != null);
|
||||||
|
|
||||||
|
if (hadApp == haveApp)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (haveApp)
|
||||||
|
this._checkSettings();
|
||||||
|
else
|
||||||
|
this._setSettings(null);
|
||||||
|
},
|
||||||
|
|
||||||
|
_setSettings: function(settings) {
|
||||||
|
this._handlers.forEach((handler) => { this._disconnectHandler(handler); });
|
||||||
|
|
||||||
|
let hadSettings = (this._settings != null);
|
||||||
|
this._settings = settings;
|
||||||
|
let haveSettings = (this._settings != null);
|
||||||
|
|
||||||
|
this._handlers.forEach((handler) => { this._connectHandler(handler); });
|
||||||
|
|
||||||
|
if (hadSettings != haveSettings)
|
||||||
|
this.emit('available-changed');
|
||||||
|
},
|
||||||
|
|
||||||
|
_checkSettings: function() {
|
||||||
|
let schema = this._schemaSource.lookup(this._schemaId, true);
|
||||||
|
if (schema) {
|
||||||
|
this._setSettings(new Gio.Settings({ settings_schema: schema }));
|
||||||
|
} else if (this._app) {
|
||||||
|
Mainloop.timeout_add_seconds(1, () => {
|
||||||
|
this._checkSettings();
|
||||||
|
return GLib.SOURCE_REMOVE;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
Signals.addSignalMethods(AppSettingsMonitor.prototype);
|
||||||
|
247
js/misc/weather.js
Normal file
@ -0,0 +1,247 @@
|
|||||||
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
|
||||||
|
const Geoclue = imports.gi.Geoclue;
|
||||||
|
const Gio = imports.gi.Gio;
|
||||||
|
const GLib = imports.gi.GLib;
|
||||||
|
const GWeather = imports.gi.GWeather;
|
||||||
|
const Lang = imports.lang;
|
||||||
|
const Signals = imports.signals;
|
||||||
|
|
||||||
|
const PermissionStore = imports.misc.permissionStore;
|
||||||
|
const Util = imports.misc.util;
|
||||||
|
|
||||||
|
// Minimum time between updates to show loading indication
|
||||||
|
var UPDATE_THRESHOLD = 10 * GLib.TIME_SPAN_MINUTE;
|
||||||
|
|
||||||
|
var WeatherClient = new Lang.Class({
|
||||||
|
Name: 'WeatherClient',
|
||||||
|
|
||||||
|
_init: function() {
|
||||||
|
this._loading = false;
|
||||||
|
this._locationValid = false;
|
||||||
|
this._lastUpdate = GLib.DateTime.new_from_unix_local(0);
|
||||||
|
|
||||||
|
this._autoLocationRequested = false;
|
||||||
|
this._mostRecentLocation = null;
|
||||||
|
|
||||||
|
this._gclueService = null;
|
||||||
|
this._gclueStarted = false;
|
||||||
|
this._gclueStarting = false;
|
||||||
|
this._gclueLocationChangedId = 0;
|
||||||
|
|
||||||
|
this._weatherAuthorized = false;
|
||||||
|
this._permStore = new PermissionStore.PermissionStore((proxy, error) => {
|
||||||
|
if (error) {
|
||||||
|
log('Failed to connect to permissionStore: ' + error.message);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this._permStore.LookupRemote('gnome', 'geolocation', (res, error) => {
|
||||||
|
if (error)
|
||||||
|
log('Error looking up permission: ' + error.message);
|
||||||
|
|
||||||
|
let [perms, data] = error ? [{}, null] : res;
|
||||||
|
let params = ['gnome', 'geolocation', false, data, perms];
|
||||||
|
this._onPermStoreChanged(this._permStore, '', params);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
this._permStore.connectSignal('Changed',
|
||||||
|
Lang.bind(this, this._onPermStoreChanged));
|
||||||
|
|
||||||
|
this._locationSettings = new Gio.Settings({ schema_id: 'org.gnome.system.location' });
|
||||||
|
this._locationSettings.connect('changed::enabled',
|
||||||
|
Lang.bind(this, this._updateAutoLocation));
|
||||||
|
|
||||||
|
this._world = GWeather.Location.get_world();
|
||||||
|
|
||||||
|
this._providers = GWeather.Provider.METAR |
|
||||||
|
GWeather.Provider.YR_NO |
|
||||||
|
GWeather.Provider.OWM;
|
||||||
|
|
||||||
|
this._weatherInfo = new GWeather.Info({ enabled_providers: 0 });
|
||||||
|
this._weatherInfo.connect_after('updated', () => {
|
||||||
|
this._lastUpdate = GLib.DateTime.new_now_local();
|
||||||
|
this.emit('changed');
|
||||||
|
});
|
||||||
|
|
||||||
|
this._weatherAppMon = new Util.AppSettingsMonitor('org.gnome.Weather.Application.desktop',
|
||||||
|
'org.gnome.Weather.Application');
|
||||||
|
this._weatherAppMon.connect('available-changed', () => { this.emit('changed'); });
|
||||||
|
this._weatherAppMon.watchSetting('automatic-location',
|
||||||
|
Lang.bind(this, this._onAutomaticLocationChanged));
|
||||||
|
this._weatherAppMon.watchSetting('locations',
|
||||||
|
Lang.bind(this, this._onLocationsChanged));
|
||||||
|
},
|
||||||
|
|
||||||
|
get available() {
|
||||||
|
return this._weatherAppMon.available;
|
||||||
|
},
|
||||||
|
|
||||||
|
get loading() {
|
||||||
|
return this._loading;
|
||||||
|
},
|
||||||
|
|
||||||
|
get hasLocation() {
|
||||||
|
return this._locationValid;
|
||||||
|
},
|
||||||
|
|
||||||
|
get info() {
|
||||||
|
return this._weatherInfo;
|
||||||
|
},
|
||||||
|
|
||||||
|
activateApp: function() {
|
||||||
|
this._weatherAppMon.activateApp();
|
||||||
|
},
|
||||||
|
|
||||||
|
update: function() {
|
||||||
|
if (!this._locationValid)
|
||||||
|
return;
|
||||||
|
|
||||||
|
let now = GLib.DateTime.new_now_local();
|
||||||
|
// Update without loading indication if the current info is recent enough
|
||||||
|
if (this._weatherInfo.is_valid() &&
|
||||||
|
now.difference(this._lastUpdate) < UPDATE_THRESHOLD)
|
||||||
|
this._weatherInfo.update();
|
||||||
|
else
|
||||||
|
this._loadInfo();
|
||||||
|
},
|
||||||
|
|
||||||
|
get _useAutoLocation() {
|
||||||
|
return this._autoLocationRequested &&
|
||||||
|
this._locationSettings.get_boolean('enabled') &&
|
||||||
|
this._weatherAuthorized;
|
||||||
|
},
|
||||||
|
|
||||||
|
_loadInfo: function() {
|
||||||
|
let id = this._weatherInfo.connect('updated', () => {
|
||||||
|
this._weatherInfo.disconnect(id);
|
||||||
|
this._loading = false;
|
||||||
|
});
|
||||||
|
|
||||||
|
this._loading = true;
|
||||||
|
this.emit('changed');
|
||||||
|
|
||||||
|
this._weatherInfo.update();
|
||||||
|
},
|
||||||
|
|
||||||
|
_locationsEqual: function(loc1, loc2) {
|
||||||
|
if (loc1 == loc2)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (loc1 == null || loc2 == null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return loc1.equal(loc2);
|
||||||
|
},
|
||||||
|
|
||||||
|
_setLocation: function(location) {
|
||||||
|
if (this._locationsEqual(this._weatherInfo.location, location))
|
||||||
|
return;
|
||||||
|
|
||||||
|
this._weatherInfo.abort();
|
||||||
|
this._weatherInfo.set_location(location);
|
||||||
|
this._locationValid = (location != null);
|
||||||
|
|
||||||
|
this._weatherInfo.set_enabled_providers(location ? this._providers : 0);
|
||||||
|
|
||||||
|
if (location)
|
||||||
|
this._loadInfo();
|
||||||
|
else
|
||||||
|
this.emit('changed');
|
||||||
|
},
|
||||||
|
|
||||||
|
_updateLocationMonitoring: function() {
|
||||||
|
if (this._useAutoLocation) {
|
||||||
|
if (this._gclueLocationChangedId != 0 || this._gclueService == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this._gclueLocationChangedId =
|
||||||
|
this._gclueService.connect('notify::location',
|
||||||
|
Lang.bind(this, this._onGClueLocationChanged));
|
||||||
|
this._onGClueLocationChanged();
|
||||||
|
} else {
|
||||||
|
if (this._gclueLocationChangedId)
|
||||||
|
this._gclueService.disconnect(this._gclueLocationChangedId);
|
||||||
|
this._gclueLocationChangedId = 0;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_startGClueService: function() {
|
||||||
|
if (this._gclueStarting)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this._gclueStarting = true;
|
||||||
|
|
||||||
|
Geoclue.Simple.new('org.gnome.Shell', Geoclue.AccuracyLevel.CITY, null,
|
||||||
|
(o, res) => {
|
||||||
|
try {
|
||||||
|
this._gclueService = Geoclue.Simple.new_finish(res);
|
||||||
|
} catch(e) {
|
||||||
|
log('Failed to connect to Geoclue2 service: ' + e.message);
|
||||||
|
this._setLocation(this._mostRecentLocation);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this._gclueStarted = true;
|
||||||
|
this._gclueService.get_client().distance_threshold = 100;
|
||||||
|
this._updateLocationMonitoring();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
_onGClueLocationChanged: function() {
|
||||||
|
let geoLocation = this._gclueService.location;
|
||||||
|
let location = GWeather.Location.new_detached(geoLocation.description,
|
||||||
|
null,
|
||||||
|
geoLocation.latitude,
|
||||||
|
geoLocation.longitude);
|
||||||
|
this._setLocation(location);
|
||||||
|
},
|
||||||
|
|
||||||
|
_onAutomaticLocationChanged: function(settings, key) {
|
||||||
|
let useAutoLocation = settings.get_boolean(key);
|
||||||
|
if (this._autoLocationRequested == useAutoLocation)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this._autoLocationRequested = useAutoLocation;
|
||||||
|
|
||||||
|
this._updateAutoLocation();
|
||||||
|
},
|
||||||
|
|
||||||
|
_updateAutoLocation: function() {
|
||||||
|
this._updateLocationMonitoring();
|
||||||
|
|
||||||
|
if (this._useAutoLocation)
|
||||||
|
this._startGClueService();
|
||||||
|
else
|
||||||
|
this._setLocation(this._mostRecentLocation);
|
||||||
|
},
|
||||||
|
|
||||||
|
_onLocationsChanged: function(settings, key) {
|
||||||
|
let serialized = settings.get_value(key).deep_unpack().shift();
|
||||||
|
let mostRecentLocation = null;
|
||||||
|
|
||||||
|
if (serialized)
|
||||||
|
mostRecentLocation = this._world.deserialize(serialized);
|
||||||
|
|
||||||
|
if (this._locationsEqual(this._mostRecentLocation, mostRecentLocation))
|
||||||
|
return;
|
||||||
|
|
||||||
|
this._mostRecentLocation = mostRecentLocation;
|
||||||
|
|
||||||
|
if (!this._useAutoLocation || !this._gclueStarted)
|
||||||
|
this._setLocation(this._mostRecentLocation);
|
||||||
|
},
|
||||||
|
|
||||||
|
_onPermStoreChanged: function(proxy, sender, params) {
|
||||||
|
let [table, id, deleted, data, perms] = params;
|
||||||
|
|
||||||
|
if (table != 'gnome' || id != 'geolocation')
|
||||||
|
return;
|
||||||
|
|
||||||
|
let permission = perms['org.gnome.Weather.Application'] || ['NONE'];
|
||||||
|
let [accuracy] = permission;
|
||||||
|
this._weatherAuthorized = accuracy != 'NONE';
|
||||||
|
|
||||||
|
this._updateAutoLocation();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
Signals.addSignalMethods(WeatherClient.prototype);
|
@ -19,7 +19,15 @@ const PortalHelperResult = {
|
|||||||
RECHECK: 2
|
RECHECK: 2
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const PortalHelperSecurityLevel = {
|
||||||
|
NOT_YET_DETERMINED: 0,
|
||||||
|
SECURE: 1,
|
||||||
|
INSECURE: 2
|
||||||
|
};
|
||||||
|
|
||||||
const INACTIVITY_TIMEOUT = 30000; //ms
|
const INACTIVITY_TIMEOUT = 30000; //ms
|
||||||
|
const CONNECTIVITY_CHECK_HOST = 'nmcheck.gnome.org';
|
||||||
|
const CONNECTIVITY_CHECK_URI = 'http://' + CONNECTIVITY_CHECK_HOST;
|
||||||
const CONNECTIVITY_RECHECK_RATELIMIT_TIMEOUT = 30 * GLib.USEC_PER_SEC;
|
const CONNECTIVITY_RECHECK_RATELIMIT_TIMEOUT = 30 * GLib.USEC_PER_SEC;
|
||||||
|
|
||||||
const HelperDBusInterface = '<node> \
|
const HelperDBusInterface = '<node> \
|
||||||
@ -42,15 +50,86 @@ const HelperDBusInterface = '<node> \
|
|||||||
</interface> \
|
</interface> \
|
||||||
</node>';
|
</node>';
|
||||||
|
|
||||||
const PortalWindow = new Lang.Class({
|
var PortalHeaderBar = new Lang.Class({
|
||||||
|
Name: 'PortalHeaderBar',
|
||||||
|
Extends: Gtk.HeaderBar,
|
||||||
|
|
||||||
|
_init: function() {
|
||||||
|
this.parent({ show_close_button: true });
|
||||||
|
|
||||||
|
// See ephy-title-box.c in epiphany for the layout
|
||||||
|
let vbox = new Gtk.Box({ orientation: Gtk.Orientation.VERTICAL,
|
||||||
|
spacing: 0 });
|
||||||
|
this.set_custom_title(vbox);
|
||||||
|
|
||||||
|
/* TRANSLATORS: this is the title of the wifi captive portal login window */
|
||||||
|
let titleLabel = new Gtk.Label({ label: _("Hotspot Login"),
|
||||||
|
wrap: false,
|
||||||
|
single_line_mode: true,
|
||||||
|
ellipsize: Pango.EllipsizeMode.END });
|
||||||
|
titleLabel.get_style_context().add_class('title');
|
||||||
|
vbox.add(titleLabel);
|
||||||
|
|
||||||
|
let hbox = new Gtk.Box({ orientation: Gtk.Orientation.HORIZONTAL,
|
||||||
|
spacing: 4,
|
||||||
|
halign: Gtk.Align.CENTER,
|
||||||
|
valign: Gtk.Align.BASELINE });
|
||||||
|
hbox.get_style_context().add_class('subtitle');
|
||||||
|
vbox.add(hbox);
|
||||||
|
|
||||||
|
this._lockImage = new Gtk.Image({ icon_size: Gtk.IconSize.MENU,
|
||||||
|
valign: Gtk.Align.BASELINE });
|
||||||
|
hbox.add(this._lockImage);
|
||||||
|
|
||||||
|
this.subtitleLabel = new Gtk.Label({ wrap: false,
|
||||||
|
single_line_mode: true,
|
||||||
|
ellipsize: Pango.EllipsizeMode.END,
|
||||||
|
valign: Gtk.Align.BASELINE,
|
||||||
|
selectable: true});
|
||||||
|
this.subtitleLabel.get_style_context().add_class('subtitle');
|
||||||
|
hbox.add(this.subtitleLabel);
|
||||||
|
|
||||||
|
vbox.show_all();
|
||||||
|
},
|
||||||
|
|
||||||
|
setSubtitle: function(label) {
|
||||||
|
this.subtitleLabel.set_text(label);
|
||||||
|
},
|
||||||
|
|
||||||
|
setSecurityIcon: function(securityLevel) {
|
||||||
|
switch (securityLevel) {
|
||||||
|
case PortalHelperSecurityLevel.NOT_YET_DETERMINED:
|
||||||
|
this._lockImage.hide();
|
||||||
|
break;
|
||||||
|
case PortalHelperSecurityLevel.SECURE:
|
||||||
|
this._lockImage.show();
|
||||||
|
this._lockImage.set_from_icon_name("channel-secure-symbolic", Gtk.IconSize.MENU);
|
||||||
|
this._lockImage.set_tooltip_text(null);
|
||||||
|
break;
|
||||||
|
case PortalHelperSecurityLevel.INSECURE:
|
||||||
|
this._lockImage.show();
|
||||||
|
this._lockImage.set_from_icon_name("channel-insecure-symbolic", Gtk.IconSize.MENU);
|
||||||
|
this._lockImage.set_tooltip_text(_('Your connection to this hotspot login is not secure. Passwords or other information you enter on this page can be viewed by people nearby.'));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
var PortalWindow = new Lang.Class({
|
||||||
Name: 'PortalWindow',
|
Name: 'PortalWindow',
|
||||||
Extends: Gtk.ApplicationWindow,
|
Extends: Gtk.ApplicationWindow,
|
||||||
|
|
||||||
_init: function(application, url, timestamp, doneCallback) {
|
_init: function(application, url, timestamp, doneCallback) {
|
||||||
this.parent({ application: application });
|
this.parent({ application: application });
|
||||||
|
|
||||||
|
this.connect('delete-event', Lang.bind(this, this.destroyWindow));
|
||||||
|
this._headerBar = new PortalHeaderBar();
|
||||||
|
this._headerBar.setSecurityIcon(PortalHelperSecurityLevel.NOT_YET_DETERMINED);
|
||||||
|
this.set_titlebar(this._headerBar);
|
||||||
|
this._headerBar.show();
|
||||||
|
|
||||||
if (!url) {
|
if (!url) {
|
||||||
url = 'http://www.gnome.org';
|
url = CONNECTIVITY_CHECK_URI;
|
||||||
this._originalUrlWasGnome = true;
|
this._originalUrlWasGnome = true;
|
||||||
} else {
|
} else {
|
||||||
this._originalUrlWasGnome = false;
|
this._originalUrlWasGnome = false;
|
||||||
@ -62,28 +141,38 @@ const PortalWindow = new Lang.Class({
|
|||||||
this._lastRecheck = 0;
|
this._lastRecheck = 0;
|
||||||
this._recheckAtExit = false;
|
this._recheckAtExit = false;
|
||||||
|
|
||||||
this._webView = new WebKit.WebView();
|
this._webContext = WebKit.WebContext.new_ephemeral();
|
||||||
|
this._webContext.set_cache_model(WebKit.CacheModel.DOCUMENT_VIEWER);
|
||||||
|
this._webContext.set_network_proxy_settings(WebKit.NetworkProxyMode.NO_PROXY, null);
|
||||||
|
|
||||||
|
this._webView = WebKit.WebView.new_with_context(this._webContext);
|
||||||
this._webView.connect('decide-policy', Lang.bind(this, this._onDecidePolicy));
|
this._webView.connect('decide-policy', Lang.bind(this, this._onDecidePolicy));
|
||||||
|
this._webView.connect('load-changed', Lang.bind(this, this._onLoadChanged));
|
||||||
|
this._webView.connect('insecure-content-detected', Lang.bind(this, this._onInsecureContentDetected));
|
||||||
|
this._webView.connect('load-failed-with-tls-errors', Lang.bind(this, this._onLoadFailedWithTlsErrors));
|
||||||
this._webView.load_uri(url);
|
this._webView.load_uri(url);
|
||||||
this._webView.connect('notify::title', Lang.bind(this, this._syncTitle));
|
this._webView.connect('notify::uri', Lang.bind(this, this._syncUri));
|
||||||
this._syncTitle();
|
this._syncUri();
|
||||||
|
|
||||||
this.add(this._webView);
|
this.add(this._webView);
|
||||||
this._webView.show();
|
this._webView.show();
|
||||||
|
this.set_size_request(600, 450);
|
||||||
this.maximize();
|
this.maximize();
|
||||||
this.present_with_time(timestamp);
|
this.present_with_time(timestamp);
|
||||||
|
|
||||||
|
this.application.set_accels_for_action('app.quit', ['<Primary>q', '<Primary>w']);
|
||||||
},
|
},
|
||||||
|
|
||||||
_syncTitle: function() {
|
destroyWindow: function() {
|
||||||
let title = this._webView.title;
|
this.destroy();
|
||||||
|
},
|
||||||
|
|
||||||
if (title) {
|
_syncUri: function() {
|
||||||
this.title = title;
|
let uri = this._webView.uri;
|
||||||
} else {
|
if (uri)
|
||||||
/* TRANSLATORS: this is the title of the wifi captive portal login
|
this._headerBar.setSubtitle(GLib.uri_unescape_string(uri, null));
|
||||||
* window, until we know the title of the actual login page */
|
else
|
||||||
this.title = _("Web Authentication Redirect");
|
this._headerBar.setSubtitle('');
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
refresh: function() {
|
refresh: function() {
|
||||||
@ -99,8 +188,46 @@ const PortalWindow = new Lang.Class({
|
|||||||
return false;
|
return false;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_onLoadChanged: function(view, loadEvent) {
|
||||||
|
if (loadEvent == WebKit.LoadEvent.STARTED) {
|
||||||
|
this._headerBar.setSecurityIcon(PortalHelperSecurityLevel.NOT_YET_DETERMINED);
|
||||||
|
} else if (loadEvent == WebKit.LoadEvent.COMMITTED) {
|
||||||
|
let tlsInfo = this._webView.get_tls_info();
|
||||||
|
let ret = tlsInfo[0];
|
||||||
|
let flags = tlsInfo[2];
|
||||||
|
if (ret && flags == 0)
|
||||||
|
this._headerBar.setSecurityIcon(PortalHelperSecurityLevel.SECURE);
|
||||||
|
else
|
||||||
|
this._headerBar.setSecurityIcon(PortalHelperSecurityLevel.INSECURE);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_onInsecureContentDetected: function () {
|
||||||
|
this._headerBar.setSecurityIcon(PortalHelperSecurityLevel.INSECURE);
|
||||||
|
},
|
||||||
|
|
||||||
|
_onLoadFailedWithTlsErrors: function (view, failingURI, certificate, errors) {
|
||||||
|
this._headerBar.setSecurityIcon(PortalHelperSecurityLevel.INSECURE);
|
||||||
|
let uri = new Soup.URI(failingURI);
|
||||||
|
this._webContext.allow_tls_certificate_for_host(certificate, uri.get_host());
|
||||||
|
this._webView.load_uri(failingURI);
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
|
||||||
_onDecidePolicy: function(view, decision, type) {
|
_onDecidePolicy: function(view, decision, type) {
|
||||||
if (type == WebKit.PolicyDecisionType.NEW_WINDOW_ACTION) {
|
if (type == WebKit.PolicyDecisionType.NEW_WINDOW_ACTION) {
|
||||||
|
let navigationAction = decision.get_navigation_action();
|
||||||
|
if (navigationAction.is_user_gesture()) {
|
||||||
|
// Even though the portal asks for a new window,
|
||||||
|
// perform the navigation in the current one. Some
|
||||||
|
// portals open a window as their last login step and
|
||||||
|
// ignoring that window causes them to not let the
|
||||||
|
// user go through. We don't risk popups taking over
|
||||||
|
// the page because we check that the navigation is
|
||||||
|
// user initiated.
|
||||||
|
this._webView.load_request(navigationAction.get_request());
|
||||||
|
}
|
||||||
|
|
||||||
decision.ignore();
|
decision.ignore();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -112,12 +239,12 @@ const PortalWindow = new Lang.Class({
|
|||||||
let uri = new Soup.URI(request.get_uri());
|
let uri = new Soup.URI(request.get_uri());
|
||||||
|
|
||||||
if (!uri.host_equal(this._uri) && this._originalUrlWasGnome) {
|
if (!uri.host_equal(this._uri) && this._originalUrlWasGnome) {
|
||||||
if (uri.get_host() == 'www.gnome.org' && this._everSeenRedirect) {
|
if (uri.get_host() == CONNECTIVITY_CHECK_HOST && this._everSeenRedirect) {
|
||||||
// Yay, we got to gnome!
|
// Yay, we got to gnome!
|
||||||
decision.ignore();
|
decision.ignore();
|
||||||
this._doneCallback(PortalHelperResult.COMPLETED);
|
this._doneCallback(PortalHelperResult.COMPLETED);
|
||||||
return true;
|
return true;
|
||||||
} else if (uri.get_host() != 'www.gnome.org') {
|
} else if (uri.get_host() != CONNECTIVITY_CHECK_HOST) {
|
||||||
this._everSeenRedirect = true;
|
this._everSeenRedirect = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -155,7 +282,7 @@ const PortalWindow = new Lang.Class({
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
const WebPortalHelper = new Lang.Class({
|
var WebPortalHelper = new Lang.Class({
|
||||||
Name: 'WebPortalHelper',
|
Name: 'WebPortalHelper',
|
||||||
Extends: Gtk.Application,
|
Extends: Gtk.Application,
|
||||||
|
|
||||||
@ -166,6 +293,10 @@ const WebPortalHelper = new Lang.Class({
|
|||||||
|
|
||||||
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(HelperDBusInterface, this);
|
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(HelperDBusInterface, this);
|
||||||
this._queue = [];
|
this._queue = [];
|
||||||
|
|
||||||
|
let action = new Gio.SimpleAction({ name: 'quit' });
|
||||||
|
action.connect('activate', () => { this.active_window.destroyWindow(); });
|
||||||
|
this.add_action(action);
|
||||||
},
|
},
|
||||||
|
|
||||||
vfunc_dbus_register: function(connection, path) {
|
vfunc_dbus_register: function(connection, path) {
|
||||||
@ -197,7 +328,7 @@ const WebPortalHelper = new Lang.Class({
|
|||||||
|
|
||||||
if (obj.connection == connection) {
|
if (obj.connection == connection) {
|
||||||
if (obj.window)
|
if (obj.window)
|
||||||
obj.window.destroy();
|
obj.window.destroyWindow();
|
||||||
this._queue.splice(i, 1);
|
this._queue.splice(i, 1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -226,7 +357,7 @@ const WebPortalHelper = new Lang.Class({
|
|||||||
if (top.window != null)
|
if (top.window != null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
top.window = new PortalWindow(this, top.uri, top.timestamp, Lang.bind(this, function(result) {
|
top.window = new PortalWindow(this, top.url, top.timestamp, Lang.bind(this, function(result) {
|
||||||
this._dbusImpl.emit_signal('Done', new GLib.Variant('(ou)', [top.connection, result]));
|
this._dbusImpl.emit_signal('Done', new GLib.Variant('(ou)', [top.connection, result]));
|
||||||
}));
|
}));
|
||||||
},
|
},
|
||||||
@ -239,6 +370,11 @@ function initEnvironment() {
|
|||||||
function main(argv) {
|
function main(argv) {
|
||||||
initEnvironment();
|
initEnvironment();
|
||||||
|
|
||||||
|
if (!WebKit.WebContext.new_ephemeral) {
|
||||||
|
log('WebKitGTK 2.16 is required for the portal-helper, see https://bugzilla.gnome.org/show_bug.cgi?id=780453');
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
Gettext.bindtextdomain(Config.GETTEXT_PACKAGE, Config.LOCALEDIR);
|
Gettext.bindtextdomain(Config.GETTEXT_PACKAGE, Config.LOCALEDIR);
|
||||||
Gettext.textdomain(Config.GETTEXT_PACKAGE);
|
Gettext.textdomain(Config.GETTEXT_PACKAGE);
|
||||||
|
|
||||||
|
180
js/ui/accessDialog.js
Normal file
@ -0,0 +1,180 @@
|
|||||||
|
const Clutter = imports.gi.Clutter;
|
||||||
|
const Gio = imports.gi.Gio;
|
||||||
|
const GLib = imports.gi.GLib;
|
||||||
|
const Lang = imports.lang;
|
||||||
|
const Pango = imports.gi.Pango;
|
||||||
|
const Shell = imports.gi.Shell;
|
||||||
|
const St = imports.gi.St;
|
||||||
|
|
||||||
|
const CheckBox = imports.ui.checkBox;
|
||||||
|
const Dialog = imports.ui.dialog;
|
||||||
|
const ModalDialog = imports.ui.modalDialog;
|
||||||
|
|
||||||
|
const RequestIface = '<node> \
|
||||||
|
<interface name="org.freedesktop.impl.portal.Request"> \
|
||||||
|
<method name="Close"/> \
|
||||||
|
</interface> \
|
||||||
|
</node>';
|
||||||
|
|
||||||
|
const AccessIface = '<node> \
|
||||||
|
<interface name="org.freedesktop.impl.portal.Access"> \
|
||||||
|
<method name="AccessDialog"> \
|
||||||
|
<arg type="o" name="handle" direction="in"/> \
|
||||||
|
<arg type="s" name="app_id" direction="in"/> \
|
||||||
|
<arg type="s" name="parent_window" direction="in"/> \
|
||||||
|
<arg type="s" name="title" direction="in"/> \
|
||||||
|
<arg type="s" name="subtitle" direction="in"/> \
|
||||||
|
<arg type="s" name="body" direction="in"/> \
|
||||||
|
<arg type="a{sv}" name="options" direction="in"/> \
|
||||||
|
<arg type="u" name="response" direction="out"/> \
|
||||||
|
<arg type="a{sv}" name="results" direction="out"/> \
|
||||||
|
</method> \
|
||||||
|
</interface> \
|
||||||
|
</node>';
|
||||||
|
|
||||||
|
var DialogResponse = {
|
||||||
|
OK: 0,
|
||||||
|
CANCEL: 1,
|
||||||
|
CLOSED: 2
|
||||||
|
};
|
||||||
|
|
||||||
|
var AccessDialog = new Lang.Class({
|
||||||
|
Name: 'AccessDialog',
|
||||||
|
Extends: ModalDialog.ModalDialog,
|
||||||
|
|
||||||
|
_init: function(invocation, handle, title, subtitle, body, options) {
|
||||||
|
this.parent({ styleClass: 'access-dialog' });
|
||||||
|
|
||||||
|
this._invocation = invocation;
|
||||||
|
this._handle = handle;
|
||||||
|
|
||||||
|
this._requestExported = false;
|
||||||
|
this._request = Gio.DBusExportedObject.wrapJSObject(RequestIface, this);
|
||||||
|
|
||||||
|
for (let option in options)
|
||||||
|
options[option] = options[option].deep_unpack();
|
||||||
|
|
||||||
|
this._buildLayout(title, subtitle, body, options);
|
||||||
|
},
|
||||||
|
|
||||||
|
_buildLayout: function(title, subtitle, body, options) {
|
||||||
|
// No support for non-modal system dialogs, so ignore the option
|
||||||
|
//let modal = options['modal'] || true;
|
||||||
|
let denyLabel = options['deny_label'] || _("Deny Access");
|
||||||
|
let grantLabel = options['grant_label'] || _("Grant Access");
|
||||||
|
let iconName = options['icon'] || null;
|
||||||
|
let choices = options['choices'] || [];
|
||||||
|
|
||||||
|
let contentParams = { title, subtitle, body };
|
||||||
|
if (iconName)
|
||||||
|
contentParams.icon = new Gio.ThemedIcon({ name: iconName });
|
||||||
|
let content = new Dialog.MessageDialogContent(contentParams);
|
||||||
|
this.contentLayout.add_actor(content);
|
||||||
|
|
||||||
|
this._choices = new Map();
|
||||||
|
|
||||||
|
for (let i = 0; i < choices.length; i++) {
|
||||||
|
let [id, name, opts, selected] = choices[i];
|
||||||
|
if (opts.length > 0)
|
||||||
|
continue; // radio buttons, not implemented
|
||||||
|
|
||||||
|
let check = new CheckBox.CheckBox();
|
||||||
|
check.getLabelActor().text = name;
|
||||||
|
check.actor.checked = selected == "true";
|
||||||
|
content.insertBeforeBody(check.actor);
|
||||||
|
|
||||||
|
this._choices.set(id, check);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.addButton({ label: denyLabel,
|
||||||
|
action: () => {
|
||||||
|
this._sendResponse(DialogResponse.CANCEL);
|
||||||
|
},
|
||||||
|
key: Clutter.KEY_Escape });
|
||||||
|
this.addButton({ label: grantLabel,
|
||||||
|
action: () => {
|
||||||
|
this._sendResponse(DialogResponse.OK);
|
||||||
|
}});
|
||||||
|
},
|
||||||
|
|
||||||
|
open: function() {
|
||||||
|
this.parent();
|
||||||
|
|
||||||
|
let connection = this._invocation.get_connection();
|
||||||
|
this._requestExported = this._request.export(connection, this._handle);
|
||||||
|
},
|
||||||
|
|
||||||
|
CloseAsync: function(invocation, params) {
|
||||||
|
if (this._invocation.get_sender() != invocation.get_sender()) {
|
||||||
|
invocation.return_error_literal(Gio.DBusError,
|
||||||
|
Gio.DBusError.ACCESS_DENIED,
|
||||||
|
'');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this._sendResponse(DialogResponse.CLOSED);
|
||||||
|
},
|
||||||
|
|
||||||
|
_sendResponse: function(response) {
|
||||||
|
if (this._requestExported)
|
||||||
|
this._request.unexport();
|
||||||
|
this._requestExported = false;
|
||||||
|
|
||||||
|
let results = {};
|
||||||
|
if (response == DialogResponse.OK) {
|
||||||
|
for (let [id, check] of this._choices) {
|
||||||
|
let checked = check.actor.checked ? 'true' : 'false';
|
||||||
|
results[id] = new GLib.Variant('s', checked);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delay actual response until the end of the close animation (if any)
|
||||||
|
this.connect('closed', () => {
|
||||||
|
this._invocation.return_value(new GLib.Variant('(ua{sv})',
|
||||||
|
[response, results]));
|
||||||
|
});
|
||||||
|
this.close();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var AccessDialogDBus = new Lang.Class({
|
||||||
|
Name: 'AccessDialogDBus',
|
||||||
|
|
||||||
|
_init: function() {
|
||||||
|
this._accessDialog = null;
|
||||||
|
|
||||||
|
this._windowTracker = Shell.WindowTracker.get_default();
|
||||||
|
|
||||||
|
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(AccessIface, this);
|
||||||
|
this._dbusImpl.export(Gio.DBus.session, '/org/freedesktop/portal/desktop');
|
||||||
|
|
||||||
|
Gio.DBus.session.own_name('org.freedesktop.impl.portal.desktop.gnome', Gio.BusNameOwnerFlags.REPLACE, null, null);
|
||||||
|
},
|
||||||
|
|
||||||
|
AccessDialogAsync: function(params, invocation) {
|
||||||
|
if (this._accessDialog) {
|
||||||
|
invocation.return_error_literal(Gio.DBusError,
|
||||||
|
Gio.DBusError.LIMITS_EXCEEDED,
|
||||||
|
'Already showing a system access dialog');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let [handle, appId, parentWindow, title, subtitle, body, options] = params;
|
||||||
|
// We probably want to use parentWindow and global.display.focus_window
|
||||||
|
// for this check in the future
|
||||||
|
if (appId && appId + '.desktop' != this._windowTracker.focus_app.id) {
|
||||||
|
invocation.return_error_literal(Gio.DBusError,
|
||||||
|
Gio.DBusError.ACCESS_DENIED,
|
||||||
|
'Only the focused app is allowed to show a system access dialog');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let dialog = new AccessDialog(invocation, handle, title,
|
||||||
|
subtitle, body, options);
|
||||||
|
dialog.open();
|
||||||
|
|
||||||
|
dialog.connect('closed', () => { this._accessDialog = null; });
|
||||||
|
|
||||||
|
this._accessDialog = dialog;
|
||||||
|
}
|
||||||
|
});
|
232
js/ui/altTab.js
@ -14,29 +14,28 @@ const Main = imports.ui.main;
|
|||||||
const SwitcherPopup = imports.ui.switcherPopup;
|
const SwitcherPopup = imports.ui.switcherPopup;
|
||||||
const Tweener = imports.ui.tweener;
|
const Tweener = imports.ui.tweener;
|
||||||
|
|
||||||
const APP_ICON_HOVER_TIMEOUT = 200; // milliseconds
|
var APP_ICON_HOVER_TIMEOUT = 200; // milliseconds
|
||||||
|
|
||||||
const THUMBNAIL_DEFAULT_SIZE = 256;
|
var THUMBNAIL_DEFAULT_SIZE = 256;
|
||||||
const THUMBNAIL_POPUP_TIME = 500; // milliseconds
|
var THUMBNAIL_POPUP_TIME = 500; // milliseconds
|
||||||
const THUMBNAIL_FADE_TIME = 0.1; // seconds
|
var THUMBNAIL_FADE_TIME = 0.1; // seconds
|
||||||
|
|
||||||
const WINDOW_PREVIEW_SIZE = 128;
|
var WINDOW_PREVIEW_SIZE = 128;
|
||||||
const APP_ICON_SIZE = 96;
|
var APP_ICON_SIZE = 96;
|
||||||
const APP_ICON_SIZE_SMALL = 48;
|
var APP_ICON_SIZE_SMALL = 48;
|
||||||
|
|
||||||
const baseIconSizes = [96, 64, 48, 32, 22];
|
const baseIconSizes = [96, 64, 48, 32, 22];
|
||||||
|
|
||||||
const AppIconMode = {
|
var AppIconMode = {
|
||||||
THUMBNAIL_ONLY: 1,
|
THUMBNAIL_ONLY: 1,
|
||||||
APP_ICON_ONLY: 2,
|
APP_ICON_ONLY: 2,
|
||||||
BOTH: 3,
|
BOTH: 3,
|
||||||
};
|
};
|
||||||
|
|
||||||
function _createWindowClone(window, size) {
|
function _createWindowClone(window, size) {
|
||||||
let windowTexture = window.get_texture();
|
let [width, height] = window.get_size();
|
||||||
let [width, height] = windowTexture.get_size();
|
|
||||||
let scale = Math.min(1.0, size / width, size / height);
|
let scale = Math.min(1.0, size / width, size / height);
|
||||||
return new Clutter.Clone({ source: windowTexture,
|
return new Clutter.Clone({ source: window,
|
||||||
width: width * scale,
|
width: width * scale,
|
||||||
height: height * scale,
|
height: height * scale,
|
||||||
x_align: Clutter.ActorAlign.CENTER,
|
x_align: Clutter.ActorAlign.CENTER,
|
||||||
@ -46,7 +45,20 @@ function _createWindowClone(window, size) {
|
|||||||
y_expand: true });
|
y_expand: true });
|
||||||
};
|
};
|
||||||
|
|
||||||
const AppSwitcherPopup = new Lang.Class({
|
function getWindows(workspace) {
|
||||||
|
// We ignore skip-taskbar windows in switchers, but if they are attached
|
||||||
|
// to their parent, their position in the MRU list may be more appropriate
|
||||||
|
// than the parent; so start with the complete list ...
|
||||||
|
let windows = global.display.get_tab_list(Meta.TabList.NORMAL_ALL,
|
||||||
|
workspace);
|
||||||
|
// ... map windows to their parent where appropriate ...
|
||||||
|
return windows.map(w => {
|
||||||
|
return w.is_attached_dialog() ? w.get_transient_for() : w;
|
||||||
|
// ... and filter out skip-taskbar windows and duplicates
|
||||||
|
}).filter((w, i, a) => !w.skip_taskbar && a.indexOf(w) == i);
|
||||||
|
}
|
||||||
|
|
||||||
|
var AppSwitcherPopup = new Lang.Class({
|
||||||
Name: 'AppSwitcherPopup',
|
Name: 'AppSwitcherPopup',
|
||||||
Extends: SwitcherPopup.SwitcherPopup,
|
Extends: SwitcherPopup.SwitcherPopup,
|
||||||
|
|
||||||
@ -146,6 +158,9 @@ const AppSwitcherPopup = new Lang.Class({
|
|||||||
|
|
||||||
_keyPressHandler: function(keysym, action) {
|
_keyPressHandler: function(keysym, action) {
|
||||||
if (action == Meta.KeyBindingAction.SWITCH_GROUP) {
|
if (action == Meta.KeyBindingAction.SWITCH_GROUP) {
|
||||||
|
if (!this._thumbnailsFocused)
|
||||||
|
this._select(this._selectedIndex, 0);
|
||||||
|
else
|
||||||
this._select(this._selectedIndex, this._nextWindow());
|
this._select(this._selectedIndex, this._nextWindow());
|
||||||
} else if (action == Meta.KeyBindingAction.SWITCH_GROUP_BACKWARD) {
|
} else if (action == Meta.KeyBindingAction.SWITCH_GROUP_BACKWARD) {
|
||||||
this._select(this._selectedIndex, this._previousWindow());
|
this._select(this._selectedIndex, this._previousWindow());
|
||||||
@ -354,7 +369,150 @@ const AppSwitcherPopup = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const WindowSwitcherPopup = new Lang.Class({
|
var CyclerHighlight = new Lang.Class({
|
||||||
|
Name: 'CyclerHighlight',
|
||||||
|
|
||||||
|
_init: function() {
|
||||||
|
this._window = null;
|
||||||
|
|
||||||
|
this.actor = new St.Widget({ layout_manager: new Clutter.BinLayout() });
|
||||||
|
|
||||||
|
this._clone = new Clutter.Clone();
|
||||||
|
this.actor.add_actor(this._clone);
|
||||||
|
|
||||||
|
this._highlight = new St.Widget({ style_class: 'cycler-highlight' });
|
||||||
|
this.actor.add_actor(this._highlight);
|
||||||
|
|
||||||
|
let coordinate = Clutter.BindCoordinate.ALL;
|
||||||
|
let constraint = new Clutter.BindConstraint({ coordinate: coordinate });
|
||||||
|
this._clone.bind_property('source', constraint, 'source', 0);
|
||||||
|
|
||||||
|
this.actor.add_constraint(constraint);
|
||||||
|
|
||||||
|
this.actor.connect('notify::allocation',
|
||||||
|
Lang.bind(this, this._onAllocationChanged));
|
||||||
|
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
|
||||||
|
},
|
||||||
|
|
||||||
|
set window(w) {
|
||||||
|
if (this._window == w)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this._window = w;
|
||||||
|
|
||||||
|
if (this._clone.source)
|
||||||
|
this._clone.source.sync_visibility();
|
||||||
|
|
||||||
|
let windowActor = this._window ? this._window.get_compositor_private()
|
||||||
|
: null;
|
||||||
|
|
||||||
|
if (windowActor)
|
||||||
|
windowActor.hide();
|
||||||
|
|
||||||
|
this._clone.source = windowActor;
|
||||||
|
},
|
||||||
|
|
||||||
|
_onAllocationChanged: function() {
|
||||||
|
if (!this._window) {
|
||||||
|
this._highlight.set_size(0, 0);
|
||||||
|
this._highlight.hide();
|
||||||
|
} else {
|
||||||
|
let [x, y] = this.actor.allocation.get_origin();
|
||||||
|
let rect = this._window.get_frame_rect();
|
||||||
|
this._highlight.set_size(rect.width, rect.height);
|
||||||
|
this._highlight.set_position(rect.x - x, rect.y - y);
|
||||||
|
this._highlight.show();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_onDestroy: function() {
|
||||||
|
this.window = null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var CyclerPopup = new Lang.Class({
|
||||||
|
Name: 'CyclerPopup',
|
||||||
|
Extends: SwitcherPopup.SwitcherPopup,
|
||||||
|
Abstract: true,
|
||||||
|
|
||||||
|
_init : function() {
|
||||||
|
this.parent();
|
||||||
|
|
||||||
|
this._items = this._getWindows();
|
||||||
|
|
||||||
|
if (this._items.length == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this._highlight = new CyclerHighlight();
|
||||||
|
global.window_group.add_actor(this._highlight.actor);
|
||||||
|
|
||||||
|
// We don't show an actual popup, so just provide what SwitcherPopup
|
||||||
|
// expects instead of inheriting from SwitcherList
|
||||||
|
this._switcherList = { actor: new St.Widget(),
|
||||||
|
highlight: Lang.bind(this, this._highlightItem),
|
||||||
|
connect: function() {} };
|
||||||
|
},
|
||||||
|
|
||||||
|
_highlightItem: function(index, justOutline) {
|
||||||
|
this._highlight.window = this._items[index];
|
||||||
|
global.window_group.set_child_above_sibling(this._highlight.actor, null);
|
||||||
|
},
|
||||||
|
|
||||||
|
_finish: function() {
|
||||||
|
let window = this._items[this._selectedIndex];
|
||||||
|
let ws = window.get_workspace();
|
||||||
|
let activeWs = global.screen.get_active_workspace();
|
||||||
|
|
||||||
|
if (window.minimized) {
|
||||||
|
Main.wm.skipNextEffect(window.get_compositor_private());
|
||||||
|
window.unminimize();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (activeWs == ws) {
|
||||||
|
Main.activateWindow(window);
|
||||||
|
} else {
|
||||||
|
// If the selected window is on a different workspace, we don't
|
||||||
|
// want it to disappear, then slide in with the workspace; instead,
|
||||||
|
// always activate it on the active workspace ...
|
||||||
|
activeWs.activate_with_focus(window, global.get_current_time());
|
||||||
|
|
||||||
|
// ... then slide it over to the original workspace if necessary
|
||||||
|
Main.wm.actionMoveWindow(window, ws);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.parent();
|
||||||
|
},
|
||||||
|
|
||||||
|
_onDestroy: function() {
|
||||||
|
this._highlight.actor.destroy();
|
||||||
|
|
||||||
|
this.parent();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
var GroupCyclerPopup = new Lang.Class({
|
||||||
|
Name: 'GroupCyclerPopup',
|
||||||
|
Extends: CyclerPopup,
|
||||||
|
|
||||||
|
_getWindows: function() {
|
||||||
|
let app = Shell.WindowTracker.get_default().focus_app;
|
||||||
|
return app ? app.get_windows() : [];
|
||||||
|
},
|
||||||
|
|
||||||
|
_keyPressHandler: function(keysym, action) {
|
||||||
|
if (action == Meta.KeyBindingAction.CYCLE_GROUP)
|
||||||
|
this._select(this._next());
|
||||||
|
else if (action == Meta.KeyBindingAction.CYCLE_GROUP_BACKWARD)
|
||||||
|
this._select(this._previous());
|
||||||
|
else
|
||||||
|
return Clutter.EVENT_PROPAGATE;
|
||||||
|
|
||||||
|
return Clutter.EVENT_STOP;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var WindowSwitcherPopup = new Lang.Class({
|
||||||
Name: 'WindowSwitcherPopup',
|
Name: 'WindowSwitcherPopup',
|
||||||
Extends: SwitcherPopup.SwitcherPopup,
|
Extends: SwitcherPopup.SwitcherPopup,
|
||||||
|
|
||||||
@ -374,7 +532,7 @@ const WindowSwitcherPopup = new Lang.Class({
|
|||||||
|
|
||||||
_getWindowList: function() {
|
_getWindowList: function() {
|
||||||
let workspace = this._settings.get_boolean('current-workspace-only') ? global.screen.get_active_workspace() : null;
|
let workspace = this._settings.get_boolean('current-workspace-only') ? global.screen.get_active_workspace() : null;
|
||||||
return global.display.get_tab_list(Meta.TabList.NORMAL, workspace);
|
return getWindows(workspace);
|
||||||
},
|
},
|
||||||
|
|
||||||
_keyPressHandler: function(keysym, action) {
|
_keyPressHandler: function(keysym, action) {
|
||||||
@ -401,7 +559,33 @@ const WindowSwitcherPopup = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const AppIcon = new Lang.Class({
|
var WindowCyclerPopup = new Lang.Class({
|
||||||
|
Name: 'WindowCyclerPopup',
|
||||||
|
Extends: CyclerPopup,
|
||||||
|
|
||||||
|
_init: function() {
|
||||||
|
this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell.window-switcher' });
|
||||||
|
this.parent();
|
||||||
|
},
|
||||||
|
|
||||||
|
_getWindows: function() {
|
||||||
|
let workspace = this._settings.get_boolean('current-workspace-only') ? global.screen.get_active_workspace() : null;
|
||||||
|
return getWindows(workspace);
|
||||||
|
},
|
||||||
|
|
||||||
|
_keyPressHandler: function(keysym, action) {
|
||||||
|
if (action == Meta.KeyBindingAction.CYCLE_WINDOWS)
|
||||||
|
this._select(this._next());
|
||||||
|
else if (action == Meta.KeyBindingAction.CYCLE_WINDOWS_BACKWARD)
|
||||||
|
this._select(this._previous());
|
||||||
|
else
|
||||||
|
return Clutter.EVENT_PROPAGATE;
|
||||||
|
|
||||||
|
return Clutter.EVENT_STOP;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var AppIcon = new Lang.Class({
|
||||||
Name: 'AppIcon',
|
Name: 'AppIcon',
|
||||||
|
|
||||||
_init: function(app) {
|
_init: function(app) {
|
||||||
@ -422,7 +606,7 @@ const AppIcon = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const AppSwitcher = new Lang.Class({
|
var AppSwitcher = new Lang.Class({
|
||||||
Name: 'AppSwitcher',
|
Name: 'AppSwitcher',
|
||||||
Extends: SwitcherPopup.SwitcherList,
|
Extends: SwitcherPopup.SwitcherList,
|
||||||
|
|
||||||
@ -448,8 +632,6 @@ const AppSwitcher = new Lang.Class({
|
|||||||
});
|
});
|
||||||
if (appIcon.cachedWindows.length > 0)
|
if (appIcon.cachedWindows.length > 0)
|
||||||
this._addIcon(appIcon);
|
this._addIcon(appIcon);
|
||||||
else if (workspace == null)
|
|
||||||
throw new Error('%s appears to be running, but doesn\'t have any windows'.format(appIcon.app.get_name()));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this._curApp = -1;
|
this._curApp = -1;
|
||||||
@ -598,7 +780,7 @@ const AppSwitcher = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const ThumbnailList = new Lang.Class({
|
var ThumbnailList = new Lang.Class({
|
||||||
Name: 'ThumbnailList',
|
Name: 'ThumbnailList',
|
||||||
Extends: SwitcherPopup.SwitcherList,
|
Extends: SwitcherPopup.SwitcherList,
|
||||||
|
|
||||||
@ -666,7 +848,7 @@ const ThumbnailList = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const WindowIcon = new Lang.Class({
|
var WindowIcon = new Lang.Class({
|
||||||
Name: 'WindowIcon',
|
Name: 'WindowIcon',
|
||||||
|
|
||||||
_init: function(window, mode) {
|
_init: function(window, mode) {
|
||||||
@ -687,15 +869,17 @@ const WindowIcon = new Lang.Class({
|
|||||||
|
|
||||||
this._icon.destroy_all_children();
|
this._icon.destroy_all_children();
|
||||||
|
|
||||||
|
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
||||||
|
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
case AppIconMode.THUMBNAIL_ONLY:
|
case AppIconMode.THUMBNAIL_ONLY:
|
||||||
size = WINDOW_PREVIEW_SIZE;
|
size = WINDOW_PREVIEW_SIZE;
|
||||||
this._icon.add_actor(_createWindowClone(mutterWindow, WINDOW_PREVIEW_SIZE));
|
this._icon.add_actor(_createWindowClone(mutterWindow, size * scaleFactor));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case AppIconMode.BOTH:
|
case AppIconMode.BOTH:
|
||||||
size = WINDOW_PREVIEW_SIZE;
|
size = WINDOW_PREVIEW_SIZE;
|
||||||
this._icon.add_actor(_createWindowClone(mutterWindow, WINDOW_PREVIEW_SIZE));
|
this._icon.add_actor(_createWindowClone(mutterWindow, size * scaleFactor));
|
||||||
|
|
||||||
if (this.app)
|
if (this.app)
|
||||||
this._icon.add_actor(this._createAppIcon(this.app,
|
this._icon.add_actor(this._createAppIcon(this.app,
|
||||||
@ -707,7 +891,7 @@ const WindowIcon = new Lang.Class({
|
|||||||
this._icon.add_actor(this._createAppIcon(this.app, size));
|
this._icon.add_actor(this._createAppIcon(this.app, size));
|
||||||
}
|
}
|
||||||
|
|
||||||
this._icon.set_size(size, size);
|
this._icon.set_size(size * scaleFactor, size * scaleFactor);
|
||||||
},
|
},
|
||||||
|
|
||||||
_createAppIcon: function(app, size) {
|
_createAppIcon: function(app, size) {
|
||||||
@ -721,7 +905,7 @@ const WindowIcon = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const WindowList = new Lang.Class({
|
var WindowList = new Lang.Class({
|
||||||
Name: 'WindowList',
|
Name: 'WindowList',
|
||||||
Extends: SwitcherPopup.SwitcherList,
|
Extends: SwitcherPopup.SwitcherList,
|
||||||
|
|
||||||
|
@ -7,9 +7,9 @@ const St = imports.gi.St;
|
|||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
const Atk = imports.gi.Atk;
|
const Atk = imports.gi.Atk;
|
||||||
|
|
||||||
const ANIMATED_ICON_UPDATE_TIMEOUT = 100;
|
var ANIMATED_ICON_UPDATE_TIMEOUT = 16;
|
||||||
|
|
||||||
const Animation = new Lang.Class({
|
var Animation = new Lang.Class({
|
||||||
Name: 'Animation',
|
Name: 'Animation',
|
||||||
|
|
||||||
_init: function(file, width, height, speed) {
|
_init: function(file, width, height, speed) {
|
||||||
@ -33,7 +33,7 @@ const Animation = new Lang.Class({
|
|||||||
if (this._frame == 0)
|
if (this._frame == 0)
|
||||||
this._showFrame(0);
|
this._showFrame(0);
|
||||||
|
|
||||||
this._timeoutId = Mainloop.timeout_add(this._speed, Lang.bind(this, this._update));
|
this._timeoutId = GLib.timeout_add(GLib.PRIORITY_LOW, this._speed, Lang.bind(this, this._update));
|
||||||
GLib.Source.set_name_by_id(this._timeoutId, '[gnome-shell] this._update');
|
GLib.Source.set_name_by_id(this._timeoutId, '[gnome-shell] this._update');
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -67,7 +67,7 @@ const Animation = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_animationsLoaded: function() {
|
_animationsLoaded: function() {
|
||||||
this._isLoaded = true;
|
this._isLoaded = this._animations.get_n_children() > 0;
|
||||||
|
|
||||||
if (this._isPlaying)
|
if (this._isPlaying)
|
||||||
this.play();
|
this.play();
|
||||||
@ -78,7 +78,7 @@ const Animation = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const AnimatedIcon = new Lang.Class({
|
var AnimatedIcon = new Lang.Class({
|
||||||
Name: 'AnimatedIcon',
|
Name: 'AnimatedIcon',
|
||||||
Extends: Animation,
|
Extends: Animation,
|
||||||
|
|
||||||
|
@ -24,41 +24,56 @@ const OverviewControls = imports.ui.overviewControls;
|
|||||||
const PopupMenu = imports.ui.popupMenu;
|
const PopupMenu = imports.ui.popupMenu;
|
||||||
const Tweener = imports.ui.tweener;
|
const Tweener = imports.ui.tweener;
|
||||||
const Workspace = imports.ui.workspace;
|
const Workspace = imports.ui.workspace;
|
||||||
|
const Search = imports.ui.search;
|
||||||
|
const System = imports.ui.status.system;
|
||||||
const Params = imports.misc.params;
|
const Params = imports.misc.params;
|
||||||
const Util = imports.misc.util;
|
const Util = imports.misc.util;
|
||||||
|
const SystemActions = imports.misc.systemActions;
|
||||||
|
|
||||||
const MAX_APPLICATION_WORK_MILLIS = 75;
|
var MAX_APPLICATION_WORK_MILLIS = 75;
|
||||||
const MENU_POPUP_TIMEOUT = 600;
|
var MENU_POPUP_TIMEOUT = 600;
|
||||||
const MAX_COLUMNS = 6;
|
var MAX_COLUMNS = 6;
|
||||||
const MIN_COLUMNS = 4;
|
var MIN_COLUMNS = 4;
|
||||||
const MIN_ROWS = 4;
|
var MIN_ROWS = 4;
|
||||||
|
|
||||||
const INACTIVE_GRID_OPACITY = 77;
|
var INACTIVE_GRID_OPACITY = 77;
|
||||||
// This time needs to be less than IconGrid.EXTRA_SPACE_ANIMATION_TIME
|
// This time needs to be less than IconGrid.EXTRA_SPACE_ANIMATION_TIME
|
||||||
// to not clash with other animations
|
// to not clash with other animations
|
||||||
const INACTIVE_GRID_OPACITY_ANIMATION_TIME = 0.24;
|
var INACTIVE_GRID_OPACITY_ANIMATION_TIME = 0.24;
|
||||||
const FOLDER_SUBICON_FRACTION = .4;
|
var FOLDER_SUBICON_FRACTION = .4;
|
||||||
|
|
||||||
const MIN_FREQUENT_APPS_COUNT = 3;
|
var MIN_FREQUENT_APPS_COUNT = 3;
|
||||||
|
|
||||||
const INDICATORS_BASE_TIME = 0.25;
|
var INDICATORS_BASE_TIME = 0.25;
|
||||||
const INDICATORS_ANIMATION_DELAY = 0.125;
|
var INDICATORS_ANIMATION_DELAY = 0.125;
|
||||||
const INDICATORS_ANIMATION_MAX_TIME = 0.75;
|
var INDICATORS_ANIMATION_MAX_TIME = 0.75;
|
||||||
|
|
||||||
|
var VIEWS_SWITCH_TIME = 0.4;
|
||||||
|
var VIEWS_SWITCH_ANIMATION_DELAY = 0.1;
|
||||||
|
|
||||||
// Follow iconGrid animations approach and divide by 2 to animate out to
|
// Follow iconGrid animations approach and divide by 2 to animate out to
|
||||||
// not annoy the user when the user wants to quit appDisplay.
|
// not annoy the user when the user wants to quit appDisplay.
|
||||||
// Also, make sure we don't exceed iconGrid animation total time or
|
// Also, make sure we don't exceed iconGrid animation total time or
|
||||||
// views switch time.
|
// views switch time.
|
||||||
const INDICATORS_BASE_TIME_OUT = 0.125;
|
var INDICATORS_BASE_TIME_OUT = 0.125;
|
||||||
const INDICATORS_ANIMATION_DELAY_OUT = 0.0625;
|
var INDICATORS_ANIMATION_DELAY_OUT = 0.0625;
|
||||||
const INDICATORS_ANIMATION_MAX_TIME_OUT =
|
var INDICATORS_ANIMATION_MAX_TIME_OUT =
|
||||||
Math.min (VIEWS_SWITCH_TIME,
|
Math.min (VIEWS_SWITCH_TIME,
|
||||||
IconGrid.ANIMATION_TIME_OUT + IconGrid.ANIMATION_MAX_DELAY_OUT_FOR_ITEM);
|
IconGrid.ANIMATION_TIME_OUT + IconGrid.ANIMATION_MAX_DELAY_OUT_FOR_ITEM);
|
||||||
|
|
||||||
const PAGE_SWITCH_TIME = 0.3;
|
var PAGE_SWITCH_TIME = 0.3;
|
||||||
|
|
||||||
const VIEWS_SWITCH_TIME = 0.4;
|
const SWITCHEROO_BUS_NAME = 'net.hadess.SwitcherooControl';
|
||||||
const VIEWS_SWITCH_ANIMATION_DELAY = 0.1;
|
const SWITCHEROO_OBJECT_PATH = '/net/hadess/SwitcherooControl';
|
||||||
|
|
||||||
|
const SwitcherooProxyInterface = '<node> \
|
||||||
|
<interface name="net.hadess.SwitcherooControl"> \
|
||||||
|
<property name="HasDualGpu" type="b" access="read"/> \
|
||||||
|
</interface> \
|
||||||
|
</node>';
|
||||||
|
|
||||||
|
const SwitcherooProxy = Gio.DBusProxy.makeProxyWrapper(SwitcherooProxyInterface);
|
||||||
|
let discreteGpuAvailable = false;
|
||||||
|
|
||||||
function _getCategories(info) {
|
function _getCategories(info) {
|
||||||
let categoriesStr = info.get_categories();
|
let categoriesStr = info.get_categories();
|
||||||
@ -96,7 +111,7 @@ function clamp(value, min, max) {
|
|||||||
return Math.max(min, Math.min(max, value));
|
return Math.max(min, Math.min(max, value));
|
||||||
}
|
}
|
||||||
|
|
||||||
const BaseAppView = new Lang.Class({
|
var BaseAppView = new Lang.Class({
|
||||||
Name: 'BaseAppView',
|
Name: 'BaseAppView',
|
||||||
Abstract: true,
|
Abstract: true,
|
||||||
|
|
||||||
@ -198,22 +213,6 @@ const BaseAppView = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
animate: function(animationDirection, onComplete) {
|
animate: function(animationDirection, onComplete) {
|
||||||
if (animationDirection == IconGrid.AnimationDirection.IN) {
|
|
||||||
let toAnimate = this._grid.actor.connect('notify::allocation', Lang.bind(this,
|
|
||||||
function() {
|
|
||||||
this._grid.actor.disconnect(toAnimate);
|
|
||||||
// We need to hide the grid temporary to not flash it
|
|
||||||
// for a frame
|
|
||||||
this._grid.actor.opacity = 0;
|
|
||||||
Meta.later_add(Meta.LaterType.BEFORE_REDRAW,
|
|
||||||
Lang.bind(this, function() {
|
|
||||||
this._doSpringAnimation(animationDirection)
|
|
||||||
}));
|
|
||||||
}));
|
|
||||||
} else {
|
|
||||||
this._doSpringAnimation(animationDirection);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (onComplete) {
|
if (onComplete) {
|
||||||
let animationDoneId = this._grid.connect('animation-done', Lang.bind(this,
|
let animationDoneId = this._grid.connect('animation-done', Lang.bind(this,
|
||||||
function () {
|
function () {
|
||||||
@ -221,6 +220,15 @@ const BaseAppView = new Lang.Class({
|
|||||||
onComplete();
|
onComplete();
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (animationDirection == IconGrid.AnimationDirection.IN) {
|
||||||
|
let id = this._grid.actor.connect('paint', () => {
|
||||||
|
this._grid.actor.disconnect(id);
|
||||||
|
this._doSpringAnimation(animationDirection);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
this._doSpringAnimation(animationDirection);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
animateSwitch: function(animationDirection) {
|
animateSwitch: function(animationDirection) {
|
||||||
@ -244,7 +252,7 @@ const BaseAppView = new Lang.Class({
|
|||||||
});
|
});
|
||||||
Signals.addSignalMethods(BaseAppView.prototype);
|
Signals.addSignalMethods(BaseAppView.prototype);
|
||||||
|
|
||||||
const PageIndicatorsActor = new Lang.Class({
|
var PageIndicatorsActor = new Lang.Class({
|
||||||
Name:'PageIndicatorsActor',
|
Name:'PageIndicatorsActor',
|
||||||
Extends: St.BoxLayout,
|
Extends: St.BoxLayout,
|
||||||
|
|
||||||
@ -268,7 +276,7 @@ const PageIndicatorsActor = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const PageIndicators = new Lang.Class({
|
var PageIndicators = new Lang.Class({
|
||||||
Name:'PageIndicators',
|
Name:'PageIndicators',
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
@ -361,7 +369,7 @@ const PageIndicators = new Lang.Class({
|
|||||||
});
|
});
|
||||||
Signals.addSignalMethods(PageIndicators.prototype);
|
Signals.addSignalMethods(PageIndicators.prototype);
|
||||||
|
|
||||||
const AllView = new Lang.Class({
|
var AllView = new Lang.Class({
|
||||||
Name: 'AllView',
|
Name: 'AllView',
|
||||||
Extends: BaseAppView,
|
Extends: BaseAppView,
|
||||||
|
|
||||||
@ -435,7 +443,10 @@ const AllView = new Lang.Class({
|
|||||||
}));
|
}));
|
||||||
this._grid.connect('space-opened', Lang.bind(this,
|
this._grid.connect('space-opened', Lang.bind(this,
|
||||||
function() {
|
function() {
|
||||||
this._scrollView.get_effect('fade').enabled = false;
|
let fadeEffect = this._scrollView.get_effect('fade');
|
||||||
|
if (fadeEffect)
|
||||||
|
fadeEffect.enabled = false;
|
||||||
|
|
||||||
this.emit('space-ready');
|
this.emit('space-ready');
|
||||||
}));
|
}));
|
||||||
this._grid.connect('space-closed', Lang.bind(this,
|
this._grid.connect('space-closed', Lang.bind(this,
|
||||||
@ -500,6 +511,11 @@ const AllView = new Lang.Class({
|
|||||||
|
|
||||||
_loadApps: function() {
|
_loadApps: function() {
|
||||||
let apps = Gio.AppInfo.get_all().filter(function(appInfo) {
|
let apps = Gio.AppInfo.get_all().filter(function(appInfo) {
|
||||||
|
try {
|
||||||
|
let id = appInfo.get_id(); // catch invalid file encodings
|
||||||
|
} catch(e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
return appInfo.should_show();
|
return appInfo.should_show();
|
||||||
}).map(function(app) {
|
}).map(function(app) {
|
||||||
return app.get_id();
|
return app.get_id();
|
||||||
@ -641,7 +657,11 @@ const AllView = new Lang.Class({
|
|||||||
|
|
||||||
_closeSpaceForPopup: function() {
|
_closeSpaceForPopup: function() {
|
||||||
this._updateIconOpacities(false);
|
this._updateIconOpacities(false);
|
||||||
this._scrollView.get_effect('fade').enabled = true;
|
|
||||||
|
let fadeEffect = this._scrollView.get_effect('fade');
|
||||||
|
if (fadeEffect)
|
||||||
|
fadeEffect.enabled = true;
|
||||||
|
|
||||||
this._grid.closeExtraSpace();
|
this._grid.closeExtraSpace();
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -753,6 +773,7 @@ const AllView = new Lang.Class({
|
|||||||
let fadeOffset = Math.min(this._grid.topPadding,
|
let fadeOffset = Math.min(this._grid.topPadding,
|
||||||
this._grid.bottomPadding);
|
this._grid.bottomPadding);
|
||||||
this._scrollView.update_fade_effect(fadeOffset, 0);
|
this._scrollView.update_fade_effect(fadeOffset, 0);
|
||||||
|
if (fadeOffset > 0)
|
||||||
this._scrollView.get_effect('fade').fade_edges = true;
|
this._scrollView.get_effect('fade').fade_edges = true;
|
||||||
|
|
||||||
if (this._availWidth != availWidth || this._availHeight != availHeight || oldNPages != this._grid.nPages()) {
|
if (this._availWidth != availWidth || this._availHeight != availHeight || oldNPages != this._grid.nPages()) {
|
||||||
@ -774,7 +795,7 @@ const AllView = new Lang.Class({
|
|||||||
});
|
});
|
||||||
Signals.addSignalMethods(AllView.prototype);
|
Signals.addSignalMethods(AllView.prototype);
|
||||||
|
|
||||||
const FrequentView = new Lang.Class({
|
var FrequentView = new Lang.Class({
|
||||||
Name: 'FrequentView',
|
Name: 'FrequentView',
|
||||||
Extends: BaseAppView,
|
Extends: BaseAppView,
|
||||||
|
|
||||||
@ -848,12 +869,12 @@ const FrequentView = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const Views = {
|
var Views = {
|
||||||
FREQUENT: 0,
|
FREQUENT: 0,
|
||||||
ALL: 1
|
ALL: 1
|
||||||
};
|
};
|
||||||
|
|
||||||
const ControlsBoxLayout = Lang.Class({
|
var ControlsBoxLayout = Lang.Class({
|
||||||
Name: 'ControlsBoxLayout',
|
Name: 'ControlsBoxLayout',
|
||||||
Extends: Clutter.BoxLayout,
|
Extends: Clutter.BoxLayout,
|
||||||
|
|
||||||
@ -878,9 +899,11 @@ const ControlsBoxLayout = Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const ViewStackLayout = new Lang.Class({
|
var ViewStackLayout = new Lang.Class({
|
||||||
Name: 'ViewStackLayout',
|
Name: 'ViewStackLayout',
|
||||||
Extends: Clutter.BinLayout,
|
Extends: Clutter.BinLayout,
|
||||||
|
Signals: { 'allocated-size-changed': { param_types: [GObject.TYPE_INT,
|
||||||
|
GObject.TYPE_INT] } },
|
||||||
|
|
||||||
vfunc_allocate: function (actor, box, flags) {
|
vfunc_allocate: function (actor, box, flags) {
|
||||||
let availWidth = box.x2 - box.x1;
|
let availWidth = box.x2 - box.x1;
|
||||||
@ -891,9 +914,8 @@ const ViewStackLayout = new Lang.Class({
|
|||||||
this.parent(actor, box, flags);
|
this.parent(actor, box, flags);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
Signals.addSignalMethods(ViewStackLayout.prototype);
|
|
||||||
|
|
||||||
const AppDisplay = new Lang.Class({
|
var AppDisplay = new Lang.Class({
|
||||||
Name: 'AppDisplay',
|
Name: 'AppDisplay',
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
@ -963,10 +985,36 @@ const AppDisplay = new Lang.Class({
|
|||||||
initialView = Views.ALL;
|
initialView = Views.ALL;
|
||||||
this._showView(initialView);
|
this._showView(initialView);
|
||||||
this._updateFrequentVisibility();
|
this._updateFrequentVisibility();
|
||||||
|
|
||||||
|
Gio.DBus.system.watch_name(SWITCHEROO_BUS_NAME,
|
||||||
|
Gio.BusNameWatcherFlags.NONE,
|
||||||
|
Lang.bind(this, this._switcherooProxyAppeared),
|
||||||
|
Lang.bind(this, function() {
|
||||||
|
this._switcherooProxy = null;
|
||||||
|
this._updateDiscreteGpuAvailable();
|
||||||
|
}));
|
||||||
|
},
|
||||||
|
|
||||||
|
_updateDiscreteGpuAvailable: function() {
|
||||||
|
if (!this._switcherooProxy)
|
||||||
|
discreteGpuAvailable = false;
|
||||||
|
else
|
||||||
|
discreteGpuAvailable = this._switcherooProxy.HasDualGpu;
|
||||||
|
},
|
||||||
|
|
||||||
|
_switcherooProxyAppeared: function() {
|
||||||
|
this._switcherooProxy = new SwitcherooProxy(Gio.DBus.system, SWITCHEROO_BUS_NAME, SWITCHEROO_OBJECT_PATH,
|
||||||
|
Lang.bind(this, function(proxy, error) {
|
||||||
|
if (error) {
|
||||||
|
log(error.message);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this._updateDiscreteGpuAvailable();
|
||||||
|
}));
|
||||||
},
|
},
|
||||||
|
|
||||||
animate: function(animationDirection, onComplete) {
|
animate: function(animationDirection, onComplete) {
|
||||||
let currentView = this._views[global.settings.get_uint('app-picker-view')].view;
|
let currentView = this._views.filter(v => v.control.has_style_pseudo_class('checked')).pop().view;
|
||||||
|
|
||||||
// Animate controls opacity using iconGrid animation time, since
|
// Animate controls opacity using iconGrid animation time, since
|
||||||
// it will be the time the AllView or FrequentView takes to show
|
// it will be the time the AllView or FrequentView takes to show
|
||||||
@ -1032,25 +1080,43 @@ const AppDisplay = new Lang.Class({
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
const AppSearchProvider = new Lang.Class({
|
var AppSearchProvider = new Lang.Class({
|
||||||
Name: 'AppSearchProvider',
|
Name: 'AppSearchProvider',
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
this._appSys = Shell.AppSystem.get_default();
|
this._appSys = Shell.AppSystem.get_default();
|
||||||
this.id = 'applications';
|
this.id = 'applications';
|
||||||
|
this.isRemoteProvider = false;
|
||||||
|
this.canLaunchSearch = false;
|
||||||
|
|
||||||
|
this._systemActions = new SystemActions.getDefault();
|
||||||
},
|
},
|
||||||
|
|
||||||
getResultMetas: function(apps, callback) {
|
getResultMetas: function(apps, callback) {
|
||||||
let metas = [];
|
let metas = [];
|
||||||
for (let i = 0; i < apps.length; i++) {
|
for (let id of apps) {
|
||||||
let app = this._appSys.lookup_app(apps[i]);
|
if (id.endsWith('.desktop')) {
|
||||||
|
let app = this._appSys.lookup_app(id);
|
||||||
|
|
||||||
metas.push({ 'id': app.get_id(),
|
metas.push({ 'id': app.get_id(),
|
||||||
'name': app.get_name(),
|
'name': app.get_name(),
|
||||||
'createIcon': function(size) {
|
'createIcon': function(size) {
|
||||||
return app.create_icon_texture(size);
|
return app.create_icon_texture(size);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
} else {
|
||||||
|
let name = this._systemActions.getName(id);
|
||||||
|
let iconName = this._systemActions.getIconName(id);
|
||||||
|
|
||||||
|
let createIcon = size => new St.Icon({ icon_name: iconName,
|
||||||
|
width: size,
|
||||||
|
height: size,
|
||||||
|
style_class: 'system-action-icon' });
|
||||||
|
|
||||||
|
metas.push({ id, name, createIcon });
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
callback(metas);
|
callback(metas);
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -1060,7 +1126,7 @@ const AppSearchProvider = new Lang.Class({
|
|||||||
|
|
||||||
getInitialResultSet: function(terms, callback, cancellable) {
|
getInitialResultSet: function(terms, callback, cancellable) {
|
||||||
let query = terms.join(' ');
|
let query = terms.join(' ');
|
||||||
let groups = Gio.DesktopAppInfo.search(query);
|
let groups = Shell.AppSystem.search(query);
|
||||||
let usage = Shell.AppUsage.get_default();
|
let usage = Shell.AppUsage.get_default();
|
||||||
let results = [];
|
let results = [];
|
||||||
groups.forEach(function(group) {
|
groups.forEach(function(group) {
|
||||||
@ -1072,6 +1138,9 @@ const AppSearchProvider = new Lang.Class({
|
|||||||
return usage.compare('', a, b);
|
return usage.compare('', a, b);
|
||||||
}));
|
}));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
results = results.concat(this._systemActions.getMatchingActions(terms));
|
||||||
|
|
||||||
callback(results);
|
callback(results);
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -1080,12 +1149,14 @@ const AppSearchProvider = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
createResultObject: function (resultMeta) {
|
createResultObject: function (resultMeta) {
|
||||||
let app = this._appSys.lookup_app(resultMeta['id']);
|
if (resultMeta.id.endsWith('.desktop'))
|
||||||
return new AppIcon(app);
|
return new AppIcon(this._appSys.lookup_app(resultMeta['id']));
|
||||||
|
else
|
||||||
|
return new SystemActionIcon(this, resultMeta);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const FolderView = new Lang.Class({
|
var FolderView = new Lang.Class({
|
||||||
Name: 'FolderView',
|
Name: 'FolderView',
|
||||||
Extends: BaseAppView,
|
Extends: BaseAppView,
|
||||||
|
|
||||||
@ -1125,13 +1196,9 @@ const FolderView = new Lang.Class({
|
|||||||
let numItems = this._allItems.length;
|
let numItems = this._allItems.length;
|
||||||
let rtl = icon.get_text_direction() == Clutter.TextDirection.RTL;
|
let rtl = icon.get_text_direction() == Clutter.TextDirection.RTL;
|
||||||
for (let i = 0; i < 4; i++) {
|
for (let i = 0; i < 4; i++) {
|
||||||
let bin;
|
let bin = new St.Bin({ width: subSize, height: subSize });
|
||||||
if (i < numItems) {
|
if (i < numItems)
|
||||||
let texture = this._allItems[i].app.create_icon_texture(subSize);
|
bin.child = this._allItems[i].app.create_icon_texture(subSize);
|
||||||
bin = new St.Bin({ child: texture });
|
|
||||||
} else {
|
|
||||||
bin = new St.Bin({ width: subSize, height: subSize });
|
|
||||||
}
|
|
||||||
layout.attach(bin, rtl ? (i + 1) % 2 : i % 2, Math.floor(i / 2), 1, 1);
|
layout.attach(bin, rtl ? (i + 1) % 2 : i % 2, Math.floor(i / 2), 1, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1201,11 +1268,12 @@ const FolderView = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const FolderIcon = new Lang.Class({
|
var FolderIcon = new Lang.Class({
|
||||||
Name: 'FolderIcon',
|
Name: 'FolderIcon',
|
||||||
|
|
||||||
_init: function(id, path, parentView) {
|
_init: function(id, path, parentView) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
|
this.name = '';
|
||||||
this._parentView = parentView;
|
this._parentView = parentView;
|
||||||
|
|
||||||
this._folder = new Gio.Settings({ schema_id: 'org.gnome.desktop.app-folders.folder',
|
this._folder = new Gio.Settings({ schema_id: 'org.gnome.desktop.app-folders.folder',
|
||||||
@ -1289,7 +1357,10 @@ const FolderIcon = new Lang.Class({
|
|||||||
if (!_listsIntersect(folderCategories, appCategories))
|
if (!_listsIntersect(folderCategories, appCategories))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
addAppId(appInfo.get_id());
|
try {
|
||||||
|
addAppId(appInfo.get_id()); // catch invalid file encodings
|
||||||
|
} catch(e) {
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
this.actor.visible = this.view.getAllItems().length > 0;
|
this.actor.visible = this.view.getAllItems().length > 0;
|
||||||
@ -1375,7 +1446,7 @@ const FolderIcon = new Lang.Class({
|
|||||||
});
|
});
|
||||||
Signals.addSignalMethods(FolderIcon.prototype);
|
Signals.addSignalMethods(FolderIcon.prototype);
|
||||||
|
|
||||||
const AppFolderPopup = new Lang.Class({
|
var AppFolderPopup = new Lang.Class({
|
||||||
Name: 'AppFolderPopup',
|
Name: 'AppFolderPopup',
|
||||||
|
|
||||||
_init: function(source, side) {
|
_init: function(source, side) {
|
||||||
@ -1536,7 +1607,7 @@ const AppFolderPopup = new Lang.Class({
|
|||||||
});
|
});
|
||||||
Signals.addSignalMethods(AppFolderPopup.prototype);
|
Signals.addSignalMethods(AppFolderPopup.prototype);
|
||||||
|
|
||||||
const AppIcon = new Lang.Class({
|
var AppIcon = new Lang.Class({
|
||||||
Name: 'AppIcon',
|
Name: 'AppIcon',
|
||||||
|
|
||||||
_init : function(app, iconParams) {
|
_init : function(app, iconParams) {
|
||||||
@ -1782,7 +1853,7 @@ const AppIcon = new Lang.Class({
|
|||||||
});
|
});
|
||||||
Signals.addSignalMethods(AppIcon.prototype);
|
Signals.addSignalMethods(AppIcon.prototype);
|
||||||
|
|
||||||
const AppIconMenu = new Lang.Class({
|
var AppIconMenu = new Lang.Class({
|
||||||
Name: 'AppIconMenu',
|
Name: 'AppIconMenu',
|
||||||
Extends: PopupMenu.PopupMenu,
|
Extends: PopupMenu.PopupMenu,
|
||||||
|
|
||||||
@ -1805,7 +1876,7 @@ const AppIconMenu = new Lang.Class({
|
|||||||
if (!source.actor.mapped)
|
if (!source.actor.mapped)
|
||||||
this.close();
|
this.close();
|
||||||
}));
|
}));
|
||||||
source.actor.connect('destroy', Lang.bind(this, function () { this.actor.destroy(); }));
|
source.actor.connect('destroy', Lang.bind(this, this.destroy));
|
||||||
|
|
||||||
Main.uiGroup.add_actor(this.actor);
|
Main.uiGroup.add_actor(this.actor);
|
||||||
},
|
},
|
||||||
@ -1852,6 +1923,19 @@ const AppIconMenu = new Lang.Class({
|
|||||||
this._appendSeparator();
|
this._appendSeparator();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (discreteGpuAvailable &&
|
||||||
|
this._source.app.state == Shell.AppState.STOPPED &&
|
||||||
|
actions.indexOf('activate-discrete-gpu') == -1) {
|
||||||
|
this._onDiscreteGpuMenuItem = this._appendMenuItem(_("Launch using Dedicated Graphics Card"));
|
||||||
|
this._onDiscreteGpuMenuItem.connect('activate', Lang.bind(this, function() {
|
||||||
|
if (this._source.app.state == Shell.AppState.STOPPED)
|
||||||
|
this._source.animateLaunch();
|
||||||
|
|
||||||
|
this._source.app.launch(0, -1, true);
|
||||||
|
this.emit('activate-window', null);
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
for (let i = 0; i < actions.length; i++) {
|
for (let i = 0; i < actions.length; i++) {
|
||||||
let action = actions[i];
|
let action = actions[i];
|
||||||
let item = this._appendMenuItem(appInfo.get_action_name(action));
|
let item = this._appendMenuItem(appInfo.get_action_name(action));
|
||||||
@ -1923,3 +2007,13 @@ const AppIconMenu = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
Signals.addSignalMethods(AppIconMenu.prototype);
|
Signals.addSignalMethods(AppIconMenu.prototype);
|
||||||
|
|
||||||
|
var SystemActionIcon = new Lang.Class({
|
||||||
|
Name: 'SystemActionIcon',
|
||||||
|
Extends: Search.GridSearchResult,
|
||||||
|
|
||||||
|
activate: function() {
|
||||||
|
SystemActions.getDefault().activateAction(this.metaInfo['id']);
|
||||||
|
Main.overview.hide();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
@ -6,26 +6,34 @@ const Signals = imports.signals;
|
|||||||
|
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
|
|
||||||
|
// In alphabetical order
|
||||||
const RENAMED_DESKTOP_IDS = {
|
const RENAMED_DESKTOP_IDS = {
|
||||||
'baobab.desktop': 'org.gnome.baobab.desktop',
|
'baobab.desktop': 'org.gnome.baobab.desktop',
|
||||||
'cheese.desktop': 'org.gnome.Cheese.desktop',
|
'cheese.desktop': 'org.gnome.Cheese.desktop',
|
||||||
'dconf-editor.desktop': 'ca.desrt.dconf-editor.desktop',
|
'dconf-editor.desktop': 'ca.desrt.dconf-editor.desktop',
|
||||||
|
'empathy.desktop': 'org.gnome.Empathy.desktop',
|
||||||
|
'epiphany.desktop': 'org.gnome.Epiphany.desktop',
|
||||||
'file-roller.desktop': 'org.gnome.FileRoller.desktop',
|
'file-roller.desktop': 'org.gnome.FileRoller.desktop',
|
||||||
'gcalctool.desktop': 'gnome-calculator.desktop',
|
'gcalctool.desktop': 'org.gnome.Calculator.desktop',
|
||||||
|
'geary.desktop': 'org.gnome.Geary.desktop',
|
||||||
'gedit.desktop': 'org.gnome.gedit.desktop',
|
'gedit.desktop': 'org.gnome.gedit.desktop',
|
||||||
'glchess.desktop': 'gnome-chess.desktop',
|
'glchess.desktop': 'gnome-chess.desktop',
|
||||||
'glines.desktop': 'five-or-more.desktop',
|
'glines.desktop': 'five-or-more.desktop',
|
||||||
'gnect.desktop': 'four-in-a-row.desktop',
|
'gnect.desktop': 'four-in-a-row.desktop',
|
||||||
'gnibbles.desktop': 'gnome-nibbles.desktop',
|
'gnibbles.desktop': 'org.gnome.Nibbles.desktop',
|
||||||
'gnobots2.desktop': 'gnome-robots.desktop',
|
'gnobots2.desktop': 'gnome-robots.desktop',
|
||||||
'gnome-boxes.desktop': 'org.gnome.Boxes.desktop',
|
'gnome-boxes.desktop': 'org.gnome.Boxes.desktop',
|
||||||
|
'gnome-calculator.desktop': 'org.gnome.Calculator.desktop',
|
||||||
'gnome-clocks.desktop': 'org.gnome.clocks.desktop',
|
'gnome-clocks.desktop': 'org.gnome.clocks.desktop',
|
||||||
'gnome-contacts.desktop': 'org.gnome.Contacts.desktop',
|
'gnome-contacts.desktop': 'org.gnome.Contacts.desktop',
|
||||||
'gnome-documents.desktop': 'org.gnome.Documents.desktop',
|
'gnome-documents.desktop': 'org.gnome.Documents.desktop',
|
||||||
'gnome-font-viewer.desktop': 'org.gnome.font-viewer.desktop',
|
'gnome-font-viewer.desktop': 'org.gnome.font-viewer.desktop',
|
||||||
|
'gnome-nibbles.desktop': 'org.gnome.Nibbles.desktop',
|
||||||
|
'gnome-music.desktop': 'org.gnome.Music.desktop',
|
||||||
'gnome-photos.desktop': 'org.gnome.Photos.desktop',
|
'gnome-photos.desktop': 'org.gnome.Photos.desktop',
|
||||||
'gnome-screenshot.desktop': 'org.gnome.Screenshot.desktop',
|
'gnome-screenshot.desktop': 'org.gnome.Screenshot.desktop',
|
||||||
'gnome-software.desktop': 'org.gnome.Software.desktop',
|
'gnome-software.desktop': 'org.gnome.Software.desktop',
|
||||||
|
'gnome-terminal.desktop': 'org.gnome.Terminal.desktop',
|
||||||
'gnome-weather.desktop': 'org.gnome.Weather.Application.desktop',
|
'gnome-weather.desktop': 'org.gnome.Weather.Application.desktop',
|
||||||
'gnomine.desktop': 'gnome-mines.desktop',
|
'gnomine.desktop': 'gnome-mines.desktop',
|
||||||
'gnotravex.desktop': 'gnome-tetravex.desktop',
|
'gnotravex.desktop': 'gnome-tetravex.desktop',
|
||||||
@ -36,7 +44,7 @@ const RENAMED_DESKTOP_IDS = {
|
|||||||
'totem.desktop': 'org.gnome.Totem.desktop',
|
'totem.desktop': 'org.gnome.Totem.desktop',
|
||||||
};
|
};
|
||||||
|
|
||||||
const AppFavorites = new Lang.Class({
|
var AppFavorites = new Lang.Class({
|
||||||
Name: 'AppFavorites',
|
Name: 'AppFavorites',
|
||||||
|
|
||||||
FAVORITE_APPS_KEY: 'favorite-apps',
|
FAVORITE_APPS_KEY: 'favorite-apps',
|
||||||
@ -54,12 +62,14 @@ const AppFavorites = new Lang.Class({
|
|||||||
|
|
||||||
reload: function() {
|
reload: function() {
|
||||||
let ids = global.settings.get_strv(this.FAVORITE_APPS_KEY);
|
let ids = global.settings.get_strv(this.FAVORITE_APPS_KEY);
|
||||||
|
let appSys = Shell.AppSystem.get_default();
|
||||||
|
|
||||||
// Map old desktop file names to the current ones
|
// Map old desktop file names to the current ones
|
||||||
let updated = false;
|
let updated = false;
|
||||||
ids = ids.map(function (id) {
|
ids = ids.map(function (id) {
|
||||||
let newId = RENAMED_DESKTOP_IDS[id];
|
let newId = RENAMED_DESKTOP_IDS[id];
|
||||||
if (newId !== undefined) {
|
if (newId !== undefined &&
|
||||||
|
appSys.lookup_app(newId) != null) {
|
||||||
updated = true;
|
updated = true;
|
||||||
return newId;
|
return newId;
|
||||||
}
|
}
|
||||||
@ -69,7 +79,6 @@ const AppFavorites = new Lang.Class({
|
|||||||
if (updated)
|
if (updated)
|
||||||
global.settings.set_strv(this.FAVORITE_APPS_KEY, ids);
|
global.settings.set_strv(this.FAVORITE_APPS_KEY, ids);
|
||||||
|
|
||||||
let appSys = Shell.AppSystem.get_default();
|
|
||||||
let apps = ids.map(function (id) {
|
let apps = ids.map(function (id) {
|
||||||
return appSys.lookup_app(id);
|
return appSys.lookup_app(id);
|
||||||
}).filter(function (app) {
|
}).filter(function (app) {
|
||||||
|
216
js/ui/audioDeviceSelection.js
Normal file
@ -0,0 +1,216 @@
|
|||||||
|
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;
|
||||||
|
const St = imports.gi.St;
|
||||||
|
|
||||||
|
const Main = imports.ui.main;
|
||||||
|
const ModalDialog = imports.ui.modalDialog;
|
||||||
|
|
||||||
|
var AudioDevice = {
|
||||||
|
HEADPHONES: 1 << 0,
|
||||||
|
HEADSET: 1 << 1,
|
||||||
|
MICROPHONE: 1 << 2
|
||||||
|
};
|
||||||
|
|
||||||
|
const AudioDeviceSelectionIface = '<node> \
|
||||||
|
<interface name="org.gnome.Shell.AudioDeviceSelection"> \
|
||||||
|
<method name="Open"> \
|
||||||
|
<arg name="devices" direction="in" type="as" /> \
|
||||||
|
</method> \
|
||||||
|
<method name="Close"> \
|
||||||
|
</method> \
|
||||||
|
<signal name="DeviceSelected"> \
|
||||||
|
<arg name="device" type="s" /> \
|
||||||
|
</signal> \
|
||||||
|
</interface> \
|
||||||
|
</node>';
|
||||||
|
|
||||||
|
var AudioDeviceSelectionDialog = new Lang.Class({
|
||||||
|
Name: 'AudioDeviceSelectionDialog',
|
||||||
|
Extends: ModalDialog.ModalDialog,
|
||||||
|
|
||||||
|
_init: function(devices) {
|
||||||
|
this.parent({ styleClass: 'audio-device-selection-dialog' });
|
||||||
|
|
||||||
|
this._deviceItems = {};
|
||||||
|
|
||||||
|
this._buildLayout();
|
||||||
|
|
||||||
|
if (devices & AudioDevice.HEADPHONES)
|
||||||
|
this._addDevice(AudioDevice.HEADPHONES);
|
||||||
|
if (devices & AudioDevice.HEADSET)
|
||||||
|
this._addDevice(AudioDevice.HEADSET);
|
||||||
|
if (devices & AudioDevice.MICROPHONE)
|
||||||
|
this._addDevice(AudioDevice.MICROPHONE);
|
||||||
|
|
||||||
|
if (this._selectionBox.get_n_children() < 2)
|
||||||
|
throw new Error('Too few devices for a selection');
|
||||||
|
},
|
||||||
|
|
||||||
|
destroy: function() {
|
||||||
|
this.parent();
|
||||||
|
},
|
||||||
|
|
||||||
|
_buildLayout: function(devices) {
|
||||||
|
let title = new St.Label({ style_class: 'audio-selection-title',
|
||||||
|
text: _("Select Audio Device"),
|
||||||
|
x_align: Clutter.ActorAlign.CENTER });
|
||||||
|
|
||||||
|
this.contentLayout.style_class = 'audio-selection-content';
|
||||||
|
this.contentLayout.add(title);
|
||||||
|
|
||||||
|
this._selectionBox = new St.BoxLayout({ style_class: 'audio-selection-box' });
|
||||||
|
this.contentLayout.add(this._selectionBox, { expand: true });
|
||||||
|
|
||||||
|
this.addButton({ action: Lang.bind(this, this._openSettings),
|
||||||
|
label: _("Sound Settings") });
|
||||||
|
this.addButton({ action: Lang.bind(this, this.close),
|
||||||
|
label: _("Cancel"),
|
||||||
|
key: Clutter.Escape });
|
||||||
|
},
|
||||||
|
|
||||||
|
_getDeviceLabel: function(device) {
|
||||||
|
switch(device) {
|
||||||
|
case AudioDevice.HEADPHONES:
|
||||||
|
return _("Headphones");
|
||||||
|
case AudioDevice.HEADSET:
|
||||||
|
return _("Headset");
|
||||||
|
case AudioDevice.MICROPHONE:
|
||||||
|
return _("Microphone");
|
||||||
|
default:
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_getDeviceIcon: function(device) {
|
||||||
|
switch(device) {
|
||||||
|
case AudioDevice.HEADPHONES:
|
||||||
|
return 'audio-headphones-symbolic';
|
||||||
|
case AudioDevice.HEADSET:
|
||||||
|
return 'audio-headset-symbolic';
|
||||||
|
case AudioDevice.MICROPHONE:
|
||||||
|
return 'audio-input-microphone-symbolic';
|
||||||
|
default:
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_addDevice: function(device) {
|
||||||
|
let box = new St.BoxLayout({ style_class: 'audio-selection-device-box',
|
||||||
|
vertical: true });
|
||||||
|
box.connect('notify::height',
|
||||||
|
function() {
|
||||||
|
Meta.later_add(Meta.LaterType.BEFORE_REDRAW,
|
||||||
|
function() {
|
||||||
|
box.width = box.height;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
let icon = new St.Icon({ style_class: 'audio-selection-device-icon',
|
||||||
|
icon_name: this._getDeviceIcon(device) });
|
||||||
|
box.add(icon);
|
||||||
|
|
||||||
|
let label = new St.Label({ style_class: 'audio-selection-device-label',
|
||||||
|
text: this._getDeviceLabel(device),
|
||||||
|
x_align: Clutter.ActorAlign.CENTER });
|
||||||
|
box.add(label);
|
||||||
|
|
||||||
|
let button = new St.Button({ style_class: 'audio-selection-device',
|
||||||
|
can_focus: true,
|
||||||
|
child: box });
|
||||||
|
this._selectionBox.add(button);
|
||||||
|
|
||||||
|
button.connect('clicked', Lang.bind(this,
|
||||||
|
function() {
|
||||||
|
this.emit('device-selected', device);
|
||||||
|
this.close();
|
||||||
|
Main.overview.hide();
|
||||||
|
}));
|
||||||
|
},
|
||||||
|
|
||||||
|
_openSettings: function() {
|
||||||
|
let desktopFile = 'gnome-sound-panel.desktop'
|
||||||
|
let app = Shell.AppSystem.get_default().lookup_app(desktopFile);
|
||||||
|
|
||||||
|
if (!app) {
|
||||||
|
log('Settings panel for desktop file ' + desktopFile + ' could not be loaded!');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.close();
|
||||||
|
Main.overview.hide();
|
||||||
|
app.activate();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var AudioDeviceSelectionDBus = new Lang.Class({
|
||||||
|
Name: 'AudioDeviceSelectionDBus',
|
||||||
|
|
||||||
|
_init: function() {
|
||||||
|
this._audioSelectionDialog = null;
|
||||||
|
|
||||||
|
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(AudioDeviceSelectionIface, this);
|
||||||
|
this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell/AudioDeviceSelection');
|
||||||
|
|
||||||
|
Gio.DBus.session.own_name('org.gnome.Shell.AudioDeviceSelection', Gio.BusNameOwnerFlags.REPLACE, null, null);
|
||||||
|
},
|
||||||
|
|
||||||
|
_onDialogClosed: function() {
|
||||||
|
this._audioSelectionDialog = null;
|
||||||
|
},
|
||||||
|
|
||||||
|
_onDeviceSelected: function(dialog, device) {
|
||||||
|
let connection = this._dbusImpl.get_connection();
|
||||||
|
let info = this._dbusImpl.get_info();
|
||||||
|
let deviceName = Object.keys(AudioDevice).filter(
|
||||||
|
function(dev) {
|
||||||
|
return AudioDevice[dev] == device;
|
||||||
|
})[0].toLowerCase();
|
||||||
|
connection.emit_signal(this._audioSelectionDialog._sender,
|
||||||
|
this._dbusImpl.get_object_path(),
|
||||||
|
info ? info.name : null,
|
||||||
|
'DeviceSelected',
|
||||||
|
GLib.Variant.new('(s)', [deviceName]));
|
||||||
|
},
|
||||||
|
|
||||||
|
OpenAsync: function(params, invocation) {
|
||||||
|
if (this._audioSelectionDialog) {
|
||||||
|
invocation.return_value(null);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let [deviceNames] = params;
|
||||||
|
let devices = 0;
|
||||||
|
deviceNames.forEach(function(n) {
|
||||||
|
devices |= AudioDevice[n.toUpperCase()];
|
||||||
|
});
|
||||||
|
|
||||||
|
let dialog;
|
||||||
|
try {
|
||||||
|
dialog = new AudioDeviceSelectionDialog(devices);
|
||||||
|
} catch(e) {
|
||||||
|
invocation.return_value(null);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
dialog._sender = invocation.get_sender();
|
||||||
|
|
||||||
|
dialog.connect('closed', Lang.bind(this, this._onDialogClosed));
|
||||||
|
dialog.connect('device-selected',
|
||||||
|
Lang.bind(this, this._onDeviceSelected));
|
||||||
|
dialog.open();
|
||||||
|
|
||||||
|
this._audioSelectionDialog = dialog;
|
||||||
|
invocation.return_value(null);
|
||||||
|
},
|
||||||
|
|
||||||
|
CloseAsync: function(params, invocation) {
|
||||||
|
if (this._audioSelectionDialog &&
|
||||||
|
this._audioSelectionDialog._sender == invocation.get_sender())
|
||||||
|
this._audioSelectionDialog.close();
|
||||||
|
|
||||||
|
invocation.return_value(null);
|
||||||
|
}
|
||||||
|
});
|
@ -102,11 +102,12 @@ const Lang = imports.lang;
|
|||||||
const Meta = imports.gi.Meta;
|
const Meta = imports.gi.Meta;
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
|
|
||||||
|
const LoginManager = imports.misc.loginManager;
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const Params = imports.misc.params;
|
const Params = imports.misc.params;
|
||||||
const Tweener = imports.ui.tweener;
|
const Tweener = imports.ui.tweener;
|
||||||
|
|
||||||
const DEFAULT_BACKGROUND_COLOR = Clutter.Color.from_pixel(0x2e3436ff);
|
var DEFAULT_BACKGROUND_COLOR = Clutter.Color.from_pixel(0x2e3436ff);
|
||||||
|
|
||||||
const BACKGROUND_SCHEMA = 'org.gnome.desktop.background';
|
const BACKGROUND_SCHEMA = 'org.gnome.desktop.background';
|
||||||
const PRIMARY_COLOR_KEY = 'primary-color';
|
const PRIMARY_COLOR_KEY = 'primary-color';
|
||||||
@ -116,14 +117,14 @@ const BACKGROUND_STYLE_KEY = 'picture-options';
|
|||||||
const PICTURE_OPACITY_KEY = 'picture-opacity';
|
const PICTURE_OPACITY_KEY = 'picture-opacity';
|
||||||
const PICTURE_URI_KEY = 'picture-uri';
|
const PICTURE_URI_KEY = 'picture-uri';
|
||||||
|
|
||||||
const FADE_ANIMATION_TIME = 1.0;
|
var FADE_ANIMATION_TIME = 1.0;
|
||||||
|
|
||||||
// These parameters affect how often we redraw.
|
// These parameters affect how often we redraw.
|
||||||
// The first is how different (percent crossfaded) the slide show
|
// The first is how different (percent crossfaded) the slide show
|
||||||
// has to look before redrawing and the second is the minimum
|
// has to look before redrawing and the second is the minimum
|
||||||
// frequency (in seconds) we're willing to wake up
|
// frequency (in seconds) we're willing to wake up
|
||||||
const ANIMATION_OPACITY_STEP_INCREMENT = 4.0;
|
var ANIMATION_OPACITY_STEP_INCREMENT = 4.0;
|
||||||
const ANIMATION_MIN_WAKEUP_INTERVAL = 1.0;
|
var ANIMATION_MIN_WAKEUP_INTERVAL = 1.0;
|
||||||
|
|
||||||
let _backgroundCache = null;
|
let _backgroundCache = null;
|
||||||
|
|
||||||
@ -137,13 +138,13 @@ function _fileEqual0(file1, file2) {
|
|||||||
return file1.equal(file2);
|
return file1.equal(file2);
|
||||||
}
|
}
|
||||||
|
|
||||||
const BackgroundCache = new Lang.Class({
|
var BackgroundCache = new Lang.Class({
|
||||||
Name: 'BackgroundCache',
|
Name: 'BackgroundCache',
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
this._pendingFileLoads = [];
|
|
||||||
this._fileMonitors = {};
|
this._fileMonitors = {};
|
||||||
this._backgroundSources = {};
|
this._backgroundSources = {};
|
||||||
|
this._animations = {};
|
||||||
},
|
},
|
||||||
|
|
||||||
monitorFile: function(file) {
|
monitorFile: function(file) {
|
||||||
@ -153,7 +154,11 @@ const BackgroundCache = new Lang.Class({
|
|||||||
|
|
||||||
let monitor = file.monitor(Gio.FileMonitorFlags.NONE, null);
|
let monitor = file.monitor(Gio.FileMonitorFlags.NONE, null);
|
||||||
monitor.connect('changed',
|
monitor.connect('changed',
|
||||||
Lang.bind(this, function() {
|
Lang.bind(this, function(obj, file, otherFile, eventType) {
|
||||||
|
// Ignore CHANGED and CREATED events, since in both cases
|
||||||
|
// we'll get a CHANGES_DONE_HINT event when done.
|
||||||
|
if (eventType != Gio.FileMonitorEvent.CHANGED &&
|
||||||
|
eventType != Gio.FileMonitorEvent.CREATED)
|
||||||
this.emit('file-changed', file);
|
this.emit('file-changed', file);
|
||||||
}));
|
}));
|
||||||
|
|
||||||
@ -162,12 +167,14 @@ const BackgroundCache = new Lang.Class({
|
|||||||
|
|
||||||
getAnimation: function(params) {
|
getAnimation: function(params) {
|
||||||
params = Params.parse(params, { file: null,
|
params = Params.parse(params, { file: null,
|
||||||
|
settingsSchema: null,
|
||||||
onLoaded: null });
|
onLoaded: null });
|
||||||
|
|
||||||
if (_fileEqual0(this._animationFile, params.file)) {
|
let animation = this._animations[params.settingsSchema];
|
||||||
|
if (animation && _fileEqual0(animation.file, params.file)) {
|
||||||
if (params.onLoaded) {
|
if (params.onLoaded) {
|
||||||
let id = GLib.idle_add(GLib.PRIORITY_DEFAULT, Lang.bind(this, function() {
|
let id = GLib.idle_add(GLib.PRIORITY_DEFAULT, Lang.bind(this, function() {
|
||||||
params.onLoaded(this._animation);
|
params.onLoaded(this._animations[params.settingsSchema]);
|
||||||
return GLib.SOURCE_REMOVE;
|
return GLib.SOURCE_REMOVE;
|
||||||
}));
|
}));
|
||||||
GLib.Source.set_name_by_id(id, '[gnome-shell] params.onLoaded');
|
GLib.Source.set_name_by_id(id, '[gnome-shell] params.onLoaded');
|
||||||
@ -175,15 +182,14 @@ const BackgroundCache = new Lang.Class({
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let animation = new Animation({ file: params.file });
|
animation = new Animation({ file: params.file });
|
||||||
|
|
||||||
animation.load(Lang.bind(this, function() {
|
animation.load(Lang.bind(this, function() {
|
||||||
this._animationFile = params.file;
|
this._animations[params.settingsSchema] = animation;
|
||||||
this._animation = animation;
|
|
||||||
|
|
||||||
if (params.onLoaded) {
|
if (params.onLoaded) {
|
||||||
let id = GLib.idle_add(GLib.PRIORITY_DEFAULT, Lang.bind(this, function() {
|
let id = GLib.idle_add(GLib.PRIORITY_DEFAULT, Lang.bind(this, function() {
|
||||||
params.onLoaded(this._animation);
|
params.onLoaded(this._animations[params.settingsSchema]);
|
||||||
return GLib.SOURCE_REMOVE;
|
return GLib.SOURCE_REMOVE;
|
||||||
}));
|
}));
|
||||||
GLib.Source.set_name_by_id(id, '[gnome-shell] params.onLoaded');
|
GLib.Source.set_name_by_id(id, '[gnome-shell] params.onLoaded');
|
||||||
@ -224,7 +230,7 @@ function getBackgroundCache() {
|
|||||||
return _backgroundCache;
|
return _backgroundCache;
|
||||||
}
|
}
|
||||||
|
|
||||||
const Background = new Lang.Class({
|
var Background = new Lang.Class({
|
||||||
Name: 'Background',
|
Name: 'Background',
|
||||||
|
|
||||||
_init: function(params) {
|
_init: function(params) {
|
||||||
@ -246,6 +252,21 @@ const Background = new Lang.Class({
|
|||||||
this._cancellable = new Gio.Cancellable();
|
this._cancellable = new Gio.Cancellable();
|
||||||
this.isLoaded = false;
|
this.isLoaded = false;
|
||||||
|
|
||||||
|
this._clock = new GnomeDesktop.WallClock();
|
||||||
|
this._timezoneChangedId = this._clock.connect('notify::timezone',
|
||||||
|
Lang.bind(this, function() {
|
||||||
|
if (this._animation)
|
||||||
|
this._loadAnimation(this._animation.file);
|
||||||
|
}));
|
||||||
|
|
||||||
|
let loginManager = LoginManager.getLoginManager();
|
||||||
|
this._prepareForSleepId = loginManager.connect('prepare-for-sleep',
|
||||||
|
(lm, aboutToSuspend) => {
|
||||||
|
if (aboutToSuspend)
|
||||||
|
return;
|
||||||
|
this._refreshAnimation();
|
||||||
|
});
|
||||||
|
|
||||||
this._settingsChangedSignalId = this._settings.connect('changed', Lang.bind(this, function() {
|
this._settingsChangedSignalId = this._settings.connect('changed', Lang.bind(this, function() {
|
||||||
this.emit('changed');
|
this.emit('changed');
|
||||||
}));
|
}));
|
||||||
@ -264,16 +285,30 @@ const Background = new Lang.Class({
|
|||||||
}
|
}
|
||||||
this._fileWatches = null;
|
this._fileWatches = null;
|
||||||
|
|
||||||
|
if (this._timezoneChangedId != 0)
|
||||||
|
this._clock.disconnect(this._timezoneChangedId);
|
||||||
|
this._timezoneChangedId = 0;
|
||||||
|
|
||||||
|
if (this._prepareForSleepId != 0)
|
||||||
|
LoginManager.getLoginManager().disconnect(this._prepareForSleepId);
|
||||||
|
this._prepareForSleepId = 0;
|
||||||
|
|
||||||
if (this._settingsChangedSignalId != 0)
|
if (this._settingsChangedSignalId != 0)
|
||||||
this._settings.disconnect(this._settingsChangedSignalId);
|
this._settings.disconnect(this._settingsChangedSignalId);
|
||||||
this._settingsChangedSignalId = 0;
|
this._settingsChangedSignalId = 0;
|
||||||
},
|
},
|
||||||
|
|
||||||
updateResolution: function() {
|
updateResolution: function() {
|
||||||
if (this._animation) {
|
if (this._animation)
|
||||||
|
this._refreshAnimation();
|
||||||
|
},
|
||||||
|
|
||||||
|
_refreshAnimation: function() {
|
||||||
|
if (!this._animation)
|
||||||
|
return;
|
||||||
|
|
||||||
this._removeAnimationTimeout();
|
this._removeAnimationTimeout();
|
||||||
this._updateAnimation();
|
this._updateAnimation();
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_setLoaded: function() {
|
_setLoaded: function() {
|
||||||
@ -351,11 +386,9 @@ const Background = new Lang.Class({
|
|||||||
|
|
||||||
let cache = Meta.BackgroundImageCache.get_default();
|
let cache = Meta.BackgroundImageCache.get_default();
|
||||||
let numPendingImages = files.length;
|
let numPendingImages = files.length;
|
||||||
let images = [];
|
|
||||||
for (let i = 0; i < files.length; i++) {
|
for (let i = 0; i < files.length; i++) {
|
||||||
this._watchFile(files[i]);
|
this._watchFile(files[i]);
|
||||||
let image = cache.load(files[i]);
|
let image = cache.load(files[i]);
|
||||||
images.push(image);
|
|
||||||
if (image.is_loaded()) {
|
if (image.is_loaded()) {
|
||||||
numPendingImages--;
|
numPendingImages--;
|
||||||
if (numPendingImages == 0)
|
if (numPendingImages == 0)
|
||||||
@ -403,6 +436,7 @@ const Background = new Lang.Class({
|
|||||||
|
|
||||||
_loadAnimation: function(file) {
|
_loadAnimation: function(file) {
|
||||||
this._cache.getAnimation({ file: file,
|
this._cache.getAnimation({ file: file,
|
||||||
|
settingsSchema: this._settings.schema_id,
|
||||||
onLoaded: Lang.bind(this, function(animation) {
|
onLoaded: Lang.bind(this, function(animation) {
|
||||||
this._animation = animation;
|
this._animation = animation;
|
||||||
|
|
||||||
@ -458,7 +492,7 @@ Signals.addSignalMethods(Background.prototype);
|
|||||||
|
|
||||||
let _systemBackground;
|
let _systemBackground;
|
||||||
|
|
||||||
const SystemBackground = new Lang.Class({
|
var SystemBackground = new Lang.Class({
|
||||||
Name: 'SystemBackground',
|
Name: 'SystemBackground',
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
@ -495,7 +529,7 @@ const SystemBackground = new Lang.Class({
|
|||||||
});
|
});
|
||||||
Signals.addSignalMethods(SystemBackground.prototype);
|
Signals.addSignalMethods(SystemBackground.prototype);
|
||||||
|
|
||||||
const BackgroundSource = new Lang.Class({
|
var BackgroundSource = new Lang.Class({
|
||||||
Name: 'BackgroundSource',
|
Name: 'BackgroundSource',
|
||||||
|
|
||||||
_init: function(layoutManager, settingsSchema) {
|
_init: function(layoutManager, settingsSchema) {
|
||||||
@ -583,7 +617,7 @@ const BackgroundSource = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const Animation = new Lang.Class({
|
var Animation = new Lang.Class({
|
||||||
Name: 'Animation',
|
Name: 'Animation',
|
||||||
|
|
||||||
_init: function(params) {
|
_init: function(params) {
|
||||||
@ -631,7 +665,7 @@ const Animation = new Lang.Class({
|
|||||||
});
|
});
|
||||||
Signals.addSignalMethods(Animation.prototype);
|
Signals.addSignalMethods(Animation.prototype);
|
||||||
|
|
||||||
const BackgroundManager = new Lang.Class({
|
var BackgroundManager = new Lang.Class({
|
||||||
Name: 'BackgroundManager',
|
Name: 'BackgroundManager',
|
||||||
|
|
||||||
_init: function(params) {
|
_init: function(params) {
|
||||||
@ -683,6 +717,7 @@ const BackgroundManager = new Lang.Class({
|
|||||||
time: FADE_ANIMATION_TIME,
|
time: FADE_ANIMATION_TIME,
|
||||||
transition: 'easeOutQuad',
|
transition: 'easeOutQuad',
|
||||||
onComplete: function() {
|
onComplete: function() {
|
||||||
|
oldBackgroundActor.background.run_dispose();
|
||||||
oldBackgroundActor.destroy();
|
oldBackgroundActor.destroy();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -9,16 +9,17 @@ const BoxPointer = imports.ui.boxpointer;
|
|||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const PopupMenu = imports.ui.popupMenu;
|
const PopupMenu = imports.ui.popupMenu;
|
||||||
|
|
||||||
const BackgroundMenu = new Lang.Class({
|
var BackgroundMenu = new Lang.Class({
|
||||||
Name: 'BackgroundMenu',
|
Name: 'BackgroundMenu',
|
||||||
Extends: PopupMenu.PopupMenu,
|
Extends: PopupMenu.PopupMenu,
|
||||||
|
|
||||||
_init: function(layoutManager) {
|
_init: function(layoutManager) {
|
||||||
this.parent(layoutManager.dummyCursor, 0, St.Side.TOP);
|
this.parent(layoutManager.dummyCursor, 0, St.Side.TOP);
|
||||||
|
|
||||||
this.addSettingsAction(_("Settings"), 'gnome-control-center.desktop');
|
|
||||||
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
|
||||||
this.addSettingsAction(_("Change Background…"), 'gnome-background-panel.desktop');
|
this.addSettingsAction(_("Change Background…"), 'gnome-background-panel.desktop');
|
||||||
|
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
||||||
|
this.addSettingsAction(_("Display Settings"), 'gnome-display-panel.desktop');
|
||||||
|
this.addSettingsAction(_("Settings"), 'gnome-control-center.desktop');
|
||||||
|
|
||||||
this.actor.add_style_class_name('background-menu');
|
this.actor.add_style_class_name('background-menu');
|
||||||
|
|
||||||
|
@ -10,14 +10,14 @@ const St = imports.gi.St;
|
|||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const Tweener = imports.ui.tweener;
|
const Tweener = imports.ui.tweener;
|
||||||
|
|
||||||
const PopupAnimation = {
|
var PopupAnimation = {
|
||||||
NONE: 0,
|
NONE: 0,
|
||||||
SLIDE: 1 << 0,
|
SLIDE: 1 << 0,
|
||||||
FADE: 1 << 1,
|
FADE: 1 << 1,
|
||||||
FULL: ~0,
|
FULL: ~0,
|
||||||
};
|
};
|
||||||
|
|
||||||
const POPUP_ANIMATION_TIME = 0.15;
|
var POPUP_ANIMATION_TIME = 0.15;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* BoxPointer:
|
* BoxPointer:
|
||||||
@ -32,7 +32,7 @@ const POPUP_ANIMATION_TIME = 0.15;
|
|||||||
* totally inside the monitor if possible.
|
* totally inside the monitor if possible.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
const BoxPointer = new Lang.Class({
|
var BoxPointer = new Lang.Class({
|
||||||
Name: 'BoxPointer',
|
Name: 'BoxPointer',
|
||||||
|
|
||||||
_init: function(arrowSide, binProperties) {
|
_init: function(arrowSide, binProperties) {
|
||||||
@ -587,7 +587,10 @@ const BoxPointer = new Lang.Class({
|
|||||||
_calculateArrowSide: function(arrowSide) {
|
_calculateArrowSide: function(arrowSide) {
|
||||||
let sourceAllocation = Shell.util_get_transformed_allocation(this._sourceActor);
|
let sourceAllocation = Shell.util_get_transformed_allocation(this._sourceActor);
|
||||||
let [minWidth, minHeight, boxWidth, boxHeight] = this._container.get_preferred_size();
|
let [minWidth, minHeight, boxWidth, boxHeight] = this._container.get_preferred_size();
|
||||||
let monitor = Main.layoutManager.findMonitorForActor(this.actor);
|
let monitorActor = this.sourceActor;
|
||||||
|
if (!monitorActor)
|
||||||
|
monitorActor = this.actor;
|
||||||
|
let monitor = Main.layoutManager.findMonitorForActor(monitorActor);
|
||||||
|
|
||||||
switch (arrowSide) {
|
switch (arrowSide) {
|
||||||
case St.Side.TOP:
|
case St.Side.TOP:
|
||||||
|
@ -4,7 +4,7 @@ const St = imports.gi.St;
|
|||||||
|
|
||||||
const Lang = imports.lang;
|
const Lang = imports.lang;
|
||||||
|
|
||||||
const CheckBox = new Lang.Class({
|
var CheckBox = new Lang.Class({
|
||||||
Name: 'CheckBox',
|
Name: 'CheckBox',
|
||||||
|
|
||||||
_init: function(label) {
|
_init: function(label) {
|
||||||
|
138
js/ui/closeDialog.js
Normal file
@ -0,0 +1,138 @@
|
|||||||
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
|
||||||
|
const Clutter = imports.gi.Clutter;
|
||||||
|
const Gio = imports.gi.Gio;
|
||||||
|
const GObject = imports.gi.GObject;
|
||||||
|
const Lang = imports.lang;
|
||||||
|
const Meta = imports.gi.Meta;
|
||||||
|
const Shell = imports.gi.Shell;
|
||||||
|
|
||||||
|
const Dialog = imports.ui.dialog;
|
||||||
|
const Main = imports.ui.main;
|
||||||
|
const Tweener = imports.ui.tweener;
|
||||||
|
|
||||||
|
var FROZEN_WINDOW_BRIGHTNESS = -0.3
|
||||||
|
var DIALOG_TRANSITION_TIME = 0.15
|
||||||
|
|
||||||
|
var CloseDialog = new Lang.Class({
|
||||||
|
Name: 'CloseDialog',
|
||||||
|
Extends: GObject.Object,
|
||||||
|
Implements: [ Meta.CloseDialog ],
|
||||||
|
Properties: {
|
||||||
|
'window': GObject.ParamSpec.override('window', Meta.CloseDialog)
|
||||||
|
},
|
||||||
|
|
||||||
|
_init: function (window) {
|
||||||
|
this.parent();
|
||||||
|
this._window = window;
|
||||||
|
this._dialog = null;
|
||||||
|
},
|
||||||
|
|
||||||
|
get window() {
|
||||||
|
return this._window;
|
||||||
|
},
|
||||||
|
|
||||||
|
set window(window) {
|
||||||
|
this._window = window;
|
||||||
|
},
|
||||||
|
|
||||||
|
_createDialogContent: function () {
|
||||||
|
let tracker = Shell.WindowTracker.get_default();
|
||||||
|
let windowApp = tracker.get_window_app(this._window);
|
||||||
|
|
||||||
|
/* Translators: %s is an application name */
|
||||||
|
let title = _("“%s” is not responding.").format(windowApp.get_name());
|
||||||
|
let subtitle = _("You may choose to wait a short while for it to " +
|
||||||
|
"continue or force the application to quit entirely.");
|
||||||
|
let icon = new Gio.ThemedIcon({ name: 'dialog-warning-symbolic' });
|
||||||
|
return new Dialog.MessageDialogContent({ icon, title, subtitle });
|
||||||
|
},
|
||||||
|
|
||||||
|
_initDialog: function () {
|
||||||
|
if (this._dialog)
|
||||||
|
return;
|
||||||
|
|
||||||
|
let windowActor = this._window.get_compositor_private();
|
||||||
|
this._dialog = new Dialog.Dialog(windowActor, 'close-dialog');
|
||||||
|
this._dialog.width = windowActor.width;
|
||||||
|
this._dialog.height = windowActor.height;
|
||||||
|
|
||||||
|
this._dialog.addContent(this._createDialogContent());
|
||||||
|
this._dialog.addButton({ label: _('Force Quit'),
|
||||||
|
action: Lang.bind(this, this._onClose),
|
||||||
|
default: true });
|
||||||
|
this._dialog.addButton({ label: _('Wait'),
|
||||||
|
action: Lang.bind(this, this._onWait),
|
||||||
|
key: Clutter.Escape });
|
||||||
|
|
||||||
|
global.focus_manager.add_group(this._dialog);
|
||||||
|
},
|
||||||
|
|
||||||
|
_addWindowEffect: function () {
|
||||||
|
// We set the effect on the surface actor, so the dialog itself
|
||||||
|
// (which is a child of the MetaWindowActor) does not get the
|
||||||
|
// effect applied itself.
|
||||||
|
let windowActor = this._window.get_compositor_private();
|
||||||
|
let surfaceActor = windowActor.get_first_child();
|
||||||
|
let effect = new Clutter.BrightnessContrastEffect();
|
||||||
|
effect.set_brightness(FROZEN_WINDOW_BRIGHTNESS);
|
||||||
|
surfaceActor.add_effect_with_name("gnome-shell-frozen-window", effect);
|
||||||
|
},
|
||||||
|
|
||||||
|
_removeWindowEffect: function () {
|
||||||
|
let windowActor = this._window.get_compositor_private();
|
||||||
|
let surfaceActor = windowActor.get_first_child();
|
||||||
|
surfaceActor.remove_effect_by_name("gnome-shell-frozen-window");
|
||||||
|
},
|
||||||
|
|
||||||
|
_onWait: function () {
|
||||||
|
this.response(Meta.CloseDialogResponse.WAIT);
|
||||||
|
},
|
||||||
|
|
||||||
|
_onClose: function () {
|
||||||
|
this.response(Meta.CloseDialogResponse.FORCE_CLOSE);
|
||||||
|
},
|
||||||
|
|
||||||
|
vfunc_show: function () {
|
||||||
|
if (this._dialog != null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this._addWindowEffect();
|
||||||
|
this._initDialog();
|
||||||
|
|
||||||
|
this._dialog.scale_y = 0;
|
||||||
|
this._dialog.set_pivot_point(0.5, 0.5);
|
||||||
|
|
||||||
|
Tweener.addTween(this._dialog,
|
||||||
|
{ scale_y: 1,
|
||||||
|
transition: 'linear',
|
||||||
|
time: DIALOG_TRANSITION_TIME,
|
||||||
|
onComplete: Lang.bind(this, function () {
|
||||||
|
Main.layoutManager.trackChrome(this._dialog, { affectsInputRegion: true });
|
||||||
|
})
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
vfunc_hide: function () {
|
||||||
|
if (this._dialog == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
let dialog = this._dialog;
|
||||||
|
this._dialog = null;
|
||||||
|
this._removeWindowEffect();
|
||||||
|
|
||||||
|
Tweener.addTween(dialog,
|
||||||
|
{ scale_y: 0,
|
||||||
|
transition: 'linear',
|
||||||
|
time: DIALOG_TRANSITION_TIME,
|
||||||
|
onComplete: Lang.bind(this, function () {
|
||||||
|
dialog.destroy();
|
||||||
|
})
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
vfunc_focus: function () {
|
||||||
|
if (this._dialog)
|
||||||
|
this._dialog.grab_key_focus();
|
||||||
|
}
|
||||||
|
});
|
@ -2,7 +2,7 @@
|
|||||||
const Lang = imports.lang;
|
const Lang = imports.lang;
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
|
|
||||||
const ComponentManager = new Lang.Class({
|
var ComponentManager = new Lang.Class({
|
||||||
Name: 'ComponentManager',
|
Name: 'ComponentManager',
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
|
@ -11,15 +11,15 @@ const GnomeSession = imports.misc.gnomeSession;
|
|||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const ShellMountOperation = imports.ui.shellMountOperation;
|
const ShellMountOperation = imports.ui.shellMountOperation;
|
||||||
|
|
||||||
const GNOME_SESSION_AUTOMOUNT_INHIBIT = 16;
|
var GNOME_SESSION_AUTOMOUNT_INHIBIT = 16;
|
||||||
|
|
||||||
// GSettings keys
|
// GSettings keys
|
||||||
const SETTINGS_SCHEMA = 'org.gnome.desktop.media-handling';
|
const SETTINGS_SCHEMA = 'org.gnome.desktop.media-handling';
|
||||||
const SETTING_ENABLE_AUTOMOUNT = 'automount';
|
const SETTING_ENABLE_AUTOMOUNT = 'automount';
|
||||||
|
|
||||||
const AUTORUN_EXPIRE_TIMEOUT_SECS = 10;
|
var AUTORUN_EXPIRE_TIMEOUT_SECS = 10;
|
||||||
|
|
||||||
const AutomountManager = new Lang.Class({
|
var AutomountManager = new Lang.Class({
|
||||||
Name: 'AutomountManager',
|
Name: 'AutomountManager',
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
@ -242,4 +242,4 @@ const AutomountManager = new Lang.Class({
|
|||||||
GLib.Source.set_name_by_id(id, '[gnome-shell] volume.allowAutorun');
|
GLib.Source.set_name_by_id(id, '[gnome-shell] volume.allowAutorun');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
const Component = AutomountManager;
|
var Component = AutomountManager;
|
||||||
|
@ -7,7 +7,6 @@ const St = imports.gi.St;
|
|||||||
const GnomeSession = imports.misc.gnomeSession;
|
const GnomeSession = imports.misc.gnomeSession;
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const MessageTray = imports.ui.messageTray;
|
const MessageTray = imports.ui.messageTray;
|
||||||
const ShellMountOperation = imports.ui.shellMountOperation;
|
|
||||||
|
|
||||||
// GSettings keys
|
// GSettings keys
|
||||||
const SETTINGS_SCHEMA = 'org.gnome.desktop.media-handling';
|
const SETTINGS_SCHEMA = 'org.gnome.desktop.media-handling';
|
||||||
@ -16,7 +15,7 @@ const SETTING_START_APP = 'autorun-x-content-start-app';
|
|||||||
const SETTING_IGNORE = 'autorun-x-content-ignore';
|
const SETTING_IGNORE = 'autorun-x-content-ignore';
|
||||||
const SETTING_OPEN_FOLDER = 'autorun-x-content-open-folder';
|
const SETTING_OPEN_FOLDER = 'autorun-x-content-open-folder';
|
||||||
|
|
||||||
const AutorunSetting = {
|
var AutorunSetting = {
|
||||||
RUN: 0,
|
RUN: 0,
|
||||||
IGNORE: 1,
|
IGNORE: 1,
|
||||||
FILES: 2,
|
FILES: 2,
|
||||||
@ -64,7 +63,7 @@ function startAppForMount(app, mount) {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
retval = app.launch(files,
|
retval = app.launch(files,
|
||||||
global.create_app_launch_context(0, -1))
|
global.create_app_launch_context(0, -1));
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
log('Unable to launch the application ' + app.get_name()
|
log('Unable to launch the application ' + app.get_name()
|
||||||
+ ': ' + e.toString());
|
+ ': ' + e.toString());
|
||||||
@ -91,7 +90,7 @@ function HotplugSniffer() {
|
|||||||
'/org/gnome/Shell/HotplugSniffer');
|
'/org/gnome/Shell/HotplugSniffer');
|
||||||
}
|
}
|
||||||
|
|
||||||
const ContentTypeDiscoverer = new Lang.Class({
|
var ContentTypeDiscoverer = new Lang.Class({
|
||||||
Name: 'ContentTypeDiscoverer',
|
Name: 'ContentTypeDiscoverer',
|
||||||
|
|
||||||
_init: function(callback) {
|
_init: function(callback) {
|
||||||
@ -160,7 +159,7 @@ const ContentTypeDiscoverer = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const AutorunManager = new Lang.Class({
|
var AutorunManager = new Lang.Class({
|
||||||
Name: 'AutorunManager',
|
Name: 'AutorunManager',
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
@ -197,7 +196,7 @@ const AutorunManager = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const AutorunDispatcher = new Lang.Class({
|
var AutorunDispatcher = new Lang.Class({
|
||||||
Name: 'AutorunDispatcher',
|
Name: 'AutorunDispatcher',
|
||||||
|
|
||||||
_init: function(manager) {
|
_init: function(manager) {
|
||||||
@ -256,7 +255,11 @@ const AutorunDispatcher = new Lang.Class({
|
|||||||
if (!shouldAutorunMount(mount))
|
if (!shouldAutorunMount(mount))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
let setting = this._getAutorunSettingForType(contentTypes[0]);
|
let setting;
|
||||||
|
if (contentTypes.length > 0)
|
||||||
|
setting = this._getAutorunSettingForType(contentTypes[0]);
|
||||||
|
else
|
||||||
|
setting = AutorunSetting.ASK;
|
||||||
|
|
||||||
// check at the settings for the first content type
|
// check at the settings for the first content type
|
||||||
// to see whether we should ask
|
// to see whether we should ask
|
||||||
@ -293,7 +296,7 @@ const AutorunDispatcher = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const AutorunSource = new Lang.Class({
|
var AutorunSource = new Lang.Class({
|
||||||
Name: 'AutorunSource',
|
Name: 'AutorunSource',
|
||||||
Extends: MessageTray.Source,
|
Extends: MessageTray.Source,
|
||||||
|
|
||||||
@ -313,10 +316,14 @@ const AutorunSource = new Lang.Class({
|
|||||||
|
|
||||||
getIcon: function() {
|
getIcon: function() {
|
||||||
return this.mount.get_icon();
|
return this.mount.get_icon();
|
||||||
|
},
|
||||||
|
|
||||||
|
_createPolicy: function() {
|
||||||
|
return new MessageTray.NotificationApplicationPolicy('org.gnome.Nautilus');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const AutorunNotification = new Lang.Class({
|
var AutorunNotification = new Lang.Class({
|
||||||
Name: 'AutorunNotification',
|
Name: 'AutorunNotification',
|
||||||
Extends: MessageTray.Notification,
|
Extends: MessageTray.Notification,
|
||||||
|
|
||||||
@ -325,9 +332,6 @@ const AutorunNotification = new Lang.Class({
|
|||||||
|
|
||||||
this._manager = manager;
|
this._manager = manager;
|
||||||
this._mount = source.mount;
|
this._mount = source.mount;
|
||||||
|
|
||||||
// set the notification to urgent, so that it expands out
|
|
||||||
this.setUrgency(MessageTray.Urgency.CRITICAL);
|
|
||||||
},
|
},
|
||||||
|
|
||||||
createBanner: function() {
|
createBanner: function() {
|
||||||
@ -378,4 +382,4 @@ const AutorunNotification = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const Component = AutorunManager;
|
var Component = AutorunManager;
|
||||||
|
@ -9,11 +9,18 @@ const Gio = imports.gi.Gio;
|
|||||||
const GObject = imports.gi.GObject;
|
const GObject = imports.gi.GObject;
|
||||||
const Gcr = imports.gi.Gcr;
|
const Gcr = imports.gi.Gcr;
|
||||||
|
|
||||||
|
const Animation = imports.ui.animation;
|
||||||
|
const Dialog = imports.ui.dialog;
|
||||||
const ModalDialog = imports.ui.modalDialog;
|
const ModalDialog = imports.ui.modalDialog;
|
||||||
const ShellEntry = imports.ui.shellEntry;
|
const ShellEntry = imports.ui.shellEntry;
|
||||||
const CheckBox = imports.ui.checkBox;
|
const CheckBox = imports.ui.checkBox;
|
||||||
|
const Tweener = imports.ui.tweener;
|
||||||
|
|
||||||
const KeyringDialog = new Lang.Class({
|
var WORK_SPINNER_ICON_SIZE = 16;
|
||||||
|
var WORK_SPINNER_ANIMATION_DELAY = 1.0;
|
||||||
|
var WORK_SPINNER_ANIMATION_TIME = 0.3;
|
||||||
|
|
||||||
|
var KeyringDialog = new Lang.Class({
|
||||||
Name: 'KeyringDialog',
|
Name: 'KeyringDialog',
|
||||||
Extends: ModalDialog.ModalDialog,
|
Extends: ModalDialog.ModalDialog,
|
||||||
|
|
||||||
@ -25,60 +32,66 @@ const KeyringDialog = new Lang.Class({
|
|||||||
this.prompt.connect('show-confirm', Lang.bind(this, this._onShowConfirm));
|
this.prompt.connect('show-confirm', Lang.bind(this, this._onShowConfirm));
|
||||||
this.prompt.connect('prompt-close', Lang.bind(this, this._onHidePrompt));
|
this.prompt.connect('prompt-close', Lang.bind(this, this._onHidePrompt));
|
||||||
|
|
||||||
let mainContentBox = new St.BoxLayout({ style_class: 'prompt-dialog-main-layout',
|
let icon = new Gio.ThemedIcon({ name: 'dialog-password-symbolic' });
|
||||||
vertical: false });
|
this._content = new Dialog.MessageDialogContent({ icon });
|
||||||
this.contentLayout.add(mainContentBox);
|
this.contentLayout.add(this._content);
|
||||||
|
|
||||||
let icon = new St.Icon({ icon_name: 'dialog-password-symbolic' });
|
// FIXME: Why does this break now?
|
||||||
mainContentBox.add(icon,
|
/*
|
||||||
{ x_fill: true,
|
this.prompt.bind_property('message', this._content, 'title', GObject.BindingFlags.SYNC_CREATE);
|
||||||
y_fill: false,
|
this.prompt.bind_property('description', this._content, 'body', GObject.BindingFlags.SYNC_CREATE);
|
||||||
x_align: St.Align.END,
|
*/
|
||||||
y_align: St.Align.START });
|
this.prompt.connect('notify::message', () => {
|
||||||
|
this._content.title = this.prompt.message;
|
||||||
|
});
|
||||||
|
this._content.title = this.prompt.message;
|
||||||
|
|
||||||
this._messageBox = new St.BoxLayout({ style_class: 'prompt-dialog-message-layout',
|
this.prompt.connect('notify::description', () => {
|
||||||
vertical: true });
|
this._content.body = this.prompt.description;
|
||||||
mainContentBox.add(this._messageBox,
|
});
|
||||||
{ y_align: St.Align.START, expand: true, x_fill: true, y_fill: true });
|
this._content.body = this.prompt.description;
|
||||||
|
|
||||||
let subject = new St.Label({ style_class: 'prompt-dialog-headline headline' });
|
|
||||||
this.prompt.bind_property('message', subject, 'text', GObject.BindingFlags.SYNC_CREATE);
|
|
||||||
|
|
||||||
this._messageBox.add(subject,
|
|
||||||
{ x_fill: false,
|
|
||||||
y_fill: false,
|
|
||||||
x_align: St.Align.START,
|
|
||||||
y_align: St.Align.START });
|
|
||||||
|
|
||||||
let description = new St.Label({ style_class: 'prompt-dialog-description' });
|
|
||||||
description.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
|
||||||
description.clutter_text.line_wrap = true;
|
|
||||||
this.prompt.bind_property('description', description, 'text', GObject.BindingFlags.SYNC_CREATE);
|
|
||||||
this._messageBox.add(description,
|
|
||||||
{ y_fill: true,
|
|
||||||
y_align: St.Align.START });
|
|
||||||
|
|
||||||
|
this._workSpinner = null;
|
||||||
this._controlTable = null;
|
this._controlTable = null;
|
||||||
|
|
||||||
|
|
||||||
this._cancelButton = this.addButton({ label: '',
|
this._cancelButton = this.addButton({ label: '',
|
||||||
action: Lang.bind(this, this._onCancelButton),
|
action: Lang.bind(this, this._onCancelButton),
|
||||||
key: Clutter.Escape },
|
key: Clutter.Escape });
|
||||||
{ expand: true, x_fill: false, x_align: St.Align.START });
|
|
||||||
this.placeSpinner({ expand: false,
|
|
||||||
x_fill: false,
|
|
||||||
y_fill: false,
|
|
||||||
x_align: St.Align.END,
|
|
||||||
y_align: St.Align.MIDDLE });
|
|
||||||
this._continueButton = this.addButton({ label: '',
|
this._continueButton = this.addButton({ label: '',
|
||||||
action: Lang.bind(this, this._onContinueButton),
|
action: Lang.bind(this, this._onContinueButton),
|
||||||
default: true },
|
default: true });
|
||||||
{ expand: false, x_fill: false, x_align: St.Align.END });
|
|
||||||
|
|
||||||
this.prompt.bind_property('cancel-label', this._cancelButton, 'label', GObject.BindingFlags.SYNC_CREATE);
|
this.prompt.bind_property('cancel-label', this._cancelButton, 'label', GObject.BindingFlags.SYNC_CREATE);
|
||||||
this.prompt.bind_property('continue-label', this._continueButton, 'label', GObject.BindingFlags.SYNC_CREATE);
|
this.prompt.bind_property('continue-label', this._continueButton, 'label', GObject.BindingFlags.SYNC_CREATE);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_setWorking: function(working) {
|
||||||
|
if (!this._workSpinner)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Tweener.removeTweens(this._workSpinner.actor);
|
||||||
|
if (working) {
|
||||||
|
this._workSpinner.play();
|
||||||
|
Tweener.addTween(this._workSpinner.actor,
|
||||||
|
{ opacity: 255,
|
||||||
|
delay: WORK_SPINNER_ANIMATION_DELAY,
|
||||||
|
time: WORK_SPINNER_ANIMATION_TIME,
|
||||||
|
transition: 'linear'
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
Tweener.addTween(this._workSpinner.actor,
|
||||||
|
{ opacity: 0,
|
||||||
|
time: WORK_SPINNER_ANIMATION_TIME,
|
||||||
|
transition: 'linear',
|
||||||
|
onCompleteScope: this,
|
||||||
|
onComplete: function() {
|
||||||
|
if (this._workSpinner)
|
||||||
|
this._workSpinner.stop();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
_buildControlTable: function() {
|
_buildControlTable: function() {
|
||||||
let layout = new Clutter.GridLayout({ orientation: Clutter.Orientation.VERTICAL });
|
let layout = new Clutter.GridLayout({ orientation: Clutter.Orientation.VERTICAL });
|
||||||
let table = new St.Widget({ style_class: 'keyring-dialog-control-table',
|
let table = new St.Widget({ style_class: 'keyring-dialog-control-table',
|
||||||
@ -101,15 +114,22 @@ const KeyringDialog = new Lang.Class({
|
|||||||
ShellEntry.addContextMenu(this._passwordEntry, { isPassword: true });
|
ShellEntry.addContextMenu(this._passwordEntry, { isPassword: true });
|
||||||
this._passwordEntry.clutter_text.connect('activate', Lang.bind(this, this._onPasswordActivate));
|
this._passwordEntry.clutter_text.connect('activate', Lang.bind(this, this._onPasswordActivate));
|
||||||
|
|
||||||
|
let spinnerIcon = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/process-working.svg');
|
||||||
|
this._workSpinner = new Animation.AnimatedIcon(spinnerIcon, WORK_SPINNER_ICON_SIZE);
|
||||||
|
this._workSpinner.actor.opacity = 0;
|
||||||
|
|
||||||
if (rtl) {
|
if (rtl) {
|
||||||
layout.attach(this._passwordEntry, 0, row, 1, 1);
|
layout.attach(this._workSpinner.actor, 0, row, 1, 1);
|
||||||
layout.attach(label, 1, row, 1, 1);
|
layout.attach(this._passwordEntry, 1, row, 1, 1);
|
||||||
|
layout.attach(label, 2, row, 1, 1);
|
||||||
} else {
|
} else {
|
||||||
layout.attach(label, 0, row, 1, 1);
|
layout.attach(label, 0, row, 1, 1);
|
||||||
layout.attach(this._passwordEntry, 1, row, 1, 1);
|
layout.attach(this._passwordEntry, 1, row, 1, 1);
|
||||||
|
layout.attach(this._workSpinner.actor, 2, row, 1, 1);
|
||||||
}
|
}
|
||||||
row++;
|
row++;
|
||||||
} else {
|
} else {
|
||||||
|
this._workSpinner = null;
|
||||||
this._passwordEntry = null;
|
this._passwordEntry = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -162,7 +182,7 @@ const KeyringDialog = new Lang.Class({
|
|||||||
}
|
}
|
||||||
|
|
||||||
this._controlTable = table;
|
this._controlTable = table;
|
||||||
this._messageBox.add(table, { x_fill: true, y_fill: true });
|
this._content.messageBox.add(table, { x_fill: true, y_fill: true });
|
||||||
},
|
},
|
||||||
|
|
||||||
_updateSensitivity: function(sensitive) {
|
_updateSensitivity: function(sensitive) {
|
||||||
@ -178,7 +198,7 @@ const KeyringDialog = new Lang.Class({
|
|||||||
|
|
||||||
this._continueButton.can_focus = sensitive;
|
this._continueButton.can_focus = sensitive;
|
||||||
this._continueButton.reactive = sensitive;
|
this._continueButton.reactive = sensitive;
|
||||||
this.setWorking(!sensitive);
|
this._setWorking(!sensitive);
|
||||||
},
|
},
|
||||||
|
|
||||||
_ensureOpen: function() {
|
_ensureOpen: function() {
|
||||||
@ -238,7 +258,7 @@ const KeyringDialog = new Lang.Class({
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
const KeyringDummyDialog = new Lang.Class({
|
var KeyringDummyDialog = new Lang.Class({
|
||||||
Name: 'KeyringDummyDialog',
|
Name: 'KeyringDummyDialog',
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
@ -254,7 +274,7 @@ const KeyringDummyDialog = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const KeyringPrompter = new Lang.Class({
|
var KeyringPrompter = new Lang.Class({
|
||||||
Name: 'KeyringPrompter',
|
Name: 'KeyringPrompter',
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
@ -291,4 +311,4 @@ const KeyringPrompter = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const Component = KeyringPrompter;
|
var Component = KeyringPrompter;
|
||||||
|
@ -12,6 +12,7 @@ const Shell = imports.gi.Shell;
|
|||||||
const St = imports.gi.St;
|
const St = imports.gi.St;
|
||||||
|
|
||||||
const Config = imports.misc.config;
|
const Config = imports.misc.config;
|
||||||
|
const Dialog = imports.ui.dialog;
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const MessageTray = imports.ui.messageTray;
|
const MessageTray = imports.ui.messageTray;
|
||||||
const ModalDialog = imports.ui.modalDialog;
|
const ModalDialog = imports.ui.modalDialog;
|
||||||
@ -20,7 +21,7 @@ const ShellEntry = imports.ui.shellEntry;
|
|||||||
|
|
||||||
const VPN_UI_GROUP = 'VPN Plugin UI';
|
const VPN_UI_GROUP = 'VPN Plugin UI';
|
||||||
|
|
||||||
const NetworkSecretDialog = new Lang.Class({
|
var NetworkSecretDialog = new Lang.Class({
|
||||||
Name: 'NetworkSecretDialog',
|
Name: 'NetworkSecretDialog',
|
||||||
Extends: ModalDialog.ModalDialog,
|
Extends: ModalDialog.ModalDialog,
|
||||||
|
|
||||||
@ -38,41 +39,12 @@ const NetworkSecretDialog = new Lang.Class({
|
|||||||
else
|
else
|
||||||
this._content = this._getContent();
|
this._content = this._getContent();
|
||||||
|
|
||||||
let mainContentBox = new St.BoxLayout({ style_class: 'prompt-dialog-main-layout',
|
let icon = new Gio.ThemedIcon({ name: 'dialog-password-symbolic' });
|
||||||
vertical: false });
|
let contentParams = { icon,
|
||||||
this.contentLayout.add(mainContentBox,
|
title: this._content.title,
|
||||||
{ x_fill: true,
|
body: this._content.message };
|
||||||
y_fill: true });
|
let contentBox = new Dialog.MessageDialogContent(contentParams);
|
||||||
|
this.contentLayout.add_actor(contentBox);
|
||||||
let icon = new St.Icon({ icon_name: 'dialog-password-symbolic' });
|
|
||||||
mainContentBox.add(icon,
|
|
||||||
{ x_fill: true,
|
|
||||||
y_fill: false,
|
|
||||||
x_align: St.Align.END,
|
|
||||||
y_align: St.Align.START });
|
|
||||||
|
|
||||||
let messageBox = new St.BoxLayout({ style_class: 'prompt-dialog-message-layout',
|
|
||||||
vertical: true });
|
|
||||||
mainContentBox.add(messageBox,
|
|
||||||
{ y_align: St.Align.START });
|
|
||||||
|
|
||||||
let subjectLabel = new St.Label({ style_class: 'prompt-dialog-headline headline',
|
|
||||||
text: this._content.title });
|
|
||||||
messageBox.add(subjectLabel,
|
|
||||||
{ y_fill: false,
|
|
||||||
y_align: St.Align.START });
|
|
||||||
|
|
||||||
if (this._content.message != null) {
|
|
||||||
let descriptionLabel = new St.Label({ style_class: 'prompt-dialog-description',
|
|
||||||
text: this._content.message });
|
|
||||||
descriptionLabel.clutter_text.line_wrap = true;
|
|
||||||
descriptionLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
|
||||||
|
|
||||||
messageBox.add(descriptionLabel,
|
|
||||||
{ y_fill: true,
|
|
||||||
y_align: St.Align.START,
|
|
||||||
expand: true });
|
|
||||||
}
|
|
||||||
|
|
||||||
let layout = new Clutter.GridLayout({ orientation: Clutter.Orientation.VERTICAL });
|
let layout = new Clutter.GridLayout({ orientation: Clutter.Orientation.VERTICAL });
|
||||||
let secretTable = new St.Widget({ style_class: 'network-dialog-secret-table',
|
let secretTable = new St.Widget({ style_class: 'network-dialog-secret-table',
|
||||||
@ -135,7 +107,7 @@ const NetworkSecretDialog = new Lang.Class({
|
|||||||
secret.entry.clutter_text.set_password_char('\u25cf');
|
secret.entry.clutter_text.set_password_char('\u25cf');
|
||||||
}
|
}
|
||||||
|
|
||||||
messageBox.add(secretTable);
|
contentBox.messageBox.add(secretTable);
|
||||||
|
|
||||||
this._okButton = { label: _("Connect"),
|
this._okButton = { label: _("Connect"),
|
||||||
action: Lang.bind(this, this._onOk),
|
action: Lang.bind(this, this._onOk),
|
||||||
@ -357,7 +329,7 @@ const NetworkSecretDialog = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const VPNRequestHandler = new Lang.Class({
|
var VPNRequestHandler = new Lang.Class({
|
||||||
Name: 'VPNRequestHandler',
|
Name: 'VPNRequestHandler',
|
||||||
|
|
||||||
_init: function(agent, requestId, authHelper, serviceType, connection, hints, flags) {
|
_init: function(agent, requestId, authHelper, serviceType, connection, hints, flags) {
|
||||||
@ -603,7 +575,7 @@ const VPNRequestHandler = new Lang.Class({
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
const NetworkAgent = new Lang.Class({
|
var NetworkAgent = new Lang.Class({
|
||||||
Name: 'NetworkAgent',
|
Name: 'NetworkAgent',
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
@ -615,6 +587,14 @@ const NetworkAgent = new Lang.Class({
|
|||||||
this._vpnRequests = { };
|
this._vpnRequests = { };
|
||||||
this._notifications = { };
|
this._notifications = { };
|
||||||
|
|
||||||
|
this._pluginDir = Gio.file_new_for_path(GLib.build_filenamev([Config.SYSCONFDIR, 'NetworkManager/VPN']));
|
||||||
|
try {
|
||||||
|
let monitor = this._pluginDir.monitor(Gio.FileMonitorFlags.NONE, null);
|
||||||
|
monitor.connect('changed', () => { this._vpnCacheBuilt = false; });
|
||||||
|
} catch(e) {
|
||||||
|
log('Failed to create monitor for VPN plugin dir: ' + e.message);
|
||||||
|
}
|
||||||
|
|
||||||
this._native.connect('new-request', Lang.bind(this, this._newRequest));
|
this._native.connect('new-request', Lang.bind(this, this._newRequest));
|
||||||
this._native.connect('cancel-request', Lang.bind(this, this._cancelRequest));
|
this._native.connect('cancel-request', Lang.bind(this, this._cancelRequest));
|
||||||
|
|
||||||
@ -765,9 +745,8 @@ const NetworkAgent = new Lang.Class({
|
|||||||
this._vpnCacheBuilt = true;
|
this._vpnCacheBuilt = true;
|
||||||
this._vpnBinaries = { };
|
this._vpnBinaries = { };
|
||||||
|
|
||||||
let dir = Gio.file_new_for_path(GLib.build_filenamev([Config.SYSCONFDIR, 'NetworkManager/VPN']));
|
|
||||||
try {
|
try {
|
||||||
let fileEnum = dir.enumerate_children('standard::name', Gio.FileQueryInfoFlags.NONE, null);
|
let fileEnum = this._pluginDir.enumerate_children('standard::name', Gio.FileQueryInfoFlags.NONE, null);
|
||||||
let info;
|
let info;
|
||||||
|
|
||||||
while ((info = fileEnum.next_file(null))) {
|
while ((info = fileEnum.next_file(null))) {
|
||||||
@ -777,7 +756,7 @@ const NetworkAgent = new Lang.Class({
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
let keyfile = new GLib.KeyFile();
|
let keyfile = new GLib.KeyFile();
|
||||||
keyfile.load_from_file(dir.get_child(name).get_path(), GLib.KeyFileFlags.NONE);
|
keyfile.load_from_file(this._pluginDir.get_child(name).get_path(), GLib.KeyFileFlags.NONE);
|
||||||
let service = keyfile.get_string('VPN Connection', 'service');
|
let service = keyfile.get_string('VPN Connection', 'service');
|
||||||
let binary = keyfile.get_string('GNOME', 'auth-dialog');
|
let binary = keyfile.get_string('GNOME', 'auth-dialog');
|
||||||
let externalUIMode = false;
|
let externalUIMode = false;
|
||||||
@ -796,13 +775,21 @@ const NetworkAgent = new Lang.Class({
|
|||||||
path = GLib.build_filenamev([Config.LIBEXECDIR, path]);
|
path = GLib.build_filenamev([Config.LIBEXECDIR, path]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GLib.file_test(path, GLib.FileTest.IS_EXECUTABLE))
|
if (GLib.file_test(path, GLib.FileTest.IS_EXECUTABLE)) {
|
||||||
this._vpnBinaries[service] = { fileName: path, externalUIMode: externalUIMode, supportsHints: hints };
|
this._vpnBinaries[service] = { fileName: path, externalUIMode: externalUIMode, supportsHints: hints };
|
||||||
else
|
try {
|
||||||
|
let aliases = keyfile.get_string_list('VPN Connection', 'aliases');
|
||||||
|
|
||||||
|
for (let alias of aliases) {
|
||||||
|
this._vpnBinaries[alias] = { fileName: path, externalUIMode: externalUIMode, supportsHints: hints };
|
||||||
|
}
|
||||||
|
} catch(e) { } // ignore errors if key does not exist
|
||||||
|
} else {
|
||||||
throw new Error('VPN plugin at %s is not executable'.format(path));
|
throw new Error('VPN plugin at %s is not executable'.format(path));
|
||||||
|
}
|
||||||
} catch(e) {
|
} catch(e) {
|
||||||
log('Error \'%s\' while processing VPN keyfile \'%s\''.
|
log('Error \'%s\' while processing VPN keyfile \'%s\''.
|
||||||
format(e.message, dir.get_child(name).get_path()));
|
format(e.message, this._pluginDir.get_child(name).get_path()));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -811,4 +798,4 @@ const NetworkAgent = new Lang.Class({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
const Component = NetworkAgent;
|
var Component = NetworkAgent;
|
||||||
|
@ -13,62 +13,37 @@ const Mainloop = imports.mainloop;
|
|||||||
const Polkit = imports.gi.Polkit;
|
const Polkit = imports.gi.Polkit;
|
||||||
const PolkitAgent = imports.gi.PolkitAgent;
|
const PolkitAgent = imports.gi.PolkitAgent;
|
||||||
|
|
||||||
|
const Animation = imports.ui.animation;
|
||||||
const Components = imports.ui.components;
|
const Components = imports.ui.components;
|
||||||
|
const Dialog = imports.ui.dialog;
|
||||||
const ModalDialog = imports.ui.modalDialog;
|
const ModalDialog = imports.ui.modalDialog;
|
||||||
const ShellEntry = imports.ui.shellEntry;
|
const ShellEntry = imports.ui.shellEntry;
|
||||||
const UserWidget = imports.ui.userWidget;
|
const UserWidget = imports.ui.userWidget;
|
||||||
|
const Tweener = imports.ui.tweener;
|
||||||
|
|
||||||
const DIALOG_ICON_SIZE = 48;
|
var DIALOG_ICON_SIZE = 48;
|
||||||
|
|
||||||
const AuthenticationDialog = new Lang.Class({
|
var WORK_SPINNER_ICON_SIZE = 16;
|
||||||
|
var WORK_SPINNER_ANIMATION_DELAY = 1.0;
|
||||||
|
var WORK_SPINNER_ANIMATION_TIME = 0.3;
|
||||||
|
|
||||||
|
var AuthenticationDialog = new Lang.Class({
|
||||||
Name: 'AuthenticationDialog',
|
Name: 'AuthenticationDialog',
|
||||||
Extends: ModalDialog.ModalDialog,
|
Extends: ModalDialog.ModalDialog,
|
||||||
|
|
||||||
_init: function(actionId, message, cookie, userNames) {
|
_init: function(actionId, body, cookie, userNames) {
|
||||||
this.parent({ styleClass: 'prompt-dialog' });
|
this.parent({ styleClass: 'prompt-dialog' });
|
||||||
|
|
||||||
this.actionId = actionId;
|
this.actionId = actionId;
|
||||||
this.message = message;
|
this.message = body;
|
||||||
this.userNames = userNames;
|
this.userNames = userNames;
|
||||||
this._wasDismissed = false;
|
this._wasDismissed = false;
|
||||||
|
|
||||||
let mainContentBox = new St.BoxLayout({ style_class: 'prompt-dialog-main-layout',
|
let icon = new Gio.ThemedIcon({ name: 'dialog-password-symbolic' });
|
||||||
vertical: false });
|
let title = _("Authentication Required");
|
||||||
this.contentLayout.add(mainContentBox,
|
|
||||||
{ x_fill: true,
|
|
||||||
y_fill: true });
|
|
||||||
|
|
||||||
let icon = new St.Icon({ icon_name: 'dialog-password-symbolic' });
|
let content = new Dialog.MessageDialogContent({ icon, title, body });
|
||||||
mainContentBox.add(icon,
|
this.contentLayout.add_actor(content);
|
||||||
{ x_fill: true,
|
|
||||||
y_fill: false,
|
|
||||||
x_align: St.Align.END,
|
|
||||||
y_align: St.Align.START });
|
|
||||||
|
|
||||||
let messageBox = new St.BoxLayout({ style_class: 'prompt-dialog-message-layout',
|
|
||||||
vertical: true });
|
|
||||||
mainContentBox.add(messageBox,
|
|
||||||
{ expand: true, y_align: St.Align.START });
|
|
||||||
|
|
||||||
this._subjectLabel = new St.Label({ style_class: 'prompt-dialog-headline headline',
|
|
||||||
text: _("Authentication Required") });
|
|
||||||
|
|
||||||
messageBox.add(this._subjectLabel,
|
|
||||||
{ x_fill: false,
|
|
||||||
y_fill: false,
|
|
||||||
x_align: St.Align.START,
|
|
||||||
y_align: St.Align.START });
|
|
||||||
|
|
||||||
this._descriptionLabel = new St.Label({ style_class: 'prompt-dialog-description',
|
|
||||||
text: message });
|
|
||||||
this._descriptionLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
|
||||||
this._descriptionLabel.clutter_text.line_wrap = true;
|
|
||||||
|
|
||||||
messageBox.add(this._descriptionLabel,
|
|
||||||
{ x_fill: false,
|
|
||||||
y_fill: true,
|
|
||||||
x_align: St.Align.START,
|
|
||||||
y_align: St.Align.START });
|
|
||||||
|
|
||||||
if (userNames.length > 1) {
|
if (userNames.length > 1) {
|
||||||
log('polkitAuthenticationAgent: Received ' + userNames.length +
|
log('polkitAuthenticationAgent: Received ' + userNames.length +
|
||||||
@ -99,12 +74,12 @@ const AuthenticationDialog = new Lang.Class({
|
|||||||
if (userIsRoot) {
|
if (userIsRoot) {
|
||||||
let userLabel = new St.Label(({ style_class: 'polkit-dialog-user-root-label',
|
let userLabel = new St.Label(({ style_class: 'polkit-dialog-user-root-label',
|
||||||
text: userRealName }));
|
text: userRealName }));
|
||||||
messageBox.add(userLabel, { x_fill: false,
|
content.messageBox.add(userLabel, { x_fill: false,
|
||||||
x_align: St.Align.START });
|
x_align: St.Align.START });
|
||||||
} else {
|
} else {
|
||||||
let userBox = new St.BoxLayout({ style_class: 'polkit-dialog-user-layout',
|
let userBox = new St.BoxLayout({ style_class: 'polkit-dialog-user-layout',
|
||||||
vertical: false });
|
vertical: false });
|
||||||
messageBox.add(userBox);
|
content.messageBox.add(userBox);
|
||||||
this._userAvatar = new UserWidget.Avatar(this._user,
|
this._userAvatar = new UserWidget.Avatar(this._user,
|
||||||
{ iconSize: DIALOG_ICON_SIZE,
|
{ iconSize: DIALOG_ICON_SIZE,
|
||||||
styleClass: 'polkit-dialog-user-icon' });
|
styleClass: 'polkit-dialog-user-icon' });
|
||||||
@ -126,7 +101,7 @@ const AuthenticationDialog = new Lang.Class({
|
|||||||
this._onUserChanged();
|
this._onUserChanged();
|
||||||
|
|
||||||
this._passwordBox = new St.BoxLayout({ vertical: false, style_class: 'prompt-dialog-password-box' });
|
this._passwordBox = new St.BoxLayout({ vertical: false, style_class: 'prompt-dialog-password-box' });
|
||||||
messageBox.add(this._passwordBox);
|
content.messageBox.add(this._passwordBox);
|
||||||
this._passwordLabel = new St.Label(({ style_class: 'prompt-dialog-password-label' }));
|
this._passwordLabel = new St.Label(({ style_class: 'prompt-dialog-password-label' }));
|
||||||
this._passwordBox.add(this._passwordLabel, { y_fill: false, y_align: St.Align.MIDDLE });
|
this._passwordBox.add(this._passwordLabel, { y_fill: false, y_align: St.Align.MIDDLE });
|
||||||
this._passwordEntry = new St.Entry({ style_class: 'prompt-dialog-password-entry',
|
this._passwordEntry = new St.Entry({ style_class: 'prompt-dialog-password-entry',
|
||||||
@ -136,19 +111,26 @@ const AuthenticationDialog = new Lang.Class({
|
|||||||
this._passwordEntry.clutter_text.connect('activate', Lang.bind(this, this._onEntryActivate));
|
this._passwordEntry.clutter_text.connect('activate', Lang.bind(this, this._onEntryActivate));
|
||||||
this._passwordBox.add(this._passwordEntry,
|
this._passwordBox.add(this._passwordEntry,
|
||||||
{ expand: true });
|
{ expand: true });
|
||||||
|
|
||||||
|
let spinnerIcon = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/process-working.svg');
|
||||||
|
this._workSpinner = new Animation.AnimatedIcon(spinnerIcon, WORK_SPINNER_ICON_SIZE);
|
||||||
|
this._workSpinner.actor.opacity = 0;
|
||||||
|
|
||||||
|
this._passwordBox.add(this._workSpinner.actor);
|
||||||
|
|
||||||
this.setInitialKeyFocus(this._passwordEntry);
|
this.setInitialKeyFocus(this._passwordEntry);
|
||||||
this._passwordBox.hide();
|
this._passwordBox.hide();
|
||||||
|
|
||||||
this._errorMessageLabel = new St.Label({ style_class: 'prompt-dialog-error-label' });
|
this._errorMessageLabel = new St.Label({ style_class: 'prompt-dialog-error-label' });
|
||||||
this._errorMessageLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
this._errorMessageLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
||||||
this._errorMessageLabel.clutter_text.line_wrap = true;
|
this._errorMessageLabel.clutter_text.line_wrap = true;
|
||||||
messageBox.add(this._errorMessageLabel, { x_fill: false, x_align: St.Align.START });
|
content.messageBox.add(this._errorMessageLabel, { x_fill: false, x_align: St.Align.START });
|
||||||
this._errorMessageLabel.hide();
|
this._errorMessageLabel.hide();
|
||||||
|
|
||||||
this._infoMessageLabel = new St.Label({ style_class: 'prompt-dialog-info-label' });
|
this._infoMessageLabel = new St.Label({ style_class: 'prompt-dialog-info-label' });
|
||||||
this._infoMessageLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
this._infoMessageLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
||||||
this._infoMessageLabel.clutter_text.line_wrap = true;
|
this._infoMessageLabel.clutter_text.line_wrap = true;
|
||||||
messageBox.add(this._infoMessageLabel);
|
content.messageBox.add(this._infoMessageLabel);
|
||||||
this._infoMessageLabel.hide();
|
this._infoMessageLabel.hide();
|
||||||
|
|
||||||
/* text is intentionally non-blank otherwise the height is not the same as for
|
/* text is intentionally non-blank otherwise the height is not the same as for
|
||||||
@ -160,22 +142,15 @@ const AuthenticationDialog = new Lang.Class({
|
|||||||
this._nullMessageLabel.add_style_class_name('hidden');
|
this._nullMessageLabel.add_style_class_name('hidden');
|
||||||
this._nullMessageLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
this._nullMessageLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
||||||
this._nullMessageLabel.clutter_text.line_wrap = true;
|
this._nullMessageLabel.clutter_text.line_wrap = true;
|
||||||
messageBox.add(this._nullMessageLabel);
|
content.messageBox.add(this._nullMessageLabel);
|
||||||
this._nullMessageLabel.show();
|
this._nullMessageLabel.show();
|
||||||
|
|
||||||
this._cancelButton = this.addButton({ label: _("Cancel"),
|
this._cancelButton = this.addButton({ label: _("Cancel"),
|
||||||
action: Lang.bind(this, this.cancel),
|
action: Lang.bind(this, this.cancel),
|
||||||
key: Clutter.Escape },
|
key: Clutter.Escape });
|
||||||
{ expand: true, x_fill: false, x_align: St.Align.START });
|
|
||||||
this.placeSpinner({ expand: false,
|
|
||||||
x_fill: false,
|
|
||||||
y_fill: false,
|
|
||||||
x_align: St.Align.END,
|
|
||||||
y_align: St.Align.MIDDLE });
|
|
||||||
this._okButton = this.addButton({ label: _("Authenticate"),
|
this._okButton = this.addButton({ label: _("Authenticate"),
|
||||||
action: Lang.bind(this, this._onAuthenticateButtonPressed),
|
action: Lang.bind(this, this._onAuthenticateButtonPressed),
|
||||||
default: true },
|
default: true });
|
||||||
{ expand: false, x_fill: false, x_align: St.Align.END });
|
|
||||||
|
|
||||||
this._doneEmitted = false;
|
this._doneEmitted = false;
|
||||||
|
|
||||||
@ -183,6 +158,30 @@ const AuthenticationDialog = new Lang.Class({
|
|||||||
this._cookie = cookie;
|
this._cookie = cookie;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_setWorking: function(working) {
|
||||||
|
Tweener.removeTweens(this._workSpinner.actor);
|
||||||
|
if (working) {
|
||||||
|
this._workSpinner.play();
|
||||||
|
Tweener.addTween(this._workSpinner.actor,
|
||||||
|
{ opacity: 255,
|
||||||
|
delay: WORK_SPINNER_ANIMATION_DELAY,
|
||||||
|
time: WORK_SPINNER_ANIMATION_TIME,
|
||||||
|
transition: 'linear'
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
Tweener.addTween(this._workSpinner.actor,
|
||||||
|
{ opacity: 0,
|
||||||
|
time: WORK_SPINNER_ANIMATION_TIME,
|
||||||
|
transition: 'linear',
|
||||||
|
onCompleteScope: this,
|
||||||
|
onComplete: function() {
|
||||||
|
if (this._workSpinner)
|
||||||
|
this._workSpinner.stop();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
performAuthentication: function() {
|
performAuthentication: function() {
|
||||||
this.destroySession();
|
this.destroySession();
|
||||||
this._session = new PolkitAgent.Session({ identity: this._identityToAuth,
|
this._session = new PolkitAgent.Session({ identity: this._identityToAuth,
|
||||||
@ -229,7 +228,7 @@ const AuthenticationDialog = new Lang.Class({
|
|||||||
|
|
||||||
this._okButton.can_focus = sensitive;
|
this._okButton.can_focus = sensitive;
|
||||||
this._okButton.reactive = sensitive;
|
this._okButton.reactive = sensitive;
|
||||||
this.setWorking(!sensitive);
|
this._setWorking(!sensitive);
|
||||||
},
|
},
|
||||||
|
|
||||||
_onEntryActivate: function() {
|
_onEntryActivate: function() {
|
||||||
@ -268,7 +267,7 @@ const AuthenticationDialog = new Lang.Class({
|
|||||||
* requested authentication was not gained; this can happen
|
* requested authentication was not gained; this can happen
|
||||||
* because of an authentication error (like invalid password),
|
* because of an authentication error (like invalid password),
|
||||||
* for instance. */
|
* for instance. */
|
||||||
this._errorMessageLabel.set_text(_("Sorry, that didn\'t work. Please try again."));
|
this._errorMessageLabel.set_text(_("Sorry, that didn’t work. Please try again."));
|
||||||
this._errorMessageLabel.show();
|
this._errorMessageLabel.show();
|
||||||
this._infoMessageLabel.hide();
|
this._infoMessageLabel.hide();
|
||||||
this._nullMessageLabel.hide();
|
this._nullMessageLabel.hide();
|
||||||
@ -340,7 +339,7 @@ const AuthenticationDialog = new Lang.Class({
|
|||||||
});
|
});
|
||||||
Signals.addSignalMethods(AuthenticationDialog.prototype);
|
Signals.addSignalMethods(AuthenticationDialog.prototype);
|
||||||
|
|
||||||
const AuthenticationAgent = new Lang.Class({
|
var AuthenticationAgent = new Lang.Class({
|
||||||
Name: 'AuthenticationAgent',
|
Name: 'AuthenticationAgent',
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
@ -401,4 +400,4 @@ const AuthenticationAgent = new Lang.Class({
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
const Component = AuthenticationAgent;
|
var Component = AuthenticationAgent;
|
||||||
|
@ -6,40 +6,48 @@ const GLib = imports.gi.GLib;
|
|||||||
const Gtk = imports.gi.Gtk;
|
const Gtk = imports.gi.Gtk;
|
||||||
const Lang = imports.lang;
|
const Lang = imports.lang;
|
||||||
const Mainloop = imports.mainloop;
|
const Mainloop = imports.mainloop;
|
||||||
const Shell = imports.gi.Shell;
|
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
const St = imports.gi.St;
|
const St = imports.gi.St;
|
||||||
const Tpl = imports.gi.TelepathyLogger;
|
|
||||||
const Tp = imports.gi.TelepathyGLib;
|
|
||||||
|
|
||||||
const Calendar = imports.ui.calendar;
|
var Tpl = null;
|
||||||
|
var Tp = null;
|
||||||
|
try {
|
||||||
|
Tpl = imports.gi.TelepathyLogger;
|
||||||
|
Tp = imports.gi.TelepathyGLib;
|
||||||
|
} catch(e) {
|
||||||
|
log('Telepathy is not available, chat integration will be disabled.');
|
||||||
|
}
|
||||||
|
|
||||||
const History = imports.misc.history;
|
const History = imports.misc.history;
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
|
const MessageList = imports.ui.messageList;
|
||||||
const MessageTray = imports.ui.messageTray;
|
const MessageTray = imports.ui.messageTray;
|
||||||
const Params = imports.misc.params;
|
const Params = imports.misc.params;
|
||||||
const PopupMenu = imports.ui.popupMenu;
|
const PopupMenu = imports.ui.popupMenu;
|
||||||
const Util = imports.misc.util;
|
const Util = imports.misc.util;
|
||||||
|
|
||||||
|
const HAVE_TP = (Tp != null && Tpl != null);
|
||||||
|
|
||||||
// See Notification.appendMessage
|
// See Notification.appendMessage
|
||||||
const SCROLLBACK_IMMEDIATE_TIME = 3 * 60; // 3 minutes
|
var SCROLLBACK_IMMEDIATE_TIME = 3 * 60; // 3 minutes
|
||||||
const SCROLLBACK_RECENT_TIME = 15 * 60; // 15 minutes
|
var SCROLLBACK_RECENT_TIME = 15 * 60; // 15 minutes
|
||||||
const SCROLLBACK_RECENT_LENGTH = 20;
|
var SCROLLBACK_RECENT_LENGTH = 20;
|
||||||
const SCROLLBACK_IDLE_LENGTH = 5;
|
var SCROLLBACK_IDLE_LENGTH = 5;
|
||||||
|
|
||||||
// See Source._displayPendingMessages
|
// See Source._displayPendingMessages
|
||||||
const SCROLLBACK_HISTORY_LINES = 10;
|
var SCROLLBACK_HISTORY_LINES = 10;
|
||||||
|
|
||||||
// See Notification._onEntryChanged
|
// See Notification._onEntryChanged
|
||||||
const COMPOSING_STOP_TIMEOUT = 5;
|
var COMPOSING_STOP_TIMEOUT = 5;
|
||||||
|
|
||||||
const CHAT_EXPAND_LINES = 12;
|
var CHAT_EXPAND_LINES = 12;
|
||||||
|
|
||||||
const NotificationDirection = {
|
var NotificationDirection = {
|
||||||
SENT: 'chat-sent',
|
SENT: 'chat-sent',
|
||||||
RECEIVED: 'chat-received'
|
RECEIVED: 'chat-received'
|
||||||
};
|
};
|
||||||
|
|
||||||
const N_ = function(s) { return s; };
|
var N_ = function(s) { return s; };
|
||||||
|
|
||||||
function makeMessageFromTpMessage(tpMessage, direction) {
|
function makeMessageFromTpMessage(tpMessage, direction) {
|
||||||
let [text, flags] = tpMessage.to_text();
|
let [text, flags] = tpMessage.to_text();
|
||||||
@ -71,8 +79,43 @@ function makeMessageFromTplEvent(event) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
const TelepathyClient = new Lang.Class({
|
var TelepathyComponent = new Lang.Class({
|
||||||
|
Name: 'TelepathyComponent',
|
||||||
|
|
||||||
|
_init: function() {
|
||||||
|
this._client = null;
|
||||||
|
|
||||||
|
if (!HAVE_TP)
|
||||||
|
return; // Telepathy isn't available
|
||||||
|
|
||||||
|
this._client = new TelepathyClient();
|
||||||
|
},
|
||||||
|
|
||||||
|
enable: function() {
|
||||||
|
if (!this._client)
|
||||||
|
return;
|
||||||
|
|
||||||
|
try {
|
||||||
|
this._client.register();
|
||||||
|
} catch (e) {
|
||||||
|
throw new Error('Couldn\'t register Telepathy client. Error: \n' + e);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!this._client.account_manager.is_prepared(Tp.AccountManager.get_feature_quark_core()))
|
||||||
|
this._client.account_manager.prepare_async(null, null);
|
||||||
|
},
|
||||||
|
|
||||||
|
disable: function() {
|
||||||
|
if (!this._client)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this._client.unregister();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var TelepathyClient = HAVE_TP ? new Lang.Class({
|
||||||
Name: 'TelepathyClient',
|
Name: 'TelepathyClient',
|
||||||
|
Extends: Tp.BaseClient,
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
// channel path -> ChatSource
|
// channel path -> ChatSource
|
||||||
@ -97,38 +140,27 @@ const TelepathyClient = new Lang.Class({
|
|||||||
// channel matching its filters is detected.
|
// channel matching its filters is detected.
|
||||||
// The second argument, recover, means _observeChannels will be run
|
// The second argument, recover, means _observeChannels will be run
|
||||||
// for any existing channel as well.
|
// for any existing channel as well.
|
||||||
this._tpClient = new Shell.TpClient({ name: 'GnomeShell',
|
this.parent({ name: 'GnomeShell',
|
||||||
account_manager: this._accountManager,
|
account_manager: this._accountManager,
|
||||||
uniquify_name: true });
|
uniquify_name: true });
|
||||||
this._tpClient.set_observe_channels_func(
|
|
||||||
Lang.bind(this, this._observeChannels));
|
// We only care about single-user text-based chats
|
||||||
this._tpClient.set_approve_channels_func(
|
let filter = {};
|
||||||
Lang.bind(this, this._approveChannels));
|
filter[Tp.PROP_CHANNEL_CHANNEL_TYPE] = Tp.IFACE_CHANNEL_TYPE_TEXT;
|
||||||
this._tpClient.set_handle_channels_func(
|
filter[Tp.PROP_CHANNEL_TARGET_HANDLE_TYPE] = Tp.HandleType.CONTACT;
|
||||||
Lang.bind(this, this._handleChannels));
|
|
||||||
|
this.set_observer_recover(true);
|
||||||
|
this.add_observer_filter(filter);
|
||||||
|
this.add_approver_filter(filter);
|
||||||
|
this.add_handler_filter(filter);
|
||||||
|
|
||||||
// Allow other clients (such as Empathy) to pre-empt our channels if
|
// Allow other clients (such as Empathy) to pre-empt our channels if
|
||||||
// needed
|
// needed
|
||||||
this._tpClient.set_delegated_channels_callback(
|
this.set_delegated_channels_callback(
|
||||||
Lang.bind(this, this._delegatedChannelsCb));
|
Lang.bind(this, this._delegatedChannelsCb));
|
||||||
},
|
},
|
||||||
|
|
||||||
enable: function() {
|
vfunc_observe_channels: function(account, conn, channels,
|
||||||
try {
|
|
||||||
this._tpClient.register();
|
|
||||||
} catch (e) {
|
|
||||||
throw new Error('Couldn\'t register Telepathy client. Error: \n' + e);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!this._accountManager.is_prepared(Tp.AccountManager.get_feature_quark_core()))
|
|
||||||
this._accountManager.prepare_async(null, null);
|
|
||||||
},
|
|
||||||
|
|
||||||
disable: function() {
|
|
||||||
this._tpClient.unregister();
|
|
||||||
},
|
|
||||||
|
|
||||||
_observeChannels: function(observer, account, conn, channels,
|
|
||||||
dispatchOp, requests, context) {
|
dispatchOp, requests, context) {
|
||||||
let len = channels.length;
|
let len = channels.length;
|
||||||
for (let i = 0; i < len; i++) {
|
for (let i = 0; i < len; i++) {
|
||||||
@ -153,7 +185,7 @@ const TelepathyClient = new Lang.Class({
|
|||||||
if (this._chatSources[channel.get_object_path()])
|
if (this._chatSources[channel.get_object_path()])
|
||||||
return;
|
return;
|
||||||
|
|
||||||
let source = new ChatSource(account, conn, channel, contact, this._tpClient);
|
let source = new ChatSource(account, conn, channel, contact, this);
|
||||||
|
|
||||||
this._chatSources[channel.get_object_path()] = source;
|
this._chatSources[channel.get_object_path()] = source;
|
||||||
source.connect('destroy', Lang.bind(this,
|
source.connect('destroy', Lang.bind(this,
|
||||||
@ -162,8 +194,8 @@ const TelepathyClient = new Lang.Class({
|
|||||||
}));
|
}));
|
||||||
},
|
},
|
||||||
|
|
||||||
_handleChannels: function(handler, account, conn, channels,
|
vfunc_handle_channels: function(account, conn, channels, requests,
|
||||||
requests, user_action_time, context) {
|
user_action_time, context) {
|
||||||
this._handlingChannels(account, conn, channels, true);
|
this._handlingChannels(account, conn, channels, true);
|
||||||
context.accept();
|
context.accept();
|
||||||
},
|
},
|
||||||
@ -193,7 +225,7 @@ const TelepathyClient = new Lang.Class({
|
|||||||
// Telepathy spec states that handlers must foreground channels
|
// Telepathy spec states that handlers must foreground channels
|
||||||
// in HandleChannels calls which are already being handled.
|
// in HandleChannels calls which are already being handled.
|
||||||
|
|
||||||
if (notify && this._tpClient.is_handling_channel(channel)) {
|
if (notify && this.is_handling_channel(channel)) {
|
||||||
// We are already handling the channel, display the source
|
// We are already handling the channel, display the source
|
||||||
let source = this._chatSources[channel.get_object_path()];
|
let source = this._chatSources[channel.get_object_path()];
|
||||||
if (source)
|
if (source)
|
||||||
@ -202,7 +234,7 @@ const TelepathyClient = new Lang.Class({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_approveChannels: function(approver, account, conn, channels,
|
vfunc_add_dispatch_operation: function(account, conn, channels,
|
||||||
dispatchOp, context) {
|
dispatchOp, context) {
|
||||||
let channel = channels[0];
|
let channel = channels[0];
|
||||||
let chanType = channel.get_channel_type();
|
let chanType = channel.get_channel_type();
|
||||||
@ -230,7 +262,7 @@ const TelepathyClient = new Lang.Class({
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Approve private text channels right away as we are going to handle it
|
// Approve private text channels right away as we are going to handle it
|
||||||
dispatchOp.claim_with_async(this._tpClient, Lang.bind(this, function(dispatchOp, result) {
|
dispatchOp.claim_with_async(this, Lang.bind(this, function(dispatchOp, result) {
|
||||||
try {
|
try {
|
||||||
dispatchOp.claim_with_finish(result);
|
dispatchOp.claim_with_finish(result);
|
||||||
this._handlingChannels(account, conn, [channel], false);
|
this._handlingChannels(account, conn, [channel], false);
|
||||||
@ -246,9 +278,9 @@ const TelepathyClient = new Lang.Class({
|
|||||||
// Nothing to do as we don't make a distinction between observed and
|
// Nothing to do as we don't make a distinction between observed and
|
||||||
// handled channels.
|
// handled channels.
|
||||||
},
|
},
|
||||||
});
|
}) : null;
|
||||||
|
|
||||||
const ChatSource = new Lang.Class({
|
var ChatSource = new Lang.Class({
|
||||||
Name: 'ChatSource',
|
Name: 'ChatSource',
|
||||||
Extends: MessageTray.Source,
|
Extends: MessageTray.Source,
|
||||||
|
|
||||||
@ -303,6 +335,8 @@ const ChatSource = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_createPolicy: function() {
|
_createPolicy: function() {
|
||||||
|
if (this._account.protocol_name == 'irc')
|
||||||
|
return new MessageTray.NotificationApplicationPolicy('org.gnome.Polari');
|
||||||
return new MessageTray.NotificationApplicationPolicy('empathy');
|
return new MessageTray.NotificationApplicationPolicy('empathy');
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -467,11 +501,17 @@ const ChatSource = new Lang.Class({
|
|||||||
|
|
||||||
destroy: function(reason) {
|
destroy: function(reason) {
|
||||||
if (this._client.is_handling_channel(this._channel)) {
|
if (this._client.is_handling_channel(this._channel)) {
|
||||||
|
this._ackMessages();
|
||||||
// The chat box has been destroyed so it can't
|
// The chat box has been destroyed so it can't
|
||||||
// handle the channel any more.
|
// handle the channel any more.
|
||||||
this._channel.close_async(function(channel, result) {
|
this._channel.close_async(function(channel, result) {
|
||||||
channel.close_finish(result);
|
channel.close_finish(result);
|
||||||
});
|
});
|
||||||
|
} else {
|
||||||
|
// Don't indicate any unread messages when the notification
|
||||||
|
// that represents them has been destroyed.
|
||||||
|
this._pendingMessages = [];
|
||||||
|
this.countUpdated();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Keep source alive while the channel is open
|
// Keep source alive while the channel is open
|
||||||
@ -607,7 +647,7 @@ const ChatSource = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const ChatNotification = new Lang.Class({
|
var ChatNotification = new Lang.Class({
|
||||||
Name: 'ChatNotification',
|
Name: 'ChatNotification',
|
||||||
Extends: MessageTray.Notification,
|
Extends: MessageTray.Notification,
|
||||||
|
|
||||||
@ -652,7 +692,9 @@ const ChatNotification = new Lang.Class({
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (message.direction == NotificationDirection.RECEIVED)
|
if (message.direction == NotificationDirection.RECEIVED)
|
||||||
this.update(this.source.title, messageBody, { bannerMarkup: true });
|
this.update(this.source.title, messageBody,
|
||||||
|
{ datetime: GLib.DateTime.new_from_unix_local (message.timestamp),
|
||||||
|
bannerMarkup: true });
|
||||||
|
|
||||||
let group = (message.direction == NotificationDirection.RECEIVED ?
|
let group = (message.direction == NotificationDirection.RECEIVED ?
|
||||||
'received' : 'sent');
|
'received' : 'sent');
|
||||||
@ -764,7 +806,7 @@ const ChatNotification = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const ChatLineBox = new Lang.Class({
|
var ChatLineBox = new Lang.Class({
|
||||||
Name: 'ChatLineBox',
|
Name: 'ChatLineBox',
|
||||||
Extends: St.BoxLayout,
|
Extends: St.BoxLayout,
|
||||||
|
|
||||||
@ -774,7 +816,7 @@ const ChatLineBox = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const ChatNotificationBanner = new Lang.Class({
|
var ChatNotificationBanner = new Lang.Class({
|
||||||
Name: 'ChatNotificationBanner',
|
Name: 'ChatNotificationBanner',
|
||||||
Extends: MessageTray.NotificationBanner,
|
Extends: MessageTray.NotificationBanner,
|
||||||
|
|
||||||
@ -864,7 +906,7 @@ const ChatNotificationBanner = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_addMessage: function(message) {
|
_addMessage: function(message) {
|
||||||
let highlighter = new Calendar.URLHighlighter(message.body, true, true);
|
let highlighter = new MessageList.URLHighlighter(message.body, true, true);
|
||||||
let body = highlighter.actor;
|
let body = highlighter.actor;
|
||||||
|
|
||||||
let styles = message.styles;
|
let styles = message.styles;
|
||||||
@ -954,4 +996,4 @@ const ChatNotificationBanner = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const Component = TelepathyClient;
|
var Component = TelepathyComponent;
|
||||||
|