Compare commits
1089 Commits
wip/fmuell
...
gbsneto/ne
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6fd0aafada | ||
|
|
e5091ff17c | ||
|
|
22534c4c64 | ||
|
|
cd1c45731d | ||
|
|
5380b06eb5 | ||
|
|
be714f7401 | ||
|
|
e71c249ea5 | ||
|
|
5b6deff977 | ||
|
|
6cd0c3f965 | ||
|
|
d529e222d7 | ||
|
|
2e23a0e6b8 | ||
|
|
64aaa46333 | ||
|
|
d1f61e884d | ||
|
|
fe3d55eb80 | ||
|
|
7a90b2d908 | ||
|
|
137df4bc26 | ||
|
|
23abe4eb22 | ||
|
|
b7feb71490 | ||
|
|
9aa9431a32 | ||
|
|
c9e2afcf65 | ||
|
|
be5ab24e97 | ||
|
|
caf0c8dd7d | ||
|
|
10a194e6ed | ||
|
|
986600ab31 | ||
|
|
3d39b32a0b | ||
|
|
6205d5eb27 | ||
|
|
a722b4c51d | ||
|
|
31fe517007 | ||
|
|
31d915a38a | ||
|
|
e00878ab75 | ||
|
|
3b5675b79a | ||
|
|
ee97512bcc | ||
|
|
085531b43d | ||
|
|
9e8b97d474 | ||
|
|
a3a7953704 | ||
|
|
92c0171aeb | ||
|
|
6a6d66486d | ||
|
|
1cc766d636 | ||
|
|
60cad01880 | ||
|
|
63c9a6efd0 | ||
|
|
1d1b42756f | ||
|
|
a95601afdb | ||
|
|
2dbdf792db | ||
|
|
e23ce37e62 | ||
|
|
a05cb76e0d | ||
|
|
60cab56f86 | ||
|
|
70a5c3875c | ||
|
|
0fdbde9101 | ||
|
|
2156577333 | ||
|
|
f3e09b2b2f | ||
|
|
6180f59c13 | ||
|
|
506b75fc7f | ||
|
|
a0d0a17d68 | ||
|
|
92e5713e29 | ||
|
|
856c32db91 | ||
|
|
7b45ffa511 | ||
|
|
b6754d7db7 | ||
|
|
2a9977a5b3 | ||
|
|
dab60d5580 | ||
|
|
8e3aac8ed7 | ||
|
|
147cb53140 | ||
|
|
54f369404a | ||
|
|
af1aabff75 | ||
|
|
d6ba6dc554 | ||
|
|
42188b7698 | ||
|
|
48adb2ef4b | ||
|
|
f8e648b7e3 | ||
|
|
daa5452af2 | ||
|
|
259874d731 | ||
|
|
23344701de | ||
|
|
00e95de114 | ||
|
|
942758bb30 | ||
|
|
e0947b01bd | ||
|
|
cf00231aa8 | ||
|
|
5c3f4f5f8b | ||
|
|
5f10047b58 | ||
|
|
3094f86334 | ||
|
|
8ffea9d5c5 | ||
|
|
4f3c8b8d69 | ||
|
|
edf6bd6909 | ||
|
|
3e58af10ca | ||
|
|
9e55d262f9 | ||
|
|
252e694979 | ||
|
|
efed695eca | ||
|
|
b446667df6 | ||
|
|
133a1e7bef | ||
|
|
5b3935fa43 | ||
|
|
471165ca9b | ||
|
|
111f87a1b2 | ||
|
|
93525539c2 | ||
|
|
a77377efe7 | ||
|
|
81ab2865f7 | ||
|
|
e585f7d97b | ||
|
|
1a32e3e74a | ||
|
|
8d6820c4df | ||
|
|
2546445884 | ||
|
|
e44b7df078 | ||
|
|
3a9eaa39ea | ||
|
|
af87bd8c87 | ||
|
|
4bfb4a0e3d | ||
|
|
d1a6601e60 | ||
|
|
817aec5466 | ||
|
|
314a89a837 | ||
|
|
57ed68541a | ||
|
|
413c677fcf | ||
|
|
3d86e6e791 | ||
|
|
3fbd61cbf0 | ||
|
|
43b4f2c7d5 | ||
|
|
7eb4088f45 | ||
|
|
f00201fa6c | ||
|
|
1aca2ba6bb | ||
|
|
e9131465dd | ||
|
|
0ee7f02f8e | ||
|
|
451f4e3636 | ||
|
|
2fc4987c73 | ||
|
|
4525ad346d | ||
|
|
e4b8a4b432 | ||
|
|
62e594af6d | ||
|
|
ce92270626 | ||
|
|
bdcf3037ca | ||
|
|
9698ff491a | ||
|
|
2a9e065cfb | ||
|
|
4c93ef39fa | ||
|
|
22107c183b | ||
|
|
c06eb5d0a7 | ||
|
|
e76877c4b8 | ||
|
|
2a32fb2e72 | ||
|
|
de86920e0e | ||
|
|
8754736fda | ||
|
|
d2ead59d74 | ||
|
|
2f4fcc59a1 | ||
|
|
ba6dbb228d | ||
|
|
60e386048b | ||
|
|
c2904fa14d | ||
|
|
dfdb139d9c | ||
|
|
ce63d21dcc | ||
|
|
1da9937453 | ||
|
|
9f11fbad16 | ||
|
|
f54e7804c5 | ||
|
|
7db5f8b28e | ||
|
|
743ce23fbc | ||
|
|
a3267be192 | ||
|
|
4ad2523877 | ||
|
|
4bfee3a8ca | ||
|
|
fc964f975a | ||
|
|
52f85c9465 | ||
|
|
691610f23c | ||
|
|
b6a2b2b8a5 | ||
|
|
1ad8a2fcf6 | ||
|
|
7ce08845f1 | ||
|
|
d469250130 | ||
|
|
7fd5c47e06 | ||
|
|
8704b1004e | ||
|
|
65a9fb8c01 | ||
|
|
25a7a8006a | ||
|
|
6fe1d3248a | ||
|
|
13f97532bf | ||
|
|
1acee3d702 | ||
|
|
1d17404471 | ||
|
|
48b860b69f | ||
|
|
a030c54661 | ||
|
|
dcf7bae6c7 | ||
|
|
d0ace108e5 | ||
|
|
32d5744014 | ||
|
|
d16094774b | ||
|
|
ac664ba321 | ||
|
|
0888a9bffd | ||
|
|
5e82d72424 | ||
|
|
2513835e89 | ||
|
|
98b70ef00f | ||
|
|
ae11381b88 | ||
|
|
e9596f2775 | ||
|
|
8adbc8010a | ||
|
|
76fb559964 | ||
|
|
1bc1b4d9d8 | ||
|
|
dfc0ef56f6 | ||
|
|
1e68e78d8e | ||
|
|
17fa5a2db4 | ||
|
|
004a5e1042 | ||
|
|
4915a9e8e4 | ||
|
|
8a7e44ccf0 | ||
|
|
a497afe695 | ||
|
|
15c252c11d | ||
|
|
27da3ed1fe | ||
|
|
8656102182 | ||
|
|
24d3744cb9 | ||
|
|
031913b9df | ||
|
|
e53443daf9 | ||
|
|
06317f4f6a | ||
|
|
c69e195441 | ||
|
|
a53b48de4c | ||
|
|
eca98aee42 | ||
|
|
ea5aaa8ab2 | ||
|
|
72566eda43 | ||
|
|
7a4f9a5ff3 | ||
|
|
ba23fd9989 | ||
|
|
c101196f5b | ||
|
|
1687a5451e | ||
|
|
ea4d5f89eb | ||
|
|
9e388ebcfd | ||
|
|
8d9cae45f9 | ||
|
|
406d0900a7 | ||
|
|
cf611d2be8 | ||
|
|
7875fc831b | ||
|
|
44bca36385 | ||
|
|
e2c3198627 | ||
|
|
8b549f3d5b | ||
|
|
a0e3c342a6 | ||
|
|
a80331dbcf | ||
|
|
0068dab001 | ||
|
|
7d42990462 | ||
|
|
e6dec7a9dd | ||
|
|
8adfc5b106 | ||
|
|
8be95b5785 | ||
|
|
9194de8460 | ||
|
|
6dccbc5a90 | ||
|
|
efba1e83c7 | ||
|
|
d1442765a6 | ||
|
|
72e5caf6e1 | ||
|
|
3768b6b701 | ||
|
|
e5cde4700f | ||
|
|
a207f67f73 | ||
|
|
b73aace476 | ||
|
|
346d37ecbb | ||
|
|
7bb29817f7 | ||
|
|
92b92a2e0a | ||
|
|
8e79f9f2dc | ||
|
|
05b345cc92 | ||
|
|
89f9925208 | ||
|
|
fcc1d7beff | ||
|
|
f226398c7c | ||
|
|
890ac9ff38 | ||
|
|
6a027cd566 | ||
|
|
1dc971d760 | ||
|
|
dcf0bf0bb1 | ||
|
|
cf156b469c | ||
|
|
da6c154ceb | ||
|
|
957fa910b3 | ||
|
|
8ac5be95d3 | ||
|
|
c27bd62106 | ||
|
|
480e8b8842 | ||
|
|
c6580421b3 | ||
|
|
c2f5331187 | ||
|
|
5d0c403f1d | ||
|
|
20fc4b4490 | ||
|
|
ea3f906f38 | ||
|
|
2c4df6abcf | ||
|
|
67a0b3b98e | ||
|
|
c366e9f3ca | ||
|
|
812a8552e5 | ||
|
|
069d7d6cac | ||
|
|
785a8b78b1 | ||
|
|
2d927639fe | ||
|
|
d5cad10181 | ||
|
|
441a56b916 | ||
|
|
c2a6a6c939 | ||
|
|
15d1aee21a | ||
|
|
f1bc2d56f4 | ||
|
|
6f62965305 | ||
|
|
a6aa0ac74a | ||
|
|
32ed4ee12e | ||
|
|
33a48aecb7 | ||
|
|
3b63062a30 | ||
|
|
b680952197 | ||
|
|
a4ec460f96 | ||
|
|
5bd295842b | ||
|
|
db9a7ea7a9 | ||
|
|
490a62e781 | ||
|
|
d4b8912c0e | ||
|
|
532acf4c4a | ||
|
|
7141c5be6d | ||
|
|
2df7757905 | ||
|
|
9d5c743a98 | ||
|
|
653e6c85bb | ||
|
|
d9fa389079 | ||
|
|
a429fdbd08 | ||
|
|
f9357457bf | ||
|
|
369e400e32 | ||
|
|
07ad4d8911 | ||
|
|
803a096b7e | ||
|
|
1b40abe37a | ||
|
|
0de5209cf1 | ||
|
|
07fad38a50 | ||
|
|
ac4b88f25d | ||
|
|
23a7aa5740 | ||
|
|
0b1e29e5e3 | ||
|
|
c8c93b2a70 | ||
|
|
d8c7cac536 | ||
|
|
5cb02c1cb5 | ||
|
|
10c1df61cd | ||
|
|
387e5ef0f1 | ||
|
|
f8f40f247f | ||
|
|
16cb918e0d | ||
|
|
638b315e40 | ||
|
|
a20b8dc1ad | ||
|
|
4370aee81e | ||
|
|
779e37fbd9 | ||
|
|
6f4c5022eb | ||
|
|
b499ca47a3 | ||
|
|
dc38e48202 | ||
|
|
7efdb97641 | ||
|
|
14fd7c7532 | ||
|
|
21e14bd46f | ||
|
|
f0e1dc5715 | ||
|
|
6b7af407e1 | ||
|
|
d67c64af83 | ||
|
|
5d2e5fe85a | ||
|
|
308da6ae53 | ||
|
|
76eceec1f5 | ||
|
|
209d332a30 | ||
|
|
35dbc3fcc9 | ||
|
|
ada01507a4 | ||
|
|
826ac95726 | ||
|
|
9b7f228f8e | ||
|
|
5d8ea4f9a3 | ||
|
|
4c89eac9a4 | ||
|
|
f76f30fd6a | ||
|
|
488d98289c | ||
|
|
ff3d32dd18 | ||
|
|
be6ce3c5b4 | ||
|
|
21966afbc6 | ||
|
|
68e3f74ffd | ||
|
|
87f5aa7a13 | ||
|
|
1dadbd0cbb | ||
|
|
481490fdc7 | ||
|
|
3114a24d1f | ||
|
|
73850fee02 | ||
|
|
c0047cd11d | ||
|
|
dd9a452594 | ||
|
|
e45c917811 | ||
|
|
fd19906c64 | ||
|
|
54a2773046 | ||
|
|
ec8b7bc7b2 | ||
|
|
ea71172d44 | ||
|
|
5dfa620f86 | ||
|
|
09d5f0779d | ||
|
|
d1880dc987 | ||
|
|
928b49705f | ||
|
|
f50cac3005 | ||
|
|
ec6e1315a5 | ||
|
|
ad55cb6d5d | ||
|
|
0ce0376725 | ||
|
|
015ca2c507 | ||
|
|
21e752e5e4 | ||
|
|
1e20a1249a | ||
|
|
b67c300484 | ||
|
|
8ac2086ed1 | ||
|
|
72defaa97e | ||
|
|
9097c5e9c0 | ||
|
|
79b54f65b4 | ||
|
|
52c2417685 | ||
|
|
9073debe60 | ||
|
|
8b368d010f | ||
|
|
8b97a06961 | ||
|
|
fffe7bdf9c | ||
|
|
ef18f621ac | ||
|
|
dfa41f6926 | ||
|
|
3d3dca4aa2 | ||
|
|
928595fe21 | ||
|
|
fc958f4215 | ||
|
|
0846238f69 | ||
|
|
007b6ca2e8 | ||
|
|
0b4a4487a0 | ||
|
|
99b4e047dd | ||
|
|
ae2af34453 | ||
|
|
fdf24ceecc | ||
|
|
870dd84a50 | ||
|
|
5d6db923b7 | ||
|
|
8eb88d17fe | ||
|
|
abe012b9fc | ||
|
|
749f52fc8b | ||
|
|
1e6cb43815 | ||
|
|
213d10bf4e | ||
|
|
1abfbb82c5 | ||
|
|
bf36d99a33 | ||
|
|
3ee525833e | ||
|
|
bf497ed643 | ||
|
|
9b8c0f7519 | ||
|
|
12ec5d1cbe | ||
|
|
0f178c3b3d | ||
|
|
9aa06e3001 | ||
|
|
00ec8ca989 | ||
|
|
9c6f558c9e | ||
|
|
1c172955ee | ||
|
|
1d44bf7ce6 | ||
|
|
036e41621d | ||
|
|
3003e9091d | ||
|
|
8d9da10710 | ||
|
|
4d23c12028 | ||
|
|
476816732f | ||
|
|
31968ea53c | ||
|
|
7e00d22bfa | ||
|
|
50055004f5 | ||
|
|
abe2f07779 | ||
|
|
277f0d77f3 | ||
|
|
01d2ad760a | ||
|
|
25f118bf2c | ||
|
|
12b8fb15b1 | ||
|
|
5295866eff | ||
|
|
02b47f4640 | ||
|
|
108ac7cf20 | ||
|
|
933c037c6e | ||
|
|
8f3554ff3e | ||
|
|
668128f8c9 | ||
|
|
28ab1f4af4 | ||
|
|
d360114226 | ||
|
|
5fc456d9d9 | ||
|
|
007d305736 | ||
|
|
ae7ec648b2 | ||
|
|
99a2fad311 | ||
|
|
82d466598c | ||
|
|
3a748fe737 | ||
|
|
89ce53e3ff | ||
|
|
2f29081667 | ||
|
|
cb0d28770f | ||
|
|
86c3909908 | ||
|
|
b970ee7293 | ||
|
|
5545e84430 | ||
|
|
85d9f39417 | ||
|
|
a81450df17 | ||
|
|
a7c94b2cd2 | ||
|
|
9d65c8b2ec | ||
|
|
1b7ff76092 | ||
|
|
17e32bf16d | ||
|
|
74905f3edc | ||
|
|
8e1b13ca96 | ||
|
|
c0e90807e0 | ||
|
|
3db1058c2c | ||
|
|
a57c4c580e | ||
|
|
33bbbdc322 | ||
|
|
5826336a77 | ||
|
|
3b5d13a0b2 | ||
|
|
ed37ba1d9b | ||
|
|
8ea6fd1925 | ||
|
|
93a461f3f7 | ||
|
|
fda7c9b06e | ||
|
|
1e13f32cea | ||
|
|
e357559582 | ||
|
|
71759a0769 | ||
|
|
11b116cb9d | ||
|
|
2f97a1a55d | ||
|
|
79cf3a6dd0 | ||
|
|
0257de1b7e | ||
|
|
466dc8da8f | ||
|
|
2c61badc02 | ||
|
|
3f8d3a7ee2 | ||
|
|
a455860978 | ||
|
|
0ecf135a4b | ||
|
|
cebb6d40df | ||
|
|
0ee13672ee | ||
|
|
49260a85ad | ||
|
|
da9f37e629 | ||
|
|
164f3fa3fd | ||
|
|
8e75d81a44 | ||
|
|
1d60c4d9d4 | ||
|
|
eaa32090b9 | ||
|
|
32ddb6f739 | ||
|
|
2653402c5c | ||
|
|
2743f18af4 | ||
|
|
dd1fdf88ff | ||
|
|
2a041e9d8d | ||
|
|
1117f4760c | ||
|
|
7dda7abf5e | ||
|
|
7ca3cca306 | ||
|
|
d471e3a23b | ||
|
|
ce1bee727a | ||
|
|
43cb3754d9 | ||
|
|
1d6ddf060b | ||
|
|
9928125e7d | ||
|
|
1c63893c4b | ||
|
|
a7ec7583aa | ||
|
|
4a3476266f | ||
|
|
32e0b895a4 | ||
|
|
58806359ee | ||
|
|
4589da957b | ||
|
|
6a4c55b852 | ||
|
|
ea17740719 | ||
|
|
d82810240f | ||
|
|
2768b73015 | ||
|
|
f9a7718dda | ||
|
|
d9d9778a98 | ||
|
|
bd5162105e | ||
|
|
208c5e9562 | ||
|
|
305e63750e | ||
|
|
ab0f74aa15 | ||
|
|
43443d08ae | ||
|
|
b82b553b9e | ||
|
|
08464eadff | ||
|
|
49e56776e8 | ||
|
|
043667dde5 | ||
|
|
f583a7c6d8 | ||
|
|
2d908e80fc | ||
|
|
8f0e9abe47 | ||
|
|
1a27ff6130 | ||
|
|
3f2cffc2e6 | ||
|
|
a78527050a | ||
|
|
a823a213ba | ||
|
|
2c8d380e67 | ||
|
|
3996309f8a | ||
|
|
bd18313d12 | ||
|
|
2ff7a78b56 | ||
|
|
c765082f72 | ||
|
|
7d2c5c1ac9 | ||
|
|
404bc34089 | ||
|
|
16ca7a21a7 | ||
|
|
1b31fd5afe | ||
|
|
e0457b6dc4 | ||
|
|
42b77e7ba5 | ||
|
|
f6bed08993 | ||
|
|
5f77cdb0b9 | ||
|
|
109b8e8f38 | ||
|
|
4c0bd88a2c | ||
|
|
3731be9947 | ||
|
|
6cc19ee6f0 | ||
|
|
1570f838f3 | ||
|
|
74feb110b5 | ||
|
|
6ba03ac2a6 | ||
|
|
55c717c2dc | ||
|
|
355b5eebec | ||
|
|
51938c398a | ||
|
|
dbb71f0dfc | ||
|
|
1cac7b2218 | ||
|
|
ff9bb5399b | ||
|
|
68e45eb051 | ||
|
|
d0da96ad29 | ||
|
|
55b036170b | ||
|
|
5473637736 | ||
|
|
bb6d9734e4 | ||
|
|
53be76c9e2 | ||
|
|
be40de5a9b | ||
|
|
7359e431d3 | ||
|
|
8a5de327bb | ||
|
|
1778adae0d | ||
|
|
0d035a4e53 | ||
|
|
46874eed05 | ||
|
|
e95f3febd6 | ||
|
|
0bdd1b6fc4 | ||
|
|
8a22092632 | ||
|
|
915415d919 | ||
|
|
14d7897a93 | ||
|
|
1398aa6562 | ||
|
|
8fcd6c7153 | ||
|
|
6ed5bc2f6c | ||
|
|
5ec4c2e43e | ||
|
|
6f8dd065a4 | ||
|
|
02db21fc55 | ||
|
|
8c28f9a77d | ||
|
|
95b80eec01 | ||
|
|
02c76695e5 | ||
|
|
d5a1a888d9 | ||
|
|
6c33aff6d1 | ||
|
|
61f86cbc54 | ||
|
|
4c5206954a | ||
|
|
8fda3116f0 | ||
|
|
7ac35c644e | ||
|
|
29b04fcbf2 | ||
|
|
55235c2552 | ||
|
|
f250643385 | ||
|
|
d008c6c5c5 | ||
|
|
e2e02c9a2f | ||
|
|
e56d7f5021 | ||
|
|
e7d44bb349 | ||
|
|
321730fcb9 | ||
|
|
fe83cd91bb | ||
|
|
0b08ee54bb | ||
|
|
f6b4b96737 | ||
|
|
b87455c089 | ||
|
|
2c1a81f448 | ||
|
|
b3736f45e6 | ||
|
|
3c382c4bbe | ||
|
|
5f3bad9c94 | ||
|
|
6970f43e66 | ||
|
|
9476aa598a | ||
|
|
69725e5d41 | ||
|
|
42dabef8c7 | ||
|
|
e10a768ddb | ||
|
|
a8f0787c91 | ||
|
|
074129682b | ||
|
|
c67460a1e3 | ||
|
|
eab320dab5 | ||
|
|
04c7cb6fbe | ||
|
|
d4582491f5 | ||
|
|
0641b1e279 | ||
|
|
ae0450b68e | ||
|
|
cb0a5de83b | ||
|
|
2f5086efaf | ||
|
|
68e580e394 | ||
|
|
b143869d5d | ||
|
|
6a477be874 | ||
|
|
03bb8cdcbd | ||
|
|
8864816b94 | ||
|
|
751cd2f1c1 | ||
|
|
6f6b6fb9d6 | ||
|
|
fe346b89f0 | ||
|
|
0744c6af2e | ||
|
|
2e070ab834 | ||
|
|
00f9b7bf69 | ||
|
|
94ba52af0c | ||
|
|
44e1a6ce06 | ||
|
|
ccf646f54a | ||
|
|
4e84b46c9b | ||
|
|
b4797956c7 | ||
|
|
c1c45f95af | ||
|
|
ac09e0110a | ||
|
|
0e37cd2ec9 | ||
|
|
76dc77f617 | ||
|
|
cb4c0d32c0 | ||
|
|
3d4ba028c4 | ||
|
|
5481c1899f | ||
|
|
2fd120162f | ||
|
|
523ba5a719 | ||
|
|
07d25cd69d | ||
|
|
520cea9394 | ||
|
|
58c4212cfa | ||
|
|
7059e31f6a | ||
|
|
a9234f7631 | ||
|
|
1e5a8b0cd7 | ||
|
|
5ef343f245 | ||
|
|
22e33b4c47 | ||
|
|
5ace4682bf | ||
|
|
14d9839ed3 | ||
|
|
3b6fae582b | ||
|
|
3cbdf4f9a5 | ||
|
|
d8825e0d12 | ||
|
|
3c5fea59df | ||
|
|
443c8347ea | ||
|
|
ee3f52c097 | ||
|
|
4b01bb6f99 | ||
|
|
27ef8154dc | ||
|
|
0a7e717e0e | ||
|
|
2d2824b947 | ||
|
|
40c2a403ac | ||
|
|
238b87d386 | ||
|
|
8c01d341c7 | ||
|
|
866629b3d3 | ||
|
|
2b3ab3ecec | ||
|
|
759120b95f | ||
|
|
de0e21612c | ||
|
|
83e83444db | ||
|
|
5060aee7b2 | ||
|
|
12bace2721 | ||
|
|
2c45b5416e | ||
|
|
96c2473317 | ||
|
|
6359d6ef30 | ||
|
|
2f6323afc2 | ||
|
|
d25bcbc3a7 | ||
|
|
dd5d7d3b70 | ||
|
|
771b1a0788 | ||
|
|
5a9d094f3e | ||
|
|
9ca8433170 | ||
|
|
0ada312748 | ||
|
|
88697add1b | ||
|
|
4730b7a094 | ||
|
|
aa3e64aec3 | ||
|
|
af26e2b212 | ||
|
|
8167f20972 | ||
|
|
bd4aac8f49 | ||
|
|
785dd5c5f7 | ||
|
|
71e469a59c | ||
|
|
6d4b9d29b8 | ||
|
|
33f5bb39cd | ||
|
|
a1c3900630 | ||
|
|
cdaf164c01 | ||
|
|
2bd80579ed | ||
|
|
54039c3552 | ||
|
|
b197a1affb | ||
|
|
51655be6a3 | ||
|
|
9697c209c0 | ||
|
|
6ecb0a4546 | ||
|
|
30861d4800 | ||
|
|
a23391ea28 | ||
|
|
58e0b80cac | ||
|
|
41dd744b74 | ||
|
|
bdf66d7b62 | ||
|
|
4258ae3ec2 | ||
|
|
9b379c49ba | ||
|
|
7e70dd8453 | ||
|
|
2e209a82f9 | ||
|
|
ab0ecc469f | ||
|
|
7d75ddf635 | ||
|
|
271e43a1ed | ||
|
|
2702a82896 | ||
|
|
8ad33d8752 | ||
|
|
d84bbb8770 | ||
|
|
c0c2edf2e1 | ||
|
|
de0c3251dd | ||
|
|
0afd600ea4 | ||
|
|
598407b14a | ||
|
|
d9bfa16f05 | ||
|
|
03117d65b2 | ||
|
|
5520bb3890 | ||
|
|
4e6b2eb72a | ||
|
|
2e5295b3a9 | ||
|
|
3121c9aa29 | ||
|
|
1ebbd7c768 | ||
|
|
8572bb97c7 | ||
|
|
d5ebd8c816 | ||
|
|
ed999ce926 | ||
|
|
50b7739076 | ||
|
|
94995e9c1e | ||
|
|
fb04dafb0b | ||
|
|
d57234bec9 | ||
|
|
38da54fb02 | ||
|
|
bbd3275dad | ||
|
|
3a3f9aa008 | ||
|
|
3c54e863e6 | ||
|
|
a63ba61194 | ||
|
|
ab9710ee7b | ||
|
|
43cef45229 | ||
|
|
8db4f3c67f | ||
|
|
594a070029 | ||
|
|
c2e04e3cfa | ||
|
|
293f50e8e5 | ||
|
|
df7fea3407 | ||
|
|
563412698a | ||
|
|
2b30146c6c | ||
|
|
0f531d8c44 | ||
|
|
218c87994b | ||
|
|
f74c07b9ac | ||
|
|
59edea4bb4 | ||
|
|
4d4d5a0b16 | ||
|
|
03c4930883 | ||
|
|
9593e20425 | ||
|
|
2b1d6e607f | ||
|
|
1dff32e48a | ||
|
|
1e3a174de9 | ||
|
|
7bb84dae80 | ||
|
|
44fcb9e9af | ||
|
|
2d30e310bc | ||
|
|
be2d630348 | ||
|
|
bea6045aae | ||
|
|
ad491e7922 | ||
|
|
fedb8e706a | ||
|
|
1be933bc49 | ||
|
|
526bb72f3d | ||
|
|
49c95cff6c | ||
|
|
56a361650c | ||
|
|
d4763b157d | ||
|
|
d2dc072ba9 | ||
|
|
ffaca00594 | ||
|
|
9090b7dc3d | ||
|
|
a540fe4130 | ||
|
|
5be61bbb68 | ||
|
|
8e51fee5c1 | ||
|
|
9d6fcfdc85 | ||
|
|
5f5a3b78a5 | ||
|
|
4e5ca6d376 | ||
|
|
2fab75f448 | ||
|
|
22883f2fa2 | ||
|
|
5d9f80bc73 | ||
|
|
f7d117488b | ||
|
|
244a329ee7 | ||
|
|
044572cb60 | ||
|
|
746875258d | ||
|
|
4892a87dfe | ||
|
|
8b9c8ddb1e | ||
|
|
eb9000576c | ||
|
|
862aaf341e | ||
|
|
a5c75ff58b | ||
|
|
4541fb9819 | ||
|
|
9f8edd980c | ||
|
|
e5b9043435 | ||
|
|
c0012c2ea4 | ||
|
|
b77e4975f0 | ||
|
|
e83f2344f6 | ||
|
|
de6512be1a | ||
|
|
0b72ff1896 | ||
|
|
fea0192772 | ||
|
|
f81ac498fb | ||
|
|
5357e0a18c | ||
|
|
d7632bbd3d | ||
|
|
1b5e91e4b3 | ||
|
|
727195c767 | ||
|
|
9158f55360 | ||
|
|
8146e9d527 | ||
|
|
4247251020 | ||
|
|
7eee0e0ed6 | ||
|
|
4f0851ca77 | ||
|
|
911ae49767 | ||
|
|
5af81d4057 | ||
|
|
c435889baa | ||
|
|
49f79d9d5d | ||
|
|
1767cd0f6c | ||
|
|
3e0915521a | ||
|
|
a298943fac | ||
|
|
df9ddf96a5 | ||
|
|
4fa5d701d5 | ||
|
|
b05683d586 | ||
|
|
2f3f3fbcdb | ||
|
|
611605a67f | ||
|
|
0427a782be | ||
|
|
32baff5906 | ||
|
|
0089143d06 | ||
|
|
05e55cee23 | ||
|
|
31e7f0340f | ||
|
|
6e317a54fd | ||
|
|
9c1f62c38c | ||
|
|
1341d5557f | ||
|
|
b7d79a5f06 | ||
|
|
62233a4db4 | ||
|
|
4a7e2ddff5 | ||
|
|
fb737ebde0 | ||
|
|
bf77cb44e7 | ||
|
|
c72e2bb4a9 | ||
|
|
68c182b1df | ||
|
|
348d303794 | ||
|
|
ede0fd8660 | ||
|
|
187c2193e8 | ||
|
|
706bdd8059 | ||
|
|
436861edc8 | ||
|
|
9729a2e772 | ||
|
|
6b924c00c5 | ||
|
|
b90f4d29a4 | ||
|
|
47915f8c11 | ||
|
|
5dfdeaa4ea | ||
|
|
98a2a81f2a | ||
|
|
c4850027bc | ||
|
|
d4202e7f38 | ||
|
|
4f65283f31 | ||
|
|
d86d3bbe54 | ||
|
|
6f794738e8 | ||
|
|
ef7a93bb07 | ||
|
|
5197a992a6 | ||
|
|
49d8540f6d | ||
|
|
6e1a1f1a57 | ||
|
|
c73428247c | ||
|
|
fc2caf5794 | ||
|
|
b117826ada | ||
|
|
26b44b48ab | ||
|
|
6349f0feb1 | ||
|
|
2ae17cfb50 | ||
|
|
4785093a5c | ||
|
|
859aef78c4 | ||
|
|
20730a5465 | ||
|
|
fc5f687afc | ||
|
|
53e56f2395 | ||
|
|
da314aff79 | ||
|
|
fe89f7c5ac | ||
|
|
8b3be5e063 | ||
|
|
58dc538510 | ||
|
|
6cbef9355d | ||
|
|
22eac5c508 | ||
|
|
a2860e9c73 | ||
|
|
1c5258ab68 | ||
|
|
8641eaa538 | ||
|
|
88436383c0 | ||
|
|
affdcdcb0e | ||
|
|
06174be777 | ||
|
|
fde8401124 | ||
|
|
70ac33d58c | ||
|
|
5a897407d9 | ||
|
|
1b3c26364b | ||
|
|
ae07aa7864 | ||
|
|
fb80831269 | ||
|
|
561cecf383 | ||
|
|
60ccdc2deb | ||
|
|
d7d996b1d3 | ||
|
|
32b8bc39ac | ||
|
|
9dc99ad611 | ||
|
|
628cb4d553 | ||
|
|
ad80bce78d | ||
|
|
1c9d821aa2 | ||
|
|
510b060947 | ||
|
|
26e33ff093 | ||
|
|
5f2bd70690 | ||
|
|
6dfa550663 | ||
|
|
252e2420ad | ||
|
|
572d54981e | ||
|
|
61471f9fb4 | ||
|
|
4d0a742d64 | ||
|
|
5f4e0e5ff8 | ||
|
|
a4c159ecad | ||
|
|
b1f893e998 | ||
|
|
789dc165af | ||
|
|
115eda9650 | ||
|
|
d027e35cef | ||
|
|
b3e178af9d | ||
|
|
559ec8750a | ||
|
|
02c3980b83 | ||
|
|
6f027ee7dc | ||
|
|
6d6c2e5b99 | ||
|
|
4a4f752459 | ||
|
|
8f1fff1374 | ||
|
|
deead2af97 | ||
|
|
9e881ab637 | ||
|
|
b6ec02cef2 | ||
|
|
26e3ccda49 | ||
|
|
2bda79cb3a | ||
|
|
19c60ff5c5 | ||
|
|
e3c5c9a2e7 | ||
|
|
2c17c186b8 | ||
|
|
ef1697d00d | ||
|
|
40e7638a4b | ||
|
|
aaf69b2898 | ||
|
|
0464361ca5 | ||
|
|
420697693b | ||
|
|
37f53a42da | ||
|
|
5617ffc79c | ||
|
|
ca4d86e9e5 | ||
|
|
0141fef561 | ||
|
|
5d4a804c90 | ||
|
|
6bc3300e5a | ||
|
|
15f69bdc3b | ||
|
|
0bcf76970a | ||
|
|
03c4628cad | ||
|
|
9f4ae9618a | ||
|
|
3590af15bb | ||
|
|
c5de7fd20e | ||
|
|
7127fb1fa1 | ||
|
|
7cf11abefc | ||
|
|
d78b416e1a | ||
|
|
f5144ec899 | ||
|
|
08d1ebe7ee | ||
|
|
a665801e9f | ||
|
|
112e3b110b | ||
|
|
94a674c008 | ||
|
|
72be8eeb31 | ||
|
|
ad8690bb2e | ||
|
|
76cb08a72a | ||
|
|
2d4989e937 | ||
|
|
f248b91f82 | ||
|
|
d671eb1969 | ||
|
|
70f4906ca5 | ||
|
|
ffb9aa1ace | ||
|
|
823fd855cf | ||
|
|
f5ee225362 | ||
|
|
ff1ea4b1c9 | ||
|
|
779b5afa51 | ||
|
|
6d870f6ae4 | ||
|
|
d3926cbca9 | ||
|
|
a308804679 | ||
|
|
a4e4da705a | ||
|
|
7a494ec027 | ||
|
|
d53ebb101a | ||
|
|
f3168d22a6 | ||
|
|
be06101e9a | ||
|
|
6e4178981a | ||
|
|
b85ea59cda | ||
|
|
bbd68626cc | ||
|
|
8490173879 | ||
|
|
baed9518c2 | ||
|
|
27d0d9f2b3 | ||
|
|
382282b931 | ||
|
|
23d233857e | ||
|
|
9620bd0f22 | ||
|
|
ecfe56ca63 | ||
|
|
eabb02d3da | ||
|
|
da3953a388 | ||
|
|
2d26dbc96f | ||
|
|
7073471302 | ||
|
|
81f0e7de9e | ||
|
|
33e05f5912 | ||
|
|
c1d3e304cb | ||
|
|
1b169655ac | ||
|
|
67393e09c3 | ||
|
|
1ec8d2c531 | ||
|
|
a111bfb90a | ||
|
|
7dd326f090 | ||
|
|
24a26e025b | ||
|
|
1eb7ba0506 | ||
|
|
d17d99bd6d | ||
|
|
fd50b9a45e | ||
|
|
a1534dab02 | ||
|
|
7484458b7c | ||
|
|
5ca039c1db | ||
|
|
2294ae0c46 | ||
|
|
4d2b2a12ea | ||
|
|
c6d57059ff | ||
|
|
5f13cf767e | ||
|
|
93425b0500 | ||
|
|
a87ab6d0fc | ||
|
|
1c117c469a | ||
|
|
8003f8b803 | ||
|
|
7df93458d7 | ||
|
|
753618a19f | ||
|
|
e355756758 | ||
|
|
62a3b9e6a3 | ||
|
|
dc79393b27 | ||
|
|
c334aa2a4c | ||
|
|
9f61a4f5fd | ||
|
|
15d0050994 | ||
|
|
1846f337d8 | ||
|
|
a9e63039ce | ||
|
|
7edd5f27d1 | ||
|
|
9b47195974 | ||
|
|
4ef8041be0 | ||
|
|
f0a7395b30 | ||
|
|
c1a6effea0 | ||
|
|
f78efc46e7 | ||
|
|
42ae052da7 | ||
|
|
fab390826e | ||
|
|
2a9923628b | ||
|
|
291aa0b053 | ||
|
|
83eb75ad7a | ||
|
|
bb215966e5 | ||
|
|
545d49c70d | ||
|
|
ace44af815 | ||
|
|
699e97559d | ||
|
|
4aecf4c973 | ||
|
|
b092c5f37d | ||
|
|
aca8aec94b | ||
|
|
9cfb51c106 | ||
|
|
e2352f5126 | ||
|
|
40e624444c | ||
|
|
3cf67b1236 | ||
|
|
5dedb97fcc | ||
|
|
4590094605 | ||
|
|
15e7625c80 | ||
|
|
cdd2803498 | ||
|
|
43fb2b38b1 | ||
|
|
95224bd006 | ||
|
|
446183adee | ||
|
|
345a8fe748 | ||
|
|
d8593c5b4a | ||
|
|
f89d721c12 | ||
|
|
af34b7c25e | ||
|
|
b108aa1ace | ||
|
|
5dbf09c008 | ||
|
|
680dc18c6b | ||
|
|
73413ac6c0 | ||
|
|
f61c8e5e1d | ||
|
|
36713db990 | ||
|
|
6bb7d4002f | ||
|
|
aa28d487d3 | ||
|
|
a7d974481c | ||
|
|
3730314dd5 | ||
|
|
6b0c8c9fe0 | ||
|
|
28a56d24ad | ||
|
|
5e6629e1a7 | ||
|
|
a00b967df0 | ||
|
|
193e4ae31e | ||
|
|
409a27c3b8 | ||
|
|
ba97e8da7a | ||
|
|
c47e672eea | ||
|
|
43a19739ab | ||
|
|
36f9147b21 | ||
|
|
8647922df9 | ||
|
|
df3068d9ca | ||
|
|
036e67049b | ||
|
|
f02033acb7 | ||
|
|
91d73d65c3 | ||
|
|
81c4c23016 | ||
|
|
fef2bac8ab | ||
|
|
c59c5eb893 | ||
|
|
a977c1388a | ||
|
|
0f799ae313 | ||
|
|
23c3f3fdea | ||
|
|
82c7090e9e | ||
|
|
0fdfebdb67 | ||
|
|
208c551787 | ||
|
|
b10606e884 | ||
|
|
f4a64f77f2 | ||
|
|
e92477a752 | ||
|
|
37e0a73c8f | ||
|
|
4f76e05058 | ||
|
|
3134222d27 | ||
|
|
a9ed128dce | ||
|
|
c264cc4131 | ||
|
|
a7943ff934 | ||
|
|
c353914dd0 | ||
|
|
91319e3963 | ||
|
|
dc4ff941bd | ||
|
|
b597d5faf0 | ||
|
|
f6da36ad3a | ||
|
|
5f4e2749a2 | ||
|
|
69b1fb699f | ||
|
|
259f90bbf6 | ||
|
|
8665045326 | ||
|
|
a7bb8ee639 | ||
|
|
8f732e4f45 | ||
|
|
95a31b0c31 | ||
|
|
36b9f45368 | ||
|
|
46575804cc | ||
|
|
86a00b6872 | ||
|
|
23d6d13d80 | ||
|
|
09addfc87c | ||
|
|
a2f27a9409 | ||
|
|
412003efbf | ||
|
|
582b3aacf4 | ||
|
|
1af0b54c1e | ||
|
|
74ba2e6634 | ||
|
|
78608a5080 | ||
|
|
7a86637f8d | ||
|
|
c2961f2152 | ||
|
|
6845c6f958 | ||
|
|
794a056819 | ||
|
|
69ad75cf48 | ||
|
|
3db52155dd | ||
|
|
38805ae662 |
6
.eslintrc.json
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"extends": [
|
||||||
|
"./lint/eslintrc-gjs.json",
|
||||||
|
"./lint/eslintrc-shell.json"
|
||||||
|
]
|
||||||
|
}
|
||||||
1
.gitignore
vendored
@@ -80,3 +80,4 @@ tests/run-test.sh
|
|||||||
*~
|
*~
|
||||||
*.patch
|
*.patch
|
||||||
*.sw?
|
*.sw?
|
||||||
|
.vscode
|
||||||
|
|||||||
97
.gitlab-ci.yml
Normal file
@@ -0,0 +1,97 @@
|
|||||||
|
stages:
|
||||||
|
- review
|
||||||
|
- build
|
||||||
|
- test
|
||||||
|
|
||||||
|
variables:
|
||||||
|
JS_LOG: "js-report.txt"
|
||||||
|
POT_LOG: "pot-update.txt"
|
||||||
|
|
||||||
|
.only_default: &only_default
|
||||||
|
only:
|
||||||
|
- branches
|
||||||
|
- tags
|
||||||
|
- merge_requests
|
||||||
|
|
||||||
|
check_commit_log:
|
||||||
|
image: registry.gitlab.gnome.org/gnome/mutter/master:v2
|
||||||
|
stage: review
|
||||||
|
variables:
|
||||||
|
GIT_DEPTH: "100"
|
||||||
|
script:
|
||||||
|
- ./.gitlab-ci/check-commit-log.sh
|
||||||
|
only:
|
||||||
|
- merge_requests
|
||||||
|
|
||||||
|
js_check:
|
||||||
|
image: registry.gitlab.gnome.org/gnome/gnome-shell/extension-ci:v1
|
||||||
|
stage: review
|
||||||
|
script:
|
||||||
|
- find js -name '*.js' -exec js60 -c -s '{}' ';' 2>&1 | tee $JS_LOG
|
||||||
|
- (! grep -q . $JS_LOG)
|
||||||
|
<<: *only_default
|
||||||
|
artifacts:
|
||||||
|
paths:
|
||||||
|
- ${JS_LOG}
|
||||||
|
when: on_failure
|
||||||
|
|
||||||
|
eslint:
|
||||||
|
image: registry.gitlab.gnome.org/gnome/gnome-shell/extension-ci:v1
|
||||||
|
stage: review
|
||||||
|
script:
|
||||||
|
- ./.gitlab-ci/run-eslint.sh
|
||||||
|
<<: *only_default
|
||||||
|
artifacts:
|
||||||
|
paths:
|
||||||
|
- reports
|
||||||
|
when: always
|
||||||
|
|
||||||
|
build:
|
||||||
|
image: registry.gitlab.gnome.org/gnome/mutter/master:v2
|
||||||
|
stage: build
|
||||||
|
before_script:
|
||||||
|
- .gitlab-ci/checkout-mutter.sh
|
||||||
|
- meson mutter mutter/build --prefix=/usr -Dtests=false
|
||||||
|
- ninja -C mutter/build install
|
||||||
|
script:
|
||||||
|
- meson . build -Dbuiltype=debugoptimized -Dman=false --werror
|
||||||
|
- ninja -C build
|
||||||
|
- ninja -C build install
|
||||||
|
<<: *only_default
|
||||||
|
artifacts:
|
||||||
|
expire_in: 1 day
|
||||||
|
paths:
|
||||||
|
- mutter
|
||||||
|
- build
|
||||||
|
|
||||||
|
test:
|
||||||
|
image: registry.gitlab.gnome.org/gnome/mutter/master:v2
|
||||||
|
stage: test
|
||||||
|
variables:
|
||||||
|
XDG_RUNTIME_DIR: "$CI_PROJECT_DIR/runtime-dir"
|
||||||
|
before_script:
|
||||||
|
- ninja -C mutter/build install
|
||||||
|
script:
|
||||||
|
- xvfb-run meson test -C build --no-rebuild
|
||||||
|
<<: *only_default
|
||||||
|
artifacts:
|
||||||
|
expire_in: 1 day
|
||||||
|
paths:
|
||||||
|
- build/meson-logs/testlog.txt
|
||||||
|
when: on_failure
|
||||||
|
|
||||||
|
test-pot:
|
||||||
|
image: registry.gitlab.gnome.org/gnome/mutter/master:v2
|
||||||
|
stage: test
|
||||||
|
before_script:
|
||||||
|
- ninja -C mutter/build install
|
||||||
|
script:
|
||||||
|
# Check that pot files are generated correctly:
|
||||||
|
# https://savannah.gnu.org/bugs/?50920#comment5
|
||||||
|
- ninja -C build gnome-shell-pot 2>&1 | awk '
|
||||||
|
BEGIN { start=0; }
|
||||||
|
start==1 { print $0; }
|
||||||
|
/gnome-shell-pot/ { start=1; }
|
||||||
|
' | tee $POT_LOG
|
||||||
|
- (! grep -q . $POT_LOG)
|
||||||
|
<<: *only_default
|
||||||
18
.gitlab-ci/Dockerfile.extension-ci
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
FROM registry.fedoraproject.org/fedora:latest
|
||||||
|
|
||||||
|
RUN dnf -y update && dnf -y upgrade && \
|
||||||
|
dnf install -y 'dnf-command(copr)' git && \
|
||||||
|
|
||||||
|
# For syntax checks with `find . -name '*.js' -exec js60 -c -s '{}' ';'`
|
||||||
|
dnf install -y findutils mozjs60-devel && \
|
||||||
|
|
||||||
|
# For static analysis with eslint
|
||||||
|
dnf install -y nodejs && \
|
||||||
|
npm install -g eslint && \
|
||||||
|
|
||||||
|
# Shameless plug for my own tooling; useful for generating zip
|
||||||
|
dnf copr enable -y fmuellner/gnome-shell-ci && \
|
||||||
|
dnf install -y gnome-extensions-tool meson && \
|
||||||
|
|
||||||
|
dnf clean all && \
|
||||||
|
rm -rf /var/cache/dnf
|
||||||
31
.gitlab-ci/check-commit-log.sh
Executable file
@@ -0,0 +1,31 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
if [ -z "$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" ]; then
|
||||||
|
echo Cannot review non-merge request
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
git fetch $CI_MERGE_REQUEST_PROJECT_URL.git $CI_MERGE_REQUEST_TARGET_BRANCH_NAME
|
||||||
|
|
||||||
|
branch_point=$(git merge-base HEAD FETCH_HEAD)
|
||||||
|
|
||||||
|
commits=$(git log --format='format:%H' $branch_point..$CI_COMMIT_SHA)
|
||||||
|
|
||||||
|
if [ -z "$commits" ]; then
|
||||||
|
echo Commit range empty
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
function commit_message_has_url() {
|
||||||
|
commit=$1
|
||||||
|
commit_message=$(git show -s --format='format:%b' $commit)
|
||||||
|
echo "$commit_message" | grep -qe "\($CI_MERGE_REQUEST_PROJECT_URL/\(issues\|merge_requests\)/[0-9]\+\|https://bugzilla.gnome.org/show_bug.cgi?id=[0-9]\+\)"
|
||||||
|
return $?
|
||||||
|
}
|
||||||
|
|
||||||
|
for commit in $commits; do
|
||||||
|
if ! commit_message_has_url $commit; then
|
||||||
|
echo "Missing merge request or issue URL on commit $(echo $commit | cut -c -8)"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
35
.gitlab-ci/checkout-mutter.sh
Executable file
@@ -0,0 +1,35 @@
|
|||||||
|
#!/usr/bin/bash
|
||||||
|
|
||||||
|
shell_branch=$(git describe --contains --all HEAD)
|
||||||
|
mutter_target=
|
||||||
|
|
||||||
|
git clone https://gitlab.gnome.org/GNOME/mutter.git
|
||||||
|
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo Checkout failed
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
cd mutter
|
||||||
|
|
||||||
|
if [ "$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" ]; then
|
||||||
|
merge_request_remote=${CI_MERGE_REQUEST_SOURCE_PROJECT_URL//gnome-shell/mutter}
|
||||||
|
merge_request_branch=$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME
|
||||||
|
|
||||||
|
echo Looking for $merge_request_branch on remote ...
|
||||||
|
if git fetch -q $merge_request_remote $merge_request_branch 2>/dev/null; then
|
||||||
|
mutter_target=FETCH_HEAD
|
||||||
|
else
|
||||||
|
mutter_target=origin/$CI_MERGE_REQUEST_TARGET_BRANCH_NAME
|
||||||
|
echo Using $mutter_target instead
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$mutter_target" ]; then
|
||||||
|
mutter_target=$(git branch -r -l origin/$shell_branch)
|
||||||
|
mutter_target=${mutter_target:-$(git branch -r -l ${shell_branch#remotes/})}
|
||||||
|
mutter_target=${mutter_target:-origin/master}
|
||||||
|
echo Using $mutter_target instead
|
||||||
|
fi
|
||||||
|
|
||||||
|
git checkout -q $mutter_target
|
||||||
105
.gitlab-ci/run-eslint.sh
Executable file
@@ -0,0 +1,105 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
OUTPUT_REGULAR=reports/lint-regular-report.txt
|
||||||
|
OUTPUT_LEGACY=reports/lint-legacy-report.txt
|
||||||
|
OUTPUT_FINAL=reports/lint-common-report.txt
|
||||||
|
|
||||||
|
OUTPUT_MR=reports/lint-mr-report.txt
|
||||||
|
|
||||||
|
LINE_CHANGES=changed-lines.txt
|
||||||
|
|
||||||
|
is_empty() {
|
||||||
|
(! grep -q . $1)
|
||||||
|
}
|
||||||
|
|
||||||
|
run_eslint() {
|
||||||
|
ARGS_LEGACY='--config lint/eslintrc-legacy.json'
|
||||||
|
|
||||||
|
local extra_args=ARGS_$1
|
||||||
|
local output=OUTPUT_$1
|
||||||
|
eslint -f unix ${!extra_args} -o ${!output} js
|
||||||
|
}
|
||||||
|
|
||||||
|
list_commit_range_additions() {
|
||||||
|
# Turn raw context-less git-diff into a list of
|
||||||
|
# filename:lineno pairs of new (+) lines
|
||||||
|
git diff -U0 "$@" -- js |
|
||||||
|
awk '
|
||||||
|
BEGIN { file=""; }
|
||||||
|
/^+++ b/ { file=substr($0,7); }
|
||||||
|
/^@@ / {
|
||||||
|
len = split($3,a,",")
|
||||||
|
start=a[1]
|
||||||
|
count=(len > 1) ? a[2] : 1
|
||||||
|
|
||||||
|
for (line=start; line<start+count; line++)
|
||||||
|
printf "%s/%s:%d:\n",ENVIRON["PWD"],file,line;
|
||||||
|
}'
|
||||||
|
}
|
||||||
|
|
||||||
|
copy_matched_lines() {
|
||||||
|
local source=$1
|
||||||
|
local matches=$2
|
||||||
|
local target=$3
|
||||||
|
|
||||||
|
echo -n > $target
|
||||||
|
for l in $(<$matches); do
|
||||||
|
grep $l $source >> $target
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
create_common() {
|
||||||
|
# comm requires sorted input;
|
||||||
|
# we also strip the error message to make the following a "common" error:
|
||||||
|
# regular:
|
||||||
|
# file.js:42:23 Indentation of 55, expected 42
|
||||||
|
# legacy:
|
||||||
|
# file.js:42:23 Indentation of 55, extected 24
|
||||||
|
prepare() {
|
||||||
|
sed 's: .*::' $1 | sort
|
||||||
|
}
|
||||||
|
|
||||||
|
comm -12 <(prepare $OUTPUT_REGULAR) <(prepare $OUTPUT_LEGACY) >$OUTPUT_FINAL.tmp
|
||||||
|
|
||||||
|
# Now add back the stripped error messages
|
||||||
|
copy_matched_lines $OUTPUT_REGULAR $OUTPUT_FINAL.tmp $OUTPUT_FINAL
|
||||||
|
rm $OUTPUT_FINAL.tmp
|
||||||
|
}
|
||||||
|
|
||||||
|
# Disable MR handling for now. We aren't ready to enforce
|
||||||
|
# non-legacy style just yet ...
|
||||||
|
unset CI_MERGE_REQUEST_TARGET_BRANCH_NAME
|
||||||
|
|
||||||
|
if [ "$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" ]; then
|
||||||
|
git fetch $CI_MERGE_REQUEST_PROJECT_URL.git $CI_MERGE_REQUEST_TARGET_BRANCH_NAME
|
||||||
|
branch_point=$(git merge-base HEAD FETCH_HEAD)
|
||||||
|
commit_range=$branch_point...$CI_COMMIT_SHA
|
||||||
|
|
||||||
|
list_commit_range_additions $commit_range > $LINE_CHANGES
|
||||||
|
|
||||||
|
# Don't bother with running lint when no JS changed
|
||||||
|
if is_empty $LINE_CHANGES; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo Generating lint report using regular configuration
|
||||||
|
run_eslint REGULAR
|
||||||
|
echo Generating lint report using legacy configuration
|
||||||
|
run_eslint LEGACY
|
||||||
|
echo Done.
|
||||||
|
create_common
|
||||||
|
|
||||||
|
if ! is_empty $OUTPUT_FINAL; then
|
||||||
|
cat $OUTPUT_FINAL
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Just show the report and succeed when not testing a MR
|
||||||
|
if [ -z "$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" ]; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
copy_matched_lines $OUTPUT_REGULAR $LINE_CHANGES $OUTPUT_MR
|
||||||
|
cat $OUTPUT_MR
|
||||||
|
is_empty $OUTPUT_MR
|
||||||
31
.project
@@ -1,31 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<projectDescription>
|
|
||||||
<name>gnome-shell</name>
|
|
||||||
<comment></comment>
|
|
||||||
<projects>
|
|
||||||
</projects>
|
|
||||||
<buildSpec>
|
|
||||||
<buildCommand>
|
|
||||||
<name>org.eclipse.wst.jsdt.core.javascriptValidator</name>
|
|
||||||
<arguments>
|
|
||||||
</arguments>
|
|
||||||
</buildCommand>
|
|
||||||
<buildCommand>
|
|
||||||
<name>org.eclipse.linuxtools.cdt.autotools.genmakebuilder</name>
|
|
||||||
<arguments>
|
|
||||||
</arguments>
|
|
||||||
</buildCommand>
|
|
||||||
<buildCommand>
|
|
||||||
<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
|
|
||||||
<arguments>
|
|
||||||
</arguments>
|
|
||||||
</buildCommand>
|
|
||||||
</buildSpec>
|
|
||||||
<natures>
|
|
||||||
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
|
|
||||||
<nature>org.eclipse.linuxtools.cdt.autotools.autotoolsNature</nature>
|
|
||||||
<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
|
|
||||||
<nature>org.eclipse.cdt.core.cnature</nature>
|
|
||||||
<nature>org.eclipse.wst.jsdt.core.jsNature</nature>
|
|
||||||
</natures>
|
|
||||||
</projectDescription>
|
|
||||||
@@ -1,148 +0,0 @@
|
|||||||
#Fri Nov 28 14:33:30 EST 2008
|
|
||||||
eclipse.preferences.version=1
|
|
||||||
org.eclipse.cdt.core.formatter.alignment_for_arguments_in_method_invocation=16
|
|
||||||
org.eclipse.cdt.core.formatter.alignment_for_base_clause_in_type_declaration=80
|
|
||||||
org.eclipse.cdt.core.formatter.alignment_for_compact_if=0
|
|
||||||
org.eclipse.cdt.core.formatter.alignment_for_conditional_expression=80
|
|
||||||
org.eclipse.cdt.core.formatter.alignment_for_declarator_list=16
|
|
||||||
org.eclipse.cdt.core.formatter.alignment_for_enumerator_list=48
|
|
||||||
org.eclipse.cdt.core.formatter.alignment_for_expression_list=0
|
|
||||||
org.eclipse.cdt.core.formatter.alignment_for_expressions_in_array_initializer=16
|
|
||||||
org.eclipse.cdt.core.formatter.alignment_for_parameters_in_method_declaration=16
|
|
||||||
org.eclipse.cdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
|
|
||||||
org.eclipse.cdt.core.formatter.brace_position_for_array_initializer=next_line_shifted
|
|
||||||
org.eclipse.cdt.core.formatter.brace_position_for_block=next_line_shifted
|
|
||||||
org.eclipse.cdt.core.formatter.brace_position_for_block_in_case=next_line_shifted
|
|
||||||
org.eclipse.cdt.core.formatter.brace_position_for_method_declaration=next_line
|
|
||||||
org.eclipse.cdt.core.formatter.brace_position_for_namespace_declaration=next_line
|
|
||||||
org.eclipse.cdt.core.formatter.brace_position_for_switch=next_line_shifted
|
|
||||||
org.eclipse.cdt.core.formatter.brace_position_for_type_declaration=next_line
|
|
||||||
org.eclipse.cdt.core.formatter.compact_else_if=true
|
|
||||||
org.eclipse.cdt.core.formatter.continuation_indentation=2
|
|
||||||
org.eclipse.cdt.core.formatter.continuation_indentation_for_array_initializer=2
|
|
||||||
org.eclipse.cdt.core.formatter.format_guardian_clause_on_one_line=false
|
|
||||||
org.eclipse.cdt.core.formatter.indent_access_specifier_compare_to_type_header=false
|
|
||||||
org.eclipse.cdt.core.formatter.indent_body_declarations_compare_to_access_specifier=true
|
|
||||||
org.eclipse.cdt.core.formatter.indent_body_declarations_compare_to_namespace_header=true
|
|
||||||
org.eclipse.cdt.core.formatter.indent_breaks_compare_to_cases=true
|
|
||||||
org.eclipse.cdt.core.formatter.indent_declaration_compare_to_template_header=true
|
|
||||||
org.eclipse.cdt.core.formatter.indent_empty_lines=false
|
|
||||||
org.eclipse.cdt.core.formatter.indent_statements_compare_to_block=true
|
|
||||||
org.eclipse.cdt.core.formatter.indent_statements_compare_to_body=true
|
|
||||||
org.eclipse.cdt.core.formatter.indent_switchstatements_compare_to_cases=true
|
|
||||||
org.eclipse.cdt.core.formatter.indent_switchstatements_compare_to_switch=false
|
|
||||||
org.eclipse.cdt.core.formatter.indentation.size=8
|
|
||||||
org.eclipse.cdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_new_line_after_template_declaration=insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_new_line_before_else_in_if_statement=insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_new_line_before_identifier_in_function_declaration=insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_new_line_before_while_in_do_statement=insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_new_line_in_empty_block=insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_after_assignment_operator=insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_after_binary_operator=insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_after_closing_angle_bracket_in_template_arguments=insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_after_closing_angle_bracket_in_template_parameters=insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_after_closing_brace_in_block=insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_after_colon_in_base_clause=insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_after_colon_in_case=insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_after_colon_in_conditional=insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_base_types=insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_declarator_list=insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_expression_list=insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_template_arguments=insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_template_parameters=insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_after_opening_angle_bracket_in_template_arguments=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_after_opening_angle_bracket_in_template_parameters=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_after_opening_bracket=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_after_postfix_operator=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_after_prefix_operator=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_after_question_in_conditional=insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_after_semicolon_in_for=insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_after_unary_operator=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_before_assignment_operator=insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_before_binary_operator=insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_before_closing_angle_bracket_in_template_arguments=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_before_closing_angle_bracket_in_template_parameters=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_before_closing_bracket=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_before_colon_in_base_clause=insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_before_colon_in_case=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_before_colon_in_conditional=insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_before_colon_in_default=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_base_types=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_declarator_list=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_expression_list=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_template_arguments=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_template_parameters=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_before_opening_angle_bracket_in_template_arguments=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_before_opening_angle_bracket_in_template_parameters=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_block=insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_namespace_declaration=insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_before_opening_bracket=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_for=insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_if=insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_while=insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_before_postfix_operator=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_before_prefix_operator=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_before_question_in_conditional=insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_before_semicolon=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_before_unary_operator=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_between_empty_brackets=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
|
|
||||||
org.eclipse.cdt.core.formatter.keep_else_statement_on_same_line=false
|
|
||||||
org.eclipse.cdt.core.formatter.keep_empty_array_initializer_on_one_line=false
|
|
||||||
org.eclipse.cdt.core.formatter.keep_imple_if_on_one_line=false
|
|
||||||
org.eclipse.cdt.core.formatter.keep_then_statement_on_same_line=false
|
|
||||||
org.eclipse.cdt.core.formatter.lineSplit=80
|
|
||||||
org.eclipse.cdt.core.formatter.number_of_empty_lines_to_preserve=1
|
|
||||||
org.eclipse.cdt.core.formatter.put_empty_statement_on_new_line=true
|
|
||||||
org.eclipse.cdt.core.formatter.tabulation.char=space
|
|
||||||
org.eclipse.cdt.core.formatter.tabulation.size=2
|
|
||||||
org.eclipse.cdt.core.formatter.use_tabs_only_for_leading_indentations=false
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
#Fri Nov 28 14:33:30 EST 2008
|
|
||||||
eclipse.preferences.version=1
|
|
||||||
formatter_profile=org.eclipse.cdt.ui.default.gnu_profile
|
|
||||||
formatter_settings_version=1
|
|
||||||
@@ -1,315 +0,0 @@
|
|||||||
#Fri Nov 28 14:43:43 EST 2008
|
|
||||||
eclipse.preferences.version=1
|
|
||||||
org.eclipse.wst.jsdt.core.codeComplete.argumentPrefixes=
|
|
||||||
org.eclipse.wst.jsdt.core.codeComplete.argumentSuffixes=
|
|
||||||
org.eclipse.wst.jsdt.core.codeComplete.fieldPrefixes=
|
|
||||||
org.eclipse.wst.jsdt.core.codeComplete.fieldSuffixes=
|
|
||||||
org.eclipse.wst.jsdt.core.codeComplete.localPrefixes=
|
|
||||||
org.eclipse.wst.jsdt.core.codeComplete.localSuffixes=
|
|
||||||
org.eclipse.wst.jsdt.core.codeComplete.staticFieldPrefixes=
|
|
||||||
org.eclipse.wst.jsdt.core.codeComplete.staticFieldSuffixes=
|
|
||||||
org.eclipse.wst.jsdt.core.compiler.codegen.inlineJsrBytecode=disabled
|
|
||||||
org.eclipse.wst.jsdt.core.compiler.codegen.targetPlatform=1.2
|
|
||||||
org.eclipse.wst.jsdt.core.compiler.codegen.unusedLocal=preserve
|
|
||||||
org.eclipse.wst.jsdt.core.compiler.compliance=1.4
|
|
||||||
org.eclipse.wst.jsdt.core.compiler.debug.lineNumber=generate
|
|
||||||
org.eclipse.wst.jsdt.core.compiler.debug.localVariable=generate
|
|
||||||
org.eclipse.wst.jsdt.core.compiler.debug.sourceFile=generate
|
|
||||||
org.eclipse.wst.jsdt.core.compiler.problem.assertIdentifier=warning
|
|
||||||
org.eclipse.wst.jsdt.core.compiler.problem.deprecation=warning
|
|
||||||
org.eclipse.wst.jsdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
|
|
||||||
org.eclipse.wst.jsdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
|
|
||||||
org.eclipse.wst.jsdt.core.compiler.problem.discouragedReference=warning
|
|
||||||
org.eclipse.wst.jsdt.core.compiler.problem.emptyStatement=ignore
|
|
||||||
org.eclipse.wst.jsdt.core.compiler.problem.enumIdentifier=warning
|
|
||||||
org.eclipse.wst.jsdt.core.compiler.problem.fallthroughCase=ignore
|
|
||||||
org.eclipse.wst.jsdt.core.compiler.problem.fieldHiding=ignore
|
|
||||||
org.eclipse.wst.jsdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
|
|
||||||
org.eclipse.wst.jsdt.core.compiler.problem.forbiddenReference=ignore
|
|
||||||
org.eclipse.wst.jsdt.core.compiler.problem.hiddenCatchBlock=warning
|
|
||||||
org.eclipse.wst.jsdt.core.compiler.problem.indirectStaticAccess=ignore
|
|
||||||
org.eclipse.wst.jsdt.core.compiler.problem.localVariableHiding=ignore
|
|
||||||
org.eclipse.wst.jsdt.core.compiler.problem.looseVarDecleration=warning
|
|
||||||
org.eclipse.wst.jsdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
|
|
||||||
org.eclipse.wst.jsdt.core.compiler.problem.noEffectAssignment=warning
|
|
||||||
org.eclipse.wst.jsdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
|
|
||||||
org.eclipse.wst.jsdt.core.compiler.problem.nullReference=ignore
|
|
||||||
org.eclipse.wst.jsdt.core.compiler.problem.optionalSemicolon=warning
|
|
||||||
org.eclipse.wst.jsdt.core.compiler.problem.parameterAssignment=ignore
|
|
||||||
org.eclipse.wst.jsdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
|
|
||||||
org.eclipse.wst.jsdt.core.compiler.problem.potentialNullReference=ignore
|
|
||||||
org.eclipse.wst.jsdt.core.compiler.problem.redundantNullCheck=ignore
|
|
||||||
org.eclipse.wst.jsdt.core.compiler.problem.undefinedField=warning
|
|
||||||
org.eclipse.wst.jsdt.core.compiler.problem.undocumentedEmptyBlock=ignore
|
|
||||||
org.eclipse.wst.jsdt.core.compiler.problem.unnecessaryElse=ignore
|
|
||||||
org.eclipse.wst.jsdt.core.compiler.problem.unresolvedFieldReference=ignore
|
|
||||||
org.eclipse.wst.jsdt.core.compiler.problem.unresolvedMethodReference=ignore
|
|
||||||
org.eclipse.wst.jsdt.core.compiler.problem.unresolvedTypeReference=ignore
|
|
||||||
org.eclipse.wst.jsdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
|
|
||||||
org.eclipse.wst.jsdt.core.compiler.problem.unusedLabel=warning
|
|
||||||
org.eclipse.wst.jsdt.core.compiler.problem.unusedLocal=warning
|
|
||||||
org.eclipse.wst.jsdt.core.compiler.problem.unusedParameter=ignore
|
|
||||||
org.eclipse.wst.jsdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
|
|
||||||
org.eclipse.wst.jsdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
|
|
||||||
org.eclipse.wst.jsdt.core.compiler.problem.unusedPrivateMember=warning
|
|
||||||
org.eclipse.wst.jsdt.core.compiler.source=1.3
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.align_type_members_on_columns=false
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.alignment_for_arguments_in_enum_constant=16
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.alignment_for_arguments_in_method_invocation=16
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.alignment_for_assignment=0
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.alignment_for_binary_expression=16
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.alignment_for_compact_if=16
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.alignment_for_conditional_expression=80
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.alignment_for_enum_constants=0
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.alignment_for_expressions_in_array_initializer=16
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.alignment_for_multiple_fields=16
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.alignment_for_parameters_in_method_declaration=16
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.alignment_for_selector_in_method_invocation=16
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.alignment_for_superclass_in_type_declaration=16
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.blank_lines_after_imports=1
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.blank_lines_after_package=1
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.blank_lines_before_field=0
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.blank_lines_before_first_class_body_declaration=0
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.blank_lines_before_imports=1
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.blank_lines_before_member_type=1
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.blank_lines_before_method=1
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.blank_lines_before_new_chunk=1
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.blank_lines_before_package=0
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.blank_lines_between_import_groups=1
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.blank_lines_between_type_declarations=0
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.brace_position_for_array_initializer=end_of_line
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.brace_position_for_block=end_of_line
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.brace_position_for_block_in_case=end_of_line
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.brace_position_for_enum_constant=end_of_line
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.brace_position_for_enum_declaration=end_of_line
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.brace_position_for_method_declaration=end_of_line
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.brace_position_for_objlit_initializer=end_of_line
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.brace_position_for_switch=end_of_line
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.brace_position_for_type_declaration=end_of_line
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.comment.format_block_comments=true
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.comment.format_header=false
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.comment.format_html=true
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.comment.format_javadoc_comments=true
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.comment.format_line_comments=true
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.comment.format_source_code=true
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.comment.indent_parameter_description=true
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.comment.indent_root_tags=true
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.comment.insert_new_line_before_root_tags=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.comment.insert_new_line_for_parameter=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.comment.line_length=80
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.compact_else_if=true
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.continuation_indentation=2
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.continuation_indentation_for_array_initializer=2
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.continuation_indentation_for_objlit_initializer=1
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.format_guardian_clause_on_one_line=false
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.indent_body_declarations_compare_to_type_header=true
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.indent_breaks_compare_to_cases=true
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.indent_empty_lines=false
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.indent_statements_compare_to_block=true
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.indent_statements_compare_to_body=true
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.indent_switchstatements_compare_to_cases=true
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.indent_switchstatements_compare_to_switch=false
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.indentation.size=4
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_new_line_after_annotation=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_new_line_after_comma_in_objlit_initializer=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_new_line_after_opening_brace_in_objlit_initializer=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_new_line_before_closing_brace_in_objlit_initializer=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_new_line_in_empty_block=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_new_line_in_empty_method_body=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_and_in_type_parameter=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_assignment_operator=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_at_in_annotation=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_binary_operator=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_closing_brace_in_block=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_colon_in_assert=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_colon_in_case=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_colon_in_conditional=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_colon_in_for=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_comma_in_annotation=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_comma_in_for_increments=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_comma_in_for_inits=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_ellipsis=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_postfix_operator=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_prefix_operator=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_question_in_conditional=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_semicolon_in_for=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_after_unary_operator=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_and_in_type_parameter=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_assignment_operator=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_binary_operator=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_colon_in_assert=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_colon_in_case=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_colon_in_conditional=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_colon_in_default=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_colon_in_for=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_ellipsis=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_brace_in_block=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_paren_in_for=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_paren_in_if=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_paren_in_while=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_postfix_operator=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_prefix_operator=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_question_in_conditional=insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_semicolon=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_before_unary_operator=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.keep_else_statement_on_same_line=false
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.keep_empty_array_initializer_on_one_line=false
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.keep_empty_objlit_initializer_on_one_line=false
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.keep_imple_if_on_one_line=false
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.keep_then_statement_on_same_line=false
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.lineSplit=80
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.never_indent_block_comments_on_first_column=false
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.never_indent_line_comments_on_first_column=false
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.number_of_empty_lines_to_preserve=1
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.put_empty_statement_on_new_line=true
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.tabulation.char=space
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.tabulation.size=4
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.use_tabs_only_for_leading_indentations=false
|
|
||||||
org.eclipse.wst.jsdt.core.formatter.wrap_before_binary_operator=true
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
#Fri Nov 28 14:39:12 EST 2008
|
|
||||||
eclipse.preferences.version=1
|
|
||||||
formatter_profile=_gjs
|
|
||||||
formatter_settings_version=11
|
|
||||||
org.eclipse.wst.jsdt.ui.exception.name=e
|
|
||||||
org.eclipse.wst.jsdt.ui.gettersetter.use.is=true
|
|
||||||
org.eclipse.wst.jsdt.ui.javadoc=false
|
|
||||||
org.eclipse.wst.jsdt.ui.keywordthis=false
|
|
||||||
org.eclipse.wst.jsdt.ui.overrideannotation=true
|
|
||||||
org.eclipse.wst.jsdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates/>
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
org.eclipse.wst.jsdt.launching.baseBrowserLibrary
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
Window
|
|
||||||
82
HACKING.md
@@ -80,13 +80,10 @@ e.g. `imports.ui.popupMenu`.
|
|||||||
Each import block should be sorted alphabetically. Don't import modules you
|
Each import block should be sorted alphabetically. Don't import modules you
|
||||||
don't use.
|
don't use.
|
||||||
```javascript
|
```javascript
|
||||||
const GLib = imports.gi.GLib;
|
const { GLib, Gio, St } = imports.gi;
|
||||||
const Gio = imports.gi.Gio;
|
|
||||||
const St = imports.gi.St;
|
|
||||||
|
|
||||||
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 Util = imports.misc.util;
|
const Util = imports.misc.util;
|
||||||
```
|
```
|
||||||
The alphabetical ordering should be done independently of the location of the
|
The alphabetical ordering should be done independently of the location of the
|
||||||
@@ -158,15 +155,15 @@ you to inherit from a type to use it, you can do so:
|
|||||||
var MyClutterActor = GObject.registerClass(
|
var MyClutterActor = GObject.registerClass(
|
||||||
class MyClutterActor extends Clutter.Actor {
|
class MyClutterActor extends Clutter.Actor {
|
||||||
|
|
||||||
vfunc_get_preferred_width(actor, forHeight) {
|
vfunc_get_preferred_width(forHeight) {
|
||||||
return [100, 100];
|
return [100, 100];
|
||||||
}
|
}
|
||||||
|
|
||||||
vfunc_get_preferred_height(actor, forWidth) {
|
vfunc_get_preferred_height(forWidth) {
|
||||||
return [100, 100];
|
return [100, 100];
|
||||||
}
|
}
|
||||||
|
|
||||||
vfunc_paint(actor) {
|
vfunc_paint() {
|
||||||
let alloc = this.get_allocation_box();
|
let alloc = this.get_allocation_box();
|
||||||
Cogl.set_source_color4ub(255, 0, 0, 255);
|
Cogl.set_source_color4ub(255, 0, 0, 255);
|
||||||
Cogl.rectangle(alloc.x1, alloc.y1,
|
Cogl.rectangle(alloc.x1, alloc.y1,
|
||||||
@@ -279,34 +276,49 @@ If your usage of an object is like a hash table (and thus conceptually the keys
|
|||||||
can have special chars in them), don't use quotes, but use brackets: `{ bar: 42
|
can have special chars in them), don't use quotes, but use brackets: `{ bar: 42
|
||||||
}`, `foo['bar']`.
|
}`, `foo['bar']`.
|
||||||
|
|
||||||
## Getters, setters, and Tweener
|
## Animations
|
||||||
|
|
||||||
|
Most objects that are animated are actors, and most properties used in animations
|
||||||
|
are animatable, which means they can use implicit animations:
|
||||||
|
|
||||||
Getters and setters should be used when you are dealing with an API that is
|
|
||||||
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
|
|
||||||
property.
|
|
||||||
```javascript
|
```javascript
|
||||||
var ANIMATION_TIME = 2000;
|
moveActor(actor, x, y) {
|
||||||
|
actor.ease({
|
||||||
var MyClass = class {
|
x,
|
||||||
constructor() {
|
y,
|
||||||
this.actor = new St.BoxLayout();
|
duration: 500, // ms
|
||||||
this._position = 0;
|
mode: Clutter.AnimationMode.EASE_OUT_QUAD
|
||||||
}
|
});
|
||||||
|
}
|
||||||
get position() {
|
```
|
||||||
return this._position;
|
|
||||||
}
|
The above is a convenience wrapper around the actual Clutter API, and should generally
|
||||||
|
be preferred over the more verbose:
|
||||||
set position(value) {
|
|
||||||
this._position = value;
|
```javascript
|
||||||
this.actor.set_position(value, value);
|
moveActor(actor, x, y) {
|
||||||
}
|
actor.save_easing_state();
|
||||||
};
|
|
||||||
|
actor.set_easing_duration(500);
|
||||||
let myThing = new MyClass();
|
actor.set_easing_mode(Clutter.AnimationMode.EASE_OUT_QUAD);
|
||||||
Tweener.addTween(myThing,
|
actor.set({
|
||||||
{ position: 100,
|
x,
|
||||||
time: ANIMATION_TIME,
|
y
|
||||||
transition: 'easeOutQuad' });
|
});
|
||||||
|
|
||||||
|
actor.restore_easing_state();
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
There is a similar convenience API around Clutter.PropertyTransition to animate
|
||||||
|
actor (or actor meta) properties that cannot use implicit animations:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
desaturateActor(actor, desaturate) {
|
||||||
|
let factor = desaturate ? 1.0 : 0.0;
|
||||||
|
actor.ease_property('@effects.desaturate.factor', factor, {
|
||||||
|
duration: 500, // ms
|
||||||
|
mode: Clutter.AnimationMode.EASE_OUT_QUAD
|
||||||
|
});
|
||||||
|
}
|
||||||
```
|
```
|
||||||
|
|||||||
343
NEWS
@@ -1,3 +1,346 @@
|
|||||||
|
3.34.1
|
||||||
|
======
|
||||||
|
* Fix "Frequent" view icons disappearing on hover [Jonas D.; #1502]
|
||||||
|
* Allow editing app folder names [Georges, Marco; !675, !720]
|
||||||
|
* Skip property transitions while hidden [Florian; !708]
|
||||||
|
* Make menu animations more consistent [Florian, GB_2; #1595, !717]
|
||||||
|
* Improve performance when enabling/disabling all extensions [Jonas D.; !96]
|
||||||
|
* Fix extra icons appearing in "Frequent" view animation [Georges; !696]
|
||||||
|
* Fix fading out desktop icons [Harshula; #1616]
|
||||||
|
* Fix box-shadow glitch with prerendered resources [Daniel; #1186]
|
||||||
|
* Fix accidentally skipped animations [Florian; #1572]
|
||||||
|
* Fix screenshots and window animations when scaled [Robert; !728]
|
||||||
|
* Don't leak NOTIFY_SOCKET environment variable to applications [Benjamin; !741]
|
||||||
|
* Fix lock-up on X11 when ibus is already running on startup [Marco; #1712]
|
||||||
|
* Fix screen dimming on idle [Marco; #1683]
|
||||||
|
* Do not notify systemd before initialization is complete [Iain; !750]
|
||||||
|
* Support SAE secrets in network agent [Lubomir; !751]
|
||||||
|
* Fix various regressions with dynamic workspaces [Florian; #1497]
|
||||||
|
* Fixed crashes [Florian, Marco; #1678, !746]
|
||||||
|
* Misc. bug fixes and cleanups [Marco, Jonas D., Florian, Iain, Georges,
|
||||||
|
Jonas Å., Martin, Takao, Carlos; !700, !705, !709, !711, !707, #1538, !710,
|
||||||
|
!713, !699, !715, !718, !716, !719, !721, #1243, !725, !731, #1614, !683,
|
||||||
|
!732, !121, !735, !736, !740, #573, #1641, #1571]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Marco Trevisan (Treviño), Benjamin Berg, Jonas Dreßler, Takao Fujiwara, GB_2,
|
||||||
|
Carlos Garnacho, Harshula Jayasuriya, Iain Lane, Robert Mader,
|
||||||
|
Daniel García Moreno, Florian Müllner, Georges Basile Stavracas Neto,
|
||||||
|
Lubomir Rintel, Martin Zurowietz, Jonas Ådahl
|
||||||
|
|
||||||
|
Translators:
|
||||||
|
Rafael Fontenelle [pt_BR], Fran Dieguez [gl], Balázs Úr [hu],
|
||||||
|
Milo Casagrande [it], Daniel Șerbănescu [ro], Kukuh Syafaat [id],
|
||||||
|
Jiri Grönroos [fi], Daniel Mustieles [es], Piotr Drąg [pl],
|
||||||
|
Anders Jonsson [sv], Marek Černocký [cs], Jordi Mas [ca],
|
||||||
|
Aurimas Černius [lt], Christian Kirbach [de], Emin Tufan Çetin [tr],
|
||||||
|
Enrico Nicoletto [pt_BR], Danial Behzadi [fa], Марко Костић [sr],
|
||||||
|
Alexandre Franke [fr], Charles Monzat [fr], Kjartan Maraas [nb],
|
||||||
|
Ryuta Fujii [ja], Nathan Follens [nl], Dušan Kazik [sk], Fabio Tomat [fur],
|
||||||
|
Matej Urbančič [sl], Ask Hjorth Larsen [da], Alan Mortensen [da]
|
||||||
|
|
||||||
|
3.34.0
|
||||||
|
======
|
||||||
|
* Handle startup/shutdown of misc X11 services [Carlos; !680]
|
||||||
|
* Fix sound volume mute/unmute [Iain; #1557]
|
||||||
|
* Correctly terminate pasted text [Carlos; #1570]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Carlos Garnacho, Iain Lane
|
||||||
|
|
||||||
|
Translators:
|
||||||
|
Tom Tryfonidis [el], Milo Casagrande [it], Ryuta Fujii [ja],
|
||||||
|
Efstathios Iosifidis [el], Carmen Bianca BAKKER [eo], Sabri Ünal [tr],
|
||||||
|
Dušan Kazik [sk], Balázs Meskó [hu], Claude Paroz [fr]
|
||||||
|
|
||||||
|
3.33.92
|
||||||
|
=======
|
||||||
|
* Animate pointer a11y pie timer [Jonas D.; !688]
|
||||||
|
* Fix restarting shell in systemd user session [Benjamin; !690]
|
||||||
|
* Misc. bug fixes and cleanups [Florian, Jonas D., Jonas Å., Will;
|
||||||
|
!691, !689, !692, #1552, !698]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Jonas Ådahl, Benjamin Berg, Piotr Drąg, Jonas Dreßler, Florian Müllner,
|
||||||
|
Will Thompson
|
||||||
|
|
||||||
|
Translators:
|
||||||
|
Daniel Șerbănescu [ro], Danial Behzadi [fa], Daniel Mustieles [es],
|
||||||
|
Jiri Grönroos [fi], Asier Sarasua Garmendia [eu], Piotr Drąg [pl],
|
||||||
|
Rūdolfs Mazurs [lv], Anders Jonsson [sv], Fran Dieguez [gl], Jordi Mas [ca],
|
||||||
|
Matej Urbančič [sl], Zander Brown [en_GB], Ryuta Fujii [ja], Tim Sabsch [de],
|
||||||
|
Fabio Tomat [fur], Pawan Chitrakar [ne], A S Alam [pa], Changwoo Ryu [ko],
|
||||||
|
Aurimas Černius [lt], Daniel Rusek [cs], Marek Černocký [cs],
|
||||||
|
Kukuh Syafaat [id], Goran Vidović [hr], Rafael Fontenelle [pt_BR]
|
||||||
|
|
||||||
|
3.33.91
|
||||||
|
=======
|
||||||
|
* Fix regression when adjusting brightness [Florian; #1500]
|
||||||
|
* Fix pointer a11y timeout animation [Jonas D.; #1533]
|
||||||
|
* Add new extensions CLI tool [Florian; #1234]
|
||||||
|
* Only track top-level windows [Carlos; #556]
|
||||||
|
* Misc. bug fixes and cleanups [Jonas D., Jonas Å., Piotr, Florian;
|
||||||
|
!678, !682, !686]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Jonas Ådahl, Jonas Dreßler, Carlos Garnacho, Florian Müllner
|
||||||
|
|
||||||
|
Translators:
|
||||||
|
Asier Sarasua Garmendia [eu], Sveinn í Felli [is], Anders Jonsson [sv],
|
||||||
|
Jordi Mas [ca], Kukuh Syafaat [id], Florentina Mușat [ro], Jiri Grönroos [fi],
|
||||||
|
Aurimas Černius [lt], Daniel Mustieles [es], Piotr Drąg [pl],
|
||||||
|
Danial Behzadi [fa]
|
||||||
|
|
||||||
|
3.33.90
|
||||||
|
=======
|
||||||
|
* Implement DND app picker folder management [Georges; !643, !645, !664, !671]
|
||||||
|
* Make Clocks/Weather integration work with sandboxed apps [Florian; #1158]
|
||||||
|
* Support startup via systemd user instance [Benjamin; !507]
|
||||||
|
* Replace Tweener with Clutter animations [Florian; !663, !22, !666, !668, !669]
|
||||||
|
* Minimize travel distance in overview animation [Sergey; !267]
|
||||||
|
* Rescan icon theme when installed apps changed [Georges; !661]
|
||||||
|
* Consistently animate new window actions [Jonas; !662, !673]
|
||||||
|
* Misc. bug fixes and cleanups [Florian, Daniel, Ray, Bastien, Jonas, Niels,
|
||||||
|
Marco, Georges; !635, !636, !637, #1462, !628, !640, !641, !627, !644, !647,
|
||||||
|
!385, #1474, !651, #1144, !646, !653, !652, !655, #1482, !656, $654, !665,
|
||||||
|
!667, !670, #1357, !672, !657, #1507, !674, !677]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Benjamin Berg, Sergey Bugaev, Jonas Dreßler, Niels De Graef, Florian Müllner,
|
||||||
|
Georges Basile Stavracas Neto, Bastien Nocera, Ray Strode,
|
||||||
|
Marco Trevisan (Treviño), verdre, Daniel van Vugt
|
||||||
|
|
||||||
|
Translators:
|
||||||
|
Asier Sarasua Garmendia [eu], Rafael Fontenelle [pt_BR],
|
||||||
|
Kristjan SCHMIDT [eo], Jor Teron [mjw], Daniel Mustieles [es],
|
||||||
|
Kukuh Syafaat [id], Jordi Mas [ca], Fabio Tomat [fur], Daniel Șerbănescu [ro],
|
||||||
|
Anders Jonsson [sv]
|
||||||
|
|
||||||
|
3.33.4
|
||||||
|
======
|
||||||
|
* Fix unintentional interference between gestures [Jonas; !598]
|
||||||
|
* Fix unintentional loop while polkit dialog is active [Ray; !602]
|
||||||
|
* Fix alt-tab icon size on HiDPI [Jonas; !587]
|
||||||
|
* Style fixes and improvements [Frederik, Jakub; !610, #1446, #1449]
|
||||||
|
* Fix style updates for non-background CSS properties [Florian; #1212]
|
||||||
|
* Fix cursor visibility in screen recordings [Illya; #1208]
|
||||||
|
* Add option for disabling the hot corner [Florian; #688320]
|
||||||
|
* Use more fine-grained levels in battery indicator [Florian; !561, #1442]
|
||||||
|
* Fix the calculation of the maximum number of app search results [Jonas; !110]
|
||||||
|
* Handle horizontal workspace layout with gestures/animations [Florian; !575]
|
||||||
|
* Improve handling of session mode extensions [Florian, Didier; #789852]
|
||||||
|
* Misc. bug fixes and cleanups [Jonas, Florian, Sonny, Carlos, Mario, Benjamin,
|
||||||
|
Marco, Ting-Wei; !599, !600, !591, !606, !152, !607, !604, !495, !608, !611,
|
||||||
|
!614, !612, !615, !618, #369, !620, #774, !621, !616, #1065, !609, !626,
|
||||||
|
!491, !631, !632, !633, #1457]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Benjamin Berg, Jonas Dreßler, Frederik Feichtmeier, Carlos Garnacho,
|
||||||
|
Illya Klymov, Ting-Wei Lan, Florian Müllner, Sonny Piers, Mario Sanchez Prada,
|
||||||
|
Didier Roche, Jakub Steiner, Ray Strode, Jor Teron, Marco Trevisan (Treviño)
|
||||||
|
|
||||||
|
Translators:
|
||||||
|
Jordi Mas [ca], Jor Teron [mjw]
|
||||||
|
|
||||||
|
3.33.3
|
||||||
|
======
|
||||||
|
* Prepare for optional X11 [Carlos; !378]
|
||||||
|
* Fix opening window menu [Marco; !557]
|
||||||
|
* Reload search providers when installed applications change [Cosimo; !562]
|
||||||
|
* Implement locate-pointer accessibility feature [Olivier; #981]
|
||||||
|
* Allow to disable window menus via session mode [Cosimo; !569]
|
||||||
|
* Implement mouse accessibility [Olivier; !474]
|
||||||
|
* Call GDM's RegisterSession() after startup [Iain; !570]
|
||||||
|
* Fix extended keys popups being hidden by on-screen keyboard [Marco; !583]
|
||||||
|
* Fix top bar being hidden by lock screen [Jonas; !571]
|
||||||
|
* Update theme to better match GTK's Adwaita [Frederik; #841]
|
||||||
|
* Set up GJS profiler when GJS_TRACE_FD is set [Christian; !573]
|
||||||
|
* Misc. bug fixes and cleanups [Jonas, Cosimo, Robert, Florian, Marco, Simon,
|
||||||
|
Laurent, Niels, Will; !551, !555, !464, #1333, !565, !572, !568, !558, #1205,
|
||||||
|
#1336, !579, !576, #1392, !582, !586, #1406, #1351]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Laurent Bigonville, Cosimo Cecchi, Piotr Drąg, Jonas Dreßler,
|
||||||
|
Frederik Feichtmeier, Olivier Fourdan, Carlos Garnacho, Niels De Graef,
|
||||||
|
Christian Hergert, Iain Lane, Robert Mader, Florian Müllner, Simon Schampijer,
|
||||||
|
Jakub Steiner, Will Thompson, Marco Trevisan (Treviño)
|
||||||
|
|
||||||
|
Translators:
|
||||||
|
Kukuh Syafaat [id], Balázs Meskó [hu], Daniel Mustieles [es],
|
||||||
|
Fabio Tomat [fur], Nathan Follens [nl], Goran Vidović [hr], Jordi Mas [ca]
|
||||||
|
|
||||||
|
3.33.2
|
||||||
|
======
|
||||||
|
* Fix keeping actors visible in scrollviews [Marco; #1061]
|
||||||
|
* Move some chrome above popup windows [Jonas D.; !358]
|
||||||
|
* Include 'sandboxed-app-id' in winodw introspection info [Florian; #1289]
|
||||||
|
* Port to libecal-2.0 [Milan; !501]
|
||||||
|
* Support TCRYPT in mount password dialog [segfault; !126]
|
||||||
|
* Misc. bug fixes and cleanups [Florian, Marco, Veerasamy; !517, #745, !499,
|
||||||
|
!510, !515, !546, !549]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Cosimo Cecchi, Milan Crha, Jonas Dreßler, Florian Müllner, segfault,
|
||||||
|
Veerasamy Sevagen, Marco Trevisan (Treviño)
|
||||||
|
|
||||||
|
Translators:
|
||||||
|
Daniel Mustieles [es]
|
||||||
|
|
||||||
|
3.33.1
|
||||||
|
======
|
||||||
|
* Refine the app menu [Florian; #968]
|
||||||
|
* Refine window preview style [Feichtmeier; !461]
|
||||||
|
* Only emit ::style-changed on actual changes [Carlos; #1153]
|
||||||
|
* Disable emoji on-screen keyboard support on X11 [Florian; #1172]
|
||||||
|
* Fix tablet button mapping overlay [Carlos; #1220]
|
||||||
|
* Don't crash for world clock locations with no timezone [Florian; #1062]
|
||||||
|
* Don't leak old on-screen keyboard layout groups [Carlos; mutter#556]
|
||||||
|
* Fix ellipsization in dialog subtitles/bodies [Marco; !531]
|
||||||
|
* Fix glitch of fullscreen window in workspace switch animation [Jonas D.; !322]
|
||||||
|
* Fix distortion of some image contents [Florian; !525]
|
||||||
|
* Allow dragging unfocused tiled/maximized windows from top bar [Dylan; #679290]
|
||||||
|
* Handle network interface name changes [Fabrice; !534]
|
||||||
|
* Avoid unnecessary style changes when computing :first/:last-child
|
||||||
|
[Florian; !529]
|
||||||
|
* Misc. bug fixes and cleanups [Florian, Marco, Robert, Georges, Carlos, Simon,
|
||||||
|
Jonas D.; !487, !441, !502, !503, !504, !506, #822, !551, !512, !509, !511,
|
||||||
|
#1054, !524, #1065, !331, !540]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Fabrice Bellet, Jonas Dreßler, Feichtmeier, Carlos Garnacho, Robert Mader,
|
||||||
|
Dylan McCall, Simon McVittie, Florian Müllner, Georges Basile Stavracas Neto,
|
||||||
|
Marco Trevisan (Treviño)
|
||||||
|
|
||||||
|
Translators:
|
||||||
|
Daniel Mustieles [es], Kukuh Syafaat [id], Fabio Tomat [fur],
|
||||||
|
Carmen Bianca BAKKER [eo], Dingzhong Chen [zh_CN], Tim Sabsch [de]
|
||||||
|
|
||||||
|
3.32.1
|
||||||
|
======
|
||||||
|
* Fix avatar scaling on login screen [Florian; #1024]
|
||||||
|
* Fix distortion of desktop zoom [Florian; #646]
|
||||||
|
* Fix mouse cursor visibility when using desktop zoom [Florian, Marco; #1020]
|
||||||
|
* Fix screen dimming after wake-up on lock screen [Xiaoguang; #900]
|
||||||
|
* Fix Alt+Esc switcher [Florian; #1064]
|
||||||
|
* Respect struts for popover placement [Andrea; #1102]
|
||||||
|
* Fix app icons updates after theme changes [Florian; #1117]
|
||||||
|
* Fix desktop zoom after resolution changes [Marco; #1120]
|
||||||
|
* Implement stick-to-finger workspace switch overview gestures [Florian; #516]
|
||||||
|
* Make World Clocks offsets relative to local time [Florian; #1157]
|
||||||
|
* Fix top app icon disappearing from dash [Florian; #1053]
|
||||||
|
* Update switch style to match new Adwaita [Jakub; !496]
|
||||||
|
* Ensure CSS units are pixel-aligned when scaling is used [Carlos; #91]
|
||||||
|
* Misc. bug fixes and cleanups [Florian, Jakub, Robert, Alex, Carlos, Phil,
|
||||||
|
Marco, Benjamin, AsciiWolf, Ray, verdre; !444, #1016, #1018, !449, #1036,
|
||||||
|
!455, #1094, !440, #1023, #624, #1017, !476, !473, !480, #1130, !485, !481,
|
||||||
|
!490, !489, #1151, !435, #1160, !482, #1150, #1166, !384]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
AsciiWolf, Andrea Azzarone, Benjamin Berg, Carlos Garnacho, Victor Ibragimov,
|
||||||
|
Robert Mader, Alex Monday, Florian Müllner, Jakub Steiner, Ray Strode,
|
||||||
|
Marco Trevisan (Treviño), verdre, Xiaoguang Wang, Phil Wyett
|
||||||
|
|
||||||
|
Translators:
|
||||||
|
Victor Ibragimov [tg, af, et, ja], Bruce Cowan [en_GB], Piotr Drąg [tg],
|
||||||
|
Charles Monzat [fr], Khaled Hosny [ar], Goran Vidović [hr],
|
||||||
|
Cheng-Chia Tseng [zh_TW], Carmen Bianca BAKKER [eo], Daniel Mustieles [es],
|
||||||
|
Dušan Kazik [sk]
|
||||||
|
|
||||||
|
3.32.0
|
||||||
|
======
|
||||||
|
* Fix sizing issues in on-screen-keyboard emoji panel [Carlos; !439]
|
||||||
|
* Fix test linker failure on Debian/Ubuntu [Iain; !442]
|
||||||
|
* Avoid assertion when sizing fallback app icons from CSS [Florian; #1027]
|
||||||
|
* Fix mis-sized menu arrows after texture cache changes [Florian; !452]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Carlos Garnacho, Iain Lane, Florian Müllner
|
||||||
|
|
||||||
|
Translators:
|
||||||
|
Gábor Kelemen [hu], Victor Ibragimov [tg], Ryuta Fujii [ja], Piotr Drąg [af,
|
||||||
|
tg], Mart Raudsepp [et]
|
||||||
|
|
||||||
|
3.31.92
|
||||||
|
=======
|
||||||
|
* Fix visual glitch in submenus [Alex; #987]
|
||||||
|
* Support fractional scaling [Jonas, Marco; #765011, !5]
|
||||||
|
* Only consider visible children for :first-child/:last-child [Florian; !312]
|
||||||
|
* Hide trailing separator in search results [verdre; !311]
|
||||||
|
* Remember choice in inhibit-shortcuts dialogue [Olivier; !382]
|
||||||
|
* Don't toggle on-screen keyboard on every focus change [Carlos; !397]
|
||||||
|
* Fix legacy tray icons not responding to events on wayland [Florian; #191]
|
||||||
|
* Fix generating French OSK layout [Florian; #997]
|
||||||
|
* Use borderless round user images [Florian; #811]
|
||||||
|
* Misc. bug fixes and cleanups [Andrea, Robert, Florian, Marco, Niels,
|
||||||
|
Benjamin; !414, !417, !420, #996, !408, !422, !425, #1006, !427, !315,
|
||||||
|
#989, !430, !431, !432, #1015, !429, !423, !419, !434]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Jonas Ådahl, Alan, Andrea Azzarone, Benjamin Berg, Olivier Fourdan,
|
||||||
|
Carlos Garnacho, Niels De Graef, Robert Mader, Alex Monday, Florian Müllner,
|
||||||
|
Marco Trevisan (Treviño), verdre
|
||||||
|
|
||||||
|
Translators:
|
||||||
|
Carmen Bianca BAKKER [eo], Asier Sarasua Garmendia [eu], Stas Solovey [ru],
|
||||||
|
Changwoo Ryu [ko], Julien Humbert [fr], Milo Casagrande [it],
|
||||||
|
Марко Костић [sr], Ask Hjorth Larsen [da], Kukuh Syafaat [id],
|
||||||
|
Daniel Șerbănescu [ro], Bernd Homuth [de], Trần Ngọc Quân [vi],
|
||||||
|
Nathan Follens [nl], Rūdolfs Mazurs [lv], Aurimas Černius [lt]
|
||||||
|
|
||||||
|
3.31.91
|
||||||
|
=======
|
||||||
|
* Don't close on-screen-keyboard's language menu on hover [Florian; #171]
|
||||||
|
* Don't let unfullscreen gesture interfere with top bar taps [Jonas D.; #552]
|
||||||
|
* Always use symbolic user icon in system menu [Florian; #957]
|
||||||
|
* Add flags parameter in GrabAccelerators API [Andrea; #68]
|
||||||
|
* Misc. bug fixes and cleanups [Florian, Jonas A.; !399, !398, !400, !402,
|
||||||
|
!407, !410, !411]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Jonas Ådahl, Andrea Azzarone, Arnaud Bonatti, Jonas Dreßler, Florian Müllner
|
||||||
|
|
||||||
|
Translators:
|
||||||
|
Jordi Mas [ca], Ryuta Fujii [ja], Marek Cernocky [cs], Fran Dieguez [gl],
|
||||||
|
Jiri Grönroos [fi], Serdar Sağlam [tr], Anders Jonsson [sv],
|
||||||
|
Matej Urbančič [sl], Gun Chleoc [gd], Kukuh Syafaat [id],
|
||||||
|
Baurzhan Muftakhidinov [kk], Alan Mortensen [da], Rafael Fontenelle [pt_BR],
|
||||||
|
Sveinn í Felli [is]
|
||||||
|
|
||||||
|
3.31.90
|
||||||
|
=======
|
||||||
|
* Fix input methods after ibus restarts [Takao; #295]
|
||||||
|
* Refresh world clocks and weather sections [Florian; #262]
|
||||||
|
* Port to ES6 classes (update your extensions!) [Florian; !361]
|
||||||
|
* networkAgent: Advise users when WPS support is available [Lubomir; !329]
|
||||||
|
* Performance improvements [Carlos; #832, #815]
|
||||||
|
* Fix drag-and-drop with wacom pens [Carlos; #540]
|
||||||
|
* Fix CAPS LOCK indication on wayland [Carlos; #762881]
|
||||||
|
* Show details of non-sensitive notifications on lock screen [Philip; #726]
|
||||||
|
* Refine extension-prefs' error UI [Florian; !193]
|
||||||
|
* Add switch-to-application-n keybindings [Florian; #648000]
|
||||||
|
* Remove top bar translucency [Florian; #408]
|
||||||
|
* Support emojis and keypads in on-screen keyboard [Carlos; #675]
|
||||||
|
* Don't allow popups to re-enable keyboard shortcuts on lock screen
|
||||||
|
(CVE-2019-3820) [Florian, Ray; #851]
|
||||||
|
* Replace app menu [Florian; #624]
|
||||||
|
* Include commonly copied+pasted extension helpers [Florian; !150]
|
||||||
|
* Misc. bug fixes and cleanups [Florian, Daniel, Philip, Sergio, Pascal,
|
||||||
|
Georges, verdre, Carlos, Christopher; #780, #909, !316, !308, !309, #915,
|
||||||
|
!350, !362, !357, !365, !366, !283, !367, #942, !371, !373, !374, !343,
|
||||||
|
!375, !292, !317, !377, !379, !346, !383, #953, !388]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Sergio Costas, Christopher Davis, Bilal Elmoussaoui, Takao Fujiwara,
|
||||||
|
Carlos Garnacho, Niels De Graef, Christian Kellner, Ignat Loskutov,
|
||||||
|
Florian Müllner, Georges Basile Stavracas Neto, Pascal Nowack, Lubomir Rintel,
|
||||||
|
Jakub Steiner, Ray Strode, verdre, Daniel van Vugt, Philip Withnall
|
||||||
|
|
||||||
|
Translators:
|
||||||
|
Daniel Mustieles [es], Carmen Bianca BAKKER [eo], Charles Monzat [fr],
|
||||||
|
Pieter Schalk Schoeman [af], Jordi Mas [ca], Matej Urbančič [sl],
|
||||||
|
Fran Dieguez [gl], Balázs Úr [hu], A S Alam [pa], Fabio Tomat [fur],
|
||||||
|
Aurimas Černius [lt], Piotr Drąg [pl], Marek Cernocky [cs], Ryuta Fujii [ja]
|
||||||
|
|
||||||
3.31.4
|
3.31.4
|
||||||
======
|
======
|
||||||
* Improve icon grid performance [Daniel; #174]
|
* Improve icon grid performance [Daniel; #174]
|
||||||
|
|||||||
@@ -11,6 +11,14 @@ see the [project wiki][project-wiki].
|
|||||||
|
|
||||||
Bugs should be reported to the GNOME [bug tracking system][bug-tracker].
|
Bugs should be reported to the GNOME [bug tracking system][bug-tracker].
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
To contribute, open merge requests at https://gitlab.gnome.org/GNOME/gnome-shell.
|
||||||
|
|
||||||
|
Commit messages should follow the [GNOME commit message
|
||||||
|
guidelines](https://wiki.gnome.org/Git/CommitMessages). We require an URL
|
||||||
|
to either an issue or a merge request in each commit.
|
||||||
|
|
||||||
## License
|
## License
|
||||||
GNOME Shell is distributed under the terms of the GNU General Public License,
|
GNOME Shell is distributed under the terms of the GNU General Public License,
|
||||||
version 2 or later. See the [COPYING][license] file for details.
|
version 2 or later. See the [COPYING][license] file for details.
|
||||||
|
|||||||
40
README.mdwn
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
cldr2json
|
||||||
|
=========
|
||||||
|
|
||||||
|
This script converts Unicode CLDR android keyboard layouts to JSON usable by
|
||||||
|
GNOME Shell.
|
||||||
|
|
||||||
|
CLDR keyboard layouts can be found at
|
||||||
|
<http://www.unicode.org/Public/cldr/latest/keyboards.zip>
|
||||||
|
|
||||||
|
|
||||||
|
Usage
|
||||||
|
=====
|
||||||
|
|
||||||
|
./cldr2json <input file or directory> <output directory>
|
||||||
|
|
||||||
|
example:
|
||||||
|
|
||||||
|
./cldr2json cldr/keyboards/android/ json_layouts/
|
||||||
|
|
||||||
|
|
||||||
|
Keyboard layout mapping
|
||||||
|
=======================
|
||||||
|
|
||||||
|
Unicode CLDR layout identifiers are language codes, while XKB layout
|
||||||
|
identifiers are... something else. The mapping between the two currently uses
|
||||||
|
heuristic based on the layout descriptions, in this order:
|
||||||
|
|
||||||
|
- if the CLDR layout description matches an XKB layout description, chose its
|
||||||
|
XKB identifier
|
||||||
|
- if one word of the CLDR layout description matches an XKB layout
|
||||||
|
description, chose its XKB identifier
|
||||||
|
- if the CLDR layout description matches one word of an XKB layout description,
|
||||||
|
chose its XKB identifier
|
||||||
|
|
||||||
|
That doesn't always work. For instance it fails for "en" language, that should
|
||||||
|
match "us" XKB identifier. For such cases, there is a mapping in
|
||||||
|
LOCALE_TO_XKB_OVERRIDES at the top of the script. If you discover a weird
|
||||||
|
mapping of if you get a "failed to find XKB mapping for <locale>" warning then
|
||||||
|
please consider adding an override there.
|
||||||
|
|
||||||
208
cldr2json.py
Executable file
@@ -0,0 +1,208 @@
|
|||||||
|
#!/usr/bin/python3
|
||||||
|
#
|
||||||
|
# Copyright 2015 Daiki Ueno <dueno@src.gnome.org>
|
||||||
|
# 2016 Parag Nemade <pnemade@redhat.com>
|
||||||
|
# 2017 Alan <alan@boum.org>
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU Lesser General Public License as
|
||||||
|
# published by the Free Software Foundation; either version 2 of the
|
||||||
|
# License, or (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful, but
|
||||||
|
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
# Lesser General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Lesser General Public
|
||||||
|
# License along with this program; if not, see
|
||||||
|
# <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
import glob
|
||||||
|
import json
|
||||||
|
import locale
|
||||||
|
import logging
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import sys
|
||||||
|
import xml.etree.ElementTree
|
||||||
|
|
||||||
|
import gi
|
||||||
|
gi.require_version('GnomeDesktop', '3.0') # NOQA: E402
|
||||||
|
from gi.repository import GnomeDesktop
|
||||||
|
|
||||||
|
ESCAPE_PATTERN = re.compile(r'\\u\{([0-9A-Fa-f]+?)\}')
|
||||||
|
ISO_PATTERN = re.compile(r'[A-E]([0-9]+)')
|
||||||
|
|
||||||
|
LOCALE_TO_XKB_OVERRIDES = {
|
||||||
|
'af': 'za',
|
||||||
|
'en': 'us',
|
||||||
|
'en-GB': 'uk',
|
||||||
|
'es-US': 'latam',
|
||||||
|
'fr-CA': 'ca',
|
||||||
|
'hi': 'in+bolnagri',
|
||||||
|
'ky': 'kg',
|
||||||
|
'nl-BE': 'be',
|
||||||
|
'zu': None
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def parse_single_key(value):
|
||||||
|
def unescape(m):
|
||||||
|
return chr(int(m.group(1), 16))
|
||||||
|
value = ESCAPE_PATTERN.sub(unescape, value)
|
||||||
|
return value
|
||||||
|
|
||||||
|
|
||||||
|
def parse_rows(keymap):
|
||||||
|
unsorted_rows = {}
|
||||||
|
for _map in keymap.iter('map'):
|
||||||
|
value = _map.get('to')
|
||||||
|
key = [parse_single_key(value)]
|
||||||
|
iso = _map.get('iso')
|
||||||
|
if not ISO_PATTERN.match(iso):
|
||||||
|
sys.stderr.write('invalid ISO key name: %s\n' % iso)
|
||||||
|
continue
|
||||||
|
if not iso[0] in unsorted_rows:
|
||||||
|
unsorted_rows[iso[0]] = []
|
||||||
|
unsorted_rows[iso[0]].append((int(iso[1:]), key))
|
||||||
|
# add subkeys
|
||||||
|
longPress = _map.get('longPress')
|
||||||
|
if longPress:
|
||||||
|
for value in longPress.split(' '):
|
||||||
|
subkey = parse_single_key(value)
|
||||||
|
key.append(subkey)
|
||||||
|
|
||||||
|
rows = []
|
||||||
|
for k, v in sorted(list(unsorted_rows.items()),
|
||||||
|
key=lambda x: x[0],
|
||||||
|
reverse=True):
|
||||||
|
row = []
|
||||||
|
for key in sorted(v, key=lambda x: x):
|
||||||
|
row.append(key[1])
|
||||||
|
rows.append(row)
|
||||||
|
|
||||||
|
return rows
|
||||||
|
|
||||||
|
|
||||||
|
def convert_xml(tree):
|
||||||
|
root = {}
|
||||||
|
for xml_keyboard in tree.iter("keyboard"):
|
||||||
|
locale_full = xml_keyboard.get("locale")
|
||||||
|
locale, sep, end = locale_full.partition("-t-")
|
||||||
|
root["locale"] = locale
|
||||||
|
for xml_name in tree.iter("name"):
|
||||||
|
name = xml_name.get("value")
|
||||||
|
root["name"] = name
|
||||||
|
root["levels"] = []
|
||||||
|
# parse levels
|
||||||
|
for index, keymap in enumerate(tree.iter('keyMap')):
|
||||||
|
# FIXME: heuristics here
|
||||||
|
modifiers = keymap.get('modifiers')
|
||||||
|
if not modifiers:
|
||||||
|
mode = 'default'
|
||||||
|
modifiers = ''
|
||||||
|
elif 'shift' in modifiers.split(' '):
|
||||||
|
mode = 'latched'
|
||||||
|
modifiers = 'shift'
|
||||||
|
else:
|
||||||
|
mode = 'locked'
|
||||||
|
level = {}
|
||||||
|
level["level"] = modifiers
|
||||||
|
level["mode"] = mode
|
||||||
|
level["rows"] = parse_rows(keymap)
|
||||||
|
root["levels"].append(level)
|
||||||
|
return root
|
||||||
|
|
||||||
|
|
||||||
|
def locale_to_xkb(locale, name):
|
||||||
|
if locale in sorted(LOCALE_TO_XKB_OVERRIDES.keys()):
|
||||||
|
xkb = LOCALE_TO_XKB_OVERRIDES[locale]
|
||||||
|
logging.debug("override for %s → %s",
|
||||||
|
locale, xkb)
|
||||||
|
if xkb:
|
||||||
|
return xkb
|
||||||
|
else:
|
||||||
|
raise KeyError("layout %s explicitely disabled in overrides"
|
||||||
|
% locale)
|
||||||
|
xkb_names = sorted(name_to_xkb.keys())
|
||||||
|
if name in xkb_names:
|
||||||
|
return name_to_xkb[name]
|
||||||
|
else:
|
||||||
|
logging.debug("name %s failed" % name)
|
||||||
|
for sub_name in name.split(' '):
|
||||||
|
if sub_name in xkb_names:
|
||||||
|
xkb = name_to_xkb[sub_name]
|
||||||
|
logging.debug("dumb mapping failed but match with locale word: "
|
||||||
|
"%s (%s) → %s (%s)",
|
||||||
|
locale, name, xkb, sub_name)
|
||||||
|
return xkb
|
||||||
|
else:
|
||||||
|
logging.debug("sub_name failed")
|
||||||
|
for xkb_name in xkb_names:
|
||||||
|
for xkb_sub_name in xkb_name.split(' '):
|
||||||
|
if xkb_sub_name.strip('()') == name:
|
||||||
|
xkb = name_to_xkb[xkb_name]
|
||||||
|
logging.debug("dumb mapping failed but match with xkb word: "
|
||||||
|
"%s (%s) → %s (%s)",
|
||||||
|
locale, name, xkb, xkb_name)
|
||||||
|
return xkb
|
||||||
|
raise KeyError("failed to find XKB mapping for %s" % locale)
|
||||||
|
|
||||||
|
|
||||||
|
def convert_file(source_file, destination_path):
|
||||||
|
logging.info("Parsing %s", source_file)
|
||||||
|
|
||||||
|
itree = xml.etree.ElementTree.ElementTree()
|
||||||
|
itree.parse(source_file)
|
||||||
|
|
||||||
|
root = convert_xml(itree)
|
||||||
|
|
||||||
|
try:
|
||||||
|
xkb_name = locale_to_xkb(root["locale"], root["name"])
|
||||||
|
except KeyError as e:
|
||||||
|
logging.warn(e)
|
||||||
|
return False
|
||||||
|
destination_file = os.path.join(destination_path, xkb_name + ".json")
|
||||||
|
|
||||||
|
with open(destination_file, 'w', encoding="utf-8") as dest_fd:
|
||||||
|
json.dump(root, dest_fd, ensure_ascii=False, indent=2, sort_keys=True)
|
||||||
|
|
||||||
|
logging.debug("written %s", destination_file)
|
||||||
|
|
||||||
|
|
||||||
|
def load_xkb_mappings():
|
||||||
|
xkb = GnomeDesktop.XkbInfo()
|
||||||
|
layouts = xkb.get_all_layouts()
|
||||||
|
name_to_xkb = {}
|
||||||
|
|
||||||
|
for layout in layouts:
|
||||||
|
name = xkb.get_layout_info(layout).display_name
|
||||||
|
name_to_xkb[name] = layout
|
||||||
|
|
||||||
|
return name_to_xkb
|
||||||
|
|
||||||
|
|
||||||
|
locale.setlocale(locale.LC_ALL, "C")
|
||||||
|
name_to_xkb = load_xkb_mappings()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
if "DEBUG" in os.environ:
|
||||||
|
logging.basicConfig(level=logging.DEBUG)
|
||||||
|
|
||||||
|
if len(sys.argv) < 2:
|
||||||
|
print("supply a CLDR keyboard file")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
if len(sys.argv) < 3:
|
||||||
|
print("supply an output directory")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
source = sys.argv[1]
|
||||||
|
destination = sys.argv[2]
|
||||||
|
if os.path.isfile(source):
|
||||||
|
convert_file(source, destination)
|
||||||
|
elif os.path.isdir(source):
|
||||||
|
for path in glob.glob(source + "/*-t-k0-android.xml"):
|
||||||
|
convert_file(path, destination)
|
||||||
12
data/dbus-interfaces/org.gnome.Shell.CalendarServer.xml
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<node>
|
||||||
|
<interface name="org.gnome.Shell.CalendarServer">
|
||||||
|
<method name="GetEvents">
|
||||||
|
<arg type="x" direction="in" />
|
||||||
|
<arg type="x" direction="in" />
|
||||||
|
<arg type="b" direction="in" />
|
||||||
|
<arg type="a(sssbxxa{sv})" direction="out" />
|
||||||
|
</method>
|
||||||
|
<property name="HasCalendars" type="b" access="read" />
|
||||||
|
<signal name="Changed" />
|
||||||
|
</interface>
|
||||||
|
</node>
|
||||||
15
data/dbus-interfaces/org.gnome.Shell.ClocksIntegration.xml
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
<node>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
org.gnome.Shell.ClocksIntegration:
|
||||||
|
@short_description: Clocks integration interface
|
||||||
|
|
||||||
|
The interface used for exporting location settings to GNOME Shell's
|
||||||
|
world clocks integration.
|
||||||
|
-->
|
||||||
|
<interface name="org.gnome.Shell.ClocksIntegration">
|
||||||
|
|
||||||
|
<property name="Locations" type="av" access="read"/>
|
||||||
|
|
||||||
|
</interface>
|
||||||
|
</node>
|
||||||
@@ -173,6 +173,30 @@
|
|||||||
<arg type="s" direction="in" name="uuid"/>
|
<arg type="s" direction="in" name="uuid"/>
|
||||||
</method>
|
</method>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
EnableExtension:
|
||||||
|
@uuid: The UUID of the extension
|
||||||
|
@success: Whether the operation was successful
|
||||||
|
|
||||||
|
Enable an extension.
|
||||||
|
-->
|
||||||
|
<method name="EnableExtension"> \
|
||||||
|
<arg type="s" direction="in" name="uuid"/> \
|
||||||
|
<arg type="b" direction="out" name="success"/> \
|
||||||
|
</method> \
|
||||||
|
|
||||||
|
<!--
|
||||||
|
DisableExtension:
|
||||||
|
@uuid: The UUID of the extension
|
||||||
|
@success: Whether the operation was successful
|
||||||
|
|
||||||
|
Disable an extension.
|
||||||
|
-->
|
||||||
|
<method name="DisableExtension"> \
|
||||||
|
<arg type="s" direction="in" name="uuid"/> \
|
||||||
|
<arg type="b" direction="out" name="success"/> \
|
||||||
|
</method> \
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
LaunchExtensionPrefs:
|
LaunchExtensionPrefs:
|
||||||
@uuid: The UUID of the extension
|
@uuid: The UUID of the extension
|
||||||
@@ -189,6 +213,15 @@
|
|||||||
-->
|
-->
|
||||||
<method name="CheckForUpdates"/>
|
<method name="CheckForUpdates"/>
|
||||||
|
|
||||||
|
<signal name="ExtensionStateChanged">
|
||||||
|
<arg type="s" name="uuid"/>
|
||||||
|
<arg type="a{sv}" name="state"/>
|
||||||
|
</signal>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
ExtensionStatusChanged:
|
||||||
|
Deprecated for ExtensionStateChanged
|
||||||
|
-->
|
||||||
<signal name="ExtensionStatusChanged">
|
<signal name="ExtensionStatusChanged">
|
||||||
<arg type="s" name="uuid"/>
|
<arg type="s" name="uuid"/>
|
||||||
<arg type="i" name="state"/>
|
<arg type="i" name="state"/>
|
||||||
|
|||||||
16
data/dbus-interfaces/org.gnome.Shell.WeatherIntegration.xml
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
<node>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
org.gnome.Shell.WeatherIntegration:
|
||||||
|
@short_description: Weather integration interface
|
||||||
|
|
||||||
|
The interface used for exporting location settings to GNOME Shell's
|
||||||
|
weather integration.
|
||||||
|
-->
|
||||||
|
<interface name="org.gnome.Shell.WeatherIntegration">
|
||||||
|
|
||||||
|
<property name="AutomaticLocation" type="b" access="read"/>
|
||||||
|
<property name="Locations" type="av" access="read"/>
|
||||||
|
|
||||||
|
</interface>
|
||||||
|
</node>
|
||||||
@@ -10,9 +10,6 @@
|
|||||||
<arg type="a{sv}" direction="in" name="params"/>
|
<arg type="a{sv}" direction="in" name="params"/>
|
||||||
</method>
|
</method>
|
||||||
<method name="ShowMonitorLabels">
|
<method name="ShowMonitorLabels">
|
||||||
<arg type="a{uv}" direction="in" name="params"/>
|
|
||||||
</method>
|
|
||||||
<method name="ShowMonitorLabels2">
|
|
||||||
<arg type="a{sv}" direction="in" name="params"/>
|
<arg type="a{sv}" direction="in" name="params"/>
|
||||||
</method>
|
</method>
|
||||||
<method name="HideMonitorLabels"/>
|
<method name="HideMonitorLabels"/>
|
||||||
@@ -22,17 +19,22 @@
|
|||||||
<method name="ShowApplications"/>
|
<method name="ShowApplications"/>
|
||||||
<method name="GrabAccelerator">
|
<method name="GrabAccelerator">
|
||||||
<arg type="s" direction="in" name="accelerator"/>
|
<arg type="s" direction="in" name="accelerator"/>
|
||||||
<arg type="u" direction="in" name="flags"/>
|
<arg type="u" direction="in" name="modeFlags"/>
|
||||||
|
<arg type="u" direction="in" name="grabFlags"/>
|
||||||
<arg type="u" direction="out" name="action"/>
|
<arg type="u" direction="out" name="action"/>
|
||||||
</method>
|
</method>
|
||||||
<method name="GrabAccelerators">
|
<method name="GrabAccelerators">
|
||||||
<arg type="a(su)" direction="in" name="accelerators"/>
|
<arg type="a(suu)" direction="in" name="accelerators"/>
|
||||||
<arg type="au" direction="out" name="actions"/>
|
<arg type="au" direction="out" name="actions"/>
|
||||||
</method>
|
</method>
|
||||||
<method name="UngrabAccelerator">
|
<method name="UngrabAccelerator">
|
||||||
<arg type="u" direction="in" name="action"/>
|
<arg type="u" direction="in" name="action"/>
|
||||||
<arg type="b" direction="out" name="success"/>
|
<arg type="b" direction="out" name="success"/>
|
||||||
</method>
|
</method>
|
||||||
|
<method name="UngrabAccelerators">
|
||||||
|
<arg type="au" direction="in" name="action"/>
|
||||||
|
<arg type="b" direction="out" name="success"/>
|
||||||
|
</method>
|
||||||
<signal name="AcceleratorActivated">
|
<signal name="AcceleratorActivated">
|
||||||
<arg name="action" type="u"/>
|
<arg name="action" type="u"/>
|
||||||
<arg name="parameters" type="a{sv}"/>
|
<arg name="parameters" type="a{sv}"/>
|
||||||
|
|||||||
15740
data/emoji.json
Normal file
@@ -39,6 +39,8 @@
|
|||||||
<file preprocess="xml-stripblanks">org.gnome.SettingsDaemon.Rfkill.xml</file>
|
<file preprocess="xml-stripblanks">org.gnome.SettingsDaemon.Rfkill.xml</file>
|
||||||
<file preprocess="xml-stripblanks">org.gnome.SettingsDaemon.Wacom.xml</file>
|
<file preprocess="xml-stripblanks">org.gnome.SettingsDaemon.Wacom.xml</file>
|
||||||
<file preprocess="xml-stripblanks">org.gnome.Shell.AudioDeviceSelection.xml</file>
|
<file preprocess="xml-stripblanks">org.gnome.Shell.AudioDeviceSelection.xml</file>
|
||||||
|
<file preprocess="xml-stripblanks">org.gnome.Shell.CalendarServer.xml</file>
|
||||||
|
<file preprocess="xml-stripblanks">org.gnome.Shell.ClocksIntegration.xml</file>
|
||||||
<file preprocess="xml-stripblanks">org.gnome.Shell.Extensions.xml</file>
|
<file preprocess="xml-stripblanks">org.gnome.Shell.Extensions.xml</file>
|
||||||
<file preprocess="xml-stripblanks">org.gnome.Shell.Introspect.xml</file>
|
<file preprocess="xml-stripblanks">org.gnome.Shell.Introspect.xml</file>
|
||||||
<file preprocess="xml-stripblanks">org.gnome.Shell.HotplugSniffer.xml</file>
|
<file preprocess="xml-stripblanks">org.gnome.Shell.HotplugSniffer.xml</file>
|
||||||
@@ -47,6 +49,7 @@
|
|||||||
<file preprocess="xml-stripblanks">org.gnome.Shell.Screencast.xml</file>
|
<file preprocess="xml-stripblanks">org.gnome.Shell.Screencast.xml</file>
|
||||||
<file preprocess="xml-stripblanks">org.gnome.Shell.Screenshot.xml</file>
|
<file preprocess="xml-stripblanks">org.gnome.Shell.Screenshot.xml</file>
|
||||||
<file preprocess="xml-stripblanks">org.gnome.Shell.Wacom.PadOsd.xml</file>
|
<file preprocess="xml-stripblanks">org.gnome.Shell.Wacom.PadOsd.xml</file>
|
||||||
|
<file preprocess="xml-stripblanks">org.gnome.Shell.WeatherIntegration.xml</file>
|
||||||
<file preprocess="xml-stripblanks">org.gnome.Shell.xml</file>
|
<file preprocess="xml-stripblanks">org.gnome.Shell.xml</file>
|
||||||
<file preprocess="xml-stripblanks">org.Gtk.MountOperationHandler.xml</file>
|
<file preprocess="xml-stripblanks">org.Gtk.MountOperationHandler.xml</file>
|
||||||
<file preprocess="xml-stripblanks">org.gtk.Notifications.xml</file>
|
<file preprocess="xml-stripblanks">org.gtk.Notifications.xml</file>
|
||||||
|
|||||||
14
data/gnome-shell-disable-extensions.service
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Disable GNOME Shell extensions after failure
|
||||||
|
DefaultDependencies=no
|
||||||
|
|
||||||
|
# Only disable extensions for a short period of time after login.
|
||||||
|
# This means we err on the side of failing the first login after a broken
|
||||||
|
# extension was installed.
|
||||||
|
Requisite=gnome-session-stable.timer
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
# Disable extensions
|
||||||
|
ExecStart=gsettings set org.gnome.shell disable-user-extensions true
|
||||||
|
Restart=no
|
||||||
@@ -6,6 +6,7 @@
|
|||||||
<file>be.json</file>
|
<file>be.json</file>
|
||||||
<file>bg.json</file>
|
<file>bg.json</file>
|
||||||
<file>by.json</file>
|
<file>by.json</file>
|
||||||
|
<file>ca.json</file>
|
||||||
<file>cz.json</file>
|
<file>cz.json</file>
|
||||||
<file>de.json</file>
|
<file>de.json</file>
|
||||||
<file>dk.json</file>
|
<file>dk.json</file>
|
||||||
@@ -54,5 +55,6 @@
|
|||||||
<file>us.json</file>
|
<file>us.json</file>
|
||||||
<file>vn.json</file>
|
<file>vn.json</file>
|
||||||
<file>za.json</file>
|
<file>za.json</file>
|
||||||
|
<file>emoji.json</file>
|
||||||
</gresource>
|
</gresource>
|
||||||
</gresources>
|
</gresources>
|
||||||
|
|||||||
@@ -20,12 +20,16 @@
|
|||||||
<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>pad-osd.css</file>
|
||||||
|
<file alias="icons/pointer-double-click-symbolic.svg">pointer-double-click-symbolic.svg</file>
|
||||||
|
<file alias="icons/pointer-drag-symbolic.svg">pointer-drag-symbolic.svg</file>
|
||||||
|
<file alias="icons/pointer-primary-click-symbolic.svg">pointer-primary-click-symbolic.svg</file>
|
||||||
|
<file alias="icons/pointer-secondary-click-symbolic.svg">pointer-secondary-click-symbolic.svg</file>
|
||||||
<file>process-working.svg</file>
|
<file>process-working.svg</file>
|
||||||
<file>toggle-off-us.svg</file>
|
<file>toggle-off.svg</file>
|
||||||
<file>toggle-off-intl.svg</file>
|
<file>toggle-off-dark.svg</file>
|
||||||
<file>toggle-off-hc.svg</file>
|
<file>toggle-off-hc.svg</file>
|
||||||
<file>toggle-on-us.svg</file>
|
<file>toggle-on.svg</file>
|
||||||
<file>toggle-on-intl.svg</file>
|
<file>toggle-on-dark.svg</file>
|
||||||
<file>toggle-on-hc.svg</file>
|
<file>toggle-on-hc.svg</file>
|
||||||
</gresource>
|
</gresource>
|
||||||
</gresources>
|
</gresources>
|
||||||
|
|||||||
27
data/gnome-shell-wayland.service.in
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=GNOME Shell on Wayland
|
||||||
|
# On wayland, force a session shutdown
|
||||||
|
OnFailure=gnome-shell-disable-extensions.service gnome-session-shutdown.target
|
||||||
|
OnFailureJobMode=replace-irreversibly
|
||||||
|
CollectMode=inactive-or-failed
|
||||||
|
RefuseManualStart=on
|
||||||
|
RefuseManualStop=on
|
||||||
|
|
||||||
|
After=gnome-session-manager.target
|
||||||
|
|
||||||
|
Requisite=gnome-session-initialized.target
|
||||||
|
PartOf=gnome-session-initialized.target
|
||||||
|
Before=gnome-session-initialized.target
|
||||||
|
|
||||||
|
# The units already conflict because they use the same BusName
|
||||||
|
#Conflicts=gnome-shell-x11.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=notify
|
||||||
|
ExecStart=@bindir@/gnome-shell
|
||||||
|
# Exit code 1 means we are probably *not* dealing with an extension failure
|
||||||
|
SuccessExitStatus=1
|
||||||
|
# On wayland we cannot restart
|
||||||
|
Restart=no
|
||||||
|
# Kill any stubborn child processes after this long
|
||||||
|
TimeoutStopSec=5
|
||||||
@@ -1,5 +1,10 @@
|
|||||||
[Unit]
|
[Unit]
|
||||||
Description=GNOME Shell (wayland sync point)
|
Description=GNOME Shell on Wayland
|
||||||
After=gnome-shell.service
|
DefaultDependencies=no
|
||||||
BindsTo=gnome-shell.service
|
|
||||||
Conflicts=gnome-shell-x11.target
|
Requisite=gnome-session-initialized.target
|
||||||
|
PartOf=gnome-session-initialized.target
|
||||||
|
Before=gnome-session-initialized.target
|
||||||
|
|
||||||
|
Requires=gnome-shell-wayland.service
|
||||||
|
After=gnome-shell-wayland.service
|
||||||
|
|||||||
33
data/gnome-shell-x11.service.in
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=GNOME Shell on X11
|
||||||
|
# On X11, try to show the GNOME Session Failed screen
|
||||||
|
OnFailure=gnome-shell-disable-extensions.service gnome-session-failed.target
|
||||||
|
OnFailureJobMode=replace
|
||||||
|
CollectMode=inactive-or-failed
|
||||||
|
RefuseManualStart=on
|
||||||
|
RefuseManualStop=on
|
||||||
|
|
||||||
|
After=gnome-session-manager.target
|
||||||
|
|
||||||
|
Requisite=gnome-session-initialized.target
|
||||||
|
PartOf=gnome-session-initialized.target
|
||||||
|
Before=gnome-session-initialized.target
|
||||||
|
|
||||||
|
# The units already conflict because they use the same BusName
|
||||||
|
#Conflicts=gnome-shell-wayland.service
|
||||||
|
|
||||||
|
# Limit startup frequency more than the default
|
||||||
|
StartLimitIntervalSec=15s
|
||||||
|
StartLimitBurst=3
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=notify
|
||||||
|
ExecStart=@bindir@/gnome-shell
|
||||||
|
# Exit code 1 means we are probably *not* dealing with an extension failure
|
||||||
|
SuccessExitStatus=1
|
||||||
|
# On X11 we want to restart on-success (Alt+F2 + r) and on-failure.
|
||||||
|
Restart=always
|
||||||
|
# Do not wait before restarting the shell
|
||||||
|
RestartSec=0ms
|
||||||
|
# Kill any stubborn child processes after this long
|
||||||
|
TimeoutStopSec=5
|
||||||
@@ -1,5 +1,10 @@
|
|||||||
[Unit]
|
[Unit]
|
||||||
Description=GNOME Shell (x11 sync point)
|
Description=GNOME Shell on X11
|
||||||
After=gnome-shell.service
|
DefaultDependencies=no
|
||||||
BindsTo=gnome-shell.service
|
|
||||||
Conflicts=gnome-shell-wayland.target
|
Requisite=gnome-session-initialized.target
|
||||||
|
PartOf=gnome-session-initialized.target
|
||||||
|
Before=gnome-session-initialized.target
|
||||||
|
|
||||||
|
Requires=gnome-shell-x11.service
|
||||||
|
After=gnome-shell-x11.service
|
||||||
|
|||||||
@@ -1,11 +0,0 @@
|
|||||||
[Unit]
|
|
||||||
Description=GNOME Shell
|
|
||||||
Wants=gnome-session.service
|
|
||||||
After=graphical-session-pre.target gnome-session-bus.target
|
|
||||||
PartOf=graphical-session.target
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
Type=dbus
|
|
||||||
ExecStart=@bindir@/gnome-shell
|
|
||||||
Restart=on-failure
|
|
||||||
BusName=org.gnome.Shell
|
|
||||||
@@ -14,6 +14,8 @@ desktopconf = configuration_data()
|
|||||||
# file when built in a non-system prefix
|
# file when built in a non-system prefix
|
||||||
desktopconf.set('bindir', bindir)
|
desktopconf.set('bindir', bindir)
|
||||||
desktopconf.set('VERSION', meson.project_version())
|
desktopconf.set('VERSION', meson.project_version())
|
||||||
|
desktopconf.set('systemd_hidden', have_systemd ? 'true' : 'false')
|
||||||
|
|
||||||
foreach desktop_file : desktop_files
|
foreach desktop_file : desktop_files
|
||||||
i18n.merge_file('desktop',
|
i18n.merge_file('desktop',
|
||||||
input: configure_file(
|
input: configure_file(
|
||||||
@@ -22,7 +24,7 @@ foreach desktop_file : desktop_files
|
|||||||
configuration: desktopconf
|
configuration: desktopconf
|
||||||
),
|
),
|
||||||
output: desktop_file,
|
output: desktop_file,
|
||||||
po_dir: '../po',
|
po_dir: po_dir,
|
||||||
install: true,
|
install: true,
|
||||||
install_dir: desktopdir,
|
install_dir: desktopdir,
|
||||||
type: 'desktop'
|
type: 'desktop'
|
||||||
@@ -98,15 +100,23 @@ if have_systemd
|
|||||||
unitconf = configuration_data()
|
unitconf = configuration_data()
|
||||||
unitconf.set('bindir', bindir)
|
unitconf.set('bindir', bindir)
|
||||||
|
|
||||||
unit = configure_file(
|
configure_file(
|
||||||
input: 'gnome-shell.service.in',
|
input: 'gnome-shell-x11.service.in',
|
||||||
output: 'gnome-shell.service',
|
output: 'gnome-shell-x11.service',
|
||||||
configuration: unitconf,
|
configuration: unitconf,
|
||||||
install_dir: systemduserunitdir
|
install_dir: systemduserunitdir
|
||||||
)
|
)
|
||||||
|
|
||||||
units = files('gnome-shell-wayland.target',
|
configure_file(
|
||||||
'gnome-shell-x11.target')
|
input: 'gnome-shell-wayland.service.in',
|
||||||
|
output: 'gnome-shell-wayland.service',
|
||||||
|
configuration: unitconf,
|
||||||
|
install_dir: systemduserunitdir
|
||||||
|
)
|
||||||
|
|
||||||
|
units = files('gnome-shell-x11.target',
|
||||||
|
'gnome-shell-wayland.target',
|
||||||
|
'gnome-shell-disable-extensions.service')
|
||||||
|
|
||||||
install_data(units, install_dir: systemduserunitdir)
|
install_data(units, install_dir: systemduserunitdir)
|
||||||
endif
|
endif
|
||||||
|
|||||||
@@ -14,3 +14,4 @@ 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
|
||||||
|
X-GNOME-HiddenUnderSystemd=@systemd_hidden@
|
||||||
|
|||||||
@@ -21,6 +21,17 @@
|
|||||||
EnableExtension and DisableExtension D-Bus methods on org.gnome.Shell.
|
EnableExtension and DisableExtension D-Bus methods on org.gnome.Shell.
|
||||||
</description>
|
</description>
|
||||||
</key>
|
</key>
|
||||||
|
<key name="disabled-extensions" type="as">
|
||||||
|
<default>[]</default>
|
||||||
|
<summary>UUIDs of extensions to force disabling</summary>
|
||||||
|
<description>
|
||||||
|
GNOME Shell extensions have a UUID property; this key lists extensions
|
||||||
|
which should be disabled, even if loaded as part of the current mode.
|
||||||
|
You can also manipulate this list with the EnableExtension and
|
||||||
|
DisableExtension D-Bus methods on org.gnome.Shell.
|
||||||
|
This key takes precedence over the “enabled-extensions” setting.
|
||||||
|
</description>
|
||||||
|
</key>
|
||||||
<key name="disable-user-extensions" type="b">
|
<key name="disable-user-extensions" type="b">
|
||||||
<default>false</default>
|
<default>false</default>
|
||||||
<summary>Disable user extensions</summary>
|
<summary>Disable user extensions</summary>
|
||||||
@@ -99,11 +110,17 @@
|
|||||||
</description>
|
</description>
|
||||||
</key>
|
</key>
|
||||||
<child name="keybindings" schema="org.gnome.shell.keybindings"/>
|
<child name="keybindings" schema="org.gnome.shell.keybindings"/>
|
||||||
<child name="keyboard" schema="org.gnome.shell.keyboard"/>
|
|
||||||
</schema>
|
</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">
|
||||||
|
<default>["<Super>F10"]</default>
|
||||||
|
<summary>Keybinding to open the application menu</summary>
|
||||||
|
<description>
|
||||||
|
Keybinding to open the application menu.
|
||||||
|
</description>
|
||||||
|
</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>
|
||||||
@@ -133,21 +150,41 @@
|
|||||||
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="switch-to-application-1" type="as">
|
||||||
<default>[]</default>
|
<default>["<Super>1"]</default>
|
||||||
<summary>Keybinding that pauses and resumes all running tweens, for debugging purposes</summary>
|
<summary>Switch to application 1</summary>
|
||||||
<description></description>
|
|
||||||
</key>
|
</key>
|
||||||
</schema>
|
<key name="switch-to-application-2" type="as">
|
||||||
|
<default>["<Super>2"]</default>
|
||||||
<schema id="org.gnome.shell.keyboard" path="/org/gnome/shell/keyboard/"
|
<summary>Switch to application 2</summary>
|
||||||
gettext-domain="@GETTEXT_PACKAGE@">
|
</key>
|
||||||
<key name="keyboard-type" type="s">
|
<key name="switch-to-application-3" type="as">
|
||||||
<default>'touch'</default>
|
<default>["<Super>3"]</default>
|
||||||
<summary>Which keyboard to use</summary>
|
<summary>Switch to application 3</summary>
|
||||||
<description>
|
</key>
|
||||||
The type of keyboard to use.
|
<key name="switch-to-application-4" type="as">
|
||||||
</description>
|
<default>["<Super>4"]</default>
|
||||||
|
<summary>Switch to application 4</summary>
|
||||||
|
</key>
|
||||||
|
<key name="switch-to-application-5" type="as">
|
||||||
|
<default>["<Super>5"]</default>
|
||||||
|
<summary>Switch to application 5</summary>
|
||||||
|
</key>
|
||||||
|
<key name="switch-to-application-6" type="as">
|
||||||
|
<default>["<Super>6"]</default>
|
||||||
|
<summary>Switch to application 6</summary>
|
||||||
|
</key>
|
||||||
|
<key name="switch-to-application-7" type="as">
|
||||||
|
<default>["<Super>7"]</default>
|
||||||
|
<summary>Switch to application 7</summary>
|
||||||
|
</key>
|
||||||
|
<key name="switch-to-application-8" type="as">
|
||||||
|
<default>["<Super>8"]</default>
|
||||||
|
<summary>Switch to application 8</summary>
|
||||||
|
</key>
|
||||||
|
<key name="switch-to-application-9" type="as">
|
||||||
|
<default>["<Super>9"]</default>
|
||||||
|
<summary>Switch to application 9</summary>
|
||||||
</key>
|
</key>
|
||||||
</schema>
|
</schema>
|
||||||
|
|
||||||
@@ -191,6 +228,36 @@
|
|||||||
</key>
|
</key>
|
||||||
</schema>
|
</schema>
|
||||||
|
|
||||||
|
<schema id="org.gnome.shell.world-clocks" path="/org/gnome/shell/world-clocks/"
|
||||||
|
gettext-domain="@GETTEXT_PACKAGE@">
|
||||||
|
<key name="locations" type="av">
|
||||||
|
<summary>Locations</summary>
|
||||||
|
<description>
|
||||||
|
The locations to show in world clocks
|
||||||
|
</description>
|
||||||
|
<default>[]</default>
|
||||||
|
</key>
|
||||||
|
</schema>
|
||||||
|
|
||||||
|
<schema id="org.gnome.shell.weather" path="/org/gnome/shell/weather/"
|
||||||
|
gettext-domain="@GETTEXT_PACKAGE@">
|
||||||
|
<key name="automatic-location" type="b">
|
||||||
|
<summary>Automatic location</summary>
|
||||||
|
<description>
|
||||||
|
Whether to fetch the current location or not
|
||||||
|
</description>
|
||||||
|
<default>false</default>
|
||||||
|
</key>
|
||||||
|
|
||||||
|
<key name="locations" type="av">
|
||||||
|
<summary>Location</summary>
|
||||||
|
<description>
|
||||||
|
The location for which to show a forecast
|
||||||
|
</description>
|
||||||
|
<default>[]</default>
|
||||||
|
</key>
|
||||||
|
</schema>
|
||||||
|
|
||||||
<!-- unused, change 00_org.gnome.shell.gschema.override instead -->
|
<!-- unused, change 00_org.gnome.shell.gschema.override instead -->
|
||||||
<schema id="org.gnome.shell.overrides" path="/org/gnome/shell/overrides/"
|
<schema id="org.gnome.shell.overrides" path="/org/gnome/shell/overrides/"
|
||||||
gettext-domain="@GETTEXT_PACKAGE@">
|
gettext-domain="@GETTEXT_PACKAGE@">
|
||||||
|
|||||||
599
data/osk-layouts/ca.json
Normal file
@@ -0,0 +1,599 @@
|
|||||||
|
{
|
||||||
|
"levels": [
|
||||||
|
{
|
||||||
|
"level": "",
|
||||||
|
"mode": "default",
|
||||||
|
"rows": [
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"q"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"w"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"e",
|
||||||
|
"é",
|
||||||
|
"è",
|
||||||
|
"ê",
|
||||||
|
"ë",
|
||||||
|
"%",
|
||||||
|
"ę",
|
||||||
|
"ė",
|
||||||
|
"ē"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"r"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"t"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"y",
|
||||||
|
"%",
|
||||||
|
"ÿ"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"u",
|
||||||
|
"ù",
|
||||||
|
"û",
|
||||||
|
"%",
|
||||||
|
"ü",
|
||||||
|
"ú",
|
||||||
|
"ū"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"i",
|
||||||
|
"î",
|
||||||
|
"%",
|
||||||
|
"ï",
|
||||||
|
"ì",
|
||||||
|
"í",
|
||||||
|
"į",
|
||||||
|
"ī"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"o",
|
||||||
|
"ô",
|
||||||
|
"œ",
|
||||||
|
"%",
|
||||||
|
"ö",
|
||||||
|
"ò",
|
||||||
|
"ó",
|
||||||
|
"õ",
|
||||||
|
"ø",
|
||||||
|
"ō",
|
||||||
|
"º"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"p"
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"a",
|
||||||
|
"à",
|
||||||
|
"â",
|
||||||
|
"%",
|
||||||
|
"æ",
|
||||||
|
"á",
|
||||||
|
"ä",
|
||||||
|
"ã",
|
||||||
|
"å",
|
||||||
|
"ā",
|
||||||
|
"ª"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"s"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"d"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"f"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"g"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"h"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"j"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"k"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"l"
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"z"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"x"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"c",
|
||||||
|
"ç",
|
||||||
|
"ć",
|
||||||
|
"č"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"v"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"b"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"n"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"m"
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
","
|
||||||
|
],
|
||||||
|
[
|
||||||
|
" "
|
||||||
|
],
|
||||||
|
[
|
||||||
|
".",
|
||||||
|
"#",
|
||||||
|
"!",
|
||||||
|
",",
|
||||||
|
"?",
|
||||||
|
"-",
|
||||||
|
":",
|
||||||
|
"'",
|
||||||
|
"@"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"level": "shift",
|
||||||
|
"mode": "latched",
|
||||||
|
"rows": [
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"Q"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"W"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"E",
|
||||||
|
"É",
|
||||||
|
"È",
|
||||||
|
"Ê",
|
||||||
|
"Ë",
|
||||||
|
"%",
|
||||||
|
"Ę",
|
||||||
|
"Ė",
|
||||||
|
"Ē"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"R"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"T"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Y",
|
||||||
|
"%",
|
||||||
|
"Ÿ"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"U",
|
||||||
|
"Ù",
|
||||||
|
"Û",
|
||||||
|
"%",
|
||||||
|
"Ü",
|
||||||
|
"Ú",
|
||||||
|
"Ū"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"I",
|
||||||
|
"Î",
|
||||||
|
"%",
|
||||||
|
"Ï",
|
||||||
|
"Ì",
|
||||||
|
"Í",
|
||||||
|
"Į",
|
||||||
|
"Ī"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"O",
|
||||||
|
"Ô",
|
||||||
|
"Œ",
|
||||||
|
"%",
|
||||||
|
"Ö",
|
||||||
|
"Ò",
|
||||||
|
"Ó",
|
||||||
|
"Õ",
|
||||||
|
"Ø",
|
||||||
|
"Ō",
|
||||||
|
"º"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"P"
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"A",
|
||||||
|
"À",
|
||||||
|
"Â",
|
||||||
|
"%",
|
||||||
|
"Æ",
|
||||||
|
"Á",
|
||||||
|
"Ä",
|
||||||
|
"Ã",
|
||||||
|
"Å",
|
||||||
|
"Ā",
|
||||||
|
"ª"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"S"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"D"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"F"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"G"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"H"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"J"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"K"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"L"
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"Z"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"X"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"C",
|
||||||
|
"Ç",
|
||||||
|
"Ć",
|
||||||
|
"Č"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"V"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"B"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"N"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"M"
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
","
|
||||||
|
],
|
||||||
|
[
|
||||||
|
" "
|
||||||
|
],
|
||||||
|
[
|
||||||
|
".",
|
||||||
|
"#",
|
||||||
|
"!",
|
||||||
|
",",
|
||||||
|
"?",
|
||||||
|
"-",
|
||||||
|
":",
|
||||||
|
"'",
|
||||||
|
"@"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"level": "opt",
|
||||||
|
"mode": "locked",
|
||||||
|
"rows": [
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"1",
|
||||||
|
"¹",
|
||||||
|
"½",
|
||||||
|
"⅓",
|
||||||
|
"¼",
|
||||||
|
"⅛"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"2",
|
||||||
|
"²",
|
||||||
|
"⅔"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"3",
|
||||||
|
"³",
|
||||||
|
"¾",
|
||||||
|
"⅜"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"4",
|
||||||
|
"⁴"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"5",
|
||||||
|
"⅝"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"6"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"7",
|
||||||
|
"⅞"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"8"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"9"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"0",
|
||||||
|
"ⁿ",
|
||||||
|
"∅"
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"@"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"#"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"$",
|
||||||
|
"¢",
|
||||||
|
"£",
|
||||||
|
"€",
|
||||||
|
"¥",
|
||||||
|
"₱"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"%",
|
||||||
|
"‰"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"&"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"-",
|
||||||
|
"_",
|
||||||
|
"–",
|
||||||
|
"—",
|
||||||
|
"·"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"+",
|
||||||
|
"±"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"(",
|
||||||
|
"<",
|
||||||
|
"{",
|
||||||
|
"["
|
||||||
|
],
|
||||||
|
[
|
||||||
|
")",
|
||||||
|
">",
|
||||||
|
"}",
|
||||||
|
"]"
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"*",
|
||||||
|
"†",
|
||||||
|
"‡",
|
||||||
|
"★"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"\"",
|
||||||
|
"“",
|
||||||
|
"”",
|
||||||
|
"«",
|
||||||
|
"»"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"'",
|
||||||
|
"‘",
|
||||||
|
"’",
|
||||||
|
"‹",
|
||||||
|
"›"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
":"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
";"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"!",
|
||||||
|
"¡"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"?",
|
||||||
|
"¿"
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"_"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"/"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
" "
|
||||||
|
],
|
||||||
|
[
|
||||||
|
","
|
||||||
|
],
|
||||||
|
[
|
||||||
|
".",
|
||||||
|
"…"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"level": "opt+shift",
|
||||||
|
"mode": "locked",
|
||||||
|
"rows": [
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"~"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"`"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"|"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"•",
|
||||||
|
"♪",
|
||||||
|
"♥",
|
||||||
|
"♠",
|
||||||
|
"♦",
|
||||||
|
"♣"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"√"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Π",
|
||||||
|
"π"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"÷"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"×"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"¶",
|
||||||
|
"§"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"∆"
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"£"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"¢"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"€"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"¥"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"^",
|
||||||
|
"↑",
|
||||||
|
"↓",
|
||||||
|
"←",
|
||||||
|
"→"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"°",
|
||||||
|
"′",
|
||||||
|
"″"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"=",
|
||||||
|
"≠",
|
||||||
|
"≈",
|
||||||
|
"∞"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"{"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"}"
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"\\"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"©"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"®"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"™"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"℅"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"["
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"]"
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"<",
|
||||||
|
"‹",
|
||||||
|
"≤",
|
||||||
|
"«"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
">",
|
||||||
|
"›",
|
||||||
|
"≥",
|
||||||
|
"»"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
" "
|
||||||
|
],
|
||||||
|
[
|
||||||
|
","
|
||||||
|
],
|
||||||
|
[
|
||||||
|
".",
|
||||||
|
"…"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"locale": "fr-CA",
|
||||||
|
"name": "French Canada"
|
||||||
|
}
|
||||||
@@ -6,10 +6,20 @@
|
|||||||
"rows": [
|
"rows": [
|
||||||
[
|
[
|
||||||
[
|
[
|
||||||
"q"
|
"a",
|
||||||
|
"à",
|
||||||
|
"â",
|
||||||
|
"%",
|
||||||
|
"æ",
|
||||||
|
"á",
|
||||||
|
"ä",
|
||||||
|
"ã",
|
||||||
|
"å",
|
||||||
|
"ā",
|
||||||
|
"ª"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"w"
|
"z"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"e",
|
"e",
|
||||||
@@ -71,17 +81,7 @@
|
|||||||
],
|
],
|
||||||
[
|
[
|
||||||
[
|
[
|
||||||
"a",
|
"q"
|
||||||
"à",
|
|
||||||
"â",
|
|
||||||
"%",
|
|
||||||
"æ",
|
|
||||||
"á",
|
|
||||||
"ä",
|
|
||||||
"ã",
|
|
||||||
"å",
|
|
||||||
"ā",
|
|
||||||
"ª"
|
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"s"
|
"s"
|
||||||
@@ -106,11 +106,14 @@
|
|||||||
],
|
],
|
||||||
[
|
[
|
||||||
"l"
|
"l"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"m"
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
[
|
[
|
||||||
"z"
|
"w"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"x"
|
"x"
|
||||||
@@ -131,7 +134,11 @@
|
|||||||
"n"
|
"n"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"m"
|
"'",
|
||||||
|
"‘",
|
||||||
|
"’",
|
||||||
|
"‹",
|
||||||
|
"›"
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
@@ -161,10 +168,20 @@
|
|||||||
"rows": [
|
"rows": [
|
||||||
[
|
[
|
||||||
[
|
[
|
||||||
"Q"
|
"A",
|
||||||
|
"À",
|
||||||
|
"Â",
|
||||||
|
"%",
|
||||||
|
"Æ",
|
||||||
|
"Á",
|
||||||
|
"Ä",
|
||||||
|
"Ã",
|
||||||
|
"Å",
|
||||||
|
"Ā",
|
||||||
|
"ª"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"W"
|
"Z"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"E",
|
"E",
|
||||||
@@ -226,17 +243,7 @@
|
|||||||
],
|
],
|
||||||
[
|
[
|
||||||
[
|
[
|
||||||
"A",
|
"Q"
|
||||||
"À",
|
|
||||||
"Â",
|
|
||||||
"%",
|
|
||||||
"Æ",
|
|
||||||
"Á",
|
|
||||||
"Ä",
|
|
||||||
"Ã",
|
|
||||||
"Å",
|
|
||||||
"Ā",
|
|
||||||
"ª"
|
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"S"
|
"S"
|
||||||
@@ -261,11 +268,14 @@
|
|||||||
],
|
],
|
||||||
[
|
[
|
||||||
"L"
|
"L"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"M"
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
[
|
[
|
||||||
"Z"
|
"W"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"X"
|
"X"
|
||||||
@@ -286,7 +296,11 @@
|
|||||||
"N"
|
"N"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"M"
|
"'",
|
||||||
|
"‘",
|
||||||
|
"’",
|
||||||
|
"‹",
|
||||||
|
"›"
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
@@ -369,10 +383,10 @@
|
|||||||
"#"
|
"#"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"$",
|
"€",
|
||||||
"¢",
|
"¢",
|
||||||
"£",
|
"£",
|
||||||
"€",
|
"$",
|
||||||
"¥",
|
"¥",
|
||||||
"₱"
|
"₱"
|
||||||
],
|
],
|
||||||
@@ -511,13 +525,14 @@
|
|||||||
"£"
|
"£"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
|
"¥"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"$",
|
||||||
"¢"
|
"¢"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"€"
|
"¢"
|
||||||
],
|
|
||||||
[
|
|
||||||
"¥"
|
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"^",
|
"^",
|
||||||
@@ -594,6 +609,6 @@
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"locale": "fr-CA",
|
"locale": "fr",
|
||||||
"name": "French Canada"
|
"name": "French"
|
||||||
}
|
}
|
||||||
@@ -1,3 +1,5 @@
|
|||||||
|
$variant: 'light';
|
||||||
|
|
||||||
@import "gnome-shell-sass/_high-contrast-colors"; //use gtk colors
|
@import "gnome-shell-sass/_high-contrast-colors"; //use gtk colors
|
||||||
@import "gnome-shell-sass/_drawing";
|
@import "gnome-shell-sass/_drawing";
|
||||||
@import "gnome-shell-sass/_common";
|
@import "gnome-shell-sass/_common";
|
||||||
|
|||||||
@@ -2,33 +2,34 @@
|
|||||||
// it gets @if ed depending on $variant
|
// it gets @if ed depending on $variant
|
||||||
|
|
||||||
|
|
||||||
$base_color: if($variant =='light', #ffffff, #292929);
|
$base_color: if($variant == 'light', #ffffff, lighten(desaturate(#241f31, 20%), 2%));
|
||||||
$bg_color: if($variant =='light', #ededed, #393f3f);
|
$bg_color: if($variant == 'light', #f6f5f4, darken(desaturate(#3d3846, 100%), 4%));
|
||||||
$fg_color: if($variant =='light', #2e3436, #eeeeec);
|
$fg_color: if($variant == 'light', #2e3436, #eeeeec);
|
||||||
|
|
||||||
$selected_fg_color: #ffffff;
|
$selected_fg_color: #ffffff;
|
||||||
$selected_bg_color: if($variant == 'light', #4a90d9, darken(#4a90d9,20%));
|
$selected_bg_color: if($variant == 'light', #3584e4, darken(#3584e4, 10%));
|
||||||
$selected_borders_color: if($variant=='light', darken($selected_bg_color, 30%),
|
$selected_borders_color: if($variant== 'light', darken($selected_bg_color, 15%), darken($selected_bg_color, 30%));
|
||||||
darken($selected_bg_color, 20%));
|
$borders_color: if($variant == 'light', darken($bg_color, 18%), darken($bg_color, 10%));
|
||||||
$borders_color: if($variant =='light', darken($bg_color,30%), darken($bg_color,12%));
|
$borders_edge: if($variant == 'light', transparentize(white, 0.2), transparentize($fg_color, 0.93));
|
||||||
$borders_edge: if($variant =='light', white, transparentize($fg_color, 0.9));
|
$link_color: if($variant == 'light', darken($selected_bg_color, 10%), lighten($selected_bg_color, 20%));
|
||||||
$link_color: if($variant == 'light', darken($selected_bg_color,10%),
|
$link_visited_color: if($variant == 'light', darken($selected_bg_color, 20%), lighten($selected_bg_color, 10%));
|
||||||
lighten($selected_bg_color,20%));
|
|
||||||
$link_visited_color: if($variant == 'light', darken($selected_bg_color,20%),
|
|
||||||
lighten($selected_bg_color,10%));
|
|
||||||
$top_hilight: $borders_edge;
|
$top_hilight: $borders_edge;
|
||||||
|
|
||||||
$warning_color: #f57900;
|
$warning_color: #f57900;
|
||||||
$error_color: #cc0000;
|
$error_color: #ff8080;
|
||||||
$success_color: if($variant =='light', #73d216, darken(#73d216,10%));
|
$success_color: if($variant == 'light', #33d17a, darken(#33d17a, 10%));
|
||||||
$destructive_color: if($variant =='light', #ef2929, darken(#ef2929,10%));
|
$destructive_color: if($variant == 'light', #e01b24, darken(#e01b24, 10%));
|
||||||
|
|
||||||
$osd_fg_color: #eeeeec;
|
$osd_fg_color: #eeeeec;
|
||||||
$osd_bg_color: #2e3436;
|
$osd_text_color: white;
|
||||||
|
$osd_bg_color: transparentize(darken(desaturate(#3d3846, 100%), 12%),0.04);
|
||||||
|
$osd_insensitive_bg_color: transparentize(mix($osd_fg_color, opacify($osd_bg_color, 1), 10%), 0.5);
|
||||||
|
$osd_insensitive_fg_color: mix($osd_fg_color, opacify($osd_bg_color, 1), 50%);
|
||||||
$osd_borders_color: transparentize(black, 0.3);
|
$osd_borders_color: transparentize(black, 0.3);
|
||||||
$osd_outer_borders_color: transparentize(white, 0.9);
|
$osd_outer_borders_color: transparentize(white, 0.84);
|
||||||
|
|
||||||
$tooltip_borders_color: $osd_outer_borders_color;
|
$tooltip_borders_color: $osd_outer_borders_color;
|
||||||
|
$shadow_color: transparentize(black, 0.9);
|
||||||
|
|
||||||
//insensitive state derived colors
|
//insensitive state derived colors
|
||||||
$insensitive_fg_color: mix($fg_color, $bg_color, 50%);
|
$insensitive_fg_color: mix($fg_color, $bg_color, 50%);
|
||||||
|
|||||||
@@ -37,16 +37,13 @@
|
|||||||
// possible $t values:
|
// possible $t values:
|
||||||
// normal, focus, insensitive
|
// normal, focus, insensitive
|
||||||
//
|
//
|
||||||
$_inner_shadows: inset 0 2px 4px transparentize(black, 0.6);
|
|
||||||
|
|
||||||
@if $t==normal {
|
@if $t==normal {
|
||||||
background-color: $base_color;
|
background-color: $base_color;
|
||||||
border-color: $borders_color;
|
border-color: $borders_color;
|
||||||
@include _shadows($_inner_shadows);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@if $t==focus {
|
@if $t==focus {
|
||||||
@include _shadows($_inner_shadows);
|
|
||||||
border-color: if($fc==$selected_bg_color,
|
border-color: if($fc==$selected_bg_color,
|
||||||
$selected_borders_color,
|
$selected_borders_color,
|
||||||
darken($fc,35%));
|
darken($fc,35%));
|
||||||
@@ -111,7 +108,7 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@mixin button($t, $c:$osd_bg_color, $tc:$fg_color, $edge: $borders_edge) {
|
@mixin button($t, $c:$bg_color, $tc:$fg_color, $edge: $borders_edge) {
|
||||||
//
|
//
|
||||||
// Button drawing function
|
// Button drawing function
|
||||||
//
|
//
|
||||||
@@ -130,19 +127,17 @@
|
|||||||
$_hilight_color: _button_hilight_color($c);
|
$_hilight_color: _button_hilight_color($c);
|
||||||
$_button_edge: if($edge == none, none, _widget_edge($edge));
|
$_button_edge: if($edge == none, none, _widget_edge($edge));
|
||||||
$_blank_edge: if($edge == none, none, _widget_edge(transparentize($edge,1)));
|
$_blank_edge: if($edge == none, none, _widget_edge(transparentize($edge,1)));
|
||||||
|
$_button_shadow: 0 1px 2px transparentize($shadow_color, 0.03);
|
||||||
|
|
||||||
@if $t==normal {
|
@if $t==normal {
|
||||||
//
|
//
|
||||||
// normal button
|
// normal button
|
||||||
//
|
//
|
||||||
$_bg: if($c!=$osd_bg_color, transparentize($c, 0.5),
|
|
||||||
$osd_bg_color);
|
|
||||||
|
|
||||||
color: $osd_fg_color;
|
color: $tc;
|
||||||
background-color: $_bg;
|
background-color: $c;
|
||||||
border-color: $osd_borders_color;
|
border-color: $borders_color;
|
||||||
box-shadow: inset 0 1px lighten($osd_bg_color,10%);
|
box-shadow: $_button_shadow;
|
||||||
text-shadow: 0 1px black;
|
text-shadow: 0 1px black;
|
||||||
icon-shadow: 0 1px black;
|
icon-shadow: 0 1px black;
|
||||||
}
|
}
|
||||||
@@ -150,26 +145,21 @@
|
|||||||
//
|
//
|
||||||
// focused button
|
// focused button
|
||||||
//
|
//
|
||||||
$_bg: if($c!=$osd_bg_color, transparentize($c, 0.3),
|
color: $tc;
|
||||||
lighten($osd_bg_color,3%));
|
|
||||||
|
|
||||||
color: $osd_fg_color;
|
|
||||||
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 $selected_bg_color;
|
box-shadow: inset 0px 0px 0px 2px $selected_bg_color;
|
||||||
|
//border-color: $selected_bg_color;
|
||||||
}
|
}
|
||||||
|
|
||||||
@else if $t==hover {
|
@else if $t==hover {
|
||||||
//
|
//
|
||||||
// active osd button
|
// active osd button
|
||||||
//
|
//
|
||||||
$_bg: if($c!=$osd_bg_color, transparentize($c, 0.3),
|
color: $tc;
|
||||||
lighten($osd_bg_color,3%));
|
border-color: $borders_color;
|
||||||
|
background-color: $c;
|
||||||
color: white;
|
box-shadow: $_button_shadow;
|
||||||
border-color: $osd_borders_color;
|
|
||||||
background-color: $_bg;
|
|
||||||
box-shadow: inset 0 1px lighten($osd_bg_color,20%);
|
|
||||||
text-shadow: 0 1px black;
|
text-shadow: 0 1px black;
|
||||||
icon-shadow: 0 1px black;
|
icon-shadow: 0 1px black;
|
||||||
|
|
||||||
@@ -178,27 +168,18 @@
|
|||||||
//
|
//
|
||||||
// active osd button
|
// active osd button
|
||||||
//
|
//
|
||||||
$_bg: if($c!=$bg_color, $c, $osd_borders_color);
|
color: $tc;
|
||||||
|
border-color: $borders_color;
|
||||||
color: white;
|
background-color: $c;
|
||||||
border-color: $osd_borders_color;
|
|
||||||
background-color: $selected_bg_color;
|
|
||||||
// This should be none, but it's creating some issues with borders, so to
|
|
||||||
// workaround it for now, use inset wich goes through a different code path.
|
|
||||||
// see https://bugzilla.gnome.org/show_bug.cgi?id=752934
|
|
||||||
box-shadow: inset 0 0 black;
|
|
||||||
text-shadow: none;
|
text-shadow: none;
|
||||||
icon-shadow: none;
|
icon-shadow: none;
|
||||||
|
box-shadow: none;
|
||||||
}
|
}
|
||||||
@else if $t==insensitive {
|
@else if $t==insensitive {
|
||||||
//
|
|
||||||
// insensitive osd button
|
|
||||||
//
|
|
||||||
$_bg: transparentize(mix($insensitive_fg_color,$osd_bg_color,20%),0.3);
|
|
||||||
|
|
||||||
color: $insensitive_fg_color;
|
color: $insensitive_fg_color;
|
||||||
border-color: $osd_borders_color;
|
border-color: $insensitive_borders_color;
|
||||||
background-color: $_bg;
|
background-color: $insensitive_bg_color;
|
||||||
box-shadow: none;
|
box-shadow: none;
|
||||||
text-shadow: none;
|
text-shadow: none;
|
||||||
icon-shadow: none;
|
icon-shadow: none;
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ $osd_borders_color: transparentize(black, 0.3);
|
|||||||
$osd_outer_borders_color: transparentize(white, 0.9);
|
$osd_outer_borders_color: transparentize(white, 0.9);
|
||||||
|
|
||||||
$tooltip_borders_color: $osd_outer_borders_color;
|
$tooltip_borders_color: $osd_outer_borders_color;
|
||||||
|
$shadow_color: transparentize(black, 0.9);
|
||||||
|
|
||||||
//insensitive state derived colors
|
//insensitive state derived colors
|
||||||
$insensitive_fg_color: mix($fg_color, $bg_color, 50%);
|
$insensitive_fg_color: mix($fg_color, $bg_color, 50%);
|
||||||
|
|||||||
28
data/theme/pointer-double-click-symbolic.svg
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<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="20"
|
||||||
|
height="20"
|
||||||
|
id="svg2">
|
||||||
|
<g
|
||||||
|
id="layer1"
|
||||||
|
style="display:inline">
|
||||||
|
<g
|
||||||
|
id="id1"
|
||||||
|
transform="translate(-19,-0.75)">
|
||||||
|
<path
|
||||||
|
style="color:#000000;shape-padding:0;clip-rule:nonzero;display:block;overflow:visible;visibility:visible;opacity:1;solid-color:#000000;solid-opacity:1;fill:#464646;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
|
||||||
|
d="m 19.855469,0.45507812 c 0,6.69466128 0,13.38932288 0,20.08398388 1.414713,-1.38151 2.829427,-2.763021 4.24414,-4.144531 0.5882,1.18866 1.158389,2.386561 1.758464,3.569127 1.108631,1.640259 4.157538,0.465128 3.89799,-1.495859 0.01057,-0.470226 -0.405577,-0.908445 -0.434651,-1.313638 0.259401,-0.25321 0.518802,-0.50642 0.778203,-0.75963 0.5882,1.18866 1.158389,2.386561 1.758464,3.569127 1.108631,1.640259 4.157538,0.465128 3.89799,-1.495859 -0.192325,-0.904303 -0.717854,-1.698026 -1.068629,-2.548967 -0.238908,-0.512658 -0.477817,-1.025315 -0.716725,-1.537973 1.755859,0 3.511719,0 5.267578,0 C 34.777352,9.738932 30.31641,5.0970051 25.855469,0.45507812 c 0,2.08138018 0,4.16276048 0,6.24414068 -2,-2.0813802 -4,-4.1627605 -6,-6.24414068 z m 1.5,3.72656248 c 2,2.0813801 4,4.1627603 6,6.2441404 0,-2.0813801 0,-4.1627603 0,-6.2441404 2.786458,2.8997395 5.572917,5.7994789 8.359375,8.6992184 -1.366537,0 -2.733073,0 -4.09961,0 0.883468,1.903435 1.781983,3.800273 2.656081,5.707817 0.0065,0.622781 -1.227555,0.980575 -1.325116,0.207118 -0.80433,-1.640251 -1.608661,-3.280501 -2.412991,-4.920752 -1.020182,0.995443 -2.040365,1.990885 -3.060547,2.986328 0.263642,0.608048 0.596803,1.192457 0.814693,1.816134 -0.182662,0.601037 -1.26833,0.8373 -1.365856,0.06795 -0.796094,-1.623456 -1.592189,-3.246912 -2.388284,-4.870368 -1.059245,1.033854 -2.118489,2.067708 -3.177734,3.101562 -4e-6,-4.265002 -7e-6,-8.5300036 -1.1e-5,-12.7950054 z"
|
||||||
|
id="path5565" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="id2"
|
||||||
|
transform="translate(-25,-0.75)" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 2.5 KiB |
20
data/theme/pointer-drag-symbolic.svg
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<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="20"
|
||||||
|
height="20"
|
||||||
|
id="svg2">
|
||||||
|
<g
|
||||||
|
id="g835">
|
||||||
|
<path
|
||||||
|
style="color:#000000;shape-padding:0;clip-rule:nonzero;display:block;overflow:visible;visibility:visible;opacity:1;solid-color:#000000;solid-opacity:1;fill:#464646;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
|
||||||
|
d="M 10.705078 1.671875 C 9.8685536 1.7465699 8.886927 1.5353073 8.2578125 2.2480469 C 8.0785627 2.7511513 7.8667422 2.9777446 7.3125 2.8652344 C 6.5186841 2.8141575 5.6105879 2.9190179 5.125 3.6386719 C 4.5700923 4.4696324 4.8113194 5.4949043 4.7578125 6.4316406 L 4.7578125 7.9335938 C 4.2480917 7.6156216 3.6258927 7.8015358 3.0585938 7.7519531 C 2.6157606 7.7312277 2.1774807 7.7771069 1.7402344 7.84375 C 1.7971654 10.529678 1.813967 13.217089 1.8613281 15.902344 C 1.9550191 17.204635 3.0933719 18.307155 4.40625 18.326172 C 5.0391993 18.341272 5.8885801 18.332951 6.6308594 18.337891 C 9.8526764 18.325821 13.076973 18.38774 16.296875 18.28125 C 17.459088 18.161027 18.510143 17.092798 18.367188 15.884766 L 18.367188 6.4042969 C 17.660379 5.4636119 16.551912 4.623434 15.308594 4.8339844 C 15.009045 4.3804158 14.822476 3.3608651 14.082031 3.0351562 C 13.727176 2.744118 13.242443 2.9253873 12.822266 2.8730469 C 12.524824 2.8003648 11.966366 3.0655864 11.953125 2.6210938 C 11.795774 2.0995736 11.23789 1.7125276 10.705078 1.671875 z M 10.599609 3.1757812 C 10.764131 3.4472414 10.782382 3.9294982 10.818359 4.3007812 C 10.824915 4.3076775 10.838155 4.3066925 10.845703 4.3125 C 10.836598 4.3123268 10.827465 4.3126732 10.818359 4.3125 L 11.3125 10.212891 L 11.976562 4.3710938 L 13.322266 4.375 C 13.858345 4.7645492 13.735252 5.5154752 13.876953 6.0976562 C 13.865826 6.1651282 13.88335 6.1937019 13.892578 6.234375 C 13.891928 6.2343667 13.891276 6.2343833 13.890625 6.234375 L 13.902344 6.3203125 L 14.384766 10.185547 L 15.048828 6.265625 C 15.622863 6.228498 16.206517 6.3041365 16.607422 6.7675781 C 17.017062 6.9844433 16.823063 7.4565491 16.867188 7.8261719 L 16.867188 16.167969 C 16.530129 17.131654 15.267211 16.71624 14.492188 16.828125 C 11.121671 16.841205 7.7500508 16.861953 4.3808594 16.814453 C 3.4051926 16.786173 3.2389196 15.744474 3.3398438 14.972656 C 3.3282027 13.065594 3.2950998 11.158732 3.2617188 9.2519531 C 3.5880829 9.2584131 3.9376766 9.2391948 4.25 9.2617188 C 4.7438842 10.17694 4.7346154 11.262903 4.7578125 12.277344 C 5.2504494 12.270544 5.8011939 12.317174 6.2578125 12.277344 C 6.2669593 9.7577406 6.2393741 7.2373172 6.2714844 4.71875 C 6.3763823 4.198849 7.0022289 4.409587 7.3828125 4.3652344 L 8.0585938 4.3652344 L 8.546875 10.212891 L 9.2167969 4.3359375 L 9.2128906 4.3359375 C 9.2438386 3.9531035 9.0622615 3.4401006 9.4609375 3.2167969 L 10.599609 3.1757812 z "
|
||||||
|
id="path5630" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 3.3 KiB |
26
data/theme/pointer-primary-click-symbolic.svg
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<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="20"
|
||||||
|
height="20"
|
||||||
|
id="svg2"
|
||||||
|
version="1.1">
|
||||||
|
<g
|
||||||
|
id="layer1"
|
||||||
|
style="display:inline">
|
||||||
|
<g
|
||||||
|
id="id1"
|
||||||
|
transform="translate(-22.25,-0.75)">
|
||||||
|
<path
|
||||||
|
style="color:#000000;shape-padding:0;clip-rule:nonzero;display:block;overflow:visible;visibility:visible;opacity:1;solid-color:#000000;solid-opacity:1;fill:#464646;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
|
||||||
|
d="m 25.855469,0.45507812 c 0,6.69466128 0,13.38932288 0,20.08398388 1.414713,-1.380859 2.829427,-2.761719 4.24414,-4.142578 0.612408,1.215372 1.173049,2.460221 1.819709,3.656095 1.141947,1.476279 3.975266,0.389006 3.846009,-1.473608 -0.09413,-0.822519 -0.594755,-1.521423 -0.899969,-2.277599 -0.298869,-0.640171 -0.597739,-1.280342 -0.896608,-1.920513 1.75651,0 3.513021,0 5.269531,0 C 34.777344,9.738932 30.316406,5.0970051 25.855469,0.45507812 Z m 1.5,3.72656248 c 2.786458,2.8997395 5.572917,5.7994789 8.359375,8.6992184 -1.367188,0 -2.734375,0 -4.101563,0 0.885072,1.903196 1.781799,3.80152 2.659622,5.707744 0.0349,0.566084 -1.149057,0.988823 -1.282093,0.297971 -0.818567,-1.671162 -1.637133,-3.342323 -2.455699,-5.013485 -1.059896,1.034505 -2.119791,2.06901 -3.179687,3.103515 1.5e-5,-4.264988 3e-5,-8.5299756 4.5e-5,-12.7949634 z"
|
||||||
|
id="path5565" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.9 KiB |
26
data/theme/pointer-secondary-click-symbolic.svg
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<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="20"
|
||||||
|
height="20"
|
||||||
|
id="svg2">
|
||||||
|
<g
|
||||||
|
id="layer1"
|
||||||
|
style="display:inline;stroke-width:1.5;stroke-miterlimit:4;stroke-dasharray:none;stroke:#000000;stroke-opacity:1">
|
||||||
|
<g
|
||||||
|
transform="matrix(-1,0,0,1,42,-0.75)"
|
||||||
|
id="g5847"
|
||||||
|
style="stroke-width:1.5;stroke-miterlimit:4;stroke-dasharray:none;stroke:#000000;stroke-opacity:1">
|
||||||
|
<path
|
||||||
|
style="color:#000000;shape-padding:0;clip-rule:nonzero;display:block;overflow:visible;visibility:visible;opacity:1;solid-color:#000000;solid-opacity:1;fill:#464646;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
|
||||||
|
d="m 25.855469,0.45507812 c 0,6.69466128 0,13.38932288 0,20.08398388 1.414713,-1.380859 2.829427,-2.761719 4.24414,-4.142578 0.612408,1.215372 1.173049,2.460221 1.819709,3.656095 1.141947,1.476279 3.975266,0.389006 3.846009,-1.473608 -0.09413,-0.822519 -0.594755,-1.521423 -0.899969,-2.277599 -0.298869,-0.640171 -0.597739,-1.280342 -0.896608,-1.920513 1.75651,0 3.513021,0 5.269531,0 C 34.777344,9.738932 30.316406,5.0970051 25.855469,0.45507812 Z m 1.5,3.72656248 c 2.786458,2.8997395 5.572917,5.7994789 8.359375,8.6992184 -1.367188,0 -2.734375,0 -4.101563,0 0.885072,1.903196 1.781799,3.80152 2.659622,5.707744 0.0349,0.566084 -1.149057,0.988823 -1.282093,0.297971 -0.818567,-1.671162 -1.637133,-3.342323 -2.455699,-5.013485 -1.059896,1.034505 -2.119791,2.06901 -3.179687,3.103515 1.5e-5,-4.264988 3e-5,-8.5299756 4.5e-5,-12.7949634 z"
|
||||||
|
id="path5851" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 2.0 KiB |
1
data/theme/toggle-off-dark.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="46" height="22"><defs><linearGradient id="a"><stop offset="0" stop-color="#39393a"/><stop offset="1" stop-color="#302f30"/></linearGradient><linearGradient xlink:href="#a" id="b" x1="53" y1="294.429" x2="53" y2="309.804" gradientUnits="userSpaceOnUse" gradientTransform="translate(-42.76)"/></defs><g transform="translate(0 -291.18)" stroke-width="1.085"><rect style="marker:none" width="44.446" height="20.911" x=".625" y="291.715" rx="10.455" ry="10.073" fill="#323233" stroke="#272728"/><rect ry="10.455" rx="10.455" y="291.715" x=".543" height="20.911" width="21.143" style="marker:none" fill="url(#b)" stroke="#151515"/></g></svg>
|
||||||
|
After Width: | Height: | Size: 725 B |
@@ -1,209 +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="65"
|
|
||||||
height="22"
|
|
||||||
id="svg2857"
|
|
||||||
version="1.1"
|
|
||||||
inkscape:version="0.48.5 r10040"
|
|
||||||
sodipodi:docname="toggle-off-us.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" />
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient76469-7-7-4"
|
|
||||||
id="linearGradient38024"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
gradientTransform="matrix(1.0215462,0,0,1.0322581,717.22867,428.68472)"
|
|
||||||
x1="6"
|
|
||||||
y1="102.95528"
|
|
||||||
x2="6"
|
|
||||||
y2="84.505203" />
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
id="linearGradient76469-7-7-4">
|
|
||||||
<stop
|
|
||||||
style="stop-color:#2e3232;stop-opacity:1"
|
|
||||||
offset="0"
|
|
||||||
id="stop76471-7-1-5" />
|
|
||||||
<stop
|
|
||||||
style="stop-color:#3e4545;stop-opacity:1"
|
|
||||||
offset="1"
|
|
||||||
id="stop76473-9-0-0" />
|
|
||||||
</linearGradient>
|
|
||||||
<inkscape:path-effect
|
|
||||||
effect="spiro"
|
|
||||||
id="path-effect77541-4"
|
|
||||||
is_visible="true" />
|
|
||||||
<inkscape:path-effect
|
|
||||||
effect="spiro"
|
|
||||||
id="path-effect77541-4-0"
|
|
||||||
is_visible="true" />
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient37802-8"
|
|
||||||
id="linearGradient12311-3-1-0-5-4"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
gradientTransform="matrix(1.5918367,0,0,0.85714285,-256.56122,59.071426)"
|
|
||||||
x1="610.13782"
|
|
||||||
y1="501.43866"
|
|
||||||
x2="610.13782"
|
|
||||||
y2="492.52756" />
|
|
||||||
<linearGradient
|
|
||||||
id="linearGradient37802-8"
|
|
||||||
inkscape:collect="always">
|
|
||||||
<stop
|
|
||||||
id="stop37804-1"
|
|
||||||
offset="0"
|
|
||||||
style="stop-color:#2c2c2c;stop-opacity:1" />
|
|
||||||
<stop
|
|
||||||
id="stop37806-8"
|
|
||||||
offset="1"
|
|
||||||
style="stop-color:#16191a;stop-opacity:1" />
|
|
||||||
</linearGradient>
|
|
||||||
<linearGradient
|
|
||||||
y2="492.52756"
|
|
||||||
x2="610.13782"
|
|
||||||
y1="501.43866"
|
|
||||||
x1="610.13782"
|
|
||||||
gradientTransform="matrix(1.5918367,0,0,0.85714285,-900.56122,-423.92857)"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
id="linearGradient13602"
|
|
||||||
xlink:href="#linearGradient37802-8"
|
|
||||||
inkscape:collect="always" />
|
|
||||||
</defs>
|
|
||||||
<sodipodi:namedview
|
|
||||||
id="base"
|
|
||||||
pagecolor="#000000"
|
|
||||||
bordercolor="#666666"
|
|
||||||
borderopacity="1.0"
|
|
||||||
inkscape:pageopacity="1"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:zoom="1"
|
|
||||||
inkscape:cx="-5.0602834"
|
|
||||||
inkscape:cy="16.473273"
|
|
||||||
inkscape:document-units="px"
|
|
||||||
inkscape:current-layer="g37994"
|
|
||||||
showgrid="false"
|
|
||||||
inkscape:window-width="2560"
|
|
||||||
inkscape:window-height="1375"
|
|
||||||
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="false">
|
|
||||||
<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
|
|
||||||
id="g37996"
|
|
||||||
transform="translate(-115,1277)">
|
|
||||||
<rect
|
|
||||||
style="color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964000000001;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;opacity:0.19591837"
|
|
||||||
id="rect13475"
|
|
||||||
width="98"
|
|
||||||
height="25"
|
|
||||||
x="644.5"
|
|
||||||
y="484.61118"
|
|
||||||
rx="4.7429576"
|
|
||||||
ry="3.8424656" />
|
|
||||||
<rect
|
|
||||||
ry="3.8424656"
|
|
||||||
rx="4.7429576"
|
|
||||||
y="483.5"
|
|
||||||
x="644.5"
|
|
||||||
height="25"
|
|
||||||
width="98"
|
|
||||||
id="rect38000"
|
|
||||||
style="color:#000000;fill:url(#linearGradient12311-3-1-0-5-4);fill-opacity:1;fill-rule:nonzero;stroke:#16191a;stroke-width:1.37920942;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:new" />
|
|
||||||
</g>
|
|
||||||
<g
|
|
||||||
transform="translate(-49.946213,-1.890275)"
|
|
||||||
id="g38002">
|
|
||||||
<g
|
|
||||||
transform="translate(-115,1247)"
|
|
||||||
style="display:inline"
|
|
||||||
id="g38004">
|
|
||||||
<rect
|
|
||||||
ry="3.7972314"
|
|
||||||
rx="4.6871223"
|
|
||||||
y="515.5"
|
|
||||||
x="694.53046"
|
|
||||||
height="25"
|
|
||||||
width="45.969578"
|
|
||||||
id="rect38006"
|
|
||||||
style="color:#000000;fill:url(#linearGradient38024);fill-opacity:1;fill-rule:nonzero;stroke:#1f2020;stroke-width:1.37920964;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" />
|
|
||||||
<path
|
|
||||||
sodipodi:nodetypes="cc"
|
|
||||||
style="opacity:0.1;color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964px;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"
|
|
||||||
d="m 699.09675,516.7365 36.86904,0"
|
|
||||||
id="path38016"
|
|
||||||
inkscape:path-effect="#path-effect77541-4"
|
|
||||||
inkscape:original-d="m 699.09675,516.7365 36.86904,0"
|
|
||||||
inkscape:connector-curvature="0" />
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
<path
|
|
||||||
sodipodi:type="arc"
|
|
||||||
style="color:#000000;fill:none;stroke:#ffffff;stroke-width:2.15627193;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:new"
|
|
||||||
id="path13479"
|
|
||||||
sodipodi:cx="16.4375"
|
|
||||||
sodipodi:cy="10.8125"
|
|
||||||
sodipodi:rx="4.3125"
|
|
||||||
sodipodi:ry="4.3125"
|
|
||||||
d="m 20.75,10.8125 a 4.3125,4.3125 0 1 1 -8.625,0 4.3125,4.3125 0 1 1 8.625,0 z"
|
|
||||||
transform="matrix(1.4212691,0,0,1.1514287,577.38488,1761.1138)" />
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 7.5 KiB |
@@ -1,255 +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="65"
|
|
||||||
height="22"
|
|
||||||
id="svg2857"
|
|
||||||
version="1.1"
|
|
||||||
inkscape:version="0.48.5 r10040"
|
|
||||||
sodipodi:docname="toggle-on-intl.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" />
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient76469-7-7-4"
|
|
||||||
id="linearGradient38024"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
gradientTransform="matrix(1.0215462,0,0,1.0322581,717.22867,428.68472)"
|
|
||||||
x1="6"
|
|
||||||
y1="102.95528"
|
|
||||||
x2="6"
|
|
||||||
y2="84.505203" />
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
id="linearGradient76469-7-7-4">
|
|
||||||
<stop
|
|
||||||
style="stop-color:#2e3232;stop-opacity:1"
|
|
||||||
offset="0"
|
|
||||||
id="stop76471-7-1-5" />
|
|
||||||
<stop
|
|
||||||
style="stop-color:#3e4545;stop-opacity:1"
|
|
||||||
offset="1"
|
|
||||||
id="stop76473-9-0-0" />
|
|
||||||
</linearGradient>
|
|
||||||
<inkscape:path-effect
|
|
||||||
effect="spiro"
|
|
||||||
id="path-effect77541-4"
|
|
||||||
is_visible="true" />
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient37802"
|
|
||||||
id="linearGradient12311-3-1-0-5"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
gradientTransform="matrix(1.5918367,0,0,0.85714285,-256.56122,59.071426)"
|
|
||||||
x1="610.13782"
|
|
||||||
y1="501.43866"
|
|
||||||
x2="610.13782"
|
|
||||||
y2="492.52756" />
|
|
||||||
<linearGradient
|
|
||||||
id="linearGradient37802"
|
|
||||||
inkscape:collect="always">
|
|
||||||
<stop
|
|
||||||
id="stop37804"
|
|
||||||
offset="0"
|
|
||||||
style="stop-color:#2c2c2c;stop-opacity:1" />
|
|
||||||
<stop
|
|
||||||
id="stop37806"
|
|
||||||
offset="1"
|
|
||||||
style="stop-color:#16191a;stop-opacity:1" />
|
|
||||||
</linearGradient>
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient76469-7-7-4-3"
|
|
||||||
id="linearGradient77680"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
gradientTransform="matrix(1,0,0,1.0322581,717.71949,428.68472)"
|
|
||||||
x1="6"
|
|
||||||
y1="102.95528"
|
|
||||||
x2="6"
|
|
||||||
y2="84.505203" />
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
id="linearGradient76469-7-7-4-3">
|
|
||||||
<stop
|
|
||||||
style="stop-color:#2e3232;stop-opacity:1"
|
|
||||||
offset="0"
|
|
||||||
id="stop76471-7-1-5-7" />
|
|
||||||
<stop
|
|
||||||
style="stop-color:#3e4545;stop-opacity:1"
|
|
||||||
offset="1"
|
|
||||||
id="stop76473-9-0-0-9" />
|
|
||||||
</linearGradient>
|
|
||||||
<inkscape:path-effect
|
|
||||||
effect="spiro"
|
|
||||||
id="path-effect77541-4-0"
|
|
||||||
is_visible="true" />
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient37802-8"
|
|
||||||
id="linearGradient12311-3-1-0-5-4"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
gradientTransform="matrix(1.5918367,0,0,0.85714285,-256.56122,59.071426)"
|
|
||||||
x1="610.13782"
|
|
||||||
y1="501.43866"
|
|
||||||
x2="610.13782"
|
|
||||||
y2="492.52756" />
|
|
||||||
<linearGradient
|
|
||||||
id="linearGradient37802-8"
|
|
||||||
inkscape:collect="always">
|
|
||||||
<stop
|
|
||||||
id="stop37804-1"
|
|
||||||
offset="0"
|
|
||||||
style="stop-color:#2c2c2c;stop-opacity:1" />
|
|
||||||
<stop
|
|
||||||
id="stop37806-8"
|
|
||||||
offset="1"
|
|
||||||
style="stop-color:#16191a;stop-opacity:1" />
|
|
||||||
</linearGradient>
|
|
||||||
<linearGradient
|
|
||||||
y2="492.52756"
|
|
||||||
x2="610.13782"
|
|
||||||
y1="501.43866"
|
|
||||||
x1="610.13782"
|
|
||||||
gradientTransform="matrix(1.5918367,0,0,0.85714285,-900.56122,-423.92857)"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
id="linearGradient13602"
|
|
||||||
xlink:href="#linearGradient37802-8"
|
|
||||||
inkscape:collect="always" />
|
|
||||||
</defs>
|
|
||||||
<sodipodi:namedview
|
|
||||||
id="base"
|
|
||||||
pagecolor="#000000"
|
|
||||||
bordercolor="#666666"
|
|
||||||
borderopacity="1.0"
|
|
||||||
inkscape:pageopacity="1"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:zoom="1"
|
|
||||||
inkscape:cx="16.760995"
|
|
||||||
inkscape:cy="21.955673"
|
|
||||||
inkscape:document-units="px"
|
|
||||||
inkscape:current-layer="g37994"
|
|
||||||
showgrid="false"
|
|
||||||
inkscape:window-width="2560"
|
|
||||||
inkscape:window-height="1375"
|
|
||||||
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="false">
|
|
||||||
<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
|
|
||||||
id="g37996"
|
|
||||||
transform="translate(-115,1277)">
|
|
||||||
<rect
|
|
||||||
style="color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964000000001;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;opacity:0.19591837"
|
|
||||||
id="rect13475"
|
|
||||||
width="98"
|
|
||||||
height="25"
|
|
||||||
x="644.5"
|
|
||||||
y="484.61118"
|
|
||||||
rx="4.7429576"
|
|
||||||
ry="3.8424656" />
|
|
||||||
<rect
|
|
||||||
ry="3.8424656"
|
|
||||||
rx="4.7429576"
|
|
||||||
y="483.5"
|
|
||||||
x="644.5"
|
|
||||||
height="25"
|
|
||||||
width="98"
|
|
||||||
id="rect38000"
|
|
||||||
style="color:#000000;fill:url(#linearGradient12311-3-1-0-5-4);fill-opacity:1;fill-rule:nonzero;stroke:#16191a;stroke-width:1.37920942;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:new" />
|
|
||||||
</g>
|
|
||||||
<g
|
|
||||||
transform="translate(-49.946213,-1.890275)"
|
|
||||||
id="g38002">
|
|
||||||
<g
|
|
||||||
transform="translate(-115,1247)"
|
|
||||||
style="display:inline"
|
|
||||||
id="g38004">
|
|
||||||
<rect
|
|
||||||
ry="3.7972314"
|
|
||||||
rx="4.6871223"
|
|
||||||
y="515.5"
|
|
||||||
x="694.53046"
|
|
||||||
height="25"
|
|
||||||
width="45.969578"
|
|
||||||
id="rect38006"
|
|
||||||
style="color:#000000;fill:url(#linearGradient38024);fill-opacity:1;fill-rule:nonzero;stroke:#1f2020;stroke-width:1.37920964;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" />
|
|
||||||
<path
|
|
||||||
sodipodi:nodetypes="cc"
|
|
||||||
style="opacity:0.1;color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964px;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"
|
|
||||||
d="m 699.09675,516.7365 36.86904,0"
|
|
||||||
id="path38016"
|
|
||||||
inkscape:path-effect="#path-effect77541-4"
|
|
||||||
inkscape:original-d="m 699.09675,516.7365 36.86904,0"
|
|
||||||
inkscape:connector-curvature="0" />
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
<text
|
|
||||||
xml:space="preserve"
|
|
||||||
style="font-size:13.79166794px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Cantarell;-inkscape-font-specification:Cantarell Bold"
|
|
||||||
x="520.29974"
|
|
||||||
y="1997.0011"
|
|
||||||
id="text75614"
|
|
||||||
sodipodi:linespacing="125%"
|
|
||||||
transform="scale(1.1236771,0.88993537)"><tspan
|
|
||||||
sodipodi:role="line"
|
|
||||||
id="tspan75616"
|
|
||||||
x="520.29974"
|
|
||||||
y="1997.0011">OFF</tspan></text>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 8.8 KiB |
1
data/theme/toggle-off.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="46" height="22"><g transform="translate(0 -291.18)"><rect style="marker:none;font-variant-east_asian:normal" width="44.446" height="20.911" x=".625" y="291.715" rx="10.455" ry="10.073" fill="#e1dedb" stroke="#cdc7c2" stroke-linecap="round" stroke-linejoin="round"/><rect ry="10.455" rx="10.455" y="291.715" x=".543" height="20.911" width="21.143" style="marker:none;font-variant-east_asian:normal" fill="#f8f7f7" stroke="#aa9f98" stroke-linecap="round" stroke-linejoin="round"/><g transform="matrix(.97148 0 0 1 1658.914 -2552.91)" stroke-width="1.015" stroke-linecap="round" stroke-linejoin="round"><rect ry="13.17" rx="13.556" y="1234.681" x="-1242.732" height="26" width="49.409" style="marker:none" fill="#e1dedb" stroke="#cdc7c2"/><rect style="marker:none" width="26.763" height="26" x="-1242.732" y="1234.769" rx="13.511" ry="13.126" fill="#f8f7f7" stroke="#aa9f98"/></g><g transform="matrix(.97148 0 0 1 1658.914 -2512.91)" stroke-width="1.015" stroke="#2b73cc"><rect style="marker:none" width="49.409" height="26" x="-1242.732" y="1234.681" rx="13.556" ry="13.17" fill="#3081e3"/><rect ry="13.126" rx="13.511" y="1234.769" x="-1220.086" height="26" width="26.763" style="marker:none" fill="#f8f7f7" stroke-linecap="round" stroke-linejoin="round"/></g></g></svg>
|
||||||
|
After Width: | Height: | Size: 1.3 KiB |
1
data/theme/toggle-on-dark.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="46" height="22"><defs><linearGradient id="a"><stop offset="0" stop-color="#39393a"/><stop offset="1" stop-color="#302f30"/></linearGradient><linearGradient xlink:href="#a" id="b" x1="53" y1="294.429" x2="53" y2="309.804" gradientUnits="userSpaceOnUse" gradientTransform="translate(-19)"/></defs><g transform="translate(0 -291.18)" stroke="#030e1b" stroke-width="1.085"><rect style="marker:none" width="44.446" height="20.911" x=".625" y="291.715" rx="10.455" ry="10.073" fill="#15539e"/><rect ry="10.455" rx="10.455" y="291.715" x="24.304" height="20.911" width="21.143" style="marker:none" fill="url(#b)"/></g></svg>
|
||||||
|
After Width: | Height: | Size: 707 B |
@@ -1,192 +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="65"
|
|
||||||
height="22"
|
|
||||||
id="svg2857"
|
|
||||||
version="1.1"
|
|
||||||
inkscape:version="0.91 r13725"
|
|
||||||
sodipodi:docname="toggle-on-intl.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" />
|
|
||||||
<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:#205b9a;stop-opacity:1" />
|
|
||||||
</linearGradient>
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient76469-7-7-4"
|
|
||||||
id="linearGradient38024"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
gradientTransform="matrix(1.0215462,0,0,1.0322581,717.22867,428.68472)"
|
|
||||||
x1="6"
|
|
||||||
y1="102.95528"
|
|
||||||
x2="6"
|
|
||||||
y2="84.505203" />
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
id="linearGradient76469-7-7-4">
|
|
||||||
<stop
|
|
||||||
style="stop-color:#2e3232;stop-opacity:1"
|
|
||||||
offset="0"
|
|
||||||
id="stop76471-7-1-5" />
|
|
||||||
<stop
|
|
||||||
style="stop-color:#3e4545;stop-opacity:1"
|
|
||||||
offset="1"
|
|
||||||
id="stop76473-9-0-0" />
|
|
||||||
</linearGradient>
|
|
||||||
<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="37.410841"
|
|
||||||
inkscape:cy="16.009314"
|
|
||||||
inkscape:document-units="px"
|
|
||||||
inkscape:current-layer="g37994"
|
|
||||||
showgrid="false"
|
|
||||||
inkscape:window-width="2560"
|
|
||||||
inkscape:window-height="1376"
|
|
||||||
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="false">
|
|
||||||
<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 />
|
|
||||||
</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
|
|
||||||
id="g37996"
|
|
||||||
transform="translate(-115,1277)">
|
|
||||||
<rect
|
|
||||||
style="color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964000000001;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;opacity:0.19591837"
|
|
||||||
id="rect13475"
|
|
||||||
width="98"
|
|
||||||
height="25"
|
|
||||||
x="644.5"
|
|
||||||
y="484.61118"
|
|
||||||
rx="4.7429576"
|
|
||||||
ry="3.8424656" />
|
|
||||||
<rect
|
|
||||||
ry="3.8424656"
|
|
||||||
rx="4.7429576"
|
|
||||||
y="483.5"
|
|
||||||
x="644.5"
|
|
||||||
height="25"
|
|
||||||
width="98"
|
|
||||||
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" />
|
|
||||||
</g>
|
|
||||||
<g
|
|
||||||
transform="translate(2.0625,-2)"
|
|
||||||
id="g38002">
|
|
||||||
<g
|
|
||||||
transform="translate(-115,1247)"
|
|
||||||
style="display:inline"
|
|
||||||
id="g38004">
|
|
||||||
<rect
|
|
||||||
ry="3.7972314"
|
|
||||||
rx="4.6871223"
|
|
||||||
y="515.5"
|
|
||||||
x="694.53046"
|
|
||||||
height="25"
|
|
||||||
width="45.969578"
|
|
||||||
id="rect38006"
|
|
||||||
style="color:#000000;fill:url(#linearGradient38024);fill-opacity:1;fill-rule:nonzero;stroke:#1f2020;stroke-width:1.37920964;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" />
|
|
||||||
<path
|
|
||||||
sodipodi:nodetypes="cc"
|
|
||||||
style="opacity:0.1;color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964px;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"
|
|
||||||
d="m 699.09675,516.7365 36.86904,0"
|
|
||||||
id="path38016"
|
|
||||||
inkscape:path-effect="#path-effect77541-4"
|
|
||||||
inkscape:original-d="m 699.09675,516.7365 36.86904,0"
|
|
||||||
inkscape:connector-curvature="0" />
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
<rect
|
|
||||||
style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new"
|
|
||||||
id="rect13678"
|
|
||||||
width="3.0646207"
|
|
||||||
height="12.414008"
|
|
||||||
x="554.77728"
|
|
||||||
y="1767.3566" />
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 6.8 KiB |
@@ -1,207 +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="65"
|
|
||||||
height="22"
|
|
||||||
id="svg2857"
|
|
||||||
version="1.1"
|
|
||||||
inkscape:version="0.91 r13725"
|
|
||||||
sodipodi:docname="toggle-on-us.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" />
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient76469-7-7-4"
|
|
||||||
id="linearGradient38024"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
gradientTransform="matrix(1.0215462,0,0,1.0322581,717.22867,428.68472)"
|
|
||||||
x1="6"
|
|
||||||
y1="102.95528"
|
|
||||||
x2="6"
|
|
||||||
y2="84.505203" />
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
id="linearGradient76469-7-7-4">
|
|
||||||
<stop
|
|
||||||
style="stop-color:#2e3232;stop-opacity:1"
|
|
||||||
offset="0"
|
|
||||||
id="stop76471-7-1-5" />
|
|
||||||
<stop
|
|
||||||
style="stop-color:#3e4545;stop-opacity:1"
|
|
||||||
offset="1"
|
|
||||||
id="stop76473-9-0-0" />
|
|
||||||
</linearGradient>
|
|
||||||
<inkscape:path-effect
|
|
||||||
effect="spiro"
|
|
||||||
id="path-effect77541-4"
|
|
||||||
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>
|
|
||||||
<sodipodi:namedview
|
|
||||||
id="base"
|
|
||||||
pagecolor="#000000"
|
|
||||||
bordercolor="#666666"
|
|
||||||
borderopacity="1.0"
|
|
||||||
inkscape:pageopacity="1"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:zoom="1"
|
|
||||||
inkscape:cx="-26.798898"
|
|
||||||
inkscape:cy="5.3753009"
|
|
||||||
inkscape:document-units="px"
|
|
||||||
inkscape:current-layer="g37994"
|
|
||||||
showgrid="false"
|
|
||||||
inkscape:window-width="2560"
|
|
||||||
inkscape:window-height="1376"
|
|
||||||
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="false">
|
|
||||||
<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 />
|
|
||||||
</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
|
|
||||||
id="g37996"
|
|
||||||
transform="translate(-115,1277)">
|
|
||||||
<rect
|
|
||||||
style="color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964000000001;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;opacity:0.19591837"
|
|
||||||
id="rect13475"
|
|
||||||
width="98"
|
|
||||||
height="25"
|
|
||||||
x="644.5"
|
|
||||||
y="484.61118"
|
|
||||||
rx="4.7429576"
|
|
||||||
ry="3.8424656" />
|
|
||||||
<rect
|
|
||||||
ry="3.8424656"
|
|
||||||
rx="4.7429576"
|
|
||||||
y="483.5"
|
|
||||||
x="644.5"
|
|
||||||
height="25"
|
|
||||||
width="98"
|
|
||||||
id="rect38000"
|
|
||||||
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
|
|
||||||
transform="translate(2.0625,-2)"
|
|
||||||
id="g38002">
|
|
||||||
<g
|
|
||||||
transform="translate(-115,1247)"
|
|
||||||
style="display:inline"
|
|
||||||
id="g38004">
|
|
||||||
<rect
|
|
||||||
ry="3.7972314"
|
|
||||||
rx="4.6871223"
|
|
||||||
y="515.5"
|
|
||||||
x="694.53046"
|
|
||||||
height="25"
|
|
||||||
width="45.969578"
|
|
||||||
id="rect38006"
|
|
||||||
style="color:#000000;fill:url(#linearGradient38024);fill-opacity:1;fill-rule:nonzero;stroke:#1f2020;stroke-width:1.37920964;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" />
|
|
||||||
<path
|
|
||||||
sodipodi:nodetypes="cc"
|
|
||||||
style="opacity:0.1;color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964px;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"
|
|
||||||
d="m 699.09675,516.7365 36.86904,0"
|
|
||||||
id="path38016"
|
|
||||||
inkscape:path-effect="#path-effect77541-4"
|
|
||||||
inkscape:original-d="m 699.09675,516.7365 36.86904,0"
|
|
||||||
inkscape:connector-curvature="0" />
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
<text
|
|
||||||
transform="scale(1.1000946,0.90901274)"
|
|
||||||
sodipodi:linespacing="125%"
|
|
||||||
id="text38018"
|
|
||||||
y="1955.5205"
|
|
||||||
x="495.94223"
|
|
||||||
style="font-size:13.29953671px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Cantarell;-inkscape-font-specification:Cantarell Bold"
|
|
||||||
xml:space="preserve"><tspan
|
|
||||||
y="1955.5205"
|
|
||||||
x="495.94223"
|
|
||||||
id="tspan38020"
|
|
||||||
sodipodi:role="line">ON</tspan></text>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 7.7 KiB |
1
data/theme/toggle-on.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="46" height="22"><g transform="translate(0 -291.18)" stroke="#2b73cc"><rect style="marker:none;font-variant-east_asian:normal" width="44.446" height="20.911" x=".625" y="291.715" rx="10.455" ry="10.073" fill="#3081e3"/><rect ry="10.455" rx="10.455" y="291.715" x="24.304" height="20.911" width="21.143" style="marker:none;font-variant-east_asian:normal" fill="#f8f7f7" stroke-linecap="round" stroke-linejoin="round"/></g></svg>
|
||||||
|
After Width: | Height: | Size: 473 B |
@@ -40,6 +40,7 @@ do
|
|||||||
done
|
done
|
||||||
|
|
||||||
cat >>$TMP_GRESOURCE_FILE <<EOF
|
cat >>$TMP_GRESOURCE_FILE <<EOF
|
||||||
|
<file>emoji.json</file>
|
||||||
</gresource>
|
</gresource>
|
||||||
</gresources>
|
</gresources>
|
||||||
EOF
|
EOF
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ foreach iface : ifaces
|
|||||||
output: 'doc-gen-' + iface[1],
|
output: 'doc-gen-' + iface[1],
|
||||||
command: [
|
command: [
|
||||||
'gdbus-codegen',
|
'gdbus-codegen',
|
||||||
'--interface-prefix=@0@.'.format(iface),
|
'--interface-prefix=@0@.'.format(iface[0]),
|
||||||
'--generate-docbook', 'doc-gen',
|
'--generate-docbook', 'doc-gen',
|
||||||
'--output-directory', '@OUTDIR@',
|
'--output-directory', '@OUTDIR@',
|
||||||
'@INPUT@'
|
'@INPUT@'
|
||||||
|
|||||||
@@ -1,10 +1,9 @@
|
|||||||
|
/* exported main */
|
||||||
|
imports.gi.versions.Gdk = '3.0';
|
||||||
|
imports.gi.versions.Gtk = '3.0';
|
||||||
|
|
||||||
const Gettext = imports.gettext;
|
const Gettext = imports.gettext;
|
||||||
const GLib = imports.gi.GLib;
|
const { Gdk, GLib, Gio, GObject, Gtk, Pango } = imports.gi;
|
||||||
const GObject = imports.gi.GObject;
|
|
||||||
const Gio = imports.gi.Gio;
|
|
||||||
const Gtk = imports.gi.Gtk;
|
|
||||||
const Gdk = imports.gi.Gdk;
|
|
||||||
const Pango = imports.gi.Pango;
|
|
||||||
const Format = imports.format;
|
const Format = imports.format;
|
||||||
|
|
||||||
const _ = Gettext.gettext;
|
const _ = Gettext.gettext;
|
||||||
@@ -13,6 +12,8 @@ const Config = imports.misc.config;
|
|||||||
const ExtensionUtils = imports.misc.extensionUtils;
|
const ExtensionUtils = imports.misc.extensionUtils;
|
||||||
const { loadInterfaceXML } = imports.misc.fileUtils;
|
const { loadInterfaceXML } = imports.misc.fileUtils;
|
||||||
|
|
||||||
|
const { ExtensionState } = ExtensionUtils;
|
||||||
|
|
||||||
const GnomeShellIface = loadInterfaceXML('org.gnome.Shell.Extensions');
|
const GnomeShellIface = loadInterfaceXML('org.gnome.Shell.Extensions');
|
||||||
const GnomeShellProxy = Gio.DBusProxy.makeProxyWrapper(GnomeShellIface);
|
const GnomeShellProxy = Gio.DBusProxy.makeProxyWrapper(GnomeShellIface);
|
||||||
|
|
||||||
@@ -22,74 +23,54 @@ function stripPrefix(string, prefix) {
|
|||||||
return string;
|
return string;
|
||||||
}
|
}
|
||||||
|
|
||||||
var Application = class {
|
var Application = GObject.registerClass({
|
||||||
constructor() {
|
GTypeName: 'ExtensionPrefs_Application'
|
||||||
|
}, class Application extends Gtk.Application {
|
||||||
|
_init() {
|
||||||
GLib.set_prgname('gnome-shell-extension-prefs');
|
GLib.set_prgname('gnome-shell-extension-prefs');
|
||||||
this.application = new Gtk.Application({
|
super._init({
|
||||||
application_id: 'org.gnome.shell.ExtensionPrefs',
|
application_id: 'org.gnome.shell.ExtensionPrefs',
|
||||||
flags: Gio.ApplicationFlags.HANDLES_COMMAND_LINE
|
flags: Gio.ApplicationFlags.HANDLES_COMMAND_LINE
|
||||||
});
|
});
|
||||||
|
|
||||||
this.application.connect('activate', this._onActivate.bind(this));
|
|
||||||
this.application.connect('command-line', this._onCommandLine.bind(this));
|
|
||||||
this.application.connect('startup', this._onStartup.bind(this));
|
|
||||||
|
|
||||||
this._extensionPrefsModules = {};
|
|
||||||
|
|
||||||
this._startupUuid = null;
|
this._startupUuid = null;
|
||||||
this._loaded = false;
|
this._loaded = false;
|
||||||
this._skipMainWindow = false;
|
this._skipMainWindow = false;
|
||||||
|
this._shellProxy = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
_extensionAvailable(uuid) {
|
get shellProxy() {
|
||||||
let extension = ExtensionUtils.extensions[uuid];
|
return this._shellProxy;
|
||||||
|
}
|
||||||
|
|
||||||
if (!extension)
|
_showPrefs(uuid) {
|
||||||
|
let row = this._extensionSelector.get_children().find(c => {
|
||||||
|
return c.uuid === uuid && c.hasPrefs;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!row)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!extension.dir.get_child('prefs.js').query_exists(null))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
_getExtensionPrefsModule(extension) {
|
|
||||||
let uuid = extension.metadata.uuid;
|
|
||||||
|
|
||||||
if (this._extensionPrefsModules.hasOwnProperty(uuid))
|
|
||||||
return this._extensionPrefsModules[uuid];
|
|
||||||
|
|
||||||
ExtensionUtils.installImporter(extension);
|
|
||||||
|
|
||||||
let prefsModule = extension.imports.prefs;
|
|
||||||
prefsModule.init(extension.metadata);
|
|
||||||
|
|
||||||
this._extensionPrefsModules[uuid] = prefsModule;
|
|
||||||
return prefsModule;
|
|
||||||
}
|
|
||||||
|
|
||||||
_selectExtension(uuid) {
|
|
||||||
if (!this._extensionAvailable(uuid))
|
|
||||||
return;
|
|
||||||
|
|
||||||
let extension = ExtensionUtils.extensions[uuid];
|
|
||||||
let widget;
|
let widget;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
let prefsModule = this._getExtensionPrefsModule(extension);
|
widget = row.prefsModule.buildPrefsWidget();
|
||||||
widget = prefsModule.buildPrefsWidget();
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
widget = this._buildErrorUI(extension, e);
|
widget = this._buildErrorUI(row, e);
|
||||||
}
|
}
|
||||||
|
|
||||||
let dialog = new Gtk.Window({ modal: !this._skipMainWindow,
|
let dialog = new Gtk.Window({
|
||||||
type_hint: Gdk.WindowTypeHint.DIALOG });
|
modal: !this._skipMainWindow,
|
||||||
dialog.set_titlebar(new Gtk.HeaderBar({ show_close_button: true,
|
type_hint: Gdk.WindowTypeHint.DIALOG
|
||||||
title: extension.metadata.name,
|
});
|
||||||
visible: true }));
|
dialog.set_titlebar(new Gtk.HeaderBar({
|
||||||
|
show_close_button: true,
|
||||||
|
title: row.name,
|
||||||
|
visible: true
|
||||||
|
}));
|
||||||
|
|
||||||
if (this._skipMainWindow) {
|
if (this._skipMainWindow) {
|
||||||
this.application.add_window(dialog);
|
this.add_window(dialog);
|
||||||
if (this._window)
|
if (this._window)
|
||||||
this._window.destroy();
|
this._window.destroy();
|
||||||
this._window = dialog;
|
this._window = dialog;
|
||||||
@@ -101,36 +82,127 @@ var Application = class {
|
|||||||
dialog.set_default_size(600, 400);
|
dialog.set_default_size(600, 400);
|
||||||
dialog.add(widget);
|
dialog.add(widget);
|
||||||
dialog.show();
|
dialog.show();
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
_buildErrorUI(extension, exc) {
|
_buildErrorUI(row, exc) {
|
||||||
let box = new Gtk.Box({ orientation: Gtk.Orientation.VERTICAL });
|
let scroll = new Gtk.ScrolledWindow({
|
||||||
|
hscrollbar_policy: Gtk.PolicyType.NEVER,
|
||||||
|
propagate_natural_height: true
|
||||||
|
});
|
||||||
|
|
||||||
|
let box = new Gtk.Box({
|
||||||
|
orientation: Gtk.Orientation.VERTICAL,
|
||||||
|
spacing: 12,
|
||||||
|
margin: 100,
|
||||||
|
margin_bottom: 60
|
||||||
|
});
|
||||||
|
scroll.add(box);
|
||||||
|
|
||||||
let label = new Gtk.Label({
|
let label = new Gtk.Label({
|
||||||
label: _("There was an error loading the preferences dialog for %s:").format(extension.metadata.name)
|
label: '<span size="x-large">%s</span>'.format(_("Something’s gone wrong")),
|
||||||
|
use_markup: true
|
||||||
|
});
|
||||||
|
label.get_style_context().add_class(Gtk.STYLE_CLASS_DIM_LABEL);
|
||||||
|
box.add(label);
|
||||||
|
|
||||||
|
label = new Gtk.Label({
|
||||||
|
label: _("We’re very sorry, but there’s been a problem: the settings for this extension can’t be displayed. We recommend that you report the issue to the extension authors."),
|
||||||
|
justify: Gtk.Justification.CENTER,
|
||||||
|
wrap: true
|
||||||
});
|
});
|
||||||
box.add(label);
|
box.add(label);
|
||||||
|
|
||||||
let errortext = '';
|
let expander = new Expander({
|
||||||
errortext += exc;
|
label: _("Technical Details"),
|
||||||
errortext += '\n\n';
|
margin_top: 12
|
||||||
errortext += 'Stack trace:\n';
|
});
|
||||||
|
box.add(expander);
|
||||||
|
|
||||||
// Indent stack trace.
|
let errortext = `${exc}\n\nStack trace:\n${
|
||||||
errortext += exc.stack.split('\n').map(line => ' ' + line).join('\n');
|
// Indent stack trace.
|
||||||
|
exc.stack.split('\n').map(line => ` ${line}`).join('\n')
|
||||||
|
}`;
|
||||||
|
|
||||||
let scroll = new Gtk.ScrolledWindow({ vexpand: true });
|
|
||||||
let buffer = new Gtk.TextBuffer({ text: errortext });
|
let buffer = new Gtk.TextBuffer({ text: errortext });
|
||||||
let textview = new Gtk.TextView({ buffer: buffer });
|
let textview = new Gtk.TextView({
|
||||||
textview.override_font(Pango.font_description_from_string('monospace'));
|
buffer: buffer,
|
||||||
scroll.add(textview);
|
wrap_mode: Gtk.WrapMode.WORD,
|
||||||
box.add(scroll);
|
monospace: true,
|
||||||
|
editable: false,
|
||||||
|
top_margin: 12,
|
||||||
|
bottom_margin: 12,
|
||||||
|
left_margin: 12,
|
||||||
|
right_margin: 12
|
||||||
|
});
|
||||||
|
|
||||||
box.show_all();
|
let toolbar = new Gtk.Toolbar();
|
||||||
return box;
|
let provider = new Gtk.CssProvider();
|
||||||
|
provider.load_from_data(`* {
|
||||||
|
border: 0 solid @borders;
|
||||||
|
border-top-width: 1px;
|
||||||
|
}`);
|
||||||
|
toolbar.get_style_context().add_provider(
|
||||||
|
provider,
|
||||||
|
Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
|
||||||
|
);
|
||||||
|
|
||||||
|
let copyButton = new Gtk.ToolButton({
|
||||||
|
icon_name: 'edit-copy-symbolic',
|
||||||
|
tooltip_text: _("Copy Error")
|
||||||
|
});
|
||||||
|
toolbar.add(copyButton);
|
||||||
|
|
||||||
|
copyButton.connect('clicked', w => {
|
||||||
|
let clipboard = Gtk.Clipboard.get_default(w.get_display());
|
||||||
|
// markdown for pasting in gitlab issues
|
||||||
|
let lines = [
|
||||||
|
`The settings of extension ${row.uuid} had an error:`,
|
||||||
|
'```',
|
||||||
|
`${exc}`,
|
||||||
|
'```',
|
||||||
|
'',
|
||||||
|
'Stack trace:',
|
||||||
|
'```',
|
||||||
|
exc.stack.replace(/\n$/, ''), // stack without trailing newline
|
||||||
|
'```',
|
||||||
|
''
|
||||||
|
];
|
||||||
|
clipboard.set_text(lines.join('\n'), -1);
|
||||||
|
});
|
||||||
|
|
||||||
|
let spacing = new Gtk.SeparatorToolItem({ draw: false });
|
||||||
|
toolbar.add(spacing);
|
||||||
|
toolbar.child_set_property(spacing, "expand", true);
|
||||||
|
|
||||||
|
let urlButton = new Gtk.ToolButton({
|
||||||
|
label: _("Homepage"),
|
||||||
|
tooltip_text: _("Visit extension homepage"),
|
||||||
|
no_show_all: true,
|
||||||
|
visible: row.url != null
|
||||||
|
});
|
||||||
|
toolbar.add(urlButton);
|
||||||
|
|
||||||
|
urlButton.connect('clicked', w => {
|
||||||
|
let context = w.get_display().get_app_launch_context();
|
||||||
|
Gio.AppInfo.launch_default_for_uri(row.url, context);
|
||||||
|
});
|
||||||
|
|
||||||
|
let expandedBox = new Gtk.Box({
|
||||||
|
orientation: Gtk.Orientation.VERTICAL
|
||||||
|
});
|
||||||
|
expandedBox.add(textview);
|
||||||
|
expandedBox.add(toolbar);
|
||||||
|
|
||||||
|
expander.add(expandedBox);
|
||||||
|
|
||||||
|
scroll.show_all();
|
||||||
|
return scroll;
|
||||||
}
|
}
|
||||||
|
|
||||||
_buildUI(app) {
|
_buildUI() {
|
||||||
this._window = new Gtk.ApplicationWindow({ application: app,
|
this._window = new Gtk.ApplicationWindow({ application: this,
|
||||||
window_position: Gtk.WindowPosition.CENTER });
|
window_position: Gtk.WindowPosition.CENTER });
|
||||||
|
|
||||||
this._window.set_default_size(800, 500);
|
this._window.set_default_size(800, 500);
|
||||||
@@ -147,8 +219,12 @@ var Application = class {
|
|||||||
Gio.SettingsBindFlags.DEFAULT |
|
Gio.SettingsBindFlags.DEFAULT |
|
||||||
Gio.SettingsBindFlags.INVERT_BOOLEAN);
|
Gio.SettingsBindFlags.INVERT_BOOLEAN);
|
||||||
|
|
||||||
|
this._mainStack = new Gtk.Stack({
|
||||||
|
transition_type: Gtk.StackTransitionType.CROSSFADE
|
||||||
|
});
|
||||||
|
this._window.add(this._mainStack);
|
||||||
|
|
||||||
let scroll = new Gtk.ScrolledWindow({ hscrollbar_policy: Gtk.PolicyType.NEVER });
|
let scroll = new Gtk.ScrolledWindow({ hscrollbar_policy: Gtk.PolicyType.NEVER });
|
||||||
this._window.add(scroll);
|
|
||||||
|
|
||||||
this._extensionSelector = new Gtk.ListBox({ selection_mode: Gtk.SelectionMode.NONE });
|
this._extensionSelector = new Gtk.ListBox({ selection_mode: Gtk.SelectionMode.NONE });
|
||||||
this._extensionSelector.set_sort_func(this._sortList.bind(this));
|
this._extensionSelector.set_sort_func(this._sortList.bind(this));
|
||||||
@@ -156,20 +232,18 @@ var Application = class {
|
|||||||
|
|
||||||
scroll.add(this._extensionSelector);
|
scroll.add(this._extensionSelector);
|
||||||
|
|
||||||
|
this._mainStack.add_named(scroll, 'listing');
|
||||||
|
this._mainStack.add_named(new EmptyPlaceholder(), 'placeholder');
|
||||||
|
|
||||||
this._shellProxy = new GnomeShellProxy(Gio.DBus.session, 'org.gnome.Shell', '/org/gnome/Shell');
|
this._shellProxy = new GnomeShellProxy(Gio.DBus.session, 'org.gnome.Shell', '/org/gnome/Shell');
|
||||||
this._shellProxy.connectSignal('ExtensionStatusChanged', (proxy, senderName, [uuid, state, error]) => {
|
this._shellProxy.connectSignal('ExtensionStateChanged',
|
||||||
if (ExtensionUtils.extensions[uuid] !== undefined)
|
this._onExtensionStateChanged.bind(this));
|
||||||
this._scanExtensions();
|
|
||||||
});
|
|
||||||
|
|
||||||
this._window.show_all();
|
this._window.show_all();
|
||||||
}
|
}
|
||||||
|
|
||||||
_sortList(row1, row2) {
|
_sortList(row1, row2) {
|
||||||
let name1 = ExtensionUtils.extensions[row1.uuid].metadata.name;
|
return row1.name.localeCompare(row2.name);
|
||||||
let name2 = ExtensionUtils.extensions[row2.uuid].metadata.name;
|
|
||||||
return name1.localeCompare(name2);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_updateHeader(row, before) {
|
_updateHeader(row, before) {
|
||||||
@@ -180,19 +254,56 @@ var Application = class {
|
|||||||
row.set_header(sep);
|
row.set_header(sep);
|
||||||
}
|
}
|
||||||
|
|
||||||
_scanExtensions() {
|
_findExtensionRow(uuid) {
|
||||||
let finder = new ExtensionUtils.ExtensionFinder();
|
return this._extensionSelector.get_children().find(c => c.uuid === uuid);
|
||||||
finder.connect('extension-found', this._extensionFound.bind(this));
|
|
||||||
finder.scanExtensions();
|
|
||||||
this._extensionsLoaded();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_extensionFound(finder, extension) {
|
_onExtensionStateChanged(proxy, senderName, [uuid, newState]) {
|
||||||
let row = new ExtensionRow(extension.uuid);
|
let row = this._findExtensionRow(uuid);
|
||||||
|
if (row) {
|
||||||
|
let { state } = ExtensionUtils.deserializeExtension(newState);
|
||||||
|
if (state == ExtensionState.UNINSTALLED)
|
||||||
|
row.destroy();
|
||||||
|
return; // we only deal with new and deleted extensions here
|
||||||
|
}
|
||||||
|
|
||||||
|
this._shellProxy.GetExtensionInfoRemote(uuid, ([serialized]) => {
|
||||||
|
let extension = ExtensionUtils.deserializeExtension(serialized);
|
||||||
|
if (!extension)
|
||||||
|
return;
|
||||||
|
// check the extension wasn't added in between
|
||||||
|
if (this._findExtensionRow(uuid) != null)
|
||||||
|
return;
|
||||||
|
this._addExtensionRow(extension);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
_scanExtensions() {
|
||||||
|
this._shellProxy.ListExtensionsRemote(([extensionsMap], e) => {
|
||||||
|
if (e) {
|
||||||
|
if (e instanceof Gio.DBusError) {
|
||||||
|
log(`Failed to connect to shell proxy: ${e}`);
|
||||||
|
this._mainStack.add_named(new NoShellPlaceholder(), 'noshell');
|
||||||
|
this._mainStack.visible_child_name = 'noshell';
|
||||||
|
} else {
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let uuid in extensionsMap) {
|
||||||
|
let extension = ExtensionUtils.deserializeExtension(extensionsMap[uuid]);
|
||||||
|
this._addExtensionRow(extension);
|
||||||
|
}
|
||||||
|
this._extensionsLoaded();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
_addExtensionRow(extension) {
|
||||||
|
let row = new ExtensionRow(extension);
|
||||||
|
|
||||||
row.prefsButton.visible = this._extensionAvailable(row.uuid);
|
|
||||||
row.prefsButton.connect('clicked', () => {
|
row.prefsButton.connect('clicked', () => {
|
||||||
this._selectExtension(row.uuid);
|
this._showPrefs(row.uuid);
|
||||||
});
|
});
|
||||||
|
|
||||||
row.show_all();
|
row.show_all();
|
||||||
@@ -200,24 +311,31 @@ var Application = class {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_extensionsLoaded() {
|
_extensionsLoaded() {
|
||||||
if (this._startupUuid && this._extensionAvailable(this._startupUuid))
|
if (this._extensionSelector.get_children().length > 0)
|
||||||
this._selectExtension(this._startupUuid);
|
this._mainStack.visible_child_name = 'listing';
|
||||||
|
else
|
||||||
|
this._mainStack.visible_child_name = 'placeholder';
|
||||||
|
|
||||||
|
if (this._startupUuid)
|
||||||
|
this._showPrefs(this._startupUuid);
|
||||||
this._startupUuid = null;
|
this._startupUuid = null;
|
||||||
this._skipMainWindow = false;
|
this._skipMainWindow = false;
|
||||||
this._loaded = true;
|
this._loaded = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
_onActivate() {
|
vfunc_activate() {
|
||||||
this._window.present();
|
this._window.present();
|
||||||
}
|
}
|
||||||
|
|
||||||
_onStartup(app) {
|
vfunc_startup() {
|
||||||
this._buildUI(app);
|
super.vfunc_startup();
|
||||||
|
|
||||||
|
this._buildUI();
|
||||||
this._scanExtensions();
|
this._scanExtensions();
|
||||||
}
|
}
|
||||||
|
|
||||||
_onCommandLine(app, commandLine) {
|
vfunc_command_line(commandLine) {
|
||||||
app.activate();
|
this.activate();
|
||||||
let args = commandLine.get_arguments();
|
let args = commandLine.get_arguments();
|
||||||
|
|
||||||
if (args.length) {
|
if (args.length) {
|
||||||
@@ -228,16 +346,208 @@ var Application = class {
|
|||||||
// Strip off "extension:///" prefix which fakes a URI, if it exists
|
// Strip off "extension:///" prefix which fakes a URI, if it exists
|
||||||
uuid = stripPrefix(uuid, "extension:///");
|
uuid = stripPrefix(uuid, "extension:///");
|
||||||
|
|
||||||
if (this._extensionAvailable(uuid))
|
if (!this._loaded)
|
||||||
this._selectExtension(uuid);
|
|
||||||
else if (!this._loaded)
|
|
||||||
this._startupUuid = uuid;
|
this._startupUuid = uuid;
|
||||||
else
|
else if (!this._showPrefs(uuid))
|
||||||
this._skipMainWindow = false;
|
this._skipMainWindow = false;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
};
|
});
|
||||||
|
|
||||||
|
var Expander = GObject.registerClass({
|
||||||
|
Properties: {
|
||||||
|
'label': GObject.ParamSpec.string(
|
||||||
|
'label', 'label', 'label',
|
||||||
|
GObject.ParamFlags.READWRITE,
|
||||||
|
null
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}, class Expander extends Gtk.Box {
|
||||||
|
_init(params = {}) {
|
||||||
|
this._labelText = null;
|
||||||
|
|
||||||
|
super._init(Object.assign(params, {
|
||||||
|
orientation: Gtk.Orientation.VERTICAL,
|
||||||
|
spacing: 0
|
||||||
|
}));
|
||||||
|
|
||||||
|
this._frame = new Gtk.Frame({
|
||||||
|
shadow_type: Gtk.ShadowType.IN,
|
||||||
|
hexpand: true
|
||||||
|
});
|
||||||
|
|
||||||
|
let eventBox = new Gtk.EventBox();
|
||||||
|
this._frame.add(eventBox);
|
||||||
|
|
||||||
|
let hbox = new Gtk.Box({
|
||||||
|
spacing: 6,
|
||||||
|
margin: 12
|
||||||
|
});
|
||||||
|
eventBox.add(hbox);
|
||||||
|
|
||||||
|
this._arrow = new Gtk.Image({
|
||||||
|
icon_name: 'pan-end-symbolic'
|
||||||
|
});
|
||||||
|
hbox.add(this._arrow);
|
||||||
|
|
||||||
|
this._label = new Gtk.Label({ label: this._labelText });
|
||||||
|
hbox.add(this._label);
|
||||||
|
|
||||||
|
this._revealer = new Gtk.Revealer();
|
||||||
|
|
||||||
|
this._childBin = new Gtk.Frame({
|
||||||
|
shadow_type: Gtk.ShadowType.IN
|
||||||
|
});
|
||||||
|
this._revealer.add(this._childBin);
|
||||||
|
|
||||||
|
// Directly chain up to parent for internal children
|
||||||
|
super.add(this._frame);
|
||||||
|
super.add(this._revealer);
|
||||||
|
|
||||||
|
let provider = new Gtk.CssProvider();
|
||||||
|
provider.load_from_data('* { border-top-width: 0; }');
|
||||||
|
this._childBin.get_style_context().add_provider(
|
||||||
|
provider,
|
||||||
|
Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
|
||||||
|
);
|
||||||
|
|
||||||
|
this._gesture = new Gtk.GestureMultiPress({
|
||||||
|
widget: this._frame,
|
||||||
|
button: 0,
|
||||||
|
exclusive: true
|
||||||
|
});
|
||||||
|
this._gesture.connect('released', (gesture, nPress) => {
|
||||||
|
if (nPress == 1)
|
||||||
|
this._revealer.reveal_child = !this._revealer.reveal_child;
|
||||||
|
});
|
||||||
|
this._revealer.connect('notify::reveal-child', () => {
|
||||||
|
if (this._revealer.reveal_child)
|
||||||
|
this._arrow.icon_name = 'pan-down-symbolic';
|
||||||
|
else
|
||||||
|
this._arrow.icon_name = 'pan-end-symbolic';
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
get label() {
|
||||||
|
return this._labelText;
|
||||||
|
}
|
||||||
|
|
||||||
|
set label(text) {
|
||||||
|
if (this._labelText == text)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (this._label)
|
||||||
|
this._label.label = text;
|
||||||
|
this._labelText = text;
|
||||||
|
this.notify('label');
|
||||||
|
}
|
||||||
|
|
||||||
|
add(child) {
|
||||||
|
// set expanded child
|
||||||
|
this._childBin.get_children().forEach(c => {
|
||||||
|
this._childBin.remove(c);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (child)
|
||||||
|
this._childBin.add(child);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var EmptyPlaceholder = GObject.registerClass(
|
||||||
|
class EmptyPlaceholder extends Gtk.Box {
|
||||||
|
_init() {
|
||||||
|
super._init({
|
||||||
|
orientation: Gtk.Orientation.VERTICAL,
|
||||||
|
spacing: 6,
|
||||||
|
margin: 32
|
||||||
|
});
|
||||||
|
|
||||||
|
let image = new Gtk.Image({
|
||||||
|
icon_name: 'application-x-addon-symbolic',
|
||||||
|
pixel_size: 96,
|
||||||
|
visible: true,
|
||||||
|
vexpand: true,
|
||||||
|
valign: Gtk.Align.END
|
||||||
|
});
|
||||||
|
image.get_style_context().add_class(Gtk.STYLE_CLASS_DIM_LABEL);
|
||||||
|
this.add(image);
|
||||||
|
|
||||||
|
let label = new Gtk.Label({
|
||||||
|
label: `<b><span size="x-large">${_("No Extensions Installed" )}</span></b>`,
|
||||||
|
use_markup: true,
|
||||||
|
visible: true
|
||||||
|
});
|
||||||
|
label.get_style_context().add_class(Gtk.STYLE_CLASS_DIM_LABEL);
|
||||||
|
this.add(label);
|
||||||
|
|
||||||
|
let appInfo = Gio.DesktopAppInfo.new('org.gnome.Software.desktop');
|
||||||
|
|
||||||
|
let desc = new Gtk.Label({
|
||||||
|
label: _("Extensions can be installed through Software or <a href=\"https://extensions.gnome.org\">extensions.gnome.org</a>."),
|
||||||
|
use_markup: true,
|
||||||
|
wrap: true,
|
||||||
|
justify: Gtk.Justification.CENTER,
|
||||||
|
visible: true,
|
||||||
|
max_width_chars: 50,
|
||||||
|
hexpand: true,
|
||||||
|
vexpand: (appInfo == null),
|
||||||
|
halign: Gtk.Align.CENTER,
|
||||||
|
valign: Gtk.Align.START
|
||||||
|
});
|
||||||
|
this.add(desc);
|
||||||
|
|
||||||
|
if (appInfo) {
|
||||||
|
let button = new Gtk.Button({
|
||||||
|
label: _("Browse in Software"),
|
||||||
|
image: new Gtk.Image({
|
||||||
|
icon_name: "org.gnome.Software-symbolic"
|
||||||
|
}),
|
||||||
|
always_show_image: true,
|
||||||
|
margin_top: 12,
|
||||||
|
visible: true,
|
||||||
|
halign: Gtk.Align.CENTER,
|
||||||
|
valign: Gtk.Align.START,
|
||||||
|
vexpand: true
|
||||||
|
});
|
||||||
|
this.add(button);
|
||||||
|
|
||||||
|
button.connect('clicked', w => {
|
||||||
|
let context = w.get_display().get_app_launch_context();
|
||||||
|
appInfo.launch([], context);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var NoShellPlaceholder = GObject.registerClass(
|
||||||
|
class NoShellPlaceholder extends Gtk.Box {
|
||||||
|
_init() {
|
||||||
|
super._init({
|
||||||
|
orientation: Gtk.Orientation.VERTICAL,
|
||||||
|
spacing: 12,
|
||||||
|
margin: 100,
|
||||||
|
margin_bottom: 60
|
||||||
|
});
|
||||||
|
|
||||||
|
let label = new Gtk.Label({
|
||||||
|
label: '<span size="x-large">%s</span>'.format(
|
||||||
|
_("Something’s gone wrong")),
|
||||||
|
use_markup: true
|
||||||
|
});
|
||||||
|
label.get_style_context().add_class(Gtk.STYLE_CLASS_DIM_LABEL);
|
||||||
|
this.add(label);
|
||||||
|
|
||||||
|
label = new Gtk.Label({
|
||||||
|
label: _("We’re very sorry, but it was not possible to get the list of installed extensions. Make sure you are logged into GNOME and try again."),
|
||||||
|
justify: Gtk.Justification.CENTER,
|
||||||
|
wrap: true
|
||||||
|
});
|
||||||
|
this.add(label);
|
||||||
|
|
||||||
|
this.show_all();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
var DescriptionLabel = GObject.registerClass(
|
var DescriptionLabel = GObject.registerClass(
|
||||||
class DescriptionLabel extends Gtk.Label {
|
class DescriptionLabel extends Gtk.Label {
|
||||||
@@ -251,30 +561,59 @@ class DescriptionLabel extends Gtk.Label {
|
|||||||
|
|
||||||
var ExtensionRow = GObject.registerClass(
|
var ExtensionRow = GObject.registerClass(
|
||||||
class ExtensionRow extends Gtk.ListBoxRow {
|
class ExtensionRow extends Gtk.ListBoxRow {
|
||||||
_init(uuid) {
|
_init(extension) {
|
||||||
super._init();
|
super._init();
|
||||||
|
|
||||||
this.uuid = uuid;
|
this._app = Gio.Application.get_default();
|
||||||
|
this._extension = extension;
|
||||||
|
this._prefsModule = null;
|
||||||
|
|
||||||
this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell' });
|
this.connect('destroy', this._onDestroy.bind(this));
|
||||||
this._settings.connect('changed::enabled-extensions', () => {
|
|
||||||
this._switch.state = this._isEnabled();
|
|
||||||
});
|
|
||||||
this._settings.connect('changed::disable-extension-version-validation',
|
|
||||||
() => {
|
|
||||||
this._switch.sensitive = this._canEnable();
|
|
||||||
});
|
|
||||||
this._settings.connect('changed::disable-user-extensions',
|
|
||||||
() => {
|
|
||||||
this._switch.sensitive = this._canEnable();
|
|
||||||
});
|
|
||||||
|
|
||||||
this._buildUI();
|
this._buildUI();
|
||||||
|
|
||||||
|
this._extensionStateChangedId = this._app.shellProxy.connectSignal(
|
||||||
|
'ExtensionStateChanged', (p, sender, [uuid, newState]) => {
|
||||||
|
if (this.uuid !== uuid)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this._extension = ExtensionUtils.deserializeExtension(newState);
|
||||||
|
let state = (this._extension.state == ExtensionState.ENABLED);
|
||||||
|
|
||||||
|
GObject.signal_handler_block(this._switch, this._notifyActiveId);
|
||||||
|
this._switch.state = state;
|
||||||
|
GObject.signal_handler_unblock(this._switch, this._notifyActiveId);
|
||||||
|
|
||||||
|
this._switch.sensitive = this._canToggle();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
get uuid() {
|
||||||
|
return this._extension.uuid;
|
||||||
|
}
|
||||||
|
|
||||||
|
get name() {
|
||||||
|
return this._extension.metadata.name;
|
||||||
|
}
|
||||||
|
|
||||||
|
get hasPrefs() {
|
||||||
|
return this._extension.hasPrefs;
|
||||||
|
}
|
||||||
|
|
||||||
|
get url() {
|
||||||
|
return this._extension.metadata.url;
|
||||||
|
}
|
||||||
|
|
||||||
|
_onDestroy() {
|
||||||
|
if (!this._app.shellProxy)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (this._extensionStateChangedId)
|
||||||
|
this._app.shellProxy.disconnectSignal(this._extensionStateChangedId);
|
||||||
|
this._extensionStateChangedId = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
_buildUI() {
|
_buildUI() {
|
||||||
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_end: 24, spacing: 24,
|
hexpand: true, margin_end: 24, spacing: 24,
|
||||||
margin: 12 });
|
margin: 12 });
|
||||||
@@ -284,73 +623,60 @@ class ExtensionRow extends Gtk.ListBoxRow {
|
|||||||
spacing: 6, hexpand: true });
|
spacing: 6, hexpand: true });
|
||||||
hbox.add(vbox);
|
hbox.add(vbox);
|
||||||
|
|
||||||
let name = GLib.markup_escape_text(extension.metadata.name, -1);
|
let name = GLib.markup_escape_text(this.name, -1);
|
||||||
let label = new Gtk.Label({ label: '<b>' + name + '</b>',
|
let label = new Gtk.Label({ label: '<b>' + name + '</b>',
|
||||||
use_markup: true,
|
use_markup: true,
|
||||||
halign: Gtk.Align.START });
|
halign: Gtk.Align.START });
|
||||||
vbox.add(label);
|
vbox.add(label);
|
||||||
|
|
||||||
let desc = extension.metadata.description.split('\n')[0];
|
let desc = this._extension.metadata.description.split('\n')[0];
|
||||||
label = new DescriptionLabel({ label: desc, wrap: true, lines: 2,
|
label = new DescriptionLabel({ label: desc, wrap: true, lines: 2,
|
||||||
ellipsize: Pango.EllipsizeMode.END,
|
ellipsize: Pango.EllipsizeMode.END,
|
||||||
xalign: 0, yalign: 0 });
|
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,
|
||||||
|
visible: this.hasPrefs,
|
||||||
no_show_all: true });
|
no_show_all: true });
|
||||||
button.add(new Gtk.Image({ icon_name: 'emblem-system-symbolic',
|
button.set_image(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('circular');
|
button.get_style_context().add_class('circular');
|
||||||
hbox.add(button);
|
hbox.add(button);
|
||||||
|
|
||||||
this.prefsButton = button;
|
this.prefsButton = button;
|
||||||
|
|
||||||
this._switch = new Gtk.Switch({ valign: Gtk.Align.CENTER,
|
this._switch = new Gtk.Switch({
|
||||||
sensitive: this._canEnable(),
|
valign: Gtk.Align.CENTER,
|
||||||
state: this._isEnabled() });
|
sensitive: this._canToggle(),
|
||||||
this._switch.connect('notify::active', () => {
|
state: this._extension.state === ExtensionState.ENABLED
|
||||||
|
});
|
||||||
|
this._notifyActiveId = this._switch.connect('notify::active', () => {
|
||||||
if (this._switch.active)
|
if (this._switch.active)
|
||||||
this._enable();
|
this._app.shellProxy.EnableExtensionRemote(this.uuid);
|
||||||
else
|
else
|
||||||
this._disable();
|
this._app.shellProxy.DisableExtensionRemote(this.uuid);
|
||||||
});
|
});
|
||||||
this._switch.connect('state-set', () => true);
|
this._switch.connect('state-set', () => true);
|
||||||
hbox.add(this._switch);
|
hbox.add(this._switch);
|
||||||
}
|
}
|
||||||
|
|
||||||
_canEnable() {
|
_canToggle() {
|
||||||
let extension = ExtensionUtils.extensions[this.uuid];
|
return this._extension.canChange;
|
||||||
let checkVersion = !this._settings.get_boolean('disable-extension-version-validation');
|
|
||||||
|
|
||||||
return !this._settings.get_boolean('disable-user-extensions') &&
|
|
||||||
!(checkVersion && ExtensionUtils.isOutOfDate(extension));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_isEnabled() {
|
get prefsModule() {
|
||||||
let extensions = this._settings.get_strv('enabled-extensions');
|
if (!this._prefsModule) {
|
||||||
return extensions.indexOf(this.uuid) != -1;
|
ExtensionUtils.installImporter(this._extension);
|
||||||
}
|
|
||||||
|
|
||||||
_enable() {
|
// give extension prefs access to their own extension object
|
||||||
let extensions = this._settings.get_strv('enabled-extensions');
|
ExtensionUtils.getCurrentExtension = () => this._extension;
|
||||||
if (extensions.indexOf(this.uuid) != -1)
|
|
||||||
return;
|
|
||||||
|
|
||||||
extensions.push(this.uuid);
|
this._prefsModule = this._extension.imports.prefs;
|
||||||
this._settings.set_strv('enabled-extensions', extensions);
|
this._prefsModule.init(this._extension.metadata);
|
||||||
}
|
}
|
||||||
|
|
||||||
_disable() {
|
return this._prefsModule;
|
||||||
let extensions = this._settings.get_strv('enabled-extensions');
|
|
||||||
let pos = extensions.indexOf(this.uuid);
|
|
||||||
if (pos == -1)
|
|
||||||
return;
|
|
||||||
do {
|
|
||||||
extensions.splice(pos, 1);
|
|
||||||
pos = extensions.indexOf(this.uuid);
|
|
||||||
} while (pos != -1);
|
|
||||||
this._settings.set_strv('enabled-extensions', extensions);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -358,12 +684,12 @@ function initEnvironment() {
|
|||||||
// Monkey-patch in a "global" object that fakes some Shell utilities
|
// Monkey-patch in a "global" object that fakes some Shell utilities
|
||||||
// that ExtensionUtils depends on.
|
// that ExtensionUtils depends on.
|
||||||
window.global = {
|
window.global = {
|
||||||
log() {
|
log(...args) {
|
||||||
print([].join.call(arguments, ', '));
|
print(args.join(', '));
|
||||||
},
|
},
|
||||||
|
|
||||||
logError(s) {
|
logError(s) {
|
||||||
log('ERROR: ' + s);
|
log(`ERROR: ${s}`);
|
||||||
},
|
},
|
||||||
|
|
||||||
userdatadir: GLib.build_filenamev([GLib.get_user_data_dir(), 'gnome-shell'])
|
userdatadir: GLib.build_filenamev([GLib.get_user_data_dir(), 'gnome-shell'])
|
||||||
@@ -378,6 +704,5 @@ function main(argv) {
|
|||||||
Gettext.bindtextdomain(Config.GETTEXT_PACKAGE, Config.LOCALEDIR);
|
Gettext.bindtextdomain(Config.GETTEXT_PACKAGE, Config.LOCALEDIR);
|
||||||
Gettext.textdomain(Config.GETTEXT_PACKAGE);
|
Gettext.textdomain(Config.GETTEXT_PACKAGE);
|
||||||
|
|
||||||
let app = new Application();
|
new Application().run(argv);
|
||||||
app.application.run(argv);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,24 +1,24 @@
|
|||||||
// -*- 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, Pango, Shell, St } = imports.gi;
|
||||||
const Gio = imports.gi.Gio;
|
|
||||||
const Pango = imports.gi.Pango;
|
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
const St = imports.gi.St;
|
|
||||||
|
|
||||||
const Animation = imports.ui.animation;
|
const Animation = imports.ui.animation;
|
||||||
const Batch = imports.gdm.batch;
|
const Batch = imports.gdm.batch;
|
||||||
const GdmUtil = imports.gdm.util;
|
const GdmUtil = imports.gdm.util;
|
||||||
const Params = imports.misc.params;
|
const Params = imports.misc.params;
|
||||||
const ShellEntry = imports.ui.shellEntry;
|
const ShellEntry = imports.ui.shellEntry;
|
||||||
const Tweener = imports.ui.tweener;
|
|
||||||
const UserWidget = imports.ui.userWidget;
|
const UserWidget = imports.ui.userWidget;
|
||||||
|
|
||||||
var DEFAULT_BUTTON_WELL_ICON_SIZE = 16;
|
var DEFAULT_BUTTON_WELL_ICON_SIZE = 16;
|
||||||
var DEFAULT_BUTTON_WELL_ANIMATION_DELAY = 1.0;
|
var DEFAULT_BUTTON_WELL_ANIMATION_DELAY = 1000;
|
||||||
var DEFAULT_BUTTON_WELL_ANIMATION_TIME = 0.3;
|
var DEFAULT_BUTTON_WELL_ANIMATION_TIME = 300;
|
||||||
|
|
||||||
var MESSAGE_FADE_OUT_ANIMATION_TIME = 0.5;
|
var MESSAGE_FADE_OUT_ANIMATION_TIME = 500;
|
||||||
|
|
||||||
|
const WIGGLE_OFFSET = 6;
|
||||||
|
const WIGGLE_DURATION = 65;
|
||||||
|
const N_WIGGLES = 3;
|
||||||
|
|
||||||
var AuthPromptMode = {
|
var AuthPromptMode = {
|
||||||
UNLOCK_ONLY: 0,
|
UNLOCK_ONLY: 0,
|
||||||
@@ -62,23 +62,23 @@ var AuthPrompt = class {
|
|||||||
this.smartcardDetected = this._userVerifier.smartcardDetected;
|
this.smartcardDetected = this._userVerifier.smartcardDetected;
|
||||||
|
|
||||||
this.connect('next', () => {
|
this.connect('next', () => {
|
||||||
this.updateSensitivity(false);
|
this.updateSensitivity(false);
|
||||||
this.startSpinning();
|
this.startSpinning();
|
||||||
if (this._queryingService) {
|
if (this._queryingService) {
|
||||||
this._userVerifier.answerQuery(this._queryingService, this._entry.text);
|
this._userVerifier.answerQuery(this._queryingService, this._entry.text);
|
||||||
} else {
|
} else {
|
||||||
this._preemptiveAnswer = this._entry.text;
|
this._preemptiveAnswer = this._entry.text;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
this.actor = new St.BoxLayout({ style_class: 'login-dialog-prompt-layout',
|
this.actor = new St.BoxLayout({ style_class: 'login-dialog-prompt-layout',
|
||||||
vertical: true });
|
vertical: true });
|
||||||
this.actor.connect('destroy', this._onDestroy.bind(this));
|
this.actor.connect('destroy', this._onDestroy.bind(this));
|
||||||
this.actor.connect('key-press-event', (actor, event) => {
|
this.actor.connect('key-press-event', (actor, event) => {
|
||||||
if (event.get_key_symbol() == Clutter.KEY_Escape)
|
if (event.get_key_symbol() == Clutter.KEY_Escape)
|
||||||
this.cancel();
|
this.cancel();
|
||||||
return Clutter.EVENT_PROPAGATE;
|
return Clutter.EVENT_PROPAGATE;
|
||||||
});
|
});
|
||||||
|
|
||||||
this._userWell = new St.Bin({ x_fill: true,
|
this._userWell = new St.Bin({ x_fill: true,
|
||||||
x_align: St.Align.START });
|
x_align: St.Align.START });
|
||||||
@@ -94,40 +94,14 @@ var AuthPrompt = class {
|
|||||||
x_fill: false,
|
x_fill: false,
|
||||||
y_fill: true,
|
y_fill: true,
|
||||||
x_align: St.Align.START });
|
x_align: St.Align.START });
|
||||||
this._entry = new St.Entry({ style_class: 'login-dialog-prompt-entry',
|
|
||||||
can_focus: true });
|
|
||||||
ShellEntry.addContextMenu(this._entry, { isPassword: true });
|
|
||||||
|
|
||||||
this.actor.add(this._entry,
|
this._initEntryRow();
|
||||||
{ expand: true,
|
|
||||||
x_fill: true,
|
|
||||||
y_fill: false,
|
|
||||||
x_align: St.Align.START });
|
|
||||||
|
|
||||||
this._entry.grab_key_focus();
|
|
||||||
|
|
||||||
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._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',
|
|
||||||
vertical: false });
|
|
||||||
this.actor.add(this._buttonBox,
|
|
||||||
{ expand: true,
|
|
||||||
x_align: St.Align.MIDDLE,
|
|
||||||
y_align: St.Align.END });
|
|
||||||
|
|
||||||
this._defaultButtonWell = new St.Widget({ layout_manager: new Clutter.BinLayout() });
|
|
||||||
this._defaultButtonWellActor = null;
|
|
||||||
|
|
||||||
this._initButtons();
|
|
||||||
|
|
||||||
this._spinner = new Animation.Spinner(DEFAULT_BUTTON_WELL_ICON_SIZE);
|
|
||||||
this._spinner.actor.opacity = 0;
|
|
||||||
this._spinner.actor.show();
|
|
||||||
this._defaultButtonWell.add_child(this._spinner.actor);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_onDestroy() {
|
_onDestroy() {
|
||||||
@@ -135,52 +109,47 @@ var AuthPrompt = class {
|
|||||||
this._userVerifier = null;
|
this._userVerifier = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
_initButtons() {
|
_initEntryRow() {
|
||||||
this.cancelButton = new St.Button({ style_class: 'modal-dialog-button button',
|
let mainBox = new St.BoxLayout({
|
||||||
button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE,
|
style_class: 'login-dialog-button-box',
|
||||||
reactive: true,
|
vertical: false,
|
||||||
can_focus: true,
|
});
|
||||||
label: _("Cancel") });
|
this.actor.add_child(mainBox);
|
||||||
this.cancelButton.connect('clicked', () => { this.cancel(); });
|
|
||||||
this._buttonBox.add(this.cancelButton,
|
|
||||||
{ expand: false,
|
|
||||||
x_fill: false,
|
|
||||||
y_fill: false,
|
|
||||||
x_align: St.Align.START,
|
|
||||||
y_align: St.Align.END });
|
|
||||||
|
|
||||||
this._buttonBox.add(this._defaultButtonWell,
|
this.cancelButton = new St.Button({
|
||||||
{ expand: true,
|
style_class: 'modal-dialog-button button cancel-button',
|
||||||
x_fill: false,
|
button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE,
|
||||||
y_fill: false,
|
reactive: true,
|
||||||
x_align: St.Align.END,
|
can_focus: true,
|
||||||
y_align: St.Align.MIDDLE });
|
child: new St.Icon({ icon_name: 'go-previous-symbolic' }),
|
||||||
this.nextButton = new St.Button({ style_class: 'modal-dialog-button button',
|
});
|
||||||
button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE,
|
this.cancelButton.connect('clicked', () => this.cancel());
|
||||||
reactive: true,
|
mainBox.add_child(this.cancelButton);
|
||||||
can_focus: true,
|
|
||||||
label: _("Next") });
|
|
||||||
this.nextButton.connect('clicked', () => { this.emit('next'); });
|
|
||||||
this.nextButton.add_style_pseudo_class('default');
|
|
||||||
this._buttonBox.add(this.nextButton,
|
|
||||||
{ expand: false,
|
|
||||||
x_fill: false,
|
|
||||||
y_fill: false,
|
|
||||||
x_align: St.Align.END,
|
|
||||||
y_align: St.Align.END });
|
|
||||||
|
|
||||||
this._updateNextButtonSensitivity(this._entry.text.length > 0);
|
this._entry = new St.Entry({
|
||||||
|
style_class: 'login-dialog-prompt-entry',
|
||||||
|
can_focus: true,
|
||||||
|
x_expand: true,
|
||||||
|
});
|
||||||
|
ShellEntry.addContextMenu(this._entry, { isPassword: true, actionMode: Shell.ActionMode.NONE });
|
||||||
|
|
||||||
|
mainBox.add_child(this._entry);
|
||||||
|
|
||||||
|
this._entry.grab_key_focus();
|
||||||
|
this._entry.clutter_text.connect('activate', () => this.emit('next'));
|
||||||
this._entry.clutter_text.connect('text-changed', () => {
|
this._entry.clutter_text.connect('text-changed', () => {
|
||||||
if (!this._userVerifier.hasPendingMessages)
|
if (!this._userVerifier.hasPendingMessages)
|
||||||
this._fadeOutMessage();
|
this._fadeOutMessage();
|
||||||
|
});
|
||||||
|
|
||||||
this._updateNextButtonSensitivity(this._entry.text.length > 0 || this.verificationStatus == AuthPromptStatus.VERIFYING);
|
this._defaultButtonWell = new St.Widget({ layout_manager: new Clutter.BinLayout() });
|
||||||
});
|
this._defaultButtonWellActor = null;
|
||||||
this._entry.clutter_text.connect('activate', () => {
|
mainBox.add_child(this._defaultButtonWell);
|
||||||
if (this.nextButton.reactive)
|
|
||||||
this.emit('next');
|
this._spinner = new Animation.Spinner(DEFAULT_BUTTON_WELL_ICON_SIZE);
|
||||||
});
|
this._spinner.actor.opacity = 0;
|
||||||
|
this._spinner.actor.show();
|
||||||
|
this._defaultButtonWell.add_child(this._spinner.actor);
|
||||||
}
|
}
|
||||||
|
|
||||||
_onAskQuestion(verifier, serviceName, question, passwordChar) {
|
_onAskQuestion(verifier, serviceName, question, passwordChar) {
|
||||||
@@ -195,16 +164,6 @@ var AuthPrompt = class {
|
|||||||
}
|
}
|
||||||
this.setPasswordChar(passwordChar);
|
this.setPasswordChar(passwordChar);
|
||||||
this.setQuestion(question);
|
this.setQuestion(question);
|
||||||
|
|
||||||
if (passwordChar) {
|
|
||||||
if (this._userVerifier.reauthenticating)
|
|
||||||
this.nextButton.label = _("Unlock");
|
|
||||||
else
|
|
||||||
this.nextButton.label = C_("button", "Sign In");
|
|
||||||
} else {
|
|
||||||
this.nextButton.label = _("Next");
|
|
||||||
}
|
|
||||||
|
|
||||||
this.updateSensitivity(true);
|
this.updateSensitivity(true);
|
||||||
this.emit('prompted');
|
this.emit('prompted');
|
||||||
}
|
}
|
||||||
@@ -245,6 +204,35 @@ var AuthPrompt = class {
|
|||||||
this.updateSensitivity(canRetry);
|
this.updateSensitivity(canRetry);
|
||||||
this.setActorInDefaultButtonWell(null);
|
this.setActorInDefaultButtonWell(null);
|
||||||
this.verificationStatus = AuthPromptStatus.VERIFICATION_FAILED;
|
this.verificationStatus = AuthPromptStatus.VERIFICATION_FAILED;
|
||||||
|
|
||||||
|
this._wiggle();
|
||||||
|
}
|
||||||
|
|
||||||
|
_wiggle() {
|
||||||
|
// Accelerate before wiggling
|
||||||
|
this._entry.ease({
|
||||||
|
translation_x: -WIGGLE_OFFSET,
|
||||||
|
duration: WIGGLE_DURATION,
|
||||||
|
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
|
||||||
|
onComplete: () => {
|
||||||
|
// Wiggle
|
||||||
|
this._entry.ease({
|
||||||
|
translation_x: WIGGLE_OFFSET,
|
||||||
|
duration: WIGGLE_DURATION,
|
||||||
|
mode: Clutter.AnimationMode.LINEAR,
|
||||||
|
repeat_count: N_WIGGLES,
|
||||||
|
auto_reverse: true,
|
||||||
|
onComplete: () => {
|
||||||
|
// Decelerate and return to the original position
|
||||||
|
this._entry.ease({
|
||||||
|
translation_x: 0,
|
||||||
|
duration: WIGGLE_DURATION,
|
||||||
|
mode: Clutter.AnimationMode.EASE_IN_QUAD,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
_onVerificationComplete() {
|
_onVerificationComplete() {
|
||||||
@@ -270,7 +258,7 @@ var AuthPrompt = class {
|
|||||||
let oldActor = this._defaultButtonWellActor;
|
let oldActor = this._defaultButtonWellActor;
|
||||||
|
|
||||||
if (oldActor)
|
if (oldActor)
|
||||||
Tweener.removeTweens(oldActor);
|
oldActor.remove_all_transitions();
|
||||||
|
|
||||||
let wasSpinner;
|
let wasSpinner;
|
||||||
if (oldActor == this._spinner.actor)
|
if (oldActor == this._spinner.actor)
|
||||||
@@ -293,19 +281,18 @@ var AuthPrompt = class {
|
|||||||
this._spinner.stop();
|
this._spinner.stop();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Tweener.addTween(oldActor,
|
oldActor.ease({
|
||||||
{ opacity: 0,
|
opacity: 0,
|
||||||
time: DEFAULT_BUTTON_WELL_ANIMATION_TIME,
|
duration: DEFAULT_BUTTON_WELL_ANIMATION_TIME,
|
||||||
delay: DEFAULT_BUTTON_WELL_ANIMATION_DELAY,
|
delay: DEFAULT_BUTTON_WELL_ANIMATION_DELAY,
|
||||||
transition: 'linear',
|
mode: Clutter.AnimationMode.LINEAR,
|
||||||
onCompleteScope: this,
|
onComplete: () => {
|
||||||
onComplete() {
|
if (wasSpinner) {
|
||||||
if (wasSpinner) {
|
if (this._spinner)
|
||||||
if (this._spinner)
|
this._spinner.stop();
|
||||||
this._spinner.stop();
|
}
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -316,11 +303,12 @@ var AuthPrompt = class {
|
|||||||
if (!animate)
|
if (!animate)
|
||||||
actor.opacity = 255;
|
actor.opacity = 255;
|
||||||
else
|
else
|
||||||
Tweener.addTween(actor,
|
actor.ease({
|
||||||
{ opacity: 255,
|
opacity: 255,
|
||||||
time: DEFAULT_BUTTON_WELL_ANIMATION_TIME,
|
duration: DEFAULT_BUTTON_WELL_ANIMATION_TIME,
|
||||||
delay: DEFAULT_BUTTON_WELL_ANIMATION_DELAY,
|
delay: DEFAULT_BUTTON_WELL_ANIMATION_DELAY,
|
||||||
transition: 'linear' });
|
mode: Clutter.AnimationMode.LINEAR
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
this._defaultButtonWellActor = actor;
|
this._defaultButtonWellActor = actor;
|
||||||
@@ -369,12 +357,12 @@ var AuthPrompt = class {
|
|||||||
_fadeOutMessage() {
|
_fadeOutMessage() {
|
||||||
if (this._message.opacity == 0)
|
if (this._message.opacity == 0)
|
||||||
return;
|
return;
|
||||||
Tweener.removeTweens(this._message);
|
this._message.remove_all_transitions();
|
||||||
Tweener.addTween(this._message,
|
this._message.ease({
|
||||||
{ opacity: 0,
|
opacity: 0,
|
||||||
time: MESSAGE_FADE_OUT_ANIMATION_TIME,
|
duration: MESSAGE_FADE_OUT_ANIMATION_TIME,
|
||||||
transition: 'easeOutQuad'
|
mode: Clutter.AnimationMode.EASE_OUT_QUAD
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
setMessage(message, type) {
|
setMessage(message, type) {
|
||||||
@@ -389,7 +377,7 @@ var AuthPrompt = class {
|
|||||||
this._message.remove_style_class_name('login-dialog-message-hint');
|
this._message.remove_style_class_name('login-dialog-message-hint');
|
||||||
|
|
||||||
if (message) {
|
if (message) {
|
||||||
Tweener.removeTweens(this._message);
|
this._message.remove_all_transitions();
|
||||||
this._message.text = message;
|
this._message.text = message;
|
||||||
this._message.opacity = 255;
|
this._message.opacity = 255;
|
||||||
} else {
|
} else {
|
||||||
@@ -397,13 +385,7 @@ var AuthPrompt = class {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_updateNextButtonSensitivity(sensitive) {
|
|
||||||
this.nextButton.reactive = sensitive;
|
|
||||||
this.nextButton.can_focus = sensitive;
|
|
||||||
}
|
|
||||||
|
|
||||||
updateSensitivity(sensitive) {
|
updateSensitivity(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;
|
||||||
}
|
}
|
||||||
@@ -434,7 +416,6 @@ var AuthPrompt = 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");
|
|
||||||
this._preemptiveAnswer = null;
|
this._preemptiveAnswer = null;
|
||||||
|
|
||||||
if (this._userVerifier)
|
if (this._userVerifier)
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
* In order for transformation animations to look good, they need to be
|
* 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,
|
* 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
|
* then shrink to close the void left over). Chaining animations in this way can
|
||||||
* be error-prone and wordy using just Tweener callbacks.
|
* be error-prone and wordy using just ease() callbacks.
|
||||||
*
|
*
|
||||||
* The classes in this file help with this:
|
* The classes in this file help with this:
|
||||||
*
|
*
|
||||||
@@ -44,6 +44,7 @@
|
|||||||
* replaced by something else.
|
* replaced by something else.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
const { GObject } = imports.gi;
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
|
|
||||||
var Task = class {
|
var Task = class {
|
||||||
@@ -124,7 +125,7 @@ var Batch = class extends Task {
|
|||||||
}
|
}
|
||||||
|
|
||||||
process() {
|
process() {
|
||||||
throw new Error('Not implemented');
|
throw new GObject.NotImplementedError(`process in ${this.constructor.name}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
runTask() {
|
runTask() {
|
||||||
@@ -176,36 +177,35 @@ Signals.addSignalMethods(Batch.prototype);
|
|||||||
|
|
||||||
var ConcurrentBatch = class extends Batch {
|
var ConcurrentBatch = class extends Batch {
|
||||||
process() {
|
process() {
|
||||||
let hold = this.runTask();
|
let hold = this.runTask();
|
||||||
|
|
||||||
if (hold) {
|
if (hold) {
|
||||||
this.hold.acquireUntilAfter(hold);
|
this.hold.acquireUntilAfter(hold);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Regardless of the state of the just run task,
|
// Regardless of the state of the just run task,
|
||||||
// fire off the next one, so all the tasks can run
|
// fire off the next one, so all the tasks can run
|
||||||
// concurrently.
|
// concurrently.
|
||||||
this.nextTask();
|
this.nextTask();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
Signals.addSignalMethods(ConcurrentBatch.prototype);
|
Signals.addSignalMethods(ConcurrentBatch.prototype);
|
||||||
|
|
||||||
var ConsecutiveBatch = class extends Batch {
|
var ConsecutiveBatch = class extends Batch {
|
||||||
process() {
|
process() {
|
||||||
let hold = this.runTask();
|
let hold = this.runTask();
|
||||||
|
|
||||||
if (hold && hold.isAcquired()) {
|
if (hold && hold.isAcquired()) {
|
||||||
// This task is inhibiting the batch. Wait on it
|
// This task is inhibiting the batch. Wait on it
|
||||||
// before processing the next one.
|
// before processing the next one.
|
||||||
let signalId = hold.connect('release', () => {
|
let signalId = hold.connect('release', () => {
|
||||||
hold.disconnect(signalId);
|
hold.disconnect(signalId);
|
||||||
this.nextTask();
|
this.nextTask();
|
||||||
});
|
});
|
||||||
return;
|
} else {
|
||||||
} else {
|
// This task finished, process the next one
|
||||||
// This task finished, process the next one
|
this.nextTask();
|
||||||
this.nextTask();
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
Signals.addSignalMethods(ConsecutiveBatch.prototype);
|
Signals.addSignalMethods(ConsecutiveBatch.prototype);
|
||||||
|
|||||||
@@ -1,8 +1,7 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
/* exported FprintManager */
|
||||||
|
|
||||||
const Gio = imports.gi.Gio;
|
const Gio = imports.gi.Gio;
|
||||||
const Shell = imports.gi.Shell;
|
|
||||||
const Signals = imports.signals;
|
|
||||||
|
|
||||||
const FprintManagerIface = `
|
const FprintManagerIface = `
|
||||||
<node>
|
<node>
|
||||||
@@ -25,8 +24,8 @@ function FprintManager() {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
self.init(null);
|
self.init(null);
|
||||||
} catch(e) {
|
} catch (e) {
|
||||||
log('Failed to connect to Fprint service: ' + e.message);
|
log(`Failed to connect to Fprint service: ${e.message}`);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
/* exported LoginDialog */
|
||||||
/*
|
/*
|
||||||
* Copyright 2011 Red Hat, Inc
|
* Copyright 2011 Red Hat, Inc
|
||||||
*
|
*
|
||||||
@@ -16,19 +17,9 @@
|
|||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const AccountsService = imports.gi.AccountsService;
|
const { AccountsService, Atk, Clutter, Gdm, Gio,
|
||||||
const Atk = imports.gi.Atk;
|
GLib, GObject, Meta, Pango, Shell, St } = imports.gi;
|
||||||
const Clutter = imports.gi.Clutter;
|
|
||||||
const Gdm = imports.gi.Gdm;
|
|
||||||
const Gio = imports.gi.Gio;
|
|
||||||
const GLib = imports.gi.GLib;
|
|
||||||
const GObject = imports.gi.GObject;
|
|
||||||
const Gtk = imports.gi.Gtk;
|
|
||||||
const Meta = imports.gi.Meta;
|
|
||||||
const Pango = imports.gi.Pango;
|
|
||||||
const Shell = imports.gi.Shell;
|
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
const St = imports.gi.St;
|
|
||||||
|
|
||||||
const AuthPrompt = imports.gdm.authPrompt;
|
const AuthPrompt = imports.gdm.authPrompt;
|
||||||
const Batch = imports.gdm.batch;
|
const Batch = imports.gdm.batch;
|
||||||
@@ -40,11 +31,10 @@ const LoginManager = imports.misc.loginManager;
|
|||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const PopupMenu = imports.ui.popupMenu;
|
const PopupMenu = imports.ui.popupMenu;
|
||||||
const Realmd = imports.gdm.realmd;
|
const Realmd = imports.gdm.realmd;
|
||||||
const Tweener = imports.ui.tweener;
|
|
||||||
const UserWidget = imports.ui.userWidget;
|
const UserWidget = imports.ui.userWidget;
|
||||||
|
|
||||||
const _FADE_ANIMATION_TIME = 0.25;
|
const _FADE_ANIMATION_TIME = 250;
|
||||||
const _SCROLL_ANIMATION_TIME = 0.5;
|
const _SCROLL_ANIMATION_TIME = 500;
|
||||||
const _TIMED_LOGIN_IDLE_THRESHOLD = 5.0;
|
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;
|
||||||
@@ -53,7 +43,7 @@ var UserListItem = class {
|
|||||||
constructor(user) {
|
constructor(user) {
|
||||||
this.user = user;
|
this.user = user;
|
||||||
this._userChangedId = this.user.connect('changed',
|
this._userChangedId = this.user.connect('changed',
|
||||||
this._onUserChanged.bind(this));
|
this._onUserChanged.bind(this));
|
||||||
|
|
||||||
let layout = new St.BoxLayout({ vertical: true });
|
let layout = new St.BoxLayout({ vertical: true });
|
||||||
this.actor = new St.Button({ style_class: 'login-dialog-user-list-item',
|
this.actor = new St.Button({ style_class: 'login-dialog-user-list-item',
|
||||||
@@ -160,9 +150,9 @@ Signals.addSignalMethods(UserListItem.prototype);
|
|||||||
|
|
||||||
var UserList = class {
|
var UserList = class {
|
||||||
constructor() {
|
constructor() {
|
||||||
this.actor = new St.ScrollView({ style_class: 'login-dialog-user-list-view'});
|
this.actor = new St.ScrollView({ style_class: 'login-dialog-user-list-view' });
|
||||||
this.actor.set_policy(Gtk.PolicyType.NEVER,
|
this.actor.set_policy(St.PolicyType.NEVER,
|
||||||
Gtk.PolicyType.AUTOMATIC);
|
St.PolicyType.AUTOMATIC);
|
||||||
|
|
||||||
this._box = new St.BoxLayout({ vertical: true,
|
this._box = new St.BoxLayout({ vertical: true,
|
||||||
style_class: 'login-dialog-user-list',
|
style_class: 'login-dialog-user-list',
|
||||||
@@ -183,7 +173,7 @@ var UserList = class {
|
|||||||
if (global.stage.get_key_focus() != this.actor)
|
if (global.stage.get_key_focus() != this.actor)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
let focusSet = this.actor.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
|
let focusSet = this.actor.navigate_focus(null, St.DirectionType.TAB_FORWARD, false);
|
||||||
if (!focusSet) {
|
if (!focusSet) {
|
||||||
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => {
|
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => {
|
||||||
this._moveFocusToItems();
|
this._moveFocusToItems();
|
||||||
@@ -197,8 +187,6 @@ var UserList = class {
|
|||||||
}
|
}
|
||||||
|
|
||||||
updateStyle(isExpanded) {
|
updateStyle(isExpanded) {
|
||||||
let tasks = [];
|
|
||||||
|
|
||||||
if (isExpanded)
|
if (isExpanded)
|
||||||
this._box.add_style_pseudo_class('expanded');
|
this._box.add_style_pseudo_class('expanded');
|
||||||
else
|
else
|
||||||
@@ -216,11 +204,10 @@ var UserList = class {
|
|||||||
let adjustment = this.actor.get_vscroll_bar().get_adjustment();
|
let adjustment = this.actor.get_vscroll_bar().get_adjustment();
|
||||||
|
|
||||||
let value = (box.y1 + adjustment.step_increment / 2.0) - (adjustment.page_size / 2.0);
|
let value = (box.y1 + adjustment.step_increment / 2.0) - (adjustment.page_size / 2.0);
|
||||||
Tweener.removeTweens(adjustment);
|
adjustment.ease(value, {
|
||||||
Tweener.addTween (adjustment,
|
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
|
||||||
{ value: value,
|
duration: _SCROLL_ANIMATION_TIME
|
||||||
time: _SCROLL_ANIMATION_TIME,
|
});
|
||||||
transition: 'easeOutQuad' });
|
|
||||||
}
|
}
|
||||||
|
|
||||||
jumpToItem(item) {
|
jumpToItem(item) {
|
||||||
@@ -254,7 +241,7 @@ var UserList = class {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
if (user.locked)
|
if (user.locked)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
let userName = user.get_user_name();
|
let userName = user.get_user_name();
|
||||||
|
|
||||||
@@ -271,7 +258,7 @@ var UserList = class {
|
|||||||
item.connect('activate', this._onItemActivated.bind(this));
|
item.connect('activate', this._onItemActivated.bind(this));
|
||||||
|
|
||||||
// Try to keep the focused item front-and-center
|
// Try to keep the focused item front-and-center
|
||||||
item.actor.connect('key-focus-in', () => { this.scrollToItem(item); });
|
item.actor.connect('key-focus-in', () => this.scrollToItem(item));
|
||||||
|
|
||||||
this._moveFocusToItems();
|
this._moveFocusToItems();
|
||||||
|
|
||||||
@@ -329,16 +316,17 @@ var SessionMenuButton = class {
|
|||||||
this._menu.actor.hide();
|
this._menu.actor.hide();
|
||||||
|
|
||||||
this._menu.connect('open-state-changed', (menu, isOpen) => {
|
this._menu.connect('open-state-changed', (menu, isOpen) => {
|
||||||
if (isOpen)
|
if (isOpen)
|
||||||
this._button.add_style_pseudo_class('active');
|
this._button.add_style_pseudo_class('active');
|
||||||
else
|
else
|
||||||
this._button.remove_style_pseudo_class('active');
|
this._button.remove_style_pseudo_class('active');
|
||||||
});
|
});
|
||||||
|
|
||||||
this._manager = new PopupMenu.PopupMenuManager({ actor: this._button });
|
this._manager = new PopupMenu.PopupMenuManager(this._button,
|
||||||
|
{ actionMode: Shell.ActionMode.NONE });
|
||||||
this._manager.addMenu(this._menu);
|
this._manager.addMenu(this._menu);
|
||||||
|
|
||||||
this._button.connect('clicked', () => { this._menu.toggle(); });
|
this._button.connect('clicked', () => this._menu.toggle());
|
||||||
|
|
||||||
this._items = {};
|
this._items = {};
|
||||||
this._activeSessionId = null;
|
this._activeSessionId = null;
|
||||||
@@ -362,11 +350,11 @@ var SessionMenuButton = class {
|
|||||||
}
|
}
|
||||||
|
|
||||||
setActiveSession(sessionId) {
|
setActiveSession(sessionId) {
|
||||||
if (sessionId == this._activeSessionId)
|
if (sessionId == this._activeSessionId)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
this._activeSessionId = sessionId;
|
this._activeSessionId = sessionId;
|
||||||
this._updateOrnament();
|
this._updateOrnament();
|
||||||
}
|
}
|
||||||
|
|
||||||
close() {
|
close() {
|
||||||
@@ -383,7 +371,7 @@ var SessionMenuButton = class {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (let i = 0; i < ids.length; i++) {
|
for (let i = 0; i < ids.length; i++) {
|
||||||
let [sessionName, sessionDescription] = Gdm.get_session_name_and_description(ids[i]);
|
let [sessionName, sessionDescription_] = Gdm.get_session_name_and_description(ids[i]);
|
||||||
|
|
||||||
let id = ids[i];
|
let id = ids[i];
|
||||||
let item = new PopupMenu.PopupMenuItem(sessionName);
|
let item = new PopupMenu.PopupMenuItem(sessionName);
|
||||||
@@ -412,18 +400,18 @@ var LoginDialog = GObject.registerClass({
|
|||||||
this.connect('destroy', this._onDestroy.bind(this));
|
this.connect('destroy', this._onDestroy.bind(this));
|
||||||
parentActor.add_child(this);
|
parentActor.add_child(this);
|
||||||
|
|
||||||
this._userManager = AccountsService.UserManager.get_default()
|
this._userManager = AccountsService.UserManager.get_default();
|
||||||
this._gdmClient = new Gdm.Client();
|
this._gdmClient = new Gdm.Client();
|
||||||
|
|
||||||
this._settings = new Gio.Settings({ schema_id: GdmUtil.LOGIN_SCREEN_SCHEMA });
|
this._settings = new Gio.Settings({ schema_id: GdmUtil.LOGIN_SCREEN_SCHEMA });
|
||||||
|
|
||||||
this._settings.connect('changed::' + GdmUtil.BANNER_MESSAGE_KEY,
|
this._settings.connect(`changed::${GdmUtil.BANNER_MESSAGE_KEY}`,
|
||||||
this._updateBanner.bind(this));
|
this._updateBanner.bind(this));
|
||||||
this._settings.connect('changed::' + GdmUtil.BANNER_MESSAGE_TEXT_KEY,
|
this._settings.connect(`changed::${GdmUtil.BANNER_MESSAGE_TEXT_KEY}`,
|
||||||
this._updateBanner.bind(this));
|
this._updateBanner.bind(this));
|
||||||
this._settings.connect('changed::' + GdmUtil.DISABLE_USER_LIST_KEY,
|
this._settings.connect(`changed::${GdmUtil.DISABLE_USER_LIST_KEY}`,
|
||||||
this._updateDisableUserList.bind(this));
|
this._updateDisableUserList.bind(this));
|
||||||
this._settings.connect('changed::' + GdmUtil.LOGO_KEY,
|
this._settings.connect(`changed::${GdmUtil.LOGO_KEY}`,
|
||||||
this._updateLogo.bind(this));
|
this._updateLogo.bind(this));
|
||||||
|
|
||||||
this._textureCache = St.TextureCache.get_default();
|
this._textureCache = St.TextureCache.get_default();
|
||||||
@@ -473,8 +461,8 @@ var LoginDialog = GObject.registerClass({
|
|||||||
|
|
||||||
this._bannerView = new St.ScrollView({ style_class: 'login-dialog-banner-view',
|
this._bannerView = new St.ScrollView({ style_class: 'login-dialog-banner-view',
|
||||||
opacity: 0,
|
opacity: 0,
|
||||||
vscrollbar_policy: Gtk.PolicyType.AUTOMATIC,
|
vscrollbar_policy: St.PolicyType.AUTOMATIC,
|
||||||
hscrollbar_policy: Gtk.PolicyType.NEVER });
|
hscrollbar_policy: St.PolicyType.NEVER });
|
||||||
this.add_child(this._bannerView);
|
this.add_child(this._bannerView);
|
||||||
|
|
||||||
let bannerBox = new St.BoxLayout({ vertical: true });
|
let bannerBox = new St.BoxLayout({ vertical: true });
|
||||||
@@ -490,6 +478,9 @@ var LoginDialog = GObject.registerClass({
|
|||||||
this._logoBin = new St.Widget({ style_class: 'login-dialog-logo-bin',
|
this._logoBin = new St.Widget({ style_class: 'login-dialog-logo-bin',
|
||||||
x_align: Clutter.ActorAlign.CENTER,
|
x_align: Clutter.ActorAlign.CENTER,
|
||||||
y_align: Clutter.ActorAlign.END });
|
y_align: Clutter.ActorAlign.END });
|
||||||
|
this._logoBin.connect('resource-scale-changed', () => {
|
||||||
|
this._updateLogoTexture(this._textureCache, this._logoFile);
|
||||||
|
});
|
||||||
this.add_child(this._logoBin);
|
this.add_child(this._logoBin);
|
||||||
this._updateLogo();
|
this._updateLogo();
|
||||||
|
|
||||||
@@ -526,7 +517,7 @@ var LoginDialog = GObject.registerClass({
|
|||||||
_getBannerAllocation(dialogBox) {
|
_getBannerAllocation(dialogBox) {
|
||||||
let actorBox = new Clutter.ActorBox();
|
let actorBox = new Clutter.ActorBox();
|
||||||
|
|
||||||
let [minWidth, minHeight, natWidth, natHeight] = this._bannerView.get_preferred_size();
|
let [, , natWidth, natHeight] = this._bannerView.get_preferred_size();
|
||||||
let centerX = dialogBox.x1 + (dialogBox.x2 - dialogBox.x1) / 2;
|
let centerX = dialogBox.x1 + (dialogBox.x2 - dialogBox.x1) / 2;
|
||||||
|
|
||||||
actorBox.x1 = Math.floor(centerX - natWidth / 2);
|
actorBox.x1 = Math.floor(centerX - natWidth / 2);
|
||||||
@@ -540,7 +531,7 @@ var LoginDialog = GObject.registerClass({
|
|||||||
_getLogoBinAllocation(dialogBox) {
|
_getLogoBinAllocation(dialogBox) {
|
||||||
let actorBox = new Clutter.ActorBox();
|
let actorBox = new Clutter.ActorBox();
|
||||||
|
|
||||||
let [minWidth, minHeight, natWidth, natHeight] = this._logoBin.get_preferred_size();
|
let [, , natWidth, natHeight] = this._logoBin.get_preferred_size();
|
||||||
let centerX = dialogBox.x1 + (dialogBox.x2 - dialogBox.x1) / 2;
|
let centerX = dialogBox.x1 + (dialogBox.x2 - dialogBox.x1) / 2;
|
||||||
|
|
||||||
actorBox.x1 = Math.floor(centerX - natWidth / 2);
|
actorBox.x1 = Math.floor(centerX - natWidth / 2);
|
||||||
@@ -554,7 +545,7 @@ var LoginDialog = GObject.registerClass({
|
|||||||
_getCenterActorAllocation(dialogBox, actor) {
|
_getCenterActorAllocation(dialogBox, actor) {
|
||||||
let actorBox = new Clutter.ActorBox();
|
let actorBox = new Clutter.ActorBox();
|
||||||
|
|
||||||
let [minWidth, minHeight, natWidth, natHeight] = actor.get_preferred_size();
|
let [, , natWidth, natHeight] = actor.get_preferred_size();
|
||||||
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;
|
||||||
|
|
||||||
@@ -581,19 +572,15 @@ var LoginDialog = GObject.registerClass({
|
|||||||
// First find out what space the children require
|
// First find out what space the children require
|
||||||
let bannerAllocation = null;
|
let bannerAllocation = null;
|
||||||
let bannerHeight = 0;
|
let bannerHeight = 0;
|
||||||
let bannerWidth = 0;
|
|
||||||
if (this._bannerView.visible) {
|
if (this._bannerView.visible) {
|
||||||
bannerAllocation = this._getBannerAllocation(dialogBox, this._bannerView);
|
bannerAllocation = this._getBannerAllocation(dialogBox, this._bannerView);
|
||||||
bannerHeight = bannerAllocation.y2 - bannerAllocation.y1;
|
bannerHeight = bannerAllocation.y2 - bannerAllocation.y1;
|
||||||
bannerWidth = bannerAllocation.x2 - bannerAllocation.x1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let authPromptAllocation = null;
|
let authPromptAllocation = null;
|
||||||
let authPromptHeight = 0;
|
|
||||||
let authPromptWidth = 0;
|
let authPromptWidth = 0;
|
||||||
if (this._authPrompt.actor.visible) {
|
if (this._authPrompt.actor.visible) {
|
||||||
authPromptAllocation = this._getCenterActorAllocation(dialogBox, this._authPrompt.actor);
|
authPromptAllocation = this._getCenterActorAllocation(dialogBox, this._authPrompt.actor);
|
||||||
authPromptHeight = authPromptAllocation.y2 - authPromptAllocation.y1;
|
|
||||||
authPromptWidth = authPromptAllocation.x2 - authPromptAllocation.x1;
|
authPromptWidth = authPromptAllocation.x2 - authPromptAllocation.x1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -625,64 +612,64 @@ var LoginDialog = GObject.registerClass({
|
|||||||
let leftOverYSpace = bannerSpace - bannerHeight;
|
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
|
||||||
let leftOverTopSpace = leftOverYSpace / 2;
|
let leftOverTopSpace = leftOverYSpace / 2;
|
||||||
|
|
||||||
// Then, shift the banner into the middle of that extra space
|
// Then, shift the banner into the middle of that extra space
|
||||||
let yShift = Math.floor(leftOverTopSpace / 2);
|
let yShift = Math.floor(leftOverTopSpace / 2);
|
||||||
|
|
||||||
bannerAllocation.y1 += yShift;
|
bannerAllocation.y1 += yShift;
|
||||||
bannerAllocation.y2 += yShift;
|
bannerAllocation.y2 += yShift;
|
||||||
} else {
|
} else {
|
||||||
// Then figure out how much space there would be if we switched to a
|
// Then figure out how much space there would be if we switched to a
|
||||||
// wide layout with banner on one side and authprompt on the other.
|
// wide layout with banner on one side and authprompt on the other.
|
||||||
let leftOverXSpace = dialogWidth - authPromptWidth;
|
let leftOverXSpace = dialogWidth - authPromptWidth;
|
||||||
|
|
||||||
// In a wide view, half of the available space goes to the banner,
|
// In a wide view, half of the available space goes to the banner,
|
||||||
// and the other half goes to the margins.
|
// and the other half goes to the margins.
|
||||||
let wideBannerWidth = leftOverXSpace / 2;
|
let wideBannerWidth = leftOverXSpace / 2;
|
||||||
let wideSpacing = leftOverXSpace - wideBannerWidth;
|
let wideSpacing = leftOverXSpace - wideBannerWidth;
|
||||||
|
|
||||||
// If we do go with a wide layout, we need there to be at least enough
|
// If we do go with a wide layout, we need there to be at least enough
|
||||||
// space for the banner and the auth prompt to be the same width,
|
// space for the banner and the auth prompt to be the same width,
|
||||||
// so it doesn't look unbalanced.
|
// so it doesn't look unbalanced.
|
||||||
if (authPromptWidth > 0 && wideBannerWidth > authPromptWidth) {
|
if (authPromptWidth > 0 && wideBannerWidth > authPromptWidth) {
|
||||||
let centerX = dialogBox.x1 + dialogWidth / 2;
|
let centerX = dialogBox.x1 + dialogWidth / 2;
|
||||||
let centerY = dialogBox.y1 + dialogHeight / 2;
|
let centerY = dialogBox.y1 + dialogHeight / 2;
|
||||||
|
|
||||||
// A small portion of the spacing goes down the center of the
|
// A small portion of the spacing goes down the center of the
|
||||||
// screen to help delimit the two columns of the wide view
|
// screen to help delimit the two columns of the wide view
|
||||||
let centerGap = wideSpacing / 8;
|
let centerGap = wideSpacing / 8;
|
||||||
|
|
||||||
// place the banner along the left edge of the center margin
|
// place the banner along the left edge of the center margin
|
||||||
bannerAllocation.x2 = Math.floor(centerX - centerGap / 2);
|
bannerAllocation.x2 = Math.floor(centerX - centerGap / 2);
|
||||||
bannerAllocation.x1 = Math.floor(bannerAllocation.x2 - wideBannerWidth);
|
bannerAllocation.x1 = Math.floor(bannerAllocation.x2 - wideBannerWidth);
|
||||||
|
|
||||||
// figure out how tall it would like to be and try to accomodate
|
// figure out how tall it would like to be and try to accommodate
|
||||||
// but don't let it get too close to the logo
|
// but don't let it get too close to the logo
|
||||||
let [wideMinHeight, wideBannerHeight] = this._bannerView.get_preferred_height(wideBannerWidth);
|
let [, wideBannerHeight] = this._bannerView.get_preferred_height(wideBannerWidth);
|
||||||
|
|
||||||
let maxWideHeight = dialogHeight - 3 * logoHeight;
|
let maxWideHeight = dialogHeight - 3 * logoHeight;
|
||||||
wideBannerHeight = Math.min(maxWideHeight, wideBannerHeight);
|
wideBannerHeight = Math.min(maxWideHeight, wideBannerHeight);
|
||||||
bannerAllocation.y1 = Math.floor(centerY - wideBannerHeight / 2);
|
bannerAllocation.y1 = Math.floor(centerY - wideBannerHeight / 2);
|
||||||
bannerAllocation.y2 = bannerAllocation.y1 + wideBannerHeight;
|
bannerAllocation.y2 = bannerAllocation.y1 + wideBannerHeight;
|
||||||
|
|
||||||
// place the auth prompt along the right edge of the center margin
|
// place the auth prompt along the right edge of the center margin
|
||||||
authPromptAllocation.x1 = Math.floor(centerX + centerGap / 2);
|
authPromptAllocation.x1 = Math.floor(centerX + centerGap / 2);
|
||||||
authPromptAllocation.x2 = authPromptAllocation.x1 + authPromptWidth;
|
authPromptAllocation.x2 = authPromptAllocation.x1 + authPromptWidth;
|
||||||
} else {
|
} else {
|
||||||
// If we aren't going to do a wide view, then we need to limit
|
// If we aren't going to do a wide view, then we need to limit
|
||||||
// the height of the banner so it will present scrollbars
|
// the height of the banner so it will present scrollbars
|
||||||
|
|
||||||
// First figure out how much space there is without the banner
|
// First figure out how much space there is without the banner
|
||||||
leftOverYSpace += bannerHeight;
|
leftOverYSpace += bannerHeight;
|
||||||
|
|
||||||
// Then figure out how much of that space is up top
|
// Then figure out how much of that space is up top
|
||||||
let availableTopSpace = Math.floor(leftOverYSpace / 2);
|
let availableTopSpace = Math.floor(leftOverYSpace / 2);
|
||||||
|
|
||||||
// Then give all of that space to the banner
|
// Then give all of that space to the banner
|
||||||
bannerAllocation.y2 = bannerAllocation.y1 + availableTopSpace;
|
bannerAllocation.y2 = bannerAllocation.y1 + availableTopSpace;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (userSelectionAllocation) {
|
} else if (userSelectionAllocation) {
|
||||||
// Grow the user list to fill the space
|
// Grow the user list to fill the space
|
||||||
@@ -770,14 +757,15 @@ var LoginDialog = GObject.registerClass({
|
|||||||
|
|
||||||
_fadeInBannerView() {
|
_fadeInBannerView() {
|
||||||
this._bannerView.show();
|
this._bannerView.show();
|
||||||
Tweener.addTween(this._bannerView,
|
this._bannerView.ease({
|
||||||
{ opacity: 255,
|
opacity: 255,
|
||||||
time: _FADE_ANIMATION_TIME,
|
duration: _FADE_ANIMATION_TIME,
|
||||||
transition: 'easeOutQuad' });
|
mode: Clutter.AnimationMode.EASE_OUT_QUAD
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
_hideBannerView() {
|
_hideBannerView() {
|
||||||
Tweener.removeTweens(this._bannerView);
|
this._bannerView.remove_all_transitions();
|
||||||
this._bannerView.opacity = 0;
|
this._bannerView.opacity = 0;
|
||||||
this._bannerView.hide();
|
this._bannerView.hide();
|
||||||
}
|
}
|
||||||
@@ -787,11 +775,12 @@ var LoginDialog = GObject.registerClass({
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
this._logoBin.destroy_all_children();
|
this._logoBin.destroy_all_children();
|
||||||
if (this._logoFile) {
|
if (this._logoFile && this._logoBin.resource_scale > 0) {
|
||||||
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
||||||
this._logoBin.add_child(this._textureCache.load_file_async(this._logoFile,
|
this._logoBin.add_child(this._textureCache.load_file_async(this._logoFile,
|
||||||
-1, _LOGO_ICON_HEIGHT,
|
-1, _LOGO_ICON_HEIGHT,
|
||||||
scaleFactor));
|
scaleFactor,
|
||||||
|
this._logoBin.resource_scale));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -856,10 +845,10 @@ var LoginDialog = GObject.registerClass({
|
|||||||
_shouldShowSessionMenuButton() {
|
_shouldShowSessionMenuButton() {
|
||||||
if (this._authPrompt.verificationStatus != AuthPrompt.AuthPromptStatus.VERIFYING &&
|
if (this._authPrompt.verificationStatus != AuthPrompt.AuthPromptStatus.VERIFYING &&
|
||||||
this._authPrompt.verificationStatus != AuthPrompt.AuthPromptStatus.VERIFICATION_FAILED)
|
this._authPrompt.verificationStatus != AuthPrompt.AuthPromptStatus.VERIFICATION_FAILED)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (this._user && this._user.is_loaded && this._user.is_logged_in())
|
if (this._user && this._user.is_loaded && this._user.is_logged_in())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -869,10 +858,11 @@ var LoginDialog = GObject.registerClass({
|
|||||||
return;
|
return;
|
||||||
this._authPrompt.actor.opacity = 0;
|
this._authPrompt.actor.opacity = 0;
|
||||||
this._authPrompt.actor.show();
|
this._authPrompt.actor.show();
|
||||||
Tweener.addTween(this._authPrompt.actor,
|
this._authPrompt.actor.ease({
|
||||||
{ opacity: 255,
|
opacity: 255,
|
||||||
time: _FADE_ANIMATION_TIME,
|
duration: _FADE_ANIMATION_TIME,
|
||||||
transition: 'easeOutQuad' });
|
mode: Clutter.AnimationMode.EASE_OUT_QUAD
|
||||||
|
});
|
||||||
this._fadeInBannerView();
|
this._fadeInBannerView();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -916,28 +906,31 @@ var LoginDialog = GObject.registerClass({
|
|||||||
this._showPrompt();
|
this._showPrompt();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_bindOpacity() {
|
||||||
|
this._bindings = Main.layoutManager.uiGroup.get_children()
|
||||||
|
.filter(c => c != Main.layoutManager.screenShieldGroup)
|
||||||
|
.map(c => this.bind_property('opacity', c, 'opacity', 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
_unbindOpacity() {
|
||||||
|
this._bindings.forEach(b => b.unbind());
|
||||||
|
}
|
||||||
|
|
||||||
_loginScreenSessionActivated() {
|
_loginScreenSessionActivated() {
|
||||||
if (this.opacity == 255 && this._authPrompt.verificationStatus == AuthPrompt.AuthPromptStatus.NOT_VERIFYING)
|
if (this.opacity == 255 && this._authPrompt.verificationStatus == AuthPrompt.AuthPromptStatus.NOT_VERIFYING)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Tweener.addTween(this,
|
this._bindOpacity();
|
||||||
{ opacity: 255,
|
this.ease({
|
||||||
time: _FADE_ANIMATION_TIME,
|
opacity: 255,
|
||||||
transition: 'easeOutQuad',
|
duration: _FADE_ANIMATION_TIME,
|
||||||
onUpdate() {
|
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
|
||||||
let children = Main.layoutManager.uiGroup.get_children();
|
onComplete: () => {
|
||||||
|
if (this._authPrompt.verificationStatus != AuthPrompt.AuthPromptStatus.NOT_VERIFYING)
|
||||||
for (let i = 0; i < children.length; i++) {
|
this._authPrompt.reset();
|
||||||
if (children[i] != Main.layoutManager.screenShieldGroup)
|
this._unbindOpacity();
|
||||||
children[i].opacity = this.opacity;
|
}
|
||||||
}
|
});
|
||||||
},
|
|
||||||
onUpdateScope: this,
|
|
||||||
onComplete() {
|
|
||||||
if (this._authPrompt.verificationStatus != AuthPrompt.AuthPromptStatus.NOT_VERIFYING)
|
|
||||||
this._authPrompt.reset();
|
|
||||||
},
|
|
||||||
onCompleteScope: this });
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_gotGreeterSessionProxy(proxy) {
|
_gotGreeterSessionProxy(proxy) {
|
||||||
@@ -950,34 +943,27 @@ var LoginDialog = GObject.registerClass({
|
|||||||
}
|
}
|
||||||
|
|
||||||
_startSession(serviceName) {
|
_startSession(serviceName) {
|
||||||
Tweener.addTween(this,
|
this._bindOpacity();
|
||||||
{ opacity: 0,
|
this.ease({
|
||||||
time: _FADE_ANIMATION_TIME,
|
opacity: 0,
|
||||||
transition: 'easeOutQuad',
|
duration: _FADE_ANIMATION_TIME,
|
||||||
onUpdate() {
|
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
|
||||||
let children = Main.layoutManager.uiGroup.get_children();
|
onComplete: () => {
|
||||||
|
this._greeter.call_start_session_when_ready_sync(serviceName, true, null);
|
||||||
for (let i = 0; i < children.length; i++) {
|
this._unbindOpacity();
|
||||||
if (children[i] != Main.layoutManager.screenShieldGroup)
|
}
|
||||||
children[i].opacity = this.opacity;
|
});
|
||||||
}
|
|
||||||
},
|
|
||||||
onUpdateScope: this,
|
|
||||||
onComplete() {
|
|
||||||
this._greeter.call_start_session_when_ready_sync(serviceName, true, null);
|
|
||||||
},
|
|
||||||
onCompleteScope: this });
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_onSessionOpened(client, serviceName) {
|
_onSessionOpened(client, serviceName) {
|
||||||
this._authPrompt.finish(() => { this._startSession(serviceName); });
|
this._authPrompt.finish(() => this._startSession(serviceName));
|
||||||
}
|
}
|
||||||
|
|
||||||
_waitForItemForUser(userName) {
|
_waitForItemForUser(userName) {
|
||||||
let item = this._userList.getItemFromUserName(userName);
|
let item = this._userList.getItemFromUserName(userName);
|
||||||
|
|
||||||
if (item)
|
if (item)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
let hold = new Batch.Hold();
|
let hold = new Batch.Hold();
|
||||||
let signalId = this._userList.connect('item-added',
|
let signalId = this._userList.connect('item-added',
|
||||||
@@ -988,7 +974,7 @@ var LoginDialog = GObject.registerClass({
|
|||||||
hold.release();
|
hold.release();
|
||||||
});
|
});
|
||||||
|
|
||||||
hold.connect('release', () => { this._userList.disconnect(signalId); });
|
hold.connect('release', () => this._userList.disconnect(signalId));
|
||||||
|
|
||||||
return hold;
|
return hold;
|
||||||
}
|
}
|
||||||
@@ -1052,6 +1038,7 @@ var LoginDialog = GObject.registerClass({
|
|||||||
return this._blockTimedLoginUntilIdle();
|
return this._blockTimedLoginUntilIdle();
|
||||||
} else {
|
} else {
|
||||||
animationTime = delay;
|
animationTime = delay;
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -1087,12 +1074,12 @@ var LoginDialog = GObject.registerClass({
|
|||||||
|
|
||||||
// Restart timed login on user interaction
|
// Restart timed login on user interaction
|
||||||
global.stage.connect('captured-event', (actor, event) => {
|
global.stage.connect('captured-event', (actor, event) => {
|
||||||
if (event.type() == Clutter.EventType.KEY_PRESS ||
|
if (event.type() == Clutter.EventType.KEY_PRESS ||
|
||||||
event.type() == Clutter.EventType.BUTTON_PRESS) {
|
event.type() == Clutter.EventType.BUTTON_PRESS) {
|
||||||
this._startTimedLogin(userName, seconds);
|
this._startTimedLogin(userName, seconds);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Clutter.EVENT_PROPAGATE;
|
return Clutter.EVENT_PROPAGATE;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1238,10 +1225,11 @@ var LoginDialog = GObject.registerClass({
|
|||||||
|
|
||||||
Main.pushModal(this, { actionMode: Shell.ActionMode.LOGIN_SCREEN });
|
Main.pushModal(this, { actionMode: Shell.ActionMode.LOGIN_SCREEN });
|
||||||
|
|
||||||
Tweener.addTween(this,
|
this.ease({
|
||||||
{ opacity: 255,
|
opacity: 255,
|
||||||
time: 1,
|
duration: 1000,
|
||||||
transition: 'easeInQuad' });
|
mode: Clutter.AnimationMode.EASE_IN_QUAD
|
||||||
|
});
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -1255,7 +1243,7 @@ var LoginDialog = GObject.registerClass({
|
|||||||
this._authPrompt.cancel();
|
this._authPrompt.cancel();
|
||||||
}
|
}
|
||||||
|
|
||||||
addCharacter(unichar) {
|
addCharacter(_unichar) {
|
||||||
// Don't allow type ahead at the login screen
|
// Don't allow type ahead at the login screen
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
/* exported getOVirtCredentialsManager */
|
||||||
|
|
||||||
const Gio = imports.gi.Gio;
|
const Gio = imports.gi.Gio;
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
|
||||||
const Gio = imports.gi.Gio;
|
const Gio = imports.gi.Gio;
|
||||||
const Shell = imports.gi.Shell;
|
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
|
|
||||||
const { loadInterfaceXML } = imports.misc.fileUtils;
|
const { loadInterfaceXML } = imports.misc.fileUtils;
|
||||||
@@ -16,12 +15,13 @@ const RealmIface = loadInterfaceXML("org.freedesktop.realmd.Realm");
|
|||||||
const Realm = Gio.DBusProxy.makeProxyWrapper(RealmIface);
|
const Realm = Gio.DBusProxy.makeProxyWrapper(RealmIface);
|
||||||
|
|
||||||
var Manager = class {
|
var Manager = class {
|
||||||
constructor(parentActor) {
|
constructor() {
|
||||||
this._aggregateProvider = Provider(Gio.DBus.system,
|
this._aggregateProvider = Provider(Gio.DBus.system,
|
||||||
'org.freedesktop.realmd',
|
'org.freedesktop.realmd',
|
||||||
'/org/freedesktop/realmd',
|
'/org/freedesktop/realmd',
|
||||||
this._reloadRealms.bind(this))
|
this._reloadRealms.bind(this));
|
||||||
this._realms = {};
|
this._realms = {};
|
||||||
|
this._loginFormat = null;
|
||||||
|
|
||||||
this._signalId = this._aggregateProvider.connect('g-properties-changed',
|
this._signalId = this._aggregateProvider.connect('g-properties-changed',
|
||||||
(proxy, properties) => {
|
(proxy, properties) => {
|
||||||
@@ -37,10 +37,10 @@ var Manager = class {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
for (let i = 0; i < realmPaths.length; i++) {
|
for (let i = 0; i < realmPaths.length; i++) {
|
||||||
let realm = Realm(Gio.DBus.system,
|
Realm(Gio.DBus.system,
|
||||||
'org.freedesktop.realmd',
|
'org.freedesktop.realmd',
|
||||||
realmPaths[i],
|
realmPaths[i],
|
||||||
this._onRealmLoaded.bind(this));
|
this._onRealmLoaded.bind(this));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -87,7 +87,7 @@ var Manager = class {
|
|||||||
}
|
}
|
||||||
|
|
||||||
get loginFormat() {
|
get loginFormat() {
|
||||||
if (this._loginFormat !== undefined)
|
if (this._loginFormat)
|
||||||
return this._loginFormat;
|
return this._loginFormat;
|
||||||
|
|
||||||
this._updateLoginFormat();
|
this._updateLoginFormat();
|
||||||
@@ -99,10 +99,10 @@ var Manager = class {
|
|||||||
Service(Gio.DBus.system,
|
Service(Gio.DBus.system,
|
||||||
'org.freedesktop.realmd',
|
'org.freedesktop.realmd',
|
||||||
'/org/freedesktop/realmd',
|
'/org/freedesktop/realmd',
|
||||||
service => { service.ReleaseRemote(); });
|
service => service.ReleaseRemote());
|
||||||
this._aggregateProvider.disconnect(this._signalId);
|
this._aggregateProvider.disconnect(this._signalId);
|
||||||
this._realms = { };
|
this._realms = { };
|
||||||
this._updateLoginFormat();
|
this._updateLoginFormat();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
Signals.addSignalMethods(Manager.prototype)
|
Signals.addSignalMethods(Manager.prototype);
|
||||||
|
|||||||
133
js/gdm/util.js
@@ -1,27 +1,23 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
/* exported BANNER_MESSAGE_KEY, BANNER_MESSAGE_TEXT_KEY, LOGO_KEY,
|
||||||
|
DISABLE_USER_LIST_KEY, fadeInActor, fadeOutActor, cloneAndFadeOutActor */
|
||||||
|
|
||||||
const Clutter = imports.gi.Clutter;
|
const { Clutter, Gio, GLib } = imports.gi;
|
||||||
const Gio = imports.gi.Gio;
|
|
||||||
const GLib = imports.gi.GLib;
|
|
||||||
const Mainloop = imports.mainloop;
|
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
const St = imports.gi.St;
|
|
||||||
|
|
||||||
const Batch = imports.gdm.batch;
|
const Batch = imports.gdm.batch;
|
||||||
const Fprint = imports.gdm.fingerprint;
|
const Fprint = imports.gdm.fingerprint;
|
||||||
const OVirt = imports.gdm.oVirt;
|
const OVirt = imports.gdm.oVirt;
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const Params = imports.misc.params;
|
const Params = imports.misc.params;
|
||||||
const ShellEntry = imports.ui.shellEntry;
|
|
||||||
const SmartcardManager = imports.misc.smartcardManager;
|
const SmartcardManager = imports.misc.smartcardManager;
|
||||||
const Tweener = imports.ui.tweener;
|
|
||||||
|
|
||||||
var PASSWORD_SERVICE_NAME = 'gdm-password';
|
var PASSWORD_SERVICE_NAME = 'gdm-password';
|
||||||
var FINGERPRINT_SERVICE_NAME = 'gdm-fingerprint';
|
var FINGERPRINT_SERVICE_NAME = 'gdm-fingerprint';
|
||||||
var SMARTCARD_SERVICE_NAME = 'gdm-smartcard';
|
var SMARTCARD_SERVICE_NAME = 'gdm-smartcard';
|
||||||
var OVIRT_SERVICE_NAME = 'gdm-ovirtcred';
|
var OVIRT_SERVICE_NAME = 'gdm-ovirtcred';
|
||||||
var FADE_ANIMATION_TIME = 0.16;
|
var FADE_ANIMATION_TIME = 160;
|
||||||
var CLONE_FADE_ANIMATION_TIME = 0.25;
|
var CLONE_FADE_ANIMATION_TIME = 250;
|
||||||
|
|
||||||
var LOGIN_SCREEN_SCHEMA = 'org.gnome.login-screen';
|
var LOGIN_SCREEN_SCHEMA = 'org.gnome.login-screen';
|
||||||
var PASSWORD_AUTHENTICATION_KEY = 'enable-password-authentication';
|
var PASSWORD_AUTHENTICATION_KEY = 'enable-password-authentication';
|
||||||
@@ -35,7 +31,7 @@ var LOGO_KEY = 'logo';
|
|||||||
var 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
|
||||||
var USER_READ_TIME = 48
|
var USER_READ_TIME = 48;
|
||||||
|
|
||||||
var MessageType = {
|
var MessageType = {
|
||||||
NONE: 0,
|
NONE: 0,
|
||||||
@@ -50,20 +46,20 @@ function fadeInActor(actor) {
|
|||||||
|
|
||||||
let hold = new Batch.Hold();
|
let hold = new Batch.Hold();
|
||||||
actor.show();
|
actor.show();
|
||||||
let [minHeight, naturalHeight] = actor.get_preferred_height(-1);
|
let [, naturalHeight] = actor.get_preferred_height(-1);
|
||||||
|
|
||||||
actor.opacity = 0;
|
actor.opacity = 0;
|
||||||
actor.set_height(0);
|
actor.set_height(0);
|
||||||
Tweener.addTween(actor,
|
actor.ease({
|
||||||
{ opacity: 255,
|
opacity: 255,
|
||||||
height: naturalHeight,
|
height: naturalHeight,
|
||||||
time: FADE_ANIMATION_TIME,
|
duration: FADE_ANIMATION_TIME,
|
||||||
transition: 'easeOutQuad',
|
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
|
||||||
onComplete() {
|
onComplete: () => {
|
||||||
this.set_height(-1);
|
this.set_height(-1);
|
||||||
hold.release();
|
hold.release();
|
||||||
},
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
return hold;
|
return hold;
|
||||||
}
|
}
|
||||||
@@ -76,17 +72,17 @@ function fadeOutActor(actor) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let hold = new Batch.Hold();
|
let hold = new Batch.Hold();
|
||||||
Tweener.addTween(actor,
|
actor.ease({
|
||||||
{ opacity: 0,
|
opacity: 0,
|
||||||
height: 0,
|
height: 0,
|
||||||
time: FADE_ANIMATION_TIME,
|
duration: FADE_ANIMATION_TIME,
|
||||||
transition: 'easeOutQuad',
|
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
|
||||||
onComplete() {
|
onComplete: () => {
|
||||||
this.hide();
|
this.hide();
|
||||||
this.set_height(-1);
|
this.set_height(-1);
|
||||||
hold.release();
|
hold.release();
|
||||||
},
|
}
|
||||||
});
|
});
|
||||||
return hold;
|
return hold;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -106,15 +102,15 @@ function cloneAndFadeOutActor(actor) {
|
|||||||
clone.set_position(x, y);
|
clone.set_position(x, y);
|
||||||
|
|
||||||
let hold = new Batch.Hold();
|
let hold = new Batch.Hold();
|
||||||
Tweener.addTween(clone,
|
clone.ease({
|
||||||
{ opacity: 0,
|
opacity: 0,
|
||||||
time: CLONE_FADE_ANIMATION_TIME,
|
duration: CLONE_FADE_ANIMATION_TIME,
|
||||||
transition: 'easeOutQuad',
|
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
|
||||||
onComplete() {
|
onComplete: () => {
|
||||||
clone.destroy();
|
clone.destroy();
|
||||||
hold.release();
|
hold.release();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return hold;
|
return hold;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -308,7 +304,7 @@ var ShellUserVerifier = class {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
_oVirtUserAuthenticated(token) {
|
_oVirtUserAuthenticated(_token) {
|
||||||
this._preemptingService = OVIRT_SERVICE_NAME;
|
this._preemptingService = OVIRT_SERVICE_NAME;
|
||||||
this.emit('ovirt-user-authenticated');
|
this.emit('ovirt-user-authenticated');
|
||||||
}
|
}
|
||||||
@@ -347,7 +343,7 @@ var ShellUserVerifier = class {
|
|||||||
try {
|
try {
|
||||||
this._clearUserVerifier();
|
this._clearUserVerifier();
|
||||||
this._userVerifier = client.open_reauthentication_channel_finish(result);
|
this._userVerifier = client.open_reauthentication_channel_finish(result);
|
||||||
} catch(e) {
|
} catch (e) {
|
||||||
if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
|
if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
|
||||||
return;
|
return;
|
||||||
if (e.matches(Gio.DBusError, Gio.DBusError.ACCESS_DENIED) &&
|
if (e.matches(Gio.DBusError, Gio.DBusError.ACCESS_DENIED) &&
|
||||||
@@ -374,7 +370,7 @@ var ShellUserVerifier = class {
|
|||||||
try {
|
try {
|
||||||
this._clearUserVerifier();
|
this._clearUserVerifier();
|
||||||
this._userVerifier = client.get_user_verifier_finish(result);
|
this._userVerifier = client.get_user_verifier_finish(result);
|
||||||
} catch(e) {
|
} catch (e) {
|
||||||
if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
|
if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
|
||||||
return;
|
return;
|
||||||
this._reportInitError('Failed to obtain user verifier', e);
|
this._reportInitError('Failed to obtain user verifier', e);
|
||||||
@@ -428,36 +424,31 @@ var ShellUserVerifier = class {
|
|||||||
_startService(serviceName) {
|
_startService(serviceName) {
|
||||||
this._hold.acquire();
|
this._hold.acquire();
|
||||||
if (this._userName) {
|
if (this._userName) {
|
||||||
this._userVerifier.call_begin_verification_for_user(serviceName,
|
this._userVerifier.call_begin_verification_for_user(serviceName, this._userName, this._cancellable, (obj, result) => {
|
||||||
this._userName,
|
try {
|
||||||
this._cancellable,
|
obj.call_begin_verification_for_user_finish(result);
|
||||||
(obj, result) => {
|
} catch (e) {
|
||||||
try {
|
if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
|
||||||
obj.call_begin_verification_for_user_finish(result);
|
return;
|
||||||
} catch(e) {
|
this._reportInitError('Failed to start verification for user', e);
|
||||||
if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
|
return;
|
||||||
return;
|
}
|
||||||
this._reportInitError('Failed to start verification for user', e);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this._hold.release();
|
this._hold.release();
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
this._userVerifier.call_begin_verification(serviceName,
|
this._userVerifier.call_begin_verification(serviceName, this._cancellable, (obj, result) => {
|
||||||
this._cancellable,
|
try {
|
||||||
(obj, result) => {
|
obj.call_begin_verification_finish(result);
|
||||||
try {
|
} catch (e) {
|
||||||
obj.call_begin_verification_finish(result);
|
if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
|
||||||
} catch(e) {
|
return;
|
||||||
if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
|
this._reportInitError('Failed to start verification', e);
|
||||||
return;
|
return;
|
||||||
this._reportInitError('Failed to start verification', e);
|
}
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this._hold.release();
|
this._hold.release();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -64,6 +64,7 @@
|
|||||||
<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/locatePointer.js</file>
|
||||||
<file>ui/lookingGlass.js</file>
|
<file>ui/lookingGlass.js</file>
|
||||||
<file>ui/magnifier.js</file>
|
<file>ui/magnifier.js</file>
|
||||||
<file>ui/magnifierDBus.js</file>
|
<file>ui/magnifierDBus.js</file>
|
||||||
@@ -78,11 +79,14 @@
|
|||||||
<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/padOsd.js</file>
|
||||||
|
<file>ui/pageIndicators.js</file>
|
||||||
<file>ui/panel.js</file>
|
<file>ui/panel.js</file>
|
||||||
<file>ui/panelMenu.js</file>
|
<file>ui/panelMenu.js</file>
|
||||||
|
<file>ui/pointerA11yTimeout.js</file>
|
||||||
<file>ui/pointerWatcher.js</file>
|
<file>ui/pointerWatcher.js</file>
|
||||||
<file>ui/popupMenu.js</file>
|
<file>ui/popupMenu.js</file>
|
||||||
<file>ui/remoteSearch.js</file>
|
<file>ui/remoteSearch.js</file>
|
||||||
|
<file>ui/ripples.js</file>
|
||||||
<file>ui/runDialog.js</file>
|
<file>ui/runDialog.js</file>
|
||||||
<file>ui/screenShield.js</file>
|
<file>ui/screenShield.js</file>
|
||||||
<file>ui/screencast.js</file>
|
<file>ui/screencast.js</file>
|
||||||
@@ -119,6 +123,7 @@
|
|||||||
|
|
||||||
<file>ui/status/accessibility.js</file>
|
<file>ui/status/accessibility.js</file>
|
||||||
<file>ui/status/brightness.js</file>
|
<file>ui/status/brightness.js</file>
|
||||||
|
<file>ui/status/dwellClick.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/nightLight.js</file>
|
||||||
|
|||||||
@@ -1,22 +1,37 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
/* exported ExtensionState, ExtensionType, getCurrentExtension,
|
||||||
|
getSettings, initTranslations, isOutOfDate, installImporter,
|
||||||
|
serializeExtension, deserializeExtension */
|
||||||
|
|
||||||
// Common utils for the extension system and the extension
|
// Common utils for the extension system and the extension
|
||||||
// preferences tool
|
// preferences tool
|
||||||
|
|
||||||
const Signals = imports.signals;
|
const { Gio, GLib } = imports.gi;
|
||||||
|
|
||||||
const Gio = imports.gi.Gio;
|
const Gettext = imports.gettext;
|
||||||
|
const Lang = imports.lang;
|
||||||
|
|
||||||
const Config = imports.misc.config;
|
const Config = imports.misc.config;
|
||||||
const FileUtils = imports.misc.fileUtils;
|
|
||||||
|
|
||||||
var ExtensionType = {
|
var ExtensionType = {
|
||||||
SYSTEM: 1,
|
SYSTEM: 1,
|
||||||
PER_USER: 2
|
PER_USER: 2
|
||||||
};
|
};
|
||||||
|
|
||||||
// Maps uuid -> metadata object
|
var ExtensionState = {
|
||||||
var extensions = {};
|
ENABLED: 1,
|
||||||
|
DISABLED: 2,
|
||||||
|
ERROR: 3,
|
||||||
|
OUT_OF_DATE: 4,
|
||||||
|
DOWNLOADING: 5,
|
||||||
|
INITIALIZED: 6,
|
||||||
|
|
||||||
|
// Used as an error state for operations on unknown extensions,
|
||||||
|
// should never be in a real extensionMeta object.
|
||||||
|
UNINSTALLED: 99
|
||||||
|
};
|
||||||
|
|
||||||
|
const SERIALIZED_PROPERTIES = ['type', 'state', 'path', 'error', 'hasPrefs', 'canChange'];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* getCurrentExtension:
|
* getCurrentExtension:
|
||||||
@@ -30,7 +45,7 @@ function getCurrentExtension() {
|
|||||||
// Search for an occurrence of an extension stack frame
|
// Search for an occurrence of an extension stack frame
|
||||||
// Start at 1 because 0 is the stack frame of this function
|
// Start at 1 because 0 is the stack frame of this function
|
||||||
for (let i = 1; i < stack.length; i++) {
|
for (let i = 1; i < stack.length; i++) {
|
||||||
if (stack[i].indexOf('/gnome-shell/extensions/') > -1) {
|
if (stack[i].includes('/gnome-shell/extensions/')) {
|
||||||
extensionStackLine = stack[i];
|
extensionStackLine = stack[i];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -48,13 +63,17 @@ function getCurrentExtension() {
|
|||||||
if (!match)
|
if (!match)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
|
// local import, as the module is used from outside the gnome-shell process
|
||||||
|
// as well (not this function though)
|
||||||
|
let extensionManager = imports.ui.main.extensionManager;
|
||||||
|
|
||||||
let path = match[1];
|
let path = match[1];
|
||||||
let file = Gio.File.new_for_path(path);
|
let file = Gio.File.new_for_path(path);
|
||||||
|
|
||||||
// Walk up the directory tree, looking for an extension with
|
// Walk up the directory tree, looking for an extension with
|
||||||
// the same UUID as a directory name.
|
// the same UUID as a directory name.
|
||||||
while (file != null) {
|
while (file != null) {
|
||||||
let extension = extensions[file.get_basename()];
|
let extension = extensionManager.lookup(file.get_basename());
|
||||||
if (extension !== undefined)
|
if (extension !== undefined)
|
||||||
return extension;
|
return extension;
|
||||||
file = file.get_parent();
|
file = file.get_parent();
|
||||||
@@ -63,6 +82,66 @@ function getCurrentExtension() {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* initTranslations:
|
||||||
|
* @domain: (optional): the gettext domain to use
|
||||||
|
*
|
||||||
|
* Initialize Gettext to load translations from extensionsdir/locale.
|
||||||
|
* If @domain is not provided, it will be taken from metadata['gettext-domain']
|
||||||
|
*/
|
||||||
|
function initTranslations(domain) {
|
||||||
|
let extension = getCurrentExtension();
|
||||||
|
|
||||||
|
if (!extension)
|
||||||
|
throw new Error('initTranslations() can only be called from extensions');
|
||||||
|
|
||||||
|
domain = domain || extension.metadata['gettext-domain'];
|
||||||
|
|
||||||
|
// Expect USER extensions to have a locale/ subfolder, otherwise assume a
|
||||||
|
// SYSTEM extension that has been installed in the same prefix as the shell
|
||||||
|
let localeDir = extension.dir.get_child('locale');
|
||||||
|
if (localeDir.query_exists(null))
|
||||||
|
Gettext.bindtextdomain(domain, localeDir.get_path());
|
||||||
|
else
|
||||||
|
Gettext.bindtextdomain(domain, Config.LOCALEDIR);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* getSettings:
|
||||||
|
* @schema: (optional): the GSettings schema id
|
||||||
|
*
|
||||||
|
* Builds and returns a GSettings schema for @schema, using schema files
|
||||||
|
* in extensionsdir/schemas. If @schema is omitted, it is taken from
|
||||||
|
* metadata['settings-schema'].
|
||||||
|
*/
|
||||||
|
function getSettings(schema) {
|
||||||
|
let extension = getCurrentExtension();
|
||||||
|
|
||||||
|
if (!extension)
|
||||||
|
throw new Error('getSettings() can only be called from extensions');
|
||||||
|
|
||||||
|
schema = schema || extension.metadata['settings-schema'];
|
||||||
|
|
||||||
|
const GioSSS = Gio.SettingsSchemaSource;
|
||||||
|
|
||||||
|
// Expect USER extensions to have a schemas/ subfolder, otherwise assume a
|
||||||
|
// SYSTEM extension that has been installed in the same prefix as the shell
|
||||||
|
let schemaDir = extension.dir.get_child('schemas');
|
||||||
|
let schemaSource;
|
||||||
|
if (schemaDir.query_exists(null))
|
||||||
|
schemaSource = GioSSS.new_from_directory(schemaDir.get_path(),
|
||||||
|
GioSSS.get_default(),
|
||||||
|
false);
|
||||||
|
else
|
||||||
|
schemaSource = GioSSS.get_default();
|
||||||
|
|
||||||
|
let schemaObj = schemaSource.lookup(schema, true);
|
||||||
|
if (!schemaObj)
|
||||||
|
throw new Error(`Schema ${schema} could not be found for extension ${extension.metadata.uuid}. Please check your installation`);
|
||||||
|
|
||||||
|
return new Gio.Settings({ settings_schema: schemaObj });
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* versionCheck:
|
* versionCheck:
|
||||||
* @required: an array of versions we're compatible with
|
* @required: an array of versions we're compatible with
|
||||||
@@ -86,8 +165,8 @@ function versionCheck(required, current) {
|
|||||||
let requiredArray = required[i].split('.');
|
let requiredArray = required[i].split('.');
|
||||||
if (requiredArray[0] == major &&
|
if (requiredArray[0] == major &&
|
||||||
requiredArray[1] == minor &&
|
requiredArray[1] == minor &&
|
||||||
(requiredArray[2] == point ||
|
((requiredArray[2] === undefined && parseInt(minor) % 2 == 0) ||
|
||||||
(requiredArray[2] == undefined && parseInt(minor) % 2 == 0)))
|
requiredArray[2] == point))
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@@ -100,54 +179,50 @@ function isOutOfDate(extension) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
function createExtensionObject(uuid, dir, type) {
|
function serializeExtension(extension) {
|
||||||
let info;
|
let obj = {};
|
||||||
|
Lang.copyProperties(extension.metadata, obj);
|
||||||
|
|
||||||
let metadataFile = dir.get_child('metadata.json');
|
SERIALIZED_PROPERTIES.forEach(prop => {
|
||||||
if (!metadataFile.query_exists(null)) {
|
obj[prop] = extension[prop];
|
||||||
throw new Error('Missing metadata.json');
|
});
|
||||||
}
|
|
||||||
|
|
||||||
let metadataContents, success, tag;
|
let res = {};
|
||||||
try {
|
for (let key in obj) {
|
||||||
[success, metadataContents, tag] = metadataFile.load_contents(null);
|
let val = obj[key];
|
||||||
if (metadataContents instanceof Uint8Array)
|
let type;
|
||||||
metadataContents = imports.byteArray.toString(metadataContents);
|
switch (typeof val) {
|
||||||
} catch (e) {
|
case 'string':
|
||||||
throw new Error('Failed to load metadata.json: ' + e);
|
type = 's';
|
||||||
}
|
break;
|
||||||
let meta;
|
case 'number':
|
||||||
try {
|
type = 'd';
|
||||||
meta = JSON.parse(metadataContents);
|
break;
|
||||||
} catch (e) {
|
case 'boolean':
|
||||||
throw new Error('Failed to parse metadata.json: ' + e);
|
type = 'b';
|
||||||
}
|
break;
|
||||||
|
default:
|
||||||
let requiredProperties = ['uuid', 'name', 'description', 'shell-version'];
|
continue;
|
||||||
for (let i = 0; i < requiredProperties.length; i++) {
|
|
||||||
let prop = requiredProperties[i];
|
|
||||||
if (!meta[prop]) {
|
|
||||||
throw new Error('missing "' + prop + '" property in metadata.json');
|
|
||||||
}
|
}
|
||||||
|
res[key] = GLib.Variant.new(type, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (uuid != meta.uuid) {
|
return res;
|
||||||
throw new Error('uuid "' + meta.uuid + '" from metadata.json does not match directory name "' + uuid + '"');
|
}
|
||||||
|
|
||||||
|
function deserializeExtension(variant) {
|
||||||
|
let res = { metadata: {} };
|
||||||
|
for (let prop in variant) {
|
||||||
|
let val = variant[prop].unpack();
|
||||||
|
if (SERIALIZED_PROPERTIES.includes(prop))
|
||||||
|
res[prop] = val;
|
||||||
|
else
|
||||||
|
res.metadata[prop] = val;
|
||||||
}
|
}
|
||||||
|
// add the 2 additional properties to create a valid extension object, as createExtensionObject()
|
||||||
let extension = {};
|
res.uuid = res.metadata.uuid;
|
||||||
|
res.dir = Gio.File.new_for_path(res.path);
|
||||||
extension.metadata = meta;
|
return res;
|
||||||
extension.uuid = meta.uuid;
|
|
||||||
extension.type = type;
|
|
||||||
extension.dir = dir;
|
|
||||||
extension.path = dir.get_path();
|
|
||||||
extension.error = '';
|
|
||||||
extension.hasPrefs = dir.get_child('prefs.js').query_exists(null);
|
|
||||||
|
|
||||||
extensions[uuid] = extension;
|
|
||||||
|
|
||||||
return extension;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function installImporter(extension) {
|
function installImporter(extension) {
|
||||||
@@ -158,36 +233,3 @@ function installImporter(extension) {
|
|||||||
extension.imports = imports[extension.uuid];
|
extension.imports = imports[extension.uuid];
|
||||||
imports.searchPath = oldSearchPath;
|
imports.searchPath = oldSearchPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
var ExtensionFinder = class {
|
|
||||||
_loadExtension(extensionDir, info, perUserDir) {
|
|
||||||
let fileType = info.get_file_type();
|
|
||||||
if (fileType != Gio.FileType.DIRECTORY)
|
|
||||||
return;
|
|
||||||
let uuid = info.get_name();
|
|
||||||
let existing = extensions[uuid];
|
|
||||||
if (existing) {
|
|
||||||
log('Extension %s already installed in %s. %s will not be loaded'.format(uuid, existing.path, extensionDir.get_path()));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
let extension;
|
|
||||||
let type = extensionDir.has_prefix(perUserDir) ? ExtensionType.PER_USER
|
|
||||||
: ExtensionType.SYSTEM;
|
|
||||||
try {
|
|
||||||
extension = createExtensionObject(uuid, extensionDir, type);
|
|
||||||
} catch(e) {
|
|
||||||
logError(e, 'Could not load extension %s'.format(uuid));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this.emit('extension-found', extension);
|
|
||||||
}
|
|
||||||
|
|
||||||
scanExtensions() {
|
|
||||||
let perUserDir = Gio.File.new_for_path(global.userdatadir);
|
|
||||||
FileUtils.collectFromDatadirs('extensions', true, (dir, info) => {
|
|
||||||
this._loadExtension(dir, info, perUserDir);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
Signals.addSignalMethods(ExtensionFinder.prototype);
|
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
/* exported collectFromDatadirs, deleteGFile, recursivelyDeleteDir,
|
||||||
|
recursivelyMoveDir, loadInterfaceXML */
|
||||||
|
|
||||||
const Gio = imports.gi.Gio;
|
const { Gio, GLib } = imports.gi;
|
||||||
const GLib = imports.gi.GLib;
|
|
||||||
const Config = imports.misc.config;
|
const Config = imports.misc.config;
|
||||||
const Params = imports.misc.params;
|
|
||||||
|
|
||||||
function collectFromDatadirs(subdir, includeUserDir, processFile) {
|
function collectFromDatadirs(subdir, includeUserDir, processFile) {
|
||||||
let dataDirs = GLib.get_system_data_dirs();
|
let dataDirs = GLib.get_system_data_dirs();
|
||||||
@@ -38,7 +38,7 @@ function recursivelyDeleteDir(dir, deleteParent) {
|
|||||||
let children = dir.enumerate_children('standard::name,standard::type',
|
let children = dir.enumerate_children('standard::name,standard::type',
|
||||||
Gio.FileQueryInfoFlags.NONE, null);
|
Gio.FileQueryInfoFlags.NONE, null);
|
||||||
|
|
||||||
let info, child;
|
let info;
|
||||||
while ((info = children.next_file(null)) != null) {
|
while ((info = children.next_file(null)) != null) {
|
||||||
let type = info.get_file_type();
|
let type = info.get_file_type();
|
||||||
let child = dir.get_child(info.get_name());
|
let child = dir.get_child(info.get_name());
|
||||||
@@ -59,7 +59,7 @@ function recursivelyMoveDir(srcDir, destDir) {
|
|||||||
if (!destDir.query_exists(null))
|
if (!destDir.query_exists(null))
|
||||||
destDir.make_directory_with_parents(null);
|
destDir.make_directory_with_parents(null);
|
||||||
|
|
||||||
let info, child;
|
let info;
|
||||||
while ((info = children.next_file(null)) != null) {
|
while ((info = children.next_file(null)) != null) {
|
||||||
let type = info.get_file_type();
|
let type = info.get_file_type();
|
||||||
let srcChild = srcDir.get_child(info.get_name());
|
let srcChild = srcDir.get_child(info.get_name());
|
||||||
@@ -86,13 +86,13 @@ function loadInterfaceXML(iface) {
|
|||||||
let f = Gio.File.new_for_uri(uri);
|
let f = Gio.File.new_for_uri(uri);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
let [ok, bytes] = f.load_contents(null);
|
let [ok_, bytes] = f.load_contents(null);
|
||||||
if (bytes instanceof Uint8Array)
|
if (bytes instanceof Uint8Array)
|
||||||
xml = imports.byteArray.toString(bytes)
|
xml = imports.byteArray.toString(bytes);
|
||||||
else
|
else
|
||||||
xml = bytes.toString();
|
xml = bytes.toString();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
log('Failed to load D-Bus interface ' + iface);
|
log(`Failed to load D-Bus interface ${iface}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
return xml;
|
return xml;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
/* exported PresenceStatus, Presence, Inhibitor, SessionManager */
|
||||||
|
|
||||||
const Gio = imports.gi.Gio;
|
const Gio = imports.gi.Gio;
|
||||||
const Signals = imports.signals;
|
|
||||||
|
|
||||||
const { loadInterfaceXML } = imports.misc.fileUtils;
|
const { loadInterfaceXML } = imports.misc.fileUtils;
|
||||||
|
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ var HistoryManager = class {
|
|||||||
this._historyIndex = 0;
|
this._historyIndex = 0;
|
||||||
if (this._key) {
|
if (this._key) {
|
||||||
this._history = global.settings.get_strv(this._key);
|
this._history = global.settings.get_strv(this._key);
|
||||||
global.settings.connect('changed::' + this._key,
|
global.settings.connect(`changed::${this._key}`,
|
||||||
this._historyChanged.bind(this));
|
this._historyChanged.bind(this));
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@@ -66,7 +66,7 @@ var HistoryManager = class {
|
|||||||
this._indexChanged();
|
this._indexChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
return this._historyIndex ? this._history[this._historyIndex -1] : null;
|
return this._historyIndex ? this._history[this._historyIndex - 1] : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
addItem(input) {
|
addItem(input) {
|
||||||
|
|||||||
@@ -1,11 +1,9 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
/* exported getIBusManager */
|
||||||
|
|
||||||
const Gio = imports.gi.Gio;
|
const { Gio, GLib, IBus } = imports.gi;
|
||||||
const GLib = imports.gi.GLib;
|
|
||||||
const Mainloop = imports.mainloop;
|
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
|
|
||||||
const IBus = imports.gi.IBus;
|
|
||||||
const IBusCandidatePopup = imports.ui.ibusCandidatePopup;
|
const IBusCandidatePopup = imports.ui.ibusCandidatePopup;
|
||||||
|
|
||||||
// Ensure runtime version matches
|
// Ensure runtime version matches
|
||||||
@@ -20,9 +18,9 @@ function _checkIBusVersion(requiredMajor, requiredMinor, requiredMicro) {
|
|||||||
IBus.MICRO_VERSION >= requiredMicro))
|
IBus.MICRO_VERSION >= requiredMicro))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
throw "Found IBus version %d.%d.%d but required is %d.%d.%d".
|
throw "Found IBus version %d.%d.%d but required is %d.%d.%d"
|
||||||
format(IBus.MAJOR_VERSION, IBus.MINOR_VERSION, IBus.MINOR_VERSION,
|
.format(IBus.MAJOR_VERSION, IBus.MINOR_VERSION, IBus.MINOR_VERSION,
|
||||||
requiredMajor, requiredMinor, requiredMicro);
|
requiredMajor, requiredMinor, requiredMicro);
|
||||||
}
|
}
|
||||||
|
|
||||||
function getIBusManager() {
|
function getIBusManager() {
|
||||||
@@ -44,7 +42,7 @@ var IBusManager = class {
|
|||||||
this._candidatePopup = new IBusCandidatePopup.CandidatePopup();
|
this._candidatePopup = new IBusCandidatePopup.CandidatePopup();
|
||||||
|
|
||||||
this._panelService = null;
|
this._panelService = null;
|
||||||
this._engines = {};
|
this._engines = new Map();
|
||||||
this._ready = false;
|
this._ready = false;
|
||||||
this._registerPropertiesId = 0;
|
this._registerPropertiesId = 0;
|
||||||
this._currentEngineName = null;
|
this._currentEngineName = null;
|
||||||
@@ -60,54 +58,79 @@ var IBusManager = class {
|
|||||||
this._spawn();
|
this._spawn();
|
||||||
}
|
}
|
||||||
|
|
||||||
_spawn() {
|
_spawn(extraArgs = []) {
|
||||||
try {
|
try {
|
||||||
Gio.Subprocess.new(['ibus-daemon', '--xim', '--panel', 'disable'],
|
let cmdLine = ['ibus-daemon', '--panel', 'disable', ...extraArgs];
|
||||||
Gio.SubprocessFlags.NONE);
|
Gio.Subprocess.new(cmdLine, Gio.SubprocessFlags.NONE);
|
||||||
} catch(e) {
|
} catch (e) {
|
||||||
log('Failed to launch ibus-daemon: ' + e.message);
|
log(`Failed to launch ibus-daemon: ${e.message}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
restartDaemon(extraArgs = []) {
|
||||||
|
this._spawn(['-r', ...extraArgs]);
|
||||||
|
}
|
||||||
|
|
||||||
_clear() {
|
_clear() {
|
||||||
|
if (this._cancellable) {
|
||||||
|
this._cancellable.cancel();
|
||||||
|
this._cancellable = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this._preloadEnginesId) {
|
||||||
|
GLib.source_remove(this._preloadEnginesId);
|
||||||
|
this._preloadEnginesId = 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (this._panelService)
|
if (this._panelService)
|
||||||
this._panelService.destroy();
|
this._panelService.destroy();
|
||||||
|
|
||||||
this._panelService = null;
|
this._panelService = null;
|
||||||
this._candidatePopup.setPanelService(null);
|
this._candidatePopup.setPanelService(null);
|
||||||
this._engines = {};
|
this._engines.clear();
|
||||||
this._ready = false;
|
this._ready = false;
|
||||||
this._registerPropertiesId = 0;
|
this._registerPropertiesId = 0;
|
||||||
this._currentEngineName = null;
|
this._currentEngineName = null;
|
||||||
|
|
||||||
this.emit('ready', false);
|
this.emit('ready', false);
|
||||||
|
|
||||||
this._spawn();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_onConnected() {
|
_onConnected() {
|
||||||
this._ibus.list_engines_async(-1, null, this._initEngines.bind(this));
|
this._cancellable = new Gio.Cancellable();
|
||||||
|
this._ibus.list_engines_async(-1, this._cancellable,
|
||||||
|
this._initEngines.bind(this));
|
||||||
this._ibus.request_name_async(IBus.SERVICE_PANEL,
|
this._ibus.request_name_async(IBus.SERVICE_PANEL,
|
||||||
IBus.BusNameFlag.REPLACE_EXISTING,
|
IBus.BusNameFlag.REPLACE_EXISTING, -1, this._cancellable,
|
||||||
-1, null,
|
this._initPanelService.bind(this));
|
||||||
this._initPanelService.bind(this));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_initEngines(ibus, result) {
|
_initEngines(ibus, result) {
|
||||||
let enginesList = this._ibus.list_engines_async_finish(result);
|
try {
|
||||||
if (enginesList) {
|
let enginesList = this._ibus.list_engines_async_finish(result);
|
||||||
for (let i = 0; i < enginesList.length; ++i) {
|
for (let i = 0; i < enginesList.length; ++i) {
|
||||||
let name = enginesList[i].get_name();
|
let name = enginesList[i].get_name();
|
||||||
this._engines[name] = enginesList[i];
|
this._engines.set(name, enginesList[i]);
|
||||||
}
|
}
|
||||||
this._updateReadiness();
|
this._updateReadiness();
|
||||||
} else {
|
} catch (e) {
|
||||||
|
if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
|
||||||
|
return;
|
||||||
|
|
||||||
|
logError(e);
|
||||||
this._clear();
|
this._clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_initPanelService(ibus, result) {
|
_initPanelService(ibus, result) {
|
||||||
let success = this._ibus.request_name_async_finish(result);
|
let success = false;
|
||||||
|
try {
|
||||||
|
success = !!this._ibus.request_name_async_finish(result);
|
||||||
|
} catch (e) {
|
||||||
|
if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
|
||||||
|
return;
|
||||||
|
logError(e);
|
||||||
|
}
|
||||||
|
|
||||||
if (success) {
|
if (success) {
|
||||||
this._panelService = new IBus.PanelService({ connection: this._ibus.get_connection(),
|
this._panelService = new IBus.PanelService({ connection: this._ibus.get_connection(),
|
||||||
object_path: IBus.PATH_PANEL });
|
object_path: IBus.PATH_PANEL });
|
||||||
@@ -121,7 +144,7 @@ var IBusManager = class {
|
|||||||
if (!GLib.str_has_suffix(path, '/InputContext_1'))
|
if (!GLib.str_has_suffix(path, '/InputContext_1'))
|
||||||
this.emit ('focus-in');
|
this.emit ('focus-in');
|
||||||
});
|
});
|
||||||
this._panelService.connect('focus-out', () => { this.emit('focus-out'); });
|
this._panelService.connect('focus-out', () => this.emit('focus-out'));
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// IBus versions older than 1.5.10 have a bug which
|
// IBus versions older than 1.5.10 have a bug which
|
||||||
@@ -134,13 +157,13 @@ var IBusManager = class {
|
|||||||
} catch (e) {
|
} catch (e) {
|
||||||
}
|
}
|
||||||
// If an engine is already active we need to get its properties
|
// If an engine is already active we need to get its properties
|
||||||
this._ibus.get_global_engine_async(-1, null, (i, result) => {
|
this._ibus.get_global_engine_async(-1, this._cancellable, (_bus, result) => {
|
||||||
let engine;
|
let engine;
|
||||||
try {
|
try {
|
||||||
engine = this._ibus.get_global_engine_async_finish(result);
|
engine = this._ibus.get_global_engine_async_finish(result);
|
||||||
if (!engine)
|
if (!engine)
|
||||||
return;
|
return;
|
||||||
} catch(e) {
|
} catch (e) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this._engineChanged(this._ibus, engine.get_name());
|
this._engineChanged(this._ibus, engine.get_name());
|
||||||
@@ -152,8 +175,7 @@ var IBusManager = class {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_updateReadiness() {
|
_updateReadiness() {
|
||||||
this._ready = (Object.keys(this._engines).length > 0 &&
|
this._ready = this._engines.size > 0 && this._panelService != null;
|
||||||
this._panelService != null);
|
|
||||||
this.emit('ready', this._ready);
|
this.emit('ready', this._ready);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -191,10 +213,10 @@ var IBusManager = class {
|
|||||||
}
|
}
|
||||||
|
|
||||||
getEngineDesc(id) {
|
getEngineDesc(id) {
|
||||||
if (!this._ready || !this._engines.hasOwnProperty(id))
|
if (!this._ready || !this._engines.has(id))
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
return this._engines[id];
|
return this._engines.get(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
setEngine(id, callback) {
|
setEngine(id, callback) {
|
||||||
@@ -207,8 +229,18 @@ var IBusManager = class {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this._ibus.set_global_engine_async(id, this._MAX_INPUT_SOURCE_ACTIVATION_TIME,
|
this._ibus.set_global_engine_async(id,
|
||||||
null, callback || null);
|
this._MAX_INPUT_SOURCE_ACTIVATION_TIME,
|
||||||
|
this._cancellable, (_bus, res) => {
|
||||||
|
try {
|
||||||
|
this._ibus.set_global_engine_async_finish(res);
|
||||||
|
} catch (e) {
|
||||||
|
if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
|
||||||
|
logError(e);
|
||||||
|
}
|
||||||
|
if (callback)
|
||||||
|
callback();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
preloadEngines(ids) {
|
preloadEngines(ids) {
|
||||||
@@ -216,21 +248,23 @@ var IBusManager = class {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
if (this._preloadEnginesId != 0) {
|
if (this._preloadEnginesId != 0) {
|
||||||
Mainloop.source_remove(this._preloadEnginesId);
|
GLib.source_remove(this._preloadEnginesId);
|
||||||
this._preloadEnginesId = 0;
|
this._preloadEnginesId = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
this._preloadEnginesId =
|
this._preloadEnginesId =
|
||||||
Mainloop.timeout_add_seconds(this._PRELOAD_ENGINES_DELAY_TIME,
|
GLib.timeout_add_seconds(
|
||||||
() => {
|
GLib.PRIORITY_DEFAULT,
|
||||||
this._ibus.preload_engines_async(
|
this._PRELOAD_ENGINES_DELAY_TIME,
|
||||||
ids,
|
() => {
|
||||||
-1,
|
this._ibus.preload_engines_async(
|
||||||
null,
|
ids,
|
||||||
null);
|
-1,
|
||||||
this._preloadEnginesId = 0;
|
this._cancellable,
|
||||||
return GLib.SOURCE_REMOVE;
|
null);
|
||||||
});
|
this._preloadEnginesId = 0;
|
||||||
|
return GLib.SOURCE_REMOVE;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
Signals.addSignalMethods(IBusManager.prototype);
|
Signals.addSignalMethods(IBusManager.prototype);
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
// -*- 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;
|
/* exported InputMethod */
|
||||||
const GObject = imports.gi.GObject;
|
const { Clutter, GLib, Gio, GObject, IBus } = imports.gi;
|
||||||
const IBus = imports.gi.IBus;
|
|
||||||
const Keyboard = imports.ui.status.keyboard;
|
const Keyboard = imports.ui.status.keyboard;
|
||||||
const Signals = imports.signals;
|
|
||||||
|
var HIDE_PANEL_TIME = 50;
|
||||||
|
|
||||||
var InputMethod = GObject.registerClass(
|
var InputMethod = GObject.registerClass(
|
||||||
class InputMethod extends Clutter.InputMethod {
|
class InputMethod extends Clutter.InputMethod {
|
||||||
@@ -15,6 +16,7 @@ class InputMethod extends Clutter.InputMethod {
|
|||||||
this._preeditStr = '';
|
this._preeditStr = '';
|
||||||
this._preeditPos = 0;
|
this._preeditPos = 0;
|
||||||
this._preeditVisible = false;
|
this._preeditVisible = false;
|
||||||
|
this._hidePanelId = 0;
|
||||||
this._ibus = IBus.Bus.new_async();
|
this._ibus = IBus.Bus.new_async();
|
||||||
this._ibus.connect('connected', this._onConnected.bind(this));
|
this._ibus.connect('connected', this._onConnected.bind(this));
|
||||||
this._ibus.connect('disconnected', this._clear.bind(this));
|
this._ibus.connect('disconnected', this._clear.bind(this));
|
||||||
@@ -34,15 +36,7 @@ class InputMethod extends Clutter.InputMethod {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_updateCapabilities() {
|
_updateCapabilities() {
|
||||||
let caps = 0;
|
let caps = IBus.Capabilite.PREEDIT_TEXT | IBus.Capabilite.FOCUS | IBus.Capabilite.SURROUNDING_TEXT;
|
||||||
|
|
||||||
if (this.can_show_preedit)
|
|
||||||
caps |= IBus.Capabilite.PREEDIT_TEXT;
|
|
||||||
|
|
||||||
if (this._currentFocus)
|
|
||||||
caps |= IBus.Capabilite.FOCUS | IBus.Capabilite.SURROUNDING_TEXT;
|
|
||||||
else
|
|
||||||
caps |= IBus.Capabilite.PREEDIT_TEXT | IBus.Capabilite.AUXILIARY_TEXT | IBus.Capabilite.LOOKUP_TABLE | IBus.Capabilite.PROPERTY;
|
|
||||||
|
|
||||||
if (this._context)
|
if (this._context)
|
||||||
this._context.set_capabilities(caps);
|
this._context.set_capabilities(caps);
|
||||||
@@ -53,12 +47,22 @@ class InputMethod extends Clutter.InputMethod {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_onConnected() {
|
_onConnected() {
|
||||||
this._ibus.create_input_context_async ('gnome-shell', -1, null,
|
this._cancellable = new Gio.Cancellable();
|
||||||
this._setContext.bind(this));
|
this._ibus.create_input_context_async ('gnome-shell', -1,
|
||||||
|
this._cancellable, this._setContext.bind(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
_setContext(bus, res) {
|
_setContext(bus, res) {
|
||||||
this._context = this._ibus.create_input_context_async_finish(res);
|
try {
|
||||||
|
this._context = this._ibus.create_input_context_async_finish(res);
|
||||||
|
} catch (e) {
|
||||||
|
if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) {
|
||||||
|
logError(e);
|
||||||
|
this._clear();
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
this._context.connect('commit-text', this._onCommitText.bind(this));
|
this._context.connect('commit-text', this._onCommitText.bind(this));
|
||||||
this._context.connect('delete-surrounding-text', this._onDeleteSurroundingText.bind(this));
|
this._context.connect('delete-surrounding-text', this._onDeleteSurroundingText.bind(this));
|
||||||
this._context.connect('update-preedit-text', this._onUpdatePreeditText.bind(this));
|
this._context.connect('update-preedit-text', this._onUpdatePreeditText.bind(this));
|
||||||
@@ -70,10 +74,15 @@ class InputMethod extends Clutter.InputMethod {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_clear() {
|
_clear() {
|
||||||
|
if (this._cancellable) {
|
||||||
|
this._cancellable.cancel();
|
||||||
|
this._cancellable = null;
|
||||||
|
}
|
||||||
|
|
||||||
this._context = null;
|
this._context = null;
|
||||||
this._hints = 0;
|
this._hints = 0;
|
||||||
this._purpose = 0;
|
this._purpose = 0;
|
||||||
this._preeditStr = ''
|
this._preeditStr = '';
|
||||||
this._preeditPos = 0;
|
this._preeditPos = 0;
|
||||||
this._preeditVisible = false;
|
this._preeditVisible = false;
|
||||||
}
|
}
|
||||||
@@ -83,15 +92,15 @@ class InputMethod extends Clutter.InputMethod {
|
|||||||
this.emit('request-surrounding');
|
this.emit('request-surrounding');
|
||||||
}
|
}
|
||||||
|
|
||||||
_onCommitText(context, text) {
|
_onCommitText(_context, text) {
|
||||||
this.commit(text.get_text());
|
this.commit(text.get_text());
|
||||||
}
|
}
|
||||||
|
|
||||||
_onDeleteSurroundingText(context) {
|
_onDeleteSurroundingText() {
|
||||||
this.delete_surrounding();
|
this.delete_surrounding();
|
||||||
}
|
}
|
||||||
|
|
||||||
_onUpdatePreeditText(context, text, pos, visible) {
|
_onUpdatePreeditText(_context, text, pos, visible) {
|
||||||
if (text == null)
|
if (text == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -107,17 +116,17 @@ class InputMethod extends Clutter.InputMethod {
|
|||||||
this._preeditVisible = visible;
|
this._preeditVisible = visible;
|
||||||
}
|
}
|
||||||
|
|
||||||
_onShowPreeditText(context) {
|
_onShowPreeditText() {
|
||||||
this._preeditVisible = true;
|
this._preeditVisible = true;
|
||||||
this.set_preedit_text(this._preeditStr, this._preeditPos);
|
this.set_preedit_text(this._preeditStr, this._preeditPos);
|
||||||
}
|
}
|
||||||
|
|
||||||
_onHidePreeditText(context) {
|
_onHidePreeditText() {
|
||||||
this.set_preedit_text(null, this._preeditPos);
|
this.set_preedit_text(null, this._preeditPos);
|
||||||
this._preeditVisible = false;
|
this._preeditVisible = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
_onForwardKeyEvent(context, keyval, keycode, state) {
|
_onForwardKeyEvent(_context, keyval, keycode, state) {
|
||||||
let press = (state & IBus.ModifierType.RELEASE_MASK) == 0;
|
let press = (state & IBus.ModifierType.RELEASE_MASK) == 0;
|
||||||
state &= ~(IBus.ModifierType.RELEASE_MASK);
|
state &= ~(IBus.ModifierType.RELEASE_MASK);
|
||||||
|
|
||||||
@@ -135,23 +144,31 @@ class InputMethod extends Clutter.InputMethod {
|
|||||||
this._currentFocus = focus;
|
this._currentFocus = focus;
|
||||||
if (this._context) {
|
if (this._context) {
|
||||||
this._context.focus_in();
|
this._context.focus_in();
|
||||||
this._updateCapabilities();
|
|
||||||
this._emitRequestSurrounding();
|
this._emitRequestSurrounding();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this._hidePanelId) {
|
||||||
|
GLib.source_remove(this._hidePanelId);
|
||||||
|
this._hidePanelId = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
vfunc_focus_out() {
|
vfunc_focus_out() {
|
||||||
this._currentFocus = null;
|
this._currentFocus = null;
|
||||||
if (this._context) {
|
if (this._context)
|
||||||
this._context.focus_out();
|
this._context.focus_out();
|
||||||
this._updateCapabilities();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this._preeditStr) {
|
if (this._preeditStr) {
|
||||||
// Unset any preedit text
|
// Unset any preedit text
|
||||||
this.set_preedit_text(null, 0);
|
this.set_preedit_text(null, 0);
|
||||||
this._preeditStr = null;
|
this._preeditStr = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this._hidePanelId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, HIDE_PANEL_TIME, () => {
|
||||||
|
this.set_input_panel_state(Clutter.InputPanelState.OFF);
|
||||||
|
this._hidePanelId = 0;
|
||||||
|
return GLib.SOURCE_REMOVE;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
vfunc_reset() {
|
vfunc_reset() {
|
||||||
@@ -242,17 +259,19 @@ class InputMethod extends Clutter.InputMethod {
|
|||||||
if (event.type() == Clutter.EventType.KEY_RELEASE)
|
if (event.type() == Clutter.EventType.KEY_RELEASE)
|
||||||
state |= IBus.ModifierType.RELEASE_MASK;
|
state |= IBus.ModifierType.RELEASE_MASK;
|
||||||
|
|
||||||
this._context.process_key_event_async(event.get_key_symbol(),
|
this._context.process_key_event_async(
|
||||||
event.get_key_code() - 8, // Convert XKB keycodes to evcodes
|
event.get_key_symbol(),
|
||||||
state, -1, null,
|
event.get_key_code() - 8, // Convert XKB keycodes to evcodes
|
||||||
(context, res) => {
|
state, -1, this._cancellable,
|
||||||
try {
|
(context, res) => {
|
||||||
let retval = context.process_key_event_async_finish(res);
|
try {
|
||||||
this.notify_key_event(event, retval);
|
let retval = context.process_key_event_async_finish(res);
|
||||||
} catch (e) {
|
this.notify_key_event(event, retval);
|
||||||
log('Error processing key on IM: ' + e.message);
|
} catch (e) {
|
||||||
}
|
if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
|
||||||
});
|
log(`Error processing key on IM: ${e.message}`);
|
||||||
|
}
|
||||||
|
});
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
const Gio = imports.gi.Gio;
|
/* exported IntrospectService */
|
||||||
const GLib = imports.gi.GLib;
|
const { Gio, GLib, Meta, Shell } = imports.gi;
|
||||||
const Meta = imports.gi.Meta;
|
|
||||||
const Shell = imports.gi.Shell;
|
|
||||||
|
|
||||||
const INTROSPECT_SCHEMA = 'org.gnome.shell';
|
const INTROSPECT_SCHEMA = 'org.gnome.shell';
|
||||||
const INTROSPECT_KEY = 'introspect';
|
const INTROSPECT_KEY = 'introspect';
|
||||||
@@ -45,17 +43,20 @@ var IntrospectService = class {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_isStandaloneApp(app) {
|
_isStandaloneApp(app) {
|
||||||
let windows = app.get_windows();
|
|
||||||
|
|
||||||
return app.get_windows().some(w => w.transient_for == null);
|
return app.get_windows().some(w => w.transient_for == null);
|
||||||
}
|
}
|
||||||
|
|
||||||
_isIntrospectEnabled() {
|
_isIntrospectEnabled() {
|
||||||
return this._settings.get_boolean(INTROSPECT_KEY);
|
return this._settings.get_boolean(INTROSPECT_KEY);
|
||||||
}
|
}
|
||||||
|
|
||||||
_isSenderWhitelisted(sender) {
|
_isSenderWhitelisted(sender) {
|
||||||
return APP_WHITELIST.includes(sender);
|
return APP_WHITELIST.includes(sender);
|
||||||
|
}
|
||||||
|
|
||||||
|
_getSandboxedAppId(app) {
|
||||||
|
let ids = app.get_windows().map(w => w.get_sandboxed_app_id());
|
||||||
|
return ids.find(id => id != null);
|
||||||
}
|
}
|
||||||
|
|
||||||
_syncRunningApplications() {
|
_syncRunningApplications() {
|
||||||
@@ -79,6 +80,10 @@ var IntrospectService = class {
|
|||||||
newActiveApplication = app.get_id();
|
newActiveApplication = app.get_id();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let sandboxedAppId = this._getSandboxedAppId(app);
|
||||||
|
if (sandboxedAppId)
|
||||||
|
appInfo['sandboxed-app-id'] = new GLib.Variant('s', sandboxedAppId);
|
||||||
|
|
||||||
newRunningApplications[app.get_id()] = appInfo;
|
newRunningApplications[app.get_id()] = appInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -122,7 +127,8 @@ var IntrospectService = class {
|
|||||||
let apps = this._appSystem.get_running();
|
let apps = this._appSystem.get_running();
|
||||||
let windowsList = {};
|
let windowsList = {};
|
||||||
|
|
||||||
if (!this._isIntrospectEnabled()) {
|
if (!this._isIntrospectEnabled() &&
|
||||||
|
!this._isSenderWhitelisted(invocation.get_sender())) {
|
||||||
invocation.return_error_literal(Gio.DBusError,
|
invocation.return_error_literal(Gio.DBusError,
|
||||||
Gio.DBusError.ACCESS_DENIED,
|
Gio.DBusError.ACCESS_DENIED,
|
||||||
'App introspection not allowed');
|
'App introspection not allowed');
|
||||||
@@ -140,6 +146,7 @@ var IntrospectService = class {
|
|||||||
let frameRect = window.get_frame_rect();
|
let frameRect = window.get_frame_rect();
|
||||||
let title = window.get_title();
|
let title = window.get_title();
|
||||||
let wmClass = window.get_wm_class();
|
let wmClass = window.get_wm_class();
|
||||||
|
let sandboxedAppId = window.get_sandboxed_app_id();
|
||||||
|
|
||||||
windowsList[windowId] = {
|
windowsList[windowId] = {
|
||||||
'app-id': GLib.Variant.new('s', app.get_id()),
|
'app-id': GLib.Variant.new('s', app.get_id()),
|
||||||
@@ -156,6 +163,10 @@ var IntrospectService = class {
|
|||||||
|
|
||||||
if (wmClass != null)
|
if (wmClass != null)
|
||||||
windowsList[windowId]['wm-class'] = GLib.Variant.new('s', wmClass);
|
windowsList[windowId]['wm-class'] = GLib.Variant.new('s', wmClass);
|
||||||
|
|
||||||
|
if (sandboxedAppId != null)
|
||||||
|
windowsList[windowId]['sandboxed-app-id'] =
|
||||||
|
GLib.Variant.new('s', sandboxedAppId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
invocation.return_value(new GLib.Variant('(a{ta{sv}})', [windowsList]));
|
invocation.return_value(new GLib.Variant('(a{ta{sv}})', [windowsList]));
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||||
|
/* exported getCompletions, getCommonPrefix, getDeclaredConstants */
|
||||||
|
|
||||||
// Returns a list of potential completions for text. Completions either
|
// Returns a list of potential completions for text. Completions either
|
||||||
// follow a dot (e.g. foo.ba -> bar) or they are picked from globalCompletionList (e.g. fo -> foo)
|
// follow a dot (e.g. foo.ba -> bar) or they are picked from globalCompletionList (e.g. fo -> foo)
|
||||||
@@ -8,7 +9,7 @@
|
|||||||
// This function is likely the one you want to call from external modules
|
// This function is likely the one you want to call from external modules
|
||||||
function getCompletions(text, commandHeader, globalCompletionList) {
|
function getCompletions(text, commandHeader, globalCompletionList) {
|
||||||
let methods = [];
|
let methods = [];
|
||||||
let expr, base;
|
let expr_, base;
|
||||||
let attrHead = '';
|
let attrHead = '';
|
||||||
if (globalCompletionList == null) {
|
if (globalCompletionList == null) {
|
||||||
globalCompletionList = [];
|
globalCompletionList = [];
|
||||||
@@ -21,7 +22,7 @@ function getCompletions(text, commandHeader, globalCompletionList) {
|
|||||||
// Look for expressions like "Main.panel.foo" and match Main.panel and foo
|
// Look for expressions like "Main.panel.foo" and match Main.panel and foo
|
||||||
let matches = text.match(/(.*)\.(.*)/);
|
let matches = text.match(/(.*)\.(.*)/);
|
||||||
if (matches) {
|
if (matches) {
|
||||||
[expr, base, attrHead] = matches;
|
[expr_, base, attrHead] = matches;
|
||||||
|
|
||||||
methods = getPropertyNamesFromExpression(base, commandHeader).filter(
|
methods = getPropertyNamesFromExpression(base, commandHeader).filter(
|
||||||
attr => attr.slice(0, attrHead.length) == attrHead
|
attr => attr.slice(0, attrHead.length) == attrHead
|
||||||
@@ -32,7 +33,7 @@ function getCompletions(text, commandHeader, globalCompletionList) {
|
|||||||
// not proceeded by a dot and match them against global constants
|
// not proceeded by a dot and match them against global constants
|
||||||
matches = text.match(/^(\w*)$/);
|
matches = text.match(/^(\w*)$/);
|
||||||
if (text == '' || matches) {
|
if (text == '' || matches) {
|
||||||
[expr, attrHead] = matches;
|
[expr_, attrHead] = matches;
|
||||||
methods = globalCompletionList.filter(
|
methods = globalCompletionList.filter(
|
||||||
attr => attr.slice(0, attrHead.length) == attrHead
|
attr => attr.slice(0, attrHead.length) == attrHead
|
||||||
);
|
);
|
||||||
@@ -51,14 +52,14 @@ function getCompletions(text, commandHeader, globalCompletionList) {
|
|||||||
// if we encounter anything that isn't a letter, '.', ')', or ']',
|
// if we encounter anything that isn't a letter, '.', ')', or ']',
|
||||||
// we should stop parsing.
|
// we should stop parsing.
|
||||||
function isStopChar(c) {
|
function isStopChar(c) {
|
||||||
return !c.match(/[\w\.\)\]]/);
|
return !c.match(/[\w.)\]]/);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Given the ending position of a quoted string, find where it starts
|
// Given the ending position of a quoted string, find where it starts
|
||||||
function findMatchingQuote(expr, offset) {
|
function findMatchingQuote(expr, offset) {
|
||||||
let quoteChar = expr.charAt(offset);
|
let quoteChar = expr.charAt(offset);
|
||||||
for (let i = offset - 1; i >= 0; --i) {
|
for (let i = offset - 1; i >= 0; --i) {
|
||||||
if (expr.charAt(i) == quoteChar && expr.charAt(i-1) != '\\'){
|
if (expr.charAt(i) == quoteChar && expr.charAt(i - 1) != '\\') {
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -68,7 +69,7 @@ function findMatchingQuote(expr, offset) {
|
|||||||
// Given the ending position of a regex, find where it starts
|
// Given the ending position of a regex, find where it starts
|
||||||
function findMatchingSlash(expr, offset) {
|
function findMatchingSlash(expr, offset) {
|
||||||
for (let i = offset - 1; i >= 0; --i) {
|
for (let i = offset - 1; i >= 0; --i) {
|
||||||
if (expr.charAt(i) == '/' && expr.charAt(i-1) != '\\'){
|
if (expr.charAt(i) == '/' && expr.charAt(i - 1) != '\\') {
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -81,7 +82,7 @@ function findMatchingSlash(expr, offset) {
|
|||||||
// findMatchingBrace("[(])", 3) returns 1.
|
// findMatchingBrace("[(])", 3) returns 1.
|
||||||
function findMatchingBrace(expr, offset) {
|
function findMatchingBrace(expr, offset) {
|
||||||
let closeBrace = expr.charAt(offset);
|
let closeBrace = expr.charAt(offset);
|
||||||
let openBrace = ({')': '(', ']': '['})[closeBrace];
|
let openBrace = ({ ')': '(', ']': '[' })[closeBrace];
|
||||||
|
|
||||||
function findTheBrace(expr, offset) {
|
function findTheBrace(expr, offset) {
|
||||||
if (offset < 0) {
|
if (offset < 0) {
|
||||||
@@ -117,11 +118,11 @@ function getExpressionOffset(expr, offset) {
|
|||||||
while (offset >= 0) {
|
while (offset >= 0) {
|
||||||
let currChar = expr.charAt(offset);
|
let currChar = expr.charAt(offset);
|
||||||
|
|
||||||
if (isStopChar(currChar)){
|
if (isStopChar(currChar)) {
|
||||||
return offset + 1;
|
return offset + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (currChar.match(/[\)\]]/)) {
|
if (currChar.match(/[)\]]/)) {
|
||||||
offset = findMatchingBrace(expr, offset);
|
offset = findMatchingBrace(expr, offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -151,15 +152,11 @@ function getAllProps(obj) {
|
|||||||
// e.g., expr="({ foo: null, bar: null, 4: null })" will
|
// e.g., expr="({ foo: null, bar: null, 4: null })" will
|
||||||
// return ["foo", "bar", ...] but the list will not include "4",
|
// return ["foo", "bar", ...] but the list will not include "4",
|
||||||
// since methods accessed with '.' notation must star with a letter or _.
|
// since methods accessed with '.' notation must star with a letter or _.
|
||||||
function getPropertyNamesFromExpression(expr, commandHeader) {
|
function getPropertyNamesFromExpression(expr, commandHeader = '') {
|
||||||
if (commandHeader == null) {
|
|
||||||
commandHeader = '';
|
|
||||||
}
|
|
||||||
|
|
||||||
let obj = {};
|
let obj = {};
|
||||||
if (!isUnsafeExpression(expr)) {
|
if (!isUnsafeExpression(expr)) {
|
||||||
try {
|
try {
|
||||||
obj = eval(commandHeader + expr);
|
obj = eval(commandHeader + expr);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
@@ -168,14 +165,14 @@ function getPropertyNamesFromExpression(expr, commandHeader) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let propsUnique = {};
|
let propsUnique = {};
|
||||||
if (typeof obj === 'object'){
|
if (typeof obj === 'object') {
|
||||||
let allProps = getAllProps(obj);
|
let allProps = getAllProps(obj);
|
||||||
// Get only things we are allowed to complete following a '.'
|
// Get only things we are allowed to complete following a '.'
|
||||||
allProps = allProps.filter( isValidPropertyName );
|
allProps = allProps.filter( isValidPropertyName );
|
||||||
|
|
||||||
// Make sure propsUnique contains one key for every
|
// Make sure propsUnique contains one key for every
|
||||||
// property so we end up with a unique list of properties
|
// property so we end up with a unique list of properties
|
||||||
allProps.map(p => propsUnique[p] = null);
|
allProps.map(p => (propsUnique[p] = null));
|
||||||
}
|
}
|
||||||
return Object.keys(propsUnique).sort();
|
return Object.keys(propsUnique).sort();
|
||||||
}
|
}
|
||||||
@@ -220,7 +217,7 @@ function isUnsafeExpression(str) {
|
|||||||
prunedStr = prunedStr.replace(/[=!]==/g, ''); //replace === and !== with nothing
|
prunedStr = prunedStr.replace(/[=!]==/g, ''); //replace === and !== with nothing
|
||||||
prunedStr = prunedStr.replace(/[=<>!]=/g, ''); //replace ==, <=, >=, != with nothing
|
prunedStr = prunedStr.replace(/[=<>!]=/g, ''); //replace ==, <=, >=, != with nothing
|
||||||
|
|
||||||
if (prunedStr.match(/=/)) {
|
if (prunedStr.match(/[=]/)) {
|
||||||
return true;
|
return true;
|
||||||
} else if (prunedStr.match(/;/)) {
|
} else if (prunedStr.match(/;/)) {
|
||||||
// If we contain a semicolon not inside of a quote/regex, assume we're unsafe as well
|
// If we contain a semicolon not inside of a quote/regex, assume we're unsafe as well
|
||||||
@@ -234,10 +231,10 @@ function isUnsafeExpression(str) {
|
|||||||
function getDeclaredConstants(str) {
|
function getDeclaredConstants(str) {
|
||||||
let ret = [];
|
let ret = [];
|
||||||
str.split(';').forEach(s => {
|
str.split(';').forEach(s => {
|
||||||
let base, keyword;
|
let base_, keyword;
|
||||||
let match = s.match(/const\s+(\w+)\s*=/);
|
let match = s.match(/const\s+(\w+)\s*=/);
|
||||||
if (match) {
|
if (match) {
|
||||||
[base, keyword] = match;
|
[base_, keyword] = match;
|
||||||
ret.push(keyword);
|
ret.push(keyword);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,8 +1,7 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
/* exported getKeyboardManager, holdKeyboard, releaseKeyboard */
|
||||||
|
|
||||||
const GLib = imports.gi.GLib;
|
const { GLib, GnomeDesktop, Meta } = imports.gi;
|
||||||
const GnomeDesktop = imports.gi.GnomeDesktop;
|
|
||||||
const Meta = imports.gi.Meta;
|
|
||||||
|
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
|
|
||||||
@@ -62,7 +61,7 @@ var KeyboardManager = class {
|
|||||||
this._currentKeymap.options == options)
|
this._currentKeymap.options == options)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
this._currentKeymap = {layouts, variants, options};
|
this._currentKeymap = { layouts, variants, options };
|
||||||
Meta.get_backend().set_keymap(layouts, variants, options);
|
Meta.get_backend().set_keymap(layouts, variants, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -127,7 +126,7 @@ var KeyboardManager = class {
|
|||||||
|
|
||||||
_getLocaleLayout() {
|
_getLocaleLayout() {
|
||||||
let locale = GLib.get_language_names()[0];
|
let locale = GLib.get_language_names()[0];
|
||||||
if (locale.indexOf('_') == -1)
|
if (!locale.includes('_'))
|
||||||
locale = DEFAULT_LOCALE;
|
locale = DEFAULT_LOCALE;
|
||||||
|
|
||||||
let [found, , id] = GnomeDesktop.get_input_source_from_locale(locale);
|
let [found, , id] = GnomeDesktop.get_input_source_from_locale(locale);
|
||||||
|
|||||||
@@ -1,9 +1,7 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
/* exported canLock, getLoginManager, registerSessionWithGDM */
|
||||||
|
|
||||||
const GLib = imports.gi.GLib;
|
const { GLib, Gio } = imports.gi;
|
||||||
const Gio = imports.gi.Gio;
|
|
||||||
const Mainloop = imports.mainloop;
|
|
||||||
const Shell = imports.gi.Shell;
|
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
|
|
||||||
const { loadInterfaceXML } = imports.misc.fileUtils;
|
const { loadInterfaceXML } = imports.misc.fileUtils;
|
||||||
@@ -46,11 +44,33 @@ function canLock() {
|
|||||||
|
|
||||||
let version = result.deep_unpack()[0].deep_unpack();
|
let version = result.deep_unpack()[0].deep_unpack();
|
||||||
return haveSystemd() && versionCompare('3.5.91', version);
|
return haveSystemd() && versionCompare('3.5.91', version);
|
||||||
} catch(e) {
|
} catch (e) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function registerSessionWithGDM() {
|
||||||
|
log("Registering session with GDM");
|
||||||
|
Gio.DBus.system.call('org.gnome.DisplayManager',
|
||||||
|
'/org/gnome/DisplayManager/Manager',
|
||||||
|
'org.gnome.DisplayManager.Manager',
|
||||||
|
'RegisterSession',
|
||||||
|
GLib.Variant.new('(a{sv})', [{}]), null,
|
||||||
|
Gio.DBusCallFlags.NONE, -1, null,
|
||||||
|
(source, result) => {
|
||||||
|
try {
|
||||||
|
source.call_finish(result);
|
||||||
|
} catch (e) {
|
||||||
|
if (!e.matches(Gio.DBusError, Gio.DBusError.UNKNOWN_METHOD))
|
||||||
|
log(`Error registering session with GDM: ${e.message}`);
|
||||||
|
else
|
||||||
|
log("Not calling RegisterSession(): method not exported, GDM too old?");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
let _loginManager = null;
|
let _loginManager = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -90,7 +110,7 @@ var LoginManagerSystemd = class {
|
|||||||
let sessionId = GLib.getenv('XDG_SESSION_ID');
|
let sessionId = GLib.getenv('XDG_SESSION_ID');
|
||||||
if (!sessionId) {
|
if (!sessionId) {
|
||||||
log('Unset XDG_SESSION_ID, getCurrentSessionProxy() called outside a user session. Asking logind directly.');
|
log('Unset XDG_SESSION_ID, getCurrentSessionProxy() called outside a user session. Asking logind directly.');
|
||||||
let [session, objectPath] = this._userProxy.Display;
|
let [session, objectPath_] = this._userProxy.Display;
|
||||||
if (session) {
|
if (session) {
|
||||||
log(`Will monitor session ${session}`);
|
log(`Will monitor session ${session}`);
|
||||||
sessionId = session;
|
sessionId = session;
|
||||||
@@ -163,10 +183,10 @@ var LoginManagerSystemd = class {
|
|||||||
(proxy, result) => {
|
(proxy, result) => {
|
||||||
let fd = -1;
|
let fd = -1;
|
||||||
try {
|
try {
|
||||||
let [outVariant, fdList] = proxy.call_with_unix_fd_list_finish(result);
|
let [outVariant_, fdList] = proxy.call_with_unix_fd_list_finish(result);
|
||||||
fd = fdList.steal_fds()[0];
|
fd = fdList.steal_fds()[0];
|
||||||
callback(new Gio.UnixInputStream({ fd: fd }));
|
callback(new Gio.UnixInputStream({ fd: fd }));
|
||||||
} catch(e) {
|
} catch (e) {
|
||||||
logError(e, "Error getting systemd inhibitor");
|
logError(e, "Error getting systemd inhibitor");
|
||||||
callback(null);
|
callback(null);
|
||||||
}
|
}
|
||||||
@@ -180,7 +200,7 @@ var LoginManagerSystemd = class {
|
|||||||
Signals.addSignalMethods(LoginManagerSystemd.prototype);
|
Signals.addSignalMethods(LoginManagerSystemd.prototype);
|
||||||
|
|
||||||
var LoginManagerDummy = class {
|
var LoginManagerDummy = class {
|
||||||
getCurrentSessionProxy(callback) {
|
getCurrentSessionProxy(_callback) {
|
||||||
// we could return a DummySession object that fakes whatever callers
|
// we could return a DummySession object that fakes whatever callers
|
||||||
// expect (at the time of writing: connect() and connectSignal()
|
// expect (at the time of writing: connect() and connectSignal()
|
||||||
// methods), but just never calling the callback should be safer
|
// methods), but just never calling the callback should be safer
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
|
||||||
const Gio = imports.gi.Gio;
|
const { Gio, NMA } = imports.gi;
|
||||||
const NMA = imports.gi.NMA;
|
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
|
|
||||||
const { loadInterfaceXML } = imports.misc.fileUtils;
|
const { loadInterfaceXML } = imports.misc.fileUtils;
|
||||||
@@ -27,33 +26,33 @@ function _getMobileProvidersDatabase() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// _findProviderForMccMnc:
|
// _findProviderForMccMnc:
|
||||||
// @operator_name: operator name
|
// @operatorName: operator name
|
||||||
// @operator_code: operator code
|
// @operatorCode: operator code
|
||||||
//
|
//
|
||||||
// Given an operator name string (which may not be a real operator name) and an
|
// Given an operator name string (which may not be a real operator name) and an
|
||||||
// operator code string, tries to find a proper operator name to display.
|
// operator code string, tries to find a proper operator name to display.
|
||||||
//
|
//
|
||||||
function _findProviderForMccMnc(operator_name, operator_code) {
|
function _findProviderForMccMnc(operatorName, operatorCode) {
|
||||||
if (operator_name) {
|
if (operatorName) {
|
||||||
if (operator_name.length != 0 &&
|
if (operatorName.length != 0 &&
|
||||||
(operator_name.length > 6 || operator_name.length < 5)) {
|
(operatorName.length > 6 || operatorName.length < 5)) {
|
||||||
// this looks like a valid name, i.e. not an MCCMNC (that some
|
// this looks like a valid name, i.e. not an MCCMNC (that some
|
||||||
// devices return when not yet connected
|
// devices return when not yet connected
|
||||||
return operator_name;
|
return operatorName;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isNaN(parseInt(operator_name))) {
|
if (isNaN(parseInt(operatorName))) {
|
||||||
// name is definitely not a MCCMNC, so it may be a name
|
// name is definitely not a MCCMNC, so it may be a name
|
||||||
// after all; return that
|
// after all; return that
|
||||||
return operator_name;
|
return operatorName;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let needle;
|
let needle;
|
||||||
if ((!operator_name || operator_name.length == 0) && operator_code)
|
if ((!operatorName || operatorName.length == 0) && operatorCode)
|
||||||
needle = operator_code;
|
needle = operatorCode;
|
||||||
else if (operator_name && (operator_name.length == 6 || operator_name.length == 5))
|
else if (operatorName && (operatorName.length == 6 || operatorName.length == 5))
|
||||||
needle = operator_name;
|
needle = operatorName;
|
||||||
else // nothing to search
|
else // nothing to search
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
@@ -72,7 +71,7 @@ function _findProviderForMccMnc(operator_name, operator_code) {
|
|||||||
// Tries to find the operator name corresponding to the given SID
|
// Tries to find the operator name corresponding to the given SID
|
||||||
//
|
//
|
||||||
function _findProviderForSid(sid) {
|
function _findProviderForSid(sid) {
|
||||||
if (sid == 0)
|
if (!sid)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
let mpd = _getMobileProvidersDatabase();
|
let mpd = _getMobileProvidersDatabase();
|
||||||
@@ -85,9 +84,9 @@ function _findProviderForSid(sid) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
// ----------------------------------------------------- //
|
||||||
// Support for the old ModemManager interface (MM < 0.7)
|
// Support for the old ModemManager interface (MM < 0.7) //
|
||||||
//------------------------------------------------------------------------------
|
// ----------------------------------------------------- //
|
||||||
|
|
||||||
|
|
||||||
// The following are not the complete interfaces, just the methods we need
|
// The following are not the complete interfaces, just the methods we need
|
||||||
@@ -111,7 +110,7 @@ var ModemGsm = class {
|
|||||||
this.signal_quality = quality;
|
this.signal_quality = quality;
|
||||||
this.emit('notify::signal-quality');
|
this.emit('notify::signal-quality');
|
||||||
});
|
});
|
||||||
this._proxy.connectSignal('RegistrationInfo', (proxy, sender, [status, code, name]) => {
|
this._proxy.connectSignal('RegistrationInfo', (proxy, sender, [_status, code, name]) => {
|
||||||
this.operator_name = _findProviderForMccMnc(name, code);
|
this.operator_name = _findProviderForMccMnc(name, code);
|
||||||
this.emit('notify::operator-name');
|
this.emit('notify::operator-name');
|
||||||
});
|
});
|
||||||
@@ -121,7 +120,7 @@ var ModemGsm = class {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let [status, code, name] = result;
|
let [status_, code, name] = result;
|
||||||
this.operator_name = _findProviderForMccMnc(name, code);
|
this.operator_name = _findProviderForMccMnc(name, code);
|
||||||
this.emit('notify::operator-name');
|
this.emit('notify::operator-name');
|
||||||
});
|
});
|
||||||
@@ -172,9 +171,9 @@ var ModemCdma = class {
|
|||||||
// it will return an error if the device is not connected
|
// it will return an error if the device is not connected
|
||||||
this.operator_name = null;
|
this.operator_name = null;
|
||||||
} else {
|
} else {
|
||||||
let [bandClass, band, sid] = result;
|
let [bandClass_, band_, sid] = result;
|
||||||
|
|
||||||
this.operator_name = _findProviderForSid(sid)
|
this.operator_name = _findProviderForSid(sid);
|
||||||
}
|
}
|
||||||
this.emit('notify::operator-name');
|
this.emit('notify::operator-name');
|
||||||
});
|
});
|
||||||
@@ -183,9 +182,9 @@ var ModemCdma = class {
|
|||||||
Signals.addSignalMethods(ModemCdma.prototype);
|
Signals.addSignalMethods(ModemCdma.prototype);
|
||||||
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
// ------------------------------------------------------- //
|
||||||
// Support for the new ModemManager1 interface (MM >= 0.7)
|
// Support for the new ModemManager1 interface (MM >= 0.7) //
|
||||||
//------------------------------------------------------------------------------
|
// ------------------------------------------------------- //
|
||||||
|
|
||||||
const BroadbandModemInterface = loadInterfaceXML('org.freedesktop.ModemManager1.Modem');
|
const BroadbandModemInterface = loadInterfaceXML('org.freedesktop.ModemManager1.Modem');
|
||||||
const BroadbandModemProxy = Gio.DBusProxy.makeProxyWrapper(BroadbandModemInterface);
|
const BroadbandModemProxy = Gio.DBusProxy.makeProxyWrapper(BroadbandModemInterface);
|
||||||
@@ -225,23 +224,23 @@ var BroadbandModem = class {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_reloadSignalQuality() {
|
_reloadSignalQuality() {
|
||||||
let [quality, recent] = this._proxy.SignalQuality;
|
let [quality, recent_] = this._proxy.SignalQuality;
|
||||||
this.signal_quality = quality;
|
this.signal_quality = quality;
|
||||||
this.emit('notify::signal-quality');
|
this.emit('notify::signal-quality');
|
||||||
}
|
}
|
||||||
|
|
||||||
_reloadOperatorName() {
|
_reloadOperatorName() {
|
||||||
let new_name = "";
|
let newName = "";
|
||||||
if (this.operator_name_3gpp && this.operator_name_3gpp.length > 0)
|
if (this.operator_name_3gpp && this.operator_name_3gpp.length > 0)
|
||||||
new_name += this.operator_name_3gpp;
|
newName += this.operator_name_3gpp;
|
||||||
|
|
||||||
if (this.operator_name_cdma && this.operator_name_cdma.length > 0) {
|
if (this.operator_name_cdma && this.operator_name_cdma.length > 0) {
|
||||||
if (new_name != "")
|
if (newName != "")
|
||||||
new_name += ", ";
|
newName += ", ";
|
||||||
new_name += this.operator_name_cdma;
|
newName += this.operator_name_cdma;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.operator_name = new_name;
|
this.operator_name = newName;
|
||||||
this.emit('notify::operator-name');
|
this.emit('notify::operator-name');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
|
||||||
const Gio = imports.gi.Gio;
|
const { Gio, GLib } = imports.gi;
|
||||||
const GLib = imports.gi.GLib;
|
|
||||||
const Params = imports.misc.params;
|
const Params = imports.misc.params;
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
|
|
||||||
@@ -78,54 +77,51 @@ var ObjectManager = class {
|
|||||||
let info = this._interfaceInfos[interfaceName];
|
let info = this._interfaceInfos[interfaceName];
|
||||||
|
|
||||||
if (!info) {
|
if (!info) {
|
||||||
if (onFinished)
|
if (onFinished)
|
||||||
onFinished();
|
onFinished();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let proxy = new Gio.DBusProxy({ g_connection: this._connection,
|
let proxy = new Gio.DBusProxy({ g_connection: this._connection,
|
||||||
g_name: this._serviceName,
|
g_name: this._serviceName,
|
||||||
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.DO_NOT_AUTO_START });
|
g_flags: Gio.DBusProxyFlags.DO_NOT_AUTO_START });
|
||||||
|
|
||||||
proxy.init_async(GLib.PRIORITY_DEFAULT,
|
proxy.init_async(GLib.PRIORITY_DEFAULT, this._cancellable, (initable, result) => {
|
||||||
this._cancellable,
|
try {
|
||||||
(initable, result) => {
|
initable.init_finish(result);
|
||||||
let error = null;
|
} catch (e) {
|
||||||
try {
|
logError(e, `could not initialize proxy for interface ${interfaceName}`);
|
||||||
initable.init_finish(result);
|
|
||||||
} catch(e) {
|
|
||||||
logError(e, 'could not initialize proxy for interface ' + interfaceName);
|
|
||||||
|
|
||||||
if (onFinished)
|
if (onFinished)
|
||||||
onFinished();
|
onFinished();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let isNewObject;
|
let isNewObject;
|
||||||
if (!this._objects[objectPath]) {
|
if (!this._objects[objectPath]) {
|
||||||
this._objects[objectPath] = {};
|
this._objects[objectPath] = {};
|
||||||
isNewObject = true;
|
isNewObject = true;
|
||||||
} else {
|
} else {
|
||||||
isNewObject = false;
|
isNewObject = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
this._objects[objectPath][interfaceName] = proxy;
|
this._objects[objectPath][interfaceName] = proxy;
|
||||||
|
|
||||||
if (!this._interfaces[interfaceName])
|
if (!this._interfaces[interfaceName])
|
||||||
this._interfaces[interfaceName] = [];
|
this._interfaces[interfaceName] = [];
|
||||||
|
|
||||||
this._interfaces[interfaceName].push(proxy);
|
this._interfaces[interfaceName].push(proxy);
|
||||||
|
|
||||||
if (isNewObject)
|
if (isNewObject)
|
||||||
this.emit('object-added', objectPath);
|
this.emit('object-added', objectPath);
|
||||||
|
|
||||||
this.emit('interface-added', interfaceName, proxy);
|
this.emit('interface-added', interfaceName, proxy);
|
||||||
|
|
||||||
if (onFinished)
|
if (onFinished)
|
||||||
onFinished();
|
onFinished();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -156,11 +152,10 @@ var ObjectManager = class {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_onManagerProxyLoaded(initable, result) {
|
_onManagerProxyLoaded(initable, result) {
|
||||||
let error = null;
|
|
||||||
try {
|
try {
|
||||||
initable.init_finish(result);
|
initable.init_finish(result);
|
||||||
} catch(e) {
|
} catch (e) {
|
||||||
logError(e, 'could not initialize object manager for object ' + params.name);
|
logError(e, `could not initialize object manager for object ${this._serviceName}`);
|
||||||
|
|
||||||
this._tryToCompleteLoad();
|
this._tryToCompleteLoad();
|
||||||
return;
|
return;
|
||||||
@@ -198,7 +193,7 @@ var ObjectManager = class {
|
|||||||
this._managerProxy.GetManagedObjectsRemote((result, error) => {
|
this._managerProxy.GetManagedObjectsRemote((result, error) => {
|
||||||
if (!result) {
|
if (!result) {
|
||||||
if (error) {
|
if (error) {
|
||||||
logError(error, 'could not get remote objects for service ' + this._serviceName + ' path ' + this._managerPath);
|
logError(error, `could not get remote objects for service ${this._serviceName} path ${this._managerPath}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
this._tryToCompleteLoad();
|
this._tryToCompleteLoad();
|
||||||
@@ -281,8 +276,8 @@ var ObjectManager = class {
|
|||||||
let object = this._objects[objectPaths];
|
let object = this._objects[objectPaths];
|
||||||
|
|
||||||
let interfaceNames = Object.keys(object);
|
let interfaceNames = Object.keys(object);
|
||||||
for (let j = 0; i < interfaceNames.length; i++) {
|
for (let j = 0; j < interfaceNames.length; j++) {
|
||||||
let interfaceName = interfaceNames[i];
|
let interfaceName = interfaceNames[j];
|
||||||
if (object[interfaceName])
|
if (object[interfaceName])
|
||||||
proxies.push(object(interfaceName));
|
proxies.push(object(interfaceName));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
/* exported parse */
|
||||||
|
|
||||||
// parse:
|
// parse:
|
||||||
// @params: caller-provided parameter object, or %null
|
// @params: caller-provided parameter object, or %null
|
||||||
@@ -14,22 +15,13 @@
|
|||||||
//
|
//
|
||||||
// Return value: a new object, containing the merged parameters from
|
// Return value: a new object, containing the merged parameters from
|
||||||
// @params and @defaults
|
// @params and @defaults
|
||||||
function parse(params, defaults, allowExtras) {
|
function parse(params = {}, defaults, allowExtras) {
|
||||||
let ret = {}, prop;
|
if (!allowExtras) {
|
||||||
|
for (let prop in params)
|
||||||
if (!params)
|
if (!(prop in defaults))
|
||||||
params = {};
|
throw new Error(`Unrecognized parameter "${prop}"`);
|
||||||
|
|
||||||
for (prop in params) {
|
|
||||||
if (!(prop in defaults) && !allowExtras)
|
|
||||||
throw new Error('Unrecognized parameter "' + prop + '"');
|
|
||||||
ret[prop] = params[prop];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (prop in defaults) {
|
let defaultsCopy = Object.assign({}, defaults);
|
||||||
if (!(prop in params))
|
return Object.assign(defaultsCopy, params);
|
||||||
ret[prop] = defaults[prop];
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
/* exported PermissionStore */
|
||||||
|
|
||||||
const Gio = imports.gi.Gio;
|
const Gio = imports.gi.Gio;
|
||||||
|
|
||||||
@@ -12,4 +13,4 @@ function PermissionStore(initCallback, cancellable) {
|
|||||||
'org.freedesktop.impl.portal.PermissionStore',
|
'org.freedesktop.impl.portal.PermissionStore',
|
||||||
'/org/freedesktop/impl/portal/PermissionStore',
|
'/org/freedesktop/impl/portal/PermissionStore',
|
||||||
initCallback, cancellable);
|
initCallback, cancellable);
|
||||||
};
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
/* exported getSmartcardManager */
|
||||||
|
|
||||||
const Gio = imports.gi.Gio;
|
const Gio = imports.gi.Gio;
|
||||||
const Shell = imports.gi.Shell;
|
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
|
|
||||||
const ObjectManager = imports.misc.objectManager;
|
const ObjectManager = imports.misc.objectManager;
|
||||||
@@ -30,7 +30,7 @@ var SmartcardManager = class {
|
|||||||
this._objectManager = new ObjectManager.ObjectManager({ connection: Gio.DBus.session,
|
this._objectManager = new ObjectManager.ObjectManager({ connection: Gio.DBus.session,
|
||||||
name: "org.gnome.SettingsDaemon.Smartcard",
|
name: "org.gnome.SettingsDaemon.Smartcard",
|
||||||
objectPath: '/org/gnome/SettingsDaemon/Smartcard',
|
objectPath: '/org/gnome/SettingsDaemon/Smartcard',
|
||||||
knownInterfaces: [ SmartcardTokenIface ],
|
knownInterfaces: [SmartcardTokenIface],
|
||||||
onLoaded: this._onLoaded.bind(this) });
|
onLoaded: this._onLoaded.bind(this) });
|
||||||
this._insertedTokens = {};
|
this._insertedTokens = {};
|
||||||
this._loginToken = null;
|
this._loginToken = null;
|
||||||
|
|||||||
@@ -1,10 +1,5 @@
|
|||||||
const AccountsService = imports.gi.AccountsService;
|
/* exported getDefault */
|
||||||
const Clutter = imports.gi.Clutter;
|
const { AccountsService, Clutter, Gdm, Gio, GLib, GObject, Meta } = imports.gi;
|
||||||
const Gdm = imports.gi.Gdm;
|
|
||||||
const Gio = imports.gi.Gio;
|
|
||||||
const GLib = imports.gi.GLib;
|
|
||||||
const Meta = imports.gi.Meta;
|
|
||||||
const GObject = imports.gi.GObject;
|
|
||||||
|
|
||||||
const GnomeSession = imports.misc.gnomeSession;
|
const GnomeSession = imports.misc.gnomeSession;
|
||||||
const LoginManager = imports.misc.loginManager;
|
const LoginManager = imports.misc.loginManager;
|
||||||
@@ -89,48 +84,54 @@ const SystemActions = GObject.registerClass({
|
|||||||
this._canHaveSuspend = true;
|
this._canHaveSuspend = true;
|
||||||
|
|
||||||
this._actions = new Map();
|
this._actions = new Map();
|
||||||
this._actions.set(POWER_OFF_ACTION_ID,
|
this._actions.set(POWER_OFF_ACTION_ID, {
|
||||||
{ // Translators: The name of the power-off action in search
|
// Translators: The name of the power-off action in search
|
||||||
name: C_("search-result", "Power Off"),
|
name: C_("search-result", "Power Off"),
|
||||||
iconName: 'system-shutdown-symbolic',
|
iconName: 'system-shutdown-symbolic',
|
||||||
// Translators: A list of keywords that match the power-off action, separated by semicolons
|
// Translators: A list of keywords that match the power-off action, separated by semicolons
|
||||||
keywords: _("power off;shutdown;reboot;restart").split(';'),
|
keywords: _("power off;shutdown;reboot;restart").split(/[; ]/),
|
||||||
available: false });
|
available: false
|
||||||
this._actions.set(LOCK_SCREEN_ACTION_ID,
|
});
|
||||||
{ // Translators: The name of the lock screen action in search
|
this._actions.set(LOCK_SCREEN_ACTION_ID, {
|
||||||
name: C_("search-result", "Lock Screen"),
|
// Translators: The name of the lock screen action in search
|
||||||
iconName: 'system-lock-screen-symbolic',
|
name: C_("search-result", "Lock Screen"),
|
||||||
// Translators: A list of keywords that match the lock screen action, separated by semicolons
|
iconName: 'system-lock-screen-symbolic',
|
||||||
keywords: _("lock screen").split(';'),
|
// Translators: A list of keywords that match the lock screen action, separated by semicolons
|
||||||
available: false });
|
keywords: _("lock screen").split(/[; ]/),
|
||||||
this._actions.set(LOGOUT_ACTION_ID,
|
available: false
|
||||||
{ // Translators: The name of the logout action in search
|
});
|
||||||
name: C_("search-result", "Log Out"),
|
this._actions.set(LOGOUT_ACTION_ID, {
|
||||||
iconName: 'application-exit-symbolic',
|
// Translators: The name of the logout action in search
|
||||||
// Translators: A list of keywords that match the logout action, separated by semicolons
|
name: C_("search-result", "Log Out"),
|
||||||
keywords: _("logout;sign off").split(';'),
|
iconName: 'application-exit-symbolic',
|
||||||
available: false });
|
// Translators: A list of keywords that match the logout action, separated by semicolons
|
||||||
this._actions.set(SUSPEND_ACTION_ID,
|
keywords: _("logout;log out;sign off").split(/[; ]/),
|
||||||
{ // Translators: The name of the suspend action in search
|
available: false
|
||||||
name: C_("search-result", "Suspend"),
|
});
|
||||||
iconName: 'media-playback-pause-symbolic',
|
this._actions.set(SUSPEND_ACTION_ID, {
|
||||||
// Translators: A list of keywords that match the suspend action, separated by semicolons
|
// Translators: The name of the suspend action in search
|
||||||
keywords: _("suspend;sleep").split(';'),
|
name: C_("search-result", "Suspend"),
|
||||||
available: false });
|
iconName: 'media-playback-pause-symbolic',
|
||||||
this._actions.set(SWITCH_USER_ACTION_ID,
|
// Translators: A list of keywords that match the suspend action, separated by semicolons
|
||||||
{ // Translators: The name of the switch user action in search
|
keywords: _("suspend;sleep").split(/[; ]/),
|
||||||
name: C_("search-result", "Switch User"),
|
available: false
|
||||||
iconName: 'system-switch-user-symbolic',
|
});
|
||||||
// Translators: A list of keywords that match the switch user action, separated by semicolons
|
this._actions.set(SWITCH_USER_ACTION_ID, {
|
||||||
keywords: _("switch user").split(';'),
|
// Translators: The name of the switch user action in search
|
||||||
available: false });
|
name: C_("search-result", "Switch User"),
|
||||||
this._actions.set(LOCK_ORIENTATION_ACTION_ID,
|
iconName: 'system-switch-user-symbolic',
|
||||||
{ // Translators: The name of the lock orientation action in search
|
// Translators: A list of keywords that match the switch user action, separated by semicolons
|
||||||
name: C_("search-result", "Lock Orientation"),
|
keywords: _("switch user").split(/[; ]/),
|
||||||
iconName: '',
|
available: false
|
||||||
// Translators: A list of keywords that match the lock orientation action, separated by semicolons
|
});
|
||||||
keywords: _("lock orientation;screen;rotation").split(';'),
|
this._actions.set(LOCK_ORIENTATION_ACTION_ID, {
|
||||||
available: false });
|
// 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;screen;rotation").split(/[; ]/),
|
||||||
|
available: false
|
||||||
|
});
|
||||||
|
|
||||||
this._loginScreenSettings = new Gio.Settings({ schema_id: LOGIN_SCREEN_SCHEMA });
|
this._loginScreenSettings = new Gio.Settings({ schema_id: LOGIN_SCREEN_SCHEMA });
|
||||||
this._lockdownSettings = new Gio.Settings({ schema_id: LOCKDOWN_SCHEMA });
|
this._lockdownSettings = new Gio.Settings({ schema_id: LOCKDOWN_SCHEMA });
|
||||||
@@ -143,92 +144,96 @@ const SystemActions = GObject.registerClass({
|
|||||||
this._userManager = AccountsService.UserManager.get_default();
|
this._userManager = AccountsService.UserManager.get_default();
|
||||||
|
|
||||||
this._userManager.connect('notify::is-loaded',
|
this._userManager.connect('notify::is-loaded',
|
||||||
() => { this._updateMultiUser(); });
|
() => this._updateMultiUser());
|
||||||
this._userManager.connect('notify::has-multiple-users',
|
this._userManager.connect('notify::has-multiple-users',
|
||||||
() => { this._updateMultiUser(); });
|
() => this._updateMultiUser());
|
||||||
this._userManager.connect('user-added',
|
this._userManager.connect('user-added',
|
||||||
() => { this._updateMultiUser(); });
|
() => this._updateMultiUser());
|
||||||
this._userManager.connect('user-removed',
|
this._userManager.connect('user-removed',
|
||||||
() => { this._updateMultiUser(); });
|
() => this._updateMultiUser());
|
||||||
|
|
||||||
this._lockdownSettings.connect('changed::' + DISABLE_USER_SWITCH_KEY,
|
this._lockdownSettings.connect(`changed::${DISABLE_USER_SWITCH_KEY}`,
|
||||||
() => { this._updateSwitchUser(); });
|
() => this._updateSwitchUser());
|
||||||
this._lockdownSettings.connect('changed::' + DISABLE_LOG_OUT_KEY,
|
this._lockdownSettings.connect(`changed::${DISABLE_LOG_OUT_KEY}`,
|
||||||
() => { this._updateLogout(); });
|
() => this._updateLogout());
|
||||||
global.settings.connect('changed::' + ALWAYS_SHOW_LOG_OUT_KEY,
|
global.settings.connect(`changed::${ALWAYS_SHOW_LOG_OUT_KEY}`,
|
||||||
() => { this._updateLogout(); });
|
() => this._updateLogout());
|
||||||
|
|
||||||
this._lockdownSettings.connect('changed::' + DISABLE_LOCK_SCREEN_KEY,
|
this._lockdownSettings.connect(`changed::${DISABLE_LOCK_SCREEN_KEY}`,
|
||||||
() => { this._updateLockScreen(); });
|
() => this._updateLockScreen());
|
||||||
|
|
||||||
this._lockdownSettings.connect('changed::' + DISABLE_LOG_OUT_KEY,
|
this._lockdownSettings.connect(`changed::${DISABLE_LOG_OUT_KEY}`,
|
||||||
() => { this._updateHaveShutdown(); });
|
() => this._updateHaveShutdown());
|
||||||
|
|
||||||
this.forceUpdate();
|
this.forceUpdate();
|
||||||
|
|
||||||
this._orientationSettings.connect('changed::orientation-lock',
|
this._orientationSettings.connect('changed::orientation-lock',
|
||||||
() => { this._updateOrientationLock();
|
() => {
|
||||||
this._updateOrientationLockIcon(); });
|
this._updateOrientationLock();
|
||||||
|
this._updateOrientationLockIcon();
|
||||||
|
});
|
||||||
Main.layoutManager.connect('monitors-changed',
|
Main.layoutManager.connect('monitors-changed',
|
||||||
() => { this._updateOrientationLock(); });
|
() => this._updateOrientationLock());
|
||||||
Gio.DBus.system.watch_name(SENSOR_BUS_NAME,
|
this._sensorProxy = new SensorProxy(Gio.DBus.system,
|
||||||
Gio.BusNameWatcherFlags.NONE,
|
SENSOR_BUS_NAME,
|
||||||
() => { this._sensorProxyAppeared(); },
|
SENSOR_OBJECT_PATH,
|
||||||
() => {
|
(proxy, error) => {
|
||||||
this._sensorProxy = null;
|
if (error)
|
||||||
this._updateOrientationLock();
|
log(error.message);
|
||||||
});
|
},
|
||||||
|
null,
|
||||||
|
Gio.DBusProxyFlags.DO_NOT_AUTO_START);
|
||||||
|
this._sensorProxy.connect('g-properties-changed', () => {
|
||||||
|
this._updateOrientationLock();
|
||||||
|
});
|
||||||
|
this._sensorProxy.connect('notify::g-name-owner', () => {
|
||||||
|
this._updateOrientationLock();
|
||||||
|
});
|
||||||
this._updateOrientationLock();
|
this._updateOrientationLock();
|
||||||
this._updateOrientationLockIcon();
|
this._updateOrientationLockIcon();
|
||||||
|
|
||||||
Main.sessionMode.connect('updated', () => { this._sessionUpdated(); });
|
Main.sessionMode.connect('updated', () => this._sessionUpdated());
|
||||||
this._sessionUpdated();
|
this._sessionUpdated();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line camelcase
|
||||||
get can_power_off() {
|
get can_power_off() {
|
||||||
return this._actions.get(POWER_OFF_ACTION_ID).available;
|
return this._actions.get(POWER_OFF_ACTION_ID).available;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line camelcase
|
||||||
get can_suspend() {
|
get can_suspend() {
|
||||||
return this._actions.get(SUSPEND_ACTION_ID).available;
|
return this._actions.get(SUSPEND_ACTION_ID).available;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line camelcase
|
||||||
get can_lock_screen() {
|
get can_lock_screen() {
|
||||||
return this._actions.get(LOCK_SCREEN_ACTION_ID).available;
|
return this._actions.get(LOCK_SCREEN_ACTION_ID).available;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line camelcase
|
||||||
get can_switch_user() {
|
get can_switch_user() {
|
||||||
return this._actions.get(SWITCH_USER_ACTION_ID).available;
|
return this._actions.get(SWITCH_USER_ACTION_ID).available;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line camelcase
|
||||||
get can_logout() {
|
get can_logout() {
|
||||||
return this._actions.get(LOGOUT_ACTION_ID).available;
|
return this._actions.get(LOGOUT_ACTION_ID).available;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line camelcase
|
||||||
get can_lock_orientation() {
|
get can_lock_orientation() {
|
||||||
return this._actions.get(LOCK_ORIENTATION_ACTION_ID).available;
|
return this._actions.get(LOCK_ORIENTATION_ACTION_ID).available;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line camelcase
|
||||||
get orientation_lock_icon() {
|
get orientation_lock_icon() {
|
||||||
return this._actions.get(LOCK_ORIENTATION_ACTION_ID).iconName;
|
return this._actions.get(LOCK_ORIENTATION_ACTION_ID).iconName;
|
||||||
}
|
}
|
||||||
|
|
||||||
_sensorProxyAppeared() {
|
|
||||||
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() {
|
_updateOrientationLock() {
|
||||||
let available = false;
|
let available = false;
|
||||||
if (this._sensorProxy)
|
if (this._sensorProxy.g_name_owner)
|
||||||
available = this._sensorProxy.HasAccelerometer &&
|
available = this._sensorProxy.HasAccelerometer &&
|
||||||
this._monitorManager.get_is_builtin_display_on();
|
this._monitorManager.get_is_builtin_display_on();
|
||||||
|
|
||||||
@@ -239,8 +244,9 @@ const SystemActions = GObject.registerClass({
|
|||||||
|
|
||||||
_updateOrientationLockIcon() {
|
_updateOrientationLockIcon() {
|
||||||
let locked = this._orientationSettings.get_boolean('orientation-lock');
|
let locked = this._orientationSettings.get_boolean('orientation-lock');
|
||||||
let iconName = locked ? 'rotation-locked-symbolic'
|
let iconName = locked
|
||||||
: 'rotation-allowed-symbolic';
|
? 'rotation-locked-symbolic'
|
||||||
|
: 'rotation-allowed-symbolic';
|
||||||
this._actions.get(LOCK_ORIENTATION_ACTION_ID).iconName = iconName;
|
this._actions.get(LOCK_ORIENTATION_ACTION_ID).iconName = iconName;
|
||||||
|
|
||||||
this.notify('orientation-lock-icon');
|
this.notify('orientation-lock-icon');
|
||||||
@@ -263,12 +269,12 @@ const SystemActions = GObject.registerClass({
|
|||||||
|
|
||||||
getMatchingActions(terms) {
|
getMatchingActions(terms) {
|
||||||
// terms is a list of strings
|
// terms is a list of strings
|
||||||
terms = terms.map((term) => { return term.toLowerCase(); });
|
terms = terms.map(term => term.toLowerCase());
|
||||||
|
|
||||||
let results = [];
|
let results = [];
|
||||||
|
|
||||||
for (let [key, {available, keywords}] of this._actions)
|
for (let [key, { available, keywords }] of this._actions)
|
||||||
if (available && terms.every(t => keywords.some(k => (k.indexOf(t) >= 0))))
|
if (available && terms.every(t => keywords.some(k => k.startsWith(t))))
|
||||||
results.push(key);
|
results.push(key);
|
||||||
|
|
||||||
return results;
|
return results;
|
||||||
@@ -284,24 +290,24 @@ const SystemActions = GObject.registerClass({
|
|||||||
|
|
||||||
activateAction(id) {
|
activateAction(id) {
|
||||||
switch (id) {
|
switch (id) {
|
||||||
case POWER_OFF_ACTION_ID:
|
case POWER_OFF_ACTION_ID:
|
||||||
this.activatePowerOff();
|
this.activatePowerOff();
|
||||||
break;
|
break;
|
||||||
case LOCK_SCREEN_ACTION_ID:
|
case LOCK_SCREEN_ACTION_ID:
|
||||||
this.activateLockScreen();
|
this.activateLockScreen();
|
||||||
break;
|
break;
|
||||||
case LOGOUT_ACTION_ID:
|
case LOGOUT_ACTION_ID:
|
||||||
this.activateLogout();
|
this.activateLogout();
|
||||||
break;
|
break;
|
||||||
case SUSPEND_ACTION_ID:
|
case SUSPEND_ACTION_ID:
|
||||||
this.activateSuspend();
|
this.activateSuspend();
|
||||||
break;
|
break;
|
||||||
case SWITCH_USER_ACTION_ID:
|
case SWITCH_USER_ACTION_ID:
|
||||||
this.activateSwitchUser();
|
this.activateSwitchUser();
|
||||||
break;
|
break;
|
||||||
case LOCK_ORIENTATION_ACTION_ID:
|
case LOCK_ORIENTATION_ACTION_ID:
|
||||||
this.activateLockOrientation();
|
this.activateLockOrientation();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
174
js/misc/util.js
@@ -1,28 +1,23 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
/* exported findUrls, spawn, spawnCommandLine, spawnApp, trySpawnCommandLine,
|
||||||
|
formatTime, formatTimeSpan, createTimeLabel, insertSorted,
|
||||||
|
makeCloseButton, ensureActorVisibleInScrollView */
|
||||||
|
|
||||||
const Clutter = imports.gi.Clutter;
|
const { Clutter, Gio, GLib, GObject, Shell, St } = imports.gi;
|
||||||
const Gettext = imports.gettext;
|
const Gettext = imports.gettext;
|
||||||
const Gio = imports.gi.Gio;
|
|
||||||
const GLib = imports.gi.GLib;
|
|
||||||
const GObject = imports.gi.GObject;
|
|
||||||
const Mainloop = imports.mainloop;
|
|
||||||
const Signals = imports.signals;
|
|
||||||
const Shell = imports.gi.Shell;
|
|
||||||
const St = imports.gi.St;
|
|
||||||
|
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const Tweener = imports.ui.tweener;
|
|
||||||
const Params = imports.misc.params;
|
const Params = imports.misc.params;
|
||||||
|
|
||||||
var SCROLL_TIME = 0.1;
|
var SCROLL_TIME = 100;
|
||||||
|
|
||||||
// http://daringfireball.net/2010/07/improved_regex_for_matching_urls
|
// http://daringfireball.net/2010/07/improved_regex_for_matching_urls
|
||||||
const _balancedParens = '\\([^\\s()<>]+\\)';
|
const _balancedParens = '\\([^\\s()<>]+\\)';
|
||||||
const _leadingJunk = '[\\s`(\\[{\'\\"<\u00AB\u201C\u2018]';
|
const _leadingJunk = '[\\s`(\\[{\'\\"<\u00AB\u201C\u2018]';
|
||||||
const _notTrailingJunk = '[^\\s`!()\\[\\]{};:\'\\".,<>?\u00AB\u00BB\u201C\u201D\u2018\u2019]';
|
const _notTrailingJunk = '[^\\s`!()\\[\\]{};:\'\\".,<>?\u00AB\u00BB\u200E\u200F\u201C\u201D\u2018\u2019\u202A\u202C]';
|
||||||
|
|
||||||
const _urlRegexp = new RegExp(
|
const _urlRegexp = new RegExp(
|
||||||
'(^|' + _leadingJunk + ')' +
|
`(^|${_leadingJunk})` +
|
||||||
'(' +
|
'(' +
|
||||||
'(?:' +
|
'(?:' +
|
||||||
'(?:http|https|ftp)://' + // scheme://
|
'(?:http|https|ftp)://' + // scheme://
|
||||||
@@ -34,12 +29,12 @@ const _urlRegexp = new RegExp(
|
|||||||
'(?:' + // one or more:
|
'(?:' + // one or more:
|
||||||
'[^\\s()<>]+' + // run of non-space non-()
|
'[^\\s()<>]+' + // run of non-space non-()
|
||||||
'|' + // or
|
'|' + // or
|
||||||
_balancedParens + // balanced parens
|
`${_balancedParens}` + // balanced parens
|
||||||
')+' +
|
')+' +
|
||||||
'(?:' + // end with:
|
'(?:' + // end with:
|
||||||
_balancedParens + // balanced parens
|
`${_balancedParens}` + // balanced parens
|
||||||
'|' + // or
|
'|' + // or
|
||||||
_notTrailingJunk + // last non-junk char
|
`${_notTrailingJunk}` + // last non-junk char
|
||||||
')' +
|
')' +
|
||||||
')', 'gi');
|
')', 'gi');
|
||||||
|
|
||||||
@@ -74,16 +69,16 @@ function spawn(argv) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// spawnCommandLine:
|
// spawnCommandLine:
|
||||||
// @command_line: a command line
|
// @commandLine: a command line
|
||||||
//
|
//
|
||||||
// Runs @command_line in the background, handling any errors that
|
// Runs @commandLine in the background, handling any errors that
|
||||||
// occur when trying to parse or start the program.
|
// occur when trying to parse or start the program.
|
||||||
function spawnCommandLine(command_line) {
|
function spawnCommandLine(commandLine) {
|
||||||
try {
|
try {
|
||||||
let [success, argv] = GLib.shell_parse_argv(command_line);
|
let [success_, argv] = GLib.shell_parse_argv(commandLine);
|
||||||
trySpawn(argv);
|
trySpawn(argv);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
_handleSpawnError(command_line, err);
|
_handleSpawnError(commandLine, err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -98,7 +93,7 @@ function spawnApp(argv) {
|
|||||||
|
|
||||||
let context = global.create_app_launch_context(0, -1);
|
let context = global.create_app_launch_context(0, -1);
|
||||||
app.launch([], context);
|
app.launch([], context);
|
||||||
} catch(err) {
|
} catch (err) {
|
||||||
_handleSpawnError(argv[0], err);
|
_handleSpawnError(argv[0], err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -108,13 +103,12 @@ function spawnApp(argv) {
|
|||||||
//
|
//
|
||||||
// Runs @argv in the background. If launching @argv fails,
|
// Runs @argv in the background. If launching @argv fails,
|
||||||
// this will throw an error.
|
// this will throw an error.
|
||||||
function trySpawn(argv)
|
function trySpawn(argv) {
|
||||||
{
|
var success_, pid;
|
||||||
var success, pid;
|
|
||||||
try {
|
try {
|
||||||
[success, pid] = GLib.spawn_async(null, argv, null,
|
[success_, pid] = GLib.spawn_async(null, argv, null,
|
||||||
GLib.SpawnFlags.SEARCH_PATH | GLib.SpawnFlags.DO_NOT_REAP_CHILD,
|
GLib.SpawnFlags.SEARCH_PATH | GLib.SpawnFlags.DO_NOT_REAP_CHILD,
|
||||||
null);
|
null);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
/* Rewrite the error in case of ENOENT */
|
/* Rewrite the error in case of ENOENT */
|
||||||
if (err.matches(GLib.SpawnError, GLib.SpawnError.NOENT)) {
|
if (err.matches(GLib.SpawnError, GLib.SpawnError.NOENT)) {
|
||||||
@@ -140,19 +134,19 @@ function trySpawn(argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// trySpawnCommandLine:
|
// trySpawnCommandLine:
|
||||||
// @command_line: a command line
|
// @commandLine: a command line
|
||||||
//
|
//
|
||||||
// Runs @command_line in the background. If launching @command_line
|
// Runs @commandLine in the background. If launching @commandLine
|
||||||
// fails, this will throw an error.
|
// fails, this will throw an error.
|
||||||
function trySpawnCommandLine(command_line) {
|
function trySpawnCommandLine(commandLine) {
|
||||||
let success, argv;
|
let success_, argv;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
[success, argv] = GLib.shell_parse_argv(command_line);
|
[success_, argv] = GLib.shell_parse_argv(commandLine);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
// Replace "Error invoking GLib.shell_parse_argv: " with
|
// Replace "Error invoking GLib.shell_parse_argv: " with
|
||||||
// something nicer
|
// something nicer
|
||||||
err.message = err.message.replace(/[^:]*: /, _("Could not parse command:") + "\n");
|
err.message = err.message.replace(/[^:]*: /, `${_("Could not parse command:")}\n`);
|
||||||
throw err;
|
throw err;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -227,7 +221,7 @@ function formatTime(time, params) {
|
|||||||
/* Translators: Time in 24h format */
|
/* Translators: Time in 24h format */
|
||||||
format = N_("%H\u2236%M");
|
format = N_("%H\u2236%M");
|
||||||
// Show the word "Yesterday" and time if date is on yesterday
|
// Show the word "Yesterday" and time if date is on yesterday
|
||||||
else if (daysAgo <2)
|
else if (daysAgo < 2)
|
||||||
/* Translators: this is the word "Yesterday" followed by a
|
/* Translators: this is the word "Yesterday" followed by a
|
||||||
time string in 24h format. i.e. "Yesterday, 14:30" */
|
time string in 24h format. i.e. "Yesterday, 14:30" */
|
||||||
// xgettext:no-c-format
|
// xgettext:no-c-format
|
||||||
@@ -256,7 +250,7 @@ function formatTime(time, params) {
|
|||||||
/* Translators: Time in 12h format */
|
/* Translators: Time in 12h format */
|
||||||
format = N_("%l\u2236%M %p");
|
format = N_("%l\u2236%M %p");
|
||||||
// Show the word "Yesterday" and time if date is on yesterday
|
// Show the word "Yesterday" and time if date is on yesterday
|
||||||
else if (daysAgo <2)
|
else if (daysAgo < 2)
|
||||||
/* Translators: this is the word "Yesterday" followed by a
|
/* Translators: this is the word "Yesterday" followed by a
|
||||||
time string in 12h format. i.e. "Yesterday, 2:30 pm" */
|
time string in 12h format. i.e. "Yesterday, 2:30 pm" */
|
||||||
// xgettext:no-c-format
|
// xgettext:no-c-format
|
||||||
@@ -294,7 +288,7 @@ function createTimeLabel(date, params) {
|
|||||||
let id = _desktopSettings.connect('changed::clock-format', () => {
|
let id = _desktopSettings.connect('changed::clock-format', () => {
|
||||||
label.text = formatTime(date, params);
|
label.text = formatTime(date, params);
|
||||||
});
|
});
|
||||||
label.connect('destroy', () => { _desktopSettings.disconnect(id); });
|
label.connect('destroy', () => _desktopSettings.disconnect(id));
|
||||||
return label;
|
return label;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -319,7 +313,8 @@ function lowerBound(array, val, cmp) {
|
|||||||
if (array.length == 0)
|
if (array.length == 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
min = 0; max = array.length;
|
min = 0;
|
||||||
|
max = array.length;
|
||||||
while (min < (max - 1)) {
|
while (min < (max - 1)) {
|
||||||
mid = Math.floor((min + max) / 2);
|
mid = Math.floor((min + max) / 2);
|
||||||
v = cmp(array[mid], val);
|
v = cmp(array[mid], val);
|
||||||
@@ -351,7 +346,7 @@ function insertSorted(array, val, cmp) {
|
|||||||
var CloseButton = GObject.registerClass(
|
var CloseButton = GObject.registerClass(
|
||||||
class CloseButton extends St.Button {
|
class CloseButton extends St.Button {
|
||||||
_init(boxpointer) {
|
_init(boxpointer) {
|
||||||
super._init({ style_class: 'notification-close'});
|
super._init({ style_class: 'notification-close' });
|
||||||
|
|
||||||
// This is a bit tricky. St.Bin has its own x-align/y-align properties
|
// This is a bit tricky. St.Bin has its own x-align/y-align properties
|
||||||
// that compete with Clutter's properties. This should be fixed for
|
// that compete with Clutter's properties. This should be fixed for
|
||||||
@@ -371,7 +366,7 @@ class CloseButton extends St.Button {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_computeBoxPointerOffset() {
|
_computeBoxPointerOffset() {
|
||||||
if (!this._boxPointer || !this._boxPointer.actor.get_stage())
|
if (!this._boxPointer || !this._boxPointer.get_stage())
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
let side = this._boxPointer.arrowSide;
|
let side = this._boxPointer.arrowSide;
|
||||||
@@ -385,7 +380,7 @@ class CloseButton extends St.Button {
|
|||||||
let themeNode = this.get_theme_node();
|
let themeNode = this.get_theme_node();
|
||||||
|
|
||||||
let offY = this._computeBoxPointerOffset();
|
let offY = this._computeBoxPointerOffset();
|
||||||
this.translation_x = themeNode.get_length('-shell-close-overlap-x')
|
this.translation_x = themeNode.get_length('-shell-close-overlap-x');
|
||||||
this.translation_y = themeNode.get_length('-shell-close-overlap-y') + offY;
|
this.translation_y = themeNode.get_length('-shell-close-overlap-y') + offY;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -401,7 +396,7 @@ function makeCloseButton(boxpointer) {
|
|||||||
|
|
||||||
function ensureActorVisibleInScrollView(scrollView, actor) {
|
function ensureActorVisibleInScrollView(scrollView, actor) {
|
||||||
let adjustment = scrollView.vscroll.adjustment;
|
let adjustment = scrollView.vscroll.adjustment;
|
||||||
let [value, lower, upper, stepIncrement, pageIncrement, pageSize] = adjustment.get_values();
|
let [value, lower_, upper, stepIncrement_, pageIncrement_, pageSize] = adjustment.get_values();
|
||||||
|
|
||||||
let offset = 0;
|
let offset = 0;
|
||||||
let vfade = scrollView.get_effect("fade");
|
let vfade = scrollView.get_effect("fade");
|
||||||
@@ -429,97 +424,8 @@ function ensureActorVisibleInScrollView(scrollView, actor) {
|
|||||||
else
|
else
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Tweener.addTween(adjustment,
|
adjustment.ease(value, {
|
||||||
{ value: value,
|
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
|
||||||
time: SCROLL_TIME,
|
duration: SCROLL_TIME
|
||||||
transition: 'easeOutQuad' });
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
var AppSettingsMonitor = class {
|
|
||||||
constructor(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',
|
|
||||||
this._onInstalledChanged.bind(this));
|
|
||||||
this._onInstalledChanged();
|
|
||||||
}
|
|
||||||
|
|
||||||
get available() {
|
|
||||||
return this._app != null && this._settings != null;
|
|
||||||
}
|
|
||||||
|
|
||||||
activateApp() {
|
|
||||||
if (this._app)
|
|
||||||
this._app.activate();
|
|
||||||
}
|
|
||||||
|
|
||||||
watchSetting(key, callback) {
|
|
||||||
let handler = { id: 0, key: key, callback: callback };
|
|
||||||
this._handlers.push(handler);
|
|
||||||
|
|
||||||
this._connectHandler(handler);
|
|
||||||
}
|
|
||||||
|
|
||||||
_connectHandler(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(handler) {
|
|
||||||
if (this._settings && handler.id > 0)
|
|
||||||
this._settings.disconnect(handler.id);
|
|
||||||
handler.id = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
_onInstalledChanged() {
|
|
||||||
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(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() {
|
|
||||||
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);
|
|
||||||
|
|||||||
@@ -1,13 +1,19 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
|
||||||
const Geoclue = imports.gi.Geoclue;
|
const { Geoclue, Gio, GLib, GWeather, Shell } = imports.gi;
|
||||||
const Gio = imports.gi.Gio;
|
|
||||||
const GLib = imports.gi.GLib;
|
|
||||||
const GWeather = imports.gi.GWeather;
|
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
|
|
||||||
const PermissionStore = imports.misc.permissionStore;
|
const PermissionStore = imports.misc.permissionStore;
|
||||||
const Util = imports.misc.util;
|
|
||||||
|
const { loadInterfaceXML } = imports.misc.fileUtils;
|
||||||
|
|
||||||
|
const WeatherIntegrationIface = loadInterfaceXML('org.gnome.Shell.WeatherIntegration');
|
||||||
|
|
||||||
|
const WEATHER_BUS_NAME = 'org.gnome.Weather';
|
||||||
|
const WEATHER_OBJECT_PATH = '/org/gnome/Weather';
|
||||||
|
const WEATHER_INTEGRATION_IFACE = 'org.gnome.Shell.WeatherIntegration';
|
||||||
|
|
||||||
|
const WEATHER_APP_ID = 'org.gnome.Weather.desktop';
|
||||||
|
|
||||||
// Minimum time between updates to show loading indication
|
// Minimum time between updates to show loading indication
|
||||||
var UPDATE_THRESHOLD = 10 * GLib.TIME_SPAN_MINUTE;
|
var UPDATE_THRESHOLD = 10 * GLib.TIME_SPAN_MINUTE;
|
||||||
@@ -29,13 +35,21 @@ var WeatherClient = class {
|
|||||||
this._weatherAuthorized = false;
|
this._weatherAuthorized = false;
|
||||||
this._permStore = new PermissionStore.PermissionStore((proxy, error) => {
|
this._permStore = new PermissionStore.PermissionStore((proxy, error) => {
|
||||||
if (error) {
|
if (error) {
|
||||||
log('Failed to connect to permissionStore: ' + error.message);
|
log(`Failed to connect to permissionStore: ${error.message}`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this._permStore.g_name_owner == null) {
|
||||||
|
// Failed to auto-start, likely because xdg-desktop-portal
|
||||||
|
// isn't installed; don't restrict access to location service
|
||||||
|
this._weatherAuthorized = true;
|
||||||
|
this._updateAutoLocation();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this._permStore.LookupRemote('gnome', 'geolocation', (res, error) => {
|
this._permStore.LookupRemote('gnome', 'geolocation', (res, error) => {
|
||||||
if (error)
|
if (error)
|
||||||
log('Error looking up permission: ' + error.message);
|
log(`Error looking up permission: ${error.message}`);
|
||||||
|
|
||||||
let [perms, data] = error ? [{}, null] : res;
|
let [perms, data] = error ? [{}, null] : res;
|
||||||
let params = ['gnome', 'geolocation', false, data, perms];
|
let params = ['gnome', 'geolocation', false, data, perms];
|
||||||
@@ -61,17 +75,38 @@ var WeatherClient = class {
|
|||||||
this.emit('changed');
|
this.emit('changed');
|
||||||
});
|
});
|
||||||
|
|
||||||
this._weatherAppMon = new Util.AppSettingsMonitor('org.gnome.Weather.Application.desktop',
|
this._weatherApp = null;
|
||||||
'org.gnome.Weather.Application');
|
this._weatherProxy = null;
|
||||||
this._weatherAppMon.connect('available-changed', () => { this.emit('changed'); });
|
|
||||||
this._weatherAppMon.watchSetting('automatic-location',
|
let nodeInfo = Gio.DBusNodeInfo.new_for_xml(WeatherIntegrationIface);
|
||||||
this._onAutomaticLocationChanged.bind(this));
|
Gio.DBusProxy.new(
|
||||||
this._weatherAppMon.watchSetting('locations',
|
Gio.DBus.session,
|
||||||
this._onLocationsChanged.bind(this));
|
Gio.DBusProxyFlags.DO_NOT_AUTO_START | Gio.DBusProxyFlags.GET_INVALIDATED_PROPERTIES,
|
||||||
|
nodeInfo.lookup_interface(WEATHER_INTEGRATION_IFACE),
|
||||||
|
WEATHER_BUS_NAME,
|
||||||
|
WEATHER_OBJECT_PATH,
|
||||||
|
WEATHER_INTEGRATION_IFACE,
|
||||||
|
null,
|
||||||
|
this._onWeatherProxyReady.bind(this));
|
||||||
|
|
||||||
|
this._settings = new Gio.Settings({
|
||||||
|
schema_id: 'org.gnome.shell.weather'
|
||||||
|
});
|
||||||
|
this._settings.connect('changed::automatic-location',
|
||||||
|
this._onAutomaticLocationChanged.bind(this));
|
||||||
|
this._onAutomaticLocationChanged();
|
||||||
|
this._settings.connect('changed::locations',
|
||||||
|
this._onLocationsChanged.bind(this));
|
||||||
|
this._onLocationsChanged();
|
||||||
|
|
||||||
|
this._appSystem = Shell.AppSystem.get_default();
|
||||||
|
this._appSystem.connect('installed-changed',
|
||||||
|
this._onInstalledChanged.bind(this));
|
||||||
|
this._onInstalledChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
get available() {
|
get available() {
|
||||||
return this._weatherAppMon.available;
|
return this._weatherApp != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
get loading() {
|
get loading() {
|
||||||
@@ -87,7 +122,8 @@ var WeatherClient = class {
|
|||||||
}
|
}
|
||||||
|
|
||||||
activateApp() {
|
activateApp() {
|
||||||
this._weatherAppMon.activateApp();
|
if (this._weatherApp)
|
||||||
|
this._weatherApp.activate();
|
||||||
}
|
}
|
||||||
|
|
||||||
update() {
|
update() {
|
||||||
@@ -109,6 +145,38 @@ var WeatherClient = class {
|
|||||||
this._weatherAuthorized;
|
this._weatherAuthorized;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_onWeatherProxyReady(o, res) {
|
||||||
|
try {
|
||||||
|
this._weatherProxy = Gio.DBusProxy.new_finish(res);
|
||||||
|
} catch (e) {
|
||||||
|
log(`Failed to create GNOME Weather proxy: ${e}`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this._weatherProxy.connect('g-properties-changed',
|
||||||
|
this._onWeatherPropertiesChanged.bind(this));
|
||||||
|
this._onWeatherPropertiesChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
_onWeatherPropertiesChanged() {
|
||||||
|
if (this._weatherProxy.g_name_owner == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this._settings.set_boolean('automatic-location',
|
||||||
|
this._weatherProxy.AutomaticLocation);
|
||||||
|
this._settings.set_value('locations',
|
||||||
|
new GLib.Variant('av', this._weatherProxy.Locations));
|
||||||
|
}
|
||||||
|
|
||||||
|
_onInstalledChanged() {
|
||||||
|
let hadApp = (this._weatherApp != null);
|
||||||
|
this._weatherApp = this._appSystem.lookup_app(WEATHER_APP_ID);
|
||||||
|
let haveApp = (this._weatherApp != null);
|
||||||
|
|
||||||
|
if (hadApp !== haveApp)
|
||||||
|
this.emit('changed');
|
||||||
|
}
|
||||||
|
|
||||||
_loadInfo() {
|
_loadInfo() {
|
||||||
let id = this._weatherInfo.connect('updated', () => {
|
let id = this._weatherInfo.connect('updated', () => {
|
||||||
this._weatherInfo.disconnect(id);
|
this._weatherInfo.disconnect(id);
|
||||||
@@ -173,8 +241,8 @@ var WeatherClient = class {
|
|||||||
(o, res) => {
|
(o, res) => {
|
||||||
try {
|
try {
|
||||||
this._gclueService = Geoclue.Simple.new_finish(res);
|
this._gclueService = Geoclue.Simple.new_finish(res);
|
||||||
} catch(e) {
|
} catch (e) {
|
||||||
log('Failed to connect to Geoclue2 service: ' + e.message);
|
log(`Failed to connect to Geoclue2 service: ${e.message}`);
|
||||||
this._setLocation(this._mostRecentLocation);
|
this._setLocation(this._mostRecentLocation);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -193,8 +261,8 @@ var WeatherClient = class {
|
|||||||
this._setLocation(location);
|
this._setLocation(location);
|
||||||
}
|
}
|
||||||
|
|
||||||
_onAutomaticLocationChanged(settings, key) {
|
_onAutomaticLocationChanged() {
|
||||||
let useAutoLocation = settings.get_boolean(key);
|
let useAutoLocation = this._settings.get_boolean('automatic-location');
|
||||||
if (this._autoLocationRequested == useAutoLocation)
|
if (this._autoLocationRequested == useAutoLocation)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -212,8 +280,9 @@ var WeatherClient = class {
|
|||||||
this._setLocation(this._mostRecentLocation);
|
this._setLocation(this._mostRecentLocation);
|
||||||
}
|
}
|
||||||
|
|
||||||
_onLocationsChanged(settings, key) {
|
_onLocationsChanged() {
|
||||||
let serialized = settings.get_value(key).deep_unpack().shift();
|
let locations = this._settings.get_value('locations').deep_unpack();
|
||||||
|
let serialized = locations.shift();
|
||||||
let mostRecentLocation = null;
|
let mostRecentLocation = null;
|
||||||
|
|
||||||
if (serialized)
|
if (serialized)
|
||||||
@@ -229,12 +298,12 @@ var WeatherClient = class {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_onPermStoreChanged(proxy, sender, params) {
|
_onPermStoreChanged(proxy, sender, params) {
|
||||||
let [table, id, deleted, data, perms] = params;
|
let [table, id, deleted_, data_, perms] = params;
|
||||||
|
|
||||||
if (table != 'gnome' || id != 'geolocation')
|
if (table != 'gnome' || id != 'geolocation')
|
||||||
return;
|
return;
|
||||||
|
|
||||||
let permission = perms['org.gnome.Weather.Application'] || ['NONE'];
|
let permission = perms['org.gnome.Weather'] || ['NONE'];
|
||||||
let [accuracy] = permission;
|
let [accuracy] = permission;
|
||||||
this._weatherAuthorized = accuracy != 'NONE';
|
this._weatherAuthorized = accuracy != 'NONE';
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,9 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
/* exported run, script_overviewShowStart, script_overviewShowDone,
|
||||||
|
script_applicationsShowStart, script_applicationsShowDone,
|
||||||
|
script_afterShowHide, malloc_usedSize, glx_swapComplete,
|
||||||
|
clutter_stagePaintDone */
|
||||||
|
/* eslint camelcase: ["error", { properties: "never", allow: ["^script_", "^malloc", "^glx", "^clutter"] }] */
|
||||||
|
|
||||||
const System = imports.system;
|
const System = imports.system;
|
||||||
|
|
||||||
@@ -10,7 +15,7 @@ const Scripting = imports.ui.scripting;
|
|||||||
// someone should be able to get an idea of how well the shell is performing
|
// someone should be able to get an idea of how well the shell is performing
|
||||||
// on a particular system.
|
// on a particular system.
|
||||||
|
|
||||||
let METRICS = {
|
var METRICS = {
|
||||||
overviewLatencyFirst:
|
overviewLatencyFirst:
|
||||||
{ description: "Time to first frame after triggering overview, first time",
|
{ description: "Time to first frame after triggering overview, first time",
|
||||||
units: "us" },
|
units: "us" },
|
||||||
@@ -19,7 +24,7 @@ let METRICS = {
|
|||||||
units: "frames / s" },
|
units: "frames / s" },
|
||||||
overviewLatencySubsequent:
|
overviewLatencySubsequent:
|
||||||
{ description: "Time to first frame after triggering overview, second time",
|
{ description: "Time to first frame after triggering overview, second time",
|
||||||
units: "us"},
|
units: "us" },
|
||||||
overviewFpsSubsequent:
|
overviewFpsSubsequent:
|
||||||
{ description: "Frames rate when going to the overview, second time",
|
{ description: "Frames rate when going to the overview, second time",
|
||||||
units: "frames / s" },
|
units: "frames / s" },
|
||||||
@@ -52,7 +57,7 @@ let METRICS = {
|
|||||||
units: "us" },
|
units: "us" },
|
||||||
applicationsShowTimeSubsequent:
|
applicationsShowTimeSubsequent:
|
||||||
{ description: "Time to switch to applications view, second time",
|
{ description: "Time to switch to applications view, second time",
|
||||||
units: "us"}
|
units: "us" }
|
||||||
};
|
};
|
||||||
|
|
||||||
let WINDOW_CONFIGS = [
|
let WINDOW_CONFIGS = [
|
||||||
@@ -65,7 +70,7 @@ let WINDOW_CONFIGS = [
|
|||||||
{ width: 640, height: 480, alpha: true, maximized: false, count: 10, metric: 'overviewFps10Alpha' }
|
{ width: 640, height: 480, alpha: true, maximized: false, count: 10, metric: 'overviewFps10Alpha' }
|
||||||
];
|
];
|
||||||
|
|
||||||
function run() {
|
function *run() {
|
||||||
Scripting.defineScriptEvent("overviewShowStart", "Starting to show the overview");
|
Scripting.defineScriptEvent("overviewShowStart", "Starting to show the overview");
|
||||||
Scripting.defineScriptEvent("overviewShowDone", "Overview finished showing");
|
Scripting.defineScriptEvent("overviewShowDone", "Overview finished showing");
|
||||||
Scripting.defineScriptEvent("afterShowHide", "After a show/hide cycle for the overview");
|
Scripting.defineScriptEvent("afterShowHide", "After a show/hide cycle for the overview");
|
||||||
@@ -121,9 +126,11 @@ function run() {
|
|||||||
|
|
||||||
for (let i = 0; i < 2; i++) {
|
for (let i = 0; i < 2; i++) {
|
||||||
Scripting.scriptEvent('applicationsShowStart');
|
Scripting.scriptEvent('applicationsShowStart');
|
||||||
|
// eslint-disable-next-line require-atomic-updates
|
||||||
Main.overview._dash.showAppsButton.checked = true;
|
Main.overview._dash.showAppsButton.checked = true;
|
||||||
yield Scripting.waitLeisure();
|
yield Scripting.waitLeisure();
|
||||||
Scripting.scriptEvent('applicationsShowDone');
|
Scripting.scriptEvent('applicationsShowDone');
|
||||||
|
// eslint-disable-next-line require-atomic-updates
|
||||||
Main.overview._dash.showAppsButton.checked = false;
|
Main.overview._dash.showAppsButton.checked = false;
|
||||||
yield Scripting.waitLeisure();
|
yield Scripting.waitLeisure();
|
||||||
}
|
}
|
||||||
@@ -136,7 +143,6 @@ let overviewFrames;
|
|||||||
let overviewLatency;
|
let overviewLatency;
|
||||||
let mallocUsedSize = 0;
|
let mallocUsedSize = 0;
|
||||||
let overviewShowCount = 0;
|
let overviewShowCount = 0;
|
||||||
let firstOverviewUsedSize;
|
|
||||||
let haveSwapComplete = false;
|
let haveSwapComplete = false;
|
||||||
let applicationsShowStart;
|
let applicationsShowStart;
|
||||||
let applicationsShowCount = 0;
|
let applicationsShowCount = 0;
|
||||||
@@ -148,7 +154,7 @@ function script_overviewShowStart(time) {
|
|||||||
overviewFrames = 0;
|
overviewFrames = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
function script_overviewShowDone(time) {
|
function script_overviewShowDone(_time) {
|
||||||
// We've set up the state at the end of the zoom out, but we
|
// We've set up the state at the end of the zoom out, but we
|
||||||
// need to wait for one more frame to paint before we count
|
// need to wait for one more frame to paint before we count
|
||||||
// ourselves as done.
|
// ourselves as done.
|
||||||
@@ -167,7 +173,7 @@ function script_applicationsShowDone(time) {
|
|||||||
METRICS.applicationsShowTimeSubsequent.value = time - applicationsShowStart;
|
METRICS.applicationsShowTimeSubsequent.value = time - applicationsShowStart;
|
||||||
}
|
}
|
||||||
|
|
||||||
function script_afterShowHide(time) {
|
function script_afterShowHide(_time) {
|
||||||
if (overviewShowCount == 1) {
|
if (overviewShowCount == 1) {
|
||||||
METRICS.usedAfterOverview.value = mallocUsedSize;
|
METRICS.usedAfterOverview.value = mallocUsedSize;
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -1,12 +1,17 @@
|
|||||||
const Clutter = imports.gi.Clutter;
|
/* exported run, script_desktopShown, script_overviewShowStart,
|
||||||
const Gio = imports.gi.Gio;
|
script_overviewShowDone, script_applicationsShowStart,
|
||||||
const Gtk = imports.gi.Gtk;
|
script_applicationsShowDone, script_mainViewDrawStart,
|
||||||
const Meta = imports.gi.Meta;
|
script_mainViewDrawDone, script_overviewDrawStart,
|
||||||
|
script_overviewDrawDone, script_redrawTestStart,
|
||||||
|
script_redrawTestDone, script_collectTimings,
|
||||||
|
script_geditLaunch, script_geditFirstFrame,
|
||||||
|
clutter_stagePaintStart, clutter_paintCompletedTimestamp */
|
||||||
|
/* eslint camelcase: ["error", { properties: "never", allow: ["^script_", "^clutter"] }] */
|
||||||
|
const { Clutter, Gio, Shell } = imports.gi;
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const Scripting = imports.ui.scripting;
|
const Scripting = imports.ui.scripting;
|
||||||
const Shell = imports.gi.Shell;
|
|
||||||
|
|
||||||
let METRICS = {
|
var METRICS = {
|
||||||
timeToDesktop:
|
timeToDesktop:
|
||||||
{ description: "Time from starting graphical.target to desktop showing",
|
{ description: "Time from starting graphical.target to desktop showing",
|
||||||
units: "us" },
|
units: "us" },
|
||||||
@@ -34,7 +39,7 @@ let METRICS = {
|
|||||||
geditStartTime:
|
geditStartTime:
|
||||||
{ description: "Time from gedit launch to window drawn",
|
{ description: "Time from gedit launch to window drawn",
|
||||||
units: "us" },
|
units: "us" },
|
||||||
}
|
};
|
||||||
|
|
||||||
function waitAndDraw(milliseconds) {
|
function waitAndDraw(milliseconds) {
|
||||||
let cb;
|
let cb;
|
||||||
@@ -42,7 +47,7 @@ function waitAndDraw(milliseconds) {
|
|||||||
let timeline = new Clutter.Timeline({ duration: milliseconds });
|
let timeline = new Clutter.Timeline({ duration: milliseconds });
|
||||||
timeline.start();
|
timeline.start();
|
||||||
|
|
||||||
timeline.connect('new-frame', (timeline, frame) => {
|
timeline.connect('new-frame', (_timeline, _frame) => {
|
||||||
global.stage.queue_redraw();
|
global.stage.queue_redraw();
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -52,7 +57,7 @@ function waitAndDraw(milliseconds) {
|
|||||||
cb();
|
cb();
|
||||||
});
|
});
|
||||||
|
|
||||||
return callback => { cb = callback; };
|
return callback => (cb = callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
function waitSignal(object, signal) {
|
function waitSignal(object, signal) {
|
||||||
@@ -64,7 +69,7 @@ function waitSignal(object, signal) {
|
|||||||
cb();
|
cb();
|
||||||
});
|
});
|
||||||
|
|
||||||
return callback => { cb = callback; };
|
return callback => (cb = callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
function extractBootTimestamp() {
|
function extractBootTimestamp() {
|
||||||
@@ -77,8 +82,8 @@ function extractBootTimestamp() {
|
|||||||
let result = null;
|
let result = null;
|
||||||
|
|
||||||
let datastream = Gio.DataInputStream.new(sp.get_stdout_pipe());
|
let datastream = Gio.DataInputStream.new(sp.get_stdout_pipe());
|
||||||
while (true) {
|
while (true) { // eslint-disable-line no-constant-condition
|
||||||
let [line, length] = datastream.read_line_utf8(null);
|
let [line, length_] = datastream.read_line_utf8(null);
|
||||||
if (line === null)
|
if (line === null)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -89,7 +94,7 @@ function extractBootTimestamp() {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
function run() {
|
function *run() {
|
||||||
Scripting.defineScriptEvent("desktopShown", "Finished initial animation");
|
Scripting.defineScriptEvent("desktopShown", "Finished initial animation");
|
||||||
Scripting.defineScriptEvent("overviewShowStart", "Starting to show the overview");
|
Scripting.defineScriptEvent("overviewShowStart", "Starting to show the overview");
|
||||||
Scripting.defineScriptEvent("overviewShowDone", "Overview finished showing");
|
Scripting.defineScriptEvent("overviewShowDone", "Overview finished showing");
|
||||||
@@ -108,7 +113,10 @@ function run() {
|
|||||||
yield Scripting.waitLeisure();
|
yield Scripting.waitLeisure();
|
||||||
Scripting.scriptEvent('desktopShown');
|
Scripting.scriptEvent('desktopShown');
|
||||||
|
|
||||||
Gtk.Settings.get_default().gtk_enable_animations = false;
|
let interfaceSettings = new Gio.Settings({
|
||||||
|
schema_id: 'org.gnome.desktop.interface'
|
||||||
|
});
|
||||||
|
interfaceSettings.set_boolean('enable-animations', false);
|
||||||
|
|
||||||
Scripting.scriptEvent('overviewShowStart');
|
Scripting.scriptEvent('overviewShowStart');
|
||||||
Main.overview.show();
|
Main.overview.show();
|
||||||
@@ -118,6 +126,7 @@ function run() {
|
|||||||
yield Scripting.sleep(1000);
|
yield Scripting.sleep(1000);
|
||||||
|
|
||||||
Scripting.scriptEvent('applicationsShowStart');
|
Scripting.scriptEvent('applicationsShowStart');
|
||||||
|
// eslint-disable-next-line require-atomic-updates
|
||||||
Main.overview._dash.showAppsButton.checked = true;
|
Main.overview._dash.showAppsButton.checked = true;
|
||||||
|
|
||||||
yield Scripting.waitLeisure();
|
yield Scripting.waitLeisure();
|
||||||
@@ -128,9 +137,9 @@ function run() {
|
|||||||
Main.overview.hide();
|
Main.overview.hide();
|
||||||
yield Scripting.waitLeisure();
|
yield Scripting.waitLeisure();
|
||||||
|
|
||||||
////////////////////////////////////////
|
// --------------------- //
|
||||||
// Tests of redraw speed
|
// Tests of redraw speed //
|
||||||
////////////////////////////////////////
|
// --------------------- //
|
||||||
|
|
||||||
global.frame_timestamps = true;
|
global.frame_timestamps = true;
|
||||||
global.frame_finish_timestamp = true;
|
global.frame_finish_timestamp = true;
|
||||||
@@ -158,7 +167,7 @@ function run() {
|
|||||||
Main.overview.hide();
|
Main.overview.hide();
|
||||||
|
|
||||||
yield Scripting.createTestWindow({ maximized: true,
|
yield Scripting.createTestWindow({ maximized: true,
|
||||||
redraws: true});
|
redraws: true });
|
||||||
yield Scripting.waitTestWindows();
|
yield Scripting.waitTestWindows();
|
||||||
|
|
||||||
yield Scripting.sleep(1000);
|
yield Scripting.sleep(1000);
|
||||||
@@ -177,8 +186,6 @@ function run() {
|
|||||||
|
|
||||||
yield Scripting.sleep(1000);
|
yield Scripting.sleep(1000);
|
||||||
|
|
||||||
////////////////////////////////////////
|
|
||||||
|
|
||||||
let appSys = Shell.AppSystem.get_default();
|
let appSys = Shell.AppSystem.get_default();
|
||||||
let app = appSys.lookup_app('org.gnome.gedit.desktop');
|
let app = appSys.lookup_app('org.gnome.gedit.desktop');
|
||||||
|
|
||||||
@@ -204,7 +211,7 @@ function run() {
|
|||||||
|
|
||||||
yield Scripting.sleep(1000);
|
yield Scripting.sleep(1000);
|
||||||
|
|
||||||
Gtk.Settings.get_default().gtk_enable_animations = true;
|
interfaceSettings.set_boolean('enable-animations', true);
|
||||||
}
|
}
|
||||||
|
|
||||||
let overviewShowStart;
|
let overviewShowStart;
|
||||||
@@ -235,31 +242,31 @@ function script_applicationsShowDone(time) {
|
|||||||
METRICS.applicationsShowTime.value = time - applicationsShowStart;
|
METRICS.applicationsShowTime.value = time - applicationsShowStart;
|
||||||
}
|
}
|
||||||
|
|
||||||
function script_mainViewDrawStart(time) {
|
function script_mainViewDrawStart(_time) {
|
||||||
redrawTiming = 'mainView';
|
redrawTiming = 'mainView';
|
||||||
}
|
}
|
||||||
|
|
||||||
function script_mainViewDrawDone(time) {
|
function script_mainViewDrawDone(_time) {
|
||||||
redrawTiming = null;
|
redrawTiming = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
function script_overviewDrawStart(time) {
|
function script_overviewDrawStart(_time) {
|
||||||
redrawTiming = 'overview';
|
redrawTiming = 'overview';
|
||||||
}
|
}
|
||||||
|
|
||||||
function script_overviewDrawDone(time) {
|
function script_overviewDrawDone(_time) {
|
||||||
redrawTiming = null;
|
redrawTiming = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
function script_redrawTestStart(time) {
|
function script_redrawTestStart(_time) {
|
||||||
redrawTiming = 'application';
|
redrawTiming = 'application';
|
||||||
}
|
}
|
||||||
|
|
||||||
function script_redrawTestDone(time) {
|
function script_redrawTestDone(_time) {
|
||||||
redrawTiming = null;
|
redrawTiming = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
function script_collectTimings(time) {
|
function script_collectTimings(_time) {
|
||||||
for (let timing in redrawTimes) {
|
for (let timing in redrawTimes) {
|
||||||
let times = redrawTimes[timing];
|
let times = redrawTimes[timing];
|
||||||
times.sort((a, b) => a - b);
|
times.sort((a, b) => a - b);
|
||||||
@@ -270,11 +277,11 @@ function script_collectTimings(time) {
|
|||||||
if (len == 0)
|
if (len == 0)
|
||||||
median = -1;
|
median = -1;
|
||||||
else if (len % 2 == 1)
|
else if (len % 2 == 1)
|
||||||
median = times[(len - 1)/ 2];
|
median = times[(len - 1) / 2];
|
||||||
else
|
else
|
||||||
median = Math.round((times[len / 2 - 1] + times[len / 2]) / 2);
|
median = Math.round((times[len / 2 - 1] + times[len / 2]) / 2);
|
||||||
|
|
||||||
METRICS[timing + 'RedrawTime'].value = median;
|
METRICS[`${timing}RedrawTime`].value = median;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +1,7 @@
|
|||||||
|
/* exported main */
|
||||||
const Format = imports.format;
|
const Format = imports.format;
|
||||||
const Gettext = imports.gettext;
|
const Gettext = imports.gettext;
|
||||||
const GLib = imports.gi.GLib;
|
const { Gio, GLib, GObject, Gtk, Pango, Soup, WebKit2: WebKit } = imports.gi;
|
||||||
const GObject = imports.gi.GObject;
|
|
||||||
const Gio = imports.gi.Gio;
|
|
||||||
const Gtk = imports.gi.Gtk;
|
|
||||||
const Pango = imports.gi.Pango;
|
|
||||||
const Soup = imports.gi.Soup;
|
|
||||||
const WebKit = imports.gi.WebKit2;
|
|
||||||
|
|
||||||
const _ = Gettext.gettext;
|
const _ = Gettext.gettext;
|
||||||
|
|
||||||
@@ -25,7 +20,6 @@ const PortalHelperSecurityLevel = {
|
|||||||
INSECURE: 2
|
INSECURE: 2
|
||||||
};
|
};
|
||||||
|
|
||||||
const INACTIVITY_TIMEOUT = 30000; //ms
|
|
||||||
const CONNECTIVITY_CHECK_HOST = 'nmcheck.gnome.org';
|
const CONNECTIVITY_CHECK_HOST = 'nmcheck.gnome.org';
|
||||||
const CONNECTIVITY_CHECK_URI = 'http://' + CONNECTIVITY_CHECK_HOST;
|
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;
|
||||||
@@ -65,7 +59,7 @@ class PortalHeaderBar extends Gtk.HeaderBar {
|
|||||||
single_line_mode: true,
|
single_line_mode: true,
|
||||||
ellipsize: Pango.EllipsizeMode.END,
|
ellipsize: Pango.EllipsizeMode.END,
|
||||||
valign: Gtk.Align.BASELINE,
|
valign: Gtk.Align.BASELINE,
|
||||||
selectable: true});
|
selectable: true });
|
||||||
this.subtitleLabel.get_style_context().add_class('subtitle');
|
this.subtitleLabel.get_style_context().add_class('subtitle');
|
||||||
hbox.add(this.subtitleLabel);
|
hbox.add(this.subtitleLabel);
|
||||||
|
|
||||||
@@ -158,7 +152,7 @@ class PortalWindow extends Gtk.ApplicationWindow {
|
|||||||
this._webView.load_uri(this._originalUrl);
|
this._webView.load_uri(this._originalUrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
vfunc_delete_event(event) {
|
vfunc_delete_event(_event) {
|
||||||
if (this._recheckAtExit)
|
if (this._recheckAtExit)
|
||||||
this._doneCallback(PortalHelperResult.RECHECK);
|
this._doneCallback(PortalHelperResult.RECHECK);
|
||||||
else
|
else
|
||||||
@@ -184,7 +178,7 @@ class PortalWindow extends Gtk.ApplicationWindow {
|
|||||||
this._headerBar.setSecurityIcon(PortalHelperSecurityLevel.INSECURE);
|
this._headerBar.setSecurityIcon(PortalHelperSecurityLevel.INSECURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
_onLoadFailedWithTlsErrors(view, failingURI, certificate, errors) {
|
_onLoadFailedWithTlsErrors(view, failingURI, certificate, _errors) {
|
||||||
this._headerBar.setSecurityIcon(PortalHelperSecurityLevel.INSECURE);
|
this._headerBar.setSecurityIcon(PortalHelperSecurityLevel.INSECURE);
|
||||||
let uri = new Soup.URI(failingURI);
|
let uri = new Soup.URI(failingURI);
|
||||||
this._webContext.allow_tls_certificate_for_host(certificate, uri.get_host());
|
this._webContext.allow_tls_certificate_for_host(certificate, uri.get_host());
|
||||||
@@ -271,7 +265,7 @@ class WebPortalHelper extends Gtk.Application {
|
|||||||
this._queue = [];
|
this._queue = [];
|
||||||
|
|
||||||
let action = new Gio.SimpleAction({ name: 'quit' });
|
let action = new Gio.SimpleAction({ name: 'quit' });
|
||||||
action.connect('activate', () => { this.active_window.destroyWindow(); });
|
action.connect('activate', () => this.active_window.destroyWindow());
|
||||||
this.add_action(action);
|
this.add_action(action);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,5 @@
|
|||||||
const Clutter = imports.gi.Clutter;
|
/* exported AccessDialogDBus */
|
||||||
const Gio = imports.gi.Gio;
|
const { Clutter, Gio, GLib, GObject, Shell } = imports.gi;
|
||||||
const GLib = imports.gi.GLib;
|
|
||||||
const Pango = imports.gi.Pango;
|
|
||||||
const Shell = imports.gi.Shell;
|
|
||||||
const St = imports.gi.St;
|
|
||||||
|
|
||||||
const CheckBox = imports.ui.checkBox;
|
const CheckBox = imports.ui.checkBox;
|
||||||
const Dialog = imports.ui.dialog;
|
const Dialog = imports.ui.dialog;
|
||||||
@@ -20,9 +16,10 @@ var DialogResponse = {
|
|||||||
CLOSED: 2
|
CLOSED: 2
|
||||||
};
|
};
|
||||||
|
|
||||||
var AccessDialog = class extends ModalDialog.ModalDialog {
|
var AccessDialog = GObject.registerClass(
|
||||||
constructor(invocation, handle, title, subtitle, body, options) {
|
class AccessDialog extends ModalDialog.ModalDialog {
|
||||||
super({ styleClass: 'access-dialog' });
|
_init(invocation, handle, title, subtitle, body, options) {
|
||||||
|
super._init({ styleClass: 'access-dialog' });
|
||||||
|
|
||||||
this._invocation = invocation;
|
this._invocation = invocation;
|
||||||
this._handle = handle;
|
this._handle = handle;
|
||||||
@@ -73,7 +70,7 @@ var AccessDialog = class extends ModalDialog.ModalDialog {
|
|||||||
this.addButton({ label: grantLabel,
|
this.addButton({ label: grantLabel,
|
||||||
action: () => {
|
action: () => {
|
||||||
this._sendResponse(DialogResponse.OK);
|
this._sendResponse(DialogResponse.OK);
|
||||||
}});
|
} });
|
||||||
}
|
}
|
||||||
|
|
||||||
open() {
|
open() {
|
||||||
@@ -83,7 +80,7 @@ var AccessDialog = class extends ModalDialog.ModalDialog {
|
|||||||
this._requestExported = this._request.export(connection, this._handle);
|
this._requestExported = this._request.export(connection, this._handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
CloseAsync(invocation, params) {
|
CloseAsync(invocation, _params) {
|
||||||
if (this._invocation.get_sender() != invocation.get_sender()) {
|
if (this._invocation.get_sender() != invocation.get_sender()) {
|
||||||
invocation.return_error_literal(Gio.DBusError,
|
invocation.return_error_literal(Gio.DBusError,
|
||||||
Gio.DBusError.ACCESS_DENIED,
|
Gio.DBusError.ACCESS_DENIED,
|
||||||
@@ -114,7 +111,7 @@ var AccessDialog = class extends ModalDialog.ModalDialog {
|
|||||||
});
|
});
|
||||||
this.close();
|
this.close();
|
||||||
}
|
}
|
||||||
};
|
});
|
||||||
|
|
||||||
var AccessDialogDBus = class {
|
var AccessDialogDBus = class {
|
||||||
constructor() {
|
constructor() {
|
||||||
@@ -136,10 +133,10 @@ var AccessDialogDBus = class {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let [handle, appId, parentWindow, title, subtitle, body, options] = params;
|
let [handle, appId, parentWindow_, title, subtitle, body, options] = params;
|
||||||
// We probably want to use parentWindow and global.display.focus_window
|
// We probably want to use parentWindow and global.display.focus_window
|
||||||
// for this check in the future
|
// for this check in the future
|
||||||
if (appId && appId + '.desktop' != this._windowTracker.focus_app.id) {
|
if (appId && `${appId}.desktop` != this._windowTracker.focus_app.id) {
|
||||||
invocation.return_error_literal(Gio.DBusError,
|
invocation.return_error_literal(Gio.DBusError,
|
||||||
Gio.DBusError.ACCESS_DENIED,
|
Gio.DBusError.ACCESS_DENIED,
|
||||||
'Only the focused app is allowed to show a system access dialog');
|
'Only the focused app is allowed to show a system access dialog');
|
||||||
@@ -150,7 +147,7 @@ var AccessDialogDBus = class {
|
|||||||
subtitle, body, options);
|
subtitle, body, options);
|
||||||
dialog.open();
|
dialog.open();
|
||||||
|
|
||||||
dialog.connect('closed', () => { this._accessDialog = null; });
|
dialog.connect('closed', () => (this._accessDialog = null));
|
||||||
|
|
||||||
this._accessDialog = dialog;
|
this._accessDialog = dialog;
|
||||||
}
|
}
|
||||||
|
|||||||
188
js/ui/altTab.js
@@ -1,24 +1,17 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
/* exported AppSwitcherPopup, GroupCyclerPopup, WindowSwitcherPopup,
|
||||||
|
WindowCyclerPopup */
|
||||||
|
|
||||||
const Clutter = imports.gi.Clutter;
|
const { Atk, Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi;
|
||||||
const Gio = imports.gi.Gio;
|
|
||||||
const GLib = imports.gi.GLib;
|
|
||||||
const GObject = imports.gi.GObject;
|
|
||||||
const Mainloop = imports.mainloop;
|
|
||||||
const Meta = imports.gi.Meta;
|
|
||||||
const Shell = imports.gi.Shell;
|
|
||||||
const St = imports.gi.St;
|
|
||||||
const Atk = imports.gi.Atk;
|
|
||||||
|
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const SwitcherPopup = imports.ui.switcherPopup;
|
const SwitcherPopup = imports.ui.switcherPopup;
|
||||||
const Tweener = imports.ui.tweener;
|
|
||||||
|
|
||||||
var APP_ICON_HOVER_TIMEOUT = 200; // milliseconds
|
var APP_ICON_HOVER_TIMEOUT = 200; // milliseconds
|
||||||
|
|
||||||
var THUMBNAIL_DEFAULT_SIZE = 256;
|
var THUMBNAIL_DEFAULT_SIZE = 256;
|
||||||
var THUMBNAIL_POPUP_TIME = 500; // milliseconds
|
var THUMBNAIL_POPUP_TIME = 500; // milliseconds
|
||||||
var THUMBNAIL_FADE_TIME = 0.1; // seconds
|
var THUMBNAIL_FADE_TIME = 100; // milliseconds
|
||||||
|
|
||||||
var WINDOW_PREVIEW_SIZE = 128;
|
var WINDOW_PREVIEW_SIZE = 128;
|
||||||
var APP_ICON_SIZE = 96;
|
var APP_ICON_SIZE = 96;
|
||||||
@@ -43,7 +36,7 @@ function _createWindowClone(window, size) {
|
|||||||
// usual hack for the usual bug in ClutterBinLayout...
|
// usual hack for the usual bug in ClutterBinLayout...
|
||||||
x_expand: true,
|
x_expand: true,
|
||||||
y_expand: true });
|
y_expand: true });
|
||||||
};
|
}
|
||||||
|
|
||||||
function getWindows(workspace) {
|
function getWindows(workspace) {
|
||||||
// We ignore skip-taskbar windows in switchers, but if they are attached
|
// We ignore skip-taskbar windows in switchers, but if they are attached
|
||||||
@@ -94,9 +87,9 @@ class AppSwitcherPopup extends SwitcherPopup.SwitcherPopup {
|
|||||||
let hPadding = leftPadding + rightPadding;
|
let hPadding = leftPadding + rightPadding;
|
||||||
|
|
||||||
let icon = this._items[this._selectedIndex];
|
let icon = this._items[this._selectedIndex];
|
||||||
let [posX, posY] = icon.get_transformed_position();
|
let [posX] = icon.get_transformed_position();
|
||||||
let thumbnailCenter = posX + icon.width / 2;
|
let thumbnailCenter = posX + icon.width / 2;
|
||||||
let [childMinWidth, childNaturalWidth] = this._thumbnails.get_preferred_width(-1);
|
let [, childNaturalWidth] = this._thumbnails.get_preferred_width(-1);
|
||||||
childBox.x1 = Math.max(primary.x + leftPadding, Math.floor(thumbnailCenter - childNaturalWidth / 2));
|
childBox.x1 = Math.max(primary.x + leftPadding, Math.floor(thumbnailCenter - childNaturalWidth / 2));
|
||||||
if (childBox.x1 + childNaturalWidth > primary.x + primary.width - hPadding) {
|
if (childBox.x1 + childNaturalWidth > primary.x + primary.width - hPadding) {
|
||||||
let offset = childBox.x1 + childNaturalWidth - primary.width + hPadding;
|
let offset = childBox.x1 + childNaturalWidth - primary.width + hPadding;
|
||||||
@@ -110,7 +103,7 @@ class AppSwitcherPopup extends SwitcherPopup.SwitcherPopup {
|
|||||||
childBox.x2 = primary.x + primary.width - rightPadding;
|
childBox.x2 = primary.x + primary.width - rightPadding;
|
||||||
childBox.y1 = this._switcherList.allocation.y2 + spacing;
|
childBox.y1 = this._switcherList.allocation.y2 + spacing;
|
||||||
this._thumbnails.addClones(primary.y + primary.height - bottomPadding - childBox.y1);
|
this._thumbnails.addClones(primary.y + primary.height - bottomPadding - childBox.y1);
|
||||||
let [childMinHeight, childNaturalHeight] = this._thumbnails.get_preferred_height(-1);
|
let [, childNaturalHeight] = this._thumbnails.get_preferred_height(-1);
|
||||||
childBox.y2 = childBox.y1 + childNaturalHeight;
|
childBox.y2 = childBox.y1 + childNaturalHeight;
|
||||||
this._thumbnails.allocate(childBox, flags);
|
this._thumbnails.allocate(childBox, flags);
|
||||||
}
|
}
|
||||||
@@ -298,7 +291,7 @@ class AppSwitcherPopup extends SwitcherPopup.SwitcherPopup {
|
|||||||
if (this._thumbnails)
|
if (this._thumbnails)
|
||||||
this._destroyThumbnails();
|
this._destroyThumbnails();
|
||||||
if (this._thumbnailTimeoutId != 0)
|
if (this._thumbnailTimeoutId != 0)
|
||||||
Mainloop.source_remove(this._thumbnailTimeoutId);
|
GLib.source_remove(this._thumbnailTimeoutId);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -333,7 +326,7 @@ class AppSwitcherPopup extends SwitcherPopup.SwitcherPopup {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (this._thumbnailTimeoutId != 0) {
|
if (this._thumbnailTimeoutId != 0) {
|
||||||
Mainloop.source_remove(this._thumbnailTimeoutId);
|
GLib.source_remove(this._thumbnailTimeoutId);
|
||||||
this._thumbnailTimeoutId = 0;
|
this._thumbnailTimeoutId = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -350,7 +343,8 @@ class AppSwitcherPopup extends SwitcherPopup.SwitcherPopup {
|
|||||||
this._thumbnails.highlight(window, forceAppFocus);
|
this._thumbnails.highlight(window, forceAppFocus);
|
||||||
} else if (this._items[this._selectedIndex].cachedWindows.length > 1 &&
|
} else if (this._items[this._selectedIndex].cachedWindows.length > 1 &&
|
||||||
!forceAppFocus) {
|
!forceAppFocus) {
|
||||||
this._thumbnailTimeoutId = Mainloop.timeout_add (
|
this._thumbnailTimeoutId = GLib.timeout_add(
|
||||||
|
GLib.PRIORITY_DEFAULT,
|
||||||
THUMBNAIL_POPUP_TIME,
|
THUMBNAIL_POPUP_TIME,
|
||||||
this._timeoutPopupThumbnails.bind(this));
|
this._timeoutPopupThumbnails.bind(this));
|
||||||
GLib.Source.set_name_by_id(this._thumbnailTimeoutId, '[gnome-shell] this._timeoutPopupThumbnails');
|
GLib.Source.set_name_by_id(this._thumbnailTimeoutId, '[gnome-shell] this._timeoutPopupThumbnails');
|
||||||
@@ -367,15 +361,15 @@ class AppSwitcherPopup extends SwitcherPopup.SwitcherPopup {
|
|||||||
|
|
||||||
_destroyThumbnails() {
|
_destroyThumbnails() {
|
||||||
let thumbnailsActor = this._thumbnails;
|
let thumbnailsActor = this._thumbnails;
|
||||||
Tweener.addTween(thumbnailsActor,
|
this._thumbnails.ease({
|
||||||
{ opacity: 0,
|
opacity: 0,
|
||||||
time: THUMBNAIL_FADE_TIME,
|
duration: THUMBNAIL_FADE_TIME,
|
||||||
transition: 'easeOutQuad',
|
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
|
||||||
onComplete: () => {
|
onComplete: () => {
|
||||||
thumbnailsActor.destroy();
|
thumbnailsActor.destroy();
|
||||||
this.thumbnailsVisible = false;
|
this.thumbnailsVisible = false;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
this._thumbnails = null;
|
this._thumbnails = null;
|
||||||
if (this._switcherList._items[this._selectedIndex])
|
if (this._switcherList._items[this._selectedIndex])
|
||||||
this._switcherList._items[this._selectedIndex].remove_accessible_state (Atk.StateType.EXPANDED);
|
this._switcherList._items[this._selectedIndex].remove_accessible_state (Atk.StateType.EXPANDED);
|
||||||
@@ -398,12 +392,14 @@ class AppSwitcherPopup extends SwitcherPopup.SwitcherPopup {
|
|||||||
this._thumbnails.get_allocation_box();
|
this._thumbnails.get_allocation_box();
|
||||||
|
|
||||||
this._thumbnails.opacity = 0;
|
this._thumbnails.opacity = 0;
|
||||||
Tweener.addTween(this._thumbnails,
|
this._thumbnails.ease({
|
||||||
{ opacity: 255,
|
opacity: 255,
|
||||||
time: THUMBNAIL_FADE_TIME,
|
duration: THUMBNAIL_FADE_TIME,
|
||||||
transition: 'easeOutQuad',
|
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
|
||||||
onComplete: () => { this.thumbnailsVisible = true; }
|
onComplete: () => {
|
||||||
});
|
this.thumbnailsVisible = true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
this._switcherList._items[this._selectedIndex].add_accessible_state (Atk.StateType.EXPANDED);
|
this._switcherList._items[this._selectedIndex].add_accessible_state (Atk.StateType.EXPANDED);
|
||||||
}
|
}
|
||||||
@@ -441,8 +437,8 @@ class CyclerHighlight {
|
|||||||
if (this._clone.source)
|
if (this._clone.source)
|
||||||
this._clone.source.sync_visibility();
|
this._clone.source.sync_visibility();
|
||||||
|
|
||||||
let windowActor = this._window ? this._window.get_compositor_private()
|
let windowActor = this._window
|
||||||
: null;
|
? this._window.get_compositor_private() : null;
|
||||||
|
|
||||||
if (windowActor)
|
if (windowActor)
|
||||||
windowActor.hide();
|
windowActor.hide();
|
||||||
@@ -466,7 +462,7 @@ class CyclerHighlight {
|
|||||||
_onDestroy() {
|
_onDestroy() {
|
||||||
this.window = null;
|
this.window = null;
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
// We don't show an actual popup, so just provide what SwitcherPopup
|
// We don't show an actual popup, so just provide what SwitcherPopup
|
||||||
// expects instead of inheriting from SwitcherList
|
// expects instead of inheriting from SwitcherList
|
||||||
@@ -476,17 +472,15 @@ var CyclerList = GObject.registerClass({
|
|||||||
'item-removed': { param_types: [GObject.TYPE_INT] },
|
'item-removed': { param_types: [GObject.TYPE_INT] },
|
||||||
'item-highlighted': { param_types: [GObject.TYPE_INT] } },
|
'item-highlighted': { param_types: [GObject.TYPE_INT] } },
|
||||||
}, class CyclerList extends St.Widget {
|
}, class CyclerList extends St.Widget {
|
||||||
highlight(index, justOutline) {
|
highlight(index, _justOutline) {
|
||||||
this.emit('item-highlighted', index);
|
this.emit('item-highlighted', index);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var CyclerPopup = GObject.registerClass(
|
var CyclerPopup = GObject.registerClass({
|
||||||
class CyclerPopup extends SwitcherPopup.SwitcherPopup {
|
GTypeFlags: GObject.TypeFlags.ABSTRACT
|
||||||
|
}, class CyclerPopup extends SwitcherPopup.SwitcherPopup {
|
||||||
_init() {
|
_init() {
|
||||||
if (new.target === CyclerPopup)
|
|
||||||
throw new TypeError('Cannot instantiate abstract class ' + new.target.name);
|
|
||||||
|
|
||||||
super._init();
|
super._init();
|
||||||
|
|
||||||
this._items = this._getWindows();
|
this._items = this._getWindows();
|
||||||
@@ -503,7 +497,7 @@ class CyclerPopup extends SwitcherPopup.SwitcherPopup {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
_highlightItem(index, justOutline) {
|
_highlightItem(index, _justOutline) {
|
||||||
this._highlight.window = this._items[index];
|
this._highlight.window = this._items[index];
|
||||||
global.window_group.set_child_above_sibling(this._highlight.actor, null);
|
global.window_group.set_child_above_sibling(this._highlight.actor, null);
|
||||||
}
|
}
|
||||||
@@ -626,9 +620,8 @@ class WindowSwitcherPopup extends SwitcherPopup.SwitcherPopup {
|
|||||||
var WindowCyclerPopup = GObject.registerClass(
|
var WindowCyclerPopup = GObject.registerClass(
|
||||||
class WindowCyclerPopup extends CyclerPopup {
|
class WindowCyclerPopup extends CyclerPopup {
|
||||||
_init() {
|
_init() {
|
||||||
super._init();
|
|
||||||
|
|
||||||
this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell.window-switcher' });
|
this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell.window-switcher' });
|
||||||
|
super._init();
|
||||||
}
|
}
|
||||||
|
|
||||||
_getWindows() {
|
_getWindows() {
|
||||||
@@ -655,8 +648,9 @@ class WindowCyclerPopup extends CyclerPopup {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var AppIcon = GObject.registerClass(
|
var AppIcon = GObject.registerClass({
|
||||||
class AppIcon extends St.BoxLayout {
|
GTypeName: 'AltTab_AppIcon'
|
||||||
|
}, class AppIcon extends St.BoxLayout {
|
||||||
_init(app) {
|
_init(app) {
|
||||||
super._init({ style_class: 'alt-tab-app',
|
super._init({ style_class: 'alt-tab-app',
|
||||||
vertical: true });
|
vertical: true });
|
||||||
@@ -670,17 +664,10 @@ class AppIcon extends St.BoxLayout {
|
|||||||
this.add(this.label, { x_fill: false });
|
this.add(this.label, { x_fill: false });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line camelcase
|
||||||
set_size(size) {
|
set_size(size) {
|
||||||
this.icon = this.app.create_icon_texture(size);
|
this.icon = this.app.create_icon_texture(size);
|
||||||
this._iconBin.child = this.icon;
|
this._iconBin.child = this.icon;
|
||||||
this._iconBin.set_size(size, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
vfunc_get_preferred_width(forHeight) {
|
|
||||||
let [minWidth, ] = super.vfunc_get_preferred_width(forHeight);
|
|
||||||
|
|
||||||
minWidth = Math.max(minWidth, forHeight);
|
|
||||||
return [minWidth, minWidth];
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -725,7 +712,7 @@ class AppSwitcher extends SwitcherPopup.SwitcherList {
|
|||||||
|
|
||||||
_onDestroy() {
|
_onDestroy() {
|
||||||
if (this._mouseTimeOutId != 0)
|
if (this._mouseTimeOutId != 0)
|
||||||
Mainloop.source_remove(this._mouseTimeOutId);
|
GLib.source_remove(this._mouseTimeOutId);
|
||||||
|
|
||||||
this.icons.forEach(icon => {
|
this.icons.forEach(icon => {
|
||||||
icon.app.disconnect(icon._stateChangedId);
|
icon.app.disconnect(icon._stateChangedId);
|
||||||
@@ -734,15 +721,16 @@ class AppSwitcher extends SwitcherPopup.SwitcherList {
|
|||||||
|
|
||||||
_setIconSize() {
|
_setIconSize() {
|
||||||
let j = 0;
|
let j = 0;
|
||||||
while(this._items.length > 1 && this._items[j].style_class != 'item-box') {
|
while (this._items.length > 1 && this._items[j].style_class != 'item-box') {
|
||||||
j++;
|
j++;
|
||||||
}
|
}
|
||||||
let themeNode = this._items[j].get_theme_node();
|
let themeNode = this._items[j].get_theme_node();
|
||||||
|
this._list.ensure_style();
|
||||||
|
|
||||||
let iconPadding = themeNode.get_horizontal_padding();
|
let iconPadding = themeNode.get_horizontal_padding();
|
||||||
let iconBorder = themeNode.get_border_width(St.Side.LEFT) + themeNode.get_border_width(St.Side.RIGHT);
|
let iconBorder = themeNode.get_border_width(St.Side.LEFT) + themeNode.get_border_width(St.Side.RIGHT);
|
||||||
let [iconMinHeight, iconNaturalHeight] = this.icons[j].label.get_preferred_height(-1);
|
let [, labelNaturalHeight] = this.icons[j].label.get_preferred_height(-1);
|
||||||
let iconSpacing = iconNaturalHeight + iconPadding + iconBorder;
|
let iconSpacing = labelNaturalHeight + iconPadding + iconBorder;
|
||||||
let totalSpacing = this._list.spacing * (this._items.length - 1);
|
let totalSpacing = this._list.spacing * (this._items.length - 1);
|
||||||
|
|
||||||
// We just assume the whole screen here due to weirdness happing with the passed width
|
// We just assume the whole screen here due to weirdness happing with the passed width
|
||||||
@@ -755,7 +743,7 @@ class AppSwitcher extends SwitcherPopup.SwitcherList {
|
|||||||
let iconSize = baseIconSizes[0];
|
let iconSize = baseIconSizes[0];
|
||||||
|
|
||||||
if (this._items.length > 1) {
|
if (this._items.length > 1) {
|
||||||
for(let i = 0; i < baseIconSizes.length; i++) {
|
for (let i = 0; i < baseIconSizes.length; i++) {
|
||||||
iconSize = baseIconSizes[i];
|
iconSize = baseIconSizes[i];
|
||||||
let height = iconSizes[i] + iconSpacing;
|
let height = iconSizes[i] + iconSpacing;
|
||||||
let w = height * this._items.length + totalSpacing;
|
let w = height * this._items.length + totalSpacing;
|
||||||
@@ -766,7 +754,7 @@ class AppSwitcher extends SwitcherPopup.SwitcherList {
|
|||||||
|
|
||||||
this._iconSize = iconSize;
|
this._iconSize = iconSize;
|
||||||
|
|
||||||
for(let i = 0; i < this.icons.length; i++) {
|
for (let i = 0; i < this.icons.length; i++) {
|
||||||
if (this.icons[i].icon != null)
|
if (this.icons[i].icon != null)
|
||||||
break;
|
break;
|
||||||
this.icons[i].set_size(iconSize);
|
this.icons[i].set_size(iconSize);
|
||||||
@@ -803,21 +791,24 @@ class AppSwitcher extends SwitcherPopup.SwitcherList {
|
|||||||
// activation when the thumbnail list is open
|
// activation when the thumbnail list is open
|
||||||
_onItemEnter(index) {
|
_onItemEnter(index) {
|
||||||
if (this._mouseTimeOutId != 0)
|
if (this._mouseTimeOutId != 0)
|
||||||
Mainloop.source_remove(this._mouseTimeOutId);
|
GLib.source_remove(this._mouseTimeOutId);
|
||||||
if (this._altTabPopup.thumbnailsVisible) {
|
if (this._altTabPopup.thumbnailsVisible) {
|
||||||
this._mouseTimeOutId = Mainloop.timeout_add(APP_ICON_HOVER_TIMEOUT,
|
this._mouseTimeOutId = GLib.timeout_add(
|
||||||
() => {
|
GLib.PRIORITY_DEFAULT,
|
||||||
this._enterItem(index);
|
APP_ICON_HOVER_TIMEOUT,
|
||||||
this._mouseTimeOutId = 0;
|
() => {
|
||||||
return GLib.SOURCE_REMOVE;
|
this._enterItem(index);
|
||||||
});
|
this._mouseTimeOutId = 0;
|
||||||
|
return GLib.SOURCE_REMOVE;
|
||||||
|
});
|
||||||
GLib.Source.set_name_by_id(this._mouseTimeOutId, '[gnome-shell] this._enterItem');
|
GLib.Source.set_name_by_id(this._mouseTimeOutId, '[gnome-shell] this._enterItem');
|
||||||
} else
|
} else {
|
||||||
this._itemEntered(index);
|
this._itemEntered(index);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_enterItem(index) {
|
_enterItem(index) {
|
||||||
let [x, y, mask] = global.get_pointer();
|
let [x, y] = global.get_pointer();
|
||||||
let pickedActor = global.stage.get_actor_at_pos(Clutter.PickMode.ALL, x, y);
|
let pickedActor = global.stage.get_actor_at_pos(Clutter.PickMode.ALL, x, y);
|
||||||
if (this._items[index].contains(pickedActor))
|
if (this._items[index].contains(pickedActor))
|
||||||
this._itemEntered(index);
|
this._itemEntered(index);
|
||||||
@@ -858,9 +849,8 @@ class AppSwitcher extends SwitcherPopup.SwitcherList {
|
|||||||
this._removeIcon(app);
|
this._removeIcon(app);
|
||||||
});
|
});
|
||||||
|
|
||||||
let n = this._arrows.length;
|
|
||||||
let arrow = new St.DrawingArea({ style_class: 'switcher-arrow' });
|
let arrow = new St.DrawingArea({ style_class: 'switcher-arrow' });
|
||||||
arrow.connect('repaint', () => { SwitcherPopup.drawArrow(arrow, St.Side.BOTTOM); });
|
arrow.connect('repaint', () => SwitcherPopup.drawArrow(arrow, St.Side.BOTTOM));
|
||||||
this.add_actor(arrow);
|
this.add_actor(arrow);
|
||||||
this._arrows.push(arrow);
|
this._arrows.push(arrow);
|
||||||
|
|
||||||
@@ -887,9 +877,9 @@ class ThumbnailList extends SwitcherPopup.SwitcherList {
|
|||||||
_init(windows) {
|
_init(windows) {
|
||||||
super._init(false);
|
super._init(false);
|
||||||
|
|
||||||
this._labels = new Array();
|
this._labels = [];
|
||||||
this._thumbnailBins = new Array();
|
this._thumbnailBins = [];
|
||||||
this._clones = new Array();
|
this._clones = [];
|
||||||
this._windows = windows;
|
this._windows = windows;
|
||||||
|
|
||||||
for (let i = 0; i < windows.length; i++) {
|
for (let i = 0; i < windows.length; i++) {
|
||||||
@@ -925,7 +915,7 @@ class ThumbnailList extends SwitcherPopup.SwitcherList {
|
|||||||
return;
|
return;
|
||||||
let totalPadding = this._items[0].get_theme_node().get_horizontal_padding() + this._items[0].get_theme_node().get_vertical_padding();
|
let totalPadding = this._items[0].get_theme_node().get_horizontal_padding() + this._items[0].get_theme_node().get_vertical_padding();
|
||||||
totalPadding += this.get_theme_node().get_horizontal_padding() + this.get_theme_node().get_vertical_padding();
|
totalPadding += this.get_theme_node().get_horizontal_padding() + this.get_theme_node().get_vertical_padding();
|
||||||
let [labelMinHeight, labelNaturalHeight] = this._labels[0].get_preferred_height(-1);
|
let [, labelNaturalHeight] = this._labels[0].get_preferred_height(-1);
|
||||||
let spacing = this._items[0].child.get_theme_node().get_length('spacing');
|
let spacing = this._items[0].child.get_theme_node().get_length('spacing');
|
||||||
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
||||||
let thumbnailSize = THUMBNAIL_DEFAULT_SIZE * scaleFactor;
|
let thumbnailSize = THUMBNAIL_DEFAULT_SIZE * scaleFactor;
|
||||||
@@ -950,7 +940,7 @@ class ThumbnailList extends SwitcherPopup.SwitcherList {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Make sure we only do this once
|
// Make sure we only do this once
|
||||||
this._thumbnailBins = new Array();
|
this._thumbnailBins = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
_removeThumbnail(source, clone) {
|
_removeThumbnail(source, clone) {
|
||||||
@@ -1001,32 +991,32 @@ class WindowIcon extends St.BoxLayout {
|
|||||||
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
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, size * scaleFactor));
|
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, size * scaleFactor));
|
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,
|
||||||
APP_ICON_SIZE_SMALL));
|
APP_ICON_SIZE_SMALL));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case AppIconMode.APP_ICON_ONLY:
|
case AppIconMode.APP_ICON_ONLY:
|
||||||
size = APP_ICON_SIZE;
|
size = APP_ICON_SIZE;
|
||||||
this._icon.add_actor(this._createAppIcon(this.app, size));
|
this._icon.add_actor(this._createAppIcon(this.app, size));
|
||||||
}
|
}
|
||||||
|
|
||||||
this._icon.set_size(size * scaleFactor, size * scaleFactor);
|
this._icon.set_size(size * scaleFactor, size * scaleFactor);
|
||||||
}
|
}
|
||||||
|
|
||||||
_createAppIcon(app, size) {
|
_createAppIcon(app, size) {
|
||||||
let appIcon = app ? app.create_icon_texture(size)
|
let appIcon = app
|
||||||
: new St.Icon({ icon_name: 'icon-missing',
|
? app.create_icon_texture(size)
|
||||||
icon_size: size });
|
: new St.Icon({ icon_name: 'icon-missing', icon_size: size });
|
||||||
appIcon.x_expand = appIcon.y_expand = true;
|
appIcon.x_expand = appIcon.y_expand = true;
|
||||||
appIcon.x_align = appIcon.y_align = Clutter.ActorAlign.END;
|
appIcon.x_align = appIcon.y_align = Clutter.ActorAlign.END;
|
||||||
|
|
||||||
@@ -1053,8 +1043,8 @@ class WindowList extends SwitcherPopup.SwitcherList {
|
|||||||
this.addItem(icon, icon.label);
|
this.addItem(icon, icon.label);
|
||||||
this.icons.push(icon);
|
this.icons.push(icon);
|
||||||
|
|
||||||
icon._unmanagedSignalId = icon.window.connect('unmanaged', (window) => {
|
icon._unmanagedSignalId = icon.window.connect('unmanaged', window => {
|
||||||
this._removeWindow(window)
|
this._removeWindow(window);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1090,7 +1080,7 @@ class WindowList extends SwitcherPopup.SwitcherList {
|
|||||||
childBox.y1 = childBox.y2 - this._label.height;
|
childBox.y1 = childBox.y2 - this._label.height;
|
||||||
this._label.allocate(childBox, flags);
|
this._label.allocate(childBox, flags);
|
||||||
|
|
||||||
let totalLabelHeight = this._label.height + themeNode.get_padding(St.Side.BOTTOM)
|
let totalLabelHeight = this._label.height + themeNode.get_padding(St.Side.BOTTOM);
|
||||||
childBox.x1 = box.x1;
|
childBox.x1 = box.x1;
|
||||||
childBox.x2 = box.x2;
|
childBox.x2 = box.x2;
|
||||||
childBox.y1 = box.y1;
|
childBox.y1 = box.y1;
|
||||||
|
|||||||
@@ -1,22 +1,25 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
/* exported Animation, AnimatedIcon, Spinner */
|
||||||
|
|
||||||
const GLib = imports.gi.GLib;
|
const { Clutter, GLib, Gio, St } = imports.gi;
|
||||||
const Gio = imports.gi.Gio;
|
|
||||||
const Mainloop = imports.mainloop;
|
|
||||||
const St = imports.gi.St;
|
|
||||||
const Signals = imports.signals;
|
|
||||||
const Atk = imports.gi.Atk;
|
|
||||||
|
|
||||||
const Tweener = imports.ui.tweener;
|
|
||||||
|
|
||||||
var ANIMATED_ICON_UPDATE_TIMEOUT = 16;
|
var ANIMATED_ICON_UPDATE_TIMEOUT = 16;
|
||||||
var SPINNER_ANIMATION_TIME = 0.3;
|
var SPINNER_ANIMATION_TIME = 300;
|
||||||
var SPINNER_ANIMATION_DELAY = 1.0;
|
var SPINNER_ANIMATION_DELAY = 1000;
|
||||||
|
|
||||||
var Animation = class {
|
var Animation = class {
|
||||||
constructor(file, width, height, speed) {
|
constructor(file, width, height, speed) {
|
||||||
this.actor = new St.Bin();
|
this.actor = new St.Bin();
|
||||||
|
this.actor.set_size(width, height);
|
||||||
this.actor.connect('destroy', this._onDestroy.bind(this));
|
this.actor.connect('destroy', this._onDestroy.bind(this));
|
||||||
|
this.actor.connect('notify::size', this._syncAnimationSize.bind(this));
|
||||||
|
this.actor.connect('resource-scale-changed',
|
||||||
|
this._loadFile.bind(this, file, width, height));
|
||||||
|
|
||||||
|
let themeContext = St.ThemeContext.get_for_stage(global.stage);
|
||||||
|
this._scaleChangedId = themeContext.connect('notify::scale-factor',
|
||||||
|
this._loadFile.bind(this, file, width, height));
|
||||||
|
|
||||||
this._speed = speed;
|
this._speed = speed;
|
||||||
|
|
||||||
this._isLoaded = false;
|
this._isLoaded = false;
|
||||||
@@ -24,10 +27,7 @@ var Animation = class {
|
|||||||
this._timeoutId = 0;
|
this._timeoutId = 0;
|
||||||
this._frame = 0;
|
this._frame = 0;
|
||||||
|
|
||||||
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
this._loadFile(file, width, height);
|
||||||
this._animations = St.TextureCache.get_default().load_sliced_image (file, width, height, scaleFactor,
|
|
||||||
this._animationsLoaded.bind(this));
|
|
||||||
this.actor.set_child(this._animations);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
play() {
|
play() {
|
||||||
@@ -44,13 +44,40 @@ var Animation = class {
|
|||||||
|
|
||||||
stop() {
|
stop() {
|
||||||
if (this._timeoutId > 0) {
|
if (this._timeoutId > 0) {
|
||||||
Mainloop.source_remove(this._timeoutId);
|
GLib.source_remove(this._timeoutId);
|
||||||
this._timeoutId = 0;
|
this._timeoutId = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
this._isPlaying = false;
|
this._isPlaying = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_loadFile(file, width, height) {
|
||||||
|
let [validResourceScale, resourceScale] = this.actor.get_resource_scale();
|
||||||
|
let wasPlaying = this._isPlaying;
|
||||||
|
|
||||||
|
if (this._isPlaying)
|
||||||
|
this.stop();
|
||||||
|
|
||||||
|
this._isLoaded = false;
|
||||||
|
this.actor.destroy_all_children();
|
||||||
|
|
||||||
|
if (!validResourceScale) {
|
||||||
|
if (wasPlaying)
|
||||||
|
this.play();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let textureCache = St.TextureCache.get_default();
|
||||||
|
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
||||||
|
this._animations = textureCache.load_sliced_image(file, width, height,
|
||||||
|
scaleFactor, resourceScale,
|
||||||
|
this._animationsLoaded.bind(this));
|
||||||
|
this.actor.set_child(this._animations);
|
||||||
|
|
||||||
|
if (wasPlaying)
|
||||||
|
this.play();
|
||||||
|
}
|
||||||
|
|
||||||
_showFrame(frame) {
|
_showFrame(frame) {
|
||||||
let oldFrameActor = this._animations.get_child_at_index(this._frame);
|
let oldFrameActor = this._animations.get_child_at_index(this._frame);
|
||||||
if (oldFrameActor)
|
if (oldFrameActor)
|
||||||
@@ -68,15 +95,32 @@ var Animation = class {
|
|||||||
return GLib.SOURCE_CONTINUE;
|
return GLib.SOURCE_CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_syncAnimationSize() {
|
||||||
|
if (!this._isLoaded)
|
||||||
|
return;
|
||||||
|
|
||||||
|
let [width, height] = this.actor.get_size();
|
||||||
|
|
||||||
|
for (let i = 0; i < this._animations.get_n_children(); ++i)
|
||||||
|
this._animations.get_child_at_index(i).set_size(width, height);
|
||||||
|
}
|
||||||
|
|
||||||
_animationsLoaded() {
|
_animationsLoaded() {
|
||||||
this._isLoaded = this._animations.get_n_children() > 0;
|
this._isLoaded = this._animations.get_n_children() > 0;
|
||||||
|
|
||||||
|
this._syncAnimationSize();
|
||||||
|
|
||||||
if (this._isPlaying)
|
if (this._isPlaying)
|
||||||
this.play();
|
this.play();
|
||||||
}
|
}
|
||||||
|
|
||||||
_onDestroy() {
|
_onDestroy() {
|
||||||
this.stop();
|
this.stop();
|
||||||
|
|
||||||
|
let themeContext = St.ThemeContext.get_for_stage(global.stage);
|
||||||
|
if (this._scaleChangedId)
|
||||||
|
themeContext.disconnect(this._scaleChangedId);
|
||||||
|
this._scaleChangedId = 0;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -87,7 +131,7 @@ var AnimatedIcon = class extends Animation {
|
|||||||
};
|
};
|
||||||
|
|
||||||
var Spinner = class extends AnimatedIcon {
|
var Spinner = class extends AnimatedIcon {
|
||||||
constructor(size, animate=false) {
|
constructor(size, animate = false) {
|
||||||
let file = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/process-working.svg');
|
let file = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/process-working.svg');
|
||||||
super(file, size);
|
super(file, size);
|
||||||
|
|
||||||
@@ -101,15 +145,15 @@ var Spinner = class extends AnimatedIcon {
|
|||||||
}
|
}
|
||||||
|
|
||||||
play() {
|
play() {
|
||||||
Tweener.removeTweens(this.actor);
|
this.actor.remove_all_transitions();
|
||||||
|
|
||||||
if (this._animate) {
|
if (this._animate) {
|
||||||
super.play();
|
super.play();
|
||||||
Tweener.addTween(this.actor, {
|
this.actor.ease({
|
||||||
opacity: 255,
|
opacity: 255,
|
||||||
delay: SPINNER_ANIMATION_DELAY,
|
delay: SPINNER_ANIMATION_DELAY,
|
||||||
time: SPINNER_ANIMATION_TIME,
|
duration: SPINNER_ANIMATION_TIME,
|
||||||
transition: 'linear'
|
mode: Clutter.AnimationMode.LINEAR
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
this.actor.opacity = 255;
|
this.actor.opacity = 255;
|
||||||
@@ -118,16 +162,14 @@ var Spinner = class extends AnimatedIcon {
|
|||||||
}
|
}
|
||||||
|
|
||||||
stop() {
|
stop() {
|
||||||
Tweener.removeTweens(this.actor);
|
this.actor.remove_all_transitions();
|
||||||
|
|
||||||
if (this._animate) {
|
if (this._animate) {
|
||||||
Tweener.addTween(this.actor, {
|
this.actor.ease({
|
||||||
opacity: 0,
|
opacity: 0,
|
||||||
time: SPINNER_ANIMATION_TIME,
|
time: SPINNER_ANIMATION_TIME,
|
||||||
transition: 'linear',
|
transition: 'linear',
|
||||||
onComplete: () => {
|
onComplete: () => super.stop()
|
||||||
this.stop(false);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
this.actor.opacity = 0;
|
this.actor.opacity = 0;
|
||||||
|
|||||||
1307
js/ui/appDisplay.js
@@ -1,4 +1,5 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
/* exported getAppFavorites */
|
||||||
|
|
||||||
const Shell = imports.gi.Shell;
|
const Shell = imports.gi.Shell;
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
@@ -14,36 +15,47 @@ const RENAMED_DESKTOP_IDS = {
|
|||||||
'epiphany.desktop': 'org.gnome.Epiphany.desktop',
|
'epiphany.desktop': 'org.gnome.Epiphany.desktop',
|
||||||
'evolution.desktop': 'org.gnome.Evolution.desktop',
|
'evolution.desktop': 'org.gnome.Evolution.desktop',
|
||||||
'file-roller.desktop': 'org.gnome.FileRoller.desktop',
|
'file-roller.desktop': 'org.gnome.FileRoller.desktop',
|
||||||
|
'five-or-more.desktop': 'org.gnome.five-or-more.desktop',
|
||||||
|
'four-in-a-row.desktop': 'org.gnome.Four-in-a-row.desktop',
|
||||||
'gcalctool.desktop': 'org.gnome.Calculator.desktop',
|
'gcalctool.desktop': 'org.gnome.Calculator.desktop',
|
||||||
'geary.desktop': 'org.gnome.Geary.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': 'org.gnome.Chess.desktop',
|
||||||
'glines.desktop': 'five-or-more.desktop',
|
'glines.desktop': 'org.gnome.five-or-more.desktop',
|
||||||
'gnect.desktop': 'four-in-a-row.desktop',
|
'gnect.desktop': 'org.gnome.Four-in-a-row.desktop',
|
||||||
'gnibbles.desktop': 'org.gnome.Nibbles.desktop',
|
'gnibbles.desktop': 'org.gnome.Nibbles.desktop',
|
||||||
'gnobots2.desktop': 'gnome-robots.desktop',
|
'gnobots2.desktop': 'org.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-calculator.desktop': 'org.gnome.Calculator.desktop',
|
||||||
|
'gnome-chess.desktop': 'org.gnome.Chess.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-klotski.desktop': 'org.gnome.Klotski.desktop',
|
||||||
'gnome-nibbles.desktop': 'org.gnome.Nibbles.desktop',
|
'gnome-nibbles.desktop': 'org.gnome.Nibbles.desktop',
|
||||||
'gnome-mahjongg.desktop': 'org.gnome.Mahjongg.desktop',
|
'gnome-mahjongg.desktop': 'org.gnome.Mahjongg.desktop',
|
||||||
|
'gnome-mines.desktop': 'org.gnome.Mines.desktop',
|
||||||
'gnome-music.desktop': 'org.gnome.Music.desktop',
|
'gnome-music.desktop': 'org.gnome.Music.desktop',
|
||||||
'gnome-photos.desktop': 'org.gnome.Photos.desktop',
|
'gnome-photos.desktop': 'org.gnome.Photos.desktop',
|
||||||
|
'gnome-robots.desktop': 'org.gnome.Robots.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-terminal.desktop': 'org.gnome.Terminal.desktop',
|
||||||
|
'gnome-tetravex.desktop': 'org.gnome.Tetravex.desktop',
|
||||||
'gnome-tweaks.desktop': 'org.gnome.tweaks.desktop',
|
'gnome-tweaks.desktop': 'org.gnome.tweaks.desktop',
|
||||||
'gnome-weather.desktop': 'org.gnome.Weather.Application.desktop',
|
'gnome-weather.desktop': 'org.gnome.Weather.desktop',
|
||||||
'gnomine.desktop': 'gnome-mines.desktop',
|
'gnomine.desktop': 'org.gnome.Mines.desktop',
|
||||||
'gnotravex.desktop': 'gnome-tetravex.desktop',
|
'gnotravex.desktop': 'org.gnome.Tetravex.desktop',
|
||||||
'gnotski.desktop': 'gnome-klotski.desktop',
|
'gnotski.desktop': 'org.gnome.Klotski.desktop',
|
||||||
'gtali.desktop': 'tali.desktop',
|
'gtali.desktop': 'org.gnome.Tali.desktop',
|
||||||
'iagno.desktop': 'org.gnome.Iagno.desktop',
|
'iagno.desktop': 'org.gnome.Reversi.desktop',
|
||||||
'nautilus.desktop': 'org.gnome.Nautilus.desktop',
|
'nautilus.desktop': 'org.gnome.Nautilus.desktop',
|
||||||
|
'org.gnome.gnome-2048.desktop': 'org.gnome.TwentyFortyEight.desktop',
|
||||||
|
'org.gnome.taquin.desktop': 'org.gnome.Taquin.desktop',
|
||||||
|
'org.gnome.Weather.Application.desktop': 'org.gnome.Weather.desktop',
|
||||||
'polari.desktop': 'org.gnome.Polari.desktop',
|
'polari.desktop': 'org.gnome.Polari.desktop',
|
||||||
|
'tali.desktop': 'org.gnome.Tali.desktop',
|
||||||
'totem.desktop': 'org.gnome.Totem.desktop',
|
'totem.desktop': 'org.gnome.Totem.desktop',
|
||||||
'evince.desktop': 'org.gnome.Evince.desktop',
|
'evince.desktop': 'org.gnome.Evince.desktop',
|
||||||
};
|
};
|
||||||
@@ -52,7 +64,7 @@ class AppFavorites {
|
|||||||
constructor() {
|
constructor() {
|
||||||
this.FAVORITE_APPS_KEY = 'favorite-apps';
|
this.FAVORITE_APPS_KEY = 'favorite-apps';
|
||||||
this._favorites = {};
|
this._favorites = {};
|
||||||
global.settings.connect('changed::' + this.FAVORITE_APPS_KEY, this._onFavsChanged.bind(this));
|
global.settings.connect(`changed::${this.FAVORITE_APPS_KEY}`, this._onFavsChanged.bind(this));
|
||||||
this.reload();
|
this.reload();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -135,12 +147,11 @@ class AppFavorites {
|
|||||||
|
|
||||||
let app = Shell.AppSystem.get_default().lookup_app(appId);
|
let app = Shell.AppSystem.get_default().lookup_app(appId);
|
||||||
|
|
||||||
Main.overview.setMessage(_("%s has been added to your favorites.").format(app.get_name()),
|
let msg = _("%s has been added to your favorites.").format(app.get_name());
|
||||||
{ forFeedback: true,
|
Main.overview.setMessage(msg, {
|
||||||
undoCallback: () => {
|
forFeedback: true,
|
||||||
this._removeFavorite(appId);
|
undoCallback: () => this._removeFavorite(appId),
|
||||||
}
|
});
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
addFavorite(appId) {
|
addFavorite(appId) {
|
||||||
@@ -153,7 +164,7 @@ class AppFavorites {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_removeFavorite(appId) {
|
_removeFavorite(appId) {
|
||||||
if (!appId in this._favorites)
|
if (!(appId in this._favorites))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
let ids = this._getIds().filter(id => id != appId);
|
let ids = this._getIds().filter(id => id != appId);
|
||||||
@@ -169,14 +180,13 @@ class AppFavorites {
|
|||||||
if (!this._removeFavorite(appId))
|
if (!this._removeFavorite(appId))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Main.overview.setMessage(_("%s has been removed from your favorites.").format(app.get_name()),
|
let msg = _("%s has been removed from your favorites.").format(app.get_name());
|
||||||
{ forFeedback: true,
|
Main.overview.setMessage(msg, {
|
||||||
undoCallback: () => {
|
forFeedback: true,
|
||||||
this._addFavorite(appId, pos);
|
undoCallback: () => this._addFavorite(appId, pos),
|
||||||
}
|
});
|
||||||
});
|
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
Signals.addSignalMethods(AppFavorites.prototype);
|
Signals.addSignalMethods(AppFavorites.prototype);
|
||||||
|
|
||||||
var appFavoritesInstance = null;
|
var appFavoritesInstance = null;
|
||||||
|
|||||||
@@ -1,9 +1,5 @@
|
|||||||
const Clutter = imports.gi.Clutter;
|
/* exported AudioDeviceSelectionDBus */
|
||||||
const Gio = imports.gi.Gio;
|
const { Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi;
|
||||||
const GLib = imports.gi.GLib;
|
|
||||||
const Meta = imports.gi.Meta;
|
|
||||||
const Shell = imports.gi.Shell;
|
|
||||||
const St = imports.gi.St;
|
|
||||||
|
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const ModalDialog = imports.ui.modalDialog;
|
const ModalDialog = imports.ui.modalDialog;
|
||||||
@@ -18,10 +14,11 @@ var AudioDevice = {
|
|||||||
|
|
||||||
const AudioDeviceSelectionIface = loadInterfaceXML('org.gnome.Shell.AudioDeviceSelection');
|
const AudioDeviceSelectionIface = loadInterfaceXML('org.gnome.Shell.AudioDeviceSelection');
|
||||||
|
|
||||||
var AudioDeviceSelectionDialog =
|
var AudioDeviceSelectionDialog = GObject.registerClass({
|
||||||
class AudioDeviceSelectionDialog extends ModalDialog.ModalDialog {
|
Signals: { 'device-selected': { param_types: [GObject.TYPE_UINT] } }
|
||||||
constructor(devices) {
|
}, class AudioDeviceSelectionDialog extends ModalDialog.ModalDialog {
|
||||||
super({ styleClass: 'audio-device-selection-dialog' });
|
_init(devices) {
|
||||||
|
super._init({ styleClass: 'audio-device-selection-dialog' });
|
||||||
|
|
||||||
this._deviceItems = {};
|
this._deviceItems = {};
|
||||||
|
|
||||||
@@ -38,11 +35,7 @@ class AudioDeviceSelectionDialog extends ModalDialog.ModalDialog {
|
|||||||
throw new Error('Too few devices for a selection');
|
throw new Error('Too few devices for a selection');
|
||||||
}
|
}
|
||||||
|
|
||||||
destroy() {
|
_buildLayout() {
|
||||||
super.destroy();
|
|
||||||
}
|
|
||||||
|
|
||||||
_buildLayout(devices) {
|
|
||||||
let title = new St.Label({ style_class: 'audio-selection-title',
|
let title = new St.Label({ style_class: 'audio-selection-title',
|
||||||
text: _("Select Audio Device"),
|
text: _("Select Audio Device"),
|
||||||
x_align: Clutter.ActorAlign.CENTER });
|
x_align: Clutter.ActorAlign.CENTER });
|
||||||
@@ -62,28 +55,28 @@ class AudioDeviceSelectionDialog extends ModalDialog.ModalDialog {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_getDeviceLabel(device) {
|
_getDeviceLabel(device) {
|
||||||
switch(device) {
|
switch (device) {
|
||||||
case AudioDevice.HEADPHONES:
|
case AudioDevice.HEADPHONES:
|
||||||
return _("Headphones");
|
return _("Headphones");
|
||||||
case AudioDevice.HEADSET:
|
case AudioDevice.HEADSET:
|
||||||
return _("Headset");
|
return _("Headset");
|
||||||
case AudioDevice.MICROPHONE:
|
case AudioDevice.MICROPHONE:
|
||||||
return _("Microphone");
|
return _("Microphone");
|
||||||
default:
|
default:
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_getDeviceIcon(device) {
|
_getDeviceIcon(device) {
|
||||||
switch(device) {
|
switch (device) {
|
||||||
case AudioDevice.HEADPHONES:
|
case AudioDevice.HEADPHONES:
|
||||||
return 'audio-headphones-symbolic';
|
return 'audio-headphones-symbolic';
|
||||||
case AudioDevice.HEADSET:
|
case AudioDevice.HEADSET:
|
||||||
return 'audio-headset-symbolic';
|
return 'audio-headset-symbolic';
|
||||||
case AudioDevice.MICROPHONE:
|
case AudioDevice.MICROPHONE:
|
||||||
return 'audio-input-microphone-symbolic';
|
return 'audio-input-microphone-symbolic';
|
||||||
default:
|
default:
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -93,6 +86,7 @@ class AudioDeviceSelectionDialog extends ModalDialog.ModalDialog {
|
|||||||
box.connect('notify::height', () => {
|
box.connect('notify::height', () => {
|
||||||
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => {
|
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => {
|
||||||
box.width = box.height;
|
box.width = box.height;
|
||||||
|
return GLib.SOURCE_REMOVE;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -118,11 +112,11 @@ class AudioDeviceSelectionDialog extends ModalDialog.ModalDialog {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_openSettings() {
|
_openSettings() {
|
||||||
let desktopFile = 'gnome-sound-panel.desktop'
|
let desktopFile = 'gnome-sound-panel.desktop';
|
||||||
let app = Shell.AppSystem.get_default().lookup_app(desktopFile);
|
let app = Shell.AppSystem.get_default().lookup_app(desktopFile);
|
||||||
|
|
||||||
if (!app) {
|
if (!app) {
|
||||||
log('Settings panel for desktop file ' + desktopFile + ' could not be loaded!');
|
log(`Settings panel for desktop file ${desktopFile} could not be loaded!`);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -130,7 +124,7 @@ class AudioDeviceSelectionDialog extends ModalDialog.ModalDialog {
|
|||||||
Main.overview.hide();
|
Main.overview.hide();
|
||||||
app.activate();
|
app.activate();
|
||||||
}
|
}
|
||||||
};
|
});
|
||||||
|
|
||||||
var AudioDeviceSelectionDBus = class AudioDeviceSelectionDBus {
|
var AudioDeviceSelectionDBus = class AudioDeviceSelectionDBus {
|
||||||
constructor() {
|
constructor() {
|
||||||
@@ -167,12 +161,12 @@ var AudioDeviceSelectionDBus = class AudioDeviceSelectionDBus {
|
|||||||
|
|
||||||
let [deviceNames] = params;
|
let [deviceNames] = params;
|
||||||
let devices = 0;
|
let devices = 0;
|
||||||
deviceNames.forEach(n => { devices |= AudioDevice[n.toUpperCase()]; });
|
deviceNames.forEach(n => (devices |= AudioDevice[n.toUpperCase()]));
|
||||||
|
|
||||||
let dialog;
|
let dialog;
|
||||||
try {
|
try {
|
||||||
dialog = new AudioDeviceSelectionDialog(devices);
|
dialog = new AudioDeviceSelectionDialog(devices);
|
||||||
} catch(e) {
|
} catch (e) {
|
||||||
invocation.return_value(null);
|
invocation.return_value(null);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -93,18 +93,12 @@
|
|||||||
// MetaBackgroundImage MetaBackgroundImage
|
// MetaBackgroundImage MetaBackgroundImage
|
||||||
// MetaBackgroundImage MetaBackgroundImage
|
// MetaBackgroundImage MetaBackgroundImage
|
||||||
|
|
||||||
const Clutter = imports.gi.Clutter;
|
const { Clutter, GDesktopEnums, Gio, GLib, GnomeDesktop, Meta } = imports.gi;
|
||||||
const GDesktopEnums = imports.gi.GDesktopEnums;
|
|
||||||
const Gio = imports.gi.Gio;
|
|
||||||
const GLib = imports.gi.GLib;
|
|
||||||
const GnomeDesktop = imports.gi.GnomeDesktop;
|
|
||||||
const Meta = imports.gi.Meta;
|
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
|
|
||||||
const LoginManager = imports.misc.loginManager;
|
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;
|
|
||||||
|
|
||||||
var DEFAULT_BACKGROUND_COLOR = Clutter.Color.from_pixel(0x2e3436ff);
|
var DEFAULT_BACKGROUND_COLOR = Clutter.Color.from_pixel(0x2e3436ff);
|
||||||
|
|
||||||
@@ -113,10 +107,9 @@ const PRIMARY_COLOR_KEY = 'primary-color';
|
|||||||
const SECONDARY_COLOR_KEY = 'secondary-color';
|
const SECONDARY_COLOR_KEY = 'secondary-color';
|
||||||
const COLOR_SHADING_TYPE_KEY = 'color-shading-type';
|
const COLOR_SHADING_TYPE_KEY = 'color-shading-type';
|
||||||
const BACKGROUND_STYLE_KEY = 'picture-options';
|
const BACKGROUND_STYLE_KEY = 'picture-options';
|
||||||
const PICTURE_OPACITY_KEY = 'picture-opacity';
|
|
||||||
const PICTURE_URI_KEY = 'picture-uri';
|
const PICTURE_URI_KEY = 'picture-uri';
|
||||||
|
|
||||||
var FADE_ANIMATION_TIME = 1.0;
|
var FADE_ANIMATION_TIME = 1000;
|
||||||
|
|
||||||
// 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
|
||||||
@@ -262,14 +255,15 @@ var Background = class Background {
|
|||||||
this._refreshAnimation();
|
this._refreshAnimation();
|
||||||
});
|
});
|
||||||
|
|
||||||
this._settingsChangedSignalId = this._settings.connect('changed', () => {
|
this._settingsChangedSignalId =
|
||||||
this.emit('changed');
|
this._settings.connect('changed', this._emitChangedSignal.bind(this));
|
||||||
});
|
|
||||||
|
|
||||||
this._load();
|
this._load();
|
||||||
}
|
}
|
||||||
|
|
||||||
destroy() {
|
destroy() {
|
||||||
|
this.background = null;
|
||||||
|
|
||||||
this._cancellable.cancel();
|
this._cancellable.cancel();
|
||||||
this._removeAnimationTimeout();
|
this._removeAnimationTimeout();
|
||||||
|
|
||||||
@@ -293,6 +287,22 @@ var Background = class Background {
|
|||||||
if (this._settingsChangedSignalId != 0)
|
if (this._settingsChangedSignalId != 0)
|
||||||
this._settings.disconnect(this._settingsChangedSignalId);
|
this._settings.disconnect(this._settingsChangedSignalId);
|
||||||
this._settingsChangedSignalId = 0;
|
this._settingsChangedSignalId = 0;
|
||||||
|
|
||||||
|
if (this._changedIdleId) {
|
||||||
|
GLib.source_remove(this._changedIdleId);
|
||||||
|
this._changedIdleId = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_emitChangedSignal() {
|
||||||
|
if (this._changedIdleId)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this._changedIdleId = GLib.idle_add(GLib.PRIORITY_DEFAULT, () => {
|
||||||
|
this._changedIdleId = 0;
|
||||||
|
this.emit('changed');
|
||||||
|
return GLib.SOURCE_REMOVE;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
updateResolution() {
|
updateResolution() {
|
||||||
@@ -322,12 +332,12 @@ var Background = class Background {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_loadPattern() {
|
_loadPattern() {
|
||||||
let colorString, res, color, secondColor;
|
let colorString, res_, color, secondColor;
|
||||||
|
|
||||||
colorString = this._settings.get_string(PRIMARY_COLOR_KEY);
|
colorString = this._settings.get_string(PRIMARY_COLOR_KEY);
|
||||||
[res, color] = Clutter.Color.from_string(colorString);
|
[res_, color] = Clutter.Color.from_string(colorString);
|
||||||
colorString = this._settings.get_string(SECONDARY_COLOR_KEY);
|
colorString = this._settings.get_string(SECONDARY_COLOR_KEY);
|
||||||
[res, secondColor] = Clutter.Color.from_string(colorString);
|
[res_, secondColor] = Clutter.Color.from_string(colorString);
|
||||||
|
|
||||||
let shadingType = this._settings.get_enum(COLOR_SHADING_TYPE_KEY);
|
let shadingType = this._settings.get_enum(COLOR_SHADING_TYPE_KEY);
|
||||||
|
|
||||||
@@ -348,7 +358,7 @@ var Background = class Background {
|
|||||||
if (changedFile.equal(file)) {
|
if (changedFile.equal(file)) {
|
||||||
let imageCache = Meta.BackgroundImageCache.get_default();
|
let imageCache = Meta.BackgroundImageCache.get_default();
|
||||||
imageCache.purge(changedFile);
|
imageCache.purge(changedFile);
|
||||||
this.emit('changed');
|
this._emitChangedSignal();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
this._fileWatches[key] = signalId;
|
this._fileWatches[key] = signalId;
|
||||||
@@ -421,30 +431,31 @@ var Background = class Background {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
this._updateAnimationTimeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT,
|
this._updateAnimationTimeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT,
|
||||||
interval,
|
interval,
|
||||||
() => {
|
() => {
|
||||||
this._updateAnimationTimeoutId = 0;
|
this._updateAnimationTimeoutId = 0;
|
||||||
this._updateAnimation();
|
this._updateAnimation();
|
||||||
return GLib.SOURCE_REMOVE;
|
return GLib.SOURCE_REMOVE;
|
||||||
});
|
});
|
||||||
GLib.Source.set_name_by_id(this._updateAnimationTimeoutId, '[gnome-shell] this._updateAnimation');
|
GLib.Source.set_name_by_id(this._updateAnimationTimeoutId, '[gnome-shell] this._updateAnimation');
|
||||||
}
|
}
|
||||||
|
|
||||||
_loadAnimation(file) {
|
_loadAnimation(file) {
|
||||||
this._cache.getAnimation({ file: file,
|
this._cache.getAnimation({
|
||||||
settingsSchema: this._settings.schema_id,
|
file: file,
|
||||||
onLoaded: animation => {
|
settingsSchema: this._settings.schema_id,
|
||||||
this._animation = animation;
|
onLoaded: animation => {
|
||||||
|
this._animation = animation;
|
||||||
|
|
||||||
if (!this._animation || this._cancellable.is_cancelled()) {
|
if (!this._animation || this._cancellable.is_cancelled()) {
|
||||||
this._setLoaded();
|
this._setLoaded();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this._updateAnimation();
|
this._updateAnimation();
|
||||||
this._watchFile(file);
|
this._watchFile(file);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
_loadImage(file) {
|
_loadImage(file) {
|
||||||
@@ -453,9 +464,9 @@ var Background = class Background {
|
|||||||
|
|
||||||
let cache = Meta.BackgroundImageCache.get_default();
|
let cache = Meta.BackgroundImageCache.get_default();
|
||||||
let image = cache.load(file);
|
let image = cache.load(file);
|
||||||
if (image.is_loaded())
|
if (image.is_loaded()) {
|
||||||
this._setLoaded();
|
this._setLoaded();
|
||||||
else {
|
} else {
|
||||||
let id = image.connect('loaded', () => {
|
let id = image.connect('loaded', () => {
|
||||||
this._setLoaded();
|
this._setLoaded();
|
||||||
image.disconnect(id);
|
image.disconnect(id);
|
||||||
@@ -622,9 +633,9 @@ var Animation = class Animation {
|
|||||||
}
|
}
|
||||||
|
|
||||||
load(callback) {
|
load(callback) {
|
||||||
this._show = new GnomeDesktop.BGSlideShow({ filename: this.file.get_path() });
|
this._show = new GnomeDesktop.BGSlideShow({ file: this.file });
|
||||||
|
|
||||||
this._show.load_async(null, (object, result) => {
|
this._show.load_async(null, () => {
|
||||||
this.loaded = true;
|
this.loaded = true;
|
||||||
if (callback)
|
if (callback)
|
||||||
callback();
|
callback();
|
||||||
@@ -640,7 +651,7 @@ var Animation = class Animation {
|
|||||||
if (this._show.get_num_slides() < 1)
|
if (this._show.get_num_slides() < 1)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
let [progress, duration, isFixed, filename1, filename2] = this._show.get_current_slide(monitor.width, monitor.height);
|
let [progress, duration, isFixed_, filename1, filename2] = this._show.get_current_slide(monitor.width, monitor.height);
|
||||||
|
|
||||||
this.transitionDuration = duration;
|
this.transitionDuration = duration;
|
||||||
this.transitionProgress = progress;
|
this.transitionProgress = progress;
|
||||||
@@ -699,15 +710,12 @@ var BackgroundManager = class BackgroundManager {
|
|||||||
this._newBackgroundActor = null;
|
this._newBackgroundActor = null;
|
||||||
this.emit('changed');
|
this.emit('changed');
|
||||||
|
|
||||||
Tweener.addTween(oldBackgroundActor,
|
oldBackgroundActor.ease({
|
||||||
{ opacity: 0,
|
opacity: 0,
|
||||||
time: FADE_ANIMATION_TIME,
|
duration: FADE_ANIMATION_TIME,
|
||||||
transition: 'easeOutQuad',
|
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
|
||||||
onComplete() {
|
onComplete: () => oldBackgroundActor.destroy()
|
||||||
oldBackgroundActor.background.run_dispose();
|
});
|
||||||
oldBackgroundActor.destroy();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_updateBackgroundActor() {
|
_updateBackgroundActor() {
|
||||||
@@ -741,20 +749,19 @@ var BackgroundManager = class BackgroundManager {
|
|||||||
|
|
||||||
_createBackgroundActor() {
|
_createBackgroundActor() {
|
||||||
let background = this._backgroundSource.getBackground(this._monitorIndex);
|
let background = this._backgroundSource.getBackground(this._monitorIndex);
|
||||||
let backgroundActor = new Meta.BackgroundActor({ meta_display: global.display,
|
let backgroundActor = new Meta.BackgroundActor({
|
||||||
monitor: this._monitorIndex,
|
meta_display: global.display,
|
||||||
background: background.background,
|
monitor: this._monitorIndex,
|
||||||
vignette: this._vignette,
|
background: background.background,
|
||||||
vignette_sharpness: 0.5,
|
vignette: this._vignette,
|
||||||
brightness: 0.5,
|
vignette_sharpness: 0.5,
|
||||||
});
|
brightness: 0.5,
|
||||||
|
});
|
||||||
|
|
||||||
this._container.add_child(backgroundActor);
|
this._container.add_child(backgroundActor);
|
||||||
|
|
||||||
let monitor = this._layoutManager.monitors[this._monitorIndex];
|
|
||||||
|
|
||||||
backgroundActor.set_size(monitor.width, monitor.height);
|
|
||||||
if (this._controlPosition) {
|
if (this._controlPosition) {
|
||||||
|
let monitor = this._layoutManager.monitors[this._monitorIndex];
|
||||||
backgroundActor.set_position(monitor.x, monitor.y);
|
backgroundActor.set_position(monitor.x, monitor.y);
|
||||||
backgroundActor.lower_bottom();
|
backgroundActor.lower_bottom();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,7 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
/* exported addBackgroundMenu */
|
||||||
|
|
||||||
const Clutter = imports.gi.Clutter;
|
const { Clutter, St } = imports.gi;
|
||||||
const St = imports.gi.St;
|
|
||||||
const Shell = imports.gi.Shell;
|
|
||||||
|
|
||||||
const BoxPointer = imports.ui.boxpointer;
|
const BoxPointer = imports.ui.boxpointer;
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
@@ -27,12 +26,12 @@ var BackgroundMenu = class BackgroundMenu extends PopupMenu.PopupMenu {
|
|||||||
function addBackgroundMenu(actor, layoutManager) {
|
function addBackgroundMenu(actor, layoutManager) {
|
||||||
actor.reactive = true;
|
actor.reactive = true;
|
||||||
actor._backgroundMenu = new BackgroundMenu(layoutManager);
|
actor._backgroundMenu = new BackgroundMenu(layoutManager);
|
||||||
actor._backgroundManager = new PopupMenu.PopupMenuManager({ actor: actor });
|
actor._backgroundManager = new PopupMenu.PopupMenuManager(actor);
|
||||||
actor._backgroundManager.addMenu(actor._backgroundMenu);
|
actor._backgroundManager.addMenu(actor._backgroundMenu);
|
||||||
|
|
||||||
function openMenu(x, y) {
|
function openMenu(x, y) {
|
||||||
Main.layoutManager.setDummyCursorGeometry(x, y, 0, 0);
|
Main.layoutManager.setDummyCursorGeometry(x, y, 0, 0);
|
||||||
actor._backgroundMenu.open(BoxPointer.PopupAnimation.NONE);
|
actor._backgroundMenu.open(BoxPointer.PopupAnimation.FULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
let clickAction = new Clutter.ClickAction();
|
let clickAction = new Clutter.ClickAction();
|
||||||
|
|||||||
@@ -1,77 +1,106 @@
|
|||||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||||
|
/* exported BarLevel */
|
||||||
|
|
||||||
const Atk = imports.gi.Atk;
|
const { Atk, Clutter, GObject, St } = imports.gi;
|
||||||
const Cairo = imports.cairo;
|
|
||||||
const Clutter = imports.gi.Clutter;
|
|
||||||
const St = imports.gi.St;
|
|
||||||
const Signals = imports.signals;
|
|
||||||
|
|
||||||
var BarLevel = class {
|
var BarLevel = GObject.registerClass({
|
||||||
constructor(value, params) {
|
Properties: {
|
||||||
if (isNaN(value))
|
'value': GObject.ParamSpec.double(
|
||||||
// Avoid spreading NaNs around
|
'value', 'value', 'value',
|
||||||
throw TypeError('The bar level value must be a number');
|
GObject.ParamFlags.READWRITE,
|
||||||
|
0, 2, 0),
|
||||||
|
'maximum-value': GObject.ParamSpec.double(
|
||||||
|
'maximum-value', 'maximum-value', 'maximum-value',
|
||||||
|
GObject.ParamFlags.READWRITE,
|
||||||
|
1, 2, 1),
|
||||||
|
'overdrive-start': GObject.ParamSpec.double(
|
||||||
|
'overdrive-start', 'overdrive-start', 'overdrive-start',
|
||||||
|
GObject.ParamFlags.READWRITE,
|
||||||
|
1, 2, 1)
|
||||||
|
}
|
||||||
|
}, class BarLevel extends St.DrawingArea {
|
||||||
|
_init(params) {
|
||||||
this._maxValue = 1;
|
this._maxValue = 1;
|
||||||
this._value = Math.max(Math.min(value, this._maxValue), 0);
|
this._value = 0;
|
||||||
this._overdriveStart = 1;
|
this._overdriveStart = 1;
|
||||||
this._barLevelWidth = 0;
|
this._barLevelWidth = 0;
|
||||||
|
|
||||||
if (params == undefined)
|
let defaultParams = {
|
||||||
params = {}
|
style_class: 'barlevel',
|
||||||
|
accessible_role: Atk.Role.LEVEL_BAR
|
||||||
this.actor = new St.DrawingArea({ styleClass: params['styleClass'] || 'barlevel',
|
};
|
||||||
can_focus: params['canFocus'] || false,
|
super._init(Object.assign(defaultParams, params));
|
||||||
reactive: params['reactive'] || false,
|
this.connect('allocation-changed', (actor, box) => {
|
||||||
accessible_role: params['accessibleRole'] || Atk.Role.LEVEL_BAR });
|
|
||||||
this.actor.connect('repaint', this._barLevelRepaint.bind(this));
|
|
||||||
this.actor.connect('allocation-changed', (actor, box) => {
|
|
||||||
this._barLevelWidth = box.get_width();
|
this._barLevelWidth = box.get_width();
|
||||||
});
|
});
|
||||||
|
|
||||||
this._customAccessible = St.GenericAccessible.new_for_actor(this.actor);
|
this._customAccessible = St.GenericAccessible.new_for_actor(this);
|
||||||
this.actor.set_accessible(this._customAccessible);
|
this.set_accessible(this._customAccessible);
|
||||||
|
|
||||||
this._customAccessible.connect('get-current-value', this._getCurrentValue.bind(this));
|
this._customAccessible.connect('get-current-value', this._getCurrentValue.bind(this));
|
||||||
this._customAccessible.connect('get-minimum-value', this._getMinimumValue.bind(this));
|
this._customAccessible.connect('get-minimum-value', this._getMinimumValue.bind(this));
|
||||||
this._customAccessible.connect('get-maximum-value', this._getMaximumValue.bind(this));
|
this._customAccessible.connect('get-maximum-value', this._getMaximumValue.bind(this));
|
||||||
this._customAccessible.connect('set-current-value', this._setCurrentValue.bind(this));
|
this._customAccessible.connect('set-current-value', this._setCurrentValue.bind(this));
|
||||||
|
|
||||||
this.connect('value-changed', this._valueChanged.bind(this));
|
this.connect('notify::value', this._valueChanged.bind(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
setValue(value) {
|
get value() {
|
||||||
if (isNaN(value))
|
return this._value;
|
||||||
throw TypeError('The bar level value must be a number');
|
|
||||||
|
|
||||||
this._value = Math.max(Math.min(value, this._maxValue), 0);
|
|
||||||
this.actor.queue_repaint();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
setMaximumValue(value) {
|
set value(value) {
|
||||||
if (isNaN(value))
|
value = Math.max(Math.min(value, this._maxValue), 0);
|
||||||
throw TypeError('The bar level max value must be a number');
|
|
||||||
|
|
||||||
this._maxValue = Math.max(value, 1);
|
if (this._value == value)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this._value = value;
|
||||||
|
this.notify('value');
|
||||||
|
this.queue_repaint();
|
||||||
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line camelcase
|
||||||
|
get maximum_value() {
|
||||||
|
return this._maxValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line camelcase
|
||||||
|
set maximum_value(value) {
|
||||||
|
value = Math.max(value, 1);
|
||||||
|
|
||||||
|
if (this._maxValue == value)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this._maxValue = value;
|
||||||
this._overdriveStart = Math.min(this._overdriveStart, this._maxValue);
|
this._overdriveStart = Math.min(this._overdriveStart, this._maxValue);
|
||||||
this.actor.queue_repaint();
|
this.notify('maximum-value');
|
||||||
|
this.queue_repaint();
|
||||||
}
|
}
|
||||||
|
|
||||||
setOverdriveStart(value) {
|
// eslint-disable-next-line camelcase
|
||||||
if (isNaN(value))
|
get overdrive_start() {
|
||||||
throw TypeError('The overdrive limit value must be a number');
|
return this._overdriveStart;
|
||||||
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line camelcase
|
||||||
|
set overdrive_start(value) {
|
||||||
|
if (this._overdriveStart == value)
|
||||||
|
return;
|
||||||
|
|
||||||
if (value > this._maxValue)
|
if (value > this._maxValue)
|
||||||
throw new Error(`Tried to set overdrive value to ${value}, ` +
|
throw new Error(`Tried to set overdrive value to ${value}, ` +
|
||||||
`which is a number greater than the maximum allowed value ${this._maxValue}`);
|
`which is a number greater than the maximum allowed value ${this._maxValue}`);
|
||||||
|
|
||||||
this._overdriveStart = value;
|
this._overdriveStart = value;
|
||||||
this._value = Math.max(Math.min(value, this._maxValue), 0);
|
this.notify('overdrive-start');
|
||||||
this.actor.queue_repaint();
|
this.queue_repaint();
|
||||||
}
|
}
|
||||||
|
|
||||||
_barLevelRepaint(area) {
|
vfunc_repaint() {
|
||||||
let cr = area.get_context();
|
let cr = this.get_context();
|
||||||
let themeNode = area.get_theme_node();
|
let themeNode = this.get_theme_node();
|
||||||
let [width, height] = area.get_surface_size();
|
let [width, height] = this.get_surface_size();
|
||||||
|
|
||||||
let barLevelHeight = themeNode.get_length('-barlevel-height');
|
let barLevelHeight = themeNode.get_length('-barlevel-height');
|
||||||
let barLevelBorderRadius = Math.min(width, barLevelHeight) / 2;
|
let barLevelBorderRadius = Math.min(width, barLevelHeight) / 2;
|
||||||
@@ -108,7 +137,7 @@ var BarLevel = class {
|
|||||||
overdriveSeparatorWidth = themeNode.get_length('-barlevel-overdrive-separator-width');
|
overdriveSeparatorWidth = themeNode.get_length('-barlevel-overdrive-separator-width');
|
||||||
|
|
||||||
/* background bar */
|
/* background bar */
|
||||||
cr.arc(width - barLevelBorderRadius - barLevelBorderWidth, height / 2, barLevelBorderRadius, TAU * 3 / 4, TAU * 1 / 4);
|
cr.arc(width - barLevelBorderRadius - barLevelBorderWidth, height / 2, barLevelBorderRadius, TAU * (3 / 4), TAU * (1 / 4));
|
||||||
cr.lineTo(endX, (height + barLevelHeight) / 2);
|
cr.lineTo(endX, (height + barLevelHeight) / 2);
|
||||||
cr.lineTo(endX, (height - barLevelHeight) / 2);
|
cr.lineTo(endX, (height - barLevelHeight) / 2);
|
||||||
cr.lineTo(width - barLevelBorderRadius - barLevelBorderWidth, (height - barLevelHeight) / 2);
|
cr.lineTo(width - barLevelBorderRadius - barLevelBorderWidth, (height - barLevelHeight) / 2);
|
||||||
@@ -120,11 +149,12 @@ var BarLevel = class {
|
|||||||
|
|
||||||
/* normal progress bar */
|
/* normal progress bar */
|
||||||
let x = Math.min(endX, overdriveSeparatorX - overdriveSeparatorWidth / 2);
|
let x = Math.min(endX, overdriveSeparatorX - overdriveSeparatorWidth / 2);
|
||||||
cr.arc(barLevelBorderRadius + barLevelBorderWidth, height / 2, barLevelBorderRadius, TAU * 1 / 4, TAU * 3 / 4);
|
cr.arc(barLevelBorderRadius + barLevelBorderWidth, height / 2, barLevelBorderRadius, TAU * (1 / 4), TAU * (3 / 4));
|
||||||
cr.lineTo(x, (height - barLevelHeight) / 2);
|
cr.lineTo(x, (height - barLevelHeight) / 2);
|
||||||
cr.lineTo(x, (height + barLevelHeight) / 2);
|
cr.lineTo(x, (height + barLevelHeight) / 2);
|
||||||
cr.lineTo(barLevelBorderRadius + barLevelBorderWidth, (height + barLevelHeight) / 2);
|
cr.lineTo(barLevelBorderRadius + barLevelBorderWidth, (height + barLevelHeight) / 2);
|
||||||
Clutter.cairo_set_source_color(cr, barLevelActiveColor);
|
if (this._value > 0)
|
||||||
|
Clutter.cairo_set_source_color(cr, barLevelActiveColor);
|
||||||
cr.fillPreserve();
|
cr.fillPreserve();
|
||||||
Clutter.cairo_set_source_color(cr, barLevelActiveBorderColor);
|
Clutter.cairo_set_source_color(cr, barLevelActiveBorderColor);
|
||||||
cr.setLineWidth(barLevelBorderWidth);
|
cr.setLineWidth(barLevelBorderWidth);
|
||||||
@@ -146,17 +176,19 @@ var BarLevel = class {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* end progress bar arc */
|
/* end progress bar arc */
|
||||||
if (this._value <= this._overdriveStart)
|
if (this._value > 0) {
|
||||||
Clutter.cairo_set_source_color(cr, barLevelActiveColor);
|
if (this._value <= this._overdriveStart)
|
||||||
else
|
Clutter.cairo_set_source_color(cr, barLevelActiveColor);
|
||||||
Clutter.cairo_set_source_color(cr, barLevelOverdriveColor);
|
else
|
||||||
cr.arc(endX, height / 2, barLevelBorderRadius, TAU * 3 / 4, TAU * 1 / 4);
|
Clutter.cairo_set_source_color(cr, barLevelOverdriveColor);
|
||||||
cr.lineTo(Math.floor(endX), (height + barLevelHeight) / 2);
|
cr.arc(endX, height / 2, barLevelBorderRadius, TAU * (3 / 4), TAU * (1 / 4));
|
||||||
cr.lineTo(Math.floor(endX), (height - barLevelHeight) / 2);
|
cr.lineTo(Math.floor(endX), (height + barLevelHeight) / 2);
|
||||||
cr.lineTo(endX, (height - barLevelHeight) / 2);
|
cr.lineTo(Math.floor(endX), (height - barLevelHeight) / 2);
|
||||||
cr.fillPreserve();
|
cr.lineTo(endX, (height - barLevelHeight) / 2);
|
||||||
cr.setLineWidth(barLevelBorderWidth);
|
cr.fillPreserve();
|
||||||
cr.stroke();
|
cr.setLineWidth(barLevelBorderWidth);
|
||||||
|
cr.stroke();
|
||||||
|
}
|
||||||
|
|
||||||
/* draw overdrive separator */
|
/* draw overdrive separator */
|
||||||
if (overdriveActive) {
|
if (overdriveActive) {
|
||||||
@@ -175,32 +207,27 @@ var BarLevel = class {
|
|||||||
cr.$dispose();
|
cr.$dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
_getCurrentValue(actor) {
|
_getCurrentValue() {
|
||||||
return this._value;
|
return this._value;
|
||||||
}
|
}
|
||||||
|
|
||||||
_getOverdriveStart(actor) {
|
_getOverdriveStart() {
|
||||||
return this._overdriveStart;
|
return this._overdriveStart;
|
||||||
}
|
}
|
||||||
|
|
||||||
_getMinimumValue(actor) {
|
_getMinimumValue() {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
_getMaximumValue(actor) {
|
_getMaximumValue() {
|
||||||
return this._maxValue;
|
return this._maxValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
_setCurrentValue(actor, value) {
|
_setCurrentValue(_actor, value) {
|
||||||
this._value = value;
|
this._value = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
_valueChanged(barLevel, value, property) {
|
_valueChanged() {
|
||||||
this._customAccessible.notify("accessible-value");
|
this._customAccessible.notify("accessible-value");
|
||||||
}
|
}
|
||||||
|
});
|
||||||
get value() {
|
|
||||||
return this._value;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
Signals.addSignalMethods(BarLevel.prototype);
|
|
||||||
|
|||||||
@@ -1,14 +1,9 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
/* exported BoxPointer */
|
||||||
|
|
||||||
const Clutter = imports.gi.Clutter;
|
const { Clutter, GObject, Shell, St } = imports.gi;
|
||||||
const GObject = imports.gi.GObject;
|
|
||||||
const Meta = imports.gi.Meta;
|
|
||||||
const Shell = imports.gi.Shell;
|
|
||||||
const Signals = imports.signals;
|
|
||||||
const St = imports.gi.St;
|
|
||||||
|
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const Tweener = imports.ui.tweener;
|
|
||||||
|
|
||||||
var PopupAnimation = {
|
var PopupAnimation = {
|
||||||
NONE: 0,
|
NONE: 0,
|
||||||
@@ -17,7 +12,7 @@ var PopupAnimation = {
|
|||||||
FULL: ~0,
|
FULL: ~0,
|
||||||
};
|
};
|
||||||
|
|
||||||
var POPUP_ANIMATION_TIME = 0.15;
|
var POPUP_ANIMATION_TIME = 150;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* BoxPointer:
|
* BoxPointer:
|
||||||
@@ -29,7 +24,7 @@ var POPUP_ANIMATION_TIME = 0.15;
|
|||||||
* placed. The arrow position may be controlled via
|
* placed. The arrow position may be controlled via
|
||||||
* setArrowOrigin(). The arrow side might be temporarily flipped
|
* setArrowOrigin(). The arrow side might be temporarily flipped
|
||||||
* depending on the box size and source position to keep the box
|
* depending on the box size and source position to keep the box
|
||||||
* totally inside the monitor if possible.
|
* totally inside the monitor workarea if possible.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
var BoxPointer = GObject.registerClass({
|
var BoxPointer = GObject.registerClass({
|
||||||
@@ -38,8 +33,6 @@ var BoxPointer = GObject.registerClass({
|
|||||||
_init(arrowSide, binProperties) {
|
_init(arrowSide, binProperties) {
|
||||||
super._init();
|
super._init();
|
||||||
|
|
||||||
this.actor = this;
|
|
||||||
|
|
||||||
this.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS);
|
this.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS);
|
||||||
|
|
||||||
this._arrowSide = arrowSide;
|
this._arrowSide = arrowSide;
|
||||||
@@ -52,13 +45,18 @@ var BoxPointer = GObject.registerClass({
|
|||||||
this._border.connect('repaint', this._drawBorder.bind(this));
|
this._border.connect('repaint', this._drawBorder.bind(this));
|
||||||
this.add_actor(this._border);
|
this.add_actor(this._border);
|
||||||
this.bin.raise(this._border);
|
this.bin.raise(this._border);
|
||||||
this._xOffset = 0;
|
|
||||||
this._yOffset = 0;
|
|
||||||
this._xPosition = 0;
|
|
||||||
this._yPosition = 0;
|
|
||||||
this._sourceAlignment = 0.5;
|
this._sourceAlignment = 0.5;
|
||||||
this._capturedEventId = 0;
|
this._capturedEventId = 0;
|
||||||
this._muteInput();
|
this._muteInput();
|
||||||
|
|
||||||
|
this.connect('destroy', this._onDestroy.bind(this));
|
||||||
|
}
|
||||||
|
|
||||||
|
_onDestroy() {
|
||||||
|
if (this._sourceActorDestroyId) {
|
||||||
|
this._sourceActor.disconnect(this._sourceActorDestroyId);
|
||||||
|
delete this._sourceActorDestroyId;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
get arrowSide() {
|
get arrowSide() {
|
||||||
@@ -78,36 +76,6 @@ var BoxPointer = GObject.registerClass({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// BoxPointer.show() and BoxPointer.hide() are here for only compatibility
|
|
||||||
// purposes, and will be removed in 3.32.
|
|
||||||
show(animate, onComplete) {
|
|
||||||
if (animate !== undefined) {
|
|
||||||
try {
|
|
||||||
throw new Error('BoxPointer.show() has been moved to BoxPointer.open(), this code will break in the future.');
|
|
||||||
} catch(e) {
|
|
||||||
logError(e);
|
|
||||||
this.open(animate, onComplete);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this.visible = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
hide(animate, onComplete) {
|
|
||||||
if (animate !== undefined) {
|
|
||||||
try {
|
|
||||||
throw new Error('BoxPointer.hide() has been moved to BoxPointer.close(), this code will break in the future.');
|
|
||||||
} catch(e) {
|
|
||||||
logError(e);
|
|
||||||
this.close(animate, onComplete);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this.visible = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
open(animate, onComplete) {
|
open(animate, onComplete) {
|
||||||
let themeNode = this.get_theme_node();
|
let themeNode = this.get_theme_node();
|
||||||
let rise = themeNode.get_length('-arrow-rise');
|
let rise = themeNode.get_length('-arrow-rise');
|
||||||
@@ -122,39 +90,41 @@ var BoxPointer = GObject.registerClass({
|
|||||||
|
|
||||||
if (animate & PopupAnimation.SLIDE) {
|
if (animate & PopupAnimation.SLIDE) {
|
||||||
switch (this._arrowSide) {
|
switch (this._arrowSide) {
|
||||||
case St.Side.TOP:
|
case St.Side.TOP:
|
||||||
this.yOffset = -rise;
|
this.translation_y = -rise;
|
||||||
break;
|
break;
|
||||||
case St.Side.BOTTOM:
|
case St.Side.BOTTOM:
|
||||||
this.yOffset = rise;
|
this.translation_y = rise;
|
||||||
break;
|
break;
|
||||||
case St.Side.LEFT:
|
case St.Side.LEFT:
|
||||||
this.xOffset = -rise;
|
this.translation_x = -rise;
|
||||||
break;
|
break;
|
||||||
case St.Side.RIGHT:
|
case St.Side.RIGHT:
|
||||||
this.xOffset = rise;
|
this.translation_x = rise;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Tweener.addTween(this, { opacity: 255,
|
this.ease({
|
||||||
xOffset: 0,
|
opacity: 255,
|
||||||
yOffset: 0,
|
translation_x: 0,
|
||||||
transition: 'linear',
|
translation_y: 0,
|
||||||
onComplete: () => {
|
duration: animationTime,
|
||||||
this._unmuteInput();
|
mode: Clutter.AnimationMode.LINEAR,
|
||||||
if (onComplete)
|
onComplete: () => {
|
||||||
onComplete();
|
this._unmuteInput();
|
||||||
},
|
if (onComplete)
|
||||||
time: animationTime });
|
onComplete();
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
close(animate, onComplete) {
|
close(animate, onComplete) {
|
||||||
if (!this.visible)
|
if (!this.visible)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
let xOffset = 0;
|
let translationX = 0;
|
||||||
let yOffset = 0;
|
let translationY = 0;
|
||||||
let themeNode = this.get_theme_node();
|
let themeNode = this.get_theme_node();
|
||||||
let rise = themeNode.get_length('-arrow-rise');
|
let rise = themeNode.get_length('-arrow-rise');
|
||||||
let fade = (animate & PopupAnimation.FADE);
|
let fade = (animate & PopupAnimation.FADE);
|
||||||
@@ -162,38 +132,39 @@ var BoxPointer = GObject.registerClass({
|
|||||||
|
|
||||||
if (animate & PopupAnimation.SLIDE) {
|
if (animate & PopupAnimation.SLIDE) {
|
||||||
switch (this._arrowSide) {
|
switch (this._arrowSide) {
|
||||||
case St.Side.TOP:
|
case St.Side.TOP:
|
||||||
yOffset = rise;
|
translationY = rise;
|
||||||
break;
|
break;
|
||||||
case St.Side.BOTTOM:
|
case St.Side.BOTTOM:
|
||||||
yOffset = -rise;
|
translationY = -rise;
|
||||||
break;
|
break;
|
||||||
case St.Side.LEFT:
|
case St.Side.LEFT:
|
||||||
xOffset = rise;
|
translationX = rise;
|
||||||
break;
|
break;
|
||||||
case St.Side.RIGHT:
|
case St.Side.RIGHT:
|
||||||
xOffset = -rise;
|
translationX = -rise;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this._muteInput();
|
this._muteInput();
|
||||||
|
|
||||||
Tweener.removeTweens(this);
|
this.remove_all_transitions();
|
||||||
Tweener.addTween(this, { opacity: fade ? 0 : 255,
|
this.ease({
|
||||||
xOffset: xOffset,
|
opacity: fade ? 0 : 255,
|
||||||
yOffset: yOffset,
|
translation_x: translationX,
|
||||||
transition: 'linear',
|
translation_y: translationY,
|
||||||
time: animationTime,
|
duration: animationTime,
|
||||||
onComplete: () => {
|
mode: Clutter.AnimationMode.LINEAR,
|
||||||
this.hide();
|
onComplete: () => {
|
||||||
this.opacity = 0;
|
this.hide();
|
||||||
this.xOffset = 0;
|
this.opacity = 0;
|
||||||
this.yOffset = 0;
|
this.translation_x = 0;
|
||||||
if (onComplete)
|
this.translation_y = 0;
|
||||||
onComplete();
|
if (onComplete)
|
||||||
}
|
onComplete();
|
||||||
});
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
_adjustAllocationForArrow(isWidth, minSize, natSize) {
|
_adjustAllocationForArrow(isWidth, minSize, natSize) {
|
||||||
@@ -201,8 +172,8 @@ var BoxPointer = GObject.registerClass({
|
|||||||
let borderWidth = themeNode.get_length('-arrow-border-width');
|
let borderWidth = themeNode.get_length('-arrow-border-width');
|
||||||
minSize += borderWidth * 2;
|
minSize += borderWidth * 2;
|
||||||
natSize += borderWidth * 2;
|
natSize += borderWidth * 2;
|
||||||
if ((!isWidth && (this._arrowSide == St.Side.TOP || this._arrowSide == St.Side.BOTTOM))
|
if ((!isWidth && (this._arrowSide == St.Side.TOP || this._arrowSide == St.Side.BOTTOM)) ||
|
||||||
|| (isWidth && (this._arrowSide == St.Side.LEFT || this._arrowSide == St.Side.RIGHT))) {
|
(isWidth && (this._arrowSide == St.Side.LEFT || this._arrowSide == St.Side.RIGHT))) {
|
||||||
let rise = themeNode.get_length('-arrow-rise');
|
let rise = themeNode.get_length('-arrow-rise');
|
||||||
minSize += rise;
|
minSize += rise;
|
||||||
natSize += rise;
|
natSize += rise;
|
||||||
@@ -236,13 +207,10 @@ var BoxPointer = GObject.registerClass({
|
|||||||
this.set_allocation(box, flags);
|
this.set_allocation(box, flags);
|
||||||
|
|
||||||
let themeNode = this.get_theme_node();
|
let themeNode = this.get_theme_node();
|
||||||
box = themeNode.get_content_box(box);
|
|
||||||
|
|
||||||
let borderWidth = themeNode.get_length('-arrow-border-width');
|
let borderWidth = themeNode.get_length('-arrow-border-width');
|
||||||
let rise = themeNode.get_length('-arrow-rise');
|
let rise = themeNode.get_length('-arrow-rise');
|
||||||
let childBox = new Clutter.ActorBox();
|
let childBox = new Clutter.ActorBox();
|
||||||
let availWidth = box.x2 - box.x1;
|
let [availWidth, availHeight] = themeNode.get_content_box(box).get_size();
|
||||||
let availHeight = box.y2 - box.y1;
|
|
||||||
|
|
||||||
childBox.x1 = 0;
|
childBox.x1 = 0;
|
||||||
childBox.y1 = 0;
|
childBox.y1 = 0;
|
||||||
@@ -255,24 +223,25 @@ var BoxPointer = GObject.registerClass({
|
|||||||
childBox.x2 = availWidth - borderWidth;
|
childBox.x2 = availWidth - borderWidth;
|
||||||
childBox.y2 = availHeight - borderWidth;
|
childBox.y2 = availHeight - borderWidth;
|
||||||
switch (this._arrowSide) {
|
switch (this._arrowSide) {
|
||||||
case St.Side.TOP:
|
case St.Side.TOP:
|
||||||
childBox.y1 += rise;
|
childBox.y1 += rise;
|
||||||
break;
|
break;
|
||||||
case St.Side.BOTTOM:
|
case St.Side.BOTTOM:
|
||||||
childBox.y2 -= rise;
|
childBox.y2 -= rise;
|
||||||
break;
|
break;
|
||||||
case St.Side.LEFT:
|
case St.Side.LEFT:
|
||||||
childBox.x1 += rise;
|
childBox.x1 += rise;
|
||||||
break;
|
break;
|
||||||
case St.Side.RIGHT:
|
case St.Side.RIGHT:
|
||||||
childBox.x2 -= rise;
|
childBox.x2 -= rise;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
this.bin.allocate(childBox, flags);
|
this.bin.allocate(childBox, flags);
|
||||||
|
|
||||||
if (this._sourceActor && this._sourceActor.mapped) {
|
if (this._sourceActor && this._sourceActor.mapped) {
|
||||||
this._reposition();
|
this._reposition(box);
|
||||||
this._updateFlip();
|
this._updateFlip(box);
|
||||||
|
this.set_allocation(box, flags);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -298,7 +267,7 @@ var BoxPointer = GObject.registerClass({
|
|||||||
let borderRadius = themeNode.get_length('-arrow-border-radius');
|
let borderRadius = themeNode.get_length('-arrow-border-radius');
|
||||||
|
|
||||||
let halfBorder = borderWidth / 2;
|
let halfBorder = borderWidth / 2;
|
||||||
let halfBase = Math.floor(base/2);
|
let halfBase = Math.floor(base / 2);
|
||||||
|
|
||||||
let backgroundColor = themeNode.get_color('-arrow-background-color');
|
let backgroundColor = themeNode.get_color('-arrow-background-color');
|
||||||
|
|
||||||
@@ -379,7 +348,7 @@ var BoxPointer = GObject.registerClass({
|
|||||||
if (!skipTopRight) {
|
if (!skipTopRight) {
|
||||||
cr.lineTo(x2 - borderRadius, y1);
|
cr.lineTo(x2 - borderRadius, y1);
|
||||||
cr.arc(x2 - borderRadius, y1 + borderRadius, borderRadius,
|
cr.arc(x2 - borderRadius, y1 + borderRadius, borderRadius,
|
||||||
3*Math.PI/2, Math.PI*2);
|
3 * Math.PI / 2, Math.PI * 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this._arrowSide == St.Side.RIGHT && rise) {
|
if (this._arrowSide == St.Side.RIGHT && rise) {
|
||||||
@@ -400,7 +369,7 @@ var BoxPointer = GObject.registerClass({
|
|||||||
if (!skipBottomRight) {
|
if (!skipBottomRight) {
|
||||||
cr.lineTo(x2, y2 - borderRadius);
|
cr.lineTo(x2, y2 - borderRadius);
|
||||||
cr.arc(x2 - borderRadius, y2 - borderRadius, borderRadius,
|
cr.arc(x2 - borderRadius, y2 - borderRadius, borderRadius,
|
||||||
0, Math.PI/2);
|
0, Math.PI / 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this._arrowSide == St.Side.BOTTOM && rise) {
|
if (this._arrowSide == St.Side.BOTTOM && rise) {
|
||||||
@@ -421,7 +390,7 @@ var BoxPointer = GObject.registerClass({
|
|||||||
if (!skipBottomLeft) {
|
if (!skipBottomLeft) {
|
||||||
cr.lineTo(x1 + borderRadius, y2);
|
cr.lineTo(x1 + borderRadius, y2);
|
||||||
cr.arc(x1 + borderRadius, y2 - borderRadius, borderRadius,
|
cr.arc(x1 + borderRadius, y2 - borderRadius, borderRadius,
|
||||||
Math.PI/2, Math.PI);
|
Math.PI / 2, Math.PI);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this._arrowSide == St.Side.LEFT && rise) {
|
if (this._arrowSide == St.Side.LEFT && rise) {
|
||||||
@@ -430,7 +399,7 @@ var BoxPointer = GObject.registerClass({
|
|||||||
cr.lineTo(x1 - rise, y1);
|
cr.lineTo(x1 - rise, y1);
|
||||||
cr.lineTo(x1 + borderRadius, y1);
|
cr.lineTo(x1 + borderRadius, y1);
|
||||||
} else if (skipBottomLeft) {
|
} else if (skipBottomLeft) {
|
||||||
cr.lineTo(x1 - rise, y2)
|
cr.lineTo(x1 - rise, y2);
|
||||||
cr.lineTo(x1 - rise, y2 - halfBase);
|
cr.lineTo(x1 - rise, y2 - halfBase);
|
||||||
} else {
|
} else {
|
||||||
cr.lineTo(x1, this._arrowOrigin + halfBase);
|
cr.lineTo(x1, this._arrowOrigin + halfBase);
|
||||||
@@ -442,7 +411,7 @@ var BoxPointer = GObject.registerClass({
|
|||||||
if (!skipTopLeft) {
|
if (!skipTopLeft) {
|
||||||
cr.lineTo(x1, y1 + borderRadius);
|
cr.lineTo(x1, y1 + borderRadius);
|
||||||
cr.arc(x1 + borderRadius, y1 + borderRadius, borderRadius,
|
cr.arc(x1 + borderRadius, y1 + borderRadius, borderRadius,
|
||||||
Math.PI, 3*Math.PI/2);
|
Math.PI, 3 * Math.PI / 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
Clutter.cairo_set_source_color(cr, backgroundColor);
|
Clutter.cairo_set_source_color(cr, backgroundColor);
|
||||||
@@ -459,15 +428,25 @@ var BoxPointer = GObject.registerClass({
|
|||||||
}
|
}
|
||||||
|
|
||||||
setPosition(sourceActor, alignment) {
|
setPosition(sourceActor, alignment) {
|
||||||
// We need to show it now to force an allocation,
|
if (!this._sourceActor || sourceActor != this._sourceActor) {
|
||||||
// so that we can query the correct size.
|
if (this._sourceActorDestroyId) {
|
||||||
this.show();
|
this._sourceActor.disconnect(this._sourceActorDestroyId);
|
||||||
|
delete this._sourceActorDestroyId;
|
||||||
|
}
|
||||||
|
|
||||||
|
this._sourceActor = sourceActor;
|
||||||
|
|
||||||
|
if (this._sourceActor) {
|
||||||
|
this._sourceActorDestroyId = this._sourceActor.connect('destroy', () => {
|
||||||
|
this._sourceActor = null;
|
||||||
|
delete this._sourceActorDestroyId;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
this._sourceActor = sourceActor;
|
|
||||||
this._arrowAlignment = alignment;
|
this._arrowAlignment = alignment;
|
||||||
|
|
||||||
this._reposition();
|
this.queue_relayout();
|
||||||
this._updateFlip();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
setSourceAlignment(alignment) {
|
setSourceAlignment(alignment) {
|
||||||
@@ -479,22 +458,26 @@ var BoxPointer = GObject.registerClass({
|
|||||||
this.setPosition(this._sourceActor, this._arrowAlignment);
|
this.setPosition(this._sourceActor, this._arrowAlignment);
|
||||||
}
|
}
|
||||||
|
|
||||||
_reposition() {
|
_reposition(allocationBox) {
|
||||||
let sourceActor = this._sourceActor;
|
let sourceActor = this._sourceActor;
|
||||||
let alignment = this._arrowAlignment;
|
let alignment = this._arrowAlignment;
|
||||||
|
let monitorIndex = Main.layoutManager.findIndexForActor(sourceActor);
|
||||||
|
|
||||||
|
this._sourceAllocation = Shell.util_get_transformed_allocation(sourceActor);
|
||||||
|
this._workArea = Main.layoutManager.getWorkAreaForMonitor(monitorIndex);
|
||||||
|
|
||||||
// Position correctly relative to the sourceActor
|
// Position correctly relative to the sourceActor
|
||||||
let sourceNode = sourceActor.get_theme_node();
|
let sourceNode = sourceActor.get_theme_node();
|
||||||
let sourceContentBox = sourceNode.get_content_box(sourceActor.get_allocation_box());
|
let sourceContentBox = sourceNode.get_content_box(sourceActor.get_allocation_box());
|
||||||
let sourceAllocation = Shell.util_get_transformed_allocation(sourceActor);
|
let sourceAllocation = this._sourceAllocation;
|
||||||
let sourceCenterX = sourceAllocation.x1 + sourceContentBox.x1 + (sourceContentBox.x2 - sourceContentBox.x1) * this._sourceAlignment;
|
let sourceCenterX = sourceAllocation.x1 + sourceContentBox.x1 + (sourceContentBox.x2 - sourceContentBox.x1) * this._sourceAlignment;
|
||||||
let sourceCenterY = sourceAllocation.y1 + sourceContentBox.y1 + (sourceContentBox.y2 - sourceContentBox.y1) * this._sourceAlignment;
|
let sourceCenterY = sourceAllocation.y1 + sourceContentBox.y1 + (sourceContentBox.y2 - sourceContentBox.y1) * this._sourceAlignment;
|
||||||
let [minWidth, minHeight, natWidth, natHeight] = this.get_preferred_size();
|
let [, , natWidth, natHeight] = this.get_preferred_size();
|
||||||
|
|
||||||
// We also want to keep it onscreen, and separated from the
|
// We also want to keep it onscreen, and separated from the
|
||||||
// edge by the same distance as the main part of the box is
|
// edge by the same distance as the main part of the box is
|
||||||
// separated from its sourceActor
|
// separated from its sourceActor
|
||||||
let monitor = Main.layoutManager.findMonitorForActor(sourceActor);
|
let workarea = this._workArea;
|
||||||
let themeNode = this.get_theme_node();
|
let themeNode = this.get_theme_node();
|
||||||
let borderWidth = themeNode.get_length('-arrow-border-width');
|
let borderWidth = themeNode.get_length('-arrow-border-width');
|
||||||
let arrowBase = themeNode.get_length('-arrow-base');
|
let arrowBase = themeNode.get_length('-arrow-base');
|
||||||
@@ -533,7 +516,7 @@ var BoxPointer = GObject.registerClass({
|
|||||||
// of the box to maintain the arrow's accuracy.
|
// of the box to maintain the arrow's accuracy.
|
||||||
|
|
||||||
let arrowOrigin;
|
let arrowOrigin;
|
||||||
let halfBase = Math.floor(arrowBase/2);
|
let halfBase = Math.floor(arrowBase / 2);
|
||||||
let halfBorder = borderWidth / 2;
|
let halfBorder = borderWidth / 2;
|
||||||
let halfMargin = margin / 2;
|
let halfMargin = margin / 2;
|
||||||
let [x1, y1] = [halfBorder, halfBorder];
|
let [x1, y1] = [halfBorder, halfBorder];
|
||||||
@@ -544,8 +527,8 @@ var BoxPointer = GObject.registerClass({
|
|||||||
case St.Side.BOTTOM:
|
case St.Side.BOTTOM:
|
||||||
resX = sourceCenterX - (halfMargin + (natWidth - margin) * alignment);
|
resX = sourceCenterX - (halfMargin + (natWidth - margin) * alignment);
|
||||||
|
|
||||||
resX = Math.max(resX, monitor.x + padding);
|
resX = Math.max(resX, workarea.x + padding);
|
||||||
resX = Math.min(resX, monitor.x + monitor.width - (padding + natWidth));
|
resX = Math.min(resX, workarea.x + workarea.width - (padding + natWidth));
|
||||||
|
|
||||||
arrowOrigin = sourceCenterX - resX;
|
arrowOrigin = sourceCenterX - resX;
|
||||||
if (arrowOrigin <= (x1 + (borderRadius + halfBase))) {
|
if (arrowOrigin <= (x1 + (borderRadius + halfBase))) {
|
||||||
@@ -563,8 +546,8 @@ var BoxPointer = GObject.registerClass({
|
|||||||
case St.Side.RIGHT:
|
case St.Side.RIGHT:
|
||||||
resY = sourceCenterY - (halfMargin + (natHeight - margin) * alignment);
|
resY = sourceCenterY - (halfMargin + (natHeight - margin) * alignment);
|
||||||
|
|
||||||
resY = Math.max(resY, monitor.y + padding);
|
resY = Math.max(resY, workarea.y + padding);
|
||||||
resY = Math.min(resY, monitor.y + monitor.height - (padding + natHeight));
|
resY = Math.min(resY, workarea.y + workarea.height - (padding + natHeight));
|
||||||
|
|
||||||
arrowOrigin = sourceCenterY - resY;
|
arrowOrigin = sourceCenterY - resY;
|
||||||
if (arrowOrigin <= (y1 + (borderRadius + halfBase))) {
|
if (arrowOrigin <= (y1 + (borderRadius + halfBase))) {
|
||||||
@@ -588,9 +571,8 @@ var BoxPointer = GObject.registerClass({
|
|||||||
parent = parent.get_parent();
|
parent = parent.get_parent();
|
||||||
}
|
}
|
||||||
|
|
||||||
this._xPosition = Math.floor(x);
|
// Actually set the position
|
||||||
this._yPosition = Math.floor(y);
|
allocationBox.set_origin(Math.floor(x), Math.floor(y));
|
||||||
this._shiftActor();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// @origin: Coordinate specifying middle of the arrow, along
|
// @origin: Coordinate specifying middle of the arrow, along
|
||||||
@@ -613,44 +595,30 @@ var BoxPointer = GObject.registerClass({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_shiftActor() {
|
|
||||||
// Since the position of the BoxPointer depends on the allocated size
|
|
||||||
// of the BoxPointer and the position of the source actor, trying
|
|
||||||
// to position the BoxPointer via the x/y properties will result in
|
|
||||||
// allocation loops and warnings. Instead we do the positioning via
|
|
||||||
// the anchor point, which is independent of allocation, and leave
|
|
||||||
// x == y == 0.
|
|
||||||
this.set_anchor_point(-(this._xPosition + this._xOffset),
|
|
||||||
-(this._yPosition + this._yOffset));
|
|
||||||
}
|
|
||||||
|
|
||||||
_calculateArrowSide(arrowSide) {
|
_calculateArrowSide(arrowSide) {
|
||||||
let sourceAllocation = Shell.util_get_transformed_allocation(this._sourceActor);
|
let sourceAllocation = this._sourceAllocation;
|
||||||
let [minWidth, minHeight, boxWidth, boxHeight] = this.get_preferred_size();
|
let [, , boxWidth, boxHeight] = this.get_preferred_size();
|
||||||
let monitorActor = this.sourceActor;
|
let workarea = this._workArea;
|
||||||
if (!monitorActor)
|
|
||||||
monitorActor = this;
|
|
||||||
let monitor = Main.layoutManager.findMonitorForActor(monitorActor);
|
|
||||||
|
|
||||||
switch (arrowSide) {
|
switch (arrowSide) {
|
||||||
case St.Side.TOP:
|
case St.Side.TOP:
|
||||||
if (sourceAllocation.y2 + boxHeight > monitor.y + monitor.height &&
|
if (sourceAllocation.y2 + boxHeight > workarea.y + workarea.height &&
|
||||||
boxHeight < sourceAllocation.y1 - monitor.y)
|
boxHeight < sourceAllocation.y1 - workarea.y)
|
||||||
return St.Side.BOTTOM;
|
return St.Side.BOTTOM;
|
||||||
break;
|
break;
|
||||||
case St.Side.BOTTOM:
|
case St.Side.BOTTOM:
|
||||||
if (sourceAllocation.y1 - boxHeight < monitor.y &&
|
if (sourceAllocation.y1 - boxHeight < workarea.y &&
|
||||||
boxHeight < monitor.y + monitor.height - sourceAllocation.y2)
|
boxHeight < workarea.y + workarea.height - sourceAllocation.y2)
|
||||||
return St.Side.TOP;
|
return St.Side.TOP;
|
||||||
break;
|
break;
|
||||||
case St.Side.LEFT:
|
case St.Side.LEFT:
|
||||||
if (sourceAllocation.x2 + boxWidth > monitor.x + monitor.width &&
|
if (sourceAllocation.x2 + boxWidth > workarea.x + workarea.width &&
|
||||||
boxWidth < sourceAllocation.x1 - monitor.x)
|
boxWidth < sourceAllocation.x1 - workarea.x)
|
||||||
return St.Side.RIGHT;
|
return St.Side.RIGHT;
|
||||||
break;
|
break;
|
||||||
case St.Side.RIGHT:
|
case St.Side.RIGHT:
|
||||||
if (sourceAllocation.x1 - boxWidth < monitor.x &&
|
if (sourceAllocation.x1 - boxWidth < workarea.x &&
|
||||||
boxWidth < monitor.x + monitor.width - sourceAllocation.x2)
|
boxWidth < workarea.x + workarea.width - sourceAllocation.x2)
|
||||||
return St.Side.LEFT;
|
return St.Side.LEFT;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -658,38 +626,16 @@ var BoxPointer = GObject.registerClass({
|
|||||||
return arrowSide;
|
return arrowSide;
|
||||||
}
|
}
|
||||||
|
|
||||||
_updateFlip() {
|
_updateFlip(allocationBox) {
|
||||||
let arrowSide = this._calculateArrowSide(this._userArrowSide);
|
let arrowSide = this._calculateArrowSide(this._userArrowSide);
|
||||||
if (this._arrowSide != arrowSide) {
|
if (this._arrowSide != arrowSide) {
|
||||||
this._arrowSide = arrowSide;
|
this._arrowSide = arrowSide;
|
||||||
this._reposition();
|
this._reposition(allocationBox);
|
||||||
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => {
|
|
||||||
this.queue_relayout();
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
|
|
||||||
this.emit('arrow-side-changed');
|
this.emit('arrow-side-changed');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
set xOffset(offset) {
|
|
||||||
this._xOffset = offset;
|
|
||||||
this._shiftActor();
|
|
||||||
}
|
|
||||||
|
|
||||||
get xOffset() {
|
|
||||||
return this._xOffset;
|
|
||||||
}
|
|
||||||
|
|
||||||
set yOffset(offset) {
|
|
||||||
this._yOffset = offset;
|
|
||||||
this._shiftActor();
|
|
||||||
}
|
|
||||||
|
|
||||||
get yOffset() {
|
|
||||||
return this._yOffset;
|
|
||||||
}
|
|
||||||
|
|
||||||
updateArrowSide(side) {
|
updateArrowSide(side) {
|
||||||
this._arrowSide = side;
|
this._arrowSide = side;
|
||||||
this._border.queue_repaint();
|
this._border.queue_repaint();
|
||||||
|
|||||||
@@ -1,12 +1,8 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
/* exported Calendar, CalendarMessageList */
|
||||||
|
|
||||||
const Clutter = imports.gi.Clutter;
|
const { Clutter, Gio, GLib, GObject, Shell, St } = imports.gi;
|
||||||
const Gio = imports.gi.Gio;
|
|
||||||
const GLib = imports.gi.GLib;
|
|
||||||
const Gtk = imports.gi.Gtk;
|
|
||||||
const St = imports.gi.St;
|
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
const Shell = imports.gi.Shell;
|
|
||||||
|
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const MessageList = imports.ui.messageList;
|
const MessageList = imports.ui.messageList;
|
||||||
@@ -14,13 +10,15 @@ const MessageTray = imports.ui.messageTray;
|
|||||||
const Mpris = imports.ui.mpris;
|
const Mpris = imports.ui.mpris;
|
||||||
const Util = imports.misc.util;
|
const Util = imports.misc.util;
|
||||||
|
|
||||||
|
const { loadInterfaceXML } = imports.misc.fileUtils;
|
||||||
|
|
||||||
var MSECS_IN_DAY = 24 * 60 * 60 * 1000;
|
var MSECS_IN_DAY = 24 * 60 * 60 * 1000;
|
||||||
var SHOW_WEEKDATE_KEY = 'show-weekdate';
|
var SHOW_WEEKDATE_KEY = 'show-weekdate';
|
||||||
var ELLIPSIS_CHAR = '\u2026';
|
var ELLIPSIS_CHAR = '\u2026';
|
||||||
|
|
||||||
var MESSAGE_ICON_SIZE = -1; // pick up from CSS
|
var MESSAGE_ICON_SIZE = -1; // pick up from CSS
|
||||||
|
|
||||||
var NC_ = (context, str) => context + '\u0004' + str;
|
var NC_ = (context, str) => `${context}\u0004${str}`;
|
||||||
|
|
||||||
function sameYear(dateA, dateB) {
|
function sameYear(dateA, dateB) {
|
||||||
return (dateA.getYear() == dateB.getYear());
|
return (dateA.getYear() == dateB.getYear());
|
||||||
@@ -41,7 +39,7 @@ function isToday(date) {
|
|||||||
function _isWorkDay(date) {
|
function _isWorkDay(date) {
|
||||||
/* Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). */
|
/* Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). */
|
||||||
let days = C_('calendar-no-work', "06");
|
let days = C_('calendar-no-work', "06");
|
||||||
return days.indexOf(date.getDay().toString()) == -1;
|
return !days.includes(date.getDay().toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
function _getBeginningOfDay(date) {
|
function _getBeginningOfDay(date) {
|
||||||
@@ -112,33 +110,21 @@ var EmptyEventSource = class EmptyEventSource {
|
|||||||
destroy() {
|
destroy() {
|
||||||
}
|
}
|
||||||
|
|
||||||
requestRange(begin, end) {
|
requestRange(_begin, _end) {
|
||||||
}
|
}
|
||||||
|
|
||||||
getEvents(begin, end) {
|
getEvents(_begin, _end) {
|
||||||
let result = [];
|
let result = [];
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
hasEvents(day) {
|
hasEvents(_day) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
Signals.addSignalMethods(EmptyEventSource.prototype);
|
Signals.addSignalMethods(EmptyEventSource.prototype);
|
||||||
|
|
||||||
const CalendarServerIface = `
|
const CalendarServerIface = loadInterfaceXML('org.gnome.Shell.CalendarServer');
|
||||||
<node>
|
|
||||||
<interface name="org.gnome.Shell.CalendarServer">
|
|
||||||
<method name="GetEvents">
|
|
||||||
<arg type="x" direction="in" />
|
|
||||||
<arg type="x" direction="in" />
|
|
||||||
<arg type="b" direction="in" />
|
|
||||||
<arg type="a(sssbxxa{sv})" direction="out" />
|
|
||||||
</method>
|
|
||||||
<property name="HasCalendars" type="b" access="read" />
|
|
||||||
<signal name="Changed" />
|
|
||||||
</interface>
|
|
||||||
</node>`;
|
|
||||||
|
|
||||||
const CalendarServerInfo = Gio.DBusInterfaceInfo.new_for_xml(CalendarServerIface);
|
const CalendarServerInfo = Gio.DBusInterfaceInfo.new_for_xml(CalendarServerIface);
|
||||||
|
|
||||||
@@ -158,8 +144,7 @@ function _datesEqual(a, b) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
function _dateIntervalsOverlap(a0, a1, b0, b1)
|
function _dateIntervalsOverlap(a0, a1, b0, b1) {
|
||||||
{
|
|
||||||
if (a1 <= b0)
|
if (a1 <= b0)
|
||||||
return false;
|
return false;
|
||||||
else if (b1 <= a0)
|
else if (b1 <= a0)
|
||||||
@@ -183,7 +168,7 @@ var DBusEventSource = class DBusEventSource {
|
|||||||
try {
|
try {
|
||||||
this._dbusProxy.init_finish(result);
|
this._dbusProxy.init_finish(result);
|
||||||
loaded = true;
|
loaded = true;
|
||||||
} catch(e) {
|
} catch (e) {
|
||||||
if (e.matches(Gio.DBusError, Gio.DBusError.TIMED_OUT)) {
|
if (e.matches(Gio.DBusError, Gio.DBusError.TIMED_OUT)) {
|
||||||
// Ignore timeouts and install signals as normal, because with high
|
// Ignore timeouts and install signals as normal, because with high
|
||||||
// probability the service will appear later on, and we will get a
|
// probability the service will appear later on, and we will get a
|
||||||
@@ -193,7 +178,7 @@ var DBusEventSource = class DBusEventSource {
|
|||||||
// about the HasCalendars property and would cause an exception trying
|
// about the HasCalendars property and would cause an exception trying
|
||||||
// to read it)
|
// to read it)
|
||||||
} else {
|
} else {
|
||||||
log('Error loading calendars: ' + e.message);
|
log(`Error loading calendars: ${e.message}`);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -236,13 +221,13 @@ var DBusEventSource = class DBusEventSource {
|
|||||||
this._lastRequestEnd = null;
|
this._lastRequestEnd = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
_onNameAppeared(owner) {
|
_onNameAppeared() {
|
||||||
this._initialized = true;
|
this._initialized = true;
|
||||||
this._resetCache();
|
this._resetCache();
|
||||||
this._loadEvents(true);
|
this._loadEvents(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
_onNameVanished(oldOwner) {
|
_onNameVanished() {
|
||||||
this._resetCache();
|
this._resetCache();
|
||||||
this.emit('changed');
|
this.emit('changed');
|
||||||
}
|
}
|
||||||
@@ -251,22 +236,20 @@ var DBusEventSource = class DBusEventSource {
|
|||||||
this._loadEvents(false);
|
this._loadEvents(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
_onEventsReceived(results, error) {
|
_onEventsReceived(results, _error) {
|
||||||
let newEvents = [];
|
let newEvents = [];
|
||||||
let appointments = results ? results[0] : null;
|
let appointments = results[0] || [];
|
||||||
if (appointments != null) {
|
for (let n = 0; n < appointments.length; n++) {
|
||||||
for (let n = 0; n < appointments.length; n++) {
|
let a = appointments[n];
|
||||||
let a = appointments[n];
|
let date = new Date(a[4] * 1000);
|
||||||
let date = new Date(a[4] * 1000);
|
let end = new Date(a[5] * 1000);
|
||||||
let end = new Date(a[5] * 1000);
|
let id = a[0];
|
||||||
let id = a[0];
|
let summary = a[1];
|
||||||
let summary = a[1];
|
let allDay = a[3];
|
||||||
let allDay = a[3];
|
let event = new CalendarEvent(id, date, end, summary, allDay);
|
||||||
let event = new CalendarEvent(id, date, end, summary, allDay);
|
newEvents.push(event);
|
||||||
newEvents.push(event);
|
|
||||||
}
|
|
||||||
newEvents.sort((ev1, ev2) => ev1.date.getTime() - ev2.date.getTime());
|
|
||||||
}
|
}
|
||||||
|
newEvents.sort((ev1, ev2) => ev1.date.getTime() - ev2.date.getTime());
|
||||||
|
|
||||||
this._events = newEvents;
|
this._events = newEvents;
|
||||||
this.isLoading = false;
|
this.isLoading = false;
|
||||||
@@ -278,7 +261,7 @@ var DBusEventSource = class DBusEventSource {
|
|||||||
if (!this._initialized)
|
if (!this._initialized)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (this._curRequestBegin && this._curRequestEnd){
|
if (this._curRequestBegin && this._curRequestEnd) {
|
||||||
this._dbusProxy.GetEventsRemote(this._curRequestBegin.getTime() / 1000,
|
this._dbusProxy.GetEventsRemote(this._curRequestBegin.getTime() / 1000,
|
||||||
this._curRequestEnd.getTime() / 1000,
|
this._curRequestEnd.getTime() / 1000,
|
||||||
forceReload,
|
forceReload,
|
||||||
@@ -300,7 +283,7 @@ var DBusEventSource = class DBusEventSource {
|
|||||||
|
|
||||||
getEvents(begin, end) {
|
getEvents(begin, end) {
|
||||||
let result = [];
|
let result = [];
|
||||||
for(let n = 0; n < this._events.length; n++) {
|
for (let n = 0; n < this._events.length; n++) {
|
||||||
let event = this._events[n];
|
let event = this._events[n];
|
||||||
|
|
||||||
if (_dateIntervalsOverlap (event.date, event.end, begin, end)) {
|
if (_dateIntervalsOverlap (event.date, event.end, begin, end)) {
|
||||||
@@ -335,7 +318,7 @@ var Calendar = class Calendar {
|
|||||||
this._weekStart = Shell.util_get_week_start();
|
this._weekStart = Shell.util_get_week_start();
|
||||||
this._settings = new Gio.Settings({ schema_id: 'org.gnome.desktop.calendar' });
|
this._settings = new Gio.Settings({ schema_id: 'org.gnome.desktop.calendar' });
|
||||||
|
|
||||||
this._settings.connect('changed::' + SHOW_WEEKDATE_KEY, this._onSettingsChange.bind(this));
|
this._settings.connect(`changed::${SHOW_WEEKDATE_KEY}`, this._onSettingsChange.bind(this));
|
||||||
this._useWeekdate = this._settings.get_boolean(SHOW_WEEKDATE_KEY);
|
this._useWeekdate = this._settings.get_boolean(SHOW_WEEKDATE_KEY);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -417,8 +400,8 @@ var Calendar = class Calendar {
|
|||||||
this._topBox.add(this._backButton);
|
this._topBox.add(this._backButton);
|
||||||
this._backButton.connect('clicked', this._onPrevMonthButtonClicked.bind(this));
|
this._backButton.connect('clicked', this._onPrevMonthButtonClicked.bind(this));
|
||||||
|
|
||||||
this._monthLabel = new St.Label({style_class: 'calendar-month-label',
|
this._monthLabel = new St.Label({ style_class: 'calendar-month-label',
|
||||||
can_focus: true });
|
can_focus: true });
|
||||||
this._topBox.add(this._monthLabel, { expand: true, x_fill: false, x_align: St.Align.MIDDLE });
|
this._topBox.add(this._monthLabel, { expand: true, x_fill: false, x_align: St.Align.MIDDLE });
|
||||||
|
|
||||||
this._forwardButton = new St.Button({ style_class: 'calendar-change-month-forward pager-button',
|
this._forwardButton = new St.Button({ style_class: 'calendar-change-month-forward pager-button',
|
||||||
@@ -481,8 +464,7 @@ var Calendar = class Calendar {
|
|||||||
let day = 32 - new Date(newDate.getFullYear() - 1, 11, 32).getDate();
|
let day = 32 - new Date(newDate.getFullYear() - 1, 11, 32).getDate();
|
||||||
newDate = new Date(newDate.getFullYear() - 1, 11, day);
|
newDate = new Date(newDate.getFullYear() - 1, 11, day);
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
newDate.setMonth(oldMonth - 1);
|
newDate.setMonth(oldMonth - 1);
|
||||||
if (newDate.getMonth() != oldMonth - 1) {
|
if (newDate.getMonth() != oldMonth - 1) {
|
||||||
let day = 32 - new Date(newDate.getFullYear(), oldMonth - 1, 32).getDate();
|
let day = 32 - new Date(newDate.getFullYear(), oldMonth - 1, 32).getDate();
|
||||||
@@ -505,8 +487,7 @@ var Calendar = class Calendar {
|
|||||||
let day = 32 - new Date(newDate.getFullYear() + 1, 0, 32).getDate();
|
let day = 32 - new Date(newDate.getFullYear() + 1, 0, 32).getDate();
|
||||||
newDate = new Date(newDate.getFullYear() + 1, 0, day);
|
newDate = new Date(newDate.getFullYear() + 1, 0, day);
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
newDate.setMonth(oldMonth + 1);
|
newDate.setMonth(oldMonth + 1);
|
||||||
if (newDate.getMonth() != oldMonth + 1) {
|
if (newDate.getMonth() != oldMonth + 1) {
|
||||||
let day = 32 - new Date(newDate.getFullYear(), oldMonth + 1, 32).getDate();
|
let day = 32 - new Date(newDate.getFullYear(), oldMonth + 1, 32).getDate();
|
||||||
@@ -561,8 +542,6 @@ var Calendar = class Calendar {
|
|||||||
this._calendarBegin = new Date(beginDate);
|
this._calendarBegin = new Date(beginDate);
|
||||||
this._markedAsToday = now;
|
this._markedAsToday = now;
|
||||||
|
|
||||||
let year = beginDate.getYear();
|
|
||||||
|
|
||||||
let daysToWeekStart = (7 + beginDate.getDay() - this._weekStart) % 7;
|
let daysToWeekStart = (7 + beginDate.getDay() - this._weekStart) % 7;
|
||||||
let startsOnWeekStart = daysToWeekStart == 0;
|
let startsOnWeekStart = daysToWeekStart == 0;
|
||||||
let weekPadding = startsOnWeekStart ? 7 : 0;
|
let weekPadding = startsOnWeekStart ? 7 : 0;
|
||||||
@@ -574,7 +553,7 @@ var Calendar = class Calendar {
|
|||||||
let row = 2;
|
let row = 2;
|
||||||
// nRows here means 6 weeks + one header + one navbar
|
// nRows here means 6 weeks + one header + one navbar
|
||||||
let nRows = 8;
|
let nRows = 8;
|
||||||
while (row < 8) {
|
while (row < nRows) {
|
||||||
// xgettext:no-javascript-format
|
// xgettext:no-javascript-format
|
||||||
let button = new St.Button({ label: iter.toLocaleFormat(C_("date day number format", "%d")),
|
let button = new St.Button({ label: iter.toLocaleFormat(C_("date day number format", "%d")),
|
||||||
can_focus: true });
|
can_focus: true });
|
||||||
@@ -600,12 +579,13 @@ var Calendar = class Calendar {
|
|||||||
|
|
||||||
// Hack used in lieu of border-collapse - see gnome-shell.css
|
// Hack used in lieu of border-collapse - see gnome-shell.css
|
||||||
if (row == 2)
|
if (row == 2)
|
||||||
styleClass = 'calendar-day-top ' + styleClass;
|
styleClass = `calendar-day-top ${styleClass}`;
|
||||||
|
|
||||||
let leftMost = rtl ? iter.getDay() == (this._weekStart + 6) % 7
|
let leftMost = rtl
|
||||||
: iter.getDay() == this._weekStart;
|
? iter.getDay() == (this._weekStart + 6) % 7
|
||||||
|
: iter.getDay() == this._weekStart;
|
||||||
if (leftMost)
|
if (leftMost)
|
||||||
styleClass = 'calendar-day-left ' + styleClass;
|
styleClass = `calendar-day-left ${styleClass}`;
|
||||||
|
|
||||||
if (sameDay(now, iter))
|
if (sameDay(now, iter))
|
||||||
styleClass += ' calendar-today';
|
styleClass += ' calendar-today';
|
||||||
@@ -663,9 +643,9 @@ var Calendar = class Calendar {
|
|||||||
button.add_style_pseudo_class('selected');
|
button.add_style_pseudo_class('selected');
|
||||||
if (this._shouldDateGrabFocus)
|
if (this._shouldDateGrabFocus)
|
||||||
button.grab_key_focus();
|
button.grab_key_focus();
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
button.remove_style_pseudo_class('selected');
|
button.remove_style_pseudo_class('selected');
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -701,23 +681,24 @@ var EventMessage = class EventMessage extends MessageList.Message {
|
|||||||
*/
|
*/
|
||||||
title = C_("event list time", "All Day");
|
title = C_("event list time", "All Day");
|
||||||
} else {
|
} else {
|
||||||
let date = this._event.date >= periodBegin ? this._event.date
|
let date = this._event.date >= periodBegin
|
||||||
: this._event.end;
|
? this._event.date
|
||||||
|
: this._event.end;
|
||||||
title = Util.formatTime(date, { timeOnly: true });
|
title = Util.formatTime(date, { timeOnly: true });
|
||||||
}
|
}
|
||||||
|
|
||||||
let rtl = Clutter.get_default_text_direction() == Clutter.TextDirection.RTL;
|
let rtl = Clutter.get_default_text_direction() == Clutter.TextDirection.RTL;
|
||||||
if (this._event.date < periodBegin && !this._event.allDay) {
|
if (this._event.date < periodBegin && !this._event.allDay) {
|
||||||
if (rtl)
|
if (rtl)
|
||||||
title = title + ELLIPSIS_CHAR;
|
title = `${title}${ELLIPSIS_CHAR}`;
|
||||||
else
|
else
|
||||||
title = ELLIPSIS_CHAR + title;
|
title = `${ELLIPSIS_CHAR}${title}`;
|
||||||
}
|
}
|
||||||
if (this._event.end > periodEnd && !this._event.allDay) {
|
if (this._event.end > periodEnd && !this._event.allDay) {
|
||||||
if (rtl)
|
if (rtl)
|
||||||
title = ELLIPSIS_CHAR + title;
|
title = `${ELLIPSIS_CHAR}${title}`;
|
||||||
else
|
else
|
||||||
title = title + ELLIPSIS_CHAR;
|
title = `${title}${ELLIPSIS_CHAR}`;
|
||||||
}
|
}
|
||||||
return title;
|
return title;
|
||||||
}
|
}
|
||||||
@@ -756,7 +737,7 @@ class NotificationMessage extends MessageList.Message {
|
|||||||
return this.notification.source.createIcon(MESSAGE_ICON_SIZE);
|
return this.notification.source.createIcon(MESSAGE_ICON_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
_onUpdated(n, clear) {
|
_onUpdated(n, _clear) {
|
||||||
this.setIcon(this._getIcon());
|
this.setIcon(this._getIcon());
|
||||||
this.setTitle(n.title);
|
this.setTitle(n.title);
|
||||||
this.setBody(n.bannerBodyText);
|
this.setBody(n.bannerBodyText);
|
||||||
@@ -1083,7 +1064,7 @@ var CalendarMessageList = class CalendarMessageList {
|
|||||||
overlay_scrollbars: true,
|
overlay_scrollbars: true,
|
||||||
x_expand: true, y_expand: true,
|
x_expand: true, y_expand: true,
|
||||||
x_fill: true, y_fill: true });
|
x_fill: true, y_fill: true });
|
||||||
this._scrollView.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC);
|
this._scrollView.set_policy(St.PolicyType.NEVER, St.PolicyType.AUTOMATIC);
|
||||||
box.add_actor(this._scrollView);
|
box.add_actor(this._scrollView);
|
||||||
|
|
||||||
this._clearButton = new St.Button({ style_class: 'message-list-clear-button button',
|
this._clearButton = new St.Button({ style_class: 'message-list-clear-button button',
|
||||||
@@ -1092,10 +1073,14 @@ var CalendarMessageList = class CalendarMessageList {
|
|||||||
this._clearButton.set_x_align(Clutter.ActorAlign.END);
|
this._clearButton.set_x_align(Clutter.ActorAlign.END);
|
||||||
this._clearButton.connect('clicked', () => {
|
this._clearButton.connect('clicked', () => {
|
||||||
let sections = [...this._sections.keys()];
|
let sections = [...this._sections.keys()];
|
||||||
sections.forEach((s) => { s.clear(); });
|
sections.forEach(s => s.clear());
|
||||||
});
|
});
|
||||||
box.add_actor(this._clearButton);
|
box.add_actor(this._clearButton);
|
||||||
|
|
||||||
|
this._placeholder.actor.bind_property('visible',
|
||||||
|
this._clearButton, 'visible',
|
||||||
|
GObject.BindingFlags.INVERT_BOOLEAN);
|
||||||
|
|
||||||
this._sectionList = new St.BoxLayout({ style_class: 'message-list-sections',
|
this._sectionList = new St.BoxLayout({ style_class: 'message-list-sections',
|
||||||
vertical: true,
|
vertical: true,
|
||||||
y_expand: true,
|
y_expand: true,
|
||||||
@@ -1118,7 +1103,7 @@ var CalendarMessageList = class CalendarMessageList {
|
|||||||
_addSection(section) {
|
_addSection(section) {
|
||||||
let obj = {
|
let obj = {
|
||||||
destroyId: 0,
|
destroyId: 0,
|
||||||
visibleId: 0,
|
visibleId: 0,
|
||||||
emptyChangedId: 0,
|
emptyChangedId: 0,
|
||||||
canClearChangedId: 0,
|
canClearChangedId: 0,
|
||||||
keyFocusId: 0
|
keyFocusId: 0
|
||||||
@@ -1166,7 +1151,6 @@ var CalendarMessageList = class CalendarMessageList {
|
|||||||
|
|
||||||
let empty = sections.every(s => s.empty || !s.actor.visible);
|
let empty = sections.every(s => s.empty || !s.actor.visible);
|
||||||
this._placeholder.actor.visible = empty;
|
this._placeholder.actor.visible = empty;
|
||||||
this._clearButton.visible = !empty;
|
|
||||||
|
|
||||||
let canClear = sections.some(s => s.canClear && s.actor.visible);
|
let canClear = sections.some(s => s.canClear && s.actor.visible);
|
||||||
this._clearButton.reactive = canClear;
|
this._clearButton.reactive = canClear;
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
const Clutter = imports.gi.Clutter;
|
/* exported CheckBox */
|
||||||
const Pango = imports.gi.Pango;
|
const { Clutter, Pango, St } = imports.gi;
|
||||||
const St = imports.gi.St;
|
|
||||||
|
|
||||||
var CheckBox = class CheckBox {
|
var CheckBox = class CheckBox {
|
||||||
constructor(label) {
|
constructor(label) {
|
||||||
|
|||||||