Compare commits
1341 Commits
3.5.2
...
upstream/3.36.2
| Author | SHA1 | Date | |
|---|---|---|---|
| d3b687df8b | |||
| df463177e7 | |||
| 62af36ebfa | |||
| c5246b7415 | |||
| d39c1fd685 | |||
| 665a7fbbcb | |||
| a4987d03b8 | |||
| c477f10bfb | |||
| 2ae0f368b9 | |||
| 3428bebb67 | |||
| ac33058086 | |||
| 73822dc5f5 | |||
| 961757f717 | |||
| 7d5c985004 | |||
| cd16995503 | |||
| 3a3b5bac85 | |||
| 9f6b83eece | |||
| c7a08aaf74 | |||
| 4456b440d8 | |||
| f61e2f5f5c | |||
| a8eecac0ff | |||
| 9a6b4da33c | |||
| cb53d0b85c | |||
| 318b9b18af | |||
| cdf970d4b6 | |||
| 1ee3803265 | |||
| b25c4d07a7 | |||
| 330e7b312d | |||
| 01f921541f | |||
| cc52f4a260 | |||
| eb71474c95 | |||
| 69681cdc9a | |||
| c958e2d0fd | |||
| 9c964eaf1b | |||
| 0500480d75 | |||
| 37a09b7be1 | |||
| d8c734124d | |||
| 25b6b562d9 | |||
| f2315d28f9 | |||
| 9b93931de6 | |||
| 47a2fd36e1 | |||
| 8c1d6d88cf | |||
| be19802f78 | |||
| 33b16681c6 | |||
| 35746251fd | |||
| 3c51716268 | |||
| e5421b6cc6 | |||
| a2b014ccbf | |||
| f1e7ae1010 | |||
| 10fe907c83 | |||
| 95131dc252 | |||
| f3acb27d61 | |||
| a904d51cf7 | |||
| 30ad3d670f | |||
| 63615cb657 | |||
| ae9809caba | |||
| c95d197c5c | |||
| a894897770 | |||
| 1b2c0a4b6c | |||
| 8e8b0392a2 | |||
| aea57f0305 | |||
| 6462af30ee | |||
| 8d658f7e0d | |||
| 05bcd981cd | |||
| ecf608ead8 | |||
| ae8749b7e1 | |||
| 4ad50ab035 | |||
| 934d17db4b | |||
| b25e9541ce | |||
| 84a548c0b9 | |||
| 3204fd7842 | |||
| 808f75e998 | |||
| 56ecc684cc | |||
| 67ceca8f70 | |||
| 953445d6cf | |||
| cb834f9fa1 | |||
| ca2cd844b2 | |||
| 98b3da41e8 | |||
| c00c749c0b | |||
| e11c90365b | |||
| c812fdc134 | |||
| 9299db49fb | |||
| 3a15dffe76 | |||
| 3df4e5fdbb | |||
| c0a5d0d091 | |||
| d36a196540 | |||
| 9077687c0a | |||
| fcbfaec53e | |||
| 7c170e7e90 | |||
| ed7a292805 | |||
| eb79f5b512 | |||
| eceff51ba1 | |||
| 63c07bdc73 | |||
| fdc3dda484 | |||
| fca516e58a | |||
| c14f7f6fb8 | |||
| 2497dc6d31 | |||
| a1f38d818d | |||
| 9646149f9a | |||
| b6d02f8e1f | |||
| 5f96b3c11c | |||
| e217f23767 | |||
| 579a290bae | |||
| 2dc4325a90 | |||
| 376502e952 | |||
| 91c9982d7f | |||
| c721121a2d | |||
| 4007b61cf2 | |||
| 2655419880 | |||
| 9f1b52c852 | |||
| d375cac32e | |||
| 66e2b32c8f | |||
| 95dd651b29 | |||
| 1534e50a15 | |||
| 23781abead | |||
| 8065d38fdd | |||
| 05faa0763b | |||
| e88cd44b3c | |||
| 85fa282153 | |||
| 119da3291b | |||
| f047cb0baf | |||
| 6675d1c55d | |||
| be1a22069a | |||
| 2b9162b79d | |||
| 6aab09bd06 | |||
| c336e7d70e | |||
| f486dfa112 | |||
| 80de26dc16 | |||
| af6f5fea54 | |||
| 9743054174 | |||
| 827af154b8 | |||
| f9b87f9b44 | |||
| a41bcd4f10 | |||
| 1a13f29b0c | |||
| b6a6de9bb5 | |||
| 5b7631898c | |||
| f8bae05036 | |||
| 60c75e5fcf | |||
| c6d2063f4d | |||
| 52f373fb70 | |||
| 283a1ec5c2 | |||
| c516f05927 | |||
| e836a9e5e0 | |||
| d1674c5f75 | |||
| 9fa283877c | |||
| f1a154207f | |||
| 5b07dfded9 | |||
| 9f9dbd579b | |||
| c9477dd94d | |||
| 5a30ebe403 | |||
| a5f347ba10 | |||
| dab326c17e | |||
| bdf6af3ee3 | |||
| 1532c15325 | |||
| cbd1b7d983 | |||
| 4b9c53ff2e | |||
| 6eb3a62e2b | |||
| 0469fc6aa9 | |||
| 1f6f22010e | |||
| ae1b17d29c | |||
| 3fa750ce17 | |||
| 56e2a570e3 | |||
| 167f0be6b4 | |||
| 80eb29bd51 | |||
| f2b261c573 | |||
| 6c49ca825c | |||
| 6a25971366 | |||
| dc3523a344 | |||
| 2ef6dba0a5 | |||
| 92db87f7cb | |||
| 82d2011061 | |||
| 545b811562 | |||
| d99d0a06bd | |||
| 6105eecff2 | |||
| d1254d9b57 | |||
| 2db4589dea | |||
| dfeb99fc0a | |||
| 48ea80d391 | |||
| b138e218bb | |||
| 829440f546 | |||
| 14859b4009 | |||
| 3a596054ad | |||
| 65191d83b4 | |||
| 8499b0e254 | |||
| f166ca501f | |||
| a36331522f | |||
| 25e43a5d08 | |||
| ad914441a2 | |||
| 200d337769 | |||
| e56f1a976e | |||
| 6a66cd4fa6 | |||
| 55c493389a | |||
| 06f1303834 | |||
| 3d5687ae3c | |||
| cdd3fba593 | |||
| f11c101878 | |||
| 7c412ca7d9 | |||
| e3a6e8f82c | |||
| ce10ad64c4 | |||
| 5b43d4733c | |||
| 3671d5a299 | |||
| a024d9f005 | |||
| d94a3500f6 | |||
| 28494941e1 | |||
| 78141e6433 | |||
| dd53fb8eb7 | |||
| 6cd2be452b | |||
| 36abd576b5 | |||
| 730547b3e1 | |||
| b70059ac4d | |||
| e7e6b882a3 | |||
| 53f92f2910 | |||
| a26380d56e | |||
| ab334d95e0 | |||
| 7e5726e632 | |||
| 95b40069bf | |||
| bd9f1cfd91 | |||
| 81548ced69 | |||
| a378e5fc34 | |||
| 56d19ad480 | |||
| a071685c13 | |||
| 599428d292 | |||
| 1f1f9664a6 | |||
| fb039c0fb5 | |||
| 6e63edd737 | |||
| 55ecd3939e | |||
| d83d6e857a | |||
| db35d7ae7c | |||
| d34b5030b9 | |||
| 7f8f1234ae | |||
| 9b25a227c6 | |||
| 78580bc3a8 | |||
| b50074fd37 | |||
| d5a1044244 | |||
| 11cad1f3b3 | |||
| eb567c1120 | |||
| 2582ab4fd0 | |||
| 5a06de606d | |||
| 4671c24b78 | |||
| 0d41643866 | |||
| d8f7d70c10 | |||
| cbd981351e | |||
| 434185ba03 | |||
| abc8877d11 | |||
| a7ff9f401e | |||
| bab4be1a59 | |||
| 47beeb1a8e | |||
| 945eddbc26 | |||
| c37ba0878a | |||
| 3861ffae31 | |||
| 2081309679 | |||
| 08a04b2f02 | |||
| 7b363fd659 | |||
| 85112394b3 | |||
| 190243ee89 | |||
| 1141d996d9 | |||
| f7cbd0d600 | |||
| c704f0de55 | |||
| c8a1cd9c99 | |||
| ff79588d3b | |||
| 8ae84703a4 | |||
| f18b281020 | |||
| 75503b5f3c | |||
| 1d96f83362 | |||
| b3f009017c | |||
| 05d961dfe1 | |||
| 8a2b9abc09 | |||
| 3effc9cfc2 | |||
| 1be7061da0 | |||
| f75d1d75af | |||
| 67f9e4c419 | |||
| aaeff6d12b | |||
| 912ba1e651 | |||
| b741b1bbe2 | |||
| d7414025a5 | |||
| a317d75f70 | |||
| 194e294d2c | |||
| a092da2527 | |||
| 4655cde002 | |||
| 0a979f5bfa | |||
| d2046bb2c6 | |||
| a2f40952b3 | |||
| 29917bcb1b | |||
| 1b881e1eaa | |||
| 40a8ab60f4 | |||
| b684e756e2 | |||
| 7eae32eb76 | |||
| 34c20e6176 | |||
| 62818e71e9 | |||
| ee85839d60 | |||
| d9932b8f55 | |||
| efa882080f | |||
| 132b3b0509 | |||
| e5a0616a0a | |||
| fbeb3cf1e9 | |||
| 072fbee7cb | |||
| e9928b3c08 | |||
| 2af737a8c2 | |||
| 321702fd15 | |||
| 60493faf96 | |||
| 821cbf9328 | |||
| cc0f167c0e | |||
| d731534d04 | |||
| b1eb9b9080 | |||
| 94eba47358 | |||
| d34933de0b | |||
| 9410bdfad6 | |||
| d424b0f645 | |||
| c0454db0c6 | |||
| a0b6535210 | |||
| 913b2ba691 | |||
| 9a9b3afa31 | |||
| ba51869b93 | |||
| ffe6110ea9 | |||
| 59bc054ef6 | |||
| 8b1bcc9fed | |||
| ebad80c64d | |||
| 57e9dfe722 | |||
| f17a519c38 | |||
| 39caf951e0 | |||
| ecf28e13b4 | |||
| a01b44f7de | |||
| 6b1926bab3 | |||
| 64986740e3 | |||
| 6583eae622 | |||
| 9add688abf | |||
| a85764a0ab | |||
| eaa2c7857e | |||
| 6e1b5bc346 | |||
| 8223ca9739 | |||
| f59ab1272d | |||
| f25ffe6f63 | |||
| 6746061898 | |||
| 3dc9f2e4ff | |||
| 682d6a8fd1 | |||
| d3ea985e14 | |||
| fe20c27b60 | |||
| 496ae16cf1 | |||
| 0554e0deb9 | |||
| c0c938977c | |||
| 8ee207d74d | |||
| 0e625bedba | |||
| 5ba59d1096 | |||
| 127b5e6c25 | |||
| 64c17acc0a | |||
| 0102b2800a | |||
| 7c66434616 | |||
| f9ae518c9d | |||
| 0ad1e9bbc1 | |||
| 55ba3c086a | |||
| d22e603686 | |||
| 3e0d8bd56f | |||
| 45ac2cd403 | |||
| a808380d04 | |||
| 5c0ef12d13 | |||
| b80aa8ee11 | |||
| 7de345fc8b | |||
| ff3adb8429 | |||
| 3398e74005 | |||
| f9ad051367 | |||
| ae65a82fdd | |||
| 2dbe692a31 | |||
| 7de28858e1 | |||
| 8881fbcc9d | |||
| 3b5a1486de | |||
| 0721ed6504 | |||
| ec98cff9d9 | |||
| 9ecd6bbb13 | |||
| 3b6cd04a59 | |||
| 3284fe81d7 | |||
| 39274f286c | |||
| eba3cfccfe | |||
| f5c69cbfdc | |||
| c668392462 | |||
| 22e416c09b | |||
| 9dc183af23 | |||
| 6a0a247668 | |||
| 5ea14f063f | |||
| 3cc3d03f0b | |||
| 2aaf4370b6 | |||
| ba27cc4a64 | |||
| acb44de469 | |||
| 48399d46c0 | |||
| 30e7ff5a8f | |||
| 968ae427f1 | |||
| 4ee30a5445 | |||
| d3bbeb1b0c | |||
| 9d5b149428 | |||
| b90c99b87c | |||
| ba38019049 | |||
| 406f4cd170 | |||
| a2c63a46d3 | |||
| 3ab01aebec | |||
| c6ecf2c0df | |||
| a26f9e34c7 | |||
| 21315d74c3 | |||
| d86044f383 | |||
| 077a292952 | |||
| 8bd35eeb09 | |||
| eb425ac8a2 | |||
| 724249dd29 | |||
| 76526a9c2d | |||
| 29ea5ca1a9 | |||
| 40c6b8b1d8 | |||
| 057e5bb0c1 | |||
| 07fc66765d | |||
| 2460ac9df8 | |||
| 8c551ba8ee | |||
| 99295c438d | |||
| f840f70052 | |||
| ef99394ffb | |||
| 778eebc421 | |||
| 97d1cbca19 | |||
| a0cae3d130 | |||
| 01893ca048 | |||
| daa7b9b6ab | |||
| c86a67823c | |||
| 726be0692e | |||
| f339001e22 | |||
| 530b165ddf | |||
| e479068d84 | |||
| 824e79d83e | |||
| 0d18c3f70d | |||
| a682b66bbf | |||
| f4510b9b04 | |||
| c1143fa716 | |||
| 37b95a8498 | |||
| cccef0e857 | |||
| 592b4ebacf | |||
| 3a799d519b | |||
| 8b09c17684 | |||
| f00ffcaa3d | |||
| 82cc175df1 | |||
| eda9eeef18 | |||
| fb1d4faece | |||
| 3b1d7428df | |||
| dca18f3614 | |||
| 6a9b3a9369 | |||
| 373c3660a1 | |||
| 74fdac5dfd | |||
| 49c00f3282 | |||
| b9a32a8f64 | |||
| bf2074cd82 | |||
| a659c3e586 | |||
| 959dfee54e | |||
| 714162fdd3 | |||
| 856bda4270 | |||
| 5530229dd2 | |||
| cdc3894400 | |||
| f8f66f628e | |||
| f8b9afda07 | |||
| 617904e69f | |||
| 6e4be83dec | |||
| 66f0972a43 | |||
| e6bdbb2c68 | |||
| 7d3915c30d | |||
| a04ad6acd7 | |||
| 8778c16f2a | |||
| 2917deead1 | |||
| 08fc96c7ee | |||
| 35c01d7223 | |||
| 71ba8b04d7 | |||
| c74077239e | |||
| 2c2d6b69ca | |||
| dcf08375c1 | |||
| 15085df41f | |||
| 29780d495d | |||
| 69700dc29b | |||
| 0a91893b02 | |||
| dceebeaa7f | |||
| a2508106f4 | |||
| 2716430310 | |||
| 4fa73145b4 | |||
| f7b2a1ac58 | |||
| 8ac0313c24 | |||
| 9d6d8e00ac | |||
| a8544a30e1 | |||
| bde50c021c | |||
| 1d5ab3f328 | |||
| 31b00faef8 | |||
| 6e81f240dc | |||
| 74643a62d1 | |||
| 29a9c7582d | |||
| cce2f10fba | |||
| de240fa679 | |||
| e884f770b0 | |||
| eafdd1d78d | |||
| 61a2e5ab9e | |||
| 0824847ac1 | |||
| 791f9abb39 | |||
| 9b3ab2c9b2 | |||
| 5ec54112ab | |||
| 5a84c6d608 | |||
| f8360601b9 | |||
| 0359736890 | |||
| 0a46c0d1df | |||
| c5da5cf9b5 | |||
| 843238b96b | |||
| bac1e8b695 | |||
| ce2b710c25 | |||
| 457db2980a | |||
| c82f8a995b | |||
| cfbb2a459b | |||
| 1d20edb6d8 | |||
| 8a4b245812 | |||
| 8453cf05a7 | |||
| 5cb2657df7 | |||
| 234cf96d39 | |||
| fbf3cf35a6 | |||
| 93040769d8 | |||
| 00959dbf47 | |||
| a17aff71d1 | |||
| 09a60a27ba | |||
| 243f700fa2 | |||
| 021037bfcd | |||
| 2b396b4cf3 | |||
| d05152c21e | |||
| 31f638775c | |||
| d2529db9a9 | |||
| 441949b7c8 | |||
| 7db2a10975 | |||
| 93a26969d5 | |||
| d404d54d7a | |||
| cf101ffbaf | |||
| 06f200c7fd | |||
| 154498ad52 | |||
| d5513f8c96 | |||
| 50b3245e09 | |||
| 483b385c90 | |||
| 9f963a4a8b | |||
| 1747d02622 | |||
| 56d7ca1ee2 | |||
| 1823fcea1f | |||
| 8eef8c7507 | |||
| 1d0e53aa60 | |||
| 0853abdbb7 | |||
| bda97a5267 | |||
| 7e4a8bbd6d | |||
| 8b3685dd50 | |||
| 6f9e2cfed7 | |||
| dc00b23adc | |||
| 142bea0a2d | |||
| 2f70271c1a | |||
| c93d6daf36 | |||
| ebf443ea23 | |||
| 23a46a7ac4 | |||
| 60b198664d | |||
| aaed6da35e | |||
| 5ad82d05f9 | |||
| 35b0ab6bf8 | |||
| c25b9ca0e6 | |||
| 0f9ac6088f | |||
| 5e545d2991 | |||
| 4d1105e361 | |||
| 0cdae2dae0 | |||
| b74c390e1b | |||
| a71ad438b3 | |||
| c400e30da8 | |||
| af7903dba7 | |||
| f99b42e732 | |||
| 7074217b7c | |||
| 8c07f6bee9 | |||
| ad52860a5e | |||
| 76a55e9b89 | |||
| 031a121bc5 | |||
| 23b5594c24 | |||
| f28f08645a | |||
| 229a624553 | |||
| a7204736a8 | |||
| b39931e759 | |||
| db3e910b76 | |||
| 0ff77736da | |||
| 2b36863442 | |||
| cca1be6b70 | |||
| aea1f5187a | |||
| deb7ee8ef6 | |||
| a35336d3c2 | |||
| 7f44a3647c | |||
| e98e5d0d62 | |||
| 71464c91c2 | |||
| 3c32cacb14 | |||
| f82915d153 | |||
| 59aa0f66f3 | |||
| ef149aab93 | |||
| 59c351de63 | |||
| 76e73b9154 | |||
| 69901c72a3 | |||
| 155d517fe8 | |||
| ceee4d64dc | |||
| ab8090e0e2 | |||
| 68e3798dd8 | |||
| 2191d533b5 | |||
| 18f0366307 | |||
| 5b1f7704a6 | |||
| 488eeffeaf | |||
| 79c76a87e2 | |||
| 1958ce7794 | |||
| 42652088a3 | |||
| 2b9ea7519b | |||
| 1634af39dc | |||
| 31b415a378 | |||
| eb78d93601 | |||
| 31f8d6761c | |||
| 010d0e538b | |||
| 6ec1bd5c5f | |||
| 5d4c14e0b7 | |||
| 283f679fcc | |||
| 2935848954 | |||
| 9676bc83af | |||
| 7a0e393652 | |||
| ca1da1b349 | |||
| 7c5f0ed87f | |||
| f6c9ea3d61 | |||
| c23580bd56 | |||
| 94f289280b | |||
| b664a1020a | |||
| fb1f010825 | |||
| 7cb5d8a94f | |||
| 4cde6facc9 | |||
| 547163e895 | |||
| f7fd160896 | |||
| 8a667ba142 | |||
| 456d3cd07d | |||
| daeed1a864 | |||
| 809c8cbd41 | |||
| 31506a342c | |||
| d1bf592539 | |||
| 6062284ac4 | |||
| 8f2ebafa75 | |||
| 8390eadb0c | |||
| f45c672245 | |||
| 2d75090848 | |||
| af090a99ea | |||
| 85b7049376 | |||
| 61ec98f504 | |||
| b97c111bde | |||
| 8b89840e2b | |||
| dd620df620 | |||
| 0d0eff2ea2 | |||
| 271102be8d | |||
| 70f195da7a | |||
| 9bca5c32da | |||
| b492b06228 | |||
| a1583deed2 | |||
| e022c1671d | |||
| 1dd5343ff4 | |||
| 7750774c85 | |||
| e80d667b44 | |||
| 6297839106 | |||
| deae4392ab | |||
| bea06a7589 | |||
| c56805dea6 | |||
| 0a5e5ee93c | |||
| 8f4cecc8e5 | |||
| 487c089e86 | |||
| 903a3b25cb | |||
| 697445c823 | |||
| 37e38ae692 | |||
| 5ed7bf76f9 | |||
| 1e8c7a2d8f | |||
| 11b151e5e0 | |||
| 0b18b15fee | |||
| 2c37ac8929 | |||
| 83eb3ef620 | |||
| a7186cb668 | |||
| 6c58d700aa | |||
| 7189f8586b | |||
| f97c2c55a4 | |||
| 068eaad840 | |||
| 36a51901d8 | |||
| 7cfd862e70 | |||
| 5e9f66f3d1 | |||
| c1929e34d1 | |||
| fdaecf6c44 | |||
| 8bad8a3b63 | |||
| dae1feb250 | |||
| 3ef2393d14 | |||
| 5e39f82b8e | |||
| fb59540e41 | |||
| 715f445f61 | |||
| 4eceb9443f | |||
| 6909504c10 | |||
| 3476b0d84e | |||
| 44cbe64e30 | |||
| 9413c806cb | |||
| a519c97ca9 | |||
| c9a6421f36 | |||
| ba13ae6955 | |||
| a39aba4099 | |||
| 2c914571b5 | |||
| b114d9012d | |||
| 612604cf16 | |||
| 15379351d7 | |||
| c69ea808ae | |||
| 7afdb541ce | |||
| 57d012c846 | |||
| 6483189cd7 | |||
| c0170ff945 | |||
| 59060067fb | |||
| c334f0803b | |||
| eb623f5289 | |||
| 664cf6d527 | |||
| d96839190d | |||
| 2d5b0ed6d6 | |||
| bd2819e007 | |||
| b8e2790850 | |||
| 36ce1b0a79 | |||
| 93a1fd0b60 | |||
| 04ec4de375 | |||
| 8f7053a3ad | |||
| fb419712c9 | |||
| 96bdc9f350 | |||
| 79f2792b7c | |||
| 4528568ff2 | |||
| b4d1517099 | |||
| 303b19218c | |||
| 933bdf93b5 | |||
| 804e95174a | |||
| 5cc48637d1 | |||
| 044d6fab28 | |||
| ec7797dac8 | |||
| 52cdc5945c | |||
| 29320838f9 | |||
| 44a36972bf | |||
| 204042b66b | |||
| cecf8b9e40 | |||
| 9d8ec2a262 | |||
| 1c46ef68d1 | |||
| adc68889b7 | |||
| 44af7991e2 | |||
| c5c8610b4b | |||
| c10f0000c0 | |||
| 48e0c37d4a | |||
| de543bf31d | |||
| 38c19ac4b1 | |||
| f73361472c | |||
| 5b5492a643 | |||
| 76d2372884 | |||
| b7b82b2408 | |||
| 03ee405f1d | |||
| e774baf9bb | |||
| ccbcc2198c | |||
| 0e0f7c80c2 | |||
| 8c496fd1a6 | |||
| 8b59c031d5 | |||
| a3f352d0c3 | |||
| e80b790b78 | |||
| 0dfc4e9fbc | |||
| 43c4e7fa2e | |||
| 5688cea552 | |||
| 6d2b588740 | |||
| 72dc3234a7 | |||
| c8f9b23636 | |||
| 768bad6e1e | |||
| bfe60bd2d9 | |||
| 5ba4e68f17 | |||
| 8c6644f1be | |||
| 71fa03c4ea | |||
| dd3c7ca199 | |||
| 5c2d13ec51 | |||
| 5fc66444b6 | |||
| 57bfb9400e | |||
| 4a1f49586d | |||
| 92012f6626 | |||
| 92b7c44e6d | |||
| 3a023a3cba | |||
| 0a0d273d32 | |||
| 1f300838e8 | |||
| 4da36684ad | |||
| 109bdd1cd0 | |||
| a351dd8c5c | |||
| 1b7a3e8f36 | |||
| b0c75392a3 | |||
| 3825c5c715 | |||
| d285d26604 | |||
| e669aa75b6 | |||
| c9693d4f09 | |||
| e372c5ace8 | |||
| 9386610b01 | |||
| c807b02c16 | |||
| 614d1c9697 | |||
| 70056ba56e | |||
| 4af36f41fa | |||
| 60ea0fb172 | |||
| ab37a8f92f | |||
| 91890367b8 | |||
| 54e39c9779 | |||
| d4ca2aeeb5 | |||
| 1d53017a30 | |||
| 687ea92e82 | |||
| 0dd5b5251a | |||
| 6e82912fe5 | |||
| 83a2083216 | |||
| bdce0b68a8 | |||
| 846ac2c9d5 | |||
| 33ca28d68c | |||
| 9deed91c0f | |||
| 8e2cdf3a9e | |||
| a8128eedac | |||
| 43cc0514ff | |||
| d421eff477 | |||
| 8696067186 | |||
| 1d5ab0f0de | |||
| 162ece1bba | |||
| d8974faa65 | |||
| be38e343cd | |||
| 88f2eef2b2 | |||
| 04e5c1da9e | |||
| f48055f331 | |||
| 3a484a9988 | |||
| 3fd977779f | |||
| 191c7ccc24 | |||
| f77e38e771 | |||
| 4c53d9b143 | |||
| 4164422156 | |||
| 28d0d9e9bc | |||
| e40ac33fb2 | |||
| 631ac48a4e | |||
| a8b2746089 | |||
| 6e53f579dd | |||
| b6f434fba4 | |||
| 2667b9f3e5 | |||
| 5616a6deae | |||
| 6195b5f4c0 | |||
| 2f63809699 | |||
| 4366702fcf | |||
| 6d4e97d087 | |||
| 528ceec195 | |||
| bfaac4f8e3 | |||
| b2a2653492 | |||
| 26eea0bb46 | |||
| 2fd1392666 | |||
| 96c39cdda0 | |||
| eee0c56772 | |||
| edda0cd626 | |||
| 86c0ddc51b | |||
| 583a997b86 | |||
| 2b1e4a7456 | |||
| d2194f652b | |||
| 955681505c | |||
| a33047abbd | |||
| 5bb4b44764 | |||
| 257694ab4a | |||
| d24f4f86b3 | |||
| 4f1ffc9e62 | |||
| b0f00299e6 | |||
| d9d80d3644 | |||
| 9f57e10288 | |||
| a2d16b6f39 | |||
| a434946ae7 | |||
| 3970bd0d28 | |||
| d2b8875f7a | |||
| f38d76db06 | |||
| bb84456c2c | |||
| 44d01e5e47 | |||
| 98bddd8a78 | |||
| 3cf95bb205 | |||
| c1b6e58d5c | |||
| c2cf5d2ffe | |||
| 6a9c4e71fc | |||
| de4782ebf5 | |||
| d0110cf18a | |||
| de7fbe5b7d | |||
| f4625f7968 | |||
| 935bd9ce0b | |||
| c290da01dc | |||
| db04866ca2 | |||
| f93234e442 | |||
| fca578d184 | |||
| d8eb2273c0 | |||
| 110e747e04 | |||
| 512ff51d13 | |||
| 80f49c2ed7 | |||
| d9b543c6e0 | |||
| c005393398 | |||
| 7f008aa3ff | |||
| c8b67cb84d | |||
| fee5495692 | |||
| ec49693c6f | |||
| f007807ea1 | |||
| 4ec4bdb0ea | |||
| 6c79710fcf | |||
| 4cc8cb5523 | |||
| 9480e640a7 | |||
| 4b03b660eb | |||
| cce9fe10dc | |||
| 6007a09782 | |||
| e445278f52 | |||
| d83b95ec8c | |||
| ad2ece839c | |||
| 7c9bd8acaf | |||
| 4a5521a9ba | |||
| a42dcee6ec | |||
| a4846847de | |||
| 3cde65e85e | |||
| b87ddf1195 | |||
| c2fe2b5505 | |||
| 7e3db53dcd | |||
| c9a4d15f05 | |||
| 9c6c00f8a3 | |||
| 0bcb1571da | |||
| eb568d90f0 | |||
| 726a419bc6 | |||
| 9c23b52c1e | |||
| ff64bb5432 | |||
| bf789608df | |||
| 85c7b9b85b | |||
| 4c670d10a2 | |||
| 2bf50a76ed | |||
| a519c9fe91 | |||
| 66216993e0 | |||
| 74fd9ba8e3 | |||
| a39902b287 | |||
| 68adf77012 | |||
| d566ffbb8f | |||
| 33b472a0ec | |||
| 1d38b69691 | |||
| 53e9074058 | |||
| e08d527d51 | |||
| 07a4c7eb25 | |||
| 0b399fba7a | |||
| 1aa8561497 | |||
| 719ec25cb7 | |||
| 4aa27c533e | |||
| 75f11da08f | |||
| 12e3f39ccd | |||
| d16fb714a3 | |||
| b5cc38c9dd | |||
| 6b73c8e488 | |||
| e801c614e1 | |||
| 0477282fed | |||
| 61308c4efa | |||
| 7dac0859f5 | |||
| a7f7db59c7 | |||
| e4a448b097 | |||
| e73752118d | |||
| a21def6e6e | |||
| b62a65e1a8 | |||
| 232ea7ba32 | |||
| 12cc44c351 | |||
| 4e88a2b294 | |||
| dca52fef8b | |||
| 5ffe200918 | |||
| 431a8f5eed | |||
| 7739ef2096 | |||
| bbe7b93cd7 | |||
| 396f7f8495 | |||
| 4f0400ca25 | |||
| e8292af0eb | |||
| 8228a9658c | |||
| a092675cc4 | |||
| 3bafc2d32d | |||
| b740dc7dd3 | |||
| ac7e0cf39e | |||
| 2138dacf4a | |||
| 4ecee76401 | |||
| 142ac16b64 | |||
| ff65aaece2 | |||
| 43b6e9694f | |||
| b5b9a8e072 | |||
| 424de06404 | |||
| 2d36a31f33 | |||
| 0374a1a320 | |||
| b4385ea7a6 | |||
| e9bc16b34d | |||
| 651018abe7 | |||
| dbc3429e05 | |||
| a0507b957f | |||
| 7e59afeaca | |||
| 06e90b6c76 | |||
| 5970e29355 | |||
| 77088b0404 | |||
| 9214e47f73 | |||
| 01f39bdae5 | |||
| cfc0ed6ab6 | |||
| 9c22a5f894 | |||
| de315e7897 | |||
| 853704c509 | |||
| 23c0d0a61f | |||
| bf139e7636 | |||
| 13201a5c76 | |||
| 261120dc4b | |||
| 09f43d4f84 | |||
| 0590b9123d | |||
| e271231e77 | |||
| 8b97f068c7 | |||
| a5344e3fe0 | |||
| 096fff8b3f | |||
| caa9d6e423 | |||
| 65bec3cdb1 | |||
| d060657bf4 | |||
| 342dd7c64d | |||
| 011860b476 | |||
| 31c459304e | |||
| 604d280c8c | |||
| d9c00ab646 | |||
| 756d3c74e8 | |||
| c368d8d968 | |||
| f33087d2ad | |||
| 25e5ddf17c | |||
| 9811636e3c | |||
| 16379e2233 | |||
| 6e5cbec7a0 | |||
| 5901738896 | |||
| b3829b0359 | |||
| 6ed8b84368 | |||
| 23981289d5 | |||
| 2d0142426a | |||
| b4b989be0b | |||
| e7e62f5c8e | |||
| 17663f5f20 | |||
| c1fead9dad | |||
| caba979752 | |||
| addd62bef9 | |||
| 06f85e842a | |||
| f625ae110f | |||
| 54c4e1ca96 | |||
| a0e9e49914 | |||
| 00a133a314 | |||
| cccd46b513 | |||
| 8e1db160ca | |||
| 9b516aa0d9 | |||
| ec5d03d754 | |||
| 987f67f288 | |||
| ea18bd7cdb | |||
| fd030fa52f | |||
| 01f168341f | |||
| ec8f269107 | |||
| 2b45617d6a | |||
| 37f24a88de | |||
| 88b1bf8964 | |||
| 5f639ec972 | |||
| d8cef9d6f5 | |||
| d4845f3e24 | |||
| 5b021256c9 | |||
| 806f345e51 | |||
| f47133f897 | |||
| 67b84f8cf0 | |||
| 32ed396ebf | |||
| 85c7fa6483 | |||
| d0c17d038d | |||
| cc91b26ed3 | |||
| 7decfe92c9 | |||
| ff0e0205ef | |||
| 6a493a3eea | |||
| 103ec6d43f | |||
| a47ff4a54e | |||
| f1f16f262b | |||
| db3800500c | |||
| 63653406a3 | |||
| e2b2f125b4 | |||
| 373bc5e709 | |||
| 9d80df7a6d | |||
| c79d0b9d52 | |||
| 282cd8564a | |||
| 6f184424d9 | |||
| 1aed1799a0 | |||
| 3a58e0c12f | |||
| 19b61be6a6 | |||
| 79055cf7a0 | |||
| 2e5d8c7384 | |||
| 1d6f85c8f4 | |||
| fb8ad70db6 | |||
| f67db2a2af | |||
| 13c3512ed0 | |||
| 71f19d8391 | |||
| 7173fa9e9e | |||
| e71d48853d | |||
| f5c8ddf6cd | |||
| 55d80ea091 | |||
| 66d4b0adc4 | |||
| 1673dc6e9b | |||
| 6105afed0d | |||
| ae9df9f001 | |||
| 05e42a4b95 | |||
| 9e5079bd83 | |||
| b408fc4d17 | |||
| 0c6825d2c5 | |||
| 6fbc63e9e6 | |||
| a2f14c57c5 | |||
| e03343d4a8 | |||
| 9df6831f64 | |||
| b82400cd66 | |||
| 858e67d33e | |||
| b66824c500 | |||
| 76713a74be | |||
| c92c2fa6b9 | |||
| c436598ba6 | |||
| 9dbf937d0f | |||
| daf081619e | |||
| 2b332d70f0 | |||
| 18f6d63790 | |||
| 85038e2f56 | |||
| f01018a063 | |||
| 64d76fef6a | |||
| 80082fdfcb | |||
| 2396490d1e | |||
| 0c47e96a3b | |||
| 0ffaf62c4c | |||
| 6f572119d8 | |||
| 505220f163 | |||
| 24967c7cbe | |||
| ee1c850f47 | |||
| fb0dcec005 | |||
| f5b2d17a4a | |||
| dca43009b3 | |||
| 08b5f5fe82 | |||
| 16e0d467f8 | |||
| 5e10182f94 | |||
| ae244569ef | |||
| 292a48073a | |||
| 274a6f040c | |||
| aaacd3dba4 | |||
| 45767c93d5 | |||
| 6094c21634 | |||
| 5052c6d350 | |||
| f38d61b4c9 | |||
| 8ba3bedd20 | |||
| d903f1f15b | |||
| 8628addfc9 | |||
| 27b5178646 | |||
| 6b2fa94f5a | |||
| 174ffc05f2 | |||
| 8ba1cc7c9d | |||
| 20e164fb39 | |||
| 568f63917a | |||
| e2a2f12c10 | |||
| c1bc688a5c | |||
| 360ba43579 | |||
| 1a41b639ef | |||
| 4ebd46c9f0 | |||
| 702cf52cfc | |||
| 689dda0515 | |||
| db0b1af99a | |||
| cdbb94ccbf | |||
| f86f09955b | |||
| 58c36bd719 | |||
| 46a216853f | |||
| 25be4d60b4 | |||
| 94941843e3 | |||
| 6adeed4e60 | |||
| a97d08a2d2 | |||
| 91aa1cfbc0 | |||
| e6e31c16b7 | |||
| 802c70e14c | |||
| d212a2f26d | |||
| fb77156c88 | |||
| bfd94b7ae1 | |||
| a6016db862 | |||
| 01d6a469a1 | |||
| 4a60bec60c | |||
| 8d4db767d4 | |||
| 916d9d963f | |||
| 39a7434569 | |||
| 7aeba983e1 | |||
| 89830470f1 | |||
| 8688596e80 | |||
| 0bd8966115 | |||
| 9bf13353a8 | |||
| 8305ef3b98 | |||
| 3b6446f33a | |||
| dda3512769 | |||
| 2d1d812474 | |||
| c70b152628 | |||
| 040c106c7b | |||
| f46627b624 | |||
| 0a1f7e725c | |||
| 7b07fd9656 | |||
| 48bfe6dc1e | |||
| f380f527d0 | |||
| 5c9292aae3 | |||
| ab3d3ce41b | |||
| c3796b2b19 | |||
| e5ae9e7110 | |||
| 5c91a2867d | |||
| 2f5c095f7a | |||
| 95b0d72e04 | |||
| 7fb52fa115 | |||
| 5c6c81dd2b | |||
| ab45ec8ee7 | |||
| b9fba54b9f | |||
| f187f47cdd | |||
| c4a694337c | |||
| 4103a228b2 | |||
| da49c0d635 | |||
| c626cc2a1d | |||
| 92ccfc0e0d | |||
| 61ee59f083 | |||
| 7783e99842 | |||
| 2397289568 | |||
| edefa7b674 | |||
| 5392a50e98 | |||
| fc5c7c8fda | |||
| 3c0d84469a | |||
| 01542c3dc7 | |||
| 0aaa37c30f | |||
| a1c938d3d9 | |||
| f23197e09e | |||
| a4fe08d53d | |||
| 7e3b48da9d | |||
| b843058c18 | |||
| 9b05c80f81 | |||
| 3805054b25 | |||
| 348f0faf22 | |||
| b907e44fdf | |||
| 032233cf9d | |||
| 443837e09d | |||
| 7f1904a97c | |||
| caaa544fd6 | |||
| 179b14ea4b | |||
| 9211fa4409 | |||
| edb8a65c78 | |||
| fdd2fa09d7 | |||
| 5d37b39ce5 | |||
| b673e1624a | |||
| 2b81d125cb | |||
| 31128e0dae | |||
| 680e4e075a | |||
| dd3349bf6d | |||
| f53d251a46 | |||
| 80b4f108df | |||
| df2e1e6217 | |||
| 292661d943 | |||
| c978057d3a | |||
| 8034b65f46 | |||
| c1c9f280d8 | |||
| e179ab72fc | |||
| 11e8f2832c | |||
| 61f86a3f29 | |||
| 0fed304f79 | |||
| 02989fd0f7 | |||
| 9900ae19dc | |||
| b9a4d178a8 | |||
| 8815c670ea | |||
| 1e45a69d36 | |||
| 0b7c3e3dbb | |||
| b9563829bb | |||
| 4b26753d83 | |||
| cdb7ff0cec | |||
| c421da905f | |||
| 5a08081cc0 | |||
| ad542d2f77 | |||
| 20e8a0dcc3 | |||
| 87c26eab14 | |||
| 877a53c2fc | |||
| 10e38adf20 | |||
| 2a64ee6993 | |||
| 9d9ef27317 | |||
| 785656d149 | |||
| f8ee696c7c | |||
| aa677b265a | |||
| 9b04e6f44c | |||
| 315aa82d15 | |||
| 0bc41bcb1d | |||
| e59c218c62 | |||
| 880758e470 | |||
| a5ce94c6d3 | |||
| 8a73e58134 | |||
| bfe7a760d1 | |||
| 0d932f4b24 | |||
| 6c1dbe1ee1 | |||
| a125390c5f | |||
| fdb5f3e8ef | |||
| d64feb040d | |||
| 987409b742 | |||
| e14efb3dfc | |||
| 7e3262a58d | |||
| f670aa5cc3 | |||
| da2ed2d695 | |||
| 23e5cd30a4 | |||
| 42a85d81a6 | |||
| 1d65af715f | |||
| 7ae2ddcb95 | |||
| 0abb0f4b57 | |||
| dfcff4b297 | |||
| fa2840aee3 | |||
| e48e1d0a38 | |||
| f9f4684c8d | |||
| 3954649632 | |||
| 74702c00e5 | |||
| 727872833f | |||
| e0518f0bda | |||
| ef5a8a9641 | |||
| 69bfc23b7f | |||
| 9bc1e04654 | |||
| c3872afc30 | |||
| a6e5f8aab7 | |||
| 67a4db07aa | |||
| f834c29530 | |||
| 60f38b3b6c | |||
| 3fddc8e846 | |||
| f0e1229a26 | |||
| 00871cc98f | |||
| 3992182905 | |||
| 2df41753e5 | |||
| 39c221775e | |||
| eda45e6072 | |||
| 333871387a | |||
| eb6b84eb18 | |||
| d8c651f255 | |||
| 7cf25a3bc0 | |||
| fdad0263ec | |||
| c5181cda46 | |||
| 56f6eccc82 | |||
| 6a74326a61 | |||
| 48d4956ee0 | |||
| 0ab46d5c70 | |||
| cd7d9aa2a4 | |||
| ea3d27c311 | |||
| 6c050118f4 | |||
| dfb942f6fe | |||
| 262efe3c9e | |||
| d1d099fbbf | |||
| 45da997dd3 | |||
| d91c949068 | |||
| 5a028aab52 | |||
| c49758f1c5 | |||
| 5ca52e89d5 | |||
| dd26111c04 | |||
| f40e7109e5 | |||
| 5cb3e1877a | |||
| a78a16b4a7 | |||
| a6307d48c0 | |||
| f9d95b9408 | |||
| fb3df46a25 | |||
| d2a7a95628 | |||
| 12e91b86e5 | |||
| 5e89c761ca | |||
| d12307991a | |||
| c711ce83fa | |||
| 96f91eda59 | |||
| e2a76b665a | |||
| c638e6c0f2 | |||
| 9ef1ecd827 | |||
| 60f0954a76 | |||
| 08339cd78e | |||
| a772154471 | |||
| e02cd89c8b | |||
| 706857132a | |||
| c0f6028212 | |||
| ecd9e4ab6c |
@@ -0,0 +1,3 @@
|
|||||||
|
extends:
|
||||||
|
- ./lint/eslintrc-gjs.yml
|
||||||
|
- ./lint/eslintrc-shell.yml
|
||||||
-19
@@ -1,19 +0,0 @@
|
|||||||
Makefile
|
|
||||||
Makefile.in
|
|
||||||
Makefile.in.in
|
|
||||||
configure
|
|
||||||
config.log
|
|
||||||
config.status
|
|
||||||
aclocal.m4
|
|
||||||
autom4te.cache/
|
|
||||||
po/gnome-shell-extensions.pot
|
|
||||||
po/POTFILES
|
|
||||||
po/stamp-it
|
|
||||||
staging/
|
|
||||||
zip-files/
|
|
||||||
|
|
||||||
*~
|
|
||||||
*.gmo
|
|
||||||
metadata.json
|
|
||||||
*.gschema.xml
|
|
||||||
*.gschema.valid
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
--- Creating a New Extension ---
|
|
||||||
|
|
||||||
To create a new extension, add a subdirectory in extensions.
|
|
||||||
Then create a Makefile.am like the one in example, replacing
|
|
||||||
the EXTENSION_ID with the basename of your extension, which
|
|
||||||
must match the UUID in metadata.json.
|
|
||||||
If you need additional files, add them to EXTENSION_EXTRA.
|
|
||||||
|
|
||||||
Then modify extensions/Makefile.am and configure.ac. It should
|
|
||||||
be pretty self-explanatory.
|
|
||||||
|
|
||||||
Don't forget to add any translatable file to po/POTFILES.in, and
|
|
||||||
then you're done.
|
|
||||||
The Gettext domain you should choose is gnome-shell-extensions,
|
|
||||||
not gnome-shell, unless you're sure there is the string you
|
|
||||||
need in gnome-shell.
|
|
||||||
|
|
||||||
--- Coding Style ---
|
|
||||||
|
|
||||||
Generally, we follow GJS coding style (you can find it at
|
|
||||||
http://git.gnome.org/browse/gjs/tree/doc/Style_Guide.txt), which
|
|
||||||
in short is: indent 4 spaces, no tabs, space after comma, no space
|
|
||||||
after function call.
|
|
||||||
|
|
||||||
The Emacs mode line for this
|
|
||||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
||||||
|
|
||||||
Imports should be at the top, in two groups, one for standard
|
|
||||||
imports (like imports.lang or imports.dbus) and introspection,
|
|
||||||
the other for Shell API. Within the same group, put everything
|
|
||||||
in alphabetic order.
|
|
||||||
+31
@@ -0,0 +1,31 @@
|
|||||||
|
## Creating a New Extension
|
||||||
|
|
||||||
|
To create a new extension, add a subdirectory in extensions. Then create
|
||||||
|
a meson.build from the provided [template](extensions/meson.build.template).
|
||||||
|
If you need additional sources, add them to extension_sources. Similarily add
|
||||||
|
GSettings schemas to extension_schemas and other files to extension_data.
|
||||||
|
|
||||||
|
Then modify the [toplevel Meson file](meson.build) to add the new
|
||||||
|
extension name in the appropriate set (that is one of classic_extensions,
|
||||||
|
default_extensions or all_extensions).
|
||||||
|
|
||||||
|
Don't forget to add any translatable file to po/POTFILES.in, and
|
||||||
|
then you're done.
|
||||||
|
The Gettext domain you should choose is gnome-shell-extensions,
|
||||||
|
not gnome-shell, unless you're sure there is the string you
|
||||||
|
need in gnome-shell.
|
||||||
|
|
||||||
|
## Coding Style
|
||||||
|
|
||||||
|
Generally, we follow [GJS coding style][coding-style], which in short is:
|
||||||
|
indent 4 spaces, no tabs, space after comma, no space after function call.
|
||||||
|
|
||||||
|
The Emacs mode line for this
|
||||||
|
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||||
|
|
||||||
|
Imports should be at the top, in two groups, one for standard
|
||||||
|
imports (like imports.lang or imports.dbus) and introspection,
|
||||||
|
the other for Shell API. Within the same group, put everything
|
||||||
|
in alphabetic order.
|
||||||
|
|
||||||
|
[coding-style]: https://gitlab.gnome.org/GNOME/gjs/blob/master/doc/Style_Guide.md
|
||||||
-45
@@ -1,45 +0,0 @@
|
|||||||
ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS}
|
|
||||||
|
|
||||||
SUBDIRS = extensions po
|
|
||||||
|
|
||||||
EXTRA_DIST = lib/convenience.js
|
|
||||||
|
|
||||||
DISTCHECK_CONFIGURE_FLAGS = --enable-extensions=all
|
|
||||||
|
|
||||||
include include.mk
|
|
||||||
|
|
||||||
zip-file: all
|
|
||||||
-rm -fR $(builddir)/_build
|
|
||||||
-rm -fR $(builddir)/zip-files
|
|
||||||
$(MKDIR_P) $(builddir)/_build; \
|
|
||||||
$(MKDIR_P) $(builddir)/zip-files; \
|
|
||||||
$(MAKE) install DESTDIR="$(abs_builddir)/_build"; \
|
|
||||||
for i in $(ENABLED_EXTENSIONS); do \
|
|
||||||
mv "$(builddir)/_build$(topextensiondir)/$${i}$(extensionbase)" "$(builddir)/_build/"; \
|
|
||||||
cp -r "$(builddir)/_build$(datadir)/locale" "$(builddir)/_build/$${i}$(extensionbase)"; \
|
|
||||||
cp "$(srcdir)/COPYING" -t "$(builddir)/_build/$${i}$(extensionbase)"; \
|
|
||||||
if [ -f "$(builddir)/_build$(datadir)/glib-2.0/schemas/$(gschemabase).$${i}.gschema.xml" ]; then \
|
|
||||||
$(MKDIR_P) "$(builddir)/_build/$${i}$(extensionbase)/schemas"; \
|
|
||||||
mv "$(builddir)/_build$(datadir)/glib-2.0/schemas/$(gschemabase).$${i}.gschema.xml" "$(builddir)/_build/$${i}$(extensionbase)/schemas"; \
|
|
||||||
glib-compile-schemas "$(builddir)/_build/$${i}$(extensionbase)/schemas"; \
|
|
||||||
fi; \
|
|
||||||
(cd "$(builddir)/_build/$${i}$(extensionbase)"; \
|
|
||||||
zip -qr "$(abs_builddir)/zip-files/$${i}$(extensionbase).shell-extension.zip" .; \
|
|
||||||
); \
|
|
||||||
done
|
|
||||||
-rm -fR $(builddir)/_build
|
|
||||||
|
|
||||||
localprefix = $(HOME)/.local/share/gnome-shell/extensions
|
|
||||||
|
|
||||||
local-install: zip-file
|
|
||||||
for i in $(ENABLED_EXTENSIONS); do \
|
|
||||||
uuid="$${i}$(extensionbase)"; \
|
|
||||||
zip_file="$(abs_builddir)/zip-files/$${uuid}.shell-extension.zip"; \
|
|
||||||
if [ -d "$(localprefix)/$${uuid}" ]; then \
|
|
||||||
rm -fR "$(localprefix)/$${uuid}"; \
|
|
||||||
fi; \
|
|
||||||
$(MKDIR_P) $(localprefix)/$${uuid}; \
|
|
||||||
(cd $(localprefix)/$${uuid}; \
|
|
||||||
unzip -q $${zip_file}; \
|
|
||||||
); \
|
|
||||||
done
|
|
||||||
@@ -1,3 +1,871 @@
|
|||||||
|
3.36.2
|
||||||
|
======
|
||||||
|
* Misc. bug fixes and cleanups [Florian, Xiaoguang; !113, !106]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Florian Müllner, Xiaoguang Wang
|
||||||
|
|
||||||
|
Translators:
|
||||||
|
Yosef Or Boczko [he], Kristjan SCHMIDT [eo]
|
||||||
|
3.36.1
|
||||||
|
======
|
||||||
|
|
||||||
|
Translators:
|
||||||
|
Daniel Korostil [uk]
|
||||||
|
|
||||||
|
3.36.0
|
||||||
|
======
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Florian Müllner
|
||||||
|
|
||||||
|
3.35.91
|
||||||
|
=======
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Florian Müllner
|
||||||
|
|
||||||
|
Translators:
|
||||||
|
Zander Brown [en_GB]
|
||||||
|
|
||||||
|
3.35.90
|
||||||
|
=======
|
||||||
|
* Adjust to gnome-shell changes [Florian; !100, !101, !102]
|
||||||
|
* Force single-line window titles in window list [Florian; #202]
|
||||||
|
* Misc. bug fixes and cleanup [Florian; !104, !105]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Florian Müllner
|
||||||
|
|
||||||
|
Translators:
|
||||||
|
sicklylife [ja], Umarzuki Bin Mochlis Moktar [ms]
|
||||||
|
|
||||||
|
3.35.3
|
||||||
|
======
|
||||||
|
|
||||||
|
Translators:
|
||||||
|
Fran Dieguez [gl]
|
||||||
|
|
||||||
|
3.35.2
|
||||||
|
======
|
||||||
|
* Adjust to gnome-shell changes [Marco, Florian; !89, !95, !96]
|
||||||
|
* window-list, workspace-indicator: Exclude DESKTOP windows from previews
|
||||||
|
[Florian; !93]
|
||||||
|
* screenshot-window-sizer: Fix cycling through all valid sizes [Willy; !97]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Marco Trevisan (Treviño), Florian Müllner, Willy Stadnick
|
||||||
|
|
||||||
|
3.34.1
|
||||||
|
======
|
||||||
|
* Adjust to gnome-settings-daemon plugin removals [Xiaoguang; !94]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Florian Müllner, Xiaoguang Wang
|
||||||
|
|
||||||
|
Translators:
|
||||||
|
Nathan Follens [nl], Dušan Kazik [sk], Ask Hjorth Larsen [da],
|
||||||
|
Yi-Jyun Pan [zh_TW]
|
||||||
|
|
||||||
|
3.34.0
|
||||||
|
======
|
||||||
|
|
||||||
|
Translators:
|
||||||
|
Rafael Fontenelle [pt_BR], Efstathios Iosifidis [el], Milo Casagrande [it],
|
||||||
|
Sabri Ünal [tr]
|
||||||
|
|
||||||
|
3.33.92
|
||||||
|
=======
|
||||||
|
|
||||||
|
Translators:
|
||||||
|
Марко Костић [sr], Tim Sabsch [de], Rūdolfs Mazurs [lv], Matej Urbančič [sl],
|
||||||
|
Balázs Úr [hu], Claude Paroz [fr], Fran Dieguez [gl], Changwoo Ryu [ko],
|
||||||
|
Ryuta Fujii [ja], Fabio Tomat [fur], Goran Vidović [hr]
|
||||||
|
|
||||||
|
3.33.91
|
||||||
|
=======
|
||||||
|
* Misc. bug fixes and cleanups [Florian; !88, !90, !91, !92]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Florian Müllner
|
||||||
|
|
||||||
|
Translators:
|
||||||
|
Asier Sarasua Garmendia [eu], Anders Jonsson [sv], Marek Černocký [cs],
|
||||||
|
Kukuh Syafaat [id], Jiri Grönroos [fi], Florentina Mușat [ro],
|
||||||
|
Aurimas Černius [lt], Daniel Mustieles [es], Piotr Drąg [pl], Jordi Mas [ca],
|
||||||
|
Danial Behzadi [fa]
|
||||||
|
3.33.90
|
||||||
|
=======
|
||||||
|
* window-list: Support showing windows from all workspaces [Florian; #154]
|
||||||
|
* Misc. bug fixes and cleanups [Florian; !86, !87]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Florian Müllner
|
||||||
|
|
||||||
|
Translators:
|
||||||
|
Jor Teron [mjw]
|
||||||
|
|
||||||
|
3.33.4
|
||||||
|
======
|
||||||
|
* Make GNOME Classic more classic:
|
||||||
|
- Disable GNOME 3 overview [Florian; !69]
|
||||||
|
- Add window picker button to window list [Florian; !73, !80]
|
||||||
|
- Style improvements and fixes [Jakub; #169, !82]
|
||||||
|
- Support horizontal workspace layout in window list [Florian; !70]
|
||||||
|
- Add draggable previews to window list workspace switcher [Florian; !74]
|
||||||
|
- Arrange workspaces horizontally [Florian; !72]
|
||||||
|
* workspace-indicator: Support horizontal workspace layout [Florian; !71]
|
||||||
|
* workspace-indicator: Add draggable previews [Florian; !77]
|
||||||
|
* Misc. bug fixes and cleanups [Florian; !75, !76, !79, !78, #168, !84]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Florian Müllner, Jakub Steiner, Jor Teron
|
||||||
|
|
||||||
|
Translators:
|
||||||
|
Jor Teron [mjw]
|
||||||
|
|
||||||
|
3.33.3
|
||||||
|
======
|
||||||
|
* Misc. bug fixes [Florian, Marco; !67, !68]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Florian Müllner, Marco Trevisan (Treviño)
|
||||||
|
|
||||||
|
3.33.2
|
||||||
|
======
|
||||||
|
* Misc. bug fixes and cleanups [Florian; !66]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Florian Müllner
|
||||||
|
|
||||||
|
3.33.1
|
||||||
|
======
|
||||||
|
* Misc. bug fixes [Florian; !64]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Florian Müllner
|
||||||
|
|
||||||
|
3.32.1
|
||||||
|
======
|
||||||
|
* Fix windowsNavigator extension after ES6 port [Florian; #143]
|
||||||
|
* screenshot-window-sizer: Add phone screenshot sizes [Adrien; !65]
|
||||||
|
* Misc. bug fixes and cleanups [Fabian; !62]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Florian Müllner, Adrien Plazas, Fabian P. Schmidt
|
||||||
|
|
||||||
|
3.32.0
|
||||||
|
======
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Florian Müllner
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Victor Ibragimov [tg], Kristjan SCHMIDT [eo], Mart Raudsepp [et]
|
||||||
|
|
||||||
|
3.31.92
|
||||||
|
=======
|
||||||
|
* Misc. bug fixes and cleanups [Florian; !57, !58, !59, !60]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Florian Müllner
|
||||||
|
|
||||||
|
3.31.91
|
||||||
|
=======
|
||||||
|
* apps-menu: Remove outdated legacy-tray handling [Florian; !53]
|
||||||
|
* user-theme: Allow using XDG user data dir [Tomasz; !55]
|
||||||
|
* Misc. bug fixes and cleanups [Florian; !52, !54, !56]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Tomasz Gąsior, Florian Müllner
|
||||||
|
|
||||||
|
Translators:
|
||||||
|
Matej Urbančič [sl], Gun Chleoc [gd]
|
||||||
|
|
||||||
|
3.31.90
|
||||||
|
=======
|
||||||
|
* Misc. bug fixes and cleanups [Florian; !49, !50, !51]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Florian Müllner
|
||||||
|
|
||||||
|
Translators:
|
||||||
|
Ryuta Fujii [ja], Charles Monzat [fr], Pieter Schalk Schoeman [af]
|
||||||
|
|
||||||
|
3.31.2
|
||||||
|
======
|
||||||
|
* Remove obsolete alternate-tab extension [Florian; #786496]
|
||||||
|
* Adjust to gnome-shell changes [Florian; #113]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Florian Müllner
|
||||||
|
|
||||||
|
3.30.1
|
||||||
|
======
|
||||||
|
* apps-menu: Fix height on HiDPI systems [Florian; #102]
|
||||||
|
* window-list: Only switch between windows on active workspace when scrolling
|
||||||
|
[Florian; #78]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Florian Müllner
|
||||||
|
|
||||||
|
3.30.0
|
||||||
|
======
|
||||||
|
* Bump version
|
||||||
|
|
||||||
|
3.29.91
|
||||||
|
=======
|
||||||
|
* Misc. bug fixes [Florian; #90]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Florian Müllner
|
||||||
|
|
||||||
|
3.29.90
|
||||||
|
=======
|
||||||
|
* Misc. bug fixes [Florian; #786496]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Florian Müllner
|
||||||
|
|
||||||
|
3.29.3
|
||||||
|
======
|
||||||
|
* Adjust to global.screen removal [Jonas; #759538]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Jonas Ådahl, Florian Müllner
|
||||||
|
|
||||||
|
3.29.2
|
||||||
|
======
|
||||||
|
* Misc. bug fixes [Florian; #69]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Florian Müllner
|
||||||
|
|
||||||
|
3.28.1
|
||||||
|
======
|
||||||
|
* Misc. bug fixes [Xiaoguang, Florian; #59, #62]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Florian Müllner, Xiaoguang Wang
|
||||||
|
|
||||||
|
Translators:
|
||||||
|
Dz Chen [zh_CN]
|
||||||
|
|
||||||
|
3.28.0
|
||||||
|
======
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Florian Müllner, Xiaoguang Wang
|
||||||
|
|
||||||
|
Translators:
|
||||||
|
Aman Alam [pa], Bruce Cowan [en_GB]
|
||||||
|
|
||||||
|
3.27.92
|
||||||
|
=======
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Florian Müllner
|
||||||
|
|
||||||
|
Translators:
|
||||||
|
Piotr Drąg [es], GNOME Translation Robot [gd], Daniel Șerbănescu [ro]
|
||||||
|
|
||||||
|
3.27.91
|
||||||
|
=======
|
||||||
|
* places-menu: Support unmounting ejectable places [Rémy; #17]
|
||||||
|
* apps-menu: Support separators and custom sort order [Florian; #27]
|
||||||
|
* Port to meson [Florian; #31, #45]
|
||||||
|
* window-list: Fix missing icons on wayland [Florian; #10]
|
||||||
|
* places-menu: Fix terminating gnome-shell with recent gjs [Florian; #44]
|
||||||
|
* auto-move: Make it work with wayland windows [Florian; #33]
|
||||||
|
* Classic theme fixes [Florian, Jonas; #26, #41, #39, #40]
|
||||||
|
* Require sassc for classic styling [Florian; !28]
|
||||||
|
* Misc. bug fixes [Piotr, Florian; #772211, #32, #30]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Jeremy Bicha, Piotr Drąg, Jonas Kümmerlin, Rémy Lefevre, Iñigo Martínez,
|
||||||
|
Florian Müllner
|
||||||
|
|
||||||
|
Translators:
|
||||||
|
Matej Urbančič [sl], Kjartan Maraas [nb]
|
||||||
|
|
||||||
|
3.27.1
|
||||||
|
======
|
||||||
|
* updated translations (ca@valencia)
|
||||||
|
|
||||||
|
3.26.1
|
||||||
|
======
|
||||||
|
* native-window-placement: Adjust to gnome-shell changes
|
||||||
|
* updated translations: el, fa, ru, sv
|
||||||
|
|
||||||
|
3.26.0
|
||||||
|
======
|
||||||
|
* updated translations (be, bg, ca, da, eu, fi, is, it, ko, lv, ml,
|
||||||
|
nl, pt_BR, vi, zh_TW)
|
||||||
|
|
||||||
|
3.25.91
|
||||||
|
=======
|
||||||
|
* updated translations (ca, fr, it, pl, pt_BR, sr, sr@latin, tr)
|
||||||
|
|
||||||
|
3.25.90
|
||||||
|
=======
|
||||||
|
* updated translations (es, gl, hr, hu, kk, sl, sv, sv)
|
||||||
|
|
||||||
|
3.25.4
|
||||||
|
======
|
||||||
|
* screenshot-window-sizer: Fix backward cycling
|
||||||
|
* updated translations (ar, be, ca, cs, de, fur, id, lt, pl, sk)
|
||||||
|
|
||||||
|
3.25.3
|
||||||
|
======
|
||||||
|
* places-menu: Use mount operation if necessary
|
||||||
|
* window-list: Respect MWM hints
|
||||||
|
* updated translations (es, fur, kk)
|
||||||
|
|
||||||
|
3.25.2
|
||||||
|
======
|
||||||
|
* places-menu: Make URI launching asynchronous
|
||||||
|
* updated translations (de, fur, hr, hu, id, sl)
|
||||||
|
|
||||||
|
3.25.1
|
||||||
|
======
|
||||||
|
* apps-menu: Mark copied launchers as trusted
|
||||||
|
* places-menu: Make icon lookup asynchronous
|
||||||
|
* updated translations (hr)
|
||||||
|
|
||||||
|
3.24.1
|
||||||
|
======
|
||||||
|
* apps-menu: Allow creating desktop launchers via DND
|
||||||
|
* updated translations (el, vi)
|
||||||
|
|
||||||
|
3.24.0
|
||||||
|
======
|
||||||
|
* updated translations (lv, tr)
|
||||||
|
|
||||||
|
3.23.92
|
||||||
|
=======
|
||||||
|
* update classic theme
|
||||||
|
* updated translations (be, ko, ca, da, cs, ru, lt)
|
||||||
|
|
||||||
|
3.23.91
|
||||||
|
=======
|
||||||
|
* updated translations (de, es, eu, fi, fr, fur, gl, hu, id, it, kk, nb, pl, pt_BR,
|
||||||
|
sk, sr, sr@latin, sv, uk, zh_TW)
|
||||||
|
|
||||||
|
3.23.90
|
||||||
|
=======
|
||||||
|
* window-list: Improve styling
|
||||||
|
* window-list: Hide workspace indicator when there's a single (static) workspace
|
||||||
|
* new translation (be)
|
||||||
|
|
||||||
|
3.23.2
|
||||||
|
======
|
||||||
|
* alternateTab: Don't take over 'switch-group' shortcut
|
||||||
|
* updated translations (zh_CN)
|
||||||
|
|
||||||
|
3.22.1
|
||||||
|
======
|
||||||
|
* window-list: Update icon on app changes
|
||||||
|
|
||||||
|
3.22.0
|
||||||
|
======
|
||||||
|
* updated translations (en_GB)
|
||||||
|
|
||||||
|
3.21.92
|
||||||
|
=======
|
||||||
|
* update style
|
||||||
|
* updated translations (pl, vi)
|
||||||
|
|
||||||
|
3.21.91
|
||||||
|
=======
|
||||||
|
* updated translations (pl)
|
||||||
|
|
||||||
|
3.21.90
|
||||||
|
=======
|
||||||
|
* updated translations (es, gu)
|
||||||
|
|
||||||
|
3.21.4
|
||||||
|
======
|
||||||
|
* apps-menu: Fix entries from non-standard AppDir directories
|
||||||
|
|
||||||
|
3.21.3
|
||||||
|
======
|
||||||
|
* adjust to gnome-shell changes
|
||||||
|
* updated translations (oc)
|
||||||
|
|
||||||
|
3.21.2
|
||||||
|
======
|
||||||
|
* version bump, nothing to see here
|
||||||
|
|
||||||
|
3.20.1
|
||||||
|
======
|
||||||
|
* update classic style
|
||||||
|
* updated translations (gd, oc)
|
||||||
|
|
||||||
|
3.20.0
|
||||||
|
======
|
||||||
|
* version bump, nothing to see here
|
||||||
|
|
||||||
|
3.19.92
|
||||||
|
=======
|
||||||
|
* version bump, nothing to see here
|
||||||
|
|
||||||
|
3.19.91
|
||||||
|
=======
|
||||||
|
* updated translations (oc)
|
||||||
|
|
||||||
|
3.19.90
|
||||||
|
=======
|
||||||
|
* version bump, nothing to see here
|
||||||
|
|
||||||
|
3.19.4
|
||||||
|
======
|
||||||
|
* screenshot-window-sizer: HiDPI support
|
||||||
|
* Fix gnome-shell component in classic session
|
||||||
|
* updated translations (lt)
|
||||||
|
|
||||||
|
3.19.3
|
||||||
|
======
|
||||||
|
* native-window-placement: Don't let border overlap title
|
||||||
|
* apps-menu: Fix handling of .desktop files in subdirectories
|
||||||
|
* updated translations (is)
|
||||||
|
|
||||||
|
3.19.2
|
||||||
|
======
|
||||||
|
* updated translations (gd)
|
||||||
|
|
||||||
|
3.19.1
|
||||||
|
======
|
||||||
|
* Fix some theme issues
|
||||||
|
|
||||||
|
3.18.1
|
||||||
|
======
|
||||||
|
* window-list: Fix accessibility of window buttons
|
||||||
|
* apps-menu: Fix unreliable highlight
|
||||||
|
* updated translations (ar)
|
||||||
|
|
||||||
|
3.18.0
|
||||||
|
======
|
||||||
|
* Bump version
|
||||||
|
|
||||||
|
3.17.92
|
||||||
|
=======
|
||||||
|
* places: Include DESKTOP when desktop icons are enabled
|
||||||
|
* updated translations (fa)
|
||||||
|
|
||||||
|
3.17.91
|
||||||
|
=======
|
||||||
|
* updated translations (nl, pl, zh_TW)
|
||||||
|
|
||||||
|
3.17.90
|
||||||
|
=======
|
||||||
|
* window-list: Improve application ordering
|
||||||
|
* workspace-indicator: Use consistent workspace numbering
|
||||||
|
|
||||||
|
3.17.4
|
||||||
|
======
|
||||||
|
* updated translations (fur)
|
||||||
|
|
||||||
|
3.17.3
|
||||||
|
======
|
||||||
|
* window-list: Adjust with text-scaling-factor
|
||||||
|
* classic style updates
|
||||||
|
* updated translations (pt, ro)
|
||||||
|
|
||||||
|
3.17.2
|
||||||
|
======
|
||||||
|
* updated translations (oc, pt, zh_CN)
|
||||||
|
|
||||||
|
3.17.1
|
||||||
|
======
|
||||||
|
* style updates
|
||||||
|
* updated translations (oc)
|
||||||
|
|
||||||
|
3.16.1
|
||||||
|
======
|
||||||
|
* window-list: Fix workspace indicators popup menu position
|
||||||
|
* apps-menu: Fix taking over panel-main-menu shortcut
|
||||||
|
* updated translations (et, ja, lv)
|
||||||
|
|
||||||
|
3.16.0
|
||||||
|
======
|
||||||
|
* updated translations (ca)
|
||||||
|
|
||||||
|
3.15.92
|
||||||
|
=======
|
||||||
|
* classic: Update theme
|
||||||
|
* update for mutter API changes
|
||||||
|
* updated translations (bg, bs, da, fi, pa, ru, sr, sr@latin, tg)
|
||||||
|
|
||||||
|
3.15.91
|
||||||
|
=======
|
||||||
|
* classic: Update theme
|
||||||
|
* systemMonitor extension was removed, as the message tray where it
|
||||||
|
put its indicator no longer exists
|
||||||
|
* window-list: Adjust for gnome-shell changes
|
||||||
|
* updated translations (gl, it, kk, ko, lt, pl, sk, uk, zh_TW)
|
||||||
|
|
||||||
|
3.15.90
|
||||||
|
=======
|
||||||
|
* classic: Visual refresh based on new shell theme
|
||||||
|
* window-list: Adjust for gnome-shell changes
|
||||||
|
* updated translations (an, el, eo, eu, fr, he, is, sv, tr)
|
||||||
|
|
||||||
|
3.15.4
|
||||||
|
======
|
||||||
|
* window-list: Improve interaction with system modal dialogs
|
||||||
|
* updated translations (cs, de, es, eu, fur, hu, id, nb, pt_BR, ru, sl, vi)
|
||||||
|
|
||||||
|
3.15.3.1
|
||||||
|
========
|
||||||
|
* adjust to gnome-shell change
|
||||||
|
|
||||||
|
3.15.3
|
||||||
|
======
|
||||||
|
* classic-mode: Add high-contrast theme variant, drop .desktop file
|
||||||
|
* places-menu: Fix error when XDG user directories are not set up
|
||||||
|
* window-list: Add option to show on all monitors
|
||||||
|
* updated translations (eu, hu, kk, ro, tr)
|
||||||
|
|
||||||
|
3.15.2
|
||||||
|
======
|
||||||
|
* removable-drive, user-theme, window-list: Update for gnome-shell changes
|
||||||
|
* apps-menu: Fix some visual glitches
|
||||||
|
* Fix classic mode style
|
||||||
|
* updated translations (an, cs, he, vi)
|
||||||
|
|
||||||
|
3.15.1
|
||||||
|
======
|
||||||
|
* updated translations (es, nb)
|
||||||
|
|
||||||
|
3.14.1
|
||||||
|
======
|
||||||
|
* alternateTab: Fix dismissing popup with Escape
|
||||||
|
* some improvements to the window-list
|
||||||
|
(spacing in app buttons, no flash when closing windows with auto-grouping)
|
||||||
|
* updated translations (lv, it, pt, bg)
|
||||||
|
|
||||||
|
3.14.0
|
||||||
|
======
|
||||||
|
* updated translations (bn_IN, hi, kn, sr, sr@latin, uk)
|
||||||
|
|
||||||
|
3.13.92
|
||||||
|
=======
|
||||||
|
* new extension: screenshot-window-sizer
|
||||||
|
* window-list: Don't add sticky windows more than once
|
||||||
|
* updated translations (da, de, fi, ko, mr, ms, ne, pa, pl, sk, sv, ta, te, tr)
|
||||||
|
|
||||||
|
3.13.91
|
||||||
|
=======
|
||||||
|
* window-list: restore fitts'ability of workspace button
|
||||||
|
* updated for gnome-shell changes
|
||||||
|
* updated translations (cs, kk, fr, or, fa, ja, gu, id)
|
||||||
|
|
||||||
|
3.13.90
|
||||||
|
=======
|
||||||
|
* updated translations (as, ca, eu, nl, zh_CN, zh_HK, zh_TW)
|
||||||
|
|
||||||
|
3.13.4
|
||||||
|
======
|
||||||
|
* Updated for gnome-shell changes
|
||||||
|
* updated translations (el, gl, ru)
|
||||||
|
|
||||||
|
3.13.3
|
||||||
|
======
|
||||||
|
* Tweak preference UIs some more
|
||||||
|
* Fix classic mode schema overrides
|
||||||
|
* updated translations (es, he, hu, lt, nb, pt_BR, sl, tr)
|
||||||
|
|
||||||
|
3.13.2
|
||||||
|
======
|
||||||
|
* Fix sorting of grouped buttons in window list
|
||||||
|
* Tweak preference UIs
|
||||||
|
* updated translations (en_GB)
|
||||||
|
|
||||||
|
3.13.1
|
||||||
|
======
|
||||||
|
* add DesktopNames key to the classic session file
|
||||||
|
* classic theme: remove rounded corners from tile previews
|
||||||
|
* window-list: don't shift message tray on other monitors
|
||||||
|
* auto-move-windows: several fixes and updates for api changes
|
||||||
|
* launch-new-instances: updates for api changes
|
||||||
|
* updated translations (ja, km)
|
||||||
|
|
||||||
|
3.12.0
|
||||||
|
======
|
||||||
|
* updated translations (zh_HK, zh_TW)
|
||||||
|
|
||||||
|
3.11.92
|
||||||
|
=======
|
||||||
|
* nothing to see here, move on
|
||||||
|
|
||||||
|
3.11.91
|
||||||
|
=======
|
||||||
|
* updated translations (ko, fur)
|
||||||
|
|
||||||
|
3.11.90
|
||||||
|
=======
|
||||||
|
* several fixes and improvements to the window-list
|
||||||
|
(can be scrolled, works correctly with the OSD
|
||||||
|
keyboard, filters skip-taskbar windows, does not
|
||||||
|
force all notifications to bold)
|
||||||
|
* drive-menu fixed not to show shadowed mounts
|
||||||
|
* updates for gnome-shell changes (launch-new-instance,
|
||||||
|
auto-move-windows, places-menu)
|
||||||
|
* build system fixes for systems without /bin/bash
|
||||||
|
* updated translations (or, tr, uk)
|
||||||
|
|
||||||
|
3.11.5
|
||||||
|
======
|
||||||
|
* updates for gnome-shell changes
|
||||||
|
* updated translations (kn)
|
||||||
|
|
||||||
|
3.11.4
|
||||||
|
======
|
||||||
|
* classic mode now supports session saving
|
||||||
|
* updates for gnome-shell changes
|
||||||
|
* updated translations (ar, kn)
|
||||||
|
|
||||||
|
3.11.3
|
||||||
|
======
|
||||||
|
* workspace-indicator is vertically aligned now
|
||||||
|
* updated translations (ar, eo, ta, te)
|
||||||
|
|
||||||
|
3.11.2
|
||||||
|
======
|
||||||
|
* updated translations (zh_CN)
|
||||||
|
|
||||||
|
3.11.1
|
||||||
|
======
|
||||||
|
* ignore shadowed mounts in drive-menu extension
|
||||||
|
* updates for gnome-shell/gjs changes
|
||||||
|
* updated translations (el, th)
|
||||||
|
|
||||||
|
3.10.1
|
||||||
|
======
|
||||||
|
* updated translations (af, ca, ca@valencia, de, et, eu, fa,
|
||||||
|
hu, lt, lv, nb, nl, pa, pt, sk, sr, sr@latin, tr)
|
||||||
|
|
||||||
|
3.10.0
|
||||||
|
======
|
||||||
|
* updated translations (as, cs, da, es, et, fi, fr, gl,
|
||||||
|
he, id, it, kk, lt, lv, pa, pl, pt, pt_BR, ru, sl, tg,
|
||||||
|
uk, zh_HK, zh_TW)
|
||||||
|
|
||||||
|
3.9.92
|
||||||
|
======
|
||||||
|
* more updates and fixes for gnome-shell master changes
|
||||||
|
and regressions (systemMonitor, window-list, apps-menu)
|
||||||
|
* lots of updated translations (ar, as, cs, da, de, el, es,
|
||||||
|
eu, fi, gl, he, hu, it, ja, kk, ko, lv, nb, nl, pa, pl,
|
||||||
|
pt_BR, ru, sk, sr, sr@latin, ta, tg)
|
||||||
|
|
||||||
|
3.9.91
|
||||||
|
======
|
||||||
|
* update the classic mode session and theme to work with the
|
||||||
|
new system menu
|
||||||
|
* the usual round of updates and fixes for gnome-shell
|
||||||
|
API changes
|
||||||
|
* updated translations (de, it, lt, nl, pl, pt_BR, sk,
|
||||||
|
zh_HK, zh_TW)
|
||||||
|
|
||||||
|
3.9.90
|
||||||
|
======
|
||||||
|
* xrandr-indicator was removed, as the implementation
|
||||||
|
was incompatible with the new DisplayConfig mutter API
|
||||||
|
* various extensions were updated for the 3.9.90 gnome-shell API
|
||||||
|
* updated translations (cs, es, fur, gl, he, hu, id, ja, sl, tg,
|
||||||
|
zh_CN, zh_HK, zh_TW)
|
||||||
|
|
||||||
|
3.9.5
|
||||||
|
=====
|
||||||
|
* alternative-status-menu was removed entirely, as
|
||||||
|
it does not fit in the designs of the new unified
|
||||||
|
status menu
|
||||||
|
* updated translations (as, gu, it, ru)
|
||||||
|
|
||||||
|
3.9.4
|
||||||
|
=====
|
||||||
|
* apps-menu: fixed handling of hot corner in case
|
||||||
|
of screen reconfiguration
|
||||||
|
* alternative-status-menu now correctly honors polkit
|
||||||
|
for hibernation
|
||||||
|
* user-menu now loads themes from $XDG_DATA_HOME too
|
||||||
|
* translation updates (de, id, pt_BR, vi, zh_CN, ml)
|
||||||
|
|
||||||
|
3.9.3
|
||||||
|
=====
|
||||||
|
* classic mode mini extensions were replaced with a
|
||||||
|
GSettings override specified in the .json file
|
||||||
|
* styling of classic mode improved
|
||||||
|
* native-window-placement is back working on 3.9
|
||||||
|
* misc bug fixes
|
||||||
|
* traslation updates (an, cs, el, es, gl, nb, pl, sk, tg)
|
||||||
|
|
||||||
|
3.9.2
|
||||||
|
=====
|
||||||
|
* apps-menu: appearance of the scrollbars was improved
|
||||||
|
* window-list is a little taller in classic mode (to account
|
||||||
|
for the workspace switcher)
|
||||||
|
* alternative-status-menu honors again the dconf configuration
|
||||||
|
* translation updates (sr)
|
||||||
|
|
||||||
|
3.9.1
|
||||||
|
=====
|
||||||
|
* updates to window-list, xrandr-indicator,
|
||||||
|
workspace-indicator, windowsNavigator for gnome-shell
|
||||||
|
changes
|
||||||
|
* translation updates (cs, es, lt, pl, pt_BR, sl)
|
||||||
|
|
||||||
|
3.8.1
|
||||||
|
=====
|
||||||
|
* many improvements to window-list:
|
||||||
|
- windows are activated by DND over them
|
||||||
|
- window buttons now have the right size,
|
||||||
|
even if the text is smaller or larger
|
||||||
|
than the ideal
|
||||||
|
- window buttons can be grouped automatically
|
||||||
|
when the panel becomes crowded
|
||||||
|
- added a workspace switcher menu
|
||||||
|
* added keyboard navigation to apps-menu
|
||||||
|
* small tweaks to classic-mode theme, in particular
|
||||||
|
for menus
|
||||||
|
* translation updates (gl, ko, sr)
|
||||||
|
|
||||||
|
3.8.0
|
||||||
|
=====
|
||||||
|
* translation updates (hu, ja, fi, it)
|
||||||
|
|
||||||
|
3.7.92
|
||||||
|
======
|
||||||
|
* misc bug fixes to app-menu and window-list
|
||||||
|
* translation updates (de, sl, pt_BR, ru)
|
||||||
|
|
||||||
|
3.7.91
|
||||||
|
======
|
||||||
|
* various updates for shell changes
|
||||||
|
* update window-list to always use application icons
|
||||||
|
* update apps-menu to not load subdirectories as
|
||||||
|
separate categories
|
||||||
|
* translation updates (lt, zh_CN)
|
||||||
|
|
||||||
|
3.7.90
|
||||||
|
======
|
||||||
|
* various fixes to make places-menu behave more
|
||||||
|
like Nautilus, including showing the machine
|
||||||
|
name in place of File System
|
||||||
|
* various updates for shell changes
|
||||||
|
* alternative-status-menu no longer supports
|
||||||
|
ConsoleKit systems, you need to install logind
|
||||||
|
to have suspend or hibernate
|
||||||
|
* translation updates (es, cz, pl, sr)
|
||||||
|
|
||||||
|
3.7.5.1
|
||||||
|
=======
|
||||||
|
* new extension forgotten in previous NEWS entry:
|
||||||
|
windows-list
|
||||||
|
* also forgotten previously: classic mode got a new
|
||||||
|
GNOME2 style
|
||||||
|
* build fixes
|
||||||
|
|
||||||
|
3.7.5
|
||||||
|
=====
|
||||||
|
* places-menu is back in the classic extensions, with
|
||||||
|
a new old GNOME-2 look
|
||||||
|
* classic mode moved the date menu to right, where we
|
||||||
|
all know it rightly belongs
|
||||||
|
* apps-menu received a face-lift, with the inclusion
|
||||||
|
of a reduced form of AxeMenu
|
||||||
|
* new extension in the classic set: launch-new-instance,
|
||||||
|
which modifies the behavior of clicking in the dash
|
||||||
|
and app launcher
|
||||||
|
* alternate-tab, native-window-placement and windowsNavigator
|
||||||
|
updated for gnome-shell changes
|
||||||
|
* translation updates (es, cz, pl)
|
||||||
|
|
||||||
|
3.7.4
|
||||||
|
=====
|
||||||
|
* a separate configure switch has been added to enable
|
||||||
|
classic mode session definitions
|
||||||
|
* places-menu is no longer part of the classic-mode
|
||||||
|
extension set
|
||||||
|
* updated translations (ar, gl, hu, lt, pt_BR, sr)
|
||||||
|
|
||||||
|
3.7.3
|
||||||
|
=====
|
||||||
|
* new extensions: default-min-max, static-workspaces
|
||||||
|
* alternate-tab now uses the built-in window switcher and just
|
||||||
|
takes over the switch-application keybinding
|
||||||
|
* workspace-indicator: is no longer part of classic-mode
|
||||||
|
* we now install classic-mode data files for gdm, gnome-session
|
||||||
|
and gnome-shell, so if you enable classic-mode you get a new
|
||||||
|
session option in GDM
|
||||||
|
* updated translations (ar, es, pl, ru, sl, zh_HK, zh_TW)
|
||||||
|
|
||||||
|
3.7.2
|
||||||
|
=====
|
||||||
|
* fixed crashes with places-menu, windowsNavigator, alternate-tab
|
||||||
|
and native-window-placement
|
||||||
|
* alternate-tab now hides attached modal dialogs
|
||||||
|
* places-menu has restored support for Nautilus 3.4
|
||||||
|
* the default for hibernate is now to show in alternative-status-menu
|
||||||
|
* some extensions are now tagged as "classic", and can be chosen with
|
||||||
|
--enable-extensions=classic-mode
|
||||||
|
* dock and gajim were removed at the beginning of the 3.7.1 cycle,
|
||||||
|
as they were buggy and unmaintained
|
||||||
|
* updated translations (ar, cs, de, el, es, gl, id, lt, lv, pa, pl
|
||||||
|
ru, sk, sl, sr, sr@latin)
|
||||||
|
|
||||||
|
3.6.1
|
||||||
|
=====
|
||||||
|
* fixed alternative-status-menu for the new lock screen
|
||||||
|
* squashed some alternate-tab warnings
|
||||||
|
* drive-menu now works with 3.6 again
|
||||||
|
* updated translations (ar, cs, el, es, gl, id, lv, pl, sl)
|
||||||
|
|
||||||
|
3.6.0
|
||||||
|
=====
|
||||||
|
* major rework in places menu, to make it work without
|
||||||
|
removed supporting code in the shell and to make it look like
|
||||||
|
the nautilus sidebar
|
||||||
|
(similar work would be needed for drive-menu, not done yet)
|
||||||
|
* updated translations (ca, cs, de, el, en_GB, es, fi, hu, id, lt,
|
||||||
|
pl, pt_BR, ru, sl, sr)
|
||||||
|
|
||||||
|
3.5.91
|
||||||
|
======
|
||||||
|
* various crashers were fixed in alternative-tab
|
||||||
|
* auto-move-windows now can be made to work with static workspaces
|
||||||
|
* place-menu is now on the left and uses symbolic icons like Files
|
||||||
|
* StIconType usage was removed from all extensions, after it was
|
||||||
|
removed in core
|
||||||
|
* systemMonitor, xrandr-indicator, apps-menu, places-menu,
|
||||||
|
alternative-status-menu were updated for the newer shell
|
||||||
|
* updated translations (es, gl, it, pl, sl)
|
||||||
|
|
||||||
|
3.5.90
|
||||||
|
======
|
||||||
|
* alternate-tab has been reworked again, the old mode switch
|
||||||
|
was removed and the all&thumbnails code extended to handle
|
||||||
|
icons and filtering to the workspace
|
||||||
|
* alternate-tab thumbnails now reflect the aspect ratio of the windows
|
||||||
|
* systemMonitor now shows a tooltip above the indicator
|
||||||
|
* native-window-placement, systemMonitor and windowsNavigator have been updated
|
||||||
|
for the newer shell
|
||||||
|
* updated translations (es, pa)
|
||||||
|
|
||||||
|
3.5.5
|
||||||
|
=====
|
||||||
|
* convenience module has been relicensed to BSD,
|
||||||
|
for compatibility with GPLv3 extensions
|
||||||
|
* alternate-tab has been refactored and seen various
|
||||||
|
improvements to all&thumbnails mode, including a new
|
||||||
|
overlaid application icon
|
||||||
|
* updated translations (lt, id, sr)
|
||||||
|
|
||||||
|
3.5.4
|
||||||
|
=====
|
||||||
|
* updated translations (de, es, ar, sl, lv, zh_CN)
|
||||||
|
|
||||||
3.5.2
|
3.5.2
|
||||||
=====
|
=====
|
||||||
* removable-drive-menu is now a11y friendly
|
* removable-drive-menu is now a11y friendly
|
||||||
|
|||||||
@@ -1,92 +0,0 @@
|
|||||||
GNOME Shell Extensions is a collection of extensions providing additional
|
|
||||||
and optional functionality to GNOME Shell.
|
|
||||||
Since GNOME Shell is not API stable, extensions work only against a very
|
|
||||||
specific version of the shell, usually the same as this package (see
|
|
||||||
"configure --version"). Also, since extensions are built from many
|
|
||||||
individual contributors, we cannot guarantee stability or quality for any
|
|
||||||
specific extension.
|
|
||||||
For these reasons, distributions are advised to avoid installing or packaging
|
|
||||||
this module by defaul.
|
|
||||||
|
|
||||||
For more information about GNOME Shell Extensions
|
|
||||||
http://live.gnome.org/GnomeShell/Extensions
|
|
||||||
|
|
||||||
For general information about GNOME Shell
|
|
||||||
http://live.gnome.org/GnomeShell
|
|
||||||
|
|
||||||
Bugs should be reported at http://bugzilla.gnome.org against the 'gnome-shell'
|
|
||||||
product, with the 'extensions' component.
|
|
||||||
|
|
||||||
Extensions
|
|
||||||
==========
|
|
||||||
|
|
||||||
alternate-tab
|
|
||||||
|
|
||||||
Lets you use classic Alt+Tab (window-based instead of app-based) in GNOME Shell.
|
|
||||||
|
|
||||||
alternative-status-menu
|
|
||||||
|
|
||||||
For those who want a power off item visible at all the time, replaces GNOME Shell
|
|
||||||
status menu with one featuring separate Suspend and Power Off. Adds the ability to
|
|
||||||
hibernate as well.
|
|
||||||
|
|
||||||
apps-menu
|
|
||||||
|
|
||||||
Lets you reach an application using gnome 2.x style menu on the panel.
|
|
||||||
|
|
||||||
auto-move-windows
|
|
||||||
|
|
||||||
Lets you manage your workspaces more easily, assigning a specific workspace to
|
|
||||||
each application as soon as it creates a window, in a manner configurable with a
|
|
||||||
GSettings key.
|
|
||||||
|
|
||||||
dock
|
|
||||||
|
|
||||||
Shows a dock-style task switcher on the right side of the screen.
|
|
||||||
|
|
||||||
drive-menu
|
|
||||||
Shows a status menu for rapid unmount and power off of external storage devices
|
|
||||||
(i.e. pendrives)
|
|
||||||
|
|
||||||
example
|
|
||||||
|
|
||||||
A minimal example illustrating how to write extensions.
|
|
||||||
|
|
||||||
gajim
|
|
||||||
|
|
||||||
Integration with Gajim, a Jabber/XMPP instant messaging client.
|
|
||||||
|
|
||||||
native-window-placement
|
|
||||||
|
|
||||||
An alternative algorithm for layouting the thumbnails in the windows overview, that
|
|
||||||
more closely reflects the actual positions and sizes.
|
|
||||||
|
|
||||||
places-menu
|
|
||||||
|
|
||||||
Shows a status Indicator for navigating to Places.
|
|
||||||
|
|
||||||
systemMonitor
|
|
||||||
|
|
||||||
An message tray indicator showing CPU and memory loads.
|
|
||||||
|
|
||||||
user-theme
|
|
||||||
|
|
||||||
Loads a shell theme from ~/.themes/<name>/gnome-shell.
|
|
||||||
|
|
||||||
windowsNavigator
|
|
||||||
|
|
||||||
Allow keyboard selection of windows and workspaces in overlay mode.
|
|
||||||
|
|
||||||
xrandr-indicator
|
|
||||||
|
|
||||||
Replace the GTK+ based indicator from gnome-settings-daemon with
|
|
||||||
a native one. Lets the user rotate the laptop monitor and open
|
|
||||||
display preferences quickly.
|
|
||||||
|
|
||||||
License
|
|
||||||
=======
|
|
||||||
GNOME Shell Extensions are distributed under the terms of the GNU General Public License,
|
|
||||||
version 2 or later. See the COPYING file for details.
|
|
||||||
Individual extensions may be licensed under different terms, see each source
|
|
||||||
file for details.
|
|
||||||
|
|
||||||
@@ -0,0 +1,83 @@
|
|||||||
|
# GNOME Shell Extensions
|
||||||
|
|
||||||
|
GNOME Shell Extensions is a collection of extensions providing additional
|
||||||
|
and optional functionality to GNOME Shell.
|
||||||
|
|
||||||
|
Since GNOME Shell is not API stable, extensions work only against a very
|
||||||
|
specific version of the shell, usually the same as this package (see
|
||||||
|
"configure --version"). The extensions in this package are supported by GNOME
|
||||||
|
and will be updated to reflect future API changes in GNOME Shell.
|
||||||
|
|
||||||
|
The GNOME wiki has more information about [GNOME Shell Extensions][project-page],
|
||||||
|
as well as some general information about [GNOME Shell][shell-page].
|
||||||
|
|
||||||
|
Bugs should be reported to the GNOME [bug tracking system][bug-tracker].
|
||||||
|
|
||||||
|
## Extensions
|
||||||
|
|
||||||
|
* alternate-tab (**OBSOLETE**)
|
||||||
|
|
||||||
|
Lets you use classic Alt+Tab (window-based instead of app-based) in GNOME Shell.
|
||||||
|
This extension is obsolete since GNOME 3.30, see [this blogpost][alternatetab-post]
|
||||||
|
for further details.
|
||||||
|
|
||||||
|
* apps-menu
|
||||||
|
|
||||||
|
Lets you reach an application using gnome 2.x style menu on the panel.
|
||||||
|
|
||||||
|
* auto-move-windows
|
||||||
|
|
||||||
|
Lets you manage your workspaces more easily, assigning a specific workspace to
|
||||||
|
each application as soon as it creates a window, in a manner configurable with a
|
||||||
|
GSettings key.
|
||||||
|
|
||||||
|
* drive-menu
|
||||||
|
|
||||||
|
Shows a status menu for rapid unmount and power off of external storage devices
|
||||||
|
(i.e. pendrives)
|
||||||
|
|
||||||
|
* launch-new-instance
|
||||||
|
|
||||||
|
Changes application icons to always launch a new instance when activated.
|
||||||
|
|
||||||
|
* native-window-placement
|
||||||
|
|
||||||
|
An alternative algorithm for layouting the thumbnails in the windows overview, that
|
||||||
|
more closely reflects the actual positions and sizes.
|
||||||
|
|
||||||
|
* places-menu
|
||||||
|
|
||||||
|
Shows a status Indicator for navigating to Places.
|
||||||
|
|
||||||
|
* screenshot-window-sizer
|
||||||
|
|
||||||
|
Adds a shortcut for resizing the focus window to a size that is suitable for GNOME Software screenshots
|
||||||
|
|
||||||
|
* user-theme
|
||||||
|
|
||||||
|
Loads a shell theme from ~/.themes/<name>/gnome-shell.
|
||||||
|
|
||||||
|
* window-list
|
||||||
|
|
||||||
|
Adds a bottom panel with a traditional window list.
|
||||||
|
|
||||||
|
* windowsNavigator
|
||||||
|
|
||||||
|
Allow keyboard selection of windows and workspaces in overlay mode.
|
||||||
|
|
||||||
|
* workspace-indicator
|
||||||
|
|
||||||
|
Adds a simple workspace switcher to the top bar.
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
GNOME Shell Extensions are distributed under the terms of the GNU General
|
||||||
|
Public License, version 2 or later. See the [COPYING file][license] for details.
|
||||||
|
Individual extensions may be licensed under different terms, see each source
|
||||||
|
file for details.
|
||||||
|
|
||||||
|
[project-page]: https://wiki.gnome.org/Projects/GnomeShell/Extensions
|
||||||
|
[shell-page]: https://wiki.gnome.org/Projects/GnomeShell
|
||||||
|
[bug-tracker]: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/issues
|
||||||
|
[license]: COPYING
|
||||||
|
[alternatetab-post]: https://blogs.gnome.org/fmuellner/2018/10/11/the-future-of-alternatetab-and-why-you-need-not-worry/
|
||||||
-20
@@ -1,20 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# Run this to generate all the initial makefiles, etc.
|
|
||||||
|
|
||||||
srcdir=`dirname $0`
|
|
||||||
test -z "$srcdir" && srcdir=.
|
|
||||||
|
|
||||||
PKG_NAME="gnome-shell-extensions"
|
|
||||||
|
|
||||||
test -f $srcdir/configure.ac || {
|
|
||||||
echo -n "**Error**: Directory "\`$srcdir\'" does not look like the"
|
|
||||||
echo " top-level gnome-shell-extensions directory"
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
which gnome-autogen.sh || {
|
|
||||||
echo "You need to install gnome-common from GNOME Git (or from"
|
|
||||||
echo "your OS vendor's package manager)."
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
. gnome-autogen.sh
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
install-sh
|
|
||||||
mkinstalldirs
|
|
||||||
missing
|
|
||||||
@@ -1,92 +0,0 @@
|
|||||||
AC_PREREQ(2.63)
|
|
||||||
AC_INIT([gnome-shell-extensions],[3.5.2],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell&component=extensions])
|
|
||||||
|
|
||||||
AC_CONFIG_MACRO_DIR([m4])
|
|
||||||
AC_CONFIG_AUX_DIR([config])
|
|
||||||
|
|
||||||
AM_INIT_AUTOMAKE([1.10 dist-bzip2 no-dist-gzip foreign tar-ustar])
|
|
||||||
|
|
||||||
m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])
|
|
||||||
|
|
||||||
GETTEXT_PACKAGE=gnome-shell-extensions
|
|
||||||
AC_SUBST(GETTEXT_PACKAGE)
|
|
||||||
AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE",
|
|
||||||
[The prefix for our gettext translation domains.])
|
|
||||||
IT_PROG_INTLTOOL(0.26)
|
|
||||||
|
|
||||||
PKG_PROG_PKG_CONFIG([0.22])
|
|
||||||
|
|
||||||
GLIB_GSETTINGS
|
|
||||||
|
|
||||||
SHELL_VERSION="$PACKAGE_VERSION"
|
|
||||||
shell_major=`echo "$PACKAGE_VERSION" | cut -d'.' -f1`
|
|
||||||
shell_minor=`echo "$PACKAGE_VERSION" | cut -d'.' -f2`
|
|
||||||
if test "$(($shell_minor % 2))" -eq 0; then
|
|
||||||
SHELL_VERSION="$shell_major.$shell_minor"
|
|
||||||
fi
|
|
||||||
AC_SUBST([SHELL_VERSION])
|
|
||||||
|
|
||||||
dnl keep this in alphabetic order
|
|
||||||
dnl by default, install only extensions that do not change completely the shell experience,
|
|
||||||
dnl that don't require GSettings and that don't require external packages for typelibs
|
|
||||||
dnl (so basically only menus, status icons, search providers, overview tabs, message tray sources, etc.)
|
|
||||||
DEFAULT_EXTENSIONS="alternative-status-menu apps-menu dock drive-menu gajim places-menu windowsNavigator workspace-indicator"
|
|
||||||
ALL_EXTENSIONS="$DEFAULT_EXTENSIONS alternate-tab auto-move-windows example native-window-placement systemMonitor user-theme xrandr-indicator"
|
|
||||||
AC_SUBST(ALL_EXTENSIONS, [$ALL_EXTENSIONS])
|
|
||||||
AC_ARG_ENABLE([extensions],
|
|
||||||
[AS_HELP_STRING([--enable-extensions],[Space separated list of extensions to enable.
|
|
||||||
The default is to build all extensions that can be installed in the home directory and have no external depedencies.
|
|
||||||
Use "all" to enable all available extensions.])],
|
|
||||||
[],
|
|
||||||
[enable_extensions=$DEFAULT_EXTENSIONS]
|
|
||||||
)
|
|
||||||
if test x"$enable_extensions" = xall; then
|
|
||||||
enable_extensions="$ALL_EXTENSIONS"
|
|
||||||
fi
|
|
||||||
|
|
||||||
ENABLED_EXTENSIONS=
|
|
||||||
for e in $enable_extensions; do
|
|
||||||
case $e in
|
|
||||||
systemMonitor)
|
|
||||||
PKG_CHECK_MODULES(GTOP, libgtop-2.0 >= 2.28.3,
|
|
||||||
[ENABLED_EXTENSIONS="$ENABLED_EXTENSIONS $e"],
|
|
||||||
[AC_MSG_WARN([libgtop-2.0 not found, disabling systemMonitor])])
|
|
||||||
;;
|
|
||||||
xrandr-indicator)
|
|
||||||
PKG_CHECK_MODULES(GNOME_DESKTOP, gnome-desktop-3.0 >= 2.91.6,
|
|
||||||
[ENABLED_EXTENSIONS="$ENABLED_EXTENSIONS $e"],
|
|
||||||
[AC_MSG_WARN([gnome-desktop-3.0 not found, disabling xrandr-indicator])])
|
|
||||||
;;
|
|
||||||
dnl keep this in alphabetic order
|
|
||||||
alternate-tab|alternative-status-menu|apps-menu|auto-move-windows|dock|drive-menu|example|gajim|native-window-placement|places-menu|user-theme|windowsNavigator|workspace-indicator)
|
|
||||||
ENABLED_EXTENSIONS="$ENABLED_EXTENSIONS $e"
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
AC_MSG_ERROR([invalid extension $e])
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
AC_SUBST(ENABLED_EXTENSIONS, [$ENABLED_EXTENSIONS])
|
|
||||||
|
|
||||||
dnl Please keep this sorted alphabetically
|
|
||||||
AC_CONFIG_FILES([
|
|
||||||
extensions/alternate-tab/Makefile
|
|
||||||
extensions/alternative-status-menu/Makefile
|
|
||||||
extensions/apps-menu/Makefile
|
|
||||||
extensions/auto-move-windows/Makefile
|
|
||||||
extensions/dock/Makefile
|
|
||||||
extensions/drive-menu/Makefile
|
|
||||||
extensions/example/Makefile
|
|
||||||
extensions/gajim/Makefile
|
|
||||||
extensions/native-window-placement/Makefile
|
|
||||||
extensions/places-menu/Makefile
|
|
||||||
extensions/systemMonitor/Makefile
|
|
||||||
extensions/user-theme/Makefile
|
|
||||||
extensions/windowsNavigator/Makefile
|
|
||||||
extensions/workspace-indicator/Makefile
|
|
||||||
extensions/xrandr-indicator/Makefile
|
|
||||||
extensions/Makefile
|
|
||||||
Makefile
|
|
||||||
po/Makefile.in
|
|
||||||
])
|
|
||||||
AC_OUTPUT
|
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
[org.gnome.mutter:GNOME-Classic]
|
||||||
|
dynamic-workspaces=false
|
||||||
|
|
||||||
|
[org.gnome.desktop.wm.preferences:GNOME-Classic]
|
||||||
|
button-layout='appmenu:minimize,maximize,close'
|
||||||
|
|
||||||
|
[org.gnome.desktop.wm.keybindings:GNOME-Classic]
|
||||||
|
switch-applications=[]
|
||||||
|
switch-windows=['<Super>Tab','<Alt>Tab']
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
To update the gnome-shell-sass submodule to latest upstream commit:
|
||||||
|
git submodule update --rebase
|
||||||
@@ -0,0 +1,178 @@
|
|||||||
|
<?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="24"
|
||||||
|
height="24"
|
||||||
|
id="svg10621"
|
||||||
|
version="1.1"
|
||||||
|
inkscape:version="0.91 r13725"
|
||||||
|
sodipodi:docname="calendar-today.svg">
|
||||||
|
<defs
|
||||||
|
id="defs10623">
|
||||||
|
<radialGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient34508-1-3"
|
||||||
|
id="radialGradient99561-1"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.72146227,0,0,0.27484277,14.205424,21.754717)"
|
||||||
|
cx="51"
|
||||||
|
cy="30"
|
||||||
|
fx="51"
|
||||||
|
fy="30"
|
||||||
|
r="42" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
id="linearGradient34508-1-3">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#ffffff;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop34510-1-9" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#ffffff;stop-opacity:0;"
|
||||||
|
offset="1"
|
||||||
|
id="stop34512-4-5" />
|
||||||
|
</linearGradient>
|
||||||
|
<radialGradient
|
||||||
|
r="42"
|
||||||
|
fy="30"
|
||||||
|
fx="51"
|
||||||
|
cy="30"
|
||||||
|
cx="51"
|
||||||
|
gradientTransform="matrix(0.72146227,0,0,0.27484277,14.205424,21.754717)"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
id="radialGradient10592"
|
||||||
|
xlink:href="#linearGradient34508-1-3"
|
||||||
|
inkscape:collect="always" />
|
||||||
|
<radialGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient34508-1-3"
|
||||||
|
id="radialGradient3770"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.72146227,0,0,0.27484277,14.205424,21.754717)"
|
||||||
|
cx="51"
|
||||||
|
cy="30"
|
||||||
|
fx="51"
|
||||||
|
fy="30"
|
||||||
|
r="42" />
|
||||||
|
<radialGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient34508-1-3"
|
||||||
|
id="radialGradient3001"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.72146227,0,0,0.27484277,14.205424,21.754717)"
|
||||||
|
cx="51"
|
||||||
|
cy="30"
|
||||||
|
fx="51"
|
||||||
|
fy="30"
|
||||||
|
r="42" />
|
||||||
|
<radialGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient34508-1-3"
|
||||||
|
id="radialGradient3007"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.72146227,0,0,0.27484277,14.205424,21.754717)"
|
||||||
|
cx="51"
|
||||||
|
cy="30"
|
||||||
|
fx="51"
|
||||||
|
fy="30"
|
||||||
|
r="42" />
|
||||||
|
<radialGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient34508-1-3"
|
||||||
|
id="radialGradient3067"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.72146227,0,0,0.27484277,14.205424,21.754717)"
|
||||||
|
cx="51"
|
||||||
|
cy="30"
|
||||||
|
fx="51"
|
||||||
|
fy="30"
|
||||||
|
r="42" />
|
||||||
|
<radialGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient34508-1-3"
|
||||||
|
id="radialGradient3072"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.72146227,0,0,0.27484277,14.205424,21.754717)"
|
||||||
|
cx="51"
|
||||||
|
cy="30"
|
||||||
|
fx="51"
|
||||||
|
fy="30"
|
||||||
|
r="42" />
|
||||||
|
<radialGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient34508-1-3"
|
||||||
|
id="radialGradient2997"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.72146227,0,0,0.27484277,14.205424,21.754717)"
|
||||||
|
cx="51"
|
||||||
|
cy="30"
|
||||||
|
fx="51"
|
||||||
|
fy="30"
|
||||||
|
r="42" />
|
||||||
|
</defs>
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#d3d3d3"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="8"
|
||||||
|
inkscape:cx="-55.349829"
|
||||||
|
inkscape:cy="-31.442864"
|
||||||
|
inkscape:document-units="px"
|
||||||
|
inkscape:current-layer="layer1"
|
||||||
|
showgrid="false"
|
||||||
|
fit-margin-top="0"
|
||||||
|
fit-margin-left="0"
|
||||||
|
fit-margin-right="0"
|
||||||
|
fit-margin-bottom="0"
|
||||||
|
inkscape:window-width="2133"
|
||||||
|
inkscape:window-height="1241"
|
||||||
|
inkscape:window-x="238"
|
||||||
|
inkscape:window-y="89"
|
||||||
|
inkscape:window-maximized="0"
|
||||||
|
borderlayer="true"
|
||||||
|
inkscape:showpageshadow="false">
|
||||||
|
<inkscape:grid
|
||||||
|
type="xygrid"
|
||||||
|
id="grid3109"
|
||||||
|
empspacing="5"
|
||||||
|
visible="true"
|
||||||
|
enabled="true"
|
||||||
|
snapvisiblegridlinesonly="true" />
|
||||||
|
</sodipodi:namedview>
|
||||||
|
<metadata
|
||||||
|
id="metadata10626">
|
||||||
|
<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(-469.08263,-537.99307)">
|
||||||
|
<circle
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#555753;fill-opacity:0.23756906;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
id="path7305"
|
||||||
|
cx="481.57138"
|
||||||
|
cy="559.4649"
|
||||||
|
r="1.5" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 5.6 KiB |
File diff suppressed because it is too large
Load Diff
|
After Width: | Height: | Size: 100 KiB |
@@ -0,0 +1,262 @@
|
|||||||
|
<?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="svg10865"
|
||||||
|
version="1.1"
|
||||||
|
inkscape:version="0.91 r13725"
|
||||||
|
sodipodi:docname="classic-toggle-off-intl.svg">
|
||||||
|
<defs
|
||||||
|
id="defs10867">
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient62852-6-5">
|
||||||
|
<stop
|
||||||
|
id="stop62854-6-7"
|
||||||
|
offset="0"
|
||||||
|
style="stop-color:#ffffff;stop-opacity:1" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#eeeeec;stop-opacity:1"
|
||||||
|
offset="0.97726452"
|
||||||
|
id="stop62858-8-0" />
|
||||||
|
<stop
|
||||||
|
id="stop62860-5-3"
|
||||||
|
offset="1"
|
||||||
|
style="stop-color:#f5f5f4;stop-opacity:1" />
|
||||||
|
</linearGradient>
|
||||||
|
<inkscape:path-effect
|
||||||
|
is_visible="true"
|
||||||
|
id="path-effect62989-8-0"
|
||||||
|
effect="spiro" />
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient62821-5-8">
|
||||||
|
<stop
|
||||||
|
id="stop62823-2-4"
|
||||||
|
offset="0"
|
||||||
|
style="stop-color:#d1d3d1;stop-opacity:1;" />
|
||||||
|
<stop
|
||||||
|
id="stop62825-3-8"
|
||||||
|
offset="1"
|
||||||
|
style="stop-color:#ebebeb;stop-opacity:1;" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient62852-6-5-3">
|
||||||
|
<stop
|
||||||
|
id="stop62854-6-7-6"
|
||||||
|
offset="0"
|
||||||
|
style="stop-color:#ffffff;stop-opacity:1" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#eeeeec;stop-opacity:1"
|
||||||
|
offset="0.97726452"
|
||||||
|
id="stop62858-8-0-3" />
|
||||||
|
<stop
|
||||||
|
id="stop62860-5-3-9"
|
||||||
|
offset="1"
|
||||||
|
style="stop-color:#f5f5f4;stop-opacity:1" />
|
||||||
|
</linearGradient>
|
||||||
|
<inkscape:path-effect
|
||||||
|
effect="spiro"
|
||||||
|
id="path-effect62829-6-8-0"
|
||||||
|
is_visible="true" />
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient62821-5-8-1">
|
||||||
|
<stop
|
||||||
|
id="stop62823-2-4-2"
|
||||||
|
offset="0"
|
||||||
|
style="stop-color:#d1d3d1;stop-opacity:1;" />
|
||||||
|
<stop
|
||||||
|
id="stop62825-3-8-9"
|
||||||
|
offset="1"
|
||||||
|
style="stop-color:#ebebeb;stop-opacity:1;" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
y2="507.42715"
|
||||||
|
x2="702.58966"
|
||||||
|
y1="484.49405"
|
||||||
|
x1="702.58966"
|
||||||
|
gradientTransform="matrix(1.3066667,0,0,1,-841.64667,-483)"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
id="linearGradient11647"
|
||||||
|
xlink:href="#linearGradient62821-5-8-1"
|
||||||
|
inkscape:collect="always" />
|
||||||
|
<clipPath
|
||||||
|
clipPathUnits="userSpaceOnUse"
|
||||||
|
id="clipPath65663">
|
||||||
|
<rect
|
||||||
|
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:new"
|
||||||
|
id="rect65665"
|
||||||
|
width="96.999924"
|
||||||
|
height="24.292892"
|
||||||
|
x="708.71954"
|
||||||
|
y="406.96973"
|
||||||
|
rx="3.1139846"
|
||||||
|
ry="1.9595497"
|
||||||
|
inkscape:export-filename="/home/lapo.fedora/SparkleShare/gnome-mockups/content selection/content-selection.png"
|
||||||
|
inkscape:export-xdpi="90"
|
||||||
|
inkscape:export-ydpi="90" />
|
||||||
|
</clipPath>
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient5378-2-5-9-9-0-80-7-6-8-4-5-7-3-6-2-9"
|
||||||
|
id="linearGradient65582"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.5250827,0,0,0.72144839,620.16092,156.4917)"
|
||||||
|
x1="207.17195"
|
||||||
|
y1="497.39584"
|
||||||
|
x2="207.17195"
|
||||||
|
y2="531.48669" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
id="linearGradient5378-2-5-9-9-0-80-7-6-8-4-5-7-3-6-2-9">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#f4f6f4;stop-opacity:1"
|
||||||
|
offset="0"
|
||||||
|
id="stop5380-6-1-1-9-3-6-3-6-45-6-4-4-9-9-8-9" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#d7dad7;stop-opacity:1"
|
||||||
|
offset="1"
|
||||||
|
id="stop5382-06-3-6-4-2-4-6-8-0-9-6-8-7-7-6-7" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
id="linearGradient65584">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#f1f1f1;stop-opacity:1"
|
||||||
|
offset="0"
|
||||||
|
id="stop65586" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#a7aba7;stop-opacity:0;"
|
||||||
|
offset="1"
|
||||||
|
id="stop65588" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient5378-2-5-9-9-0-80-7-6-8-4-5-7-3-6-2-9"
|
||||||
|
id="linearGradient65582-5"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.5250827,0,0,0.72144839,-75.348673,-359.16458)"
|
||||||
|
x1="207.17195"
|
||||||
|
y1="497.39584"
|
||||||
|
x2="207.17195"
|
||||||
|
y2="531.48669" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient65584"
|
||||||
|
id="linearGradient65590-6"
|
||||||
|
x1="716.62506"
|
||||||
|
y1="537.23358"
|
||||||
|
x2="716.62506"
|
||||||
|
y2="535.23358"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(1.0139469,0,0,1.0139469,-705.52354,-521.99915)" />
|
||||||
|
</defs>
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="1"
|
||||||
|
inkscape:cx="23.565368"
|
||||||
|
inkscape:cy="19.596892"
|
||||||
|
inkscape:document-units="px"
|
||||||
|
inkscape:current-layer="g62929"
|
||||||
|
showgrid="false"
|
||||||
|
borderlayer="true"
|
||||||
|
inkscape:showpageshadow="false"
|
||||||
|
inkscape:snap-nodes="false"
|
||||||
|
inkscape:snap-bbox="true"
|
||||||
|
inkscape:bbox-paths="true"
|
||||||
|
inkscape:snap-others="false"
|
||||||
|
inkscape:window-width="2560"
|
||||||
|
inkscape:window-height="1342"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="28"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
showborder="false">
|
||||||
|
<inkscape:grid
|
||||||
|
type="xygrid"
|
||||||
|
id="grid11512" />
|
||||||
|
</sodipodi:namedview>
|
||||||
|
<metadata
|
||||||
|
id="metadata10870">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(0,-1030.3622)">
|
||||||
|
<g
|
||||||
|
inkscape:export-ydpi="90"
|
||||||
|
inkscape:export-xdpi="90"
|
||||||
|
inkscape:export-filename="/home/lapo.fedora/SparkleShare/gnome-mockups/system-settings/network/network-panel-summary.png"
|
||||||
|
style="display:inline"
|
||||||
|
id="g62929"
|
||||||
|
transform="translate(-643.91421,517.29894)">
|
||||||
|
<g
|
||||||
|
transform="translate(0,30)"
|
||||||
|
id="g62931">
|
||||||
|
<rect
|
||||||
|
style="fill:#cecece;fill-opacity:1;stroke:#a7a7a7;stroke-width:1;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;color:#000000;color-interpolation:sRGB;color-interpolation-filters:linearRGB;fill-rule:nonzero;stroke-linejoin:miter;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;clip-rule:nonzero;opacity:1;isolation:auto;mix-blend-mode:normal;solid-color:#000000;solid-opacity:1;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;filter-blend-mode:normal;filter-gaussianBlur-deviation:0;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto"
|
||||||
|
id="rect62935"
|
||||||
|
width="63.856125"
|
||||||
|
height="21.093594"
|
||||||
|
x="644.5"
|
||||||
|
y="483.5"
|
||||||
|
rx="2"
|
||||||
|
ry="2" />
|
||||||
|
<rect
|
||||||
|
style="fill:url(#linearGradient65582);fill-opacity:1;stroke:#a7a7a7;stroke-width:0.97313344;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline;color:#000000;clip-rule:nonzero;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill-rule:nonzero;stroke-linejoin:miter;stroke-dashoffset:0;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;filter-blend-mode:normal;filter-gaussianBlur-deviation:0;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
id="rect62937"
|
||||||
|
width="29.97398"
|
||||||
|
height="17.022524"
|
||||||
|
x="646.55896"
|
||||||
|
y="485.61429"
|
||||||
|
rx="1"
|
||||||
|
ry="1" />
|
||||||
|
<g
|
||||||
|
transform="translate(-38.048674,-1.9445437)"
|
||||||
|
id="g62939" />
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
inkscape:original-d="m 647.78241,486.57192 27.73523,0"
|
||||||
|
inkscape:path-effect="#path-effect62989-8-0"
|
||||||
|
id="path62947"
|
||||||
|
d="m 647.78241,486.57192 27.73523,0"
|
||||||
|
style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g11665"
|
||||||
|
transform="matrix(0.78906097,0,0,0.78906097,178.78814,111.57844)" />
|
||||||
|
<path
|
||||||
|
sodipodi:type="arc"
|
||||||
|
id="path3016"
|
||||||
|
sodipodi:cx="50.375"
|
||||||
|
sodipodi:cy="11.875"
|
||||||
|
sodipodi:rx="4.625"
|
||||||
|
sodipodi:ry="4.625"
|
||||||
|
d="M 55,11.875 A 4.625,4.625 0 0 1 50.375,16.5 4.625,4.625 0 0 1 45.75,11.875 4.625,4.625 0 0 1 50.375,7.25 4.625,4.625 0 0 1 55,11.875 Z"
|
||||||
|
transform="translate(642.41421,512.02037)"
|
||||||
|
style="fill:none;stroke:#2e3436;stroke-width:2;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 9.5 KiB |
@@ -0,0 +1,222 @@
|
|||||||
|
<?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="svg10865"
|
||||||
|
version="1.1"
|
||||||
|
inkscape:version="0.91 r13725"
|
||||||
|
sodipodi:docname="classic-toggle-off-us.svg">
|
||||||
|
<defs
|
||||||
|
id="defs10867">
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient62852-6-5">
|
||||||
|
<stop
|
||||||
|
id="stop62854-6-7"
|
||||||
|
offset="0"
|
||||||
|
style="stop-color:#ffffff;stop-opacity:1" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#eeeeec;stop-opacity:1"
|
||||||
|
offset="0.97726452"
|
||||||
|
id="stop62858-8-0" />
|
||||||
|
<stop
|
||||||
|
id="stop62860-5-3"
|
||||||
|
offset="1"
|
||||||
|
style="stop-color:#f5f5f4;stop-opacity:1" />
|
||||||
|
</linearGradient>
|
||||||
|
<inkscape:path-effect
|
||||||
|
is_visible="true"
|
||||||
|
id="path-effect62989-8-0"
|
||||||
|
effect="spiro" />
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient62821-5-8">
|
||||||
|
<stop
|
||||||
|
id="stop62823-2-4"
|
||||||
|
offset="0"
|
||||||
|
style="stop-color:#d1d3d1;stop-opacity:1;" />
|
||||||
|
<stop
|
||||||
|
id="stop62825-3-8"
|
||||||
|
offset="1"
|
||||||
|
style="stop-color:#ebebeb;stop-opacity:1;" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient62852-6-5-3">
|
||||||
|
<stop
|
||||||
|
id="stop62854-6-7-6"
|
||||||
|
offset="0"
|
||||||
|
style="stop-color:#ffffff;stop-opacity:1" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#eeeeec;stop-opacity:1"
|
||||||
|
offset="0.97726452"
|
||||||
|
id="stop62858-8-0-3" />
|
||||||
|
<stop
|
||||||
|
id="stop62860-5-3-9"
|
||||||
|
offset="1"
|
||||||
|
style="stop-color:#f5f5f4;stop-opacity:1" />
|
||||||
|
</linearGradient>
|
||||||
|
<inkscape:path-effect
|
||||||
|
effect="spiro"
|
||||||
|
id="path-effect62829-6-8-0"
|
||||||
|
is_visible="true" />
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient62821-5-8-1">
|
||||||
|
<stop
|
||||||
|
id="stop62823-2-4-2"
|
||||||
|
offset="0"
|
||||||
|
style="stop-color:#d1d3d1;stop-opacity:1;" />
|
||||||
|
<stop
|
||||||
|
id="stop62825-3-8-9"
|
||||||
|
offset="1"
|
||||||
|
style="stop-color:#ebebeb;stop-opacity:1;" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
y2="507.42715"
|
||||||
|
x2="702.58966"
|
||||||
|
y1="484.49405"
|
||||||
|
x1="702.58966"
|
||||||
|
gradientTransform="matrix(1.3066667,0,0,1,-841.64667,-483)"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
id="linearGradient11647"
|
||||||
|
xlink:href="#linearGradient62821-5-8-1"
|
||||||
|
inkscape:collect="always" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient5378-2-5-9-9-0-80-7-6-8-4-5-7-3-6-2-9"
|
||||||
|
id="linearGradient65582"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.5250827,0,0,0.72144839,620.16092,156.4917)"
|
||||||
|
x1="207.17195"
|
||||||
|
y1="497.39584"
|
||||||
|
x2="207.17195"
|
||||||
|
y2="531.48669" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
id="linearGradient5378-2-5-9-9-0-80-7-6-8-4-5-7-3-6-2-9">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#f4f6f4;stop-opacity:1"
|
||||||
|
offset="0"
|
||||||
|
id="stop5380-6-1-1-9-3-6-3-6-45-6-4-4-9-9-8-9" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#d7dad7;stop-opacity:1"
|
||||||
|
offset="1"
|
||||||
|
id="stop5382-06-3-6-4-2-4-6-8-0-9-6-8-7-7-6-7" />
|
||||||
|
</linearGradient>
|
||||||
|
<inkscape:path-effect
|
||||||
|
is_visible="true"
|
||||||
|
id="path-effect62989-8-0-6"
|
||||||
|
effect="spiro" />
|
||||||
|
</defs>
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="1"
|
||||||
|
inkscape:cx="78.222729"
|
||||||
|
inkscape:cy="-3.6620078"
|
||||||
|
inkscape:document-units="px"
|
||||||
|
inkscape:current-layer="g62929"
|
||||||
|
showgrid="false"
|
||||||
|
borderlayer="true"
|
||||||
|
inkscape:showpageshadow="false"
|
||||||
|
inkscape:snap-nodes="false"
|
||||||
|
inkscape:snap-bbox="true"
|
||||||
|
inkscape:bbox-paths="true"
|
||||||
|
inkscape:snap-others="false"
|
||||||
|
inkscape:window-width="2560"
|
||||||
|
inkscape:window-height="1342"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="28"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
showborder="false">
|
||||||
|
<inkscape:grid
|
||||||
|
type="xygrid"
|
||||||
|
id="grid11512" />
|
||||||
|
</sodipodi:namedview>
|
||||||
|
<metadata
|
||||||
|
id="metadata10870">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(0,-1030.3622)">
|
||||||
|
<g
|
||||||
|
inkscape:export-ydpi="90"
|
||||||
|
inkscape:export-xdpi="90"
|
||||||
|
inkscape:export-filename="/home/lapo.fedora/SparkleShare/gnome-mockups/system-settings/network/network-panel-summary.png"
|
||||||
|
style="display:inline"
|
||||||
|
id="g62929"
|
||||||
|
transform="translate(-643.91421,517.29894)">
|
||||||
|
<g
|
||||||
|
style="display:inline"
|
||||||
|
transform="translate(0,30)"
|
||||||
|
id="g62931">
|
||||||
|
<rect
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#cecece;fill-opacity:1;fill-rule:nonzero;stroke:#a7a7a7;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new"
|
||||||
|
id="rect62935"
|
||||||
|
width="63.856125"
|
||||||
|
height="21.093594"
|
||||||
|
x="644.5"
|
||||||
|
y="483.5"
|
||||||
|
rx="2"
|
||||||
|
ry="2" />
|
||||||
|
<rect
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#linearGradient65582);fill-opacity:1;fill-rule:nonzero;stroke:#a7a7a7;stroke-width:0.97313344;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
id="rect62937"
|
||||||
|
width="29.97398"
|
||||||
|
height="17.022524"
|
||||||
|
x="646.55896"
|
||||||
|
y="485.61429"
|
||||||
|
rx="1"
|
||||||
|
ry="1" />
|
||||||
|
<g
|
||||||
|
transform="translate(-38.048674,-1.9445437)"
|
||||||
|
id="g62939" />
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
inkscape:original-d="m 647.78241,486.57192 27.73523,0"
|
||||||
|
inkscape:path-effect="#path-effect62989-8-0-6"
|
||||||
|
id="path62947"
|
||||||
|
d="m 647.78241,486.57192 27.73523,0"
|
||||||
|
style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g11665"
|
||||||
|
transform="matrix(0.78906097,0,0,0.78906097,167.78814,111.57844)">
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-size:12.69556618px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#2e3436;fill-opacity:1;stroke:none;font-family:Cantarell;-inkscape-font-specification:Cantarell Bold"
|
||||||
|
x="644.46393"
|
||||||
|
y="533.87158"
|
||||||
|
id="text62949"
|
||||||
|
sodipodi:linespacing="125%"
|
||||||
|
transform="scale(1.0113976,0.98873084)"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan62951"
|
||||||
|
x="644.46393"
|
||||||
|
y="533.87158">OFF</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 8.0 KiB |
@@ -0,0 +1,175 @@
|
|||||||
|
<?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="svg10865"
|
||||||
|
version="1.1"
|
||||||
|
inkscape:version="0.91 r13725"
|
||||||
|
sodipodi:docname="classic-toggle-on-intl.svg">
|
||||||
|
<defs
|
||||||
|
id="defs10867">
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient62852-6-5">
|
||||||
|
<stop
|
||||||
|
id="stop62854-6-7"
|
||||||
|
offset="0"
|
||||||
|
style="stop-color:#ffffff;stop-opacity:1" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#eeeeec;stop-opacity:1"
|
||||||
|
offset="0.97726452"
|
||||||
|
id="stop62858-8-0" />
|
||||||
|
<stop
|
||||||
|
id="stop62860-5-3"
|
||||||
|
offset="1"
|
||||||
|
style="stop-color:#f5f5f4;stop-opacity:1" />
|
||||||
|
</linearGradient>
|
||||||
|
<inkscape:path-effect
|
||||||
|
is_visible="true"
|
||||||
|
id="path-effect62989-8-0"
|
||||||
|
effect="spiro" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient38513"
|
||||||
|
id="linearGradient38519"
|
||||||
|
x1="690"
|
||||||
|
y1="506.25049"
|
||||||
|
x2="690"
|
||||||
|
y2="480.93414"
|
||||||
|
gradientUnits="userSpaceOnUse" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
id="linearGradient38513">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#729fcf;stop-opacity:1"
|
||||||
|
offset="0"
|
||||||
|
id="stop38515" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#6f9ccd;stop-opacity:1"
|
||||||
|
offset="1"
|
||||||
|
id="stop38517" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient62852-6-5"
|
||||||
|
id="linearGradient62981-1-1"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.85639946,0,0,0.81059641,57.747905,92.132229)"
|
||||||
|
x1="740"
|
||||||
|
y1="486.10501"
|
||||||
|
x2="740"
|
||||||
|
y2="505.3204" />
|
||||||
|
<inkscape:path-effect
|
||||||
|
is_visible="true"
|
||||||
|
id="path-effect62989-8-0-8"
|
||||||
|
effect="spiro" />
|
||||||
|
</defs>
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="1"
|
||||||
|
inkscape:cx="9.3225163"
|
||||||
|
inkscape:cy="-0.1588306"
|
||||||
|
inkscape:document-units="px"
|
||||||
|
inkscape:current-layer="g62929"
|
||||||
|
showgrid="false"
|
||||||
|
borderlayer="true"
|
||||||
|
inkscape:showpageshadow="false"
|
||||||
|
inkscape:snap-nodes="false"
|
||||||
|
inkscape:snap-bbox="true"
|
||||||
|
inkscape:bbox-paths="true"
|
||||||
|
inkscape:snap-others="false"
|
||||||
|
inkscape:window-width="2560"
|
||||||
|
inkscape:window-height="1342"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="28"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
showborder="false">
|
||||||
|
<inkscape:grid
|
||||||
|
type="xygrid"
|
||||||
|
id="grid11512" />
|
||||||
|
</sodipodi:namedview>
|
||||||
|
<metadata
|
||||||
|
id="metadata10870">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(0,-1030.3622)">
|
||||||
|
<g
|
||||||
|
inkscape:export-ydpi="90"
|
||||||
|
inkscape:export-xdpi="90"
|
||||||
|
inkscape:export-filename="/home/lapo.fedora/SparkleShare/gnome-mockups/system-settings/network/network-panel-summary.png"
|
||||||
|
style="display:inline"
|
||||||
|
id="g62929"
|
||||||
|
transform="translate(-643.91421,517.29894)">
|
||||||
|
<g
|
||||||
|
style="display:inline"
|
||||||
|
transform="translate(0,30)"
|
||||||
|
id="g62931">
|
||||||
|
<rect
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#linearGradient38519);fill-opacity:1;fill-rule:nonzero;stroke:#3465a4;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
id="rect62935"
|
||||||
|
width="63.856125"
|
||||||
|
height="21.093594"
|
||||||
|
x="644.5"
|
||||||
|
y="483.5"
|
||||||
|
rx="2"
|
||||||
|
ry="2" />
|
||||||
|
<rect
|
||||||
|
style="display:inline;fill:url(#linearGradient62981-1-1);fill-opacity:1;stroke:#3465a4;stroke-width:1;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
id="rect62937"
|
||||||
|
width="29.97398"
|
||||||
|
height="17.022524"
|
||||||
|
x="676.49646"
|
||||||
|
y="485.67679"
|
||||||
|
rx="1"
|
||||||
|
ry="1" />
|
||||||
|
<g
|
||||||
|
transform="translate(-7.9861743,-1.9445437)"
|
||||||
|
id="g62939" />
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
inkscape:original-d="m 677.59874,486.57192 27.94632,0"
|
||||||
|
inkscape:path-effect="#path-effect62989-8-0-8"
|
||||||
|
id="path62947"
|
||||||
|
d="m 677.59874,486.57192 27.94632,0"
|
||||||
|
style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
|
||||||
|
</g>
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path4444"
|
||||||
|
d="m 661.91421,522.09451 0,7"
|
||||||
|
style="fill:#3465a4;stroke:#3465a4;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;color:#000000;fill-opacity:1;fill-rule:nonzero;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
|
||||||
|
d="m 18,7.96875 0,7"
|
||||||
|
id="path3922"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
transform="translate(643.91421,513.06326)" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 6.2 KiB |
@@ -0,0 +1,209 @@
|
|||||||
|
<?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="svg10865"
|
||||||
|
version="1.1"
|
||||||
|
inkscape:version="0.91 r13725"
|
||||||
|
sodipodi:docname="classic-toggle-on-us.svg">
|
||||||
|
<defs
|
||||||
|
id="defs10867">
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient62852-6-5"
|
||||||
|
id="linearGradient62981-1-1"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.85639946,0,0,0.81059641,57.747905,92.132229)"
|
||||||
|
x1="740"
|
||||||
|
y1="486.10501"
|
||||||
|
x2="740"
|
||||||
|
y2="505.3204" />
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient62852-6-5">
|
||||||
|
<stop
|
||||||
|
id="stop62854-6-7"
|
||||||
|
offset="0"
|
||||||
|
style="stop-color:#ffffff;stop-opacity:1" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#eeeeec;stop-opacity:1"
|
||||||
|
offset="0.97726452"
|
||||||
|
id="stop62858-8-0" />
|
||||||
|
<stop
|
||||||
|
id="stop62860-5-3"
|
||||||
|
offset="1"
|
||||||
|
style="stop-color:#f5f5f4;stop-opacity:1" />
|
||||||
|
</linearGradient>
|
||||||
|
<inkscape:path-effect
|
||||||
|
is_visible="true"
|
||||||
|
id="path-effect62989-8-0"
|
||||||
|
effect="spiro" />
|
||||||
|
<clipPath
|
||||||
|
clipPathUnits="userSpaceOnUse"
|
||||||
|
id="clipPath65663">
|
||||||
|
<rect
|
||||||
|
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:new"
|
||||||
|
id="rect65665"
|
||||||
|
width="96.999924"
|
||||||
|
height="24.292892"
|
||||||
|
x="708.71954"
|
||||||
|
y="406.96973"
|
||||||
|
rx="3.1139846"
|
||||||
|
ry="1.9595497"
|
||||||
|
inkscape:export-filename="/home/lapo.fedora/SparkleShare/gnome-mockups/content selection/content-selection.png"
|
||||||
|
inkscape:export-xdpi="90"
|
||||||
|
inkscape:export-ydpi="90" />
|
||||||
|
</clipPath>
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient38513"
|
||||||
|
id="linearGradient38519"
|
||||||
|
x1="690"
|
||||||
|
y1="506.25049"
|
||||||
|
x2="690"
|
||||||
|
y2="480.93414"
|
||||||
|
gradientUnits="userSpaceOnUse" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
id="linearGradient38513">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#729fcf;stop-opacity:1"
|
||||||
|
offset="0"
|
||||||
|
id="stop38515" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#6f9ccd;stop-opacity:1"
|
||||||
|
offset="1"
|
||||||
|
id="stop38517" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
gradientTransform="translate(-644,-483)"
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient38513"
|
||||||
|
id="linearGradient38519-3"
|
||||||
|
x1="690"
|
||||||
|
y1="506.25049"
|
||||||
|
x2="690"
|
||||||
|
y2="480.93414"
|
||||||
|
gradientUnits="userSpaceOnUse" />
|
||||||
|
</defs>
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="1"
|
||||||
|
inkscape:cx="20.775745"
|
||||||
|
inkscape:cy="7.0434022"
|
||||||
|
inkscape:document-units="px"
|
||||||
|
inkscape:current-layer="g62929"
|
||||||
|
showgrid="false"
|
||||||
|
borderlayer="true"
|
||||||
|
inkscape:showpageshadow="false"
|
||||||
|
inkscape:snap-nodes="false"
|
||||||
|
inkscape:snap-bbox="true"
|
||||||
|
inkscape:bbox-paths="true"
|
||||||
|
inkscape:snap-others="false"
|
||||||
|
inkscape:window-width="2560"
|
||||||
|
inkscape:window-height="1342"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="28"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
showborder="false">
|
||||||
|
<inkscape:grid
|
||||||
|
type="xygrid"
|
||||||
|
id="grid11512" />
|
||||||
|
</sodipodi:namedview>
|
||||||
|
<metadata
|
||||||
|
id="metadata10870">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(0,-1030.3622)">
|
||||||
|
<g
|
||||||
|
inkscape:export-ydpi="90"
|
||||||
|
inkscape:export-xdpi="90"
|
||||||
|
inkscape:export-filename="/home/lapo.fedora/SparkleShare/gnome-mockups/system-settings/network/network-panel-summary.png"
|
||||||
|
style="display:inline"
|
||||||
|
id="g62929"
|
||||||
|
transform="translate(-643.91421,517.29894)">
|
||||||
|
<g
|
||||||
|
transform="translate(0,30)"
|
||||||
|
id="g62931">
|
||||||
|
<rect
|
||||||
|
style="fill:url(#linearGradient38519);fill-opacity:1;stroke:#3465a4;stroke-width:1;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill-rule:nonzero;stroke-linejoin:miter;stroke-dashoffset:0;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;filter-blend-mode:normal;filter-gaussianBlur-deviation:0;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
id="rect62935"
|
||||||
|
width="63.856125"
|
||||||
|
height="21.093594"
|
||||||
|
x="644.5"
|
||||||
|
y="483.5"
|
||||||
|
rx="2"
|
||||||
|
ry="2" />
|
||||||
|
<rect
|
||||||
|
style="fill:url(#linearGradient62981-1-1);fill-opacity:1;stroke:#3465a4;stroke-width:1;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
|
||||||
|
id="rect62937"
|
||||||
|
width="29.97398"
|
||||||
|
height="17.022524"
|
||||||
|
x="676.49646"
|
||||||
|
y="485.67679"
|
||||||
|
rx="1"
|
||||||
|
ry="1" />
|
||||||
|
<g
|
||||||
|
transform="translate(-7.9861743,-1.9445437)"
|
||||||
|
id="g62939" />
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
inkscape:original-d="m 677.59874,486.57192 27.94632,0"
|
||||||
|
inkscape:path-effect="#path-effect62989-8-0"
|
||||||
|
id="path62947"
|
||||||
|
d="m 677.59874,486.57192 27.94632,0"
|
||||||
|
style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
|
||||||
|
</g>
|
||||||
|
<text
|
||||||
|
transform="scale(1.0113976,0.98873084)"
|
||||||
|
sodipodi:linespacing="125%"
|
||||||
|
id="text62949-7"
|
||||||
|
y="534.96918"
|
||||||
|
x="646.71399"
|
||||||
|
style="font-size:10.01104736px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#3465a4;fill-opacity:1;stroke:none;display:inline;font-family:Cantarell;-inkscape-font-specification:Cantarell Bold;"
|
||||||
|
xml:space="preserve"><tspan
|
||||||
|
y="534.96918"
|
||||||
|
x="646.71399"
|
||||||
|
id="tspan62951-7"
|
||||||
|
sodipodi:role="line">ON</tspan></text>
|
||||||
|
<text
|
||||||
|
transform="scale(1.0113976,0.98873084)"
|
||||||
|
sodipodi:linespacing="125%"
|
||||||
|
id="text62949"
|
||||||
|
y="533.94482"
|
||||||
|
x="646.71399"
|
||||||
|
style="font-size:10.01104736px;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="533.94482"
|
||||||
|
x="646.71399"
|
||||||
|
id="tspan62951"
|
||||||
|
sodipodi:role="line">ON</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 7.5 KiB |
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"parentMode": "user",
|
||||||
|
"stylesheetName": "gnome-classic.css",
|
||||||
|
"hasOverview": false,
|
||||||
|
"enabledExtensions": [@CLASSIC_EXTENSIONS@],
|
||||||
|
"panel": { "left": ["appMenu"],
|
||||||
|
"center": [],
|
||||||
|
"right": ["a11y", "keyboard", "dateMenu", "aggregateMenu"]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
@import url("gnome-classic.css");
|
||||||
|
|
||||||
|
stage {
|
||||||
|
-st-icon-style: symbolic;
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
[Desktop Entry]
|
||||||
|
Name=GNOME Classic
|
||||||
|
Comment=This session logs you into GNOME Classic
|
||||||
|
Exec=env GNOME_SHELL_SESSION_MODE=classic gnome-session --session gnome-classic
|
||||||
|
TryExec=gnome-session
|
||||||
|
Type=Application
|
||||||
|
DesktopNames=GNOME-Classic;GNOME;
|
||||||
@@ -0,0 +1,96 @@
|
|||||||
|
/* Use the gnome-shell theme, but with light colors */
|
||||||
|
$variant: 'light';
|
||||||
|
|
||||||
|
@import "gnome-shell-sass/_colors"; //use gtk colors
|
||||||
|
@import "gnome-shell-sass/_drawing";
|
||||||
|
@import "gnome-shell-sass/_common";
|
||||||
|
@import "gnome-shell-sass/_widgets";
|
||||||
|
|
||||||
|
/* Overrides */
|
||||||
|
|
||||||
|
#panel, #panel.solid {
|
||||||
|
font-weight: normal;
|
||||||
|
background-color: $bg_color;
|
||||||
|
background-gradient-direction: vertical;
|
||||||
|
background-gradient-end: darken($bg_color,5%);
|
||||||
|
border-top-color: #666; /* we don't support non-uniform border-colors and
|
||||||
|
use the top border color for any border, so we
|
||||||
|
need to set it even if all we want is a bottom
|
||||||
|
border */
|
||||||
|
border-bottom: 1px solid #666;
|
||||||
|
app-icon-bottom-clip: 0px;
|
||||||
|
&:overview {
|
||||||
|
background-color: #000;
|
||||||
|
background-gradient-end: #000;
|
||||||
|
border-top-color: #000;
|
||||||
|
border-bottom: 1px solid #000;
|
||||||
|
.panel-button { color: #fff; }
|
||||||
|
}
|
||||||
|
|
||||||
|
.panel-button {
|
||||||
|
-natural-hpadding: 8px;
|
||||||
|
-minimum-hpadding: 4px;
|
||||||
|
font-weight: normal;
|
||||||
|
color: $fg_color;
|
||||||
|
text-shadow: none;
|
||||||
|
&:hover {
|
||||||
|
color: lighten($fg_color,10%);
|
||||||
|
text-shadow: none;
|
||||||
|
& .system-status-icon { icon-shadow: none; }
|
||||||
|
}
|
||||||
|
&:active, &:overview, &:focus, &:checked {
|
||||||
|
// Trick due to St limitations. It needs a background to draw
|
||||||
|
// a box-shadow
|
||||||
|
background-color: $selected_bg_color;
|
||||||
|
color: $selected_fg_color;
|
||||||
|
box-shadow: none;
|
||||||
|
& > .system-status-icon { icon-shadow: none; }
|
||||||
|
}
|
||||||
|
|
||||||
|
.app-menu-icon { width: 0; height: 0; margin: 0; } // shell's display:none; :D
|
||||||
|
|
||||||
|
.system-status-icon {
|
||||||
|
icon-shadow: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.panel-corner,
|
||||||
|
.panel-corner:active,
|
||||||
|
.panel-corner:overview,
|
||||||
|
.panel-corner:focus {
|
||||||
|
-panel-corner-radius: 0;
|
||||||
|
}
|
||||||
|
&.lock-screen,
|
||||||
|
&.unlock-screen,
|
||||||
|
&.login-screen {
|
||||||
|
background-color: transparentize($bg_color, 0.5);
|
||||||
|
background-gradient-start: transparentize($bg_color, 0.5);
|
||||||
|
background-gradient-end: transparentize($bg_color, 0.5);
|
||||||
|
border-bottom: none;
|
||||||
|
.panel-button { color: $osd_fg_color; }
|
||||||
|
}
|
||||||
|
.popup-menu-arrow { width: 0; height: 0; } // shell's display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#appMenu {
|
||||||
|
padding: 0 8px 0 8px;
|
||||||
|
spinner-image: url("classic-process-working.svg");
|
||||||
|
}
|
||||||
|
.tile-preview-left.on-primary,
|
||||||
|
.tile-preview-right.on-primary,
|
||||||
|
.tile-preview-left.tile-preview-right.on-primary {
|
||||||
|
/* keep in sync with -panel-corner-radius */
|
||||||
|
border-radius: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@each $v in us, intl {
|
||||||
|
.toggle-switch-#{$v} {
|
||||||
|
background-image: url("classic-toggle-off-#{$v}.svg");
|
||||||
|
&:checked { background-image: url("classic-toggle-on-#{$v}.svg"); }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.calendar-day-with-events {
|
||||||
|
background-image: url("calendar-today.svg");
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
[GNOME Session]
|
||||||
|
Name=GNOME Classic
|
||||||
|
RequiredComponents=org.gnome.Shell;org.gnome.SettingsDaemon.A11ySettings;org.gnome.SettingsDaemon.Color;org.gnome.SettingsDaemon.Datetime;org.gnome.SettingsDaemon.Housekeeping;org.gnome.SettingsDaemon.Keyboard;org.gnome.SettingsDaemon.MediaKeys;org.gnome.SettingsDaemon.Power;org.gnome.SettingsDaemon.PrintNotifications;org.gnome.SettingsDaemon.Rfkill;org.gnome.SettingsDaemon.ScreensaverProxy;org.gnome.SettingsDaemon.Sharing;org.gnome.SettingsDaemon.Smartcard;org.gnome.SettingsDaemon.Sound;org.gnome.SettingsDaemon.Wacom;org.gnome.SettingsDaemon.XSettings;
|
||||||
@@ -0,0 +1,339 @@
|
|||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
Version 2, June 1991
|
||||||
|
|
||||||
|
Copyright (C) 1989, 1991 Free Software Foundation, Inc. <http://fsf.org>
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
Preamble
|
||||||
|
|
||||||
|
The licenses for most software are designed to take away your
|
||||||
|
freedom to share and change it. By contrast, the GNU General Public
|
||||||
|
License is intended to guarantee your freedom to share and change free
|
||||||
|
software--to make sure the software is free for all its users. This
|
||||||
|
General Public License applies to most of the Free Software
|
||||||
|
Foundation's software and to any other program whose authors commit to
|
||||||
|
using it. (Some other Free Software Foundation software is covered by
|
||||||
|
the GNU Library General Public License instead.) You can apply it to
|
||||||
|
your programs, too.
|
||||||
|
|
||||||
|
When we speak of free software, we are referring to freedom, not
|
||||||
|
price. Our General Public Licenses are designed to make sure that you
|
||||||
|
have the freedom to distribute copies of free software (and charge for
|
||||||
|
this service if you wish), that you receive source code or can get it
|
||||||
|
if you want it, that you can change the software or use pieces of it
|
||||||
|
in new free programs; and that you know you can do these things.
|
||||||
|
|
||||||
|
To protect your rights, we need to make restrictions that forbid
|
||||||
|
anyone to deny you these rights or to ask you to surrender the rights.
|
||||||
|
These restrictions translate to certain responsibilities for you if you
|
||||||
|
distribute copies of the software, or if you modify it.
|
||||||
|
|
||||||
|
For example, if you distribute copies of such a program, whether
|
||||||
|
gratis or for a fee, you must give the recipients all the rights that
|
||||||
|
you have. You must make sure that they, too, receive or can get the
|
||||||
|
source code. And you must show them these terms so they know their
|
||||||
|
rights.
|
||||||
|
|
||||||
|
We protect your rights with two steps: (1) copyright the software, and
|
||||||
|
(2) offer you this license which gives you legal permission to copy,
|
||||||
|
distribute and/or modify the software.
|
||||||
|
|
||||||
|
Also, for each author's protection and ours, we want to make certain
|
||||||
|
that everyone understands that there is no warranty for this free
|
||||||
|
software. If the software is modified by someone else and passed on, we
|
||||||
|
want its recipients to know that what they have is not the original, so
|
||||||
|
that any problems introduced by others will not reflect on the original
|
||||||
|
authors' reputations.
|
||||||
|
|
||||||
|
Finally, any free program is threatened constantly by software
|
||||||
|
patents. We wish to avoid the danger that redistributors of a free
|
||||||
|
program will individually obtain patent licenses, in effect making the
|
||||||
|
program proprietary. To prevent this, we have made it clear that any
|
||||||
|
patent must be licensed for everyone's free use or not licensed at all.
|
||||||
|
|
||||||
|
The precise terms and conditions for copying, distribution and
|
||||||
|
modification follow.
|
||||||
|
|
||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
|
|
||||||
|
0. This License applies to any program or other work which contains
|
||||||
|
a notice placed by the copyright holder saying it may be distributed
|
||||||
|
under the terms of this General Public License. The "Program", below,
|
||||||
|
refers to any such program or work, and a "work based on the Program"
|
||||||
|
means either the Program or any derivative work under copyright law:
|
||||||
|
that is to say, a work containing the Program or a portion of it,
|
||||||
|
either verbatim or with modifications and/or translated into another
|
||||||
|
language. (Hereinafter, translation is included without limitation in
|
||||||
|
the term "modification".) Each licensee is addressed as "you".
|
||||||
|
|
||||||
|
Activities other than copying, distribution and modification are not
|
||||||
|
covered by this License; they are outside its scope. The act of
|
||||||
|
running the Program is not restricted, and the output from the Program
|
||||||
|
is covered only if its contents constitute a work based on the
|
||||||
|
Program (independent of having been made by running the Program).
|
||||||
|
Whether that is true depends on what the Program does.
|
||||||
|
|
||||||
|
1. You may copy and distribute verbatim copies of the Program's
|
||||||
|
source code as you receive it, in any medium, provided that you
|
||||||
|
conspicuously and appropriately publish on each copy an appropriate
|
||||||
|
copyright notice and disclaimer of warranty; keep intact all the
|
||||||
|
notices that refer to this License and to the absence of any warranty;
|
||||||
|
and give any other recipients of the Program a copy of this License
|
||||||
|
along with the Program.
|
||||||
|
|
||||||
|
You may charge a fee for the physical act of transferring a copy, and
|
||||||
|
you may at your option offer warranty protection in exchange for a fee.
|
||||||
|
|
||||||
|
2. You may modify your copy or copies of the Program or any portion
|
||||||
|
of it, thus forming a work based on the Program, and copy and
|
||||||
|
distribute such modifications or work under the terms of Section 1
|
||||||
|
above, provided that you also meet all of these conditions:
|
||||||
|
|
||||||
|
a) You must cause the modified files to carry prominent notices
|
||||||
|
stating that you changed the files and the date of any change.
|
||||||
|
|
||||||
|
b) You must cause any work that you distribute or publish, that in
|
||||||
|
whole or in part contains or is derived from the Program or any
|
||||||
|
part thereof, to be licensed as a whole at no charge to all third
|
||||||
|
parties under the terms of this License.
|
||||||
|
|
||||||
|
c) If the modified program normally reads commands interactively
|
||||||
|
when run, you must cause it, when started running for such
|
||||||
|
interactive use in the most ordinary way, to print or display an
|
||||||
|
announcement including an appropriate copyright notice and a
|
||||||
|
notice that there is no warranty (or else, saying that you provide
|
||||||
|
a warranty) and that users may redistribute the program under
|
||||||
|
these conditions, and telling the user how to view a copy of this
|
||||||
|
License. (Exception: if the Program itself is interactive but
|
||||||
|
does not normally print such an announcement, your work based on
|
||||||
|
the Program is not required to print an announcement.)
|
||||||
|
|
||||||
|
These requirements apply to the modified work as a whole. If
|
||||||
|
identifiable sections of that work are not derived from the Program,
|
||||||
|
and can be reasonably considered independent and separate works in
|
||||||
|
themselves, then this License, and its terms, do not apply to those
|
||||||
|
sections when you distribute them as separate works. But when you
|
||||||
|
distribute the same sections as part of a whole which is a work based
|
||||||
|
on the Program, the distribution of the whole must be on the terms of
|
||||||
|
this License, whose permissions for other licensees extend to the
|
||||||
|
entire whole, and thus to each and every part regardless of who wrote it.
|
||||||
|
|
||||||
|
Thus, it is not the intent of this section to claim rights or contest
|
||||||
|
your rights to work written entirely by you; rather, the intent is to
|
||||||
|
exercise the right to control the distribution of derivative or
|
||||||
|
collective works based on the Program.
|
||||||
|
|
||||||
|
In addition, mere aggregation of another work not based on the Program
|
||||||
|
with the Program (or with a work based on the Program) on a volume of
|
||||||
|
a storage or distribution medium does not bring the other work under
|
||||||
|
the scope of this License.
|
||||||
|
|
||||||
|
3. You may copy and distribute the Program (or a work based on it,
|
||||||
|
under Section 2) in object code or executable form under the terms of
|
||||||
|
Sections 1 and 2 above provided that you also do one of the following:
|
||||||
|
|
||||||
|
a) Accompany it with the complete corresponding machine-readable
|
||||||
|
source code, which must be distributed under the terms of Sections
|
||||||
|
1 and 2 above on a medium customarily used for software interchange; or,
|
||||||
|
|
||||||
|
b) Accompany it with a written offer, valid for at least three
|
||||||
|
years, to give any third party, for a charge no more than your
|
||||||
|
cost of physically performing source distribution, a complete
|
||||||
|
machine-readable copy of the corresponding source code, to be
|
||||||
|
distributed under the terms of Sections 1 and 2 above on a medium
|
||||||
|
customarily used for software interchange; or,
|
||||||
|
|
||||||
|
c) Accompany it with the information you received as to the offer
|
||||||
|
to distribute corresponding source code. (This alternative is
|
||||||
|
allowed only for noncommercial distribution and only if you
|
||||||
|
received the program in object code or executable form with such
|
||||||
|
an offer, in accord with Subsection b above.)
|
||||||
|
|
||||||
|
The source code for a work means the preferred form of the work for
|
||||||
|
making modifications to it. For an executable work, complete source
|
||||||
|
code means all the source code for all modules it contains, plus any
|
||||||
|
associated interface definition files, plus the scripts used to
|
||||||
|
control compilation and installation of the executable. However, as a
|
||||||
|
special exception, the source code distributed need not include
|
||||||
|
anything that is normally distributed (in either source or binary
|
||||||
|
form) with the major components (compiler, kernel, and so on) of the
|
||||||
|
operating system on which the executable runs, unless that component
|
||||||
|
itself accompanies the executable.
|
||||||
|
|
||||||
|
If distribution of executable or object code is made by offering
|
||||||
|
access to copy from a designated place, then offering equivalent
|
||||||
|
access to copy the source code from the same place counts as
|
||||||
|
distribution of the source code, even though third parties are not
|
||||||
|
compelled to copy the source along with the object code.
|
||||||
|
|
||||||
|
4. You may not copy, modify, sublicense, or distribute the Program
|
||||||
|
except as expressly provided under this License. Any attempt
|
||||||
|
otherwise to copy, modify, sublicense or distribute the Program is
|
||||||
|
void, and will automatically terminate your rights under this License.
|
||||||
|
However, parties who have received copies, or rights, from you under
|
||||||
|
this License will not have their licenses terminated so long as such
|
||||||
|
parties remain in full compliance.
|
||||||
|
|
||||||
|
5. You are not required to accept this License, since you have not
|
||||||
|
signed it. However, nothing else grants you permission to modify or
|
||||||
|
distribute the Program or its derivative works. These actions are
|
||||||
|
prohibited by law if you do not accept this License. Therefore, by
|
||||||
|
modifying or distributing the Program (or any work based on the
|
||||||
|
Program), you indicate your acceptance of this License to do so, and
|
||||||
|
all its terms and conditions for copying, distributing or modifying
|
||||||
|
the Program or works based on it.
|
||||||
|
|
||||||
|
6. Each time you redistribute the Program (or any work based on the
|
||||||
|
Program), the recipient automatically receives a license from the
|
||||||
|
original licensor to copy, distribute or modify the Program subject to
|
||||||
|
these terms and conditions. You may not impose any further
|
||||||
|
restrictions on the recipients' exercise of the rights granted herein.
|
||||||
|
You are not responsible for enforcing compliance by third parties to
|
||||||
|
this License.
|
||||||
|
|
||||||
|
7. If, as a consequence of a court judgment or allegation of patent
|
||||||
|
infringement or for any other reason (not limited to patent issues),
|
||||||
|
conditions are imposed on you (whether by court order, agreement or
|
||||||
|
otherwise) that contradict the conditions of this License, they do not
|
||||||
|
excuse you from the conditions of this License. If you cannot
|
||||||
|
distribute so as to satisfy simultaneously your obligations under this
|
||||||
|
License and any other pertinent obligations, then as a consequence you
|
||||||
|
may not distribute the Program at all. For example, if a patent
|
||||||
|
license would not permit royalty-free redistribution of the Program by
|
||||||
|
all those who receive copies directly or indirectly through you, then
|
||||||
|
the only way you could satisfy both it and this License would be to
|
||||||
|
refrain entirely from distribution of the Program.
|
||||||
|
|
||||||
|
If any portion of this section is held invalid or unenforceable under
|
||||||
|
any particular circumstance, the balance of the section is intended to
|
||||||
|
apply and the section as a whole is intended to apply in other
|
||||||
|
circumstances.
|
||||||
|
|
||||||
|
It is not the purpose of this section to induce you to infringe any
|
||||||
|
patents or other property right claims or to contest validity of any
|
||||||
|
such claims; this section has the sole purpose of protecting the
|
||||||
|
integrity of the free software distribution system, which is
|
||||||
|
implemented by public license practices. Many people have made
|
||||||
|
generous contributions to the wide range of software distributed
|
||||||
|
through that system in reliance on consistent application of that
|
||||||
|
system; it is up to the author/donor to decide if he or she is willing
|
||||||
|
to distribute software through any other system and a licensee cannot
|
||||||
|
impose that choice.
|
||||||
|
|
||||||
|
This section is intended to make thoroughly clear what is believed to
|
||||||
|
be a consequence of the rest of this License.
|
||||||
|
|
||||||
|
8. If the distribution and/or use of the Program is restricted in
|
||||||
|
certain countries either by patents or by copyrighted interfaces, the
|
||||||
|
original copyright holder who places the Program under this License
|
||||||
|
may add an explicit geographical distribution limitation excluding
|
||||||
|
those countries, so that distribution is permitted only in or among
|
||||||
|
countries not thus excluded. In such case, this License incorporates
|
||||||
|
the limitation as if written in the body of this License.
|
||||||
|
|
||||||
|
9. The Free Software Foundation may publish revised and/or new versions
|
||||||
|
of the General Public License from time to time. Such new versions will
|
||||||
|
be similar in spirit to the present version, but may differ in detail to
|
||||||
|
address new problems or concerns.
|
||||||
|
|
||||||
|
Each version is given a distinguishing version number. If the Program
|
||||||
|
specifies a version number of this License which applies to it and "any
|
||||||
|
later version", you have the option of following the terms and conditions
|
||||||
|
either of that version or of any later version published by the Free
|
||||||
|
Software Foundation. If the Program does not specify a version number of
|
||||||
|
this License, you may choose any version ever published by the Free Software
|
||||||
|
Foundation.
|
||||||
|
|
||||||
|
10. If you wish to incorporate parts of the Program into other free
|
||||||
|
programs whose distribution conditions are different, write to the author
|
||||||
|
to ask for permission. For software which is copyrighted by the Free
|
||||||
|
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||||
|
make exceptions for this. Our decision will be guided by the two goals
|
||||||
|
of preserving the free status of all derivatives of our free software and
|
||||||
|
of promoting the sharing and reuse of software generally.
|
||||||
|
|
||||||
|
NO WARRANTY
|
||||||
|
|
||||||
|
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||||
|
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||||
|
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||||
|
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||||
|
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||||
|
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||||
|
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||||
|
REPAIR OR CORRECTION.
|
||||||
|
|
||||||
|
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||||
|
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||||
|
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||||
|
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||||
|
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||||
|
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||||
|
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||||
|
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
How to Apply These Terms to Your New Programs
|
||||||
|
|
||||||
|
If you develop a new program, and you want it to be of the greatest
|
||||||
|
possible use to the public, the best way to achieve this is to make it
|
||||||
|
free software which everyone can redistribute and change under these terms.
|
||||||
|
|
||||||
|
To do so, attach the following notices to the program. It is safest
|
||||||
|
to attach them to the start of each source file to most effectively
|
||||||
|
convey the exclusion of warranty; and each file should have at least
|
||||||
|
the "copyright" line and a pointer to where the full notice is found.
|
||||||
|
|
||||||
|
<one line to give the program's name and a brief idea of what it does.>
|
||||||
|
Copyright (C) <year> <name of author>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU 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 General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
|
||||||
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
|
If the program is interactive, make it output a short notice like this
|
||||||
|
when it starts in an interactive mode:
|
||||||
|
|
||||||
|
Gnomovision version 69, Copyright (C) year name of author
|
||||||
|
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||||
|
This is free software, and you are welcome to redistribute it
|
||||||
|
under certain conditions; type `show c' for details.
|
||||||
|
|
||||||
|
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||||
|
parts of the General Public License. Of course, the commands you use may
|
||||||
|
be called something other than `show w' and `show c'; they could even be
|
||||||
|
mouse-clicks or menu items--whatever suits your program.
|
||||||
|
|
||||||
|
You should also get your employer (if you work as a programmer) or your
|
||||||
|
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||||
|
necessary. Here is a sample; alter the names:
|
||||||
|
|
||||||
|
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||||
|
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||||
|
|
||||||
|
<signature of Ty Coon>, 1 April 1989
|
||||||
|
Ty Coon, President of Vice
|
||||||
|
|
||||||
|
This General Public License does not permit incorporating your program into
|
||||||
|
proprietary programs. If your program is a subroutine library, you may
|
||||||
|
consider it more useful to permit linking proprietary applications with the
|
||||||
|
library. If this is what you want to do, use the GNU Library General
|
||||||
|
Public License instead of this License.
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
# GNOME Shell Sass
|
||||||
|
GNOME Shell Sass is a project intended to allow the sharing of the
|
||||||
|
theme sources in sass between gnome-shell and other projects like
|
||||||
|
gnome-shell-extensions.
|
||||||
|
|
||||||
|
Any changes should be done in the [GNOME Shell subtree][shell-subtree]
|
||||||
|
and not the stand-alone [gnome-shell-sass repository][sass-repo]. They
|
||||||
|
will then be synchronized periodically before releases.
|
||||||
|
|
||||||
|
## License
|
||||||
|
GNOME Shell Sass is distributed under the terms of the GNU General Public
|
||||||
|
License, version 2 or later. See the [COPYING][license] file for details.
|
||||||
|
|
||||||
|
[shell-subtree]: https://gitlab.gnome.org/GNOME/gnome-shell/tree/master/data/theme/gnome-shell-sass
|
||||||
|
[sass-repo]: https://gitlab.gnome.org/GNOME/gnome-shell-sass
|
||||||
|
[license]: COPYING
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
// When color definition differs for dark and light variant,
|
||||||
|
// it gets @if ed depending on $variant
|
||||||
|
|
||||||
|
$base_color: if($variant == 'light', #fff, lighten(desaturate(#241f31, 20%), 2%));
|
||||||
|
$bg_color: if($variant == 'light', #f6f5f4, darken(desaturate(#3d3846, 100%), 4%));
|
||||||
|
$fg_color: if($variant == 'light', #2e3436, #eeeeec);
|
||||||
|
|
||||||
|
$selected_fg_color: #fff;
|
||||||
|
$selected_bg_color: if($variant == 'light', #3584e4, darken(#3584e4, 10%));
|
||||||
|
$selected_borders_color: if($variant== 'light', darken($selected_bg_color, 15%), darken($selected_bg_color, 30%));
|
||||||
|
$borders_color: if($variant == 'light', darken($bg_color, 18%), darken($bg_color, 8%));
|
||||||
|
$borders_edge: if($variant == 'light', rgba(255,255,255,0.8), transparentize($fg_color, 0.93));
|
||||||
|
$link_color: if($variant == 'light', darken($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;
|
||||||
|
|
||||||
|
$warning_color: #f57900;
|
||||||
|
$error_color: #ff8080;
|
||||||
|
$success_color: if($variant == 'light', #33d17a, darken(#33d17a, 10%));
|
||||||
|
$destructive_color: if($variant == 'light', #e01b24, darken(#e01b24, 10%));
|
||||||
|
|
||||||
|
$osd_fg_color: #eeeeec;
|
||||||
|
$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_outer_borders_color: transparentize(white, 0.84);
|
||||||
|
|
||||||
|
$shadow_color: if($variant == 'light', rgba(0,0,0,0.1), rgba(0,0,0,0.2));
|
||||||
|
|
||||||
|
//insensitive state derived colors
|
||||||
|
$insensitive_fg_color: mix($fg_color, $bg_color, 50%);
|
||||||
|
$insensitive_bg_color: mix($bg_color, $base_color, 60%);
|
||||||
|
$insensitive_borders_color: mix($borders_color, $base_color, 60%);
|
||||||
|
|
||||||
|
//colors for the backdrop state, derived from the main colors.
|
||||||
|
$backdrop_base_color: if($variant =='light', darken($base_color,1%), lighten($base_color,1%));
|
||||||
|
$backdrop_bg_color: $bg_color;
|
||||||
|
$backdrop_fg_color: mix($fg_color, $backdrop_bg_color, 80%);
|
||||||
|
$backdrop_insensitive_color: if($variant =='light', darken($backdrop_bg_color,15%), lighten($backdrop_bg_color,15%));
|
||||||
|
$backdrop_borders_color: mix($borders_color, $bg_color, 90%);
|
||||||
|
$backdrop_dark_fill: mix($backdrop_borders_color,$backdrop_bg_color, 35%);
|
||||||
@@ -0,0 +1,177 @@
|
|||||||
|
//This is the RIGHT PLACE to edit the stylesheet
|
||||||
|
|
||||||
|
//let's start by telling people not to edit the generated CSS:
|
||||||
|
$cakeisalie: "This stylesheet is generated, DO NOT EDIT";
|
||||||
|
/* #{$cakeisalie} */
|
||||||
|
|
||||||
|
/* Copyright 2009, 2015 Red Hat, Inc.
|
||||||
|
*
|
||||||
|
* Portions adapted from Mx's data/style/default.css
|
||||||
|
* Copyright 2009 Intel Corporation
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms and conditions of the GNU Lesser General Public License,
|
||||||
|
* version 2.1, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope 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, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Global Values */
|
||||||
|
|
||||||
|
// padding, margin and spacing
|
||||||
|
$base_padding: 6px;
|
||||||
|
$base_margin: 4px;
|
||||||
|
$base_spacing: 6px;
|
||||||
|
|
||||||
|
// border radii
|
||||||
|
$base_border_radius: 5px;
|
||||||
|
|
||||||
|
$modal_radius:$base_border_radius * 2;
|
||||||
|
|
||||||
|
// non-standard colors
|
||||||
|
$bubble_borders_color: lighten($borders_color, if($variant=='light', 0%, 5%));
|
||||||
|
// $bubble_borders_color: if($variant == 'light', rgba(255,255,255,0.1), rgba(0,0,0,0.3));
|
||||||
|
|
||||||
|
// hover
|
||||||
|
$hover_bg_color: if($variant=='light', darken($bg_color, 3%), lighten($bg_color, 5%));
|
||||||
|
$hover_fg_color: if($variant=='light', darken($fg_color, 5%), lighten($fg_color, 5%));
|
||||||
|
$hover_borders_color: lighten($borders_color,if($variant=='light', 5%, 3%));
|
||||||
|
|
||||||
|
// active
|
||||||
|
$active_bg_color: if($variant == 'light', darken($bg_color, 7%), darken($bg_color, 9%));
|
||||||
|
$active_fg_color: darken($fg_color,if($variant=='light', 5%, 3%));
|
||||||
|
$active_borders_color: darken($borders_color,if($variant=='light', 5%, 3%));
|
||||||
|
|
||||||
|
// fonts
|
||||||
|
$base_font_size: 11;
|
||||||
|
$text_shadow_color: if($variant == 'light', rgba(255,255,255,0.3), rgba(0,0,0,0.2));
|
||||||
|
|
||||||
|
// icons
|
||||||
|
$base_icon_size: 1.09em;
|
||||||
|
// $base_icon_size: 16px;
|
||||||
|
|
||||||
|
// Stage
|
||||||
|
stage {
|
||||||
|
@include fontsize($base_font_size);
|
||||||
|
color: $fg_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Common Stylings */
|
||||||
|
|
||||||
|
// Text
|
||||||
|
%status_text {
|
||||||
|
font-size: 2em;
|
||||||
|
font-weight: bold;
|
||||||
|
color: $osd_fg_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
// osd panels
|
||||||
|
%osd_panel {
|
||||||
|
color: $osd_fg_color;
|
||||||
|
background-color: $osd_bg_color;
|
||||||
|
border: 1px solid $osd_outer_borders_color;
|
||||||
|
border-radius: $base_border_radius * 2 + 4px;
|
||||||
|
padding: $base_padding * 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Overview panels
|
||||||
|
// for the dash and workspace switcher
|
||||||
|
%overview_panel {
|
||||||
|
color: $osd_fg_color;
|
||||||
|
background-color: transparentize($osd_bg_color, 0.2);
|
||||||
|
border: 1px solid $osd_outer_borders_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
// icon tiles
|
||||||
|
%icon_tile {
|
||||||
|
border-radius: $base_border_radius + 4px;
|
||||||
|
padding: $base_padding;
|
||||||
|
border: 2px solid transparent;
|
||||||
|
transition-duration: 100ms;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
// dialogs
|
||||||
|
%bubble_panel {
|
||||||
|
color: $fg_color;
|
||||||
|
background-color: $bg_color;
|
||||||
|
border: 1px solid if($variant=='light', rgba(0,0,0, 0.6), $borders_color);
|
||||||
|
}
|
||||||
|
|
||||||
|
// button styling
|
||||||
|
%button {
|
||||||
|
border-radius: $base_border_radius;
|
||||||
|
border-style: solid;
|
||||||
|
border-width: 1px;
|
||||||
|
min-height: 22px;
|
||||||
|
padding: $base_padding * 0.5 $base_padding * 4;
|
||||||
|
|
||||||
|
@include button(normal);
|
||||||
|
&:focus { @include button(focus);}
|
||||||
|
&:hover { @include button(hover);}
|
||||||
|
&:insensitive { @include button(insensitive);}
|
||||||
|
&:active { @include button(active);}
|
||||||
|
}
|
||||||
|
|
||||||
|
// buttons in dialogs
|
||||||
|
%bubble_button {
|
||||||
|
@include button(normal, $shadow: none);
|
||||||
|
padding: $base_padding * 2;
|
||||||
|
border-style: solid;
|
||||||
|
border-width: 1px;
|
||||||
|
border-left-width: 0;
|
||||||
|
border-bottom-width: 0;
|
||||||
|
|
||||||
|
&:insensitive { @include button(insensitive, $shadow: none); }
|
||||||
|
&:hover { @include button(hover, $shadow: none); }
|
||||||
|
&:focus { @include button(focus, $shadow: none); }
|
||||||
|
&:active { @include button(active, $shadow: none); }
|
||||||
|
|
||||||
|
// radius is 2 pixel less to fit in bubble
|
||||||
|
&:first-child {
|
||||||
|
border-radius: 0 0 0 $modal_radius - 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:last-child {
|
||||||
|
border-right-width: 0;
|
||||||
|
border-radius: 0 0 $modal_radius - 2px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:first-child:last-child {
|
||||||
|
border-radius: 0 0 $modal_radius - 2px $modal_radius - 2px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// notification styling
|
||||||
|
@mixin notification_bubble($flat: false) {
|
||||||
|
border-width: 1px;
|
||||||
|
border-style: solid;
|
||||||
|
border-radius: $base_border_radius + 2px;
|
||||||
|
margin: $base_margin;
|
||||||
|
|
||||||
|
@if $flat {
|
||||||
|
@include button(undecorated);
|
||||||
|
} @else {
|
||||||
|
@include button(normal);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:focus {
|
||||||
|
@include button(focus);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
@include button(hover);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
@include button(active);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,231 @@
|
|||||||
|
// Drawing mixins
|
||||||
|
|
||||||
|
// generic drawing of more complex things
|
||||||
|
|
||||||
|
@function draw_widget_edge($c:$borders_edge) {
|
||||||
|
// outer highlight "used" on most widgets
|
||||||
|
@return 0 1px $c;
|
||||||
|
}
|
||||||
|
|
||||||
|
// provide font size in rem, with px fallback
|
||||||
|
@mixin fontsize($size: 24, $base: 16) {
|
||||||
|
font-size: round($size) + pt;
|
||||||
|
//font-size: ($size / $base) * 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
@mixin draw_shadows($shadow1, $shadow2:none, $shadow3:none, $shadow4:none) {
|
||||||
|
//
|
||||||
|
// Helper function to stack up to 4 box-shadows;
|
||||||
|
//
|
||||||
|
@if $shadow4!=none { box-shadow: $shadow1, $shadow2, $shadow3, $shadow4; }
|
||||||
|
@else if $shadow3!=none { box-shadow: $shadow1, $shadow2, $shadow3; }
|
||||||
|
@else if $shadow2!=none { box-shadow: $shadow1, $shadow2; }
|
||||||
|
@else { box-shadow: $shadow1; }
|
||||||
|
}
|
||||||
|
|
||||||
|
// entries
|
||||||
|
|
||||||
|
@mixin entry($t, $fc:$selected_bg_color, $edge: $borders_edge) {
|
||||||
|
//
|
||||||
|
// Entries drawing function
|
||||||
|
//
|
||||||
|
// $t: entry type
|
||||||
|
// $fc: focus color
|
||||||
|
// $edge: set to none to not draw the bottom edge or specify a color to not use the default one
|
||||||
|
//
|
||||||
|
// possible $t values:
|
||||||
|
// normal, focus, insensitive
|
||||||
|
//
|
||||||
|
|
||||||
|
@if $t==normal {
|
||||||
|
background-color: $base_color;
|
||||||
|
border-color: $borders_color;
|
||||||
|
|
||||||
|
}
|
||||||
|
@if $t==focus {
|
||||||
|
border-color: if($fc==$selected_bg_color,
|
||||||
|
$selected_borders_color,
|
||||||
|
darken($fc,35%));
|
||||||
|
box-shadow: inset 0 0 0 1px $fc;
|
||||||
|
}
|
||||||
|
@if $t==hover { }
|
||||||
|
@if $t==insensitive {
|
||||||
|
color: $insensitive_fg_color;
|
||||||
|
border-color: $insensitive_bg_color;
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// buttons
|
||||||
|
|
||||||
|
@function draw_border_color ($c) {
|
||||||
|
//
|
||||||
|
// colored buttons want the border form the base color
|
||||||
|
//
|
||||||
|
@return if($variant == 'light', darken($c, 18%), darken($c, 4%));
|
||||||
|
}
|
||||||
|
|
||||||
|
@function draw_text_shadow_color ($tc:$fg_color, $bg:$bg_color) {
|
||||||
|
//
|
||||||
|
// calculate the color of text shadows
|
||||||
|
//
|
||||||
|
// $tc is the text color
|
||||||
|
// $bg is the background color
|
||||||
|
//
|
||||||
|
$lbg: lightness($bg)/100%;
|
||||||
|
@if lightness($tc)<50% { @return rgba(255,255,255,$lbg/($lbg*1.3)); }
|
||||||
|
@else { @return rgba(0,0,0,1-$lbg*0.8); }
|
||||||
|
}
|
||||||
|
|
||||||
|
@function draw_button_hilight_color($c) {
|
||||||
|
//
|
||||||
|
// calculate the right top hilight color for buttons
|
||||||
|
//
|
||||||
|
// $c: base color;
|
||||||
|
//
|
||||||
|
@if lightness($c)>90% { @return white; }
|
||||||
|
@else if lightness($c)>80% { @return rgba(255,255,255, 0.7); }
|
||||||
|
@else if lightness($c)>50% { @return rgba(255,255,255, 0.5); }
|
||||||
|
@else if lightness($c)>40% { @return rgba(255,255,255, 0.3); }
|
||||||
|
@else { @return rgba(255,255,255, 0.1); }
|
||||||
|
}
|
||||||
|
|
||||||
|
@mixin draw_button_text_shadow ($tc:$fg_color, $bg:$bg_color) {
|
||||||
|
//
|
||||||
|
// helper function for the text emboss effect
|
||||||
|
//
|
||||||
|
// $tc is the optional text color, not the shadow color
|
||||||
|
//
|
||||||
|
// TODO: this functions needs a way to deal with special cases
|
||||||
|
//
|
||||||
|
|
||||||
|
$shadow: draw_text_shadow_color($tc, $bg);
|
||||||
|
|
||||||
|
@if lightness($tc)<50% {
|
||||||
|
text-shadow: 0 1px $shadow;
|
||||||
|
icon-shadow: 0 1px $shadow;
|
||||||
|
}
|
||||||
|
@else {
|
||||||
|
text-shadow: 0 -1px $shadow;
|
||||||
|
icon-shadow: 0 -1px $shadow;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@mixin button($t, $c:$bg_color, $tc:$fg_color, $edge: $borders_edge, $shadow: $shadow_color) {
|
||||||
|
//
|
||||||
|
// Button drawing function
|
||||||
|
//
|
||||||
|
// $t: button type,
|
||||||
|
// $c: base button color for colored* types
|
||||||
|
// $tc: optional text color for colored* types
|
||||||
|
// $edge: set to none to not draw the bottom edge or specify a color to not
|
||||||
|
// use the default one
|
||||||
|
// $shadow: set to none to not draw the drop shadow or specify a color to not
|
||||||
|
// use the default one
|
||||||
|
//
|
||||||
|
// possible $t values:
|
||||||
|
// normal, hover, active, insensitive, insensitive-active,
|
||||||
|
// backdrop, backdrop-active, backdrop-insensitive, backdrop-insensitive-active,
|
||||||
|
// osd, osd-hover, osd-active, osd-insensitive, osd-backdrop, undecorated
|
||||||
|
//
|
||||||
|
|
||||||
|
$hilight_color: draw_button_hilight_color($c);
|
||||||
|
$button_edge: if($edge == none, none, draw_widget_edge($edge));
|
||||||
|
$blank_edge: if($edge == none, none, draw_widget_edge(transparentize($edge,1)));
|
||||||
|
$button_shadow: if($shadow == none, none, 0 1px 1px 0 $shadow);
|
||||||
|
|
||||||
|
// normal button
|
||||||
|
@if $t==normal {
|
||||||
|
color: $tc;
|
||||||
|
background-color: lighten($c, 3%);
|
||||||
|
border-color: draw_border_color($c);
|
||||||
|
@include draw_shadows($button_shadow);
|
||||||
|
// box-shadow: 0 1px 1px 0 rgba(0,0,0,0.1);
|
||||||
|
text-shadow: 0 1px $text_shadow_color;
|
||||||
|
icon-shadow: 0 1px $text_shadow_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
// focused button
|
||||||
|
@if $t==focus {
|
||||||
|
color: $tc;
|
||||||
|
text-shadow: 0 1px $text_shadow_color;
|
||||||
|
icon-shadow: 0 1px $text_shadow_color;
|
||||||
|
box-shadow: inset 0 0 0 2px transparentize($selected_bg_color, 0.4);
|
||||||
|
//border-color: $selected_bg_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
// hover button
|
||||||
|
@else if $t==hover {
|
||||||
|
color: $tc;
|
||||||
|
background-color: lighten($c, if($variant == 'light', 8%, 5%));
|
||||||
|
border-color: if($variant == 'light', draw_border_color(lighten($c, 7%)), draw_border_color($c));
|
||||||
|
@include draw_shadows($button_shadow);
|
||||||
|
text-shadow: 0 1px $text_shadow_color;
|
||||||
|
icon-shadow: 0 1px $text_shadow_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
// active button
|
||||||
|
@else if $t==active {
|
||||||
|
color: $tc;
|
||||||
|
background-color: darken($c,3%);
|
||||||
|
border-color: draw_border_color(if($variant == 'light', $c, darken($c,7%)));
|
||||||
|
text-shadow: none;
|
||||||
|
icon-shadow: none;
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
// insensitive button
|
||||||
|
@else if $t==insensitive {
|
||||||
|
color: $insensitive_fg_color;
|
||||||
|
border-color: $insensitive_borders_color;
|
||||||
|
background-color: $insensitive_bg_color;
|
||||||
|
box-shadow: none;
|
||||||
|
text-shadow: none;
|
||||||
|
icon-shadow: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
// reset
|
||||||
|
@else if $t==undecorated {
|
||||||
|
border-color: transparent;
|
||||||
|
background-color: transparent;
|
||||||
|
background-image: none;
|
||||||
|
@include draw_shadows(inset 0 1px rgba(255,255,255,0),$blank_edge);
|
||||||
|
text-shadow: none;
|
||||||
|
icon-shadow: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// overview icons
|
||||||
|
@mixin overview-icon($color) {
|
||||||
|
.overview-icon {
|
||||||
|
@extend %icon_tile;
|
||||||
|
color: $color;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover,
|
||||||
|
&:selected {
|
||||||
|
.overview-icon {
|
||||||
|
background-color: transparentize($color, .9);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&:focus {
|
||||||
|
.overview-icon {
|
||||||
|
background-color: transparentize($color, .7);
|
||||||
|
// border-color: $selected_bg_color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&:drop {
|
||||||
|
.overview-icon {
|
||||||
|
background-color: transparentize($selected_bg_color, .15);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active,
|
||||||
|
&:checked {
|
||||||
|
.overview-icon {
|
||||||
|
background-color: transparentize(darken($osd_bg_color, 10%), .5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
// When color definition differs for dark and light variant,
|
||||||
|
// it gets @if ed depending on $variant
|
||||||
|
|
||||||
|
|
||||||
|
$base_color: #222;
|
||||||
|
$bg_color: #000;
|
||||||
|
$fg_color: #fff;
|
||||||
|
|
||||||
|
$selected_fg_color: #ffffff;
|
||||||
|
$selected_bg_color: darken(#4a90d9,20%);
|
||||||
|
$selected_borders_color: darken($selected_bg_color, 20%);
|
||||||
|
$borders_color: darken($bg_color,12%);
|
||||||
|
$borders_edge: transparentize($fg_color, 0.9);
|
||||||
|
$link_color: lighten($selected_bg_color,20%);
|
||||||
|
$link_visited_color: lighten($selected_bg_color,10%);
|
||||||
|
$top_hilight: $borders_edge;
|
||||||
|
|
||||||
|
$warning_color: #f57900;
|
||||||
|
$error_color: #cc0000;
|
||||||
|
$success_color: darken(#73d216,10%);
|
||||||
|
$destructive_color: darken(#ef2929,10%);
|
||||||
|
|
||||||
|
$osd_fg_color: #eeeeec;
|
||||||
|
$osd_bg_color: #2e3436;
|
||||||
|
$osd_borders_color: rgba(0,0,0, 0.7);
|
||||||
|
$osd_outer_borders_color: rgba(255,255,255, 0.1);
|
||||||
|
|
||||||
|
$shadow_color: rgba(0,0,0, 0.1);
|
||||||
|
|
||||||
|
//insensitive state derived colors
|
||||||
|
$insensitive_fg_color: mix($fg_color, $bg_color, 50%);
|
||||||
|
$insensitive_bg_color: mix($bg_color, $base_color, 60%);
|
||||||
|
$insensitive_borders_color: $borders_color;
|
||||||
|
|
||||||
|
//colors for the backdrop state, derived from the main colors.
|
||||||
|
$backdrop_base_color: lighten($base_color,1%);
|
||||||
|
$backdrop_bg_color: $bg_color;
|
||||||
|
$backdrop_fg_color: mix($fg_color, $backdrop_bg_color, 80%);
|
||||||
|
$backdrop_insensitive_color: lighten($backdrop_bg_color,15%);
|
||||||
|
$backdrop_borders_color: mix($borders_color, $bg_color, 90%);
|
||||||
|
$backdrop_dark_fill: mix($backdrop_borders_color,$backdrop_bg_color, 35%);
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
//
|
||||||
|
// Shell widgets stylesheets are placed in separate .scss files
|
||||||
|
// in 'widgets' and imported into the main stylesheet in this file.
|
||||||
|
// To create or update a widget for the shell modify the list below.
|
||||||
|
//
|
||||||
|
|
||||||
|
/* WIDGETS */
|
||||||
|
|
||||||
|
// Primary widgets
|
||||||
|
@import 'widgets/base';
|
||||||
|
@import 'widgets/entries';
|
||||||
|
@import 'widgets/buttons';
|
||||||
|
@import 'widgets/check-box';
|
||||||
|
@import 'widgets/switches';
|
||||||
|
@import 'widgets/slider';
|
||||||
|
@import 'widgets/scrollbars';
|
||||||
|
// Popovers
|
||||||
|
@import 'widgets/popovers';
|
||||||
|
@import 'widgets/calendar';
|
||||||
|
@import 'widgets/message-list';
|
||||||
|
@import 'widgets/ibus-popup';
|
||||||
|
// Notifications
|
||||||
|
@import 'widgets/notifications';
|
||||||
|
@import 'widgets/hotplug';
|
||||||
|
// Dialogs
|
||||||
|
@import 'widgets/dialogs';
|
||||||
|
@import 'widgets/network-dialog';
|
||||||
|
// OSDs
|
||||||
|
@import 'widgets/osd';
|
||||||
|
@import 'widgets/switcher-popup';
|
||||||
|
@import 'widgets/workspace-switcher';
|
||||||
|
// Panel
|
||||||
|
@import 'widgets/panel';
|
||||||
|
@import 'widgets/corner-ripple';
|
||||||
|
// Overview
|
||||||
|
@import 'widgets/overview';
|
||||||
|
@import 'widgets/window-picker';
|
||||||
|
@import 'widgets/search-entry';
|
||||||
|
@import 'widgets/search-results';
|
||||||
|
@import 'widgets/app-grid';
|
||||||
|
@import 'widgets/dash';
|
||||||
|
@import 'widgets/workspace-thumbnails';
|
||||||
|
// A11y / misc
|
||||||
|
@import 'widgets/a11y';
|
||||||
|
@import 'widgets/misc';
|
||||||
|
@import 'widgets/tiled-previews';
|
||||||
|
@import 'widgets/keyboard';
|
||||||
|
@import 'widgets/looking-glass';
|
||||||
|
// Lock / login screens
|
||||||
|
@import 'widgets/login-dialog';
|
||||||
|
@import 'widgets/screen-shield';
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
<Project xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
|
||||||
|
xmlns:foaf="http://xmlns.com/foaf/0.1/"
|
||||||
|
xmlns:gnome="http://api.gnome.org/doap-extensions#"
|
||||||
|
xmlns="http://usefulinc.com/ns/doap#">
|
||||||
|
|
||||||
|
<name xml:lang="en">GNOME Shell Sass</name>
|
||||||
|
<shortdesc xml:lang="en">Sass sources of GNOME Shell</shortdesc>
|
||||||
|
<description>GNOME Shell Sass is a project intended to allow the sharing of the
|
||||||
|
sass theme sources between gnome-shell and other projects like gnome-shell-extensions.</description>
|
||||||
|
|
||||||
|
<category rdf:resource="http://api.gnome.org/doap-extensions#core" />
|
||||||
|
<programming-language>sass</programming-language>
|
||||||
|
<programming-language>css</programming-language>
|
||||||
|
|
||||||
|
<maintainer>
|
||||||
|
<foaf:Person>
|
||||||
|
<foaf:name>Carlos Soriano</foaf:name>
|
||||||
|
<foaf:mbox rdf:resource="mailto:csoriano@gnome.org" />
|
||||||
|
<gnome:userid>csoriano</gnome:userid>
|
||||||
|
</foaf:Person>
|
||||||
|
</maintainer>
|
||||||
|
<maintainer>
|
||||||
|
<foaf:Person>
|
||||||
|
<foaf:name>Florian Müllner</foaf:name>
|
||||||
|
<foaf:mbox rdf:resource="mailto:fmuellner@gnome.org" />
|
||||||
|
<gnome:userid>fmuellner</gnome:userid>
|
||||||
|
</foaf:Person>
|
||||||
|
</maintainer>
|
||||||
|
<maintainer>
|
||||||
|
<foaf:Person>
|
||||||
|
<foaf:name>Jakub Steiner</foaf:name>
|
||||||
|
<foaf:mbox rdf:resource="mailto:jimmac@gmail.com" />
|
||||||
|
<gnome:userid>jimmac</gnome:userid>
|
||||||
|
</foaf:Person>
|
||||||
|
</maintainer>
|
||||||
|
</Project>
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
// Pointer location
|
||||||
|
.ripple-pointer-location {
|
||||||
|
width: $ripple_size;
|
||||||
|
height: $ripple_size;
|
||||||
|
border-radius: $ripple_size * 0.5; // radius equals the size of the box to give us the curve
|
||||||
|
background-color: lighten(transparentize($selected_bg_color, 0.7), 30%);
|
||||||
|
box-shadow: 0 0 2px 2px lighten($selected_bg_color, 20%);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pointer accessibility notifications
|
||||||
|
.pie-timer {
|
||||||
|
width: 60px;
|
||||||
|
height: 60px;
|
||||||
|
-pie-border-width: 3px;
|
||||||
|
-pie-border-color: $selected_bg_color;
|
||||||
|
-pie-background-color: lighten(transparentize($selected_bg_color, 0.7), 40%);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Screen zoom/Magnifier
|
||||||
|
.magnifier-zoom-region {
|
||||||
|
border: 2px solid $selected_bg_color;
|
||||||
|
|
||||||
|
&.full-screen { border-width: 0; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,182 @@
|
|||||||
|
/* App Grid */
|
||||||
|
|
||||||
|
$app_icon_size: 96px;
|
||||||
|
$app_icon_padding: 24px;
|
||||||
|
|
||||||
|
// app icons
|
||||||
|
.icon-grid {
|
||||||
|
-shell-grid-horizontal-item-size: $app_icon_size + $app_icon_padding * 2;
|
||||||
|
-shell-grid-vertical-item-size: $app_icon_size + $app_icon_padding * 2;
|
||||||
|
spacing: $base_spacing * 6;
|
||||||
|
|
||||||
|
.overview-icon {
|
||||||
|
icon-size: $app_icon_size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//.app-display { spacing: 20px; }
|
||||||
|
|
||||||
|
/* App Icons */
|
||||||
|
|
||||||
|
$app_grid_fg_color: #fff;
|
||||||
|
|
||||||
|
// Icon tiles in the app grid
|
||||||
|
.app-well-app,
|
||||||
|
%app-well-app {
|
||||||
|
@include overview-icon($app_grid_fg_color);
|
||||||
|
|
||||||
|
.overview-icon.overview-icon-with-label {
|
||||||
|
padding: 10px 8px 5px 8px;
|
||||||
|
|
||||||
|
> StBoxLayout {
|
||||||
|
spacing: $base_spacing;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* App Folders */
|
||||||
|
.app-well-app.app-folder {
|
||||||
|
background-color: transparentize($osd_bg_color, 0.8);
|
||||||
|
border-radius: $base_border_radius + 4px; // same as %icon_tile
|
||||||
|
}
|
||||||
|
|
||||||
|
// expanded folder
|
||||||
|
.app-folder-dialog {
|
||||||
|
border-radius: $modal_radius * 1.5;
|
||||||
|
border: 1px solid $osd_outer_borders_color;
|
||||||
|
spacing: 12px;
|
||||||
|
background-color: transparentize(darken($osd_bg_color,10%), 0.05);
|
||||||
|
|
||||||
|
& .folder-name-container {
|
||||||
|
padding: 24px 36px 0;
|
||||||
|
spacing: 12px;
|
||||||
|
|
||||||
|
& .folder-name-label,
|
||||||
|
& .folder-name-entry {
|
||||||
|
font-size: 18pt;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
& .folder-name-entry { width: 300px }
|
||||||
|
|
||||||
|
/* FIXME: this is to keep the label in sync with the entry */
|
||||||
|
& .folder-name-label { padding: 5px 7px; color: $osd_fg_color; }
|
||||||
|
|
||||||
|
& .edit-folder-button {
|
||||||
|
@extend %button;
|
||||||
|
|
||||||
|
padding: 0;
|
||||||
|
width: 36px;
|
||||||
|
height: 36px;
|
||||||
|
border-radius: 18px;
|
||||||
|
|
||||||
|
& > StIcon { icon-size: 16px }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.app-folder-dialog-container {
|
||||||
|
padding: 12px;
|
||||||
|
width: 800px;
|
||||||
|
height: 600px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.app-folder-icon {
|
||||||
|
padding: $base_padding;
|
||||||
|
spacing-rows: $base_spacing;
|
||||||
|
spacing-columns: $base_spacing;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Running app indicator (also shown in dash)
|
||||||
|
.app-well-app-running-dot {
|
||||||
|
height: 5px;
|
||||||
|
width: 5px;
|
||||||
|
border-radius:5px;
|
||||||
|
background-color: $osd_fg_color;
|
||||||
|
margin-bottom: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Rename popup for app folders
|
||||||
|
.rename-folder-popup {
|
||||||
|
.rename-folder-popup-item {
|
||||||
|
spacing: $base_spacing;
|
||||||
|
&:ltr, &:rtl { padding: 0 $base_padding * 2; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// right-click app menu
|
||||||
|
.app-menu,
|
||||||
|
.app-well-menu {
|
||||||
|
max-width: 27.25em;
|
||||||
|
}
|
||||||
|
|
||||||
|
// App Grid pagination indicators
|
||||||
|
.page-indicator {
|
||||||
|
padding: 15px 20px;
|
||||||
|
|
||||||
|
.page-indicator-icon {
|
||||||
|
width: 10px;
|
||||||
|
height: 10px;
|
||||||
|
border-radius: 10px; // the same as height&width
|
||||||
|
background-color: white;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Some hacks I don't even know
|
||||||
|
.all-apps,
|
||||||
|
.frequent-apps > StBoxLayout {
|
||||||
|
// horizontal padding to make sure scrollbars or dash don't overlap content
|
||||||
|
padding: 0px 88px 10px 88px;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Label when no frequent apps
|
||||||
|
.no-frequent-applications-label { @extend %status_text; }
|
||||||
|
|
||||||
|
// shutdown and other actions in the grid
|
||||||
|
.system-action-icon {
|
||||||
|
background-color: rgba(0,0,0,0.8);
|
||||||
|
color: #fff;
|
||||||
|
border-radius: 99px;
|
||||||
|
icon-size: $app_icon_size * 0.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Frequent | All toggle */
|
||||||
|
|
||||||
|
// container
|
||||||
|
.app-view-controls {
|
||||||
|
padding-bottom: 32px;
|
||||||
|
}
|
||||||
|
|
||||||
|
// buttons
|
||||||
|
.app-view-control {
|
||||||
|
padding: 4px 32px;
|
||||||
|
margin: 0 4px;
|
||||||
|
|
||||||
|
&, &:hover, &:checked {
|
||||||
|
@include button(undecorated);
|
||||||
|
color: darken($osd_fg_color, 25%);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: $osd_fg_color;
|
||||||
|
box-shadow: inset 0 -2px darken($osd_fg_color, 25%);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
box-shadow: inset 0 -2px $osd_fg_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:checked {
|
||||||
|
color: $osd_fg_color;
|
||||||
|
box-shadow: inset 0 -2px $selected_bg_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:first-child {
|
||||||
|
border-right-width: 0;
|
||||||
|
border-radius: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:last-child {
|
||||||
|
border-radius: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
// Links
|
||||||
|
.shell-link {
|
||||||
|
color: $link_color;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: lighten($link_color, 10%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Outline for low res icons
|
||||||
|
.lowres-icon {
|
||||||
|
icon-shadow: 0 1px 2px rgba(black, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Dropshadow for large icons
|
||||||
|
.icon-dropshadow {
|
||||||
|
icon-shadow: 0 1px 2px rgba(black, 0.4);
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
/* Buttons */
|
||||||
|
|
||||||
|
.button {
|
||||||
|
@extend %button; // that's it
|
||||||
|
}
|
||||||
@@ -0,0 +1,264 @@
|
|||||||
|
/* Date/Time Menu */
|
||||||
|
|
||||||
|
.clock-display-box {
|
||||||
|
spacing: $base_spacing / 2;
|
||||||
|
|
||||||
|
.clock {
|
||||||
|
padding-left: $base_padding;
|
||||||
|
padding-right: $base_padding;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// overall menu
|
||||||
|
#calendarArea {
|
||||||
|
padding:0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calendar menu side column
|
||||||
|
.datemenu-calendar-column {
|
||||||
|
spacing: $base_spacing;
|
||||||
|
border: 0 solid $bubble_borders_color;
|
||||||
|
padding: 0 $base_padding * 2;
|
||||||
|
|
||||||
|
&:ltr {margin-right: $base_margin * 2; border-left-width: 1px; }
|
||||||
|
&:rtl {margin-left: $base_margin * 2; border-right-width: 1px; }
|
||||||
|
|
||||||
|
.datemenu-displays-section {
|
||||||
|
}
|
||||||
|
|
||||||
|
.datemenu-displays-box {
|
||||||
|
spacing: $base_spacing;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.events-section-title {
|
||||||
|
@include notification_bubble($flat: true);
|
||||||
|
color: desaturate(darken($fg_color,40%), 10%);
|
||||||
|
font-weight: bold;
|
||||||
|
padding: .4em;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* today button (the date) */
|
||||||
|
.datemenu-today-button {
|
||||||
|
@include notification_bubble($flat: true);
|
||||||
|
padding: $base_padding * 1.5;
|
||||||
|
|
||||||
|
// weekday label
|
||||||
|
.day-label {
|
||||||
|
@include fontsize($base_font_size+1);
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
// date label
|
||||||
|
.date-label {
|
||||||
|
@include fontsize($base_font_size+7);
|
||||||
|
font-weight: 1000;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Calendar */
|
||||||
|
.calendar {
|
||||||
|
@include notification_bubble;
|
||||||
|
padding: $base_padding;
|
||||||
|
|
||||||
|
// month
|
||||||
|
.calendar-month-label {
|
||||||
|
color: lighten($fg_color,5%);
|
||||||
|
font-weight: bold;
|
||||||
|
padding: 8px 0;
|
||||||
|
&:focus {}
|
||||||
|
}
|
||||||
|
|
||||||
|
// prev/next month icons
|
||||||
|
.calendar-change-month-back StIcon,
|
||||||
|
.calendar-change-month-forward StIcon {
|
||||||
|
icon-size: $base_icon_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pager-button {
|
||||||
|
background-color: transparent;
|
||||||
|
height: 32px;
|
||||||
|
width: 32px;
|
||||||
|
border-radius: $base_border_radius;
|
||||||
|
&:hover, &:focus { background-color: lighten($hover_bg_color, 5%); }
|
||||||
|
&:active { background-color: $active_bg_color; }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$calendar_day_size: 32px;
|
||||||
|
|
||||||
|
.calendar-day-base {
|
||||||
|
@include fontsize($base_font_size - 3);
|
||||||
|
text-align: center;
|
||||||
|
width: $calendar_day_size;
|
||||||
|
height: $calendar_day_size;
|
||||||
|
padding: 0;
|
||||||
|
margin: 2px;
|
||||||
|
border-radius: $calendar_day_size * 0.5 + 2px;
|
||||||
|
border: 1px solid transparent; //avoid jumparound due to today
|
||||||
|
font-feature-settings: "tnum";
|
||||||
|
&:hover, &:focus { background-color: $hover_bg_color; }
|
||||||
|
&:active,&:selected {
|
||||||
|
color: lighten($fg_color,10%);
|
||||||
|
background-color: darken($bg_color,5%);
|
||||||
|
}
|
||||||
|
|
||||||
|
// day of week heading
|
||||||
|
&.calendar-day-heading {
|
||||||
|
color: lighten($fg_color,10%);
|
||||||
|
margin-top: 1em;
|
||||||
|
@include fontsize($base_font_size - 4);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.calendar-day { //border collapse hack - see calendar.js
|
||||||
|
border-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.calendar-day-top {
|
||||||
|
border-top-width: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.calendar-day-left {
|
||||||
|
border-left-width: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.calendar-work-day {}
|
||||||
|
|
||||||
|
.calendar-nonwork-day {
|
||||||
|
color: $insensitive_fg_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Today
|
||||||
|
.calendar-today {
|
||||||
|
font-weight: bold;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
background-color: $selected_bg_color;
|
||||||
|
color: $selected_fg_color;
|
||||||
|
|
||||||
|
&:hover,&:focus {
|
||||||
|
background-color:lighten($selected_bg_color, 3%);
|
||||||
|
color: $selected_fg_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active,&:selected {
|
||||||
|
background-color: $selected_bg_color;
|
||||||
|
color: $selected_fg_color;
|
||||||
|
|
||||||
|
&:hover,&:focus {
|
||||||
|
background-color:lighten($selected_bg_color, 3%);
|
||||||
|
color: $selected_fg_color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.calendar-day-with-events {
|
||||||
|
background-image: url("resource:///org/gnome/shell/theme/calendar-today.svg");
|
||||||
|
&.calendar-work-day {
|
||||||
|
color: lighten($fg_color,10%);
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.calendar-other-month-day {
|
||||||
|
color: transparentize($fg_color ,0.5);
|
||||||
|
}
|
||||||
|
|
||||||
|
.calendar-week-number {
|
||||||
|
@include fontsize($base_font_size - 4);
|
||||||
|
font-weight: bold;
|
||||||
|
height: 1.8em;
|
||||||
|
width: 2.3em;
|
||||||
|
border-radius: 2px;
|
||||||
|
padding: 0.5em 0 0;
|
||||||
|
margin: 6px;
|
||||||
|
background-color: darken($bg_color, 2%);
|
||||||
|
color: lighten($fg_color, 5%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* World clocks */
|
||||||
|
.world-clocks-button {
|
||||||
|
@include notification_bubble;
|
||||||
|
padding: $base_padding * 2;
|
||||||
|
|
||||||
|
.world-clocks-grid {
|
||||||
|
spacing-rows: $base_spacing;
|
||||||
|
spacing-columns: $base_spacing * 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// title
|
||||||
|
.world-clocks-header {
|
||||||
|
color: desaturate(darken($fg_color,40%), 10%);
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
// city label
|
||||||
|
.world-clocks-city {
|
||||||
|
color: $fg_color;
|
||||||
|
@include fontsize($base_font_size);
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
// timezone time
|
||||||
|
.world-clocks-time {
|
||||||
|
font-weight: bold;
|
||||||
|
color: $fg_color;
|
||||||
|
font-feature-settings: "lnum";
|
||||||
|
@include fontsize($base_font_size);
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
// timezone offset label
|
||||||
|
.world-clocks-timezone {
|
||||||
|
color: darken($fg_color,20%);
|
||||||
|
font-feature-settings: "tnum";
|
||||||
|
@include fontsize($base_font_size - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Weather */
|
||||||
|
.weather-button {
|
||||||
|
@include notification_bubble;
|
||||||
|
padding: $base_padding * 2;
|
||||||
|
|
||||||
|
.weather-box {
|
||||||
|
spacing: $base_spacing + $base_margin;
|
||||||
|
}
|
||||||
|
|
||||||
|
.weather-header-box {
|
||||||
|
spacing: $base_spacing;
|
||||||
|
}
|
||||||
|
|
||||||
|
.weather-header {
|
||||||
|
color: desaturate(darken($fg_color,40%), 10%);
|
||||||
|
font-weight: bold;
|
||||||
|
|
||||||
|
&.location {
|
||||||
|
font-weight: normal;
|
||||||
|
@include fontsize($base_font_size - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.weather-grid {
|
||||||
|
spacing-rows: $base_spacing;
|
||||||
|
spacing-columns: $base_spacing * 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.weather-forecast-time {
|
||||||
|
color: darken($fg_color,30%);
|
||||||
|
font-feature-settings: "tnum";
|
||||||
|
@include fontsize($base_font_size - 2);
|
||||||
|
font-weight: normal;
|
||||||
|
padding-top: 0.2em;
|
||||||
|
padding-bottom: 0.4em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.weather-forecast-icon {
|
||||||
|
icon-size: $base_icon_size * 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.weather-forecast-temp {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
/* Check Boxes */
|
||||||
|
|
||||||
|
// these are equal to the size of the SVG assets
|
||||||
|
$check_height: 22px;
|
||||||
|
$check_width: 24px;
|
||||||
|
|
||||||
|
|
||||||
|
.check-box {
|
||||||
|
StBoxLayout { spacing: .8em; }
|
||||||
|
StBin {
|
||||||
|
width: $check_width;
|
||||||
|
height: $check_height;
|
||||||
|
background-image: url("resource:///org/gnome/shell/theme/checkbox-off.svg");
|
||||||
|
}
|
||||||
|
&:focus StBin { background-image: url("resource:///org/gnome/shell/theme/checkbox-off-focused.svg"); }
|
||||||
|
&:checked StBin { background-image: url("resource:///org/gnome/shell/theme/checkbox.svg"); }
|
||||||
|
&:focus:checked StBin { background-image: url("resource:///org/gnome/shell/theme/checkbox-focused.svg"); }
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
/* Activities Ripple */
|
||||||
|
|
||||||
|
$ripple_size: 50px;
|
||||||
|
|
||||||
|
.ripple-box {
|
||||||
|
background-color: lighten(transparentize($selected_bg_color, 0.7), 40%);
|
||||||
|
box-shadow: 0 0 2px 2px lighten($selected_bg_color, 20%);
|
||||||
|
// plus + 2px for the border (box-shadow)
|
||||||
|
width: $ripple_size + 2px;
|
||||||
|
height: $ripple_size + 2px;
|
||||||
|
border-radius: 0 0 $ripple_size + 2px 0; // radius equals the size of the box to give us the curve
|
||||||
|
|
||||||
|
// just a simple change to the border radius position
|
||||||
|
&:rtl { border-radius: 0 0 0 $ripple_size + 2px; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,61 @@
|
|||||||
|
/* Dash */
|
||||||
|
|
||||||
|
$dash_placeholder_size: 32px;
|
||||||
|
$dash_spacing: $base_padding + 4px;
|
||||||
|
$dash_border_radius: $modal_radius * 1.5;
|
||||||
|
|
||||||
|
#dash {
|
||||||
|
@extend %overview_panel;
|
||||||
|
@include fontsize($base_font_size - 2);
|
||||||
|
padding: ($dash_spacing / 2) 0;
|
||||||
|
|
||||||
|
border-radius: 0 $dash_border_radius $dash_border_radius 0;
|
||||||
|
border-left-width: 0;
|
||||||
|
&:rtl {
|
||||||
|
border-radius: $dash_border_radius 0 0 $dash_border_radius;
|
||||||
|
border-right-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.placeholder {
|
||||||
|
// background-image: url("resource:///org/gnome/shell/theme/dash-placeholder.svg");
|
||||||
|
background-image:none;
|
||||||
|
background-size: contain;
|
||||||
|
height: $dash_placeholder_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
.empty-dash-drop-target {
|
||||||
|
width: $dash_placeholder_size;
|
||||||
|
height: $dash_placeholder_size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Dash Items
|
||||||
|
.dash-item-container > StWidget {
|
||||||
|
padding: ($dash_spacing / 2) $dash_spacing;
|
||||||
|
}
|
||||||
|
|
||||||
|
// OSD Tooltip
|
||||||
|
.dash-label {
|
||||||
|
background-color: transparentize($osd_bg_color,0.05);
|
||||||
|
border-radius: $base_border_radius + 2px;
|
||||||
|
border:none;
|
||||||
|
box-shadow:0 0 0 1px $osd_outer_borders_color;
|
||||||
|
color: $osd_fg_color;
|
||||||
|
padding: $base_padding $base_padding + 2px;
|
||||||
|
text-align: center;
|
||||||
|
-x-offset: $base_margin * 2; // distance from the dash edge
|
||||||
|
}
|
||||||
|
|
||||||
|
// Show apps button
|
||||||
|
.show-apps {
|
||||||
|
@include overview-icon($osd_fg_color);
|
||||||
|
|
||||||
|
&:focus,
|
||||||
|
&:checked {
|
||||||
|
.overview-icon {
|
||||||
|
background-color: darken($osd_bg_color,10%);
|
||||||
|
color: $fg_color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,168 @@
|
|||||||
|
/* Modal Dialogs */
|
||||||
|
|
||||||
|
.headline {
|
||||||
|
@include fontsize($base_font_size + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-dialog {
|
||||||
|
border-radius: $modal_radius;
|
||||||
|
@extend %bubble_panel;
|
||||||
|
|
||||||
|
.modal-dialog-content-box {
|
||||||
|
margin: 32px 40px;
|
||||||
|
spacing: 32px;
|
||||||
|
max-width: 28em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-dialog-linked-button {
|
||||||
|
@extend %bubble_button;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* End Session Dialog */
|
||||||
|
.end-session-dialog {
|
||||||
|
width: 30em;
|
||||||
|
|
||||||
|
.end-session-dialog-battery-warning,
|
||||||
|
.dialog-list-title {
|
||||||
|
color: $warning_color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Message Dialog */
|
||||||
|
.message-dialog-content {
|
||||||
|
spacing: 18px;
|
||||||
|
|
||||||
|
.message-dialog-title {
|
||||||
|
text-align: center;
|
||||||
|
font-size: 18pt;
|
||||||
|
font-weight: 800;
|
||||||
|
|
||||||
|
&.leightweight {
|
||||||
|
font-size: 13pt;
|
||||||
|
font-weight: 800;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.message-dialog-description { text-align: center; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Dialog List */
|
||||||
|
.dialog-list {
|
||||||
|
spacing: 18px;
|
||||||
|
|
||||||
|
.dialog-list-title {
|
||||||
|
text-align: center;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dialog-list-scrollview { max-height: 200px; }
|
||||||
|
.dialog-list-box {
|
||||||
|
spacing: 1em;
|
||||||
|
|
||||||
|
.dialog-list-item {
|
||||||
|
spacing: 1em;
|
||||||
|
|
||||||
|
.dialog-list-item-title { font-weight: bold; }
|
||||||
|
.dialog-list-item-description {
|
||||||
|
color: darken($fg_color,5%);
|
||||||
|
@include fontsize($base_font_size - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Run Dialog */
|
||||||
|
.run-dialog {
|
||||||
|
.modal-dialog-content-box {
|
||||||
|
margin-top: 24px;
|
||||||
|
margin-bottom: 14px;
|
||||||
|
}
|
||||||
|
.run-dialog-entry { width: 20em; }
|
||||||
|
.run-dialog-description {
|
||||||
|
@include fontsize($base_font_size - 1);
|
||||||
|
text-align: center;
|
||||||
|
color: darken($fg_color, 20%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Password or Authentication Dialog */
|
||||||
|
|
||||||
|
.prompt-dialog {
|
||||||
|
width: 28em;
|
||||||
|
|
||||||
|
.modal-dialog-content-box {
|
||||||
|
margin-bottom: 24px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.prompt-dialog-password-grid {
|
||||||
|
spacing-rows: 8px;
|
||||||
|
spacing-columns: 4px;
|
||||||
|
|
||||||
|
.prompt-dialog-password-entry {
|
||||||
|
width: auto;
|
||||||
|
|
||||||
|
// 4px (spacing) + 16px (spinner-width)
|
||||||
|
&:ltr { margin-left: 20px; }
|
||||||
|
&:rtl { margin-right: 20px; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.prompt-dialog-password-layout {
|
||||||
|
spacing: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.prompt-dialog-password-entry {
|
||||||
|
width: 20em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.prompt-dialog-error-label,
|
||||||
|
.prompt-dialog-info-label,
|
||||||
|
.prompt-dialog-null-label {
|
||||||
|
text-align: center;
|
||||||
|
@include fontsize($base_font_size - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.prompt-dialog-error-label {
|
||||||
|
color: $warning_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Polkit Dialog */
|
||||||
|
|
||||||
|
.polkit-dialog-user-layout {
|
||||||
|
text-align: center;
|
||||||
|
spacing: 8px;
|
||||||
|
margin-bottom: 6px;
|
||||||
|
|
||||||
|
.polkit-dialog-user-icon {
|
||||||
|
border-radius: 99px;
|
||||||
|
background-size: contain;
|
||||||
|
}
|
||||||
|
.polkit-dialog-user-root-label { color: $warning_color; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Audio selection dialog */
|
||||||
|
.audio-device-selection-dialog {
|
||||||
|
.modal-dialog-content-box { margin-bottom: 28px; }
|
||||||
|
.audio-selection-box { spacing: 20px; }
|
||||||
|
}
|
||||||
|
|
||||||
|
.audio-selection-device {
|
||||||
|
border: 1px solid $bubble_borders_color;
|
||||||
|
border-radius: 12px;
|
||||||
|
&:hover,&:focus { background-color: $hover_bg_color; }
|
||||||
|
&:active {
|
||||||
|
background-color: $selected_bg_color;
|
||||||
|
color: $selected_fg_color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.audio-selection-device-box {
|
||||||
|
padding: 20px;
|
||||||
|
spacing: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.audio-selection-device-icon {
|
||||||
|
icon-size: $base_icon_size * 4;
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
/* Entries */
|
||||||
|
|
||||||
|
StEntry {
|
||||||
|
border-radius: $base_border_radius;
|
||||||
|
padding: 8px;
|
||||||
|
border-width: 1px;
|
||||||
|
color: $fg_color;
|
||||||
|
@include entry(normal);
|
||||||
|
//&:hover { @include entry(hover);}
|
||||||
|
&:focus { @include entry(focus);}
|
||||||
|
&:insensitive { @include entry(insensitive);}
|
||||||
|
selection-background-color: $selected_bg_color;
|
||||||
|
selected-color: $selected_fg_color;
|
||||||
|
StIcon.capslock-warning {
|
||||||
|
icon-size: 16px;
|
||||||
|
warning-color: $warning_color;
|
||||||
|
padding: 0 4px;
|
||||||
|
}
|
||||||
|
StIcon.peek-password {
|
||||||
|
icon-size: $base_icon_size;
|
||||||
|
padding: 0 4px;
|
||||||
|
}
|
||||||
|
StLabel.hint-text {
|
||||||
|
margin-left: 2px;
|
||||||
|
color: transparentize($fg_color, 0.3);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
// hotplug
|
||||||
|
|
||||||
|
.hotplug-notification-item {
|
||||||
|
@extend %bubble_button;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hotplug-notification-item-icon {
|
||||||
|
icon-size: 24px;
|
||||||
|
padding: 0 4px;
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
// IBus Candidate Popup
|
||||||
|
|
||||||
|
.candidate-popup-boxpointer {
|
||||||
|
@extend .popup-menu-boxpointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.candidate-popup-content {
|
||||||
|
padding: 0.5em;
|
||||||
|
spacing: 0.3em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.candidate-index {
|
||||||
|
padding: 0 0.5em 0 0;
|
||||||
|
color: darken($fg_color,10%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.candidate-box {
|
||||||
|
padding: 0.3em 0.5em 0.3em 0.5em;
|
||||||
|
border-radius: $base_border_radius;
|
||||||
|
&:selected,&:hover { background-color: $selected_bg_color; color: $selected_fg_color; }
|
||||||
|
}
|
||||||
|
|
||||||
|
.candidate-page-button-box {
|
||||||
|
height: 2em;
|
||||||
|
.vertical & { padding-top: 0.5em; }
|
||||||
|
.horizontal & { padding-left: 0.5em; }
|
||||||
|
}
|
||||||
|
|
||||||
|
.candidate-page-button {
|
||||||
|
padding: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.candidate-page-button-previous { border-radius: $base_border_radius 0px 0px $base_border_radius; border-right-width: 0; }
|
||||||
|
.candidate-page-button-next { border-radius: 0px $base_border_radius $base_border_radius 0px; }
|
||||||
|
.candidate-page-button-icon { icon-size: 1em; }
|
||||||
@@ -0,0 +1,115 @@
|
|||||||
|
/* On-screen Keyboard */
|
||||||
|
|
||||||
|
$key_size: 1.2em;
|
||||||
|
$key_border_radius: $base_border_radius + 3px;
|
||||||
|
$key_bg_color: $bg_color;
|
||||||
|
// $default_key_bg_color: darken($key_bg_color, 4%);
|
||||||
|
$default_key_bg_color: if($variant=='light', darken($osd_bg_color, 11%), lighten($osd_bg_color, 2%));
|
||||||
|
|
||||||
|
|
||||||
|
// draw keys using button function
|
||||||
|
#keyboard {
|
||||||
|
background-color: transparentize(if($variant=='light', darken($bg_color, 5%), darken($bg_color, 8%)), 0.1);
|
||||||
|
box-shadow: inset 0 1px 0 0 $osd_outer_borders_color;
|
||||||
|
|
||||||
|
.page-indicator {
|
||||||
|
padding: $base_padding;
|
||||||
|
|
||||||
|
.page-indicator-icon {
|
||||||
|
width: 8px;
|
||||||
|
height: 8px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// the container for individual keys
|
||||||
|
.key-container {
|
||||||
|
padding: $base_margin;
|
||||||
|
spacing: $base_margin;
|
||||||
|
}
|
||||||
|
|
||||||
|
// the keys
|
||||||
|
.keyboard-key {
|
||||||
|
|
||||||
|
@include button(normal, $c:$key_bg_color);
|
||||||
|
|
||||||
|
&:focus { @include button(focus);}
|
||||||
|
&:hover, &:checked { @include button(hover, $c: $key_bg_color);}
|
||||||
|
&:active { @include button(active, $c: $key_bg_color); }
|
||||||
|
|
||||||
|
@include fontsize($base_font_size + 5);
|
||||||
|
min-height: $key_size;
|
||||||
|
min-width: $key_size;
|
||||||
|
border-width: 1px;
|
||||||
|
border-style: solid;
|
||||||
|
border-radius: $key_border_radius;
|
||||||
|
|
||||||
|
&:grayed { //FIXMEy
|
||||||
|
background-color: darken($bg_color, 3%);
|
||||||
|
color: $osd_fg_color;
|
||||||
|
border-color: $osd_borders_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
// non-character keys
|
||||||
|
&.default-key {
|
||||||
|
@include button(normal, $c:$default_key_bg_color);
|
||||||
|
&:hover, &:checked {@include button(hover, $c: $default_key_bg_color);}
|
||||||
|
&:active { @include button(active, $c: $default_key_bg_color);}
|
||||||
|
}
|
||||||
|
|
||||||
|
// enter key is suggested-action
|
||||||
|
&.enter-key {
|
||||||
|
@include button(normal, $c:$selected_bg_color, $tc:$selected_fg_color);
|
||||||
|
&:hover, &:checked { @include button(hover, $c: lighten($selected_bg_color, 3%));}
|
||||||
|
&:active {@include button(active, $c: darken($selected_bg_color, 2%));}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.shift-key-uppercase { color: $selected_bg_color }
|
||||||
|
|
||||||
|
StIcon { icon-size: 1.125em; }
|
||||||
|
}
|
||||||
|
|
||||||
|
// long press on a key popup
|
||||||
|
.keyboard-subkeys {
|
||||||
|
color: $osd_fg_color;
|
||||||
|
-arrow-border-radius: $modal_radius;
|
||||||
|
-arrow-background-color: $osd_bg_color;
|
||||||
|
-arrow-border-width: 1px;
|
||||||
|
-arrow-border-color: lighten($osd_bg_color, 9%);
|
||||||
|
-arrow-base: 20px;
|
||||||
|
-arrow-rise: 10px;
|
||||||
|
-boxpointer-gap: $base_spacing;
|
||||||
|
|
||||||
|
.keyboard-key {
|
||||||
|
@include button(normal, $c:$key_bg_color);
|
||||||
|
|
||||||
|
&:focus { @include button(focus);}
|
||||||
|
&:hover, &:checked { @include button(hover, $c: $key_bg_color);}
|
||||||
|
&:active { @include button(active, $c: $key_bg_color); }
|
||||||
|
|
||||||
|
border-radius:$base_border_radius;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// emoji
|
||||||
|
.emoji-page {
|
||||||
|
.keyboard-key {
|
||||||
|
background-color: transparent;
|
||||||
|
border: none;
|
||||||
|
color: initial;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.emoji-panel {
|
||||||
|
.keyboard-key:latched {
|
||||||
|
border-color: lighten($selected_bg_color, 5%);
|
||||||
|
background-color: $selected_bg_color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// suggestions
|
||||||
|
.word-suggestions {
|
||||||
|
@include fontsize($base_font_size + 3);
|
||||||
|
spacing: 12px;
|
||||||
|
min-height: 20pt;
|
||||||
|
}
|
||||||
@@ -0,0 +1,170 @@
|
|||||||
|
/* Login Dialog */
|
||||||
|
|
||||||
|
.login-dialog-banner-view {
|
||||||
|
padding-top: 24px;
|
||||||
|
max-width: 23em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-dialog {
|
||||||
|
//reset
|
||||||
|
border: none;
|
||||||
|
background-color: transparent;
|
||||||
|
|
||||||
|
$_gdm_bg: lighten(#2e3436, 19%);
|
||||||
|
|
||||||
|
StEntry {
|
||||||
|
@if $variant=='dark' {
|
||||||
|
$_gdm_entry_bg: transparentize(lighten(desaturate(#241f31, 20%), 2%), 0.5);
|
||||||
|
background-color: $_gdm_entry_bg;
|
||||||
|
color: $osd_fg_color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-dialog-button-box { spacing: 3px; }
|
||||||
|
.modal-dialog-button {
|
||||||
|
padding: 4px 18px;
|
||||||
|
box-shadow: 0 1px 3px rgba(0,0,0,0.2);
|
||||||
|
background-color: $_gdm_bg;
|
||||||
|
border-color: $_gdm_bg;
|
||||||
|
color: $fg_color;
|
||||||
|
|
||||||
|
$_hover_c: lighten($_gdm_bg, 5%);
|
||||||
|
&:hover, &:focus {
|
||||||
|
background-color: $_hover_c;
|
||||||
|
border-color: $_hover_c;
|
||||||
|
}
|
||||||
|
&:active {
|
||||||
|
$_active_c: darken($_gdm_bg, 5%);
|
||||||
|
box-shadow: none;
|
||||||
|
background-color: $_active_c;
|
||||||
|
border-color: $_active_c;
|
||||||
|
}
|
||||||
|
&:insensitive {
|
||||||
|
@include button(insensitive);
|
||||||
|
border-color: darken($_gdm_bg, 5%);
|
||||||
|
background-color: darken($_gdm_bg, 5%);
|
||||||
|
color: transparentize($fg_color, 0.3);
|
||||||
|
}
|
||||||
|
&:default {
|
||||||
|
@include button(normal, $c:$selected_bg_color, $tc:$selected_fg_color);
|
||||||
|
border-color: $selected_bg_color;
|
||||||
|
&:hover, &:focus {
|
||||||
|
@include button(hover,$c:$selected_bg_color, $tc:$selected_fg_color);
|
||||||
|
$_def_hover_c: lighten($selected_bg_color, 5%);
|
||||||
|
background-color: $_def_hover_c;
|
||||||
|
border-color: $_def_hover_c;
|
||||||
|
}
|
||||||
|
&:active {
|
||||||
|
@include button(active,$c:$selected_bg_color, $tc:$selected_fg_color);
|
||||||
|
$_def_active_c: darken($selected_bg_color, 5%);
|
||||||
|
background-color: $_def_active_c;
|
||||||
|
border-color: $_def_active_c;
|
||||||
|
}
|
||||||
|
&:insensitive {
|
||||||
|
@include button(insensitive);
|
||||||
|
border-color: darken($selected_bg_color, 10%);
|
||||||
|
background-color: darken($selected_bg_color, 10%);
|
||||||
|
color: transparentize($selected_fg_color, 0.3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.cancel-button,
|
||||||
|
.switch-user-button,
|
||||||
|
.login-dialog-session-list-button {
|
||||||
|
padding: 0;
|
||||||
|
border-radius: 99px;
|
||||||
|
width: $base_icon_size * 2;
|
||||||
|
height: $base_icon_size * 2;
|
||||||
|
border-color: transparentize($bg_color,0.7);
|
||||||
|
background-color: transparentize($bg_color,0.7);
|
||||||
|
|
||||||
|
StIcon { icon-size: $base_icon_size; }
|
||||||
|
}
|
||||||
|
|
||||||
|
.caps-lock-warning-label,
|
||||||
|
.login-dialog-message-warning {
|
||||||
|
color: $osd_fg_color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-dialog-logo-bin { padding: 24px 0px; }
|
||||||
|
.login-dialog-banner { color: darken($osd_fg_color,10%); }
|
||||||
|
.login-dialog-button-box { width: 23em; spacing: 5px; }
|
||||||
|
.login-dialog-message { text-align: center; }
|
||||||
|
.login-dialog-message-hint { padding-top: 0; padding-bottom: 20px; }
|
||||||
|
.login-dialog-user-selection-box { padding: 100px 0px; }
|
||||||
|
.login-dialog-not-listed-label {
|
||||||
|
padding-left: 2px;
|
||||||
|
.login-dialog-not-listed-button:focus &,
|
||||||
|
.login-dialog-not-listed-button:hover & {
|
||||||
|
color: $osd_fg_color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-dialog-not-listed-label {
|
||||||
|
@include fontsize($base_font_size - 1);
|
||||||
|
font-weight: bold;
|
||||||
|
color: darken($osd_fg_color,30%);
|
||||||
|
padding-top: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-dialog-user-list-view { -st-vfade-offset: 1em; }
|
||||||
|
.login-dialog-user-list {
|
||||||
|
spacing: 12px;
|
||||||
|
width: 23em;
|
||||||
|
&:expanded .login-dialog-user-list-item:selected { background-color: $selected_bg_color; color: $selected_fg_color; }
|
||||||
|
&:expanded .login-dialog-user-list-item:logged-in { border-right: 2px solid $selected_bg_color; }
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-dialog-user-list-item {
|
||||||
|
border-radius: $base_border_radius + 4px;
|
||||||
|
padding: 6px;
|
||||||
|
color: darken($osd_fg_color,30%);
|
||||||
|
&:ltr .user-widget { padding-right: 1em; }
|
||||||
|
&:rtl .user-widget { padding-left: 1em; }
|
||||||
|
.login-dialog-timed-login-indicator {
|
||||||
|
height: 2px;
|
||||||
|
margin-top: 6px;
|
||||||
|
background-color: $osd_fg_color;
|
||||||
|
}
|
||||||
|
&:focus .login-dialog-timed-login-indicator { background-color: $selected_fg_color; }
|
||||||
|
}
|
||||||
|
|
||||||
|
.user-widget-label {
|
||||||
|
color: $osd_fg_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
.user-widget.horizontal .user-widget-label {
|
||||||
|
@include fontsize($base_font_size + 2);
|
||||||
|
font-weight: bold;
|
||||||
|
text-align: left;
|
||||||
|
padding-left: 15px;
|
||||||
|
|
||||||
|
&:ltr { padding-left: 14px; }
|
||||||
|
&:rtl { padding-right: 14px; }
|
||||||
|
}
|
||||||
|
|
||||||
|
.user-widget.vertical .user-widget-label {
|
||||||
|
@include fontsize($base_font_size + 5);
|
||||||
|
text-align: center;
|
||||||
|
font-weight: normal;
|
||||||
|
padding-top: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-dialog-prompt-layout {
|
||||||
|
padding-top: 24px;
|
||||||
|
padding-bottom: 12px;
|
||||||
|
spacing: $base_spacing * 2;
|
||||||
|
width: 23em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-dialog-prompt-entry {
|
||||||
|
height: 1.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-dialog-prompt-label {
|
||||||
|
color: darken($osd_fg_color, 20%);
|
||||||
|
@include fontsize($base_font_size + 1);
|
||||||
|
padding-top: 1em;
|
||||||
|
}
|
||||||
@@ -0,0 +1,102 @@
|
|||||||
|
/* Looking Glass */
|
||||||
|
|
||||||
|
// Dialog
|
||||||
|
#LookingGlassDialog {
|
||||||
|
background-color: $osd_bg_color;
|
||||||
|
spacing: $base_spacing;
|
||||||
|
padding: 4px;
|
||||||
|
border: 1px solid transparentize($osd_fg_color, 0.8);
|
||||||
|
border-radius: $base_border_radius;
|
||||||
|
color: $osd_fg_color;
|
||||||
|
|
||||||
|
& > #Toolbar {
|
||||||
|
border: none;
|
||||||
|
border-radius: $base_border_radius;
|
||||||
|
background-color: $osd_bg_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
.labels { spacing: $base_spacing; }
|
||||||
|
.notebook-tab {
|
||||||
|
-natural-hpadding: $base_padding * 2;
|
||||||
|
-minimum-hpadding: 6px;
|
||||||
|
font-weight: bold;
|
||||||
|
color: darken($osd_fg_color, 15%);
|
||||||
|
transition-duration: 100ms;
|
||||||
|
padding-left: .3em;
|
||||||
|
padding-right: .3em;
|
||||||
|
border-bottom-width: 2px;
|
||||||
|
&:hover {
|
||||||
|
color: $osd_fg_color;
|
||||||
|
}
|
||||||
|
&:selected {
|
||||||
|
border-bottom-width: 2px;
|
||||||
|
box-shadow: inset 0 -2px 0 0 lighten($selected_bg_color, 5%);
|
||||||
|
color: $osd_fg_color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
StBoxLayout#EvalBox { padding: 4px; spacing: $base_spacing; }
|
||||||
|
StBoxLayout#ResultsArea { spacing: $base_spacing; }
|
||||||
|
}
|
||||||
|
|
||||||
|
.lg-dialog {
|
||||||
|
StEntry {
|
||||||
|
background-color: transparentize(lighten($osd_bg_color, 5%), 0.4);
|
||||||
|
color: $osd_fg_color;
|
||||||
|
border-color: transparentize($osd_fg_color, 0.8);
|
||||||
|
min-height: 22px;
|
||||||
|
selection-background-color: $selected_bg_color;
|
||||||
|
selected-color: $selected_fg_color;
|
||||||
|
}
|
||||||
|
.shell-link {
|
||||||
|
color: $link_color;
|
||||||
|
&:hover { color: lighten($link_color, 10%); }
|
||||||
|
&:active { color: darken($link_color, 10%); }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.lg-completions-text {
|
||||||
|
font-size: .9em;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lg-obj-inspector-title {
|
||||||
|
spacing: $base_spacing;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lg-obj-inspector-button {
|
||||||
|
border: 1px solid $osd_borders_color;
|
||||||
|
padding: 4px;
|
||||||
|
border-radius: $base_border_radius;
|
||||||
|
&:hover { border: 1px solid #ffffff; }
|
||||||
|
}
|
||||||
|
|
||||||
|
// Extensions
|
||||||
|
#lookingGlassExtensions { padding: 4px; }
|
||||||
|
|
||||||
|
.lg-extensions-list {
|
||||||
|
padding: 4px;
|
||||||
|
spacing: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lg-extension {
|
||||||
|
border: 1px solid lighten($osd_borders_color, 5%);
|
||||||
|
background-color: lighten($osd_bg_color, 5%);
|
||||||
|
border-radius: $base_border_radius;
|
||||||
|
padding: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lg-extension-name {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lg-extension-meta {
|
||||||
|
spacing: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Inspector
|
||||||
|
#LookingGlassPropertyInspector {
|
||||||
|
background: $osd_bg_color;
|
||||||
|
border: 1px solid $osd_borders_color;
|
||||||
|
border-radius: $base_border_radius;
|
||||||
|
padding: 6px;
|
||||||
|
}
|
||||||
@@ -0,0 +1,134 @@
|
|||||||
|
/* Message List */
|
||||||
|
// a.k.a. notifications in the menu
|
||||||
|
|
||||||
|
// main list
|
||||||
|
.message-list {
|
||||||
|
width: 31.5em;
|
||||||
|
padding: 0 $base_padding * 2;
|
||||||
|
|
||||||
|
.message-list-placeholder { spacing: 12px; }
|
||||||
|
}
|
||||||
|
|
||||||
|
.message-list-sections {
|
||||||
|
spacing: $base_spacing;
|
||||||
|
margin: 0 $base_margin * 4; // to account for scrollbar
|
||||||
|
}
|
||||||
|
|
||||||
|
.message-list-section,
|
||||||
|
.message-list-section-list {
|
||||||
|
spacing: $base_spacing;
|
||||||
|
}
|
||||||
|
|
||||||
|
// do-not-disturb + clear button
|
||||||
|
.message-list-controls {
|
||||||
|
margin: ($base_margin * 2) ($base_margin * 4) 0;
|
||||||
|
// NOTE: remove the padding if notification_bubble could remove margin for drop shadow
|
||||||
|
padding: $base_margin;
|
||||||
|
spacing: $base_spacing * 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// message bubbles
|
||||||
|
.message {
|
||||||
|
@include notification_bubble;
|
||||||
|
|
||||||
|
// icon container
|
||||||
|
.message-icon-bin {
|
||||||
|
padding: ($base_padding * 3) 0 ($base_padding * 3) ($base_padding * 2);
|
||||||
|
|
||||||
|
&:rtl {
|
||||||
|
padding: ($base_padding * 3) ($base_padding * 2) ($base_padding * 3) 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// icon size and color
|
||||||
|
> StIcon {
|
||||||
|
icon-size: $base_icon_size*2; // 32px
|
||||||
|
-st-icon-style: symbolic;
|
||||||
|
}
|
||||||
|
|
||||||
|
// fallback
|
||||||
|
> .fallback-app-icon {
|
||||||
|
width: $base_icon_size;
|
||||||
|
height: $base_icon_size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// content
|
||||||
|
.message-content {
|
||||||
|
padding: $base_padding + $base_margin * 2;
|
||||||
|
spacing: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
// title
|
||||||
|
.message-title {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
// secondary container in title box
|
||||||
|
.message-secondary-bin {
|
||||||
|
padding: 0 $base_margin * 2;
|
||||||
|
|
||||||
|
// notification time stamp
|
||||||
|
> .event-time {
|
||||||
|
color: transparentize($fg_color, 0.5);
|
||||||
|
@include fontsize($base_font_size - 2);
|
||||||
|
text-align: right;
|
||||||
|
/* HACK: the label should be baseline-aligned with a 1em label, fake this with some bottom padding */
|
||||||
|
padding-bottom: 0.13em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// close button
|
||||||
|
.message-close-button {
|
||||||
|
color: lighten($fg_color, 15%);
|
||||||
|
&:hover { color: if($variant=='light', lighten($fg_color, 30%), darken($fg_color, 10%)); }
|
||||||
|
&:active { color: if($variant=='light', lighten($fg_color, 40%), darken($fg_color, 20%)); }
|
||||||
|
}
|
||||||
|
|
||||||
|
// body
|
||||||
|
.message-body {
|
||||||
|
color: darken($fg_color, 10%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// URLs in messages
|
||||||
|
.url-highlighter {
|
||||||
|
link-color: $link_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Media Controls */
|
||||||
|
.message-media-control {
|
||||||
|
padding: $base_padding * 2 $base_padding * 4;
|
||||||
|
color: darken($fg_color, 15%);
|
||||||
|
|
||||||
|
// uses $hover_bg_color since the media controls are in a notification_bubble
|
||||||
|
&:hover {
|
||||||
|
background-color: lighten($hover_bg_color, 5%);
|
||||||
|
color: $fg_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
background-color: darken($hover_bg_color, 2%);
|
||||||
|
color: $fg_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:insensitive { color: darken($fg_color,40%); }
|
||||||
|
|
||||||
|
// fix border-radius for last button
|
||||||
|
&:last-child:ltr { border-radius: 0 $base_border_radius+2 $base_border_radius+2 0; }
|
||||||
|
&:last-child:rtl { border-radius: $base_border_radius+2 0 0 $base_border_radius+2; }
|
||||||
|
}
|
||||||
|
|
||||||
|
// album-art
|
||||||
|
.media-message-cover-icon {
|
||||||
|
icon-size: $base_icon_size*2 !important; // 48px
|
||||||
|
border-radius: $base_border_radius;
|
||||||
|
|
||||||
|
// when there is no artwork
|
||||||
|
&.fallback {
|
||||||
|
color: darken($fg_color, 17%);
|
||||||
|
background-color: $bg_color;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
border-radius: $base_border_radius;
|
||||||
|
icon-size: $base_icon_size * 2 !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
// Rubberband for select-area screenshots
|
||||||
|
.select-area-rubberband {
|
||||||
|
background-color: transparentize($selected_bg_color,0.7);
|
||||||
|
border: 1px solid $selected_bg_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
// User icon
|
||||||
|
.user-icon {
|
||||||
|
background-size: contain;
|
||||||
|
color: $osd_fg_color;
|
||||||
|
border-radius: 99px;
|
||||||
|
&:hover {
|
||||||
|
color: lighten($osd_fg_color,30%);
|
||||||
|
}
|
||||||
|
|
||||||
|
& StIcon {
|
||||||
|
background-color: transparentize($osd_fg_color,0.95);
|
||||||
|
border-radius: 99px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.user-widget.vertical .user-icon {
|
||||||
|
icon-size: $base_icon_size * 6; // 128px
|
||||||
|
|
||||||
|
& StIcon {
|
||||||
|
padding: $base_padding * 3 + 2px; // 20px
|
||||||
|
padding-top: $base_padding * 3; // 18 px
|
||||||
|
padding-bottom: $base_padding * 3 + 4px; // 22px
|
||||||
|
width: $base_icon_size * 5.5; height: $base_icon_size * 5.5; // 88px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.user-widget.horizontal .user-icon {
|
||||||
|
icon-size: $base_icon_size * 4; // 64px
|
||||||
|
|
||||||
|
& StIcon {
|
||||||
|
padding: $base_padding * 2 ; // 12px
|
||||||
|
width: $base_icon_size * 2.5; height: $base_icon_size * 2.5; // 40px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.lightbox { background-color: black; }
|
||||||
|
.flashspot { background-color: white; }
|
||||||
|
|
||||||
|
|
||||||
|
// Hidden
|
||||||
|
.hidden { color: rgba(0,0,0,0);}
|
||||||
|
|
||||||
|
// Caps-lock warning
|
||||||
|
.caps-lock-warning-label {
|
||||||
|
text-align: center;
|
||||||
|
padding-bottom: 8px;
|
||||||
|
@include fontsize($base_font_size - 1);
|
||||||
|
color: $warning_color;
|
||||||
|
}
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
/* Network Dialogs */
|
||||||
|
.nm-dialog {
|
||||||
|
max-height: 34em;
|
||||||
|
min-height: 31em;
|
||||||
|
min-width: 32em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nm-dialog-content {
|
||||||
|
spacing: 20px;
|
||||||
|
padding: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nm-dialog-airplane-box { spacing: 12px; }
|
||||||
|
|
||||||
|
.nm-dialog-airplane-headline {
|
||||||
|
font-weight: bold;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nm-dialog-airplane-text { color: $fg_color; }
|
||||||
|
|
||||||
|
// header
|
||||||
|
.nm-dialog-header {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
.nm-dialog-header-icon {
|
||||||
|
icon-size: $base_icon_size * 2;
|
||||||
|
}
|
||||||
|
.nm-dialog-header-hbox { spacing: 10px; }
|
||||||
|
|
||||||
|
// list of networks
|
||||||
|
.nm-dialog-scroll-view {
|
||||||
|
border: 1px solid $borders_color;
|
||||||
|
padding:0;
|
||||||
|
background-color: darken($bg_color, 3%);
|
||||||
|
}
|
||||||
|
|
||||||
|
// list item
|
||||||
|
.nm-dialog-item {
|
||||||
|
@include fontsize($base_font_size);
|
||||||
|
border-bottom: 1px solid $borders_color;
|
||||||
|
padding: $base_padding * 2;
|
||||||
|
spacing: 0px;
|
||||||
|
&:selected {
|
||||||
|
background-color: $selected_bg_color;
|
||||||
|
color: $selected_fg_color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// icons in list
|
||||||
|
.nm-dialog-icon { icon-size: $base_icon_size; }
|
||||||
|
.nm-dialog-icons { spacing: $base_spacing * 2; }
|
||||||
|
|
||||||
|
// no networks
|
||||||
|
.no-networks-label { color: $insensitive_fg_color; }
|
||||||
|
.no-networks-box { spacing: $base_padding; }
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
/* Notifications & Mesage Tray */
|
||||||
|
|
||||||
|
$notification_banner_height: 64px;
|
||||||
|
$notification_banner_width: 34em;
|
||||||
|
|
||||||
|
// Banner notifications
|
||||||
|
.notification-banner {
|
||||||
|
min-height: $notification_banner_height;
|
||||||
|
width: $notification_banner_width;
|
||||||
|
|
||||||
|
.notification-actions {
|
||||||
|
spacing: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.notification-button {
|
||||||
|
@extend %bubble_button;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// counter
|
||||||
|
.summary-source-counter {
|
||||||
|
font-size: $base_font_size - 1pt;
|
||||||
|
font-weight: bold;
|
||||||
|
height: 1.6em;
|
||||||
|
width: 1.6em;
|
||||||
|
-shell-counter-overlap-x: 3px;
|
||||||
|
-shell-counter-overlap-y: 3px;
|
||||||
|
background-color: $selected_bg_color;
|
||||||
|
color: $selected_fg_color;
|
||||||
|
border: 2px solid $fg_color;
|
||||||
|
box-shadow: 0 2px 2px rgba(0,0,0,0.5);
|
||||||
|
border-radius: 0.9em; // should be 0.8 but whatever; wish I could do 50%;
|
||||||
|
}
|
||||||
|
|
||||||
|
// chat bubbles
|
||||||
|
.chat-body { spacing: 5px; }
|
||||||
|
.chat-response { margin: 5px; }
|
||||||
|
.chat-log-message { color: darken($fg_color,10%); }
|
||||||
|
.chat-new-group { padding-top: 1em; }
|
||||||
|
.chat-received {
|
||||||
|
padding-left: 4px;
|
||||||
|
&:rtl { padding-left: 0px; padding-right: 4px; }
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-sent {
|
||||||
|
padding-left: 18pt;
|
||||||
|
color: lighten($fg_color, 15%);
|
||||||
|
&:rtl { padding-left: 0; padding-right: 18pt; }
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-meta-message {
|
||||||
|
padding-left: 4px;
|
||||||
|
@include fontsize($base_font_size - 2);
|
||||||
|
font-weight: bold;
|
||||||
|
color: lighten($fg_color,18%);
|
||||||
|
&:rtl { padding-left: 0; padding-right: 4px; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
/* OSD */
|
||||||
|
|
||||||
|
$osd_levelbar_height:8px;
|
||||||
|
|
||||||
|
.osd-window {
|
||||||
|
@extend %osd_panel;
|
||||||
|
text-align: center;
|
||||||
|
font-weight: bold;
|
||||||
|
spacing: $base_spacing * 2; // 12px
|
||||||
|
margin: $base_margin * 8; // 32px
|
||||||
|
min-width: 64px;
|
||||||
|
min-height: 64px;
|
||||||
|
|
||||||
|
StIcon {
|
||||||
|
icon-size:$base_icon_size * 6;
|
||||||
|
}
|
||||||
|
|
||||||
|
.osd-monitor-label { font-size: 3em; }
|
||||||
|
|
||||||
|
.level {
|
||||||
|
height: $osd_levelbar_height;
|
||||||
|
-barlevel-height: $osd_levelbar_height;
|
||||||
|
-barlevel-background-color: transparentize($osd_fg_color, if($variant=='light', 0.7, 0.9));
|
||||||
|
-barlevel-active-background-color: $osd_fg_color;
|
||||||
|
-barlevel-overdrive-color: $destructive_color;
|
||||||
|
-barlevel-overdrive-separator-width: 3px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Pad OSD */
|
||||||
|
.pad-osd-window {
|
||||||
|
padding: 32px;
|
||||||
|
background-color: transparentize(#000, 0.2);
|
||||||
|
|
||||||
|
.pad-osd-title-box { spacing: 12px; }
|
||||||
|
.pad-osd-title-menu-box { spacing: 6px; }
|
||||||
|
}
|
||||||
|
|
||||||
|
.combo-box-label {
|
||||||
|
width: 15em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.resize-popup {
|
||||||
|
@extend %osd_panel;
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
/* OVERVIEW */
|
||||||
|
|
||||||
|
#overview {
|
||||||
|
spacing: 24px;
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.overview-controls {
|
||||||
|
padding-bottom: 32px;
|
||||||
|
}
|
||||||
@@ -0,0 +1,121 @@
|
|||||||
|
/* Top Bar */
|
||||||
|
// a.k.a. the panel
|
||||||
|
|
||||||
|
$panel_corner_radius: $base_border_radius+1;
|
||||||
|
$panel_bg_color: #000;
|
||||||
|
$panel_fg_color: #ccc;
|
||||||
|
$panel_height: 1.86em;
|
||||||
|
|
||||||
|
|
||||||
|
#panel {
|
||||||
|
background-color: $panel_bg_color;
|
||||||
|
font-weight: bold;
|
||||||
|
height: $panel_height;
|
||||||
|
font-feature-settings: "tnum";
|
||||||
|
|
||||||
|
// transparent panel on lock & login screens
|
||||||
|
&.unlock-screen,
|
||||||
|
&.login-screen {
|
||||||
|
background-color: transparent;
|
||||||
|
|
||||||
|
.panel-corner {
|
||||||
|
-panel-corner-radius: 0;
|
||||||
|
-panel-corner-background-color: transparent;
|
||||||
|
-panel-corner-border-color: transparent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// spacing between activities, app menu and such
|
||||||
|
#panelLeft, #panelCenter {
|
||||||
|
spacing: $base_spacing;
|
||||||
|
}
|
||||||
|
|
||||||
|
// the rounded outset corners
|
||||||
|
.panel-corner {
|
||||||
|
-panel-corner-radius: $panel_corner_radius;
|
||||||
|
-panel-corner-background-color: $panel_bg_color;
|
||||||
|
-panel-corner-border-width: 2px;
|
||||||
|
-panel-corner-border-color: transparent;
|
||||||
|
|
||||||
|
&:active, &:overview, &:focus {
|
||||||
|
-panel-corner-border-color: lighten($selected_bg_color,5%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// panel menus
|
||||||
|
.panel-button {
|
||||||
|
font-weight: bold;
|
||||||
|
color: $panel_fg_color;
|
||||||
|
-natural-hpadding: $base_padding * 2;
|
||||||
|
-minimum-hpadding: $base_padding;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: lighten($panel_fg_color, 20%);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active, &:overview, &:focus, &:checked {
|
||||||
|
color: lighten($panel_fg_color, 20%);
|
||||||
|
}
|
||||||
|
|
||||||
|
// status area icons
|
||||||
|
.system-status-icon {
|
||||||
|
icon-size: $base_icon_size;
|
||||||
|
padding: $base_padding - 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
// app menu icon
|
||||||
|
.app-menu-icon {
|
||||||
|
margin-left: $base_margin;
|
||||||
|
margin-right: $base_margin;
|
||||||
|
-st-icon-style: symbolic;
|
||||||
|
// dimensions of the icon are hardcoded
|
||||||
|
}
|
||||||
|
|
||||||
|
// lock & login screen styles
|
||||||
|
.unlock-screen &,
|
||||||
|
.login-screen & {
|
||||||
|
color: lighten($fg_color, 10%);
|
||||||
|
&:focus, &:hover, &:active { color: lighten($fg_color, 10%); }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.panel-button {
|
||||||
|
&:active, &:overview, &:focus, &:checked {
|
||||||
|
// Trick due to St limitations. It needs a background to draw a box-shadow
|
||||||
|
background-color: rgba(0, 0, 0, 0.01);
|
||||||
|
box-shadow: inset 0 -2px 0 0 lighten($selected_bg_color,5%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.panel-button.clock-display {
|
||||||
|
// Move highlight from .panel-button to .clock
|
||||||
|
&:active, &:overview, &:focus, &:checked {
|
||||||
|
box-shadow: none;
|
||||||
|
|
||||||
|
.clock {
|
||||||
|
background-color: rgba(0, 0, 0, 0.01);
|
||||||
|
box-shadow: inset 0 -2px 0 0 lighten($selected_bg_color,5%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.panel-status-indicators-box,
|
||||||
|
.panel-status-menu-box {
|
||||||
|
spacing: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
// spacing between power icon and (optional) percentage label
|
||||||
|
.power-status.panel-status-indicators-box {
|
||||||
|
spacing: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// indicator for active
|
||||||
|
.screencast-indicator,
|
||||||
|
.remote-access-indicator { color: $warning_color; }
|
||||||
|
}
|
||||||
|
|
||||||
|
// App Menu
|
||||||
|
#appMenu {
|
||||||
|
spacing: $base_spacing;
|
||||||
|
.label-shadow { color: transparent; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,129 @@
|
|||||||
|
/* Popovers/Menus */
|
||||||
|
|
||||||
|
$popover_arrow_height: 12px;
|
||||||
|
|
||||||
|
//.the popover itself
|
||||||
|
.popup-menu-boxpointer {
|
||||||
|
-arrow-border-radius: $base_border_radius+4;
|
||||||
|
-arrow-background-color: $bg_color;
|
||||||
|
-arrow-border-width: 1px;
|
||||||
|
-arrow-border-color: $borders_color;
|
||||||
|
-arrow-base: $popover_arrow_height * 2;
|
||||||
|
-arrow-rise: $popover_arrow_height;
|
||||||
|
-arrow-box-shadow: 0 1px 3px rgba(0,0,0,0.5); // dreaming bugzilla #689995
|
||||||
|
}
|
||||||
|
|
||||||
|
// container of the popover menu
|
||||||
|
.popup-menu {
|
||||||
|
min-width: 15em;
|
||||||
|
color: $fg_color;
|
||||||
|
|
||||||
|
//.popup-status-menu-item { font-weight: normal; color: pink; } //dunno what that is
|
||||||
|
&.panel-menu {
|
||||||
|
-boxpointer-gap: $base_margin; // distance from the panel
|
||||||
|
margin-bottom: 1.75em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.popup-menu-content {
|
||||||
|
padding: $base_padding * 2 + $base_margin 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// menu items
|
||||||
|
.popup-menu-item {
|
||||||
|
spacing: $base_padding;
|
||||||
|
padding: $base_padding;
|
||||||
|
|
||||||
|
&:ltr { padding-right:1.75em; padding-left: 0; }
|
||||||
|
&:rtl { padding-right: 0; padding-left:1.75em; }
|
||||||
|
|
||||||
|
&:checked {
|
||||||
|
background-color: lighten($bg_color, 2%);
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.selected {
|
||||||
|
background-color: transparentize(white, if($variant=='light', 0.2, 0.9));
|
||||||
|
color: $fg_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
background-color: $selected_bg_color;
|
||||||
|
color: $selected_fg_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:insensitive { color: transparentize($fg_color,0.5);}
|
||||||
|
}
|
||||||
|
|
||||||
|
// all icons and other graphical elements
|
||||||
|
.popup-inactive-menu-item {
|
||||||
|
color: $fg_color;
|
||||||
|
|
||||||
|
&:insensitive { color: transparentize($fg_color,0.5); }
|
||||||
|
}
|
||||||
|
|
||||||
|
// symbolic icons in popover
|
||||||
|
.popup-menu-arrow,
|
||||||
|
.popup-menu-icon { icon-size: $base_icon_size; }
|
||||||
|
|
||||||
|
// popover submenus
|
||||||
|
.popup-sub-menu {
|
||||||
|
background-color: darken($bg_color, 3%);
|
||||||
|
box-shadow: none;
|
||||||
|
border-top: 1px solid transparentize($borders_color, 0.2);
|
||||||
|
border-bottom: 1px solid transparentize($borders_color, 0.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
// container for radio and check boxes
|
||||||
|
.popup-menu-ornament {
|
||||||
|
text-align: right;
|
||||||
|
width: 1.2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
// separator
|
||||||
|
.popup-separator-menu-item {
|
||||||
|
padding: 0;
|
||||||
|
|
||||||
|
.popup-separator-menu-item-separator {
|
||||||
|
//-margin-horizontal: 24px;
|
||||||
|
height: 1px; //not really the whole box
|
||||||
|
margin: 6px 64px;
|
||||||
|
background-color: lighten($borders_color, 2%);
|
||||||
|
.popup-sub-menu & { //submenu separators
|
||||||
|
margin: 0 64px 0 32px;
|
||||||
|
@if $variant == 'dark' {
|
||||||
|
background-color: lighten($bg_color,10%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// desktop background menu
|
||||||
|
.background-menu {
|
||||||
|
-boxpointer-gap: $base_margin;
|
||||||
|
-arrow-rise: 0px; // hide the beak on the menu
|
||||||
|
}
|
||||||
|
|
||||||
|
// system status menu
|
||||||
|
.aggregate-menu {
|
||||||
|
min-width: 21em;
|
||||||
|
|
||||||
|
// lock screen, shutdown, etc. buttons
|
||||||
|
.popup-menu-icon {
|
||||||
|
padding:0;
|
||||||
|
margin: 0 $base_margin;
|
||||||
|
-st-icon-style: symbolic;
|
||||||
|
}
|
||||||
|
|
||||||
|
.popup-sub-menu .popup-menu-item > :first-child {
|
||||||
|
// account for icons in submenus with padding
|
||||||
|
&:ltr {
|
||||||
|
padding-left: $base_padding + $base_margin * 2;
|
||||||
|
margin-left: $base_icon_size;
|
||||||
|
}
|
||||||
|
&:rtl {
|
||||||
|
padding-right: $base_padding + $base_margin * 2; ;
|
||||||
|
margin-right: $base_icon_size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,78 @@
|
|||||||
|
/* Screen Shield */
|
||||||
|
|
||||||
|
.unlock-dialog-clock {
|
||||||
|
color: white;
|
||||||
|
font-weight: 300;
|
||||||
|
text-align: center;
|
||||||
|
spacing: 24px;
|
||||||
|
padding-bottom: 2.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.unlock-dialog-clock-time {
|
||||||
|
font-size: 64pt;
|
||||||
|
padding-top: 42px;
|
||||||
|
font-feature-settings: "tnum";
|
||||||
|
}
|
||||||
|
|
||||||
|
.unlock-dialog-clock-date {
|
||||||
|
font-size: 16pt;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
.unlock-dialog-clock-hint {
|
||||||
|
font-weight: normal;
|
||||||
|
padding-top: 48px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.unlock-dialog-notifications-container {
|
||||||
|
margin: 12px 0;
|
||||||
|
spacing: 6px;
|
||||||
|
width: 23em;
|
||||||
|
background-color: transparent;
|
||||||
|
.summary-notification-stack-scrollview {
|
||||||
|
padding-top: 0;
|
||||||
|
padding-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.notification,
|
||||||
|
.unlock-dialog-notification-source {
|
||||||
|
padding: 12px 6px;
|
||||||
|
border: none;
|
||||||
|
background-color: transparentize($osd_bg_color,0.7);
|
||||||
|
color: $osd_fg_color;
|
||||||
|
border-radius: $modal_radius;
|
||||||
|
|
||||||
|
&.critical { background-color: transparentize($osd_bg_color,0.1) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.unlock-dialog-notification-label {
|
||||||
|
padding: 0px 0px 0px 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.unlock-dialog-notification-count-text {
|
||||||
|
weight: bold;
|
||||||
|
padding: 0 6px;
|
||||||
|
color: $osd_bg_color;
|
||||||
|
background-color: transparentize($osd_fg_color, 0.7);
|
||||||
|
border-radius: 99px;
|
||||||
|
margin-right: 12px;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.screen-shield-background { //just the shadow, really
|
||||||
|
background: black;
|
||||||
|
box-shadow: 0px 2px 4px rgba(0,0,0,0.6);
|
||||||
|
}
|
||||||
|
|
||||||
|
#lockDialogGroup {
|
||||||
|
background-color: lighten(#2e3436, 8%);
|
||||||
|
}
|
||||||
|
|
||||||
|
#unlockDialogNotifications {
|
||||||
|
StButton#vhandle, StButton#hhandle {
|
||||||
|
background-color: transparentize($bg_color,0.7);
|
||||||
|
&:hover, &:focus { background-color: transparentize($bg_color,0.5); }
|
||||||
|
&:active { background-color: transparentize($selected_bg_color,0.5); }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
/* Scrollbars */
|
||||||
|
|
||||||
|
StScrollView {
|
||||||
|
&.vfade { -st-vfade-offset: 68px; }
|
||||||
|
&.hfade { -st-hfade-offset: 68px; }
|
||||||
|
}
|
||||||
|
|
||||||
|
StScrollBar {
|
||||||
|
padding: 0;
|
||||||
|
|
||||||
|
StScrollView & {
|
||||||
|
min-width: 14px;
|
||||||
|
min-height: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
StBin#trough {
|
||||||
|
border-radius: 0;
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
StButton#vhandle, StButton#hhandle {
|
||||||
|
border-radius: 8px;
|
||||||
|
background-color: mix($fg_color, $bg_color, 60%);
|
||||||
|
//border: 3px solid transparent; //would be nice to margin or at least to transparent
|
||||||
|
margin: 3px;
|
||||||
|
&:hover { background-color: mix($fg_color, $bg_color, 80%); }
|
||||||
|
&:active { background-color: $selected_bg_color; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
// Search entry
|
||||||
|
|
||||||
|
$search_entry_width: 320px;
|
||||||
|
$search_entry_height: 36px;
|
||||||
|
|
||||||
|
%search_entry,
|
||||||
|
.search-entry {
|
||||||
|
width: $search_entry_width;
|
||||||
|
padding: $base_padding+1 $base_padding+3;
|
||||||
|
border-radius: $search_entry_height * 0.5; // half the height
|
||||||
|
color: transparentize($fg_color,0.3);
|
||||||
|
background-color: $bg_color;
|
||||||
|
border-color: $borders_color;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: $hover_bg_color;
|
||||||
|
border-color: $hover_borders_color;
|
||||||
|
color: $hover_fg_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:focus {
|
||||||
|
padding: $base_padding $base_padding+2; // 1px less to account for wider border
|
||||||
|
border-width: 2px;
|
||||||
|
border-style: solid;
|
||||||
|
border-color: $selected_bg_color;
|
||||||
|
color: $fg_color;
|
||||||
|
box-shadow: inset 0 1px 2px 1px rgba(0,0,0,0.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.search-entry-icon {
|
||||||
|
icon-size: $base_icon_size;
|
||||||
|
padding: 0 4px;
|
||||||
|
color: inherit;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,104 @@
|
|||||||
|
/* Search */
|
||||||
|
|
||||||
|
// search overview container
|
||||||
|
#searchResultsContent {
|
||||||
|
max-width: 1024px;
|
||||||
|
spacing: $base_margin * 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// search results sections "the boxes"
|
||||||
|
.search-section {
|
||||||
|
// This should be equal to #searchResultsContent spacing
|
||||||
|
spacing: $base_margin * 2;
|
||||||
|
|
||||||
|
// separator
|
||||||
|
.search-section-separator {
|
||||||
|
// height: 1px;
|
||||||
|
// background-color: $osd_outer_borders_color;
|
||||||
|
height: 0;
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// content
|
||||||
|
.search-section-content {
|
||||||
|
background-color: transparentize(lighten($osd_bg_color, 5%), 0.2);
|
||||||
|
border-radius: $modal_radius+3;
|
||||||
|
border: 1px solid $osd_outer_borders_color;
|
||||||
|
box-shadow: 0 2px 4px 0 $shadow_color;
|
||||||
|
text-shadow: 0 1px if($variant == 'light', rgba(255,255,255,0.2), rgba(0,0,0,0.2));
|
||||||
|
color: $osd_fg_color;
|
||||||
|
padding: $base_padding * 3;
|
||||||
|
// This is the space between the provider icon and the results container
|
||||||
|
spacing: $base_margin * 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
%search-section-content-item {
|
||||||
|
@extend %icon_tile;
|
||||||
|
|
||||||
|
&:focus,
|
||||||
|
&:hover,
|
||||||
|
&:selected {
|
||||||
|
background-color: transparentize($osd_fg_color, .9);
|
||||||
|
transition-duration: 200ms;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active,
|
||||||
|
&:checked {
|
||||||
|
background-color: transparentize(darken($osd_bg_color, 10%), .1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// "no results" text
|
||||||
|
.search-statustext {
|
||||||
|
@extend %status_text;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Search results with icons
|
||||||
|
.grid-search-result {
|
||||||
|
@extend %app-well-app;
|
||||||
|
}
|
||||||
|
|
||||||
|
// search result provider
|
||||||
|
.search-provider-icon {
|
||||||
|
@extend %search-section-content-item;
|
||||||
|
|
||||||
|
// content
|
||||||
|
.list-search-provider-content {
|
||||||
|
spacing: $base_spacing * 2;
|
||||||
|
|
||||||
|
// provider labels
|
||||||
|
.list-search-provider-details {
|
||||||
|
width: 120px;
|
||||||
|
margin-top: 0;
|
||||||
|
color: darken($osd_fg_color, 8%);
|
||||||
|
// font-weight: bold;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// search results list
|
||||||
|
.list-search-results {
|
||||||
|
spacing: $base_spacing;
|
||||||
|
}
|
||||||
|
|
||||||
|
// search result listitem
|
||||||
|
.list-search-result {
|
||||||
|
@extend %search-section-content-item;
|
||||||
|
|
||||||
|
// content
|
||||||
|
.list-search-result-content {
|
||||||
|
spacing: $base_padding;
|
||||||
|
}
|
||||||
|
|
||||||
|
// list item title (with leading icon)
|
||||||
|
.list-search-result-title {
|
||||||
|
spacing: $base_spacing * 2;
|
||||||
|
// font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
// list item description
|
||||||
|
.list-search-result-description {
|
||||||
|
color: darken($osd_fg_color, 30%);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
/* Slider */
|
||||||
|
|
||||||
|
$slider_size: 15px;
|
||||||
|
|
||||||
|
.slider {
|
||||||
|
height: $slider_size;
|
||||||
|
// slider trough
|
||||||
|
-barlevel-height: 3px; // has to be an odd number
|
||||||
|
-barlevel-background-color: $borders_color; //background of the trough
|
||||||
|
-barlevel-border-width: 1px;
|
||||||
|
-barlevel-border-color: $borders_color; // trough border color
|
||||||
|
// fill style
|
||||||
|
-barlevel-active-background-color: $selected_bg_color; //active trough fill
|
||||||
|
-barlevel-active-border-color: if($variant == 'light', darken($selected_bg_color, 4%), lighten($selected_bg_color, 2%)); //active trough border
|
||||||
|
// overfill style (red in this case)
|
||||||
|
-barlevel-overdrive-color: $destructive_color;
|
||||||
|
-barlevel-overdrive-border-color: if($variant == 'light', darken($destructive_color, 4%), lighten($destructive_color, 2%)); //trough border when red;
|
||||||
|
-barlevel-overdrive-separator-width:1px;
|
||||||
|
// slider hander
|
||||||
|
-slider-handle-radius: $slider_size * 0.5; // half the size of the size
|
||||||
|
-slider-handle-border-width: 1px;
|
||||||
|
-slider-handle-border-color: if($variant == 'light', $borders_color, $fg_color);
|
||||||
|
|
||||||
|
color: if($variant == 'light', lighten($bg_color, 10%), $fg_color);
|
||||||
|
&:hover { color: $hover_bg_color; }
|
||||||
|
&:active { color: $active_bg_color; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
/* App Switcher */
|
||||||
|
|
||||||
|
.switcher-popup {
|
||||||
|
padding: 8px;
|
||||||
|
spacing: $base_spacing * 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
// switcher onscreen panel
|
||||||
|
.switcher-list {
|
||||||
|
@extend %osd_panel;
|
||||||
|
|
||||||
|
.item-box {
|
||||||
|
padding: 8px;
|
||||||
|
border-radius: $base_border_radius + 1px;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
|
||||||
|
&:outlined {
|
||||||
|
background-color: transparentize($osd_fg_color, 0.7);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:selected {
|
||||||
|
background-color: transparentize($osd_fg_color, 0.7);
|
||||||
|
color: $osd_fg_color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// window thumbnails
|
||||||
|
.thumbnail-box {
|
||||||
|
padding: 2px;
|
||||||
|
spacing: $base_spacing;
|
||||||
|
}
|
||||||
|
|
||||||
|
.thumbnail {
|
||||||
|
width: 256px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.separator {
|
||||||
|
width: 1px;
|
||||||
|
background: $borders_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
.switcher-list-item-container {
|
||||||
|
spacing: $base_spacing * 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.switcher-arrow {
|
||||||
|
border-color: rgba(0,0,0,0);
|
||||||
|
color: transparentize($fg_color,0.2);
|
||||||
|
&:highlighted {
|
||||||
|
color: $fg_color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Input Source Switcher
|
||||||
|
.input-source-switcher-symbol {
|
||||||
|
font-size: 34pt;
|
||||||
|
width: 96px;
|
||||||
|
height: 96px;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Window cycler highlight
|
||||||
|
.cycler-highlight {
|
||||||
|
border: 5px solid $selected_bg_color;
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
/* Switches */
|
||||||
|
|
||||||
|
// these are equal to the size of the SVG assets
|
||||||
|
$switch_height: 22px;
|
||||||
|
$switch_width: 46px;
|
||||||
|
|
||||||
|
.toggle-switch {
|
||||||
|
color: $fg_color;
|
||||||
|
height: $switch_height;
|
||||||
|
width: $switch_width;
|
||||||
|
background-size: contain;
|
||||||
|
background-image: if($variant == 'light', url("resource:///org/gnome/shell/theme/toggle-off.svg"),url("resource:///org/gnome/shell/theme/toggle-off-dark.svg"));
|
||||||
|
&:checked {
|
||||||
|
background-image: if($variant == 'light', url("resource:///org/gnome/shell/theme/toggle-on.svg"),url("resource:///org/gnome/shell/theme/toggle-on-dark.svg"));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
|
||||||
|
/* Tiled window previews */
|
||||||
|
$tile_corner_radius: $base_border_radius + 1px;
|
||||||
|
.tile-preview {
|
||||||
|
background-color: transparentize($selected_bg_color,0.5);
|
||||||
|
border: 1px solid $selected_bg_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tile-preview-left.on-primary {
|
||||||
|
border-radius: $tile_corner_radius 0 0 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tile-preview-right.on-primary {
|
||||||
|
border-radius: 0 $tile_corner_radius 0 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tile-preview-left.tile-preview-right.on-primary {
|
||||||
|
border-radius: $tile_corner_radius $tile_corner_radius 0 0;
|
||||||
|
}
|
||||||
@@ -0,0 +1,66 @@
|
|||||||
|
/* Window Picker */
|
||||||
|
|
||||||
|
$window_picker_spacing: $base_spacing * 2; // 16px
|
||||||
|
$window_picker_padding: $base_padding * 2; // 16px
|
||||||
|
|
||||||
|
$window_thumbnail_border_color:transparentize($selected_fg_color, 0.65);
|
||||||
|
|
||||||
|
$window_close_button_size: 24px;
|
||||||
|
$window_close_button_padding: 3px;
|
||||||
|
|
||||||
|
|
||||||
|
// Window picker
|
||||||
|
.window-picker {
|
||||||
|
// Space between window thumbnails
|
||||||
|
-horizontal-spacing: $window_picker_spacing;
|
||||||
|
-vertical-spacing: $window_picker_spacing;
|
||||||
|
// Padding for container around window thumbnails
|
||||||
|
padding: $window_picker_padding;
|
||||||
|
|
||||||
|
&.external-monitor { padding: $window_picker_padding; }
|
||||||
|
}
|
||||||
|
|
||||||
|
// Borders on window thumbnails
|
||||||
|
.window-clone-border {
|
||||||
|
border-width: 6px;
|
||||||
|
border-style: solid;
|
||||||
|
border-color: $window_thumbnail_border_color;
|
||||||
|
border-radius: $base_border_radius + 2;
|
||||||
|
// For window decorations with round corners we can't match
|
||||||
|
// the exact shape when the window is scaled. So apply a shadow
|
||||||
|
// to fix that case
|
||||||
|
box-shadow: inset 0 0 0 1px transparentize($borders_color, 0.8);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Window titles
|
||||||
|
.window-caption {
|
||||||
|
color: $osd_fg_color;
|
||||||
|
background-color: $osd_bg_color;
|
||||||
|
border:1px solid $osd_outer_borders_color;
|
||||||
|
border-radius: $base_border_radius + 1;
|
||||||
|
padding: $base_padding $base_padding * 2;
|
||||||
|
font-weight: bold;
|
||||||
|
@include fontsize($base_font_size + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Close button
|
||||||
|
.window-close {
|
||||||
|
background-color: $selected_bg_color;
|
||||||
|
color: $selected_fg_color;
|
||||||
|
border: none;
|
||||||
|
border-radius: $window_close_button_size * 0.5 + $window_close_button_padding * 2;
|
||||||
|
padding: $window_close_button_padding;
|
||||||
|
height: $window_close_button_size;
|
||||||
|
width: $window_close_button_size;
|
||||||
|
box-shadow: -1px 1px 5px 0px rgba(0,0,0,0.5);
|
||||||
|
|
||||||
|
-shell-close-overlap: $window_close_button_size * 0.5;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: lighten($selected_bg_color, 5%);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
background-color: darken($selected_bg_color, 5%);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
/* Workspace Switcher */
|
||||||
|
.workspace-switcher-group {
|
||||||
|
padding: $base_padding * 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-switcher-container {
|
||||||
|
@extend %osd_panel;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-switcher {
|
||||||
|
background: transparent;
|
||||||
|
border: none;
|
||||||
|
border-radius: 0;
|
||||||
|
padding: 0;
|
||||||
|
spacing: $base_spacing * 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ws-switcher-box {
|
||||||
|
background: transparent;
|
||||||
|
height: 50px;
|
||||||
|
background-size: 32px;
|
||||||
|
border: 1px solid transparentize($osd_fg_color,0.9);
|
||||||
|
border-radius: $base_border_radius + 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
// active workspace in the switcher
|
||||||
|
.ws-switcher-active-up,
|
||||||
|
.ws-switcher-active-down,
|
||||||
|
.ws-switcher-active-left,
|
||||||
|
.ws-switcher-active-right {
|
||||||
|
height: 52px;
|
||||||
|
background-color: $selected_bg_color;
|
||||||
|
border: 1px solid if($variant=='light', darken($selected_bg_color, 8%), lighten($selected_bg_color, 5%));
|
||||||
|
border-radius: $base_border_radius + 3px;
|
||||||
|
color: $selected_fg_color;
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
/* Workspace pager */
|
||||||
|
|
||||||
|
// thumbnails in overview
|
||||||
|
.workspace-thumbnails {
|
||||||
|
@extend %overview_panel;
|
||||||
|
visible-width: 32px; //amount visible before hover
|
||||||
|
spacing: $base_spacing;
|
||||||
|
padding: $base_padding;
|
||||||
|
|
||||||
|
border-radius: $modal_radius 0 0 $modal_radius;
|
||||||
|
border-right-width: 0;
|
||||||
|
|
||||||
|
&:rtl {
|
||||||
|
border-radius: 0 $modal_radius $modal_radius 0;
|
||||||
|
border-left-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// drag and drop indicator
|
||||||
|
.placeholder {
|
||||||
|
background-image: url("resource:///org/gnome/shell/theme/dash-placeholder.svg");
|
||||||
|
background-size: contain;
|
||||||
|
height: 24px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// selected indicator
|
||||||
|
.workspace-thumbnail-indicator {
|
||||||
|
border: 3px solid $selected_bg_color;
|
||||||
|
border-radius: 3px;
|
||||||
|
padding: 0px;
|
||||||
|
// background-color: transparentize($selected_bg_color, 0.9);
|
||||||
|
}
|
||||||
@@ -0,0 +1,63 @@
|
|||||||
|
sessions = [
|
||||||
|
['gnome-classic.session.desktop.in', sessiondir],
|
||||||
|
['gnome-classic.desktop.in', xsessiondir]
|
||||||
|
]
|
||||||
|
foreach s : sessions
|
||||||
|
name_array = s[0].split('.')
|
||||||
|
i18n.merge_file('',
|
||||||
|
input: s[0],
|
||||||
|
output: '.'.join([name_array[0], name_array[1]]),
|
||||||
|
po_dir: '../po',
|
||||||
|
install: true,
|
||||||
|
install_dir: s[1],
|
||||||
|
type: 'desktop'
|
||||||
|
)
|
||||||
|
endforeach
|
||||||
|
|
||||||
|
classic_uuids = []
|
||||||
|
foreach e : classic_extensions
|
||||||
|
classic_uuids += e + uuid_suffix
|
||||||
|
endforeach
|
||||||
|
|
||||||
|
mode_conf = configuration_data()
|
||||||
|
mode_conf.set('CLASSIC_EXTENSIONS', '"' + '", "'.join(classic_uuids) + '"')
|
||||||
|
|
||||||
|
mode_file = 'classic.json'
|
||||||
|
configure_file(
|
||||||
|
input: mode_file + '.in',
|
||||||
|
output: mode_file,
|
||||||
|
configuration: mode_conf,
|
||||||
|
install_dir: modedir
|
||||||
|
)
|
||||||
|
|
||||||
|
theme_sources = files(
|
||||||
|
'gnome-shell-sass/_colors.scss',
|
||||||
|
'gnome-shell-sass/_common.scss',
|
||||||
|
'gnome-shell-sass/_drawing.scss',
|
||||||
|
'gnome-shell-sass/_high-contrast-colors.scss'
|
||||||
|
)
|
||||||
|
|
||||||
|
theme_data = [
|
||||||
|
'calendar-today.svg',
|
||||||
|
'classic-process-working.svg',
|
||||||
|
'classic-toggle-off-intl.svg',
|
||||||
|
'classic-toggle-off-us.svg',
|
||||||
|
'classic-toggle-on-intl.svg',
|
||||||
|
'classic-toggle-on-us.svg',
|
||||||
|
'gnome-classic-high-contrast.css'
|
||||||
|
]
|
||||||
|
|
||||||
|
style = 'gnome-classic'
|
||||||
|
custom_target(style + '.css',
|
||||||
|
input: style + '.scss',
|
||||||
|
output: style + '.css',
|
||||||
|
depend_files: theme_sources,
|
||||||
|
command: [sassc, '-a', '@INPUT@', '@OUTPUT@'],
|
||||||
|
install: true,
|
||||||
|
install_dir: themedir
|
||||||
|
)
|
||||||
|
|
||||||
|
install_data(theme_data, install_dir: themedir)
|
||||||
|
|
||||||
|
classic_override = '00_org.gnome.shell.extensions.classic.gschema.override'
|
||||||
|
install_data(classic_override, install_dir: schemadir)
|
||||||
Executable
+37
@@ -0,0 +1,37 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
srcdir=`dirname $0`
|
||||||
|
srcdir=`(cd $srcdir && pwd)`
|
||||||
|
|
||||||
|
builddir=`mktemp -p $srcdir -d _build.XXXXXX` || exit 1
|
||||||
|
installdir=`mktemp -p $srcdir -d _install.XXXXXX` || exit 1
|
||||||
|
|
||||||
|
meson setup --prefix=$installdir -Dextension_set=all $srcdir $builddir
|
||||||
|
ninja -C$builddir install
|
||||||
|
|
||||||
|
rm -rf $srcdir/zip-files
|
||||||
|
mkdir $srcdir/zip-files
|
||||||
|
|
||||||
|
extensiondir=$installdir/share/gnome-shell/extensions
|
||||||
|
schemadir=$installdir/share/glib-2.0/schemas
|
||||||
|
localedir=$installdir/share/locale
|
||||||
|
|
||||||
|
for f in $extensiondir/*; do
|
||||||
|
name=`basename ${f%%@*}`
|
||||||
|
uuid=$name@gnome-shell-extensions.gcampax.github.com
|
||||||
|
schema=$schemadir/org.gnome.shell.extensions.$name.gschema.xml
|
||||||
|
|
||||||
|
cp $srcdir/NEWS $srcdir/COPYING $f
|
||||||
|
cp -r $localedir $f
|
||||||
|
|
||||||
|
if [ -f $schema ]; then
|
||||||
|
mkdir $f/schemas
|
||||||
|
cp $schema $f/schemas;
|
||||||
|
glib-compile-schemas $f/schemas
|
||||||
|
fi
|
||||||
|
|
||||||
|
(cd $f && zip -rmq $srcdir/zip-files/$uuid.shell-extension.zip .)
|
||||||
|
done
|
||||||
|
|
||||||
|
rm -rf $builddir
|
||||||
|
rm -rf $installdir
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
include $(top_srcdir)/include.mk
|
|
||||||
|
|
||||||
dist_extension_DATA = extension.js stylesheet.css $(EXTRA_MODULES)
|
|
||||||
nodist_extension_DATA = metadata.json $(top_srcdir)/lib/convenience.js $(EXTRA_EXTENSION)
|
|
||||||
|
|
||||||
EXTRA_DIST = metadata.json.in
|
|
||||||
|
|
||||||
metadata.json: metadata.json.in $(top_builddir)/config.status
|
|
||||||
$(AM_V_GEN) sed \
|
|
||||||
-e "s|[@]extension_id@|$(EXTENSION_ID)|" \
|
|
||||||
-e "s|[@]uuid@|$(uuid)|" \
|
|
||||||
-e "s|[@]gschemaname@|$(gschemaname)|" \
|
|
||||||
-e "s|[@]gettext_domain@|$(GETTEXT_PACKAGE)|" \
|
|
||||||
-e "s|[@]shell_current@|$(SHELL_VERSION)|" \
|
|
||||||
-e "s|[@]url@|$(extensionurl)|" \
|
|
||||||
$< > $@
|
|
||||||
|
|
||||||
CLEANFILES = metadata.json
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
DIST_SUBDIRS = $(ALL_EXTENSIONS)
|
|
||||||
|
|
||||||
SUBDIRS = $(ENABLED_EXTENSIONS)
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
EXTENSION_ID = alternate-tab
|
|
||||||
|
|
||||||
EXTRA_MODULES = prefs.js
|
|
||||||
|
|
||||||
include ../../extension.mk
|
|
||||||
include ../../settings.mk
|
|
||||||
@@ -1,530 +0,0 @@
|
|||||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
||||||
|
|
||||||
/* most of the code is borrowed from
|
|
||||||
* > js/ui/altTab.js <
|
|
||||||
* of the gnome-shell source code
|
|
||||||
*/
|
|
||||||
|
|
||||||
const Clutter = imports.gi.Clutter;
|
|
||||||
const Gdk = imports.gi.Gdk;
|
|
||||||
const Gio = imports.gi.Gio;
|
|
||||||
const Gtk = imports.gi.Gtk;
|
|
||||||
const Lang = imports.lang;
|
|
||||||
const Mainloop = imports.mainloop;
|
|
||||||
const Meta = imports.gi.Meta;
|
|
||||||
const Shell = imports.gi.Shell;
|
|
||||||
const St = imports.gi.St;
|
|
||||||
|
|
||||||
const AltTab = imports.ui.altTab;
|
|
||||||
const Main = imports.ui.main;
|
|
||||||
const ModalDialog = imports.ui.modalDialog;
|
|
||||||
const Tweener = imports.ui.tweener;
|
|
||||||
const WindowManager = imports.ui.windowManager;
|
|
||||||
|
|
||||||
const Gettext = imports.gettext.domain('gnome-shell-extensions');
|
|
||||||
const _ = Gettext.gettext;
|
|
||||||
const N_ = function(e) { return e };
|
|
||||||
|
|
||||||
const ExtensionUtils = imports.misc.extensionUtils;
|
|
||||||
const Me = ExtensionUtils.getCurrentExtension();
|
|
||||||
const Convenience = Me.imports.convenience;
|
|
||||||
|
|
||||||
let settings;
|
|
||||||
|
|
||||||
const POPUP_DELAY_TIMEOUT = 150; // milliseconds
|
|
||||||
|
|
||||||
const SETTINGS_BEHAVIOUR_KEY = 'behaviour';
|
|
||||||
const SETTINGS_HIGHLIGHT_SELECTED_KEY = 'highlight-selected';
|
|
||||||
|
|
||||||
const AltTabPopupWorkspaceIcons = new Lang.Class({
|
|
||||||
Name: 'AlternateTab.AltTabPopupWorkspaceIcons',
|
|
||||||
Extends: AltTab.AltTabPopup,
|
|
||||||
|
|
||||||
_windowActivated : function(thumbnailList, n) { },
|
|
||||||
|
|
||||||
show : function(backward, binding, mask) {
|
|
||||||
let appSys = Shell.AppSystem.get_default();
|
|
||||||
let apps = appSys.get_running ();
|
|
||||||
|
|
||||||
if (!apps.length)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (!Main.pushModal(this.actor)) {
|
|
||||||
// Probably someone else has a pointer grab, try again with keyboard only
|
|
||||||
if (!Main.pushModal(this.actor, global.get_current_time(), Meta.ModalOptions.POINTER_ALREADY_GRABBED)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this._haveModal = true;
|
|
||||||
this._modifierMask = AltTab.primaryModifier(mask);
|
|
||||||
|
|
||||||
this.actor.connect('key-press-event', Lang.bind(this, this._keyPressEvent));
|
|
||||||
this.actor.connect('key-release-event', Lang.bind(this, this._keyReleaseEvent));
|
|
||||||
|
|
||||||
this.actor.connect('button-press-event', Lang.bind(this, this._clickedOutside));
|
|
||||||
this.actor.connect('scroll-event', Lang.bind(this, this._onScroll));
|
|
||||||
|
|
||||||
this._appSwitcher = new WindowSwitcher(apps, this);
|
|
||||||
this.actor.add_actor(this._appSwitcher.actor);
|
|
||||||
this._appSwitcher.connect('item-activated', Lang.bind(this, this._appActivated));
|
|
||||||
this._appSwitcher.connect('item-entered', Lang.bind(this, this._appEntered));
|
|
||||||
|
|
||||||
this._appIcons = this._appSwitcher.icons;
|
|
||||||
|
|
||||||
// Need to force an allocation so we can figure out whether we
|
|
||||||
// need to scroll when selecting
|
|
||||||
this.actor.opacity = 0;
|
|
||||||
this.actor.show();
|
|
||||||
this.actor.get_allocation_box();
|
|
||||||
|
|
||||||
this._highlight_selected = settings.get_boolean(SETTINGS_HIGHLIGHT_SELECTED_KEY);
|
|
||||||
|
|
||||||
// Make the initial selection
|
|
||||||
if (binding == 'switch_group') {
|
|
||||||
//see AltTab.AltTabPopup.show function
|
|
||||||
//cached windows are always of length one, so select first app and the window
|
|
||||||
//the direction doesn't matter, so ignore backward
|
|
||||||
this._select(0, 0);
|
|
||||||
} else if (binding == 'switch_group_backward') {
|
|
||||||
this._select(0, 0);
|
|
||||||
} else if (binding == 'switch_windows_backward') {
|
|
||||||
this._select(this._appIcons.length - 1);
|
|
||||||
} else if (this._appIcons.length == 1) {
|
|
||||||
this._select(0);
|
|
||||||
} else if (backward) {
|
|
||||||
this._select(this._appIcons.length - 1);
|
|
||||||
} else {
|
|
||||||
this._select(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// There's a race condition; if the user released Alt before
|
|
||||||
// we got the grab, then we won't be notified. (See
|
|
||||||
// https://bugzilla.gnome.org/show_bug.cgi?id=596695 for
|
|
||||||
// details.) So we check now. (Have to do this after updating
|
|
||||||
// selection.)
|
|
||||||
let [x, y, mods] = global.get_pointer();
|
|
||||||
if (!(mods & this._modifierMask)) {
|
|
||||||
this._finish();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// We delay showing the popup so that fast Alt+Tab users aren't
|
|
||||||
// disturbed by the popup briefly flashing.
|
|
||||||
this._initialDelayTimeoutId = Mainloop.timeout_add(POPUP_DELAY_TIMEOUT,
|
|
||||||
Lang.bind(this, function () {
|
|
||||||
this.actor.opacity = 255;
|
|
||||||
this._initialDelayTimeoutId = 0;
|
|
||||||
}));
|
|
||||||
|
|
||||||
return true;
|
|
||||||
},
|
|
||||||
|
|
||||||
_select : function(app, window, forceAppFocus) {
|
|
||||||
if (app != this._currentApp || window == null) {
|
|
||||||
if (this._thumbnails)
|
|
||||||
this._destroyThumbnails();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this._thumbnailTimeoutId != 0) {
|
|
||||||
Mainloop.source_remove(this._thumbnailTimeoutId);
|
|
||||||
this._thumbnailTimeoutId = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
this._thumbnailsFocused = (window != null) && !forceAppFocus;
|
|
||||||
|
|
||||||
this._currentApp = app;
|
|
||||||
this._currentWindow = window ? window : -1;
|
|
||||||
this._appSwitcher.highlight(app, this._thumbnailsFocused);
|
|
||||||
|
|
||||||
if (window != null) {
|
|
||||||
if (!this._thumbnails)
|
|
||||||
this._createThumbnails();
|
|
||||||
this._currentWindow = window;
|
|
||||||
this._thumbnails.highlight(window, forceAppFocus);
|
|
||||||
} else if (this._appIcons[this._currentApp].cachedWindows.length > 1 &&
|
|
||||||
!forceAppFocus) {
|
|
||||||
this._thumbnailTimeoutId = Mainloop.timeout_add (
|
|
||||||
THUMBNAIL_POPUP_TIME,
|
|
||||||
Lang.bind(this, this._timeoutPopupThumbnails));
|
|
||||||
}
|
|
||||||
if (this._highlight_selected) {
|
|
||||||
let current_app = this._appIcons[this._currentApp];
|
|
||||||
Main.activateWindow(current_app.cachedWindows[0]);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
_finish : function() {
|
|
||||||
let app = this._appIcons[this._currentApp];
|
|
||||||
if (!app)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* We've to restore the original Z-depth and order of all windows.
|
|
||||||
*
|
|
||||||
* Gnome-shell doesn't give an option to change Z-depth without
|
|
||||||
* messing the window's user_time.
|
|
||||||
*
|
|
||||||
* Pointless if the popup wasn't showed.
|
|
||||||
*/
|
|
||||||
if (this._highlight_selected && this.actor.opacity == 255) {
|
|
||||||
for (let i = this._appIcons.length - 2; i >= 0; i--) {
|
|
||||||
let app_walker = this._appIcons[i];
|
|
||||||
Main.activateWindow(app_walker.cachedWindows[0], global.get_current_time() - i - 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Main.activateWindow(app.cachedWindows[0]);
|
|
||||||
this.destroy();
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
const AppIcon = new Lang.Class({
|
|
||||||
Name: 'AlternateTab.AppIcon',
|
|
||||||
Extends: AltTab.AppIcon,
|
|
||||||
|
|
||||||
_init: function(app, window) {
|
|
||||||
this.app = app;
|
|
||||||
|
|
||||||
this.cachedWindows = [];
|
|
||||||
this.cachedWindows.push(window);
|
|
||||||
|
|
||||||
this.actor = new St.BoxLayout({ style_class: 'alt-tab-app',
|
|
||||||
vertical: true });
|
|
||||||
this.icon = null;
|
|
||||||
this._iconBin = new St.Bin({ x_fill: true, y_fill: true });
|
|
||||||
|
|
||||||
this.actor.add(this._iconBin, { x_fill: false, y_fill: false } );
|
|
||||||
|
|
||||||
let title = window.get_title();
|
|
||||||
if (title) {
|
|
||||||
this.label = new St.Label({ text: title });
|
|
||||||
let bin = new St.Bin({ x_align: St.Align.MIDDLE });
|
|
||||||
bin.add_actor(this.label);
|
|
||||||
this.actor.add(bin);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
this.label = new St.Label({ text: this.app.get_name() });
|
|
||||||
this.actor.add(this.label, { x_fill: false });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
const WindowSwitcher = new Lang.Class({
|
|
||||||
Name: 'AlternateTab.WindowSwitcher',
|
|
||||||
Extends: AltTab.AppSwitcher,
|
|
||||||
|
|
||||||
_init : function(apps, altTabPopup) {
|
|
||||||
// Horrible HACK!
|
|
||||||
// We inherit from AltTab.AppSwitcher, but only chain up to
|
|
||||||
// AltTab.SwitcherList._init, to bypass AltTab.AppSwitcher._init
|
|
||||||
AltTab.SwitcherList.prototype._init.call(this, true);
|
|
||||||
|
|
||||||
// Construct the AppIcons, sort by time, add to the popup
|
|
||||||
let activeWorkspace = global.screen.get_active_workspace();
|
|
||||||
let workspaceIcons = [];
|
|
||||||
let otherIcons = [];
|
|
||||||
for (let i = 0; i < apps.length; i++) {
|
|
||||||
// Cache the window list now; we don't handle dynamic changes here,
|
|
||||||
// and we don't want to be continually retrieving it
|
|
||||||
let windows = apps[i].get_windows();
|
|
||||||
|
|
||||||
for(let j = 0; j < windows.length; j++) {
|
|
||||||
let appIcon = new AppIcon(apps[i], windows[j]);
|
|
||||||
if (this._isWindowOnWorkspace(windows[j], activeWorkspace)) {
|
|
||||||
workspaceIcons.push(appIcon);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
otherIcons.push(appIcon);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
workspaceIcons.sort(Lang.bind(this, this._sortAppIcon));
|
|
||||||
otherIcons.sort(Lang.bind(this, this._sortAppIcon));
|
|
||||||
|
|
||||||
if(otherIcons.length > 0) {
|
|
||||||
let mostRecentOtherIcon = otherIcons[0];
|
|
||||||
otherIcons = [];
|
|
||||||
otherIcons.push(mostRecentOtherIcon);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.icons = [];
|
|
||||||
this._arrows = [];
|
|
||||||
for (let i = 0; i < workspaceIcons.length; i++)
|
|
||||||
this._addIcon(workspaceIcons[i]);
|
|
||||||
if (workspaceIcons.length > 0 && otherIcons.length > 0)
|
|
||||||
this.addSeparator();
|
|
||||||
for (let i = 0; i < otherIcons.length; i++)
|
|
||||||
this._addIcon(otherIcons[i]);
|
|
||||||
|
|
||||||
this._curApp = -1;
|
|
||||||
this._iconSize = 0;
|
|
||||||
this._altTabPopup = altTabPopup;
|
|
||||||
this._mouseTimeOutId = 0;
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
_isWindowOnWorkspace: function(w, workspace) {
|
|
||||||
if (w.get_workspace() == workspace)
|
|
||||||
return true;
|
|
||||||
return false;
|
|
||||||
},
|
|
||||||
|
|
||||||
_sortAppIcon : function(appIcon1, appIcon2) {
|
|
||||||
let t1 = appIcon1.cachedWindows[0].get_user_time();
|
|
||||||
let t2 = appIcon2.cachedWindows[0].get_user_time();
|
|
||||||
if (t2 > t1) return 1;
|
|
||||||
else return -1;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
const AltTabPopupAllThumbnails = new Lang.Class({
|
|
||||||
Name: 'AlternateTab.AltTabPopup.AllThumbnails',
|
|
||||||
Extends: AltTab.AltTabPopup,
|
|
||||||
|
|
||||||
_init : function() {
|
|
||||||
this.actor = new Shell.GenericContainer({ name: 'altTabPopup',
|
|
||||||
reactive: true });
|
|
||||||
|
|
||||||
this.actor.connect('get-preferred-width', Lang.bind(this, this._getPreferredWidth));
|
|
||||||
this.actor.connect('get-preferred-height', Lang.bind(this, this._getPreferredHeight));
|
|
||||||
this.actor.connect('allocate', Lang.bind(this, this._allocate));
|
|
||||||
|
|
||||||
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
|
|
||||||
|
|
||||||
this._haveModal = false;
|
|
||||||
|
|
||||||
this._currentApp = 0;
|
|
||||||
this._currentWindow = -1;
|
|
||||||
this._thumbnailTimeoutId = 0;
|
|
||||||
this._motionTimeoutId = 0;
|
|
||||||
|
|
||||||
|
|
||||||
// Initially disable hover so we ignore the enter-event if
|
|
||||||
// the switcher appears underneath the current pointer location
|
|
||||||
this._disableHover();
|
|
||||||
|
|
||||||
//this.show();
|
|
||||||
Main.uiGroup.add_actor(this.actor);
|
|
||||||
//this._select(0);
|
|
||||||
},
|
|
||||||
|
|
||||||
show : function(backward, binding, mask) {
|
|
||||||
let windows = global.get_window_actors();
|
|
||||||
|
|
||||||
let list = '';
|
|
||||||
let normal_windows= [];
|
|
||||||
let appIcons = [];
|
|
||||||
let appSys = Shell.AppSystem.get_default();
|
|
||||||
let apps = appSys.get_running();
|
|
||||||
|
|
||||||
for (let w = windows.length-1; w >= 0; w--) {
|
|
||||||
let win = windows[w].get_meta_window();
|
|
||||||
normal_windows.push(win);
|
|
||||||
}
|
|
||||||
normal_windows.sort(Lang.bind(this, this._sortWindows));
|
|
||||||
|
|
||||||
let win_on_top = normal_windows.shift();
|
|
||||||
normal_windows.push(win_on_top);
|
|
||||||
windows = normal_windows;
|
|
||||||
for (let w = 0; w < windows.length; w++) {
|
|
||||||
let win = windows[w];
|
|
||||||
|
|
||||||
let ap1 = null;
|
|
||||||
for (let i = 0;i < apps.length; i++) {
|
|
||||||
let app_wins = apps[i].get_windows();
|
|
||||||
for (let j = 0;j < app_wins.length; j++) {
|
|
||||||
if (app_wins[j] == win)
|
|
||||||
ap1 = new AltTab.AppIcon(apps[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (ap1 != null) {
|
|
||||||
ap1.cachedWindows = [win];
|
|
||||||
appIcons.push(ap1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!windows.length) {
|
|
||||||
this.destroy();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!Main.pushModal(this.actor)) {
|
|
||||||
// Probably someone else has a pointer grab, try again with keyboard only
|
|
||||||
if (!Main.pushModal(this.actor, global.get_current_time(), Meta.ModalOptions.POINTER_ALREADY_GRABBED)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this._haveModal = true;
|
|
||||||
this._modifierMask = AltTab.primaryModifier(mask);
|
|
||||||
|
|
||||||
this.actor.connect('key-press-event', Lang.bind(this, this._keyPressEvent));
|
|
||||||
this.actor.connect('key-release-event', Lang.bind(this, this._keyReleaseEvent));
|
|
||||||
|
|
||||||
this.actor.connect('button-press-event', Lang.bind(this, this._clickedOutside));
|
|
||||||
this.actor.connect('scroll-event', Lang.bind(this, this._onScroll));
|
|
||||||
|
|
||||||
this._appSwitcher = new WindowList(windows);
|
|
||||||
this._appSwitcher._altTabPopup=this;
|
|
||||||
this.actor.add_actor(this._appSwitcher.actor);
|
|
||||||
this._appSwitcher.connect('item-activated', Lang.bind(this, this._appActivated));
|
|
||||||
this._appSwitcher.connect('item-entered', Lang.bind(this, this._appEntered));
|
|
||||||
|
|
||||||
this._appIcons = appIcons;
|
|
||||||
|
|
||||||
// make the initial selection
|
|
||||||
if (backward)
|
|
||||||
this._select(windows.length - 2);
|
|
||||||
else
|
|
||||||
this._select(0);
|
|
||||||
|
|
||||||
this.actor.opacity = 0;
|
|
||||||
this.actor.show();
|
|
||||||
|
|
||||||
// There's a race condition; if the user released Alt before
|
|
||||||
// we got the grab, then we won't be notified. (See
|
|
||||||
// https://bugzilla.gnome.org/show_bug.cgi?id=596695 for
|
|
||||||
// details.) So we check now. (Have to do this after updating
|
|
||||||
// selection.)
|
|
||||||
let [x, y, mods] = global.get_pointer();
|
|
||||||
if (!(mods & this._modifierMask)) {
|
|
||||||
this._finish();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// We delay showing the popup so that fast Alt+Tab users aren't
|
|
||||||
// disturbed by the popup briefly flashing.
|
|
||||||
this._initialDelayTimeoutId = Mainloop.timeout_add(AltTab.POPUP_DELAY_TIMEOUT,
|
|
||||||
Lang.bind(this, function () {
|
|
||||||
this.actor.opacity = 255;
|
|
||||||
this._initialDelayTimeoutId = 0;
|
|
||||||
}));
|
|
||||||
|
|
||||||
return true
|
|
||||||
},
|
|
||||||
|
|
||||||
_sortWindows : function(win1,win2) {
|
|
||||||
let t1 = win1.get_user_time();
|
|
||||||
let t2 = win2.get_user_time();
|
|
||||||
if (t2 > t1) return 1;
|
|
||||||
else return -1;
|
|
||||||
},
|
|
||||||
|
|
||||||
_appActivated : function(thumbnailList, n) {
|
|
||||||
let appIcon = this._appIcons[this._currentApp];
|
|
||||||
Main.activateWindow(appIcon.cachedWindows[0]);
|
|
||||||
this.destroy();
|
|
||||||
},
|
|
||||||
|
|
||||||
_finish : function() {
|
|
||||||
let app = this._appIcons[this._currentApp];
|
|
||||||
Main.activateWindow(app.cachedWindows[0]);
|
|
||||||
this.destroy();
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const WindowList = new Lang.Class({
|
|
||||||
Name: 'AlternateTab.WindowList',
|
|
||||||
Extends: AltTab.SwitcherList,
|
|
||||||
|
|
||||||
_init : function(windows) {
|
|
||||||
this.parent(true);
|
|
||||||
|
|
||||||
let activeWorkspace = global.screen.get_active_workspace();
|
|
||||||
this._labels = new Array();
|
|
||||||
this._thumbnailBins = new Array();
|
|
||||||
this._clones = new Array();
|
|
||||||
this._windows = windows;
|
|
||||||
this._arrows = new Array();
|
|
||||||
this.icons = new Array();
|
|
||||||
for (let w = 0; w < windows.length; w++) {
|
|
||||||
let arrow = new St.DrawingArea({ style_class: 'switcher-arrow' });
|
|
||||||
arrow.connect('repaint', Lang.bind(this, function (area) {
|
|
||||||
Shell.draw_box_pointer(area, Shell.PointerDirection.DOWN);
|
|
||||||
}));
|
|
||||||
this._list.add_actor(arrow);
|
|
||||||
this._arrows.push(arrow);
|
|
||||||
|
|
||||||
arrow.hide();
|
|
||||||
|
|
||||||
let win=windows[w];
|
|
||||||
|
|
||||||
let appSys = Shell.AppSystem.get_default();
|
|
||||||
let apps = appSys.get_running();
|
|
||||||
let ap1 = null;
|
|
||||||
for (let i = 0; i < apps.length; i++) {
|
|
||||||
let app_wins = apps[i].get_windows();
|
|
||||||
for (let j = 0; j < app_wins.length; j++) {
|
|
||||||
if (app_wins[j] == win) {
|
|
||||||
ap1 = new AltTab.AppIcon(apps[i]);
|
|
||||||
let mutterWindow = win.get_compositor_private();
|
|
||||||
let windowTexture = mutterWindow.get_texture ();
|
|
||||||
let [width, height] = windowTexture.get_size();
|
|
||||||
let scale = Math.min(1.0, 128 / width, 128 / height);
|
|
||||||
|
|
||||||
let clone = new Clutter.Clone ({ source: windowTexture, reactive: true, width: width * scale, height: height * scale });
|
|
||||||
ap1.icon = ap1.app.create_icon_texture(128);
|
|
||||||
ap1._iconBin.set_size(128,128);
|
|
||||||
ap1._iconBin.child = clone;
|
|
||||||
|
|
||||||
ap1.label.text = win.get_title();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (ap1 != null) {
|
|
||||||
ap1.cachedWindows = [win];
|
|
||||||
this.addItem(ap1.actor, ap1.label);
|
|
||||||
this.icons.push(ap1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
addSeparator: function () {
|
|
||||||
this._separator=null;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
const MODES = {
|
|
||||||
all_thumbnails: AltTabPopupAllThumbnails,
|
|
||||||
workspace_icons: AltTabPopupWorkspaceIcons,
|
|
||||||
};
|
|
||||||
|
|
||||||
function doAltTab(display, screen, window, binding) {
|
|
||||||
let behaviour = settings.get_string(SETTINGS_BEHAVIOUR_KEY);
|
|
||||||
|
|
||||||
// alt-tab having no effect is unexpected, even with wrong settings
|
|
||||||
if (!(behaviour in MODES))
|
|
||||||
behaviour = 'all_thumbnails';
|
|
||||||
|
|
||||||
if (Main.wm._workspaceSwitcherPopup)
|
|
||||||
Main.wm._workspaceSwitcherPopup.actor.hide();
|
|
||||||
|
|
||||||
let modifiers = binding.get_modifiers()
|
|
||||||
let backwards = modifiers & Meta.VirtualModifier.SHIFT_MASK;
|
|
||||||
|
|
||||||
let constructor = MODES[behaviour];
|
|
||||||
let popup = new constructor();
|
|
||||||
if (!popup.show(backwards, binding.get_name(), binding.get_mask()))
|
|
||||||
popup.destroy();
|
|
||||||
}
|
|
||||||
|
|
||||||
function init(metadata) {
|
|
||||||
Convenience.initTranslations();
|
|
||||||
settings = Convenience.getSettings();
|
|
||||||
}
|
|
||||||
|
|
||||||
function enable() {
|
|
||||||
Meta.keybindings_set_custom_handler('switch-windows', doAltTab);
|
|
||||||
Meta.keybindings_set_custom_handler('switch-group', doAltTab);
|
|
||||||
Meta.keybindings_set_custom_handler('switch-windows-backward', doAltTab);
|
|
||||||
Meta.keybindings_set_custom_handler('switch-group-backward', doAltTab);
|
|
||||||
}
|
|
||||||
|
|
||||||
function disable() {
|
|
||||||
Meta.keybindings_set_custom_handler('switch-windows', Lang.bind(Main.wm, Main.wm._startAppSwitcher));
|
|
||||||
Meta.keybindings_set_custom_handler('switch-group', Lang.bind(Main.wm, Main.wm._startAppSwitcher));
|
|
||||||
Meta.keybindings_set_custom_handler('switch-windows-backward', Lang.bind(Main.wm, Main.wm._startAppSwitcher));
|
|
||||||
Meta.keybindings_set_custom_handler('switch-group-backward', Lang.bind(Main.wm, Main.wm._startAppSwitcher));
|
|
||||||
}
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
{
|
|
||||||
"extension-id": "@extension_id@",
|
|
||||||
"uuid": "@uuid@",
|
|
||||||
"settings-schema": "@gschemaname@",
|
|
||||||
"gettext-domain": "@gettext_domain@",
|
|
||||||
"name": "AlternateTab",
|
|
||||||
"description": "A replacement for Alt-Tab, allows to cycle between windows and does not group by application",
|
|
||||||
"original-authors": [ "jw@bargsten.org", "thomas.bouffon@gmail.com" ],
|
|
||||||
"shell-version": [ "@shell_current@" ],
|
|
||||||
"url": "@url@"
|
|
||||||
}
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
<schemalist gettext-domain="gnome-shell-extensions">
|
|
||||||
<enum id="org.gnome.shell.extensions.alternate-tab.BehaviourMode">
|
|
||||||
<value value="1" nick="all_thumbnails"/>
|
|
||||||
<value value="2" nick="workspace_icons"/>
|
|
||||||
</enum>
|
|
||||||
<schema id="org.gnome.shell.extensions.alternate-tab" path="/org/gnome/shell/extensions/alternate-tab/">
|
|
||||||
<key name="behaviour" enum="org.gnome.shell.extensions.alternate-tab.BehaviourMode">
|
|
||||||
<default>'all_thumbnails'</default>
|
|
||||||
<_summary>The alt tab behaviour.</_summary>
|
|
||||||
<_description>Sets the Alt-Tab behaviour. Possible values are: all_thumbnails and workspace_icons.
|
|
||||||
See the configuration dialogs for details.</_description>
|
|
||||||
</key>
|
|
||||||
<key type="b" name="highlight-selected">
|
|
||||||
<default>false</default>
|
|
||||||
<summary>Bring each selected window to the front.</summary>
|
|
||||||
<description>Bring each window to the front in turn as Alt+Tab is pressed.</description>
|
|
||||||
</key>
|
|
||||||
</schema>
|
|
||||||
</schemalist>
|
|
||||||
@@ -1,124 +0,0 @@
|
|||||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
||||||
|
|
||||||
/* most of the code is borrowed from
|
|
||||||
* > js/ui/altTab.js <
|
|
||||||
* of the gnome-shell source code
|
|
||||||
*/
|
|
||||||
|
|
||||||
const Gdk = imports.gi.Gdk;
|
|
||||||
const Gio = imports.gi.Gio;
|
|
||||||
const Gtk = imports.gi.Gtk;
|
|
||||||
const GObject = imports.gi.GObject;
|
|
||||||
const Lang = imports.lang;
|
|
||||||
|
|
||||||
const Gettext = imports.gettext.domain('gnome-shell-extensions');
|
|
||||||
const _ = Gettext.gettext;
|
|
||||||
const N_ = function(e) { return e };
|
|
||||||
|
|
||||||
const ExtensionUtils = imports.misc.extensionUtils;
|
|
||||||
const Me = ExtensionUtils.getCurrentExtension();
|
|
||||||
const Convenience = Me.imports.convenience;
|
|
||||||
|
|
||||||
const SETTINGS_BEHAVIOUR_KEY = 'behaviour';
|
|
||||||
const SETTINGS_HIGHLIGHT_KEY = 'highlight-selected';
|
|
||||||
|
|
||||||
const MODES = {
|
|
||||||
all_thumbnails: {
|
|
||||||
name: N_("All & Thumbnails"),
|
|
||||||
description: N_("This mode presents all applications from all workspaces in one selection \
|
|
||||||
list. Instead of using the application icon of every window, it uses small \
|
|
||||||
thumbnails resembling the window itself."),
|
|
||||||
extra_widgets: [ ]
|
|
||||||
},
|
|
||||||
workspace_icons: {
|
|
||||||
name: N_("Workspace & Icons"),
|
|
||||||
description: N_("This mode let's you switch between the applications of your current \
|
|
||||||
workspace and gives you additionally the option to switch to the last used \
|
|
||||||
application of your previous workspace. This is always the last symbol in \
|
|
||||||
the list and is segregated by a separator/vertical line if available. \n\
|
|
||||||
Every window is represented by its application icon."),
|
|
||||||
extra_widgets: [
|
|
||||||
{ label: N_("Move current selection to front before closing the popup"), key: SETTINGS_HIGHLIGHT_KEY }
|
|
||||||
]
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const AltTabSettingsWidget = new GObject.Class({
|
|
||||||
Name: 'AlternateTab.Prefs.AltTabSettingsWidget',
|
|
||||||
GTypeName: 'AltTabSettingsWidget',
|
|
||||||
Extends: Gtk.Grid,
|
|
||||||
|
|
||||||
_init : function(params) {
|
|
||||||
this.parent(params);
|
|
||||||
this.column_spacing = 10;
|
|
||||||
this.margin = 10;
|
|
||||||
|
|
||||||
this._settings = Convenience.getSettings();
|
|
||||||
|
|
||||||
let introLabel = _("The Alternate Tab can be used in different modes, that \
|
|
||||||
affect the way windows are chosen and presented.");
|
|
||||||
|
|
||||||
this.attach(new Gtk.Label({ label: introLabel, wrap: true, sensitive: true,
|
|
||||||
margin_bottom: 10, margin_top: 5 }),
|
|
||||||
0, 0, 2, 1);
|
|
||||||
|
|
||||||
let top = 1;
|
|
||||||
let radio = null;
|
|
||||||
let currentMode = this._settings.get_string(SETTINGS_BEHAVIOUR_KEY);
|
|
||||||
for (let mode in MODES) {
|
|
||||||
// copy the mode variable because it has function scope, not block scope
|
|
||||||
// so cannot be used in a closure
|
|
||||||
let modeCapture = mode;
|
|
||||||
let obj = MODES[mode];
|
|
||||||
let name = Gettext.gettext(obj.name);
|
|
||||||
let description = Gettext.gettext(obj.description);
|
|
||||||
let nextra = obj.extra_widgets.length;
|
|
||||||
|
|
||||||
radio = new Gtk.RadioButton({ group: radio, label: name, valign: Gtk.Align.START });
|
|
||||||
radio.connect('toggled', Lang.bind(this, function(widget) {
|
|
||||||
if (widget.active)
|
|
||||||
this._settings.set_string(SETTINGS_BEHAVIOUR_KEY, modeCapture);
|
|
||||||
this._updateSensitivity(widget, widget.active);
|
|
||||||
}));
|
|
||||||
this.attach(radio, 0, top, 1, nextra + 1);
|
|
||||||
|
|
||||||
let descriptionLabel = new Gtk.Label({ label: description, wrap: true, sensitive: true,
|
|
||||||
xalign: 0.0, justify: Gtk.Justification.FILL });
|
|
||||||
this.attach(descriptionLabel, 1, top, 1, 1);
|
|
||||||
|
|
||||||
radio._extra = [];
|
|
||||||
for (let i = 0; i < nextra; i++) {
|
|
||||||
let key = obj.extra_widgets[i].key;
|
|
||||||
let label = Gettext.gettext(obj.extra_widgets[i].label);
|
|
||||||
|
|
||||||
let extra = new Gtk.CheckButton({ label: label });
|
|
||||||
this._settings.bind(key, extra, 'active', Gio.SettingsBindFlags.DEFAULT);
|
|
||||||
|
|
||||||
radio._extra.push(extra);
|
|
||||||
this.attach(extra, 1, top + i + 1, 1, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mode == currentMode)
|
|
||||||
radio.active = true;
|
|
||||||
this._updateSensitivity(radio, radio.active);
|
|
||||||
|
|
||||||
top += nextra + 1;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
_updateSensitivity: function(widget, active) {
|
|
||||||
for (let i = 0; i < widget._extra.length; i++)
|
|
||||||
widget._extra[i].sensitive = active;
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
function init() {
|
|
||||||
Convenience.initTranslations();
|
|
||||||
}
|
|
||||||
|
|
||||||
function buildPrefsWidget() {
|
|
||||||
let widget = new AltTabSettingsWidget();
|
|
||||||
widget.show_all();
|
|
||||||
|
|
||||||
return widget;
|
|
||||||
}
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
EXTENSION_ID = alternative-status-menu
|
|
||||||
|
|
||||||
include ../../extension.mk
|
|
||||||
include ../../settings.mk
|
|
||||||
@@ -1,134 +0,0 @@
|
|||||||
/* -*- mode: js2 - indent-tabs-mode: nil - js2-basic-offset: 4 -*- */
|
|
||||||
const Lang = imports.lang;
|
|
||||||
const St = imports.gi.St;
|
|
||||||
const Main = imports.ui.main;
|
|
||||||
const PopupMenu = imports.ui.popupMenu;
|
|
||||||
|
|
||||||
const Gettext = imports.gettext.domain('gnome-shell-extensions');
|
|
||||||
const _ = Gettext.gettext;
|
|
||||||
|
|
||||||
const ExtensionUtils = imports.misc.extensionUtils;
|
|
||||||
const Me = ExtensionUtils.getCurrentExtension();
|
|
||||||
const Convenience = Me.imports.convenience;
|
|
||||||
|
|
||||||
let suspend_item = null;
|
|
||||||
let hibernate_item = null;
|
|
||||||
let poweroff_item = null;
|
|
||||||
let suspend_signal_id = 0, hibernate_signal_id = 0;
|
|
||||||
let settings = null;
|
|
||||||
let setting_changed_id = 0;
|
|
||||||
|
|
||||||
function updateSuspend(object, pspec, item) {
|
|
||||||
item.actor.visible = object.get_can_suspend() && settings.get_boolean('allow-suspend');
|
|
||||||
}
|
|
||||||
|
|
||||||
function updateHibernate(object, pspec, item) {
|
|
||||||
item.actor.visible = object.get_can_hibernate() && settings.get_boolean('allow-hibernate');
|
|
||||||
}
|
|
||||||
|
|
||||||
function onSuspendActivate(item) {
|
|
||||||
Main.overview.hide();
|
|
||||||
|
|
||||||
this._screenSaverProxy.LockRemote(Lang.bind(this, function() {
|
|
||||||
this._upClient.suspend_sync(null);
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
function onHibernateActivate(item) {
|
|
||||||
Main.overview.hide();
|
|
||||||
|
|
||||||
this._screenSaverProxy.LockRemote(Lang.bind(this, function() {
|
|
||||||
this._upClient.hibernate_sync(null);
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Put your extension initialization code here
|
|
||||||
function init(metadata) {
|
|
||||||
Convenience.initTranslations();
|
|
||||||
}
|
|
||||||
|
|
||||||
function enable() {
|
|
||||||
let statusMenu = Main.panel._statusArea.userMenu;
|
|
||||||
|
|
||||||
settings = Convenience.getSettings();
|
|
||||||
|
|
||||||
let children = statusMenu.menu._getMenuItems();
|
|
||||||
let index = children.length;
|
|
||||||
|
|
||||||
/* find and destroy the old entry */
|
|
||||||
for (let i = children.length - 1; i >= 0; i--) {
|
|
||||||
if (children[i] == statusMenu._suspendOrPowerOffItem) {
|
|
||||||
children[i].destroy();
|
|
||||||
index = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* add the new entries */
|
|
||||||
suspend_item = new PopupMenu.PopupMenuItem(_("Suspend"));
|
|
||||||
suspend_item.connect('activate', Lang.bind(statusMenu, onSuspendActivate));
|
|
||||||
suspend_signal_id = statusMenu._upClient.connect('notify::can-suspend', Lang.bind(statusMenu, updateSuspend, suspend_item));
|
|
||||||
updateSuspend(statusMenu._upClient, null, suspend_item);
|
|
||||||
|
|
||||||
hibernate_item = new PopupMenu.PopupMenuItem(_("Hibernate"));
|
|
||||||
hibernate_item.connect('activate', Lang.bind(statusMenu, onHibernateActivate));
|
|
||||||
hibernate_signal_id = statusMenu._upClient.connect('notify::can-hibernate', Lang.bind(statusMenu, updateHibernate, hibernate_item));
|
|
||||||
updateHibernate(statusMenu._upClient, null, hibernate_item);
|
|
||||||
|
|
||||||
poweroff_item = new PopupMenu.PopupMenuItem(_("Power Off"));
|
|
||||||
poweroff_item.connect('activate', Lang.bind(statusMenu, function() {
|
|
||||||
this._session.ShutdownRemote();
|
|
||||||
}));
|
|
||||||
|
|
||||||
/* insert the entries at the found position */
|
|
||||||
statusMenu.menu.addMenuItem(suspend_item, index);
|
|
||||||
statusMenu.menu.addMenuItem(hibernate_item, index + 1);
|
|
||||||
statusMenu.menu.addMenuItem(poweroff_item, index + 2);
|
|
||||||
|
|
||||||
// clear out this to avoid criticals (we don't mess with
|
|
||||||
// updateSuspendOrPowerOff)
|
|
||||||
statusMenu._suspendOrPowerOffItem = null;
|
|
||||||
|
|
||||||
setting_changed_id = settings.connect('changed', function() {
|
|
||||||
updateSuspend(statusMenu._upClient, null, suspend_item);
|
|
||||||
updateHibernate(statusMenu._upClient, null, hibernate_item);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function disable() {
|
|
||||||
let statusMenu = Main.panel._statusArea.userMenu;
|
|
||||||
|
|
||||||
let children = statusMenu.menu._getMenuItems();
|
|
||||||
let index = children.length;
|
|
||||||
|
|
||||||
/* find the index for the previously created suspend entry */
|
|
||||||
for (let i = children.length - 1; i >= 0; i--) {
|
|
||||||
if (children[i] == suspend_item) {
|
|
||||||
index = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* disconnect signals */
|
|
||||||
statusMenu._upClient.disconnect(suspend_signal_id);
|
|
||||||
statusMenu._upClient.disconnect(hibernate_signal_id);
|
|
||||||
suspend_signal_id = hibernate_signal_id = 0;
|
|
||||||
|
|
||||||
settings.disconnect(setting_changed_id);
|
|
||||||
setting_changed_id = 0;
|
|
||||||
settings = null;
|
|
||||||
|
|
||||||
/* destroy the entries we had created */
|
|
||||||
suspend_item.destroy();
|
|
||||||
hibernate_item.destroy();
|
|
||||||
poweroff_item.destroy();
|
|
||||||
|
|
||||||
/* create a new suspend/poweroff entry */
|
|
||||||
/* empty strings are fine for the labels, since we immediately call updateSuspendOrPowerOff */
|
|
||||||
let item = new PopupMenu.PopupAlternatingMenuItem("", "");
|
|
||||||
/* restore the userMenu field */
|
|
||||||
statusMenu._suspendOrPowerOffItem = item;
|
|
||||||
statusMenu.menu.addMenuItem(item, index);
|
|
||||||
item.connect('activate', Lang.bind(statusMenu, statusMenu._onSuspendOrPowerOffActivate));
|
|
||||||
statusMenu._updateSuspendOrPowerOff();
|
|
||||||
}
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
{
|
|
||||||
"extension-id": "@extension_id@",
|
|
||||||
"uuid": "@uuid@",
|
|
||||||
"settings-schema": "@gschemaname@",
|
|
||||||
"gettext-domain": "@gettext_domain@",
|
|
||||||
"name": "Alternative Status Menu",
|
|
||||||
"description": "Replaces GNOME Shell Status Menu with one showing Suspend/Hibernate and Power Off as separate items",
|
|
||||||
"shell-version": [ "@shell_current@" ],
|
|
||||||
"url": "@url@"
|
|
||||||
}
|
|
||||||
-14
@@ -1,14 +0,0 @@
|
|||||||
<schemalist gettext-domain="gnome-shell-extensions">
|
|
||||||
<schema id="org.gnome.shell.extensions.alternative-status-menu" path="/org/gnome/shell/extensions/alternative-status-menu/">
|
|
||||||
<key name="allow-suspend" type="b">
|
|
||||||
<default>true</default>
|
|
||||||
<_summary>Enable suspending</_summary>
|
|
||||||
<_description>Control the visibility of the Suspend menu item</_description>
|
|
||||||
</key>
|
|
||||||
<key name="allow-hibernate" type="b">
|
|
||||||
<default>false</default>
|
|
||||||
<_summary>Enable hibernating</_summary>
|
|
||||||
<_description>Control the visibility of the Hibernate menu item</_description>
|
|
||||||
</key>
|
|
||||||
</schema>
|
|
||||||
</schemalist>
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
.popup-alternating-menu-item:alternate {
|
|
||||||
font-weight: normal !important;
|
|
||||||
}
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
EXTENSION_ID = apps-menu
|
|
||||||
|
|
||||||
include ../../extension.mk
|
|
||||||
@@ -1,97 +1,677 @@
|
|||||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||||
|
/* exported init enable disable */
|
||||||
|
|
||||||
const GMenu = imports.gi.GMenu;
|
const {
|
||||||
const Lang = imports.lang;
|
Atk, Clutter, Gio, GLib, GMenu, GObject, Gtk, Meta, Shell, St,
|
||||||
const Shell = imports.gi.Shell;
|
} = imports.gi;
|
||||||
const St = imports.gi.St;
|
const Signals = imports.signals;
|
||||||
|
|
||||||
|
const DND = imports.ui.dnd;
|
||||||
|
const ExtensionUtils = imports.misc.extensionUtils;
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const PanelMenu = imports.ui.panelMenu;
|
const PanelMenu = imports.ui.panelMenu;
|
||||||
const PopupMenu = imports.ui.popupMenu;
|
const PopupMenu = imports.ui.popupMenu;
|
||||||
|
|
||||||
const ICON_SIZE = 28;
|
const Gettext = imports.gettext.domain('gnome-shell-extensions');
|
||||||
|
const _ = Gettext.gettext;
|
||||||
|
|
||||||
const AppMenuItem = new Lang.Class({
|
const appSys = Shell.AppSystem.get_default();
|
||||||
Name: 'AppsMenu.AppMenuItem',
|
|
||||||
Extends: PopupMenu.PopupBaseMenuItem,
|
|
||||||
|
|
||||||
_init: function (app, params) {
|
const APPLICATION_ICON_SIZE = 32;
|
||||||
this.parent(params);
|
const HORIZ_FACTOR = 5;
|
||||||
|
const MENU_HEIGHT_OFFSET = 132;
|
||||||
|
const NAVIGATION_REGION_OVERSHOOT = 50;
|
||||||
|
|
||||||
|
Gio._promisify(Gio._LocalFilePrototype, 'query_info_async', 'query_info_finish');
|
||||||
|
Gio._promisify(Gio._LocalFilePrototype, 'set_attributes_async', 'set_attributes_finish');
|
||||||
|
|
||||||
|
var ApplicationMenuItem = GObject.registerClass(
|
||||||
|
class ApplicationMenuItem extends PopupMenu.PopupBaseMenuItem {
|
||||||
|
_init(button, app) {
|
||||||
|
super._init();
|
||||||
this._app = app;
|
this._app = app;
|
||||||
this.label = new St.Label({ text: app.get_name() });
|
this._button = button;
|
||||||
this.addActor(this.label);
|
|
||||||
this._icon = app.create_icon_texture(ICON_SIZE);
|
|
||||||
this.addActor(this._icon, { expand: false });
|
|
||||||
},
|
|
||||||
|
|
||||||
activate: function (event) {
|
this._iconBin = new St.Bin();
|
||||||
this._app.activate_full(-1, event.get_time());
|
this.add_child(this._iconBin);
|
||||||
|
|
||||||
this.parent(event);
|
let appLabel = new St.Label({
|
||||||
|
text: app.get_name(),
|
||||||
|
y_expand: true,
|
||||||
|
y_align: Clutter.ActorAlign.CENTER,
|
||||||
|
});
|
||||||
|
this.add_child(appLabel);
|
||||||
|
this.label_actor = appLabel;
|
||||||
|
|
||||||
|
let textureCache = St.TextureCache.get_default();
|
||||||
|
let iconThemeChangedId = textureCache.connect('icon-theme-changed',
|
||||||
|
this._updateIcon.bind(this));
|
||||||
|
this.connect('destroy', () => {
|
||||||
|
textureCache.disconnect(iconThemeChangedId);
|
||||||
|
});
|
||||||
|
this._updateIcon();
|
||||||
|
|
||||||
|
this._delegate = this;
|
||||||
|
let draggable = DND.makeDraggable(this);
|
||||||
|
|
||||||
|
let maybeStartDrag = draggable._maybeStartDrag;
|
||||||
|
draggable._maybeStartDrag = event => {
|
||||||
|
if (this._dragEnabled)
|
||||||
|
return maybeStartDrag.call(draggable, event);
|
||||||
|
return false;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
activate(event) {
|
||||||
|
this._app.open_new_window(-1);
|
||||||
|
this._button.selectCategory(null);
|
||||||
|
this._button.menu.toggle();
|
||||||
|
super.activate(event);
|
||||||
|
|
||||||
|
Main.overview.hide();
|
||||||
|
}
|
||||||
|
|
||||||
|
setActive(active, params) {
|
||||||
|
if (active)
|
||||||
|
this._button.scrollToButton(this);
|
||||||
|
super.setActive(active, params);
|
||||||
|
}
|
||||||
|
|
||||||
|
setDragEnabled(enabled) {
|
||||||
|
this._dragEnabled = enabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
getDragActor() {
|
||||||
|
return this._app.create_icon_texture(APPLICATION_ICON_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
getDragActorSource() {
|
||||||
|
return this._iconBin;
|
||||||
|
}
|
||||||
|
|
||||||
|
_updateIcon() {
|
||||||
|
let icon = this.getDragActor();
|
||||||
|
icon.style_class = 'icon-dropshadow';
|
||||||
|
this._iconBin.set_child(icon);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const ApplicationsButton = new Lang.Class({
|
var CategoryMenuItem = GObject.registerClass(
|
||||||
Name: 'AppsMenu.ApplicationsButton',
|
class CategoryMenuItem extends PopupMenu.PopupBaseMenuItem {
|
||||||
Extends: PanelMenu.SystemStatusButton,
|
_init(button, category) {
|
||||||
|
super._init();
|
||||||
|
this._category = category;
|
||||||
|
this._button = button;
|
||||||
|
|
||||||
_init: function() {
|
this._oldX = -1;
|
||||||
this.parent('start-here');
|
this._oldY = -1;
|
||||||
|
|
||||||
this._appSys = Shell.AppSystem.get_default();
|
let name;
|
||||||
this._installedChangedId = this._appSys.connect('installed-changed', Lang.bind(this, this._refresh));
|
if (this._category)
|
||||||
|
name = this._category.get_name();
|
||||||
|
else
|
||||||
|
name = _('Favorites');
|
||||||
|
|
||||||
|
this.add_child(new St.Label({ text: name }));
|
||||||
|
this.connect('motion-event', this._onMotionEvent.bind(this));
|
||||||
|
this.connect('notify::active', this._onActiveChanged.bind(this));
|
||||||
|
}
|
||||||
|
|
||||||
|
activate(event) {
|
||||||
|
this._button.selectCategory(this._category);
|
||||||
|
this._button.scrollToCatButton(this);
|
||||||
|
super.activate(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
_isNavigatingSubmenu([x, y]) {
|
||||||
|
let [posX, posY] = this.get_transformed_position();
|
||||||
|
|
||||||
|
if (this._oldX === -1) {
|
||||||
|
this._oldX = x;
|
||||||
|
this._oldY = y;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
let deltaX = Math.abs(x - this._oldX);
|
||||||
|
let deltaY = Math.abs(y - this._oldY);
|
||||||
|
|
||||||
|
this._oldX = x;
|
||||||
|
this._oldY = y;
|
||||||
|
|
||||||
|
// If it lies outside the x-coordinates then it is definitely outside.
|
||||||
|
if (posX > x || posX + this.width < x)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// If it lies inside the menu item then it is definitely inside.
|
||||||
|
if (posY <= y && posY + this.height >= y)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
// We want the keep-up triangle only if the movement is more
|
||||||
|
// horizontal than vertical.
|
||||||
|
if (deltaX * HORIZ_FACTOR < deltaY)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Check whether the point lies inside triangle ABC, and a similar
|
||||||
|
// triangle on the other side of the menu item.
|
||||||
|
//
|
||||||
|
// +---------------------+
|
||||||
|
// | menu item |
|
||||||
|
// A +---------------------+ C
|
||||||
|
// P |
|
||||||
|
// B
|
||||||
|
|
||||||
|
// Ensure that the point P always lies below line AC so that we can
|
||||||
|
// only check for triangle ABC.
|
||||||
|
if (posY > y) {
|
||||||
|
let offset = posY - y;
|
||||||
|
y = posY + this.height + offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ensure that A is (0, 0).
|
||||||
|
x -= posX;
|
||||||
|
y -= posY + this.height;
|
||||||
|
|
||||||
|
// Check which side of line AB the point P lies on by taking the
|
||||||
|
// cross-product of AB and AP. See:
|
||||||
|
// http://stackoverflow.com/questions/3461453/determine-which-side-of-a-line-a-point-lies
|
||||||
|
if (this.width * y - NAVIGATION_REGION_OVERSHOOT * x <= 0)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
_onMotionEvent(actor, event) {
|
||||||
|
let device = event.get_device();
|
||||||
|
if (!device.get_grabbed_actor()) {
|
||||||
|
this._oldX = -1;
|
||||||
|
this._oldY = -1;
|
||||||
|
device.grab(this);
|
||||||
|
}
|
||||||
|
this.hover = true;
|
||||||
|
|
||||||
|
if (this._isNavigatingSubmenu(event.get_coords()))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
this._oldX = -1;
|
||||||
|
this._oldY = -1;
|
||||||
|
this.hover = false;
|
||||||
|
device.ungrab();
|
||||||
|
|
||||||
|
let source = event.get_source();
|
||||||
|
if (source instanceof St.Widget)
|
||||||
|
source.sync_hover();
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
_onActiveChanged() {
|
||||||
|
if (!this.active)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this._button.selectCategory(this._category);
|
||||||
|
this._button.scrollToCatButton(this);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
class ApplicationsMenu extends PopupMenu.PopupMenu {
|
||||||
|
constructor(sourceActor, arrowAlignment, arrowSide, button) {
|
||||||
|
super(sourceActor, arrowAlignment, arrowSide);
|
||||||
|
this._button = button;
|
||||||
|
}
|
||||||
|
|
||||||
|
isEmpty() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
toggle() {
|
||||||
|
if (this.isOpen)
|
||||||
|
this._button.selectCategory(null);
|
||||||
|
super.toggle();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class DesktopTarget {
|
||||||
|
constructor() {
|
||||||
|
this._desktop = null;
|
||||||
|
this._desktopDestroyedId = 0;
|
||||||
|
|
||||||
|
this._windowAddedId =
|
||||||
|
global.window_group.connect('actor-added',
|
||||||
|
this._onWindowAdded.bind(this));
|
||||||
|
|
||||||
|
global.get_window_actors().forEach(a => {
|
||||||
|
this._onWindowAdded(a.get_parent(), a);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
get hasDesktop() {
|
||||||
|
return this._desktop !== null;
|
||||||
|
}
|
||||||
|
|
||||||
|
_onWindowAdded(group, actor) {
|
||||||
|
if (!(actor instanceof Meta.WindowActor))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (actor.meta_window.get_window_type() === Meta.WindowType.DESKTOP)
|
||||||
|
this._setDesktop(actor);
|
||||||
|
}
|
||||||
|
|
||||||
|
_setDesktop(desktop) {
|
||||||
|
if (this._desktop) {
|
||||||
|
this._desktop.disconnect(this._desktopDestroyedId);
|
||||||
|
this._desktopDestroyedId = 0;
|
||||||
|
|
||||||
|
delete this._desktop._delegate;
|
||||||
|
}
|
||||||
|
|
||||||
|
this._desktop = desktop;
|
||||||
|
this.emit('desktop-changed');
|
||||||
|
|
||||||
|
if (this._desktop) {
|
||||||
|
this._desktopDestroyedId = this._desktop.connect('destroy', () => {
|
||||||
|
this._setDesktop(null);
|
||||||
|
});
|
||||||
|
this._desktop._delegate = this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_getSourceAppInfo(source) {
|
||||||
|
if (!(source instanceof ApplicationMenuItem))
|
||||||
|
return null;
|
||||||
|
return source._app.app_info;
|
||||||
|
}
|
||||||
|
|
||||||
|
async _markTrusted(file) {
|
||||||
|
let modeAttr = Gio.FILE_ATTRIBUTE_UNIX_MODE;
|
||||||
|
let trustedAttr = 'metadata::trusted';
|
||||||
|
let queryFlags = Gio.FileQueryInfoFlags.NONE;
|
||||||
|
let ioPriority = GLib.PRIORITY_DEFAULT;
|
||||||
|
|
||||||
|
try {
|
||||||
|
let info = await file.query_info_async(modeAttr, queryFlags, ioPriority, null);
|
||||||
|
|
||||||
|
let mode = info.get_attribute_uint32(modeAttr) | 0o100;
|
||||||
|
info.set_attribute_uint32(modeAttr, mode);
|
||||||
|
info.set_attribute_string(trustedAttr, 'yes');
|
||||||
|
await file.set_attributes_async(info, queryFlags, ioPriority, null);
|
||||||
|
|
||||||
|
// Hack: force nautilus to reload file info
|
||||||
|
info = new Gio.FileInfo();
|
||||||
|
info.set_attribute_uint64(
|
||||||
|
Gio.FILE_ATTRIBUTE_TIME_ACCESS, GLib.get_real_time());
|
||||||
|
try {
|
||||||
|
await file.set_attributes_async(info, queryFlags, ioPriority, null);
|
||||||
|
} catch (e) {
|
||||||
|
log(`Failed to update access time: ${e.message}`);
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
log(`Failed to mark file as trusted: ${e.message}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
destroy() {
|
||||||
|
if (this._windowAddedId)
|
||||||
|
global.window_group.disconnect(this._windowAddedId);
|
||||||
|
this._windowAddedId = 0;
|
||||||
|
|
||||||
|
this._setDesktop(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
handleDragOver(source, _actor, _x, _y, _time) {
|
||||||
|
let appInfo = this._getSourceAppInfo(source);
|
||||||
|
if (!appInfo)
|
||||||
|
return DND.DragMotionResult.CONTINUE;
|
||||||
|
|
||||||
|
return DND.DragMotionResult.COPY_DROP;
|
||||||
|
}
|
||||||
|
|
||||||
|
acceptDrop(source, _actor, _x, _y, _time) {
|
||||||
|
let appInfo = this._getSourceAppInfo(source);
|
||||||
|
if (!appInfo)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
this.emit('app-dropped');
|
||||||
|
|
||||||
|
let desktop = GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_DESKTOP);
|
||||||
|
|
||||||
|
let src = Gio.File.new_for_path(appInfo.get_filename());
|
||||||
|
let dst = Gio.File.new_for_path(GLib.build_filenamev([desktop, src.get_basename()]));
|
||||||
|
|
||||||
|
try {
|
||||||
|
// copy_async() isn't introspectable :-(
|
||||||
|
src.copy(dst, Gio.FileCopyFlags.OVERWRITE, null, null);
|
||||||
|
this._markTrusted(dst);
|
||||||
|
} catch (e) {
|
||||||
|
log(`Failed to copy to desktop: ${e.message}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Signals.addSignalMethods(DesktopTarget.prototype);
|
||||||
|
|
||||||
|
let ApplicationsButton = GObject.registerClass(
|
||||||
|
class ApplicationsButton extends PanelMenu.Button {
|
||||||
|
_init() {
|
||||||
|
super._init(1.0, null, false);
|
||||||
|
|
||||||
|
this.setMenu(new ApplicationsMenu(this, 1.0, St.Side.TOP, this));
|
||||||
|
Main.panel.menuManager.addMenu(this.menu);
|
||||||
|
|
||||||
|
// At this moment applications menu is not keyboard navigable at
|
||||||
|
// all (so not accessible), so it doesn't make sense to set as
|
||||||
|
// role ATK_ROLE_MENU like other elements of the panel.
|
||||||
|
this.accessible_role = Atk.Role.LABEL;
|
||||||
|
|
||||||
|
let hbox = new St.BoxLayout({ style_class: 'panel-status-menu-box' });
|
||||||
|
|
||||||
|
this._label = new St.Label({
|
||||||
|
text: _('Applications'),
|
||||||
|
y_expand: true,
|
||||||
|
y_align: Clutter.ActorAlign.CENTER,
|
||||||
|
});
|
||||||
|
hbox.add_child(this._label);
|
||||||
|
hbox.add_child(PopupMenu.arrowIcon(St.Side.BOTTOM));
|
||||||
|
|
||||||
|
this.add_actor(hbox);
|
||||||
|
this.name = 'panelApplications';
|
||||||
|
this.label_actor = this._label;
|
||||||
|
|
||||||
|
this._showingId = Main.overview.connect('showing', () => {
|
||||||
|
this.add_accessible_state(Atk.StateType.CHECKED);
|
||||||
|
});
|
||||||
|
this._hidingId = Main.overview.connect('hiding', () => {
|
||||||
|
this.remove_accessible_state(Atk.StateType.CHECKED);
|
||||||
|
});
|
||||||
|
Main.layoutManager.connect('startup-complete',
|
||||||
|
this._setKeybinding.bind(this));
|
||||||
|
this._setKeybinding();
|
||||||
|
|
||||||
|
this._desktopTarget = new DesktopTarget();
|
||||||
|
this._desktopTarget.connect('app-dropped', () => {
|
||||||
|
this.menu.close();
|
||||||
|
});
|
||||||
|
this._desktopTarget.connect('desktop-changed', () => {
|
||||||
|
this._applicationsButtons.forEach(item => {
|
||||||
|
item.setDragEnabled(this._desktopTarget.hasDesktop);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
this._tree = new GMenu.Tree({ menu_basename: 'applications.menu' });
|
||||||
|
this._treeChangedId = this._tree.connect('changed',
|
||||||
|
this._onTreeChanged.bind(this));
|
||||||
|
|
||||||
|
this._applicationsButtons = new Map();
|
||||||
|
this.reloadFlag = false;
|
||||||
|
this._createLayout();
|
||||||
this._display();
|
this._display();
|
||||||
},
|
this._installedChangedId = appSys.connect('installed-changed',
|
||||||
|
this._onTreeChanged.bind(this));
|
||||||
|
}
|
||||||
|
|
||||||
destroy: function() {
|
_onTreeChanged() {
|
||||||
this._appSys.disconnect(this._installedChangedId);
|
if (this.menu.isOpen) {
|
||||||
|
this._redisplay();
|
||||||
|
this.mainBox.show();
|
||||||
|
} else {
|
||||||
|
this.reloadFlag = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
this.parent();
|
_createVertSeparator() {
|
||||||
},
|
let separator = new St.DrawingArea({
|
||||||
|
style_class: 'calendar-vertical-separator',
|
||||||
|
pseudo_class: 'highlighted',
|
||||||
|
});
|
||||||
|
separator.connect('repaint', this._onVertSepRepaint.bind(this));
|
||||||
|
return separator;
|
||||||
|
}
|
||||||
|
|
||||||
_refresh: function() {
|
_onDestroy() {
|
||||||
this._clearAll();
|
super._onDestroy();
|
||||||
|
|
||||||
|
Main.overview.disconnect(this._showingId);
|
||||||
|
Main.overview.disconnect(this._hidingId);
|
||||||
|
appSys.disconnect(this._installedChangedId);
|
||||||
|
this._tree.disconnect(this._treeChangedId);
|
||||||
|
this._tree = null;
|
||||||
|
|
||||||
|
Main.wm.setCustomKeybindingHandler('panel-main-menu',
|
||||||
|
Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW,
|
||||||
|
Main.sessionMode.hasOverview
|
||||||
|
? Main.overview.toggle.bind(Main.overview)
|
||||||
|
: null);
|
||||||
|
|
||||||
|
this._desktopTarget.destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
_onMenuKeyPress(actor, event) {
|
||||||
|
let symbol = event.get_key_symbol();
|
||||||
|
if (symbol === Clutter.KEY_Left || symbol === Clutter.KEY_Right) {
|
||||||
|
let direction = symbol === Clutter.KEY_Left
|
||||||
|
? Gtk.DirectionType.LEFT : Gtk.DirectionType.RIGHT;
|
||||||
|
if (this.menu.actor.navigate_focus(global.stage.key_focus, direction, false))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return super._onMenuKeyPress(actor, event);
|
||||||
|
}
|
||||||
|
|
||||||
|
_onVertSepRepaint(area) {
|
||||||
|
let cr = area.get_context();
|
||||||
|
let themeNode = area.get_theme_node();
|
||||||
|
let [width, height] = area.get_surface_size();
|
||||||
|
let stippleColor = themeNode.get_color('-stipple-color');
|
||||||
|
let stippleWidth = themeNode.get_length('-stipple-width');
|
||||||
|
let x = Math.floor(width / 2) + 0.5;
|
||||||
|
cr.moveTo(x, 0);
|
||||||
|
cr.lineTo(x, height);
|
||||||
|
Clutter.cairo_set_source_color(cr, stippleColor);
|
||||||
|
cr.setDash([1, 3], 1); // Hard-code for now
|
||||||
|
cr.setLineWidth(stippleWidth);
|
||||||
|
cr.stroke();
|
||||||
|
}
|
||||||
|
|
||||||
|
_onOpenStateChanged(menu, open) {
|
||||||
|
if (open) {
|
||||||
|
if (this.reloadFlag) {
|
||||||
|
this._redisplay();
|
||||||
|
this.reloadFlag = false;
|
||||||
|
}
|
||||||
|
this.mainBox.show();
|
||||||
|
}
|
||||||
|
super._onOpenStateChanged(menu, open);
|
||||||
|
}
|
||||||
|
|
||||||
|
_setKeybinding() {
|
||||||
|
Main.wm.setCustomKeybindingHandler('panel-main-menu',
|
||||||
|
Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW,
|
||||||
|
() => this.menu.toggle());
|
||||||
|
}
|
||||||
|
|
||||||
|
_redisplay() {
|
||||||
|
this.applicationsBox.destroy_all_children();
|
||||||
|
this.categoriesBox.destroy_all_children();
|
||||||
this._display();
|
this._display();
|
||||||
},
|
}
|
||||||
|
|
||||||
_clearAll: function() {
|
_loadCategory(categoryId, dir) {
|
||||||
this.menu.removeAll();
|
let iter = dir.iter();
|
||||||
},
|
let nextType;
|
||||||
|
while ((nextType = iter.next()) !== GMenu.TreeItemType.INVALID) {
|
||||||
// Recursively load a GMenuTreeDirectory; we could put this in ShellAppSystem too
|
if (nextType === GMenu.TreeItemType.ENTRY) {
|
||||||
// (taken from js/ui/appDisplay.js in core shell)
|
let entry = iter.get_entry();
|
||||||
_loadCategory: function(dir, menu) {
|
let id;
|
||||||
var iter = dir.iter();
|
try {
|
||||||
var nextType;
|
id = entry.get_desktop_file_id(); // catch non-UTF8 filenames
|
||||||
while ((nextType = iter.next()) != GMenu.TreeItemType.INVALID) {
|
} catch (e) {
|
||||||
if (nextType == GMenu.TreeItemType.ENTRY) {
|
continue;
|
||||||
var entry = iter.get_entry();
|
}
|
||||||
var app = this._appSys.lookup_app_by_tree_entry(entry);
|
let app = appSys.lookup_app(id);
|
||||||
if (!entry.get_app_info().get_nodisplay())
|
if (!app)
|
||||||
menu.addMenuItem(new AppMenuItem(app));
|
app = new Shell.App({ app_info: entry.get_app_info() });
|
||||||
} else if (nextType == GMenu.TreeItemType.DIRECTORY) {
|
if (app.get_app_info().should_show())
|
||||||
this._loadCategory(iter.get_directory(), menu);
|
this.applicationsByCategory[categoryId].push(app);
|
||||||
|
} else if (nextType === GMenu.TreeItemType.SEPARATOR) {
|
||||||
|
this.applicationsByCategory[categoryId].push('separator');
|
||||||
|
} else if (nextType === GMenu.TreeItemType.DIRECTORY) {
|
||||||
|
let subdir = iter.get_directory();
|
||||||
|
if (!subdir.get_is_nodisplay())
|
||||||
|
this._loadCategory(categoryId, subdir);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
|
|
||||||
_display : function() {
|
scrollToButton(button) {
|
||||||
let tree = this._appSys.get_tree();
|
let appsScrollBoxAdj = this.applicationsScrollBox.get_vscroll_bar().get_adjustment();
|
||||||
let root = tree.get_root_directory();
|
let appsScrollBoxAlloc = this.applicationsScrollBox.get_allocation_box();
|
||||||
|
let currentScrollValue = appsScrollBoxAdj.get_value();
|
||||||
|
let boxHeight = appsScrollBoxAlloc.y2 - appsScrollBoxAlloc.y1;
|
||||||
|
let buttonAlloc = button.get_allocation_box();
|
||||||
|
let newScrollValue = currentScrollValue;
|
||||||
|
if (currentScrollValue > buttonAlloc.y1 - 10)
|
||||||
|
newScrollValue = buttonAlloc.y1 - 10;
|
||||||
|
if (boxHeight + currentScrollValue < buttonAlloc.y2 + 10)
|
||||||
|
newScrollValue = buttonAlloc.y2 - boxHeight + 10;
|
||||||
|
if (newScrollValue !== currentScrollValue)
|
||||||
|
appsScrollBoxAdj.set_value(newScrollValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
scrollToCatButton(button) {
|
||||||
|
let catsScrollBoxAdj = this.categoriesScrollBox.get_vscroll_bar().get_adjustment();
|
||||||
|
let catsScrollBoxAlloc = this.categoriesScrollBox.get_allocation_box();
|
||||||
|
let currentScrollValue = catsScrollBoxAdj.get_value();
|
||||||
|
let boxHeight = catsScrollBoxAlloc.y2 - catsScrollBoxAlloc.y1;
|
||||||
|
let buttonAlloc = button.get_allocation_box();
|
||||||
|
let newScrollValue = currentScrollValue;
|
||||||
|
if (currentScrollValue > buttonAlloc.y1 - 10)
|
||||||
|
newScrollValue = buttonAlloc.y1 - 10;
|
||||||
|
if (boxHeight + currentScrollValue < buttonAlloc.y2 + 10)
|
||||||
|
newScrollValue = buttonAlloc.y2 - boxHeight + 10;
|
||||||
|
if (newScrollValue !== currentScrollValue)
|
||||||
|
catsScrollBoxAdj.set_value(newScrollValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
_createLayout() {
|
||||||
|
let section = new PopupMenu.PopupMenuSection();
|
||||||
|
this.menu.addMenuItem(section);
|
||||||
|
this.mainBox = new St.BoxLayout({ vertical: false });
|
||||||
|
this.leftBox = new St.BoxLayout({ vertical: true });
|
||||||
|
this.applicationsScrollBox = new St.ScrollView({
|
||||||
|
style_class: 'apps-menu vfade',
|
||||||
|
x_expand: true,
|
||||||
|
});
|
||||||
|
this.applicationsScrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC);
|
||||||
|
let vscroll = this.applicationsScrollBox.get_vscroll_bar();
|
||||||
|
vscroll.connect('scroll-start', () => {
|
||||||
|
this.menu.passEvents = true;
|
||||||
|
});
|
||||||
|
vscroll.connect('scroll-stop', () => {
|
||||||
|
this.menu.passEvents = false;
|
||||||
|
});
|
||||||
|
this.categoriesScrollBox = new St.ScrollView({
|
||||||
|
style_class: 'vfade',
|
||||||
|
});
|
||||||
|
this.categoriesScrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC);
|
||||||
|
vscroll = this.categoriesScrollBox.get_vscroll_bar();
|
||||||
|
vscroll.connect('scroll-start', () => (this.menu.passEvents = true));
|
||||||
|
vscroll.connect('scroll-stop', () => (this.menu.passEvents = false));
|
||||||
|
this.leftBox.add_child(this.categoriesScrollBox);
|
||||||
|
|
||||||
|
this.applicationsBox = new St.BoxLayout({ vertical: true });
|
||||||
|
this.applicationsScrollBox.add_actor(this.applicationsBox);
|
||||||
|
this.categoriesBox = new St.BoxLayout({ vertical: true });
|
||||||
|
this.categoriesScrollBox.add_actor(this.categoriesBox);
|
||||||
|
|
||||||
|
this.mainBox.add(this.leftBox);
|
||||||
|
this.mainBox.add_child(this._createVertSeparator());
|
||||||
|
this.mainBox.add_child(this.applicationsScrollBox);
|
||||||
|
section.actor.add_actor(this.mainBox);
|
||||||
|
}
|
||||||
|
|
||||||
|
_display() {
|
||||||
|
this._applicationsButtons.clear();
|
||||||
|
this.mainBox.style = 'width: 35em;';
|
||||||
|
this.mainBox.hide();
|
||||||
|
|
||||||
|
// Load categories
|
||||||
|
this.applicationsByCategory = {};
|
||||||
|
this._tree.load_sync();
|
||||||
|
let root = this._tree.get_root_directory();
|
||||||
|
let categoryMenuItem = new CategoryMenuItem(this, null);
|
||||||
|
this.categoriesBox.add_actor(categoryMenuItem);
|
||||||
let iter = root.iter();
|
let iter = root.iter();
|
||||||
let nextType;
|
let nextType;
|
||||||
while ((nextType = iter.next()) != GMenu.TreeItemType.INVALID) {
|
while ((nextType = iter.next()) !== GMenu.TreeItemType.INVALID) {
|
||||||
if (nextType == GMenu.TreeItemType.DIRECTORY) {
|
if (nextType !== GMenu.TreeItemType.DIRECTORY)
|
||||||
let dir = iter.get_directory();
|
continue;
|
||||||
let item = new PopupMenu.PopupSubMenuMenuItem(dir.get_name());
|
|
||||||
this._loadCategory(dir, item.menu);
|
let dir = iter.get_directory();
|
||||||
this.menu.addMenuItem(item);
|
if (dir.get_is_nodisplay())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
let categoryId = dir.get_menu_id();
|
||||||
|
this.applicationsByCategory[categoryId] = [];
|
||||||
|
this._loadCategory(categoryId, dir);
|
||||||
|
if (this.applicationsByCategory[categoryId].length > 0) {
|
||||||
|
categoryMenuItem = new CategoryMenuItem(this, dir);
|
||||||
|
this.categoriesBox.add_actor(categoryMenuItem);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Load applications
|
||||||
|
this._displayButtons(this._listApplications(null));
|
||||||
|
|
||||||
|
let themeContext = St.ThemeContext.get_for_stage(global.stage);
|
||||||
|
let scaleFactor = themeContext.scale_factor;
|
||||||
|
let categoriesHeight = this.categoriesBox.height / scaleFactor;
|
||||||
|
let height = Math.round(categoriesHeight) + MENU_HEIGHT_OFFSET;
|
||||||
|
this.mainBox.style += `height: ${height}px`;
|
||||||
|
}
|
||||||
|
|
||||||
|
selectCategory(dir) {
|
||||||
|
this.applicationsBox.get_children().forEach(c => {
|
||||||
|
if (c._delegate instanceof PopupMenu.PopupSeparatorMenuItem)
|
||||||
|
c._delegate.destroy();
|
||||||
|
else
|
||||||
|
this.applicationsBox.remove_actor(c);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (dir)
|
||||||
|
this._displayButtons(this._listApplications(dir.get_menu_id()));
|
||||||
|
else
|
||||||
|
this._displayButtons(this._listApplications(null));
|
||||||
|
}
|
||||||
|
|
||||||
|
_displayButtons(apps) {
|
||||||
|
for (let i = 0; i < apps.length; i++) {
|
||||||
|
let app = apps[i];
|
||||||
|
let item;
|
||||||
|
if (app instanceof Shell.App)
|
||||||
|
item = this._applicationsButtons.get(app);
|
||||||
|
else
|
||||||
|
item = new PopupMenu.PopupSeparatorMenuItem();
|
||||||
|
if (!item) {
|
||||||
|
item = new ApplicationMenuItem(this, app);
|
||||||
|
item.setDragEnabled(this._desktopTarget.hasDesktop);
|
||||||
|
this._applicationsButtons.set(app, item);
|
||||||
|
}
|
||||||
|
if (!item.get_parent())
|
||||||
|
this.applicationsBox.add_actor(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_listApplications(categoryMenuId) {
|
||||||
|
let applist;
|
||||||
|
|
||||||
|
if (categoryMenuId) {
|
||||||
|
applist = this.applicationsByCategory[categoryMenuId];
|
||||||
|
} else {
|
||||||
|
applist = global.settings.get_strv('favorite-apps')
|
||||||
|
.map(id => appSys.lookup_app(id))
|
||||||
|
.filter(app => app);
|
||||||
|
}
|
||||||
|
|
||||||
|
return applist;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -99,15 +679,15 @@ let appsMenuButton;
|
|||||||
|
|
||||||
function enable() {
|
function enable() {
|
||||||
appsMenuButton = new ApplicationsButton();
|
appsMenuButton = new ApplicationsButton();
|
||||||
Main.panel._leftBox.insert_child_at_index(appsMenuButton.actor, 1);
|
let index = Main.sessionMode.panel.left.indexOf('activities') + 1;
|
||||||
Main.panel._leftBox.child_set(appsMenuButton.actor, { y_fill : true } );
|
Main.panel.addToStatusArea('apps-menu', appsMenuButton, index, 'left');
|
||||||
Main.panel._menus.addMenu(appsMenuButton.menu);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function disable() {
|
function disable() {
|
||||||
|
Main.panel.menuManager.removeMenu(appsMenuButton.menu);
|
||||||
appsMenuButton.destroy();
|
appsMenuButton.destroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
function init() {
|
function init() {
|
||||||
/* do nothing */
|
ExtensionUtils.initTranslations();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
extension_data += configure_file(
|
||||||
|
input: metadata_name + '.in',
|
||||||
|
output: metadata_name,
|
||||||
|
configuration: metadata_conf
|
||||||
|
)
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
{
|
{
|
||||||
"extension-id": "@extension_id@",
|
"extension-id": "@extension_id@",
|
||||||
"uuid": "@uuid@",
|
"uuid": "@uuid@",
|
||||||
"settings-schema": "@gschemaname@",
|
|
||||||
"gettext-domain": "@gettext_domain@",
|
"gettext-domain": "@gettext_domain@",
|
||||||
"name": "Applications Menu",
|
"name": "Applications Menu",
|
||||||
"description": "Add a gnome 2.x style menu for applications",
|
"description": "Add a category-based menu for applications.\nThis extension is part of Classic Mode and is officially supported by GNOME. Please do not report bugs using the form below, use GNOME's GitLab instance instead.",
|
||||||
|
"original-authors": [ "e2002@bk.ru", "debarshir@gnome.org" ],
|
||||||
"shell-version": [ "@shell_current@" ],
|
"shell-version": [ "@shell_current@" ],
|
||||||
"url": "@url@"
|
"url": "@url@"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1 +1,7 @@
|
|||||||
/* none used*/
|
.apps-menu:ltr {
|
||||||
|
padding-right: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.apps-menu:rtl {
|
||||||
|
padding-left: 3px;
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,7 +0,0 @@
|
|||||||
EXTENSION_ID = auto-move-windows
|
|
||||||
|
|
||||||
EXTRA_MODULES = prefs.js
|
|
||||||
|
|
||||||
include ../../extension.mk
|
|
||||||
include ../../settings.mk
|
|
||||||
|
|
||||||
@@ -1,166 +1,144 @@
|
|||||||
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
|
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
|
||||||
// Start apps on custom workspaces
|
// Start apps on custom workspaces
|
||||||
|
/* exported init enable disable */
|
||||||
|
|
||||||
const Glib = imports.gi.GLib;
|
const { Shell } = imports.gi;
|
||||||
const Gio = imports.gi.Gio;
|
|
||||||
const Lang = imports.lang;
|
|
||||||
const Mainloop = imports.mainloop;
|
|
||||||
const Meta = imports.gi.Meta;
|
|
||||||
const Shell = imports.gi.Shell;
|
|
||||||
const St = imports.gi.St;
|
|
||||||
|
|
||||||
const Main = imports.ui.main;
|
|
||||||
|
|
||||||
const ExtensionUtils = imports.misc.extensionUtils;
|
const ExtensionUtils = imports.misc.extensionUtils;
|
||||||
const Me = ExtensionUtils.getCurrentExtension();
|
const Main = imports.ui.main;
|
||||||
const Convenience = Me.imports.convenience;
|
|
||||||
|
|
||||||
const SETTINGS_KEY = 'application-list';
|
class WindowMover {
|
||||||
|
constructor() {
|
||||||
|
this._settings = ExtensionUtils.getSettings();
|
||||||
|
this._appSystem = Shell.AppSystem.get_default();
|
||||||
|
this._appConfigs = new Map();
|
||||||
|
this._appData = new Map();
|
||||||
|
|
||||||
let settings;
|
this._appsChangedId =
|
||||||
|
this._appSystem.connect('installed-changed',
|
||||||
|
this._updateAppData.bind(this));
|
||||||
|
|
||||||
const WindowMover = new Lang.Class({
|
this._settings.connect('changed', this._updateAppConfigs.bind(this));
|
||||||
Name: 'AutoMoveWindows.WindowMover',
|
this._updateAppConfigs();
|
||||||
|
|
||||||
_init: function() {
|
|
||||||
this._settings = settings;
|
|
||||||
this._windowTracker = Shell.WindowTracker.get_default();
|
|
||||||
|
|
||||||
let display = global.screen.get_display();
|
|
||||||
// Connect after so the handler from ShellWindowTracker has already run
|
|
||||||
this._windowCreatedId = display.connect_after('window-created', Lang.bind(this, this._findAndMove));
|
|
||||||
},
|
|
||||||
|
|
||||||
destroy: function() {
|
|
||||||
if (this._windowCreatedId) {
|
|
||||||
global.screen.get_display().disconnect(this._windowCreatedId);
|
|
||||||
this._windowCreatedId = 0;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
_ensureAtLeastWorkspaces: function(num, window) {
|
|
||||||
for (let j = global.screen.n_workspaces; j <= num; j++) {
|
|
||||||
window.change_workspace_by_index(j-1, false, global.get_current_time());
|
|
||||||
global.screen.append_new_workspace(false, 0);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
_findAndMove: function(display, window, noRecurse) {
|
|
||||||
if (!this._windowTracker.is_window_interesting(window))
|
|
||||||
return;
|
|
||||||
|
|
||||||
let spaces = this._settings.get_strv(SETTINGS_KEY);
|
|
||||||
|
|
||||||
let app = this._windowTracker.get_window_app(window);
|
|
||||||
if (!app) {
|
|
||||||
if (!noRecurse) {
|
|
||||||
// window is not tracked yet
|
|
||||||
Mainloop.idle_add(Lang.bind(this, function() {
|
|
||||||
this._findAndMove(display, window, true);
|
|
||||||
return false;
|
|
||||||
}));
|
|
||||||
} else
|
|
||||||
log ('Cannot find application for window');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
let app_id = app.get_id();
|
|
||||||
for ( let j = 0 ; j < spaces.length; j++ ) {
|
|
||||||
let apps_to_space = spaces[j].split(":");
|
|
||||||
// Match application id
|
|
||||||
if (apps_to_space[0] == app_id) {
|
|
||||||
let workspace_num = parseInt(apps_to_space[1]) - 1;
|
|
||||||
|
|
||||||
if (workspace_num >= global.screen.n_workspaces)
|
|
||||||
this._ensureAtLeastWorkspaces(workspace_num, window);
|
|
||||||
|
|
||||||
window.change_workspace_by_index(workspace_num, false, global.get_current_time());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
_updateAppConfigs() {
|
||||||
|
this._appConfigs.clear();
|
||||||
|
|
||||||
|
this._settings.get_strv('application-list').forEach(v => {
|
||||||
|
let [appId, num] = v.split(':');
|
||||||
|
this._appConfigs.set(appId, parseInt(num) - 1);
|
||||||
|
});
|
||||||
|
|
||||||
|
this._updateAppData();
|
||||||
|
}
|
||||||
|
|
||||||
|
_updateAppData() {
|
||||||
|
let ids = [...this._appConfigs.keys()];
|
||||||
|
let removedApps = [...this._appData.keys()].filter(
|
||||||
|
a => !ids.includes(a.id)
|
||||||
|
);
|
||||||
|
removedApps.forEach(app => {
|
||||||
|
app.disconnect(this._appData.get(app).windowsChangedId);
|
||||||
|
this._appData.delete(app);
|
||||||
|
});
|
||||||
|
|
||||||
|
let addedApps = ids.map(id => this._appSystem.lookup_app(id)).filter(
|
||||||
|
app => app && !this._appData.has(app)
|
||||||
|
);
|
||||||
|
addedApps.forEach(app => {
|
||||||
|
let data = {
|
||||||
|
windowsChangedId: app.connect('windows-changed',
|
||||||
|
this._appWindowsChanged.bind(this)),
|
||||||
|
moveWindowsId: 0,
|
||||||
|
windows: app.get_windows(),
|
||||||
|
};
|
||||||
|
this._appData.set(app, data);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
destroy() {
|
||||||
|
if (this._appsChangedId) {
|
||||||
|
this._appSystem.disconnect(this._appsChangedId);
|
||||||
|
this._appsChangedId = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this._settings) {
|
||||||
|
this._settings.run_dispose();
|
||||||
|
this._settings = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
this._appConfigs.clear();
|
||||||
|
this._updateAppData();
|
||||||
|
}
|
||||||
|
|
||||||
|
_moveWindow(window, workspaceNum) {
|
||||||
|
if (window.skip_taskbar)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// ensure we have the required number of workspaces
|
||||||
|
let workspaceManager = global.workspace_manager;
|
||||||
|
for (let i = workspaceManager.n_workspaces; i <= workspaceNum; i++) {
|
||||||
|
window.change_workspace_by_index(i - 1, false);
|
||||||
|
workspaceManager.append_new_workspace(false, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
window.change_workspace_by_index(workspaceNum, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
_appWindowsChanged(app) {
|
||||||
|
let data = this._appData.get(app);
|
||||||
|
let windows = app.get_windows();
|
||||||
|
|
||||||
|
// If get_compositor_private() returns non-NULL on a removed windows,
|
||||||
|
// the window still exists and is just moved to a different workspace
|
||||||
|
// or something; assume it'll be added back immediately, so keep it
|
||||||
|
// to avoid moving it again
|
||||||
|
windows.push(...data.windows.filter(
|
||||||
|
w => !windows.includes(w) && w.get_compositor_private() !== null
|
||||||
|
));
|
||||||
|
|
||||||
|
let workspaceNum = this._appConfigs.get(app.id);
|
||||||
|
windows.filter(w => !data.windows.includes(w)).forEach(window => {
|
||||||
|
this._moveWindow(window, workspaceNum);
|
||||||
|
});
|
||||||
|
data.windows = windows;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let prevCheckWorkspaces;
|
let prevCheckWorkspaces;
|
||||||
let winMover;
|
let winMover;
|
||||||
|
|
||||||
function init() {
|
function init() {
|
||||||
Convenience.initTranslations();
|
ExtensionUtils.initTranslations();
|
||||||
settings = Convenience.getSettings();
|
}
|
||||||
|
|
||||||
|
function myCheckWorkspaces() {
|
||||||
|
let keepAliveWorkspaces = [];
|
||||||
|
let foundNonEmpty = false;
|
||||||
|
for (let i = this._workspaces.length - 1; i >= 0; i--) {
|
||||||
|
if (!foundNonEmpty)
|
||||||
|
foundNonEmpty = this._workspaces[i].list_windows().length > 0;
|
||||||
|
else if (!this._workspaces[i]._keepAliveId)
|
||||||
|
keepAliveWorkspaces.push(this._workspaces[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// make sure the original method only removes empty workspaces at the end
|
||||||
|
keepAliveWorkspaces.forEach(ws => (ws._keepAliveId = 1));
|
||||||
|
prevCheckWorkspaces.call(this);
|
||||||
|
keepAliveWorkspaces.forEach(ws => delete ws._keepAliveId);
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
function enable() {
|
function enable() {
|
||||||
prevCheckWorkspaces = Main._checkWorkspaces;
|
prevCheckWorkspaces = Main.wm._workspaceTracker._checkWorkspaces;
|
||||||
Main._checkWorkspaces = function() {
|
Main.wm._workspaceTracker._checkWorkspaces = myCheckWorkspaces;
|
||||||
let i;
|
|
||||||
let emptyWorkspaces = new Array(Main._workspaces.length);
|
|
||||||
|
|
||||||
for (i = 0; i < Main._workspaces.length; i++) {
|
|
||||||
let lastRemoved = Main._workspaces[i]._lastRemovedWindow;
|
|
||||||
if (lastRemoved &&
|
|
||||||
(lastRemoved.get_window_type() == Meta.WindowType.SPLASHSCREEN ||
|
|
||||||
lastRemoved.get_window_type() == Meta.WindowType.DIALOG ||
|
|
||||||
lastRemoved.get_window_type() == Meta.WindowType.MODAL_DIALOG))
|
|
||||||
emptyWorkspaces[i] = false;
|
|
||||||
else
|
|
||||||
emptyWorkspaces[i] = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
let windows = global.get_window_actors();
|
|
||||||
for (i = 0; i < windows.length; i++) {
|
|
||||||
let win = windows[i];
|
|
||||||
|
|
||||||
if (win.get_meta_window().is_on_all_workspaces())
|
|
||||||
continue;
|
|
||||||
|
|
||||||
let workspaceIndex = win.get_workspace();
|
|
||||||
emptyWorkspaces[workspaceIndex] = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If we don't have an empty workspace at the end, add one
|
|
||||||
if (!emptyWorkspaces[emptyWorkspaces.length -1]) {
|
|
||||||
global.screen.append_new_workspace(false, global.get_current_time());
|
|
||||||
emptyWorkspaces.push(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
let activeWorkspaceIndex = global.screen.get_active_workspace_index();
|
|
||||||
let activeIsLast = activeWorkspaceIndex == global.screen.n_workspaces - 2;
|
|
||||||
let removingTrailWorkspaces = (emptyWorkspaces[activeWorkspaceIndex] &&
|
|
||||||
activeIsLast);
|
|
||||||
// Don't enter the overview when removing multiple empty workspaces at startup
|
|
||||||
let showOverview = (removingTrailWorkspaces &&
|
|
||||||
!emptyWorkspaces.every(function(x) { return x; }));
|
|
||||||
|
|
||||||
if (removingTrailWorkspaces) {
|
|
||||||
// "Merge" the empty workspace we are removing with the one at the end
|
|
||||||
Main.wm.blockAnimations();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Delete other empty workspaces; do it from the end to avoid index changes
|
|
||||||
for (i = emptyWorkspaces.length - 2; i >= 0; i--) {
|
|
||||||
if (emptyWorkspaces[i])
|
|
||||||
global.screen.remove_workspace(Main._workspaces[i], global.get_current_time());
|
|
||||||
else
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (removingTrailWorkspaces) {
|
|
||||||
global.screen.get_workspace_by_index(global.screen.n_workspaces - 1).activate(global.get_current_time());
|
|
||||||
|
|
||||||
Main.wm.unblockAnimations();
|
|
||||||
|
|
||||||
if (!Main.overview.visible && showOverview)
|
|
||||||
Main.overview.show();
|
|
||||||
}
|
|
||||||
|
|
||||||
Main._checkWorkspacesId = 0;
|
|
||||||
return false;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
winMover = new WindowMover();
|
winMover = new WindowMover();
|
||||||
}
|
}
|
||||||
|
|
||||||
function disable() {
|
function disable() {
|
||||||
Main._checkWorkspaces = prevCheckWorkspaces;
|
Main.wm._workspaceTracker._checkWorkspaces = prevCheckWorkspaces;
|
||||||
winMover.destroy();
|
winMover.destroy();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
extension_data += configure_file(
|
||||||
|
input: metadata_name + '.in',
|
||||||
|
output: metadata_name,
|
||||||
|
configuration: metadata_conf
|
||||||
|
)
|
||||||
|
|
||||||
|
extension_sources += files('prefs.js')
|
||||||
|
extension_schemas += files(metadata_conf.get('gschemaname') + '.gschema.xml')
|
||||||
@@ -4,7 +4,7 @@
|
|||||||
"settings-schema": "@gschemaname@",
|
"settings-schema": "@gschemaname@",
|
||||||
"gettext-domain": "@gettext_domain@",
|
"gettext-domain": "@gettext_domain@",
|
||||||
"name": "Auto Move Windows",
|
"name": "Auto Move Windows",
|
||||||
"description": "Move applications to specific workspaces when they create windows",
|
"description": "Move applications to specific workspaces when they create windows.",
|
||||||
"shell-version": [ "@shell_current@" ],
|
"shell-version": [ "@shell_current@" ],
|
||||||
"original-authors": [ "alessandro.crismani@gmail.com", "thomas.bouffon@gmail.com" ],
|
"original-authors": [ "alessandro.crismani@gmail.com", "thomas.bouffon@gmail.com" ],
|
||||||
"url": "@url@"
|
"url": "@url@"
|
||||||
|
|||||||
+2
-2
@@ -3,8 +3,8 @@
|
|||||||
<key name="application-list" type="as">
|
<key name="application-list" type="as">
|
||||||
<!-- FIXME: should be a(su), when JS supports more of GVariant -->
|
<!-- FIXME: should be a(su), when JS supports more of GVariant -->
|
||||||
<default>[ ]</default>
|
<default>[ ]</default>
|
||||||
<_summary>Application and workspace list</_summary>
|
<summary>Application and workspace list</summary>
|
||||||
<_description>A list of strings, each containing an application id (desktop file name), followed by a colon and the workspace number</_description>
|
<description>A list of strings, each containing an application id (desktop file name), followed by a colon and the workspace number</description>
|
||||||
</key>
|
</key>
|
||||||
</schema>
|
</schema>
|
||||||
</schemalist>
|
</schemalist>
|
||||||
@@ -1,22 +1,14 @@
|
|||||||
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
|
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
|
||||||
// Start apps on custom workspaces
|
// Start apps on custom workspaces
|
||||||
|
/* exported init buildPrefsWidget */
|
||||||
|
|
||||||
const GdkPixbuf = imports.gi.GdkPixbuf;
|
const { Gio, GObject, Gtk } = imports.gi;
|
||||||
const Gio = imports.gi.Gio;
|
|
||||||
const GLib = imports.gi.GLib;
|
|
||||||
const GObject = imports.gi.GObject;
|
|
||||||
const GMenu = imports.gi.GMenu;
|
|
||||||
const Gtk = imports.gi.Gtk;
|
|
||||||
const Lang = imports.lang;
|
|
||||||
const Mainloop = imports.mainloop;
|
|
||||||
|
|
||||||
const Gettext = imports.gettext.domain('gnome-shell-extensions');
|
const Gettext = imports.gettext.domain('gnome-shell-extensions');
|
||||||
const _ = Gettext.gettext;
|
const _ = Gettext.gettext;
|
||||||
const N_ = function(e) { return e };
|
const N_ = e => e;
|
||||||
|
|
||||||
const ExtensionUtils = imports.misc.extensionUtils;
|
const ExtensionUtils = imports.misc.extensionUtils;
|
||||||
const Me = ExtensionUtils.getCurrentExtension();
|
|
||||||
const Convenience = Me.imports.convenience;
|
|
||||||
|
|
||||||
const SETTINGS_KEY = 'application-list';
|
const SETTINGS_KEY = 'application-list';
|
||||||
|
|
||||||
@@ -27,233 +19,263 @@ const Columns = {
|
|||||||
DISPLAY_NAME: 1,
|
DISPLAY_NAME: 1,
|
||||||
ICON: 2,
|
ICON: 2,
|
||||||
WORKSPACE: 3,
|
WORKSPACE: 3,
|
||||||
ADJUSTMENT: 4
|
ADJUSTMENT: 4,
|
||||||
};
|
};
|
||||||
|
|
||||||
const Widget = new GObject.Class({
|
const Widget = GObject.registerClass(
|
||||||
Name: 'AutoMoveWindows.Prefs.Widget',
|
class Widget extends Gtk.Grid {
|
||||||
GTypeName: 'AutoMoveWindowsPrefsWidget',
|
_init(params) {
|
||||||
Extends: Gtk.Grid,
|
super._init(params);
|
||||||
|
this.set_orientation(Gtk.Orientation.VERTICAL);
|
||||||
|
|
||||||
_init: function(params) {
|
this._settings = ExtensionUtils.getSettings();
|
||||||
this.parent(params);
|
this._settings.connect('changed', this._refresh.bind(this));
|
||||||
this.set_orientation(Gtk.Orientation.VERTICAL);
|
this._changedPermitted = false;
|
||||||
|
|
||||||
this._settings = Convenience.getSettings();
|
this._store = new Gtk.ListStore();
|
||||||
this._settings.connect('changed', Lang.bind(this, this._refresh));
|
this._store.set_column_types([
|
||||||
this._changedPermitted = false;
|
Gio.AppInfo,
|
||||||
|
GObject.TYPE_STRING,
|
||||||
|
Gio.Icon,
|
||||||
|
GObject.TYPE_INT,
|
||||||
|
Gtk.Adjustment,
|
||||||
|
]);
|
||||||
|
|
||||||
this._store = new Gtk.ListStore();
|
let scrolled = new Gtk.ScrolledWindow({ shadow_type: Gtk.ShadowType.IN });
|
||||||
this._store.set_column_types([Gio.AppInfo, GObject.TYPE_STRING, Gio.Icon, GObject.TYPE_INT,
|
scrolled.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC);
|
||||||
Gtk.Adjustment]);
|
this.add(scrolled);
|
||||||
|
|
||||||
this._treeView = new Gtk.TreeView({ model: this._store,
|
|
||||||
hexpand: true, vexpand: true });
|
|
||||||
this._treeView.get_selection().set_mode(Gtk.SelectionMode.SINGLE);
|
|
||||||
|
|
||||||
let appColumn = new Gtk.TreeViewColumn({ expand: true, sort_column_id: Columns.DISPLAY_NAME,
|
this._treeView = new Gtk.TreeView({
|
||||||
title: _("Application") });
|
model: this._store,
|
||||||
let iconRenderer = new Gtk.CellRendererPixbuf;
|
hexpand: true,
|
||||||
appColumn.pack_start(iconRenderer, false);
|
vexpand: true,
|
||||||
appColumn.add_attribute(iconRenderer, "gicon", Columns.ICON);
|
});
|
||||||
let nameRenderer = new Gtk.CellRendererText;
|
this._treeView.get_selection().set_mode(Gtk.SelectionMode.SINGLE);
|
||||||
appColumn.pack_start(nameRenderer, true);
|
|
||||||
appColumn.add_attribute(nameRenderer, "text", Columns.DISPLAY_NAME);
|
|
||||||
this._treeView.append_column(appColumn);
|
|
||||||
|
|
||||||
let workspaceColumn = new Gtk.TreeViewColumn({ title: _("Workspace"),
|
let appColumn = new Gtk.TreeViewColumn({
|
||||||
sort_column_id: Columns.WORKSPACE });
|
expand: true,
|
||||||
let workspaceRenderer = new Gtk.CellRendererSpin({ editable: true });
|
sort_column_id: Columns.DISPLAY_NAME,
|
||||||
workspaceRenderer.connect('edited', Lang.bind(this, this._workspaceEdited));
|
title: _('Application'),
|
||||||
workspaceColumn.pack_start(workspaceRenderer, true);
|
});
|
||||||
workspaceColumn.add_attribute(workspaceRenderer, "adjustment", Columns.ADJUSTMENT);
|
let iconRenderer = new Gtk.CellRendererPixbuf();
|
||||||
workspaceColumn.add_attribute(workspaceRenderer, "text", Columns.WORKSPACE);
|
appColumn.pack_start(iconRenderer, false);
|
||||||
this._treeView.append_column(workspaceColumn);
|
appColumn.add_attribute(iconRenderer, 'gicon', Columns.ICON);
|
||||||
|
let nameRenderer = new Gtk.CellRendererText();
|
||||||
|
appColumn.pack_start(nameRenderer, true);
|
||||||
|
appColumn.add_attribute(nameRenderer, 'text', Columns.DISPLAY_NAME);
|
||||||
|
this._treeView.append_column(appColumn);
|
||||||
|
|
||||||
this.add(this._treeView);
|
let workspaceColumn = new Gtk.TreeViewColumn({
|
||||||
|
title: _('Workspace'),
|
||||||
|
sort_column_id: Columns.WORKSPACE,
|
||||||
|
});
|
||||||
|
let workspaceRenderer = new Gtk.CellRendererSpin({ editable: true });
|
||||||
|
workspaceRenderer.connect('edited', this._workspaceEdited.bind(this));
|
||||||
|
workspaceColumn.pack_start(workspaceRenderer, true);
|
||||||
|
workspaceColumn.add_attribute(workspaceRenderer, 'adjustment', Columns.ADJUSTMENT);
|
||||||
|
workspaceColumn.add_attribute(workspaceRenderer, 'text', Columns.WORKSPACE);
|
||||||
|
this._treeView.append_column(workspaceColumn);
|
||||||
|
|
||||||
let toolbar = new Gtk.Toolbar();
|
scrolled.add(this._treeView);
|
||||||
toolbar.get_style_context().add_class(Gtk.STYLE_CLASS_INLINE_TOOLBAR);
|
|
||||||
this.add(toolbar);
|
|
||||||
|
|
||||||
let newButton = new Gtk.ToolButton({ stock_id: Gtk.STOCK_NEW,
|
let toolbar = new Gtk.Toolbar({ icon_size: Gtk.IconSize.SMALL_TOOLBAR });
|
||||||
label: _("Add rule"),
|
toolbar.get_style_context().add_class(Gtk.STYLE_CLASS_INLINE_TOOLBAR);
|
||||||
is_important: true });
|
this.add(toolbar);
|
||||||
newButton.connect('clicked', Lang.bind(this, this._createNew));
|
|
||||||
toolbar.add(newButton);
|
|
||||||
|
|
||||||
let delButton = new Gtk.ToolButton({ stock_id: Gtk.STOCK_DELETE });
|
let newButton = new Gtk.ToolButton({
|
||||||
delButton.connect('clicked', Lang.bind(this, this._deleteSelected));
|
icon_name: 'bookmark-new-symbolic',
|
||||||
toolbar.add(delButton);
|
label: _('Add Rule'),
|
||||||
|
is_important: true,
|
||||||
|
});
|
||||||
|
newButton.connect('clicked', this._createNew.bind(this));
|
||||||
|
toolbar.add(newButton);
|
||||||
|
|
||||||
this._changedPermitted = true;
|
let delButton = new Gtk.ToolButton({ icon_name: 'edit-delete-symbolic' });
|
||||||
this._refresh();
|
delButton.connect('clicked', this._deleteSelected.bind(this));
|
||||||
},
|
toolbar.add(delButton);
|
||||||
|
|
||||||
_createNew: function() {
|
let selection = this._treeView.get_selection();
|
||||||
let dialog = new Gtk.Dialog({ title: _("Create new matching rule"),
|
selection.connect('changed', () => {
|
||||||
transient_for: this.get_toplevel(),
|
delButton.sensitive = selection.count_selected_rows() > 0;
|
||||||
modal: true });
|
});
|
||||||
dialog.add_button(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL);
|
delButton.sensitive = selection.count_selected_rows() > 0;
|
||||||
dialog.add_button(_("Add"), Gtk.ResponseType.OK);
|
|
||||||
|
this._changedPermitted = true;
|
||||||
|
this._refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
_createNew() {
|
||||||
|
let dialog = new Gtk.Dialog({
|
||||||
|
title: _('Create new matching rule'),
|
||||||
|
transient_for: this.get_toplevel(),
|
||||||
|
use_header_bar: true,
|
||||||
|
modal: true,
|
||||||
|
});
|
||||||
|
dialog.add_button(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL);
|
||||||
|
let addButton = dialog.add_button(_('Add'), Gtk.ResponseType.OK);
|
||||||
dialog.set_default_response(Gtk.ResponseType.OK);
|
dialog.set_default_response(Gtk.ResponseType.OK);
|
||||||
|
|
||||||
let grid = new Gtk.Grid({ column_spacing: 10,
|
let grid = new Gtk.Grid({
|
||||||
row_spacing: 15,
|
column_spacing: 10,
|
||||||
margin: 10 });
|
row_spacing: 15,
|
||||||
dialog._appChooser = new Gtk.AppChooserWidget({ show_all: true });
|
margin: 10,
|
||||||
grid.attach(dialog._appChooser, 0, 0, 2, 1);
|
});
|
||||||
grid.attach(new Gtk.Label({ label: _("Workspace") }),
|
dialog._appChooser = new Gtk.AppChooserWidget({ show_all: true });
|
||||||
0, 1, 1, 1);
|
dialog._appChooser.connect('application-selected', (w, appInfo) => {
|
||||||
let adjustment = new Gtk.Adjustment({ lower: 1,
|
addButton.sensitive = appInfo && this._checkId(appInfo.get_id());
|
||||||
upper: WORKSPACE_MAX,
|
});
|
||||||
step_increment: 1
|
let appInfo = dialog._appChooser.get_app_info();
|
||||||
});
|
addButton.sensitive = appInfo && this._checkId(appInfo.get_id());
|
||||||
dialog._spin = new Gtk.SpinButton({ adjustment: adjustment,
|
|
||||||
snap_to_ticks: true });
|
grid.attach(dialog._appChooser, 0, 0, 2, 1);
|
||||||
|
grid.attach(new Gtk.Label({
|
||||||
|
label: _('Workspace'),
|
||||||
|
halign: Gtk.Align.END,
|
||||||
|
}), 0, 1, 1, 1);
|
||||||
|
let adjustment = new Gtk.Adjustment({
|
||||||
|
lower: 1,
|
||||||
|
upper: WORKSPACE_MAX,
|
||||||
|
step_increment: 1,
|
||||||
|
});
|
||||||
|
dialog._spin = new Gtk.SpinButton({
|
||||||
|
adjustment,
|
||||||
|
snap_to_ticks: true,
|
||||||
|
});
|
||||||
dialog._spin.set_value(1);
|
dialog._spin.set_value(1);
|
||||||
grid.attach(dialog._spin, 1, 1, 1, 1);
|
grid.attach(dialog._spin, 1, 1, 1, 1);
|
||||||
dialog.get_content_area().add(grid);
|
dialog.get_content_area().add(grid);
|
||||||
|
|
||||||
dialog.connect('response', Lang.bind(this, function(dialog, id) {
|
dialog.connect('response', (dlg, id) => {
|
||||||
if (id != Gtk.ResponseType.OK) {
|
if (id !== Gtk.ResponseType.OK) {
|
||||||
dialog.destroy();
|
dialog.destroy();
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
let appInfo = dialog._appChooser.get_app_info();
|
|
||||||
if (!appInfo)
|
|
||||||
return;
|
|
||||||
let index = Math.floor(dialog._spin.value);
|
|
||||||
if (isNaN(index) || index < 0)
|
|
||||||
index = 1;
|
|
||||||
|
|
||||||
this._changedPermitted = false;
|
|
||||||
if (!this._appendItem(appInfo.get_id(), index)) {
|
|
||||||
this._changedPermitted = true;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let iter = this._store.append();
|
|
||||||
let adj = new Gtk.Adjustment({ lower: 1,
|
appInfo = dialog._appChooser.get_app_info();
|
||||||
upper: WORKSPACE_MAX,
|
if (!appInfo)
|
||||||
step_increment: 1,
|
return;
|
||||||
value: index });
|
let index = Math.floor(dialog._spin.value);
|
||||||
this._store.set(iter,
|
if (isNaN(index) || index < 0)
|
||||||
[Columns.APPINFO, Columns.ICON, Columns.DISPLAY_NAME, Columns.WORKSPACE, Columns.ADJUSTMENT],
|
index = 1;
|
||||||
[appInfo, appInfo.get_icon(), appInfo.get_display_name(), index, adj]);
|
|
||||||
this._changedPermitted = true;
|
this._changedPermitted = false;
|
||||||
|
this._appendItem(appInfo.get_id(), index);
|
||||||
|
this._changedPermitted = true;
|
||||||
|
|
||||||
|
this._appendRow(appInfo, index);
|
||||||
|
|
||||||
dialog.destroy();
|
dialog.destroy();
|
||||||
}));
|
});
|
||||||
dialog.show_all();
|
dialog.show_all();
|
||||||
},
|
}
|
||||||
|
|
||||||
_deleteSelected: function() {
|
_deleteSelected() {
|
||||||
let [any, model, iter] = this._treeView.get_selection().get_selected();
|
let [any, model_, iter] = this._treeView.get_selection().get_selected();
|
||||||
|
|
||||||
if (any) {
|
if (any) {
|
||||||
let appInfo = this._store.get_value(iter, Columns.APPINFO);
|
let appInfo = this._store.get_value(iter, Columns.APPINFO);
|
||||||
|
|
||||||
this._changedPermitted = false;
|
this._changedPermitted = false;
|
||||||
this._removeItem(appInfo.get_id());
|
this._removeItem(appInfo.get_id());
|
||||||
this._store.remove(iter);
|
this._changedPermitted = true;
|
||||||
this._changedPermitted = true;
|
this._store.remove(iter);
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
|
|
||||||
_workspaceEdited: function(renderer, pathString, text) {
|
_workspaceEdited(renderer, pathString, text) {
|
||||||
let index = parseInt(text);
|
let index = parseInt(text);
|
||||||
if (isNaN(index) || index < 0)
|
if (isNaN(index) || index < 0)
|
||||||
index = 1;
|
index = 1;
|
||||||
let path = Gtk.TreePath.new_from_string(pathString);
|
let path = Gtk.TreePath.new_from_string(pathString);
|
||||||
let [model, iter] = this._store.get_iter(path);
|
let [model_, iter] = this._store.get_iter(path);
|
||||||
let appInfo = this._store.get_value(iter, Columns.APPINFO);
|
let appInfo = this._store.get_value(iter, Columns.APPINFO);
|
||||||
|
|
||||||
this._changedPermitted = false;
|
this._changedPermitted = false;
|
||||||
this._changeItem(appInfo.get_id(), index);
|
this._changeItem(appInfo.get_id(), index);
|
||||||
this._store.set_value(iter, Columns.WORKSPACE, index);
|
this._store.set_value(iter, Columns.WORKSPACE, index);
|
||||||
this._changedPermitted = true;
|
this._changedPermitted = true;
|
||||||
},
|
}
|
||||||
|
|
||||||
_refresh: function() {
|
_refresh() {
|
||||||
if (!this._changedPermitted)
|
if (!this._changedPermitted)
|
||||||
// Ignore this notification, model is being modified outside
|
// Ignore this notification, model is being modified outside
|
||||||
return;
|
return;
|
||||||
|
|
||||||
this._store.clear();
|
this._store.clear();
|
||||||
|
|
||||||
let currentItems = this._settings.get_strv(SETTINGS_KEY);
|
let currentItems = this._settings.get_strv(SETTINGS_KEY);
|
||||||
let validItems = [ ];
|
let validItems = [];
|
||||||
for (let i = 0; i < currentItems.length; i++) {
|
for (let i = 0; i < currentItems.length; i++) {
|
||||||
let [id, index] = currentItems[i].split(':');
|
let [id, index] = currentItems[i].split(':');
|
||||||
let appInfo = Gio.DesktopAppInfo.new(id);
|
let appInfo = Gio.DesktopAppInfo.new(id);
|
||||||
if (!appInfo)
|
if (!appInfo)
|
||||||
continue;
|
continue;
|
||||||
validItems.push(currentItems[i]);
|
validItems.push(currentItems[i]);
|
||||||
|
|
||||||
let iter = this._store.append();
|
this._appendRow(appInfo, parseInt(index));
|
||||||
let adj = new Gtk.Adjustment({ lower: 1,
|
|
||||||
upper: WORKSPACE_MAX,
|
|
||||||
step_increment: 1,
|
|
||||||
value: index });
|
|
||||||
this._store.set(iter,
|
|
||||||
[Columns.APPINFO, Columns.ICON, Columns.DISPLAY_NAME, Columns.WORKSPACE, Columns.ADJUSTMENT],
|
|
||||||
[appInfo, appInfo.get_icon(), appInfo.get_display_name(), parseInt(index), adj]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (validItems.length != currentItems.length) // some items were filtered out
|
|
||||||
this._settings.set_strv(SETTINGS_KEY, validItems);
|
|
||||||
},
|
|
||||||
|
|
||||||
_appendItem: function(id, workspace) {
|
|
||||||
let currentItems = this._settings.get_strv(SETTINGS_KEY);
|
|
||||||
let alreadyHave = currentItems.map(function(el) {
|
|
||||||
return el.split(':')[0];
|
|
||||||
}).indexOf(id) != -1;
|
|
||||||
|
|
||||||
if (alreadyHave) {
|
|
||||||
printerr("Already have an item for this id");
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
currentItems.push(id + ':' + workspace);
|
if (validItems.length !== currentItems.length) // some items were filtered out
|
||||||
this._settings.set_strv(SETTINGS_KEY, currentItems);
|
this._settings.set_strv(SETTINGS_KEY, validItems);
|
||||||
return true;
|
}
|
||||||
},
|
|
||||||
|
|
||||||
_removeItem: function(id) {
|
_appendRow(appInfo, workspace) {
|
||||||
let currentItems = this._settings.get_strv(SETTINGS_KEY);
|
let iter = this._store.append();
|
||||||
let index = currentItems.map(function(el) {
|
let icon = appInfo.get_icon();
|
||||||
return el.split(':')[0];
|
let displayName = appInfo.get_display_name();
|
||||||
}).indexOf(id);
|
let adj = new Gtk.Adjustment({
|
||||||
|
lower: 1,
|
||||||
|
upper: WORKSPACE_MAX,
|
||||||
|
step_increment: 1,
|
||||||
|
value: workspace,
|
||||||
|
});
|
||||||
|
let { APPINFO, ICON, DISPLAY_NAME, WORKSPACE, ADJUSTMENT } = Columns;
|
||||||
|
this._store.set(iter,
|
||||||
|
[APPINFO, ICON, DISPLAY_NAME, WORKSPACE, ADJUSTMENT],
|
||||||
|
[appInfo, icon, displayName, workspace, adj]);
|
||||||
|
}
|
||||||
|
|
||||||
if (index < 0)
|
_checkId(id) {
|
||||||
return;
|
let items = this._settings.get_strv(SETTINGS_KEY);
|
||||||
currentItems.splice(index, 1);
|
return !items.some(i => i.startsWith(`${id}:`));
|
||||||
this._settings.set_strv(SETTINGS_KEY, currentItems);
|
}
|
||||||
},
|
|
||||||
|
|
||||||
_changeItem: function(id, workspace) {
|
_appendItem(id, workspace) {
|
||||||
let currentItems = this._settings.get_strv(SETTINGS_KEY);
|
let currentItems = this._settings.get_strv(SETTINGS_KEY);
|
||||||
let index = currentItems.map(function(el) {
|
currentItems.push(`${id}:${workspace}`);
|
||||||
return el.split(':')[0];
|
this._settings.set_strv(SETTINGS_KEY, currentItems);
|
||||||
}).indexOf(id);
|
}
|
||||||
|
|
||||||
if (index < 0)
|
_removeItem(id) {
|
||||||
currentItems.push(id + ':' + workspace);
|
let currentItems = this._settings.get_strv(SETTINGS_KEY);
|
||||||
else
|
let index = currentItems.map(el => el.split(':')[0]).indexOf(id);
|
||||||
currentItems[index] = id + ':' + workspace;
|
|
||||||
this._settings.set_strv(SETTINGS_KEY, currentItems);
|
if (index < 0)
|
||||||
|
return;
|
||||||
|
currentItems.splice(index, 1);
|
||||||
|
this._settings.set_strv(SETTINGS_KEY, currentItems);
|
||||||
|
}
|
||||||
|
|
||||||
|
_changeItem(id, workspace) {
|
||||||
|
let currentItems = this._settings.get_strv(SETTINGS_KEY);
|
||||||
|
let index = currentItems.map(el => el.split(':')[0]).indexOf(id);
|
||||||
|
|
||||||
|
if (index < 0)
|
||||||
|
currentItems.push(`${id}:${workspace}`);
|
||||||
|
else
|
||||||
|
currentItems[index] = `${id}:${workspace}`;
|
||||||
|
this._settings.set_strv(SETTINGS_KEY, currentItems);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
function init() {
|
function init() {
|
||||||
Convenience.initTranslations();
|
ExtensionUtils.initTranslations();
|
||||||
}
|
}
|
||||||
|
|
||||||
function buildPrefsWidget() {
|
function buildPrefsWidget() {
|
||||||
let widget = new Widget();
|
let widget = new Widget({ margin: 12 });
|
||||||
widget.show_all();
|
widget.show_all();
|
||||||
|
|
||||||
return widget;
|
return widget;
|
||||||
|
|||||||
@@ -1,5 +0,0 @@
|
|||||||
EXTENSION_ID = dock
|
|
||||||
|
|
||||||
include ../../extension.mk
|
|
||||||
include ../../settings.mk
|
|
||||||
|
|
||||||
@@ -1,991 +0,0 @@
|
|||||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
||||||
|
|
||||||
const Clutter = imports.gi.Clutter;
|
|
||||||
const Pango = imports.gi.Pango;
|
|
||||||
const GLib = imports.gi.GLib;
|
|
||||||
const Gio = imports.gi.Gio;
|
|
||||||
const Gtk = imports.gi.Gtk;
|
|
||||||
const Shell = imports.gi.Shell;
|
|
||||||
const Lang = imports.lang;
|
|
||||||
const Signals = imports.signals;
|
|
||||||
const St = imports.gi.St;
|
|
||||||
const Mainloop = imports.mainloop;
|
|
||||||
|
|
||||||
const AppFavorites = imports.ui.appFavorites;
|
|
||||||
const DND = imports.ui.dnd;
|
|
||||||
const Main = imports.ui.main;
|
|
||||||
const Overview = imports.ui.overview;
|
|
||||||
const PopupMenu = imports.ui.popupMenu;
|
|
||||||
const Search = imports.ui.search;
|
|
||||||
const Tweener = imports.ui.tweener;
|
|
||||||
const Workspace = imports.ui.workspace;
|
|
||||||
const AppDisplay = imports.ui.appDisplay;
|
|
||||||
const AltTab = imports.ui.altTab;
|
|
||||||
|
|
||||||
const Gettext = imports.gettext.domain('gnome-shell-extensions');
|
|
||||||
const _ = Gettext.gettext;
|
|
||||||
|
|
||||||
const ExtensionUtils = imports.misc.extensionUtils;
|
|
||||||
const Me = ExtensionUtils.getCurrentExtension();
|
|
||||||
const Convenience = Me.imports.convenience;
|
|
||||||
|
|
||||||
// Settings
|
|
||||||
const DOCK_POSITION_KEY = 'position';
|
|
||||||
const DOCK_SIZE_KEY = 'size';
|
|
||||||
const DOCK_HIDE_KEY = 'autohide';
|
|
||||||
const DOCK_EFFECTHIDE_KEY = 'hide-effect';
|
|
||||||
const DOCK_AUTOHIDE_ANIMATION_TIME_KEY = 'hide-effect-duration';
|
|
||||||
const DOCK_MONITOR_KEY = 'monitor';
|
|
||||||
|
|
||||||
// Keep enums in sync with GSettings schemas
|
|
||||||
const PositionMode = {
|
|
||||||
LEFT: 0,
|
|
||||||
RIGHT: 1
|
|
||||||
};
|
|
||||||
|
|
||||||
const AutoHideEffect = {
|
|
||||||
RESIZE: 0,
|
|
||||||
RESCALE: 1,
|
|
||||||
MOVE: 2
|
|
||||||
};
|
|
||||||
|
|
||||||
const DND_RAISE_APP_TIMEOUT = 500;
|
|
||||||
|
|
||||||
// Utility function to make the dock clipped to the primary monitor
|
|
||||||
function updateClip(actor, monitorNumber) {
|
|
||||||
let monitor;
|
|
||||||
if (monitorNumber > -1 && monitorNumber < Main.layoutManager.monitors.length)
|
|
||||||
monitor = Main.layoutManager.monitors[monitorNumber];
|
|
||||||
else
|
|
||||||
monitor = Main.layoutManager.primaryMonitor;
|
|
||||||
|
|
||||||
let allocation = actor.allocation;
|
|
||||||
|
|
||||||
// Here we implicitly assume that the stage and actor's parent
|
|
||||||
// share the same coordinate space
|
|
||||||
let clip = new Clutter.ActorBox({ x1: Math.max(monitor.x, allocation.x1),
|
|
||||||
y1: Math.max(monitor.y, allocation.y1),
|
|
||||||
x2: Math.min(monitor.x + monitor.width, allocation.x2),
|
|
||||||
y2: Math.min(monitor.y + monitor.height, allocation.y2) });
|
|
||||||
// Translate back into actor's coordinate space
|
|
||||||
clip.x1 -= actor.x;
|
|
||||||
clip.x2 -= actor.x;
|
|
||||||
clip.y1 -= actor.y;
|
|
||||||
clip.y2 -= actor.y;
|
|
||||||
|
|
||||||
// Apply the clip
|
|
||||||
actor.set_clip(clip.x1, clip.y1, clip.x2-clip.x1, clip.y2 - clip.y1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*************************************************************************************/
|
|
||||||
/**** start resize's Dock functions *****************/
|
|
||||||
/*************************************************************************************/
|
|
||||||
function hideDock_size () {
|
|
||||||
if (!this._hideable)
|
|
||||||
return;
|
|
||||||
|
|
||||||
let monitor = Main.layoutManager.primaryMonitor;
|
|
||||||
if (this._displayMonitor > -1 && this._displayMonitor < Main.layoutManager.monitors.length) {
|
|
||||||
monitor = Main.layoutManager.monitors[this._displayMonitor];
|
|
||||||
}
|
|
||||||
let position_x = monitor.x;
|
|
||||||
let height = (this._nicons)*(this._item_size + this._spacing) + 2*this._spacing;
|
|
||||||
let width = this._item_size + 4*this._spacing;
|
|
||||||
|
|
||||||
Tweener.addTween(this, {
|
|
||||||
_item_size: 1,
|
|
||||||
time: this._settings.get_double(DOCK_AUTOHIDE_ANIMATION_TIME_KEY),
|
|
||||||
transition: 'easeOutQuad',
|
|
||||||
onUpdate: function () {
|
|
||||||
height = (this._nicons)*(this._item_size + this._spacing) + 2*this._spacing;
|
|
||||||
width = this._item_size + 4*this._spacing;
|
|
||||||
switch (this._settings.get_enum(DOCK_POSITION_KEY)) {
|
|
||||||
case PositionMode.LEFT:
|
|
||||||
position_x=monitor.x-2*this._spacing;
|
|
||||||
break;
|
|
||||||
case PositionMode.RIGHT:
|
|
||||||
default:
|
|
||||||
position_x = monitor.x + (monitor.width-1-this._item_size-2*this._spacing);
|
|
||||||
}
|
|
||||||
this.actor.set_position (position_x,monitor.y+(monitor.height-height)/2);
|
|
||||||
this.actor.set_size(width,height);
|
|
||||||
|
|
||||||
updateClip(this.actor, this._displayMonitor);
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
this._hidden = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
function showDock_size () {
|
|
||||||
let monitor = Main.layoutManager.primaryMonitor;
|
|
||||||
if (this._displayMonitor > -1 && this._displayMonitor < Main.layoutManager.monitors.length) {
|
|
||||||
monitor = Main.layoutManager.monitors[this._displayMonitor];
|
|
||||||
}
|
|
||||||
let height = (this._nicons)*(this._item_size + this._spacing) + 2*this._spacing;
|
|
||||||
let width = this._item_size + 4*this._spacing;
|
|
||||||
let position_x = monitor.x;
|
|
||||||
|
|
||||||
Tweener.addTween(this, {
|
|
||||||
_item_size: this._settings.get_int(DOCK_SIZE_KEY),
|
|
||||||
time: this._settings.get_double(DOCK_AUTOHIDE_ANIMATION_TIME_KEY),
|
|
||||||
transition: 'easeOutQuad',
|
|
||||||
onUpdate: function () {
|
|
||||||
height = (this._nicons)*(this._item_size + this._spacing) + 2*this._spacing;
|
|
||||||
width = this._item_size + 4*this._spacing;
|
|
||||||
switch (this._settings.get_enum(DOCK_POSITION_KEY)) {
|
|
||||||
case PositionMode.LEFT:
|
|
||||||
position_x=monitor.x-2*this._spacing;
|
|
||||||
break;
|
|
||||||
case PositionMode.RIGHT:
|
|
||||||
default:
|
|
||||||
position_x=monitor.x + (monitor.width-this._item_size-2*this._spacing);
|
|
||||||
}
|
|
||||||
this.actor.set_position (position_x, monitor.y+(monitor.height-height)/2);
|
|
||||||
this.actor.set_size(width,height);
|
|
||||||
|
|
||||||
updateClip(this.actor, this._displayMonitor);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
this._hidden = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
function showEffectAddItem_size () {
|
|
||||||
let primary = Main.layoutManager.primaryMonitor;
|
|
||||||
let height = (this._nicons)*(this._item_size + this._spacing) + 2*this._spacing;
|
|
||||||
let width = this._item_size + 4*this._spacing;
|
|
||||||
|
|
||||||
Tweener.addTween(this.actor, {
|
|
||||||
y: primary.y + (primary.height-height)/2,
|
|
||||||
height: height,
|
|
||||||
width: width,
|
|
||||||
time: this._settings.get_double(DOCK_AUTOHIDE_ANIMATION_TIME_KEY),
|
|
||||||
transition: 'easeOutQuad',
|
|
||||||
onUpdate: function (monitor) {
|
|
||||||
updateClip(this, monitor);
|
|
||||||
},
|
|
||||||
onUpdateParams: [this._displayMonitor]
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**************************************************************************************/
|
|
||||||
/**** start rescale's Dock functions *****************/
|
|
||||||
/**************************************************************************************/
|
|
||||||
function hideDock_scale () {
|
|
||||||
if (!this._hideable)
|
|
||||||
return;
|
|
||||||
|
|
||||||
this._item_size = this._settings.get_int(DOCK_SIZE_KEY);
|
|
||||||
let monitor = Main.layoutManager.primaryMonitor;
|
|
||||||
if (this._displayMonitor > -1 && this._displayMonitor < Main.layoutManager.monitors.length) {
|
|
||||||
monitor = Main.layoutManager.monitors[this._displayMonitor];
|
|
||||||
}
|
|
||||||
let cornerX = 0;
|
|
||||||
let height = this._nicons*(this._item_size + this._spacing) + 2*this._spacing;
|
|
||||||
let width = this._item_size + 4*this._spacing;
|
|
||||||
|
|
||||||
switch (this._settings.get_enum(DOCK_POSITION_KEY)) {
|
|
||||||
case PositionMode.LEFT:
|
|
||||||
cornerX=monitor.x;
|
|
||||||
break;
|
|
||||||
case PositionMode.RIGHT:
|
|
||||||
default:
|
|
||||||
cornerX = monitor.x + monitor.width-1;
|
|
||||||
}
|
|
||||||
|
|
||||||
Tweener.addTween(this.actor,{
|
|
||||||
y: monitor.y + (monitor.height-height)/2,
|
|
||||||
x: cornerX,
|
|
||||||
height:height,
|
|
||||||
width: width,
|
|
||||||
scale_x: 0.025,
|
|
||||||
time: this._settings.get_double(DOCK_AUTOHIDE_ANIMATION_TIME_KEY),
|
|
||||||
transition: 'easeOutQuad',
|
|
||||||
onUpdate: function(monitor) {
|
|
||||||
updateClip(this, monitor);
|
|
||||||
},
|
|
||||||
onUpdateParams: [this._displayMonitor]
|
|
||||||
});
|
|
||||||
|
|
||||||
this._hidden = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
function showDock_scale () {
|
|
||||||
this._item_size = this._settings.get_int(DOCK_SIZE_KEY);
|
|
||||||
let monitor = Main.layoutManager.primaryMonitor;
|
|
||||||
if (this._displayMonitor > -1 && this._displayMonitor < Main.layoutManager.monitors.length) {
|
|
||||||
monitor = Main.layoutManager.monitors[this._displayMonitor];
|
|
||||||
}
|
|
||||||
let position_x = monitor.x;
|
|
||||||
let height = this._nicons*(this._item_size + this._spacing) + 2*this._spacing;
|
|
||||||
let width = this._item_size + 4*this._spacing;
|
|
||||||
|
|
||||||
switch (this._settings.get_enum(DOCK_POSITION_KEY)) {
|
|
||||||
case PositionMode.LEFT:
|
|
||||||
position_x=monitor.x-2*this._spacing;
|
|
||||||
break;
|
|
||||||
case PositionMode.RIGHT:
|
|
||||||
default:
|
|
||||||
position_x=monitor.x + (monitor.width-this._item_size-2*this._spacing);
|
|
||||||
}
|
|
||||||
Tweener.addTween(this.actor, {
|
|
||||||
y: monitor.y + (monitor.height-height)/2,
|
|
||||||
x: monitor.x + position_x,
|
|
||||||
height: height,
|
|
||||||
width: width,
|
|
||||||
scale_x: 1,
|
|
||||||
time: this._settings.get_double(DOCK_AUTOHIDE_ANIMATION_TIME_KEY),
|
|
||||||
transition: 'easeOutQuad',
|
|
||||||
onUpdate: function(monitor) {
|
|
||||||
updateClip(this, monitor);
|
|
||||||
},
|
|
||||||
onUpdateParams: [this._displayMonitor]
|
|
||||||
});
|
|
||||||
|
|
||||||
this._hidden = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
function showEffectAddItem_scale () {
|
|
||||||
let monitor = Main.layoutManager.primaryMonitor;
|
|
||||||
if (this._displayMonitor > -1 && this._displayMonitor < Main.layoutManager.monitors.length) {
|
|
||||||
monitor = Main.layoutManager.monitors[this._displayMonitor];
|
|
||||||
}
|
|
||||||
let height = this._nicons*(this._item_size + this._spacing) + 2*this._spacing;
|
|
||||||
let width = this._item_size + 4*this._spacing;
|
|
||||||
|
|
||||||
Tweener.addTween(this.actor, {
|
|
||||||
y: monitor.y + (monitor.height-height)/2,
|
|
||||||
height: height,
|
|
||||||
width: width,
|
|
||||||
time: this._settings.get_double(DOCK_AUTOHIDE_ANIMATION_TIME_KEY),
|
|
||||||
transition: 'easeOutQuad',
|
|
||||||
onUpdate: function(monitor) {
|
|
||||||
updateClip(this, monitor);
|
|
||||||
},
|
|
||||||
onUpdateParams: [this._displayMonitor]
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**************************************************************************************/
|
|
||||||
/**** start move Dock functions *****************/
|
|
||||||
/**************************************************************************************/
|
|
||||||
function hideDock_move () {
|
|
||||||
if (!this._hideable)
|
|
||||||
return;
|
|
||||||
|
|
||||||
this._item_size = this._settings.get_int(DOCK_SIZE_KEY);
|
|
||||||
let monitor = Main.layoutManager.primaryMonitor;
|
|
||||||
if (this._displayMonitor > -1 && this._displayMonitor < Main.layoutManager.monitors.length) {
|
|
||||||
monitor = Main.layoutManager.monitors[this._displayMonitor];
|
|
||||||
}
|
|
||||||
let cornerX = 0;
|
|
||||||
let height = this._nicons*(this._item_size + this._spacing) + 2*this._spacing;
|
|
||||||
let width = this._item_size + 4*this._spacing;
|
|
||||||
|
|
||||||
switch (this._settings.get_enum(DOCK_POSITION_KEY)) {
|
|
||||||
case PositionMode.LEFT:
|
|
||||||
cornerX= monitor.x - width + this._spacing;
|
|
||||||
break;
|
|
||||||
case PositionMode.RIGHT:
|
|
||||||
default:
|
|
||||||
cornerX = monitor.x + monitor.width - this._spacing;
|
|
||||||
}
|
|
||||||
|
|
||||||
Tweener.addTween(this.actor,{
|
|
||||||
x: cornerX,
|
|
||||||
y: monitor.y + (monitor.height - height)/2,
|
|
||||||
width: width,
|
|
||||||
height: height,
|
|
||||||
time: this._settings.get_double(DOCK_AUTOHIDE_ANIMATION_TIME_KEY),
|
|
||||||
transition: 'easeOutQuad',
|
|
||||||
onUpdate: function(monitor) {
|
|
||||||
updateClip(this, monitor);
|
|
||||||
},
|
|
||||||
onUpdateParams: [this._displayMonitor]
|
|
||||||
});
|
|
||||||
|
|
||||||
this._hidden = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
function showDock_move () {
|
|
||||||
this._item_size = this._settings.get_int(DOCK_SIZE_KEY);
|
|
||||||
let monitor = Main.layoutManager.primaryMonitor;
|
|
||||||
if (this._displayMonitor > -1 && this._displayMonitor < Main.layoutManager.monitors.length) {
|
|
||||||
monitor = Main.layoutManager.monitors[this._displayMonitor];
|
|
||||||
}
|
|
||||||
let position_x = monitor.x;
|
|
||||||
let height = this._nicons*(this._item_size + this._spacing) + 2*this._spacing;
|
|
||||||
let width = this._item_size + 4*this._spacing;
|
|
||||||
|
|
||||||
switch (this._settings.get_enum(DOCK_POSITION_KEY)) {
|
|
||||||
case PositionMode.LEFT:
|
|
||||||
position_x=monitor.x - 2*this._spacing;
|
|
||||||
break;
|
|
||||||
case PositionMode.RIGHT:
|
|
||||||
default:
|
|
||||||
position_x=monitor.x + (monitor.width-this._item_size-2*this._spacing);
|
|
||||||
}
|
|
||||||
Tweener.addTween(this.actor, {
|
|
||||||
x: position_x,
|
|
||||||
y: monitor.y + (monitor.height - height)/2,
|
|
||||||
width: width,
|
|
||||||
height: height,
|
|
||||||
time: this._settings.get_double(DOCK_AUTOHIDE_ANIMATION_TIME_KEY),
|
|
||||||
transition: 'easeOutQuad',
|
|
||||||
onUpdate: function(monitor) {
|
|
||||||
updateClip(this, monitor);
|
|
||||||
},
|
|
||||||
onUpdateParams: [this._displayMonitor]
|
|
||||||
});
|
|
||||||
|
|
||||||
this._hidden = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
function showEffectAddItem_move () {
|
|
||||||
let monitor = Main.layoutManager.primaryMonitor;
|
|
||||||
if (this._displayMonitor > -1 && this._displayMonitor < Main.layoutManager.monitors.length) {
|
|
||||||
monitor = Main.layoutManager.monitors[this._displayMonitor];
|
|
||||||
}
|
|
||||||
let height = this._nicons*(this._item_size + this._spacing) + 2*this._spacing;
|
|
||||||
let width = this._item_size + 4*this._spacing;
|
|
||||||
|
|
||||||
Tweener.addTween(this.actor, {
|
|
||||||
y: monitor.y + (monitor.height-height)/2,
|
|
||||||
height: height,
|
|
||||||
width: width,
|
|
||||||
time: this._settings.get_double(DOCK_AUTOHIDE_ANIMATION_TIME_KEY),
|
|
||||||
transition: 'easeOutQuad',
|
|
||||||
onUpdate: function(monitor) {
|
|
||||||
updateClip(this, monitor);
|
|
||||||
},
|
|
||||||
onUpdateParams: [this._displayMonitor]
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const Dock = new Lang.Class({
|
|
||||||
Name: 'Dock.Dock',
|
|
||||||
|
|
||||||
_init : function() {
|
|
||||||
this._placeholderText = null;
|
|
||||||
this._menus = [];
|
|
||||||
this._menuDisplays = [];
|
|
||||||
|
|
||||||
this._favorites = [];
|
|
||||||
|
|
||||||
// Load Settings
|
|
||||||
this._settings = Convenience.getSettings();
|
|
||||||
this._hidden = false;
|
|
||||||
this._hideable = this._settings.get_boolean(DOCK_HIDE_KEY);
|
|
||||||
this._displayMonitor = this._settings.get_int(DOCK_MONITOR_KEY);
|
|
||||||
|
|
||||||
this._spacing = 4;
|
|
||||||
this._item_size = this._settings.get_int(DOCK_SIZE_KEY);
|
|
||||||
this._nicons = 0;
|
|
||||||
this._selectEffectFunctions(this._settings.get_enum(DOCK_EFFECTHIDE_KEY));
|
|
||||||
|
|
||||||
let [_x, _y, _w, _h] = this.get_start_position();
|
|
||||||
this.actor = new St.BoxLayout({ name: 'dock', vertical: true, reactive: true,
|
|
||||||
x: _x, y: _y, width: _w, height: _h });
|
|
||||||
|
|
||||||
this._grid = new Shell.GenericContainer();
|
|
||||||
this.actor.add(this._grid, { expand: true, y_align: St.Align.START });
|
|
||||||
this.actor.connect('style-changed', Lang.bind(this, this._onStyleChanged));
|
|
||||||
|
|
||||||
this._grid.connect('get-preferred-width', Lang.bind(this, this._getPreferredWidth));
|
|
||||||
this._grid.connect('get-preferred-height', Lang.bind(this, this._getPreferredHeight));
|
|
||||||
this._grid.connect('allocate', Lang.bind(this, this._allocate));
|
|
||||||
|
|
||||||
this._workId = Main.initializeDeferredWork(this.actor, Lang.bind(this, this._redisplay));
|
|
||||||
|
|
||||||
this._tracker = Shell.WindowTracker.get_default();
|
|
||||||
this._appSystem = Shell.AppSystem.get_default();
|
|
||||||
|
|
||||||
this._installedChangedId = this._appSystem.connect('installed-changed', Lang.bind(this, this._queueRedisplay));
|
|
||||||
this._appFavoritesChangedId = AppFavorites.getAppFavorites().connect('changed', Lang.bind(this, this._queueRedisplay));
|
|
||||||
this._appStateChangedId = this._appSystem.connect('app-state-changed', Lang.bind(this, this._queueRedisplay));
|
|
||||||
|
|
||||||
this._overviewShowingId = Main.overview.connect('showing', Lang.bind(this, function() {
|
|
||||||
this.actor.hide();
|
|
||||||
}));
|
|
||||||
this._overviewHiddenId = Main.overview.connect('hidden', Lang.bind(this, function() {
|
|
||||||
this.actor.show();
|
|
||||||
}));
|
|
||||||
Main.layoutManager.addChrome(this.actor,
|
|
||||||
{ affectsStruts: !this._settings.get_boolean(DOCK_HIDE_KEY) });
|
|
||||||
|
|
||||||
//hidden
|
|
||||||
this._settings.connect('changed::'+DOCK_POSITION_KEY, Lang.bind(this, this._redisplay));
|
|
||||||
this._settings.connect('changed::'+DOCK_SIZE_KEY, Lang.bind(this, this._redisplay));
|
|
||||||
this._settings.connect('changed::'+DOCK_MONITOR_KEY, Lang.bind(this, function (){
|
|
||||||
this._displayMonitor = this._settings.get_int(DOCK_MONITOR_KEY);
|
|
||||||
this._redisplay();
|
|
||||||
}));
|
|
||||||
|
|
||||||
this._settings.connect('changed::'+DOCK_HIDE_KEY, Lang.bind(this, function (){
|
|
||||||
Main.layoutManager.removeChrome(this.actor);
|
|
||||||
Main.layoutManager.addChrome(this.actor,
|
|
||||||
{ affectsStruts: !this._settings.get_boolean(DOCK_HIDE_KEY) });
|
|
||||||
|
|
||||||
this._hideable = this._settings.get_boolean(DOCK_HIDE_KEY);
|
|
||||||
if (this._hideable)
|
|
||||||
this._hideDock();
|
|
||||||
else
|
|
||||||
this._showDock();
|
|
||||||
}));
|
|
||||||
|
|
||||||
this._settings.connect('changed::' + DOCK_EFFECTHIDE_KEY, Lang.bind(this, function () {
|
|
||||||
let hideEffect = this._settings.get_enum(DOCK_EFFECTHIDE_KEY);
|
|
||||||
|
|
||||||
// restore the effects of the other functions
|
|
||||||
switch (hideEffect) {
|
|
||||||
case AutoHideEffect.RESCALE:
|
|
||||||
this._item_size = this._settings.get_int(DOCK_SIZE_KEY);
|
|
||||||
break;
|
|
||||||
case AutoHideEffect.RESIZE:
|
|
||||||
this.actor.set_scale(1, 1);
|
|
||||||
break;
|
|
||||||
case AutoHideEffect.MOVE:
|
|
||||||
this.actor.set_scale(1, 1);
|
|
||||||
this._item_size = this._settings.get_int(DOCK_SIZE_KEY);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.actor.disconnect(this._leave_event);
|
|
||||||
this.actor.disconnect(this._enter_event);
|
|
||||||
|
|
||||||
this._selectEffectFunctions(hideEffect);
|
|
||||||
|
|
||||||
this._leave_event = this.actor.connect('leave-event', Lang.bind(this, this._hideDock));
|
|
||||||
this._enter_event = this.actor.connect('enter-event', Lang.bind(this, this._showDock));
|
|
||||||
this._redisplay();
|
|
||||||
}));
|
|
||||||
|
|
||||||
this._leave_event = this.actor.connect('leave-event', Lang.bind(this, this._hideDock));
|
|
||||||
this._enter_event = this.actor.connect('enter-event', Lang.bind(this, this._showDock));
|
|
||||||
|
|
||||||
this._hideDock();
|
|
||||||
},
|
|
||||||
|
|
||||||
get_start_position: function() {
|
|
||||||
let item_size = this._settings.get_int(DOCK_SIZE_KEY);
|
|
||||||
let monitor = Main.layoutManager.primaryMonitor;
|
|
||||||
if (this._displayMonitor > -1 && this._displayMonitor < Main.layoutManager.monitors.length) {
|
|
||||||
monitor = Main.layoutManager.monitors[this._displayMonitor];
|
|
||||||
}
|
|
||||||
let position_x = monitor.x;
|
|
||||||
let width = item_size + 4 * this._spacing;
|
|
||||||
|
|
||||||
switch (this._settings.get_enum(DOCK_POSITION_KEY)) {
|
|
||||||
case PositionMode.LEFT:
|
|
||||||
position_x=monitor.x - 2 * this._spacing;
|
|
||||||
break;
|
|
||||||
case PositionMode.RIGHT:
|
|
||||||
default:
|
|
||||||
position_x=monitor.x + (monitor.width - item_size - 2 * this._spacing);
|
|
||||||
}
|
|
||||||
|
|
||||||
return [ position_x, monitor.y, width, monitor.height ];
|
|
||||||
},
|
|
||||||
|
|
||||||
destroy: function() {
|
|
||||||
if (this._installedChangedId) {
|
|
||||||
this._appSystem.disconnect(this._installedChangedId);
|
|
||||||
this._installedChangedId = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this._appFavoritesChangedId) {
|
|
||||||
AppFavorites.getAppFavorites().disconnect(this._appFavoritesChangedId);
|
|
||||||
this._appFavoritesChangedId = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this._appStateChangedId) {
|
|
||||||
this._appSystem.disconnect(this._appStateChangedId);
|
|
||||||
this._appStateChangedId = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this._overviewShowingId) {
|
|
||||||
Main.overview.disconnect(this._overviewShowingId);
|
|
||||||
this._overviewShowingId = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this._overviewHiddenId) {
|
|
||||||
Main.overview.disconnect(this._overviewHiddenId);
|
|
||||||
this._overviewHiddenId = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.actor.destroy();
|
|
||||||
|
|
||||||
// Break reference cycles
|
|
||||||
this._settings.run_dispose();
|
|
||||||
this._settings = null;
|
|
||||||
this._appSystem = null;
|
|
||||||
this._tracker = null;
|
|
||||||
},
|
|
||||||
|
|
||||||
// fuctions hide
|
|
||||||
_restoreHideDock: function() {
|
|
||||||
this._hideable = this._settings.get_boolean(DOCK_HIDE_KEY);
|
|
||||||
},
|
|
||||||
|
|
||||||
_disableHideDock: function() {
|
|
||||||
this._hideable = false;
|
|
||||||
},
|
|
||||||
|
|
||||||
_selectEffectFunctions: function(hideEffect) {
|
|
||||||
switch (hideEffect) {
|
|
||||||
case AutoHideEffect.RESCALE:
|
|
||||||
this._hideDock = hideDock_scale;
|
|
||||||
this._showDock = showDock_scale;
|
|
||||||
this._showEffectAddItem = showEffectAddItem_scale;
|
|
||||||
break;
|
|
||||||
case AutoHideEffect.MOVE:
|
|
||||||
this._hideDock = hideDock_move;
|
|
||||||
this._showDock = showDock_move;
|
|
||||||
this._showEffectAddItem = showEffectAddItem_move;
|
|
||||||
break;
|
|
||||||
case AutoHideEffect.RESIZE:
|
|
||||||
default:
|
|
||||||
this._hideDock = hideDock_size;
|
|
||||||
this._showDock = showDock_size;
|
|
||||||
this._showEffectAddItem = showEffectAddItem_size;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
_appIdListToHash: function(apps) {
|
|
||||||
let ids = {};
|
|
||||||
for (let i = 0; i < apps.length; i++)
|
|
||||||
ids[apps[i].get_id()] = apps[i];
|
|
||||||
return ids;
|
|
||||||
},
|
|
||||||
|
|
||||||
_queueRedisplay: function () {
|
|
||||||
Main.queueDeferredWork(this._workId);
|
|
||||||
},
|
|
||||||
|
|
||||||
_redisplay: function () {
|
|
||||||
this.removeAll();
|
|
||||||
|
|
||||||
let favorites = AppFavorites.getAppFavorites().getFavoriteMap();
|
|
||||||
|
|
||||||
let running = this._appSystem.get_running();
|
|
||||||
let runningIds = this._appIdListToHash(running);
|
|
||||||
|
|
||||||
let icons = 0;
|
|
||||||
|
|
||||||
let nFavorites = 0;
|
|
||||||
for (let id in favorites) {
|
|
||||||
let app = favorites[id];
|
|
||||||
let display = new DockIcon(app,this);
|
|
||||||
this.addItem(display.actor);
|
|
||||||
nFavorites++;
|
|
||||||
icons++;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (let i = 0; i < running.length; i++) {
|
|
||||||
let app = running[i];
|
|
||||||
if (app.get_id() in favorites)
|
|
||||||
continue;
|
|
||||||
let display = new DockIcon(app,this);
|
|
||||||
icons++;
|
|
||||||
this.addItem(display.actor);
|
|
||||||
}
|
|
||||||
this._nicons=icons;
|
|
||||||
|
|
||||||
if (this._placeholderText) {
|
|
||||||
this._placeholderText.destroy();
|
|
||||||
this._placeholderText = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (running.length == 0 && nFavorites == 0) {
|
|
||||||
this._placeholderText = new St.Label({ text: _("Drag here to add favorites") });
|
|
||||||
this.actor.add_actor(this._placeholderText);
|
|
||||||
}
|
|
||||||
|
|
||||||
let primary = Main.layoutManager.primaryMonitor;
|
|
||||||
let height = (icons)*(this._item_size + this._spacing) + 2*this._spacing;
|
|
||||||
let width = this._item_size + 4*this._spacing;
|
|
||||||
|
|
||||||
if (this._hideable && this._hidden) {
|
|
||||||
this._hideDock();
|
|
||||||
} else {
|
|
||||||
if (this._settings.get_int(DOCK_SIZE_KEY) == this._item_size) {
|
|
||||||
// only add/delete icon
|
|
||||||
this._showEffectAddItem ();
|
|
||||||
} else {
|
|
||||||
// change size icon
|
|
||||||
this._showDock ();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
_getPreferredWidth: function (grid, forHeight, alloc) {
|
|
||||||
alloc.min_size = this._item_size;
|
|
||||||
alloc.natural_size = this._item_size + this._spacing;
|
|
||||||
},
|
|
||||||
|
|
||||||
_getPreferredHeight: function (grid, forWidth, alloc) {
|
|
||||||
let children = this._grid.get_children();
|
|
||||||
let nRows = children.length;
|
|
||||||
let totalSpacing = Math.max(0, nRows - 1) * this._spacing;
|
|
||||||
let height = nRows * this._item_size + totalSpacing;
|
|
||||||
alloc.min_size = height;
|
|
||||||
alloc.natural_size = height;
|
|
||||||
},
|
|
||||||
|
|
||||||
_allocate: function (grid, box, flags) {
|
|
||||||
let children = this._grid.get_children();
|
|
||||||
|
|
||||||
let x = box.x1 + this._spacing;
|
|
||||||
if (this._settings.get_enum(DOCK_POSITION_KEY) == PositionMode.LEFT)
|
|
||||||
x = box.x1 + 2*this._spacing;
|
|
||||||
let y = box.y1 + this._spacing;
|
|
||||||
|
|
||||||
for (let i = 0; i < children.length; i++) {
|
|
||||||
let childBox = new Clutter.ActorBox();
|
|
||||||
childBox.x1 = x;
|
|
||||||
childBox.y1 = y;
|
|
||||||
childBox.x2 = childBox.x1 + this._item_size;
|
|
||||||
childBox.y2 = childBox.y1 + this._item_size;
|
|
||||||
children[i].allocate(childBox, flags);
|
|
||||||
y += this._item_size + this._spacing;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
_onStyleChanged: function() {
|
|
||||||
let themeNode = this.actor.get_theme_node();
|
|
||||||
let [success, len] = themeNode.get_length('spacing', false);
|
|
||||||
if (success)
|
|
||||||
this._spacing = len;
|
|
||||||
[success, len] = themeNode.get_length('-shell-grid-item-size', false);
|
|
||||||
if (success)
|
|
||||||
this._item_size = len;
|
|
||||||
this._grid.queue_relayout();
|
|
||||||
},
|
|
||||||
|
|
||||||
removeAll: function () {
|
|
||||||
this._grid.get_children().forEach(Lang.bind(this, function (child) {
|
|
||||||
child.destroy();
|
|
||||||
}));
|
|
||||||
},
|
|
||||||
|
|
||||||
addItem: function(actor) {
|
|
||||||
this._grid.add_actor(actor);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
Signals.addSignalMethods(Dock.prototype);
|
|
||||||
|
|
||||||
const DockIcon = new Lang.Class({
|
|
||||||
Name: 'Dock.DockIcon',
|
|
||||||
|
|
||||||
_init : function(app, dock) {
|
|
||||||
this._dock = dock;
|
|
||||||
this._settings = dock._settings;
|
|
||||||
|
|
||||||
|
|
||||||
this.app = app;
|
|
||||||
this.actor = new St.Button({ style_class: 'app-well-app',
|
|
||||||
button_mask: St.ButtonMask.ONE | St.ButtonMask.TWO,
|
|
||||||
reactive: true,
|
|
||||||
x_fill: true,
|
|
||||||
y_fill: true });
|
|
||||||
this.actor._delegate = this;
|
|
||||||
|
|
||||||
this._icon = new AppDisplay.AppIcon(app, { setSizeManually: true,
|
|
||||||
showLabel: false });
|
|
||||||
this.actor.set_child(this._icon.actor);
|
|
||||||
this._icon.setIconSize(this._settings.get_int(DOCK_SIZE_KEY));
|
|
||||||
|
|
||||||
this.actor.connect('clicked', Lang.bind(this, this._onClicked));
|
|
||||||
|
|
||||||
this._menu = null;
|
|
||||||
this._menuManager = new PopupMenu.PopupMenuManager(this);
|
|
||||||
|
|
||||||
this._has_focus = false;
|
|
||||||
|
|
||||||
let tracker = Shell.WindowTracker.get_default();
|
|
||||||
tracker.connect('notify::focus-app', Lang.bind(this, this._onStateChanged));
|
|
||||||
|
|
||||||
this.actor.connect('button-press-event', Lang.bind(this, this._onButtonPress));
|
|
||||||
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
|
|
||||||
this.actor.connect('notify::hover', Lang.bind(this, this._hoverChanged));
|
|
||||||
|
|
||||||
this._menuTimeoutId = 0;
|
|
||||||
this._stateChangedId = this.app.connect('notify::state',
|
|
||||||
Lang.bind(this, this._onStateChanged));
|
|
||||||
this._onStateChanged();
|
|
||||||
},
|
|
||||||
|
|
||||||
_onDestroy: function() {
|
|
||||||
if (this._stateChangedId > 0)
|
|
||||||
this.app.disconnect(this._stateChangedId);
|
|
||||||
this._stateChangedId = 0;
|
|
||||||
this._removeMenuTimeout();
|
|
||||||
},
|
|
||||||
|
|
||||||
_removeMenuTimeout: function() {
|
|
||||||
if (this._menuTimeoutId > 0) {
|
|
||||||
Mainloop.source_remove(this._menuTimeoutId);
|
|
||||||
this._menuTimeoutId = 0;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
_hoverChanged: function(actor) {
|
|
||||||
if (actor != this.actor)
|
|
||||||
this._has_focus = false;
|
|
||||||
else
|
|
||||||
this._has_focus = true;
|
|
||||||
return false;
|
|
||||||
},
|
|
||||||
|
|
||||||
_onStateChanged: function() {
|
|
||||||
let tracker = Shell.WindowTracker.get_default();
|
|
||||||
let focusedApp = tracker.focus_app;
|
|
||||||
if (this.app.state != Shell.AppState.STOPPED) {
|
|
||||||
this.actor.add_style_class_name('running');
|
|
||||||
if (this.app == focusedApp) {
|
|
||||||
this.actor.add_style_class_name('focused');
|
|
||||||
} else {
|
|
||||||
this.actor.remove_style_class_name('focused');
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
this.actor.remove_style_class_name('focused');
|
|
||||||
this.actor.remove_style_class_name('running');
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
_onButtonPress: function(actor, event) {
|
|
||||||
let button = event.get_button();
|
|
||||||
if (button == 1) {
|
|
||||||
this._removeMenuTimeout();
|
|
||||||
this._menuTimeoutId = Mainloop.timeout_add(AppDisplay.MENU_POPUP_TIMEOUT, Lang.bind(this, function() {
|
|
||||||
this.popupMenu();
|
|
||||||
}));
|
|
||||||
} else if (button == 3) {
|
|
||||||
this.popupMenu();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
_onClicked: function(actor, button) {
|
|
||||||
this._removeMenuTimeout();
|
|
||||||
|
|
||||||
if (button == 1) {
|
|
||||||
this._onActivate(Clutter.get_current_event());
|
|
||||||
} else if (button == 2) {
|
|
||||||
// Last workspace is always empty
|
|
||||||
let launchWorkspace = global.screen.get_workspace_by_index(global.screen.n_workspaces - 1);
|
|
||||||
launchWorkspace.activate(global.get_current_time());
|
|
||||||
this.emit('launching');
|
|
||||||
this.app.open_new_window(-1);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
},
|
|
||||||
|
|
||||||
getId: function() {
|
|
||||||
return this.app.get_id();
|
|
||||||
},
|
|
||||||
|
|
||||||
popupMenu: function() {
|
|
||||||
this._removeMenuTimeout();
|
|
||||||
this.actor.fake_release();
|
|
||||||
|
|
||||||
this._dock._disableHideDock();
|
|
||||||
|
|
||||||
if (!this._menu) {
|
|
||||||
this._menu = new DockIconMenu(this);
|
|
||||||
this._menu.connect('activate-window', Lang.bind(this, function (menu, window) {
|
|
||||||
this.activateWindow(window);
|
|
||||||
}));
|
|
||||||
this._menu.connect('open-state-changed', Lang.bind(this, function (menu, isPoppedUp) {
|
|
||||||
if (!isPoppedUp){
|
|
||||||
//Restore value of autohidedock
|
|
||||||
this._dock._restoreHideDock();
|
|
||||||
this._dock._hideDock();
|
|
||||||
|
|
||||||
this._onMenuPoppedDown();
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
|
|
||||||
this._menuManager.addMenu(this._menu, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
this._menu.redisplay();
|
|
||||||
this._menu.open();
|
|
||||||
|
|
||||||
return false;
|
|
||||||
},
|
|
||||||
|
|
||||||
activateWindow: function(metaWindow) {
|
|
||||||
if (metaWindow) {
|
|
||||||
this._didActivateWindow = true;
|
|
||||||
Main.activateWindow(metaWindow);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
setSelected: function (isSelected) {
|
|
||||||
this._selected = isSelected;
|
|
||||||
if (this._selected)
|
|
||||||
this.actor.add_style_class_name('selected');
|
|
||||||
else
|
|
||||||
this.actor.remove_style_class_name('selected');
|
|
||||||
},
|
|
||||||
|
|
||||||
_onMenuPoppedDown: function() {
|
|
||||||
this.actor.sync_hover();
|
|
||||||
},
|
|
||||||
|
|
||||||
_getRunning: function() {
|
|
||||||
return this.app.state != Shell.AppState.STOPPED;
|
|
||||||
},
|
|
||||||
|
|
||||||
_onActivate: function (event) {
|
|
||||||
this.emit('launching');
|
|
||||||
let modifiers = event.get_state();
|
|
||||||
|
|
||||||
if (modifiers & Clutter.ModifierType.CONTROL_MASK
|
|
||||||
&& this.app.state == Shell.AppState.RUNNING) {
|
|
||||||
let current_workspace = global.screen.get_active_workspace().index();
|
|
||||||
this.app.open_new_window(current_workspace);
|
|
||||||
} else {
|
|
||||||
let tracker = Shell.WindowTracker.get_default();
|
|
||||||
let focusedApp = tracker.focus_app;
|
|
||||||
|
|
||||||
if (this.app == focusedApp) {
|
|
||||||
let windows = this.app.get_windows();
|
|
||||||
let current_workspace = global.screen.get_active_workspace();
|
|
||||||
for (let i = 0; i < windows.length; i++) {
|
|
||||||
let w = windows[i];
|
|
||||||
if (w.get_workspace() == current_workspace)
|
|
||||||
w.minimize();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
this.app.activate(-1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Main.overview.hide();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
Signals.addSignalMethods(DockIcon.prototype);
|
|
||||||
|
|
||||||
const DockIconMenu = new Lang.Class({
|
|
||||||
Name: 'Dock.DockIconMenu',
|
|
||||||
Extends: PopupMenu.PopupMenu,
|
|
||||||
|
|
||||||
_init: function(source) {
|
|
||||||
let side;
|
|
||||||
switch (source._settings.get_enum(DOCK_POSITION_KEY)) {
|
|
||||||
case PositionMode.LEFT:
|
|
||||||
side = St.Side.LEFT;
|
|
||||||
break;
|
|
||||||
case PositionMode.RIGHT:
|
|
||||||
default:
|
|
||||||
side = St.Side.RIGHT;
|
|
||||||
}
|
|
||||||
this.parent(source.actor, 0.5, side);
|
|
||||||
|
|
||||||
this._source = source;
|
|
||||||
|
|
||||||
this.connect('activate', Lang.bind(this, this._onActivate));
|
|
||||||
|
|
||||||
this.actor.add_style_class_name('dock-menu');
|
|
||||||
|
|
||||||
// Chain our visibility and lifecycle to that of the source
|
|
||||||
source.actor.connect('notify::mapped', Lang.bind(this, function () {
|
|
||||||
if (!source.actor.mapped)
|
|
||||||
this.close();
|
|
||||||
}));
|
|
||||||
source.actor.connect('destroy', Lang.bind(this, function () { this.destroy(); }));
|
|
||||||
|
|
||||||
Main.layoutManager.addChrome(this.actor);
|
|
||||||
},
|
|
||||||
|
|
||||||
redisplay: function() {
|
|
||||||
this.removeAll();
|
|
||||||
|
|
||||||
let windows = this._source.app.get_windows();
|
|
||||||
|
|
||||||
// Display the app windows menu items and the separator between windows
|
|
||||||
// of the current desktop and other windows.
|
|
||||||
let activeWorkspace = global.screen.get_active_workspace();
|
|
||||||
let separatorShown = windows.length > 0 && windows[0].get_workspace() != activeWorkspace;
|
|
||||||
|
|
||||||
for (let i = 0; i < windows.length; i++) {
|
|
||||||
if (!separatorShown && windows[i].get_workspace() != activeWorkspace) {
|
|
||||||
this._appendSeparator();
|
|
||||||
separatorShown = true;
|
|
||||||
}
|
|
||||||
let item = this._appendMenuItem(windows[i].title);
|
|
||||||
item._window = windows[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (windows.length > 0)
|
|
||||||
this._appendSeparator();
|
|
||||||
|
|
||||||
let isFavorite = AppFavorites.getAppFavorites().isFavorite(this._source.app.get_id());
|
|
||||||
|
|
||||||
this._newWindowMenuItem = windows.length > 0 ? this._appendMenuItem(_("New Window")) : null;
|
|
||||||
|
|
||||||
this._quitAppMenuItem = windows.length >0 ? this._appendMenuItem(_("Quit Application")) : null;
|
|
||||||
|
|
||||||
if (windows.length > 0)
|
|
||||||
this._appendSeparator();
|
|
||||||
this._toggleFavoriteMenuItem = this._appendMenuItem(isFavorite ?
|
|
||||||
_("Remove from Favorites")
|
|
||||||
: _("Add to Favorites"));
|
|
||||||
|
|
||||||
this._highlightedItem = null;
|
|
||||||
},
|
|
||||||
|
|
||||||
_appendSeparator: function () {
|
|
||||||
let separator = new PopupMenu.PopupSeparatorMenuItem();
|
|
||||||
this.addMenuItem(separator);
|
|
||||||
},
|
|
||||||
|
|
||||||
_appendMenuItem: function(labelText) {
|
|
||||||
// FIXME: app-well-menu-item style
|
|
||||||
let item = new PopupMenu.PopupMenuItem(labelText);
|
|
||||||
this.addMenuItem(item);
|
|
||||||
return item;
|
|
||||||
},
|
|
||||||
|
|
||||||
popup: function(activatingButton) {
|
|
||||||
this._redisplay();
|
|
||||||
this.open();
|
|
||||||
},
|
|
||||||
|
|
||||||
_onActivate: function (actor, child) {
|
|
||||||
if (child._window) {
|
|
||||||
let metaWindow = child._window;
|
|
||||||
this.emit('activate-window', metaWindow);
|
|
||||||
} else if (child == this._newWindowMenuItem) {
|
|
||||||
let current_workspace = global.screen.get_active_workspace().index();
|
|
||||||
this._source.app.open_new_window(current_workspace);
|
|
||||||
this.emit('activate-window', null);
|
|
||||||
} else if (child == this._quitAppMenuItem) {
|
|
||||||
this._source.app.request_quit();
|
|
||||||
} else if (child == this._toggleFavoriteMenuItem) {
|
|
||||||
let favs = AppFavorites.getAppFavorites();
|
|
||||||
let isFavorite = favs.isFavorite(this._source.app.get_id());
|
|
||||||
if (isFavorite)
|
|
||||||
favs.removeFavorite(this._source.app.get_id());
|
|
||||||
else
|
|
||||||
favs.addFavorite(this._source.app.get_id());
|
|
||||||
}
|
|
||||||
this.close();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
function init() {
|
|
||||||
Convenience.initTranslations();
|
|
||||||
}
|
|
||||||
|
|
||||||
let dock;
|
|
||||||
|
|
||||||
function enable() {
|
|
||||||
dock = new Dock();
|
|
||||||
}
|
|
||||||
|
|
||||||
function disable() {
|
|
||||||
dock.destroy();
|
|
||||||
dock = null;
|
|
||||||
}
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
<schemalist gettext-domain="gnome-shell-extensions">
|
|
||||||
<enum id='org.gnome.shell.extensions.dock.PositionMode'>
|
|
||||||
<value nick='left' value='0'/>
|
|
||||||
<value nick='right' value='1'/>
|
|
||||||
</enum>
|
|
||||||
<enum id='org.gnome.shell.extensions.dock.AutoHideEffect'>
|
|
||||||
<value nick='resize' value='0'/>
|
|
||||||
<value nick='rescale' value='1'/>
|
|
||||||
<value nick='move' value='2'/>
|
|
||||||
</enum>
|
|
||||||
|
|
||||||
<schema id="org.gnome.shell.extensions.dock" path="/org/gnome/shell/extensions/dock/">
|
|
||||||
<key name="position" enum="org.gnome.shell.extensions.dock.PositionMode">
|
|
||||||
<default>'right'</default>
|
|
||||||
<_summary>Position of the dock</_summary>
|
|
||||||
<_description>Sets the position of the dock in the screen. Allowed values are 'right' or 'left'</_description>
|
|
||||||
</key>
|
|
||||||
<key name="size" type="i">
|
|
||||||
<default>48</default>
|
|
||||||
<_summary>Icon size</_summary>
|
|
||||||
<_description>Sets icon size of the dock.</_description>
|
|
||||||
</key>
|
|
||||||
<key name="autohide" type="b">
|
|
||||||
<default>true</default>
|
|
||||||
<_summary>Enable/disable autohide</_summary>
|
|
||||||
</key>
|
|
||||||
<key name="hide-effect" enum="org.gnome.shell.extensions.dock.AutoHideEffect">
|
|
||||||
<default>'move'</default>
|
|
||||||
<_summary>Autohide effect</_summary>
|
|
||||||
<_description>Sets the effect of the hide dock. Allowed values are 'resize', 'rescale' and 'move'</_description>
|
|
||||||
</key>
|
|
||||||
<key name="hide-effect-duration" type="d">
|
|
||||||
<default>0.3</default>
|
|
||||||
<_summary>Autohide duration</_summary>
|
|
||||||
<_description>Sets the time duration of the autohide effect.</_description>
|
|
||||||
</key>
|
|
||||||
<key name="monitor" type="i">
|
|
||||||
<default>-1</default>
|
|
||||||
<_summary>Monitor</_summary>
|
|
||||||
<_description>Sets monitor to display dock in. The default value (-1) is the primary monitor.</_description>
|
|
||||||
</key>
|
|
||||||
</schema>
|
|
||||||
</schemalist>
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
#dock {
|
|
||||||
border-radius: 9px;
|
|
||||||
background-color: rgba(0,0,0,0.9);
|
|
||||||
border-width: 2px;
|
|
||||||
border-color: #5f5f5f;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dock-menu {
|
|
||||||
font-size: 12px
|
|
||||||
}
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
EXTENSION_ID = drive-menu
|
|
||||||
|
|
||||||
include ../../extension.mk
|
|
||||||
@@ -1,107 +1,202 @@
|
|||||||
|
/* exported init enable disable */
|
||||||
// Drive menu extension
|
// Drive menu extension
|
||||||
const Gio = imports.gi.Gio;
|
const { Gio, GObject, Shell, St } = imports.gi;
|
||||||
const Lang = imports.lang;
|
|
||||||
const St = imports.gi.St;
|
|
||||||
const Shell = imports.gi.Shell;
|
|
||||||
|
|
||||||
const Gettext = imports.gettext.domain('gnome-shell-extensions');
|
const Gettext = imports.gettext.domain('gnome-shell-extensions');
|
||||||
const _ = Gettext.gettext;
|
const _ = Gettext.gettext;
|
||||||
|
|
||||||
|
const ExtensionUtils = imports.misc.extensionUtils;
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const Panel = imports.ui.panel;
|
|
||||||
const PanelMenu = imports.ui.panelMenu;
|
const PanelMenu = imports.ui.panelMenu;
|
||||||
const PopupMenu = imports.ui.popupMenu;
|
const PopupMenu = imports.ui.popupMenu;
|
||||||
const PlaceDisplay = imports.ui.placeDisplay;
|
const ShellMountOperation = imports.ui.shellMountOperation;
|
||||||
|
|
||||||
const ExtensionUtils = imports.misc.extensionUtils;
|
var MountMenuItem = GObject.registerClass(
|
||||||
const Me = ExtensionUtils.getCurrentExtension();
|
class MountMenuItem extends PopupMenu.PopupBaseMenuItem {
|
||||||
const Convenience = Me.imports.convenience;
|
_init(mount) {
|
||||||
|
super._init();
|
||||||
|
|
||||||
const DriveMenuItem = new Lang.Class({
|
this.label = new St.Label({ text: mount.get_name() });
|
||||||
Name: 'DriveMenu.DriveMenuItem',
|
this.add_child(this.label);
|
||||||
Extends: PopupMenu.PopupBaseMenuItem,
|
this.label_actor = this.label;
|
||||||
|
|
||||||
_init: function(place) {
|
this.mount = mount;
|
||||||
this.parent();
|
|
||||||
|
|
||||||
this.place = place;
|
this.connect('destroy', this._onDestroy.bind(this));
|
||||||
|
|
||||||
this.label = new St.Label({ text: place.name });
|
let ejectIcon = new St.Icon({
|
||||||
this.addActor(this.label);
|
icon_name: 'media-eject-symbolic',
|
||||||
this.actor.label_actor = this.label;
|
style_class: 'popup-menu-icon',
|
||||||
|
});
|
||||||
|
let ejectButton = new St.Button({ child: ejectIcon });
|
||||||
|
ejectButton.connect('clicked', this._eject.bind(this));
|
||||||
|
this.add(ejectButton);
|
||||||
|
|
||||||
let ejectIcon = new St.Icon({ icon_name: 'media-eject',
|
this._changedId = mount.connect('changed', this._syncVisibility.bind(this));
|
||||||
icon_type: St.IconType.SYMBOLIC,
|
this._syncVisibility();
|
||||||
style_class: 'popup-menu-icon ' });
|
}
|
||||||
let ejectButton = new St.Button({ child: ejectIcon });
|
|
||||||
ejectButton.connect('clicked', Lang.bind(this, this._eject));
|
|
||||||
this.addActor(ejectButton);
|
|
||||||
},
|
|
||||||
|
|
||||||
_eject: function() {
|
_onDestroy() {
|
||||||
this.place.remove();
|
if (this._changedId) {
|
||||||
},
|
this.mount.disconnect(this._changedId);
|
||||||
|
this._changedId = 0;
|
||||||
|
}
|
||||||
|
|
||||||
activate: function(event) {
|
super.destroy();
|
||||||
this.place.launch({ timestamp: event.get_time() });
|
}
|
||||||
|
|
||||||
this.parent(event);
|
_isInteresting() {
|
||||||
|
if (!this.mount.can_eject() && !this.mount.can_unmount())
|
||||||
|
return false;
|
||||||
|
if (this.mount.is_shadowed())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
let volume = this.mount.get_volume();
|
||||||
|
|
||||||
|
if (!volume) {
|
||||||
|
// probably a GDaemonMount, could be network or
|
||||||
|
// local, but we can't tell; assume it's local for now
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return volume.get_identifier('class') !== 'network';
|
||||||
|
}
|
||||||
|
|
||||||
|
_syncVisibility() {
|
||||||
|
this.visible = this._isInteresting();
|
||||||
|
}
|
||||||
|
|
||||||
|
_eject() {
|
||||||
|
let unmountArgs = [
|
||||||
|
Gio.MountUnmountFlags.NONE,
|
||||||
|
new ShellMountOperation.ShellMountOperation(this.mount).mountOp,
|
||||||
|
null, // Gio.Cancellable
|
||||||
|
];
|
||||||
|
|
||||||
|
if (this.mount.can_eject()) {
|
||||||
|
this.mount.eject_with_operation(...unmountArgs,
|
||||||
|
this._ejectFinish.bind(this));
|
||||||
|
} else {
|
||||||
|
this.mount.unmount_with_operation(...unmountArgs,
|
||||||
|
this._unmountFinish.bind(this));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_unmountFinish(mount, result) {
|
||||||
|
try {
|
||||||
|
mount.unmount_with_operation_finish(result);
|
||||||
|
} catch (e) {
|
||||||
|
this._reportFailure(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_ejectFinish(mount, result) {
|
||||||
|
try {
|
||||||
|
mount.eject_with_operation_finish(result);
|
||||||
|
} catch (e) {
|
||||||
|
this._reportFailure(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_reportFailure(exception) {
|
||||||
|
// TRANSLATORS: %s is the filesystem name
|
||||||
|
let msg = _('Ejecting drive “%s” failed:').format(this.mount.get_name());
|
||||||
|
Main.notifyError(msg, exception.message);
|
||||||
|
}
|
||||||
|
|
||||||
|
activate(event) {
|
||||||
|
let uri = this.mount.get_root().get_uri();
|
||||||
|
let context = global.create_app_launch_context(event.get_time(), -1);
|
||||||
|
Gio.AppInfo.launch_default_for_uri(uri, context);
|
||||||
|
|
||||||
|
super.activate(event);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const DriveMenu = new Lang.Class({
|
let DriveMenu = GObject.registerClass(
|
||||||
Name: 'DriveMenu.DriveMenu',
|
class DriveMenu extends PanelMenu.Button {
|
||||||
Extends: PanelMenu.SystemStatusButton,
|
_init() {
|
||||||
|
super._init(0.0, _('Removable devices'));
|
||||||
|
|
||||||
_init: function() {
|
let hbox = new St.BoxLayout({ style_class: 'panel-status-menu-box' });
|
||||||
this.parent('media-eject', _("Removable devices"));
|
let icon = new St.Icon({
|
||||||
|
icon_name: 'media-eject-symbolic',
|
||||||
|
style_class: 'system-status-icon',
|
||||||
|
});
|
||||||
|
|
||||||
this._manager = new PlaceDisplay.PlacesManager();
|
hbox.add_child(icon);
|
||||||
this._updatedId = this._manager.connect('mounts-updated', Lang.bind(this, this._update));
|
hbox.add_child(PopupMenu.arrowIcon(St.Side.BOTTOM));
|
||||||
|
this.add_child(hbox);
|
||||||
|
|
||||||
this._contentSection = new PopupMenu.PopupMenuSection();
|
this._monitor = Gio.VolumeMonitor.get();
|
||||||
this.menu.addMenuItem(this._contentSection);
|
this._addedId = this._monitor.connect('mount-added', (monitor, mount) => {
|
||||||
|
this._addMount(mount);
|
||||||
|
this._updateMenuVisibility();
|
||||||
|
});
|
||||||
|
this._removedId = this._monitor.connect('mount-removed', (monitor, mount) => {
|
||||||
|
this._removeMount(mount);
|
||||||
|
this._updateMenuVisibility();
|
||||||
|
});
|
||||||
|
|
||||||
this._update();
|
this._mounts = [];
|
||||||
|
|
||||||
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
this._monitor.get_mounts().forEach(this._addMount.bind(this));
|
||||||
this.menu.addAction(_("Open file manager"), function(event) {
|
|
||||||
let appSystem = Shell.AppSystem.get_default();
|
|
||||||
let app = appSystem.lookup_app('nautilus.desktop');
|
|
||||||
app.activate_full(-1, event.get_time());
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
_update: function() {
|
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
||||||
this._contentSection.removeAll();
|
this.menu.addAction(_('Open Files'), event => {
|
||||||
|
let appSystem = Shell.AppSystem.get_default();
|
||||||
|
let app = appSystem.lookup_app('org.gnome.Nautilus.desktop');
|
||||||
|
app.activate_full(-1, event.get_time());
|
||||||
|
});
|
||||||
|
|
||||||
let mounts = this._manager.getMounts();
|
this._updateMenuVisibility();
|
||||||
let any = false;
|
}
|
||||||
for (let i = 0; i < mounts.length; i++) {
|
|
||||||
if (mounts[i].isRemovable()) {
|
|
||||||
this._contentSection.addMenuItem(new DriveMenuItem(mounts[i]));
|
|
||||||
any = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this.actor.visible = any;
|
_updateMenuVisibility() {
|
||||||
},
|
if (this._mounts.filter(i => i.visible).length > 0)
|
||||||
|
this.show();
|
||||||
|
else
|
||||||
|
this.hide();
|
||||||
|
}
|
||||||
|
|
||||||
destroy: function() {
|
_addMount(mount) {
|
||||||
this._manager.disconnect(this._updatedId);
|
let item = new MountMenuItem(mount);
|
||||||
|
this._mounts.unshift(item);
|
||||||
|
this.menu.addMenuItem(item, 0);
|
||||||
|
}
|
||||||
|
|
||||||
this.parent();
|
_removeMount(mount) {
|
||||||
},
|
for (let i = 0; i < this._mounts.length; i++) {
|
||||||
|
let item = this._mounts[i];
|
||||||
|
if (item.mount === mount) {
|
||||||
|
item.destroy();
|
||||||
|
this._mounts.splice(i, 1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
log('Removing a mount that was never added to the menu');
|
||||||
|
}
|
||||||
|
|
||||||
|
_onDestroy() {
|
||||||
|
if (this._addedId) {
|
||||||
|
this._monitor.disconnect(this._addedId);
|
||||||
|
this._monitor.disconnect(this._removedId);
|
||||||
|
this._addedId = 0;
|
||||||
|
this._removedId = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
super._onDestroy();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
function init() {
|
function init() {
|
||||||
Convenience.initTranslations();
|
ExtensionUtils.initTranslations();
|
||||||
}
|
}
|
||||||
|
|
||||||
let _indicator;
|
let _indicator;
|
||||||
|
|
||||||
function enable() {
|
function enable() {
|
||||||
_indicator = new DriveMenu;
|
_indicator = new DriveMenu();
|
||||||
Main.panel.addToStatusArea('drive-menu', _indicator);
|
Main.panel.addToStatusArea('drive-menu', _indicator);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
extension_data += configure_file(
|
||||||
|
input: metadata_name + '.in',
|
||||||
|
output: metadata_name,
|
||||||
|
configuration: metadata_conf
|
||||||
|
)
|
||||||
@@ -4,7 +4,7 @@
|
|||||||
"settings-schema": "@gschemaname@",
|
"settings-schema": "@gschemaname@",
|
||||||
"gettext-domain": "@gettext_domain@",
|
"gettext-domain": "@gettext_domain@",
|
||||||
"name": "Removable Drive Menu",
|
"name": "Removable Drive Menu",
|
||||||
"description": "A status menu for accessing and unmounting removable devices",
|
"description": "A status menu for accessing and unmounting removable devices.",
|
||||||
"shell-version": [ "@shell_current@" ],
|
"shell-version": [ "@shell_current@" ],
|
||||||
"url": "@url@"
|
"url": "@url@"
|
||||||
}
|
}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user