Compare commits
779 Commits
METACITY_2
...
release-2.
Author | SHA1 | Date | |
---|---|---|---|
![]() |
540fc4b76b | ||
![]() |
f78390b094 | ||
![]() |
0b635aafae | ||
![]() |
8ae90af01f | ||
![]() |
31f48c0cf0 | ||
![]() |
cd0ef08783 | ||
![]() |
4203fd2993 | ||
![]() |
54e56a47da | ||
![]() |
d8a28621cc | ||
![]() |
8216cbc4f6 | ||
![]() |
9a4d1d1375 | ||
![]() |
616e140420 | ||
![]() |
52ea2fd45d | ||
![]() |
050c1e268d | ||
![]() |
7afc4310f6 | ||
![]() |
39a3bb2c7d | ||
![]() |
7eb2843718 | ||
![]() |
91490ed713 | ||
![]() |
081272c5a9 | ||
![]() |
f4bc825cf8 | ||
![]() |
fb1fc4e7c6 | ||
![]() |
ed3d222327 | ||
![]() |
8c0ae7be83 | ||
![]() |
5780ffad12 | ||
![]() |
770a6f0138 | ||
![]() |
16d49695ad | ||
![]() |
6893ef034b | ||
![]() |
9b5d91e33b | ||
![]() |
c7686b2977 | ||
![]() |
3e754a6f35 | ||
![]() |
63744a3dd7 | ||
![]() |
e5db44ca90 | ||
![]() |
032cbe0dd5 | ||
![]() |
7d34a10e4a | ||
![]() |
62f1fc62a7 | ||
![]() |
c26cb4d2be | ||
![]() |
a203fb1037 | ||
![]() |
adeec009e7 | ||
![]() |
8e6c0bec78 | ||
![]() |
69ae9e4a9d | ||
![]() |
1381f6d5f2 | ||
![]() |
a6c951352f | ||
![]() |
0a172cc053 | ||
![]() |
f5fa4a3866 | ||
![]() |
8cbcbb0655 | ||
![]() |
35d9d2864f | ||
![]() |
bb5c0d0c34 | ||
![]() |
226cdc9645 | ||
![]() |
1b35154e2b | ||
![]() |
7c69ab987a | ||
![]() |
ba03230e72 | ||
![]() |
77cb0db9c2 | ||
![]() |
ad080410a3 | ||
![]() |
dab72c3efa | ||
![]() |
32f882093b | ||
![]() |
6ac54641c6 | ||
![]() |
1d38209520 | ||
![]() |
c1f3a5c67d | ||
![]() |
6e543fbcfd | ||
![]() |
9dee164790 | ||
![]() |
b0cc2a8614 | ||
![]() |
f4ecc9bab8 | ||
![]() |
c3884e9900 | ||
![]() |
39c88facc5 | ||
![]() |
1dce6b5fa3 | ||
![]() |
6b1aa3cf04 | ||
![]() |
2e1893f7d3 | ||
![]() |
d1fd844bc4 | ||
![]() |
db273ce50c | ||
![]() |
2338611046 | ||
![]() |
7d3a05f2d1 | ||
![]() |
a02e0b3c98 | ||
![]() |
952d63a127 | ||
![]() |
23bed522ab | ||
![]() |
813acae961 | ||
![]() |
352e2c02dc | ||
![]() |
9ebb135ccb | ||
![]() |
a96939be0f | ||
![]() |
cb3870f9f6 | ||
![]() |
25d628aea2 | ||
![]() |
aad8eb1999 | ||
![]() |
fc6b78a20c | ||
![]() |
4b3a8fefb6 | ||
![]() |
ec0562550a | ||
![]() |
73e14e0bb1 | ||
![]() |
822e125492 | ||
![]() |
b47cd6a3bc | ||
![]() |
95fa3a3879 | ||
![]() |
0b978e61aa | ||
![]() |
d6b974ba15 | ||
![]() |
ec09ac49f6 | ||
![]() |
ee738f1d6f | ||
![]() |
17c10f60d9 | ||
![]() |
24823e19e0 | ||
![]() |
c8e967ba1c | ||
![]() |
f7aa5f8653 | ||
![]() |
6da5a5abcb | ||
![]() |
0fdb644454 | ||
![]() |
f6a3ba26f9 | ||
![]() |
d1920788ac | ||
![]() |
fc1ff18ca7 | ||
![]() |
5f9a4ab8cc | ||
![]() |
920a847508 | ||
![]() |
1e17ba1768 | ||
![]() |
e17377d407 | ||
![]() |
b47459af58 | ||
![]() |
986bdac451 | ||
![]() |
b5b37d72a3 | ||
![]() |
096e3dee8f | ||
![]() |
e25282088b | ||
![]() |
da36829f96 | ||
![]() |
ff5055834b | ||
![]() |
b41abfd1f8 | ||
![]() |
e1cc242b52 | ||
![]() |
4589d1246d | ||
![]() |
66a5edd31a | ||
![]() |
57dec338ba | ||
![]() |
9ecc00a33b | ||
![]() |
ae6032e58e | ||
![]() |
c4d7e0568f | ||
![]() |
c311e96b63 | ||
![]() |
b66fbc0369 | ||
![]() |
151ddc08ec | ||
![]() |
b81c7c48d5 | ||
![]() |
e11100e584 | ||
![]() |
01027006a7 | ||
![]() |
38faa8fe10 | ||
![]() |
9abdc6c0fa | ||
![]() |
34b483ed75 | ||
![]() |
c48c5e44bd | ||
![]() |
b943a74476 | ||
![]() |
13badba158 | ||
![]() |
e1e5cc8f42 | ||
![]() |
6e1ed9ad55 | ||
![]() |
dd2370d9dd | ||
![]() |
45f2ec5f64 | ||
![]() |
e7a69b6a13 | ||
![]() |
10b12f24f0 | ||
![]() |
3b1e91342e | ||
![]() |
e7cef5bbcb | ||
![]() |
6ddec0d855 | ||
![]() |
c0d90e5b76 | ||
![]() |
6c22a997e6 | ||
![]() |
945c9cb8e0 | ||
![]() |
cf2206352f | ||
![]() |
4c5f125a6a | ||
![]() |
1fd45f10a2 | ||
![]() |
3592f8e92e | ||
![]() |
036fe284c2 | ||
![]() |
a1cc5fea1f | ||
![]() |
9442d21f44 | ||
![]() |
a0cd86d2ac | ||
![]() |
157aa0af6d | ||
![]() |
88cd978837 | ||
![]() |
e146c24483 | ||
![]() |
41b6f0803e | ||
![]() |
68ac59ff6d | ||
![]() |
c2abbce2ed | ||
![]() |
38cd6a6c1f | ||
![]() |
ac365b4ead | ||
![]() |
e083742426 | ||
![]() |
e5fc168a46 | ||
![]() |
be7067bc0a | ||
![]() |
1ba3b3dd7d | ||
![]() |
a06d96316e | ||
![]() |
6e8c233d6a | ||
![]() |
c627368ea1 | ||
![]() |
8524f510c6 | ||
![]() |
39e389cc5b | ||
![]() |
d079ef538c | ||
![]() |
203046237c | ||
![]() |
7a5606d241 | ||
![]() |
c4768a3b9f | ||
![]() |
af8d281556 | ||
![]() |
0f73a011ce | ||
![]() |
53cea00323 | ||
![]() |
b7466365a1 | ||
![]() |
3b3226b678 | ||
![]() |
ab2e925b65 | ||
![]() |
0214ece238 | ||
![]() |
a6d04255a8 | ||
![]() |
9821453b5f | ||
![]() |
c61eb77a70 | ||
![]() |
57a2d20d61 | ||
![]() |
8c3bcc7229 | ||
![]() |
f956853550 | ||
![]() |
6849735e9d | ||
![]() |
06817df975 | ||
![]() |
98ccfea388 | ||
![]() |
9a1be03205 | ||
![]() |
026008a700 | ||
![]() |
b26fc771b1 | ||
![]() |
04619df818 | ||
![]() |
c1928ead7c | ||
![]() |
b43f9aec5a | ||
![]() |
79d749fc82 | ||
![]() |
bcc5f104db | ||
![]() |
99f6b2cdce | ||
![]() |
75d3845801 | ||
![]() |
c8e0acfef3 | ||
![]() |
da55d8e738 | ||
![]() |
40c25dc426 | ||
![]() |
f3a8b2f12e | ||
![]() |
dcd350dd90 | ||
![]() |
f826fb1d9a | ||
![]() |
123f4df31b | ||
![]() |
3211fb04d3 | ||
![]() |
17e12ccb6d | ||
![]() |
6eab4fb9e8 | ||
![]() |
8f8097aa2c | ||
![]() |
7a190f33f6 | ||
![]() |
7ec7a8fa44 | ||
![]() |
93b945ea42 | ||
![]() |
0058271aaa | ||
![]() |
cfa45beee1 | ||
![]() |
51468bfb56 | ||
![]() |
f7b0c532aa | ||
![]() |
20ce1e77d9 | ||
![]() |
368346571a | ||
![]() |
7ea4380725 | ||
![]() |
15daecacdc | ||
![]() |
1b943f8191 | ||
![]() |
6d8baea4c2 | ||
![]() |
4c9bfecac5 | ||
![]() |
6683b5efff | ||
![]() |
783e51281a | ||
![]() |
5dc36e1201 | ||
![]() |
6a86912554 | ||
![]() |
7405f040e8 | ||
![]() |
5ed940e101 | ||
![]() |
11f18a25c2 | ||
![]() |
d819b99d99 | ||
![]() |
b5ac24e9c1 | ||
![]() |
d1635d13cb | ||
![]() |
f80e39e2ca | ||
![]() |
a7a0a0300f | ||
![]() |
685bbb2e64 | ||
![]() |
e85f67f564 | ||
![]() |
a2b47741ae | ||
![]() |
eeb762e1e2 | ||
![]() |
6c5fc6b3d6 | ||
![]() |
3991e82539 | ||
![]() |
312cbf3e04 | ||
![]() |
ce2bfc008d | ||
![]() |
b2fe0097e6 | ||
![]() |
e4501f801e | ||
![]() |
7bef175590 | ||
![]() |
a4a102726e | ||
![]() |
a42ea69d0e | ||
![]() |
8f594c93cd | ||
![]() |
8f8a193c7e | ||
![]() |
c283fbe9b3 | ||
![]() |
53d89a7fd5 | ||
![]() |
68c2f75558 | ||
![]() |
2a3445c865 | ||
![]() |
10f9a7f252 | ||
![]() |
b1c5a2e221 | ||
![]() |
1d6e70a49d | ||
![]() |
310970a91b | ||
![]() |
07c1003905 | ||
![]() |
273d213509 | ||
![]() |
8201b0361a | ||
![]() |
f97f20e3b0 | ||
![]() |
fc4ef3417f | ||
![]() |
4d441a6f7b | ||
![]() |
c1348f0322 | ||
![]() |
647f75c4e8 | ||
![]() |
348795b94d | ||
![]() |
bb539466d5 | ||
![]() |
ab9bdf228b | ||
![]() |
c91475f20f | ||
![]() |
445b6ae6ed | ||
![]() |
2e9857b560 | ||
![]() |
3cc7b2c74d | ||
![]() |
275cccb136 | ||
![]() |
8c1a5c6a11 | ||
![]() |
7a9da7eb69 | ||
![]() |
788cbc91b2 | ||
![]() |
9cb0b6ff52 | ||
![]() |
22d5f3fa57 | ||
![]() |
627dcede64 | ||
![]() |
fbefdce4c1 | ||
![]() |
77785ac321 | ||
![]() |
922b490499 | ||
![]() |
ee49194cf5 | ||
![]() |
f2bf9703db | ||
![]() |
1866268c94 | ||
![]() |
b7ee7bdd9b | ||
![]() |
ba3cf5dfad | ||
![]() |
f186d90dd3 | ||
![]() |
671b69a251 | ||
![]() |
fd01dbaaea | ||
![]() |
be11a6bf72 | ||
![]() |
4854710de2 | ||
![]() |
0684ef95c5 | ||
![]() |
775cb1f4a4 | ||
![]() |
73f90dfd69 | ||
![]() |
8a0ffa93eb | ||
![]() |
7ddb3a4663 | ||
![]() |
493408167b | ||
![]() |
a8f1a61242 | ||
![]() |
4c3a5883d7 | ||
![]() |
9a66ce6b01 | ||
![]() |
08c3c187eb | ||
![]() |
b422faa4fe | ||
![]() |
a8dd848ca4 | ||
![]() |
143cb3d60b | ||
![]() |
92610f53c3 | ||
![]() |
6904b7a5d7 | ||
![]() |
30ece059cf | ||
![]() |
1e59d63e31 | ||
![]() |
7380163eaf | ||
![]() |
dc33ad1adf | ||
![]() |
b5414c27a3 | ||
![]() |
2f790b0165 | ||
![]() |
d185a84140 | ||
![]() |
749698eb54 | ||
![]() |
6323467879 | ||
![]() |
d94a34a2c1 | ||
![]() |
9005e4a68f | ||
![]() |
9e4f5a26dd | ||
![]() |
ae906b318a | ||
![]() |
8d373e009d | ||
![]() |
7d67a9aee9 | ||
![]() |
f0364b2eed | ||
![]() |
5af56eebd1 | ||
![]() |
5f3e27bbd7 | ||
![]() |
b1b8d51264 | ||
![]() |
3ee8a903e8 | ||
![]() |
f6c958ff26 | ||
![]() |
27fac47e76 | ||
![]() |
6144787b3e | ||
![]() |
c1e7ead397 | ||
![]() |
c4fe54d004 | ||
![]() |
48f1dd5a7e | ||
![]() |
ff0fa107a4 | ||
![]() |
acd81439eb | ||
![]() |
b625ed254d | ||
![]() |
334370f5d1 | ||
![]() |
66c031315d | ||
![]() |
74b34fe239 | ||
![]() |
7124a7acc1 | ||
![]() |
2fffd6fe9f | ||
![]() |
6b1719de1c | ||
![]() |
0225449e12 | ||
![]() |
1a8e5872d1 | ||
![]() |
0e6fba083f | ||
![]() |
1178800abb | ||
![]() |
f061a6d793 | ||
![]() |
976635a22b | ||
![]() |
69c0da91e5 | ||
![]() |
306a7497fc | ||
![]() |
1addb6ddc1 | ||
![]() |
0a7fc94799 | ||
![]() |
cca5e69c64 | ||
![]() |
bbdd7d9b15 | ||
![]() |
60695fd89a | ||
![]() |
c5d59254af | ||
![]() |
2bcd7c839b | ||
![]() |
cc50d99712 | ||
![]() |
93c316f3b8 | ||
![]() |
7983c29f67 | ||
![]() |
22f386b35b | ||
![]() |
d6e4fc41c2 | ||
![]() |
f65d898f80 | ||
![]() |
a49f986c67 | ||
![]() |
b1fb765d8e | ||
![]() |
9e72d661d6 | ||
![]() |
03ccf99dbb | ||
![]() |
f67f9bbf23 | ||
![]() |
85e67d1d49 | ||
![]() |
735877d89a | ||
![]() |
ee60128334 | ||
![]() |
3bbd5e32f2 | ||
![]() |
c2403a0c62 | ||
![]() |
839082aae8 | ||
![]() |
98753ed946 | ||
![]() |
0ee05e6617 | ||
![]() |
2d4a0c9cbe | ||
![]() |
43e3fbc518 | ||
![]() |
c58ade6600 | ||
![]() |
33ae559eca | ||
![]() |
4f1fd37231 | ||
![]() |
6654cb65d7 | ||
![]() |
19d338cb50 | ||
![]() |
0bbe8b8004 | ||
![]() |
99d3cc1b2b | ||
![]() |
c5d86fae01 | ||
![]() |
d6f340eb96 | ||
![]() |
bd3d643f96 | ||
![]() |
7bd5f61db7 | ||
![]() |
0037a5fccc | ||
![]() |
1ea071fc18 | ||
![]() |
bc1e74153c | ||
![]() |
65a10829fd | ||
![]() |
0c0e102023 | ||
![]() |
914c93ae0d | ||
![]() |
a1c3a05b43 | ||
![]() |
f53e03f0a2 | ||
![]() |
5e76e1b221 | ||
![]() |
9b3a0d1ad8 | ||
![]() |
d509097967 | ||
![]() |
b7bdc5ec69 | ||
![]() |
0e8c8ba825 | ||
![]() |
f19aff7818 | ||
![]() |
52d14ee16d | ||
![]() |
4774a798a7 | ||
![]() |
28793c9f81 | ||
![]() |
3109a67a71 | ||
![]() |
d4662bb6a2 | ||
![]() |
13a8cdcbb3 | ||
![]() |
d2a4800e75 | ||
![]() |
ba19215cd4 | ||
![]() |
cf48407972 | ||
![]() |
f227fc4872 | ||
![]() |
0407545283 | ||
![]() |
438ac55cb1 | ||
![]() |
0fd855f492 | ||
![]() |
177202e2d1 | ||
![]() |
18d9d15a1a | ||
![]() |
49cc773eb4 | ||
![]() |
8bd3cdff14 | ||
![]() |
2095cce3ab | ||
![]() |
5128bd4f28 | ||
![]() |
9c82331009 | ||
![]() |
347cfab7dd | ||
![]() |
dbfc9d25f6 | ||
![]() |
28cf8cc407 | ||
![]() |
b3283ce82b | ||
![]() |
6946d6a4a3 | ||
![]() |
2bcb7d73be | ||
![]() |
655bfaec80 | ||
![]() |
a3f56bb289 | ||
![]() |
b48f9ca907 | ||
![]() |
8589eab403 | ||
![]() |
1ee1842638 | ||
![]() |
70afce0325 | ||
![]() |
1f29679c0d | ||
![]() |
99b547bc1d | ||
![]() |
030afac8ab | ||
![]() |
121a65e4f4 | ||
![]() |
a8bcfb9a0c | ||
![]() |
9f9df52ba6 | ||
![]() |
676a516ff2 | ||
![]() |
b238584c1e | ||
![]() |
129fde88fa | ||
![]() |
4134949d72 | ||
![]() |
e6e6aecb93 | ||
![]() |
13f3cb0b9a | ||
![]() |
f7f696c310 | ||
![]() |
2154d9e920 | ||
![]() |
5ebaa15333 | ||
![]() |
8736f61579 | ||
![]() |
e1965914a3 | ||
![]() |
233237f098 | ||
![]() |
4fb40b57a9 | ||
![]() |
6e4c88ad93 | ||
![]() |
5631cbe22d | ||
![]() |
92fe1574ec | ||
![]() |
b4534658f3 | ||
![]() |
3cd7574749 | ||
![]() |
203b701d78 | ||
![]() |
14f8e1c553 | ||
![]() |
e6c16a77f1 | ||
![]() |
6f9048d69c | ||
![]() |
416bc2432c | ||
![]() |
51de9ef860 | ||
![]() |
af17cddf1c | ||
![]() |
12ae5cc4fe | ||
![]() |
bd00b58949 | ||
![]() |
deaebc5d2e | ||
![]() |
7f6a2ebc76 | ||
![]() |
7d9e4ee37d | ||
![]() |
7adbca2fdb | ||
![]() |
3848fa17e5 | ||
![]() |
f9a0c6d456 | ||
![]() |
7ec8054491 | ||
![]() |
34fe81fabd | ||
![]() |
dacf784498 | ||
![]() |
24e63a0d2d | ||
![]() |
6bf62be4d0 | ||
![]() |
77820c9697 | ||
![]() |
175efedd45 | ||
![]() |
81f8dad99e | ||
![]() |
aa70e34e34 | ||
![]() |
41fca4cf37 | ||
![]() |
0ef47a44c1 | ||
![]() |
91b5f24da8 | ||
![]() |
bd0a531253 | ||
![]() |
7988361eab | ||
![]() |
a1a030e418 | ||
![]() |
c05e6d079c | ||
![]() |
b3549979c6 | ||
![]() |
6039694eff | ||
![]() |
12ffd29542 | ||
![]() |
1aee3eff35 | ||
![]() |
9d31fa61ed | ||
![]() |
377e822c13 | ||
![]() |
c2ff92d3fa | ||
![]() |
ed22f38e7e | ||
![]() |
d341b8ea5e | ||
![]() |
795d2caf8b | ||
![]() |
f6036b9860 | ||
![]() |
82cefd12ad | ||
![]() |
7ab715fa71 | ||
![]() |
163e236cd0 | ||
![]() |
0107da404c | ||
![]() |
c94c482283 | ||
![]() |
09501c9fab | ||
![]() |
941e4bf967 | ||
![]() |
fa2f76d4d4 | ||
![]() |
60d710a71f | ||
![]() |
2c6c5a6dd1 | ||
![]() |
5dbe941495 | ||
![]() |
c29232fd0d | ||
![]() |
8fd2f1d22a | ||
![]() |
e9388f4345 | ||
![]() |
a8c5c002fb | ||
![]() |
327e3cb6b5 | ||
![]() |
0bdfa0f494 | ||
![]() |
c500de4e38 | ||
![]() |
b55dbe10bb | ||
![]() |
01c0a95136 | ||
![]() |
8fea7a4128 | ||
![]() |
4f93a1a273 | ||
![]() |
c5c68fcbe8 | ||
![]() |
0c7be52675 | ||
![]() |
fff75cd9ae | ||
![]() |
76735c18a1 | ||
![]() |
1f435cc1fc | ||
![]() |
a5d2bdea55 | ||
![]() |
565a04793e | ||
![]() |
f167d55625 | ||
![]() |
3405f3d8c8 | ||
![]() |
f141692ca2 | ||
![]() |
fe292078fe | ||
![]() |
224040cd1a | ||
![]() |
4026ea7b42 | ||
![]() |
53b9e49ca4 | ||
![]() |
8547d1e8ed | ||
![]() |
b095ecc195 | ||
![]() |
3bbf402684 | ||
![]() |
f8ff76efdd | ||
![]() |
3673472cd7 | ||
![]() |
b455ac62d2 | ||
![]() |
4916fedc28 | ||
![]() |
81eeb9c0d5 | ||
![]() |
2d895ce875 | ||
![]() |
eacd442787 | ||
![]() |
b8a9ed1d3a | ||
![]() |
117f0e5663 | ||
![]() |
f13a8e6ab9 | ||
![]() |
fa1195b7f1 | ||
![]() |
3d9f2868fc | ||
![]() |
17bf5ea13a | ||
![]() |
8d3432b8b7 | ||
![]() |
3fcbbfbbd2 | ||
![]() |
2caa49bca8 | ||
![]() |
a8912c4fb9 | ||
![]() |
7f8ad91af6 | ||
![]() |
53a7cbe6af | ||
![]() |
b9c6ba8536 | ||
![]() |
4e653cc49f | ||
![]() |
c17d58237e | ||
![]() |
48261330de | ||
![]() |
300be6e03b | ||
![]() |
0c83442709 | ||
![]() |
d372cf598a | ||
![]() |
5fa7c76ba0 | ||
![]() |
77644a32d7 | ||
![]() |
fb588c6075 | ||
![]() |
6a586e8929 | ||
![]() |
58ef1592a5 | ||
![]() |
9730f15411 | ||
![]() |
f3e64f181d | ||
![]() |
0130c0d5b6 | ||
![]() |
1e325bcbdf | ||
![]() |
941a9a9a7f | ||
![]() |
38b4f08b2b | ||
![]() |
fe1ea6ac34 | ||
![]() |
932fb56ea9 | ||
![]() |
18dfce2873 | ||
![]() |
915192ca9f | ||
![]() |
f2b400b82c | ||
![]() |
e629364582 | ||
![]() |
3299427097 | ||
![]() |
7d239b0d45 | ||
![]() |
9836007f5e | ||
![]() |
87cceaf992 | ||
![]() |
f77dba7ac2 | ||
![]() |
d19de0c1ee | ||
![]() |
142b64fff9 | ||
![]() |
a9b20427a5 | ||
![]() |
0e02cf9b07 | ||
![]() |
5f4c3f817b | ||
![]() |
80e838aed5 | ||
![]() |
b4c369931d | ||
![]() |
1b00ca6158 | ||
![]() |
4b8a05b803 | ||
![]() |
fe816afa1d | ||
![]() |
b93a94506b | ||
![]() |
d1ef896c73 | ||
![]() |
ed5c34d335 | ||
![]() |
429a8ccd15 | ||
![]() |
a8c3d1614f | ||
![]() |
ac10c309ea | ||
![]() |
e021e06178 | ||
![]() |
8c6f3853b0 | ||
![]() |
e7196621bc | ||
![]() |
f8a5ef7c9f | ||
![]() |
85631aec0f | ||
![]() |
401b716cf5 | ||
![]() |
3d4adc8be9 | ||
![]() |
210206b699 | ||
![]() |
c0c05d51ea | ||
![]() |
9d9576612b | ||
![]() |
abdb3fd8b9 | ||
![]() |
b3f766c618 | ||
![]() |
41e93f71be | ||
![]() |
79076b2997 | ||
![]() |
3684bd2da4 | ||
![]() |
d0e22bf63d | ||
![]() |
8450d97341 | ||
![]() |
3043d2a2be | ||
![]() |
3ca31c7b04 | ||
![]() |
8802ac2fe9 | ||
![]() |
61c7487172 | ||
![]() |
3782c482ef | ||
![]() |
8c487ddbb2 | ||
![]() |
07939f235f | ||
![]() |
abfccf5002 | ||
![]() |
df83c15583 | ||
![]() |
83010879f1 | ||
![]() |
c35fd86b3b | ||
![]() |
932fd0dcff | ||
![]() |
2a53302ab9 | ||
![]() |
44a4c1c9fb | ||
![]() |
04956ecf18 | ||
![]() |
2d41d65cf2 | ||
![]() |
7e41ffdda5 | ||
![]() |
54c15a2583 | ||
![]() |
8aae0a7723 | ||
![]() |
f23d8a3774 | ||
![]() |
aad6f37f8a | ||
![]() |
404a61b571 | ||
![]() |
0312a3e474 | ||
![]() |
c25a5c99ec | ||
![]() |
ac5759af24 | ||
![]() |
9bee48dcd2 | ||
![]() |
73d9143d76 | ||
![]() |
230d78d8b4 | ||
![]() |
fbc3563b21 | ||
![]() |
4c8557055c | ||
![]() |
2f43d436c8 | ||
![]() |
a9a69ac807 | ||
![]() |
8e7fe42b5e | ||
![]() |
d70219b88d | ||
![]() |
806fa75a70 | ||
![]() |
1177b13338 | ||
![]() |
ea2d79fbfb | ||
![]() |
f60624ac5b | ||
![]() |
836a1f7b08 | ||
![]() |
a660fd3805 | ||
![]() |
d5cea091bf | ||
![]() |
0bd1727eab | ||
![]() |
8bd2822e69 | ||
![]() |
7a340792c9 | ||
![]() |
8e77d5b28d | ||
![]() |
8e79100b92 | ||
![]() |
18b63e9b5f | ||
![]() |
48b6e8dd67 | ||
![]() |
fb872b8f1e | ||
![]() |
94be13a003 | ||
![]() |
ea1c807d69 | ||
![]() |
1df98bd6a4 | ||
![]() |
6c192b67a9 | ||
![]() |
4a792d207c | ||
![]() |
1daf7543eb | ||
![]() |
b4890a3d22 | ||
![]() |
7b031a1c28 | ||
![]() |
ca098b2416 | ||
![]() |
cb5134de8d | ||
![]() |
e5009396f8 | ||
![]() |
53a116333c | ||
![]() |
13918cea25 | ||
![]() |
03f14bd5dd | ||
![]() |
8828532d14 | ||
![]() |
146ad60c7f | ||
![]() |
6da40d919b | ||
![]() |
a4d657a324 | ||
![]() |
4419430a57 | ||
![]() |
11ba3be6b9 | ||
![]() |
286af99def | ||
![]() |
a409a0a098 | ||
![]() |
ee7cfc8824 | ||
![]() |
af8d3c16bf | ||
![]() |
9d1549e1ff | ||
![]() |
845ecdc3af | ||
![]() |
1c5ef4a50f | ||
![]() |
212a9f26ab | ||
![]() |
e61015cb42 | ||
![]() |
c96ae75437 | ||
![]() |
a8e2f45b1c | ||
![]() |
33383e1f4f | ||
![]() |
b9e1a9159e | ||
![]() |
5dc41f8c94 | ||
![]() |
4aaf053760 | ||
![]() |
b718f79c47 | ||
![]() |
72b08c82b1 | ||
![]() |
3880951458 | ||
![]() |
3229882183 | ||
![]() |
f4cc847f83 | ||
![]() |
a63d5801ae | ||
![]() |
4b774eb18e | ||
![]() |
d052782caf | ||
![]() |
c2a6eeaf5e | ||
![]() |
931d70d87f | ||
![]() |
f28cd718f8 | ||
![]() |
623e4dc05c | ||
![]() |
89e47e2431 | ||
![]() |
83e18f8da4 | ||
![]() |
42951ec68f | ||
![]() |
a99ece5a5e | ||
![]() |
6bb78dcb0b | ||
![]() |
855de7253d | ||
![]() |
e7dc04d28e | ||
![]() |
4564236abf | ||
![]() |
e7758d64d8 | ||
![]() |
71c83da805 | ||
![]() |
2891388813 | ||
![]() |
194c514b45 | ||
![]() |
69255114d9 | ||
![]() |
43f0c34cf8 | ||
![]() |
aa2af695d7 | ||
![]() |
539285ca78 | ||
![]() |
dda8866f30 | ||
![]() |
618115931e | ||
![]() |
20d599819b | ||
![]() |
a8583668eb | ||
![]() |
4b0fd1b7d8 | ||
![]() |
3789229a70 | ||
![]() |
14c046d18d | ||
![]() |
386ffb4752 | ||
![]() |
fa51a94a69 | ||
![]() |
ef3f8c18a1 | ||
![]() |
f4e327f69c | ||
![]() |
b61359506c | ||
![]() |
2a9dc7272b | ||
![]() |
bcc3f56193 | ||
![]() |
6bec74017f | ||
![]() |
618a9f03b3 | ||
![]() |
98886f3d94 | ||
![]() |
7b690d6bc1 | ||
![]() |
67ce5927e1 | ||
![]() |
f29afe115d | ||
![]() |
6fa4345514 | ||
![]() |
d0523744b7 | ||
![]() |
848ccb3249 | ||
![]() |
988e5f49dd | ||
![]() |
118d962b2d | ||
![]() |
1bf37776c3 | ||
![]() |
908715bd84 | ||
![]() |
c241036c06 | ||
![]() |
280a01c5de | ||
![]() |
4ef11cfbd3 | ||
![]() |
8a023b00f2 | ||
![]() |
ab9ff657c7 | ||
![]() |
34cfd6fafd | ||
![]() |
c691288b14 | ||
![]() |
46c9134992 | ||
![]() |
eb3449f5c7 | ||
![]() |
211de6cfac | ||
![]() |
4e2434c082 | ||
![]() |
2d60c6b878 | ||
![]() |
f71386bdb5 | ||
![]() |
4e3a658b8e | ||
![]() |
bf683f6e50 | ||
![]() |
cb8b2fd433 | ||
![]() |
8780fd5e44 |
60
.gitignore
vendored
Normal file
60
.gitignore
vendored
Normal file
@@ -0,0 +1,60 @@
|
||||
Makefile
|
||||
Makefile.in
|
||||
Makefile.in.in
|
||||
aclocal.m4
|
||||
autom4te.cache
|
||||
compile
|
||||
config.guess
|
||||
config.h
|
||||
config.h.in
|
||||
config.log
|
||||
config.status
|
||||
config.sub
|
||||
configure
|
||||
depcomp
|
||||
install-sh
|
||||
libtool
|
||||
ltmain.sh
|
||||
missing
|
||||
.deps
|
||||
src/metacity-wm.desktop
|
||||
*.o
|
||||
*.a
|
||||
*.lo
|
||||
*.la
|
||||
.libs
|
||||
*.swp
|
||||
tidy-enum-types.[ch]
|
||||
tidy-marshal.[ch]
|
||||
stamp-tidy-enum-types.h
|
||||
stamp-tidy-marshal.h
|
||||
stamp-h1
|
||||
*.gmo
|
||||
*.make
|
||||
*~
|
||||
stamp-it
|
||||
.intltool-merge-cache
|
||||
POTFILES
|
||||
50-metacity-desktop-key.xml
|
||||
50-metacity-key.xml
|
||||
inlinepixbufs.h
|
||||
libmetacity-private.pc
|
||||
metacity
|
||||
metacity-dialog
|
||||
metacity-theme-viewer
|
||||
metacity.desktop
|
||||
metacity.schemas
|
||||
testasyncgetprop
|
||||
testboxes
|
||||
testgradient
|
||||
metacity-grayscale
|
||||
metacity-mag
|
||||
metacity-message
|
||||
metacity-window-demo
|
||||
focus-window
|
||||
test-gravity
|
||||
test-resizing
|
||||
test-size-hints
|
||||
wm-tester
|
||||
INSTALL
|
||||
mkinstalldirs
|
@@ -1,8 +1,10 @@
|
||||
Currently active maintainers
|
||||
--------------------------------
|
||||
|
||||
Elijah Newren
|
||||
Email: newren gmail com
|
||||
Email: newren gmail com
|
||||
Userid: newren
|
||||
|
||||
- Usually won't touch the theme bugs (isn't interested) or the
|
||||
compositor (until open source nvidia drivers are up to snuff).
|
||||
Tends to be most interested in libwnck/gtk interactions, focus
|
||||
@@ -10,8 +12,9 @@ Userid: newren
|
||||
just about anything other than themes and the compositor.
|
||||
|
||||
Thomas Thurman
|
||||
Email: thomas thurman org uk
|
||||
Email: thomas thurman org uk
|
||||
Userid: tthurman
|
||||
|
||||
- Responsible for all theme bugs and the compositor (thank goodness
|
||||
Thomas got involved, eh?). I'm sure he'll replace this sentence
|
||||
with his interests when he reads it. ;-)
|
||||
@@ -19,6 +22,7 @@ Userid: tthurman
|
||||
|
||||
Semi-active maintainers
|
||||
--------------------------------
|
||||
|
||||
Havoc Pennington
|
||||
Email: hp redhat com
|
||||
Userid: hp
|
||||
@@ -29,6 +33,7 @@ Userid: hp
|
||||
|
||||
Important historical figureheads
|
||||
--------------------------------
|
||||
|
||||
Rob Adams (readams readams net)
|
||||
- Was the main maintainer of metacity for a while; particular areas
|
||||
of focus included xinerama, placement, and an older version of the
|
||||
|
@@ -1,7 +1,6 @@
|
||||
|
||||
SUBDIRS=src po doc
|
||||
|
||||
EXTRA_DIST = HACKING MAINTAINERS rationales.txt \
|
||||
intltool-extract.in intltool-merge.in intltool-update.in
|
||||
EXTRA_DIST = HACKING MAINTAINERS rationales.txt
|
||||
|
||||
DISTCLEANFILES = intltool-extract intltool-merge intltool-update po/stamp-it po/.intltool-merge-cache
|
||||
|
534
NEWS
534
NEWS
@@ -1,3 +1,537 @@
|
||||
2.25.144
|
||||
========
|
||||
|
||||
Thanks to Matthias Claesen, Matt Kraai, Elijah Newren, Owen Taylor, and Thomas
|
||||
Thurman for improvements in this version.
|
||||
|
||||
- Optimise window property lookup (Thomas) (#549886)
|
||||
- Fix slip in the above (Matt)
|
||||
- Several memory leaks fixed (Matthias) (#552303, #552973, #552307)
|
||||
- Fix longstanding crasher about colourmaps (Owen) (#568365)
|
||||
- Alt+middle/right buttons can be switched (Thomas) (#437910)
|
||||
- Support _NET_WM_MOVERESIZE_CANCEL (Elijah)
|
||||
- minor fix paving the way for a theme editor (Thomas)
|
||||
|
||||
Translations
|
||||
David Planella (ca), Jorge González (es), Mattias Põldaru (et), saudat
|
||||
mohammed (ha), Yuval Tanny\n (he), Gabor Kelemen (hu), Onye, Sylvester (ig),
|
||||
Changwoo Ryu (ko), Raivis Dejus (lv), Kjartan Maraas (nb), Daniel Nylander (sv),
|
||||
Fajuyitan, Sunday Ayo (yo), 甘露 (Gan Lu) (zh_CN)
|
||||
|
||||
2.25.89
|
||||
=======
|
||||
|
||||
Thanks to Yanko Kaneti, Frederic Peters, Thomas Thurman, and Colin Walters for
|
||||
improvements in this version.
|
||||
|
||||
- The maximisation key is a toggle. (Thomas) (#343824)
|
||||
- "Unmaximise" is now called "restore". (Thomas) (#343824)
|
||||
- New thread handling call for gconf (Frederic) (#565517)
|
||||
- Add screenshot commands back which had been removed (Yanko) (#565343)
|
||||
- move_to_corner_se keybinding fixed (Thomas)
|
||||
- Windows on other workspaces which attempt to present themselves
|
||||
are marked as needing attention (Colin) (#482354)
|
||||
- End the grab op when the user clicks the titlebar (Thomas) (#401028)
|
||||
|
||||
Translations
|
||||
Jorge González (es)
|
||||
|
||||
2.25.55
|
||||
=======
|
||||
|
||||
Thanks to Erwann Chenede for improvements in this version.
|
||||
|
||||
- Fix build on Solaris (Erwann) (#564123)
|
||||
|
||||
Translations
|
||||
Mattias Põldaru (et), Luca Ferretti (it)
|
||||
|
||||
2.25.34
|
||||
=======
|
||||
|
||||
Thanks to Matt Kraai for improvements in this version.
|
||||
|
||||
- Fixes to Thomas's earlier fixes (Matt) (#562939)
|
||||
|
||||
Translations
|
||||
None
|
||||
|
||||
2.25.21
|
||||
=======
|
||||
|
||||
Thanks to Thomas Thurman for improvements in this version.
|
||||
|
||||
- Fixes to allow building without compositor again (Thomas)
|
||||
- Fixes for -Wall problems (Thomas)
|
||||
- Various tool updates (Thomas)
|
||||
|
||||
Translations: none
|
||||
|
||||
|
||||
2.25.13
|
||||
=======
|
||||
|
||||
Thanks to Thomas Thurman for improvements in this version.
|
||||
|
||||
- Add casts to fix failure to build from source on 64bit hosts (Thomas) (#562106)
|
||||
- Added script to produce annoucements (Thomas)
|
||||
|
||||
Translations
|
||||
Jorge González (es)
|
||||
|
||||
2.25.8
|
||||
======
|
||||
|
||||
Thanks to Brian Cameron, Maxim Ermilov, Daniel Macks, Elijah Newren, Frederic
|
||||
Peters, Thomas Thurman, David Trowbridge, and Olav Vitters for improvements in
|
||||
this version.
|
||||
|
||||
- Reorder compiler flags (Daniel) (#562033)
|
||||
- Fix compositor switch (Daniel) (#560990)
|
||||
- Remove spurious warnings about operations on window "none" (Thomas)
|
||||
- Fix _POSIX_C_SOURCE which was breaking OS X builds (Thomas) (#561962)
|
||||
- -Werror -Wall and -ansi are now standard compile flags (Thomas)
|
||||
- Merge screen and window keybindings files; fix minor alt-tab bug
|
||||
in the process (Thomas) (#528337)
|
||||
- Support _NET_WM_FULLSCREEN_MONITORS (David)
|
||||
- Remove some deprecated calls (Thomas) (#560445)
|
||||
- Clean up #includes (Maxim) (#560449)
|
||||
- Update description of raise_on_click (Elijah)
|
||||
- First dialogue delegated to zenity (Thomas)
|
||||
- fix theme-parser typo (Olav)
|
||||
- double-quote variable names in messages (Thomas) (#558309)
|
||||
- fix accidental renaming of run_command_terminal (Thomas) (#557943)
|
||||
- some null checks; problems exposed by new GDM (Brian) (#558058)
|
||||
- ignore mouse button modifier if it's missing (Thomas) (Launchpad 258054, Launchpad 266929)
|
||||
- fix docbook markup (Frederic)
|
||||
|
||||
Translations
|
||||
Astur (ast), Jorge González (es), Thomas Thurman (la), Leonardo Ferreira
|
||||
Fontenelle (pt_BR), Daniel Nylander (sv)
|
||||
|
||||
2.25.5
|
||||
======
|
||||
|
||||
Thanks to Thomas Thurman for improvements in this version.
|
||||
|
||||
- Allow third-party apps to decide whether a window appears
|
||||
on all workspaces (Thomas) (#557536)
|
||||
- Fixed keybindings script (again) (Thomas)
|
||||
|
||||
Translations
|
||||
David Planella (ca), Robert Millan (ca@valencia)
|
||||
|
||||
2.25.3
|
||||
======
|
||||
|
||||
Brown paper bag release which fixes numerous build problems from last night's
|
||||
release of 2.25.2. Apologies.
|
||||
|
||||
Thanks to Murray Cumming, Thomas Thurman, and Götz Waschk for improvements
|
||||
in this version.
|
||||
|
||||
- Fix distcheck (Thomas) (#557356)
|
||||
- add libm reference (Götz) (#557357)
|
||||
- fix docbook tags (Murray) (#557337)
|
||||
|
||||
Translations
|
||||
Yavor Doganov (bg), David Planella (ca), Robert Millan (ca@valencia), Kenneth
|
||||
Nielsen (da), Hendrik Richter (de), Ivar Smolin (et), Claude Paroz (fr), Seán de
|
||||
Búrca (ga), Launchpad Translations Administrators (hr), Gabor Kelemen (hu),
|
||||
Thomas Thurman (la), Žygimantas Beručka (lt), Kjartan Maraas (nb), Duarte
|
||||
Loreto (pt), Djavan Fagundes (pt_BR), Mugurel Tudor (ro), Pavol Šimo (sk),
|
||||
Laurent Dhima (sq), Горан Ракић (sr), Theppitak Karoonboonyanan (th),
|
||||
Funda Wang (zh_CN)
|
||||
|
||||
2.25.2
|
||||
======
|
||||
|
||||
Thanks to Joe Marcus Clarke, Murray Cumming, Tomas Frydrych, William Lachance,
|
||||
Matthew Martin, Christian Persch, Thomas Thurman, and Vincent Untz for
|
||||
improvements in this version.
|
||||
|
||||
- Add handler for SIGTERM (Joe) (#553980)
|
||||
- Minimised windows are necessarily obscured (Matthew) (#528927)
|
||||
- Build fixes with the above (Christian, Tomas, Thomas) (#557335)
|
||||
(#557201) (#469361)
|
||||
- Changed keybindings to be in a single place (Thomas) (#469361)
|
||||
- Add new document about themes (Murray)
|
||||
- Remove obsolete support for fallback icons (Thomas)
|
||||
- Pass modified mouse events to panels (William) (#554428)
|
||||
- Change where desktop files should go (Vincent) (#549479)
|
||||
|
||||
Translations
|
||||
Yavor Doganov (bg), David Planella (ca), Kenneth Nielsen (da), Hendrik
|
||||
Richter (de), Ivar Smolin (et), Claude Paroz (fr), Seán de Búrca (ga), Launchpad
|
||||
Translations Administrators (hr), Gabor Kelemen (hu), Thomas Thurman (la),
|
||||
Žygimantas Beručka (lt), Kjartan Maraas (nb), Duarte Loreto (pt), Djavan
|
||||
Fagundes (pt_BR), Mugurel Tudor (ro), Pavol Šimo (sk), Laurent Dhima (sq),
|
||||
Горан Ракић (sr), Theppitak Karoonboonyanan (th), Funda Wang (zh_CN)
|
||||
2.25.1
|
||||
======
|
||||
|
||||
Thanks to Thomas Thurman for improvements in this version.
|
||||
|
||||
- Fix small memory leak, found by Matthias Clasen (Thomas) (#549952)
|
||||
- Added move_to_center keybinding suggested by
|
||||
Khanh-Dang Nguyen Thu Lam (Thomas) (#549979)
|
||||
- Compositor can be turned on and off from the command line
|
||||
(#545323) (Thomas)
|
||||
|
||||
Translations
|
||||
Khaled Hosny (ar), Petr Kovar (cs), Iñaki Larrañaga Murgoitio (eu), Ilkka
|
||||
Tuohela (fi), Žygimantas Beručka (lt), Duarte Loreto (pt), Djavan
|
||||
Fagundes (pt_BR), Laurent Dhima (sq)
|
||||
|
||||
2.25.0
|
||||
======
|
||||
|
||||
Thanks to Patrick Niklaus, Ted Percival, Eric Piel, Akira TAGOH, and Thomas
|
||||
Thurman for improvements in this version.
|
||||
|
||||
- Fix memory allocation problem in struts (Eric) (probably #468075)
|
||||
- Ensure windows which start maximised know where to jump back
|
||||
to, so they don't warp to other screens (Ted) (#504692)
|
||||
- Added header comments to some files (Thomas)
|
||||
- Icons for windows which are uncooperative enough not to provide
|
||||
an icon are taken from the theme, not built in (Patrick) (#524343)
|
||||
- Added manual page for metacity-message (Akira, from Debian downstream)
|
||||
|
||||
Translations
|
||||
Khaled Hosny (ar), Petr Kovar (cs), Ilkka Tuohela (fi), Duarte Loreto (pt), Djavan
|
||||
Fagundes (pt_BR)
|
||||
|
||||
2.23.89
|
||||
=======
|
||||
|
||||
Thanks to Thomas Thurman for improvements in this version.
|
||||
|
||||
- Added DOAP file. (Thomas)
|
||||
|
||||
Translations
|
||||
Khaled Hosny (ar), Luca Ferretti (it), Takeshi AIHANA (ja), Wouter
|
||||
Bolsterlee (nl), Vladimir Melo (pt_BR), Daniel Nylander (sv)
|
||||
|
||||
2.23.55
|
||||
=======
|
||||
|
||||
Thanks to Elijah Newren and Thomas Thurman for improvements in this version.
|
||||
|
||||
Contrary to rumour, this release does not add tabbing to everything.
|
||||
|
||||
- Display theme name in title bar of theme viewer (Thomas) (#430198)
|
||||
- Allow toggling of non-compositor effects (Thomas) (#92867)
|
||||
- Add some extra null checks (Thomas) (#422242)
|
||||
- Check for double-freeing at the time of workspace freeing (Elijah) (#361804)
|
||||
- Don't generate log messages unless we're logging (Thomas)
|
||||
- Two windows which don't belong to any application can't be considered to
|
||||
belong to the same application (Thomas)
|
||||
- Various tidyings (Thomas)
|
||||
|
||||
Translations
|
||||
Yavor Doganov (bg), Gabor Kelemen (hu), Kjartan Maraas (nb), Matej
|
||||
Urbančič (sl), Daniel Nylander (sv), Theppitak Karoonboonyanan (th)
|
||||
|
||||
|
||||
2.23.34
|
||||
=======
|
||||
|
||||
Thanks to Thomas Thurman for improvements in this version.
|
||||
|
||||
- Commenting and tidying (Thomas)
|
||||
- Fix possible compositor crash (Thomas) (#530702)
|
||||
|
||||
Translations
|
||||
Khaled Hosny (ar), Yavor Doganov (bg), Jorge González (es), Kjartan Maraas (nb),
|
||||
Yannig Marchegay (Kokoyaya) (oc), Theppitak Karoonboonyanan (th), Clytie
|
||||
Siddall (vi)
|
||||
|
||||
2.23.34
|
||||
=======
|
||||
|
||||
Thanks to Thomas Thurman for improvements in this version.
|
||||
|
||||
- Commenting and tidying (Thomas)
|
||||
- Fix possible compositor crash (Thomas) (#530702)
|
||||
|
||||
Translations
|
||||
Khaled Hosny (ar), Yavor Doganov (bg), Jorge González (es), Kjartan Maraas (nb),
|
||||
Yannig Marchegay (Kokoyaya) (oc), Theppitak Karoonboonyanan (th), Clytie
|
||||
Siddall (vi)
|
||||
|
||||
2.23.34
|
||||
=======
|
||||
|
||||
Thanks to Thomas Thurman for improvements in this version.
|
||||
|
||||
- Various commenting (Thomas)
|
||||
- Ensure you can turn off compositor with "configure" (Thomas)
|
||||
- Ensure you can turn off gconf with "configure" (Thomas) (#530870)
|
||||
|
||||
Translations
|
||||
Clytie Siddall (vi)
|
||||
|
||||
2.23.21
|
||||
=======
|
||||
|
||||
Thanks to Robert Escriva, Iain Holmes, Matt Krai, Thomas Thurman,
|
||||
and Chris Wang for improvements in this version.
|
||||
|
||||
- Add shadow ability for menus and tooltips (Iain) (#517442) (#517524)
|
||||
- Fix possible crashes in compositor (Iain) (#534569) (#528787)
|
||||
- Major reorganisation of compositor code (Iain)
|
||||
- Initial version of XRender backend for the compositor (Iain)
|
||||
- New basic public API for compositor (Iain)
|
||||
- Window decoration updates colour when GTK theme changes (Robert) (#511826)
|
||||
- Minor code cleanup for pedantic compilers (Thomas)
|
||||
- Further code cleanup for pedantic compilers (Matt) (#526049)
|
||||
- The atom list appears only once in the code (Thomas) (#530843)
|
||||
- Don't attempt to read attributes of invalid windows (Chris) (#530485)
|
||||
|
||||
Translations
|
||||
Khaled Hosny (ar), Gabor Kelemen (hu), Kjartan Maraas (nb), Tino Meinen (nl),
|
||||
Theppitak Karoonboonyanan (th)
|
||||
2.23.13
|
||||
=======
|
||||
|
||||
Thanks to Erwann Chenede and Carlos Garnacho for improvements
|
||||
in this version.
|
||||
|
||||
- Re-enable cascading (Erwann) (#529925)
|
||||
- Propagate opacity to frame windows (spec compliance!) (Carlos)
|
||||
|
||||
Translations
|
||||
- None this time!
|
||||
|
||||
2.23.8
|
||||
======
|
||||
|
||||
Thanks to Lucas Rocha, Iain Holmes, and Jens Granseuer for improvements
|
||||
in this version.
|
||||
|
||||
* No need to symlink to .desktop files (Lucas)
|
||||
* Fixes to compositor's dealings with overlay windows (Iain)
|
||||
* C89 fixes (Jens)
|
||||
|
||||
Translators:
|
||||
Khaled Hosny (ar), Amitakhya Phukan (as), Ihar Hrachyshka (be@latin),
|
||||
Petr Kovar (cs), Rhys Jones (cy), Kenneth Nielsen (da), Andre Klapper (de),
|
||||
Jorge González (es), Iñaki Larrañaga Murgoitio (eu), Ilkka Tuohela (fi),
|
||||
Claude Paroz (fr), Seán de Búrca (ga), Ignacio Casal Quinteiro (gl),
|
||||
Yuval Tanny (he), Gabor Kelemen (hu), Luca Ferretti (it), Takeshi AIHANA (ja),
|
||||
Shankar Prasad (kn), Changwoo Ryu (ko), Arangel Angov (mk), sandeep shedmake (mr),
|
||||
Kjartan Maraas (nb), Nabin Gautam (ne), Wouter Bolsterlee (nl),
|
||||
Eskild Hustvedt (nn), Yannig Marchegay (Kokoyaya) (oc), Tomasz Dominikowski (pl),
|
||||
Duarte Loreto (pt), Vasiliy Faronov (ru), Daniel Nylander (sv),
|
||||
Theppitak Karoonboonyanan (th), Baris Cicek (tr), Maxim Dziumanenko (uk),
|
||||
Clytie Siddall (vi), Woodman Tuen (zh_HK), Woodman Tuen (zh_TW)
|
||||
2.23.5
|
||||
======
|
||||
|
||||
Thanks to Lucas Rocha, Owen Taylor, and Thomas Thurman for improvements in this
|
||||
version.
|
||||
|
||||
- Updates of useless preferences don't crash (Thomas) (#526016)
|
||||
- Compliance with new gnome-session (Lucas) (#525051)
|
||||
- Preview widget doesn't crash on broken themes (Thomas) (Launchpad 199402)
|
||||
- Initially iconic windows don't unminimise (Owen) (#491090)
|
||||
- Move ~/.metacity to ~/.config/metacity (Thomas) (#518596)
|
||||
- Metacity doesn't stay around when replaced (Thomas)
|
||||
- Extra check for null return in a function (Thomas)
|
||||
- Displays are singletons, simplifying code (Thomas) (#499301)
|
||||
|
||||
Translations
|
||||
Jorge González (es), Eskild Hustvedt (nn), Baris Cicek (tr), Clytie Siddall (vi)
|
||||
|
||||
2.23.3
|
||||
======
|
||||
|
||||
Thanks to Marco Pesenti Gritti, Iain Holmes, Josh Lee, Thomas Thurman, and
|
||||
Matthew Wilson for improvements in this version.
|
||||
|
||||
- Workspaces whose name is the same as the standard name, plus some string,
|
||||
are not cut off. (Thomas) (#453678)
|
||||
- Improve compositor performance (Iain) (#522166)
|
||||
- Draw wallpaper correctly when we start up with compositor
|
||||
(Iain) (#522599)
|
||||
- Several other smaller compositor fixes (Iain)
|
||||
- Don't draw shadows on shaped windows unless they have frames
|
||||
(Iain) (#505333)
|
||||
- Newly-created keep-above windows get focus (Marco) (#519188)
|
||||
- Allow moving workspace when dragging with modifier key (Matthew)
|
||||
(#474195)
|
||||
|
||||
Translations
|
||||
Kenneth Nielsen (da), Gabor Kelemen (hu), Vasiliy Faronov (ru), Daniel
|
||||
Nylander (sv), Maxim Dziumanenko (uk), Woodman Tuen (zh_HK)
|
||||
|
||||
2.23.2
|
||||
======
|
||||
|
||||
Removed some debug statements introduced in 2.23.1. Brown paper bag release.
|
||||
|
||||
|
||||
2.23.1
|
||||
======
|
||||
|
||||
Thanks to Cosimo Cecchi, Jens Granseuer, Jim Huang, Andrea Del Signore, and
|
||||
Thomas Thurman for improvements in this version.
|
||||
|
||||
(Cosimo's patch was very similar to another received from Jason Ribero.)
|
||||
|
||||
- Allow horizontal and vertical maximisation using the mouse (Cosimo/Jason)
|
||||
(#358674)
|
||||
- Allow "spacer" as a value for buttons, for blank space (Andrea) (#509165)
|
||||
- Remove unused code (Jim)
|
||||
- refactor preferences handling (Thomas)
|
||||
- make sure we're valid C89 (Jens) (#518917)
|
||||
- some messing with tool scripts (Thomas)
|
||||
|
||||
Translations
|
||||
Jorge González (es), Claude Paroz (fr), Woodman Tuen (zh_HK), Woodman
|
||||
Tuen (zh_TW)
|
||||
|
||||
2.23.0
|
||||
======
|
||||
|
||||
Thanks to Matthias Clasen, Mikkel Kamstrup Erlandsen, Jim Huang, Thomas Thurman,
|
||||
and Thomas Wood for improvements in this version.
|
||||
|
||||
- the preview widget can draw shaped windows properly! (Thomas W, #460018)
|
||||
- refactored handling of boolean and enumerated gconf preferences;
|
||||
refactoring of string and integer preferences will follow shortly (Thomas T)
|
||||
- Applications asking to move and resize windows at the same time have
|
||||
both their requests granted (Mikkel) (#448183)
|
||||
- Windows marked "skip taskbar" don't appear in the ctrl-alt-tab list
|
||||
(Matthias) (#106249)
|
||||
- fix session management detection (Thomas T) (#328210)
|
||||
- when resizing with the keyboard, the cursor stays on a window edge if
|
||||
you escape, whichever direction you were going (Thomas T) (#436257)
|
||||
- fix major breakage when gconf was turned off in configure (Jim) (#515019)
|
||||
- fix major breakage when verbose was turned off in configure (Jim) (#515152)
|
||||
- fix name of verbose option in help (Thomas T)
|
||||
- various bits of messing around with release scripts (Thomas T)
|
||||
|
||||
Translations
|
||||
Ihar Hrachyshka (be@latin), Ilkka Tuohela (fi), Ignacio Casal Quinteiro (gl),
|
||||
Shankar Prasad (kn), Changwoo Ryu (ko), Nabin Gautam (ne), Wouter Bolsterlee (nl)
|
||||
|
||||
2.21.13
|
||||
=======
|
||||
|
||||
Thanks to Michael Meeks and Thomas Thurman for improvements in this version.
|
||||
|
||||
- Only use compositor version if we have a compositor (Thomas) (#514453)
|
||||
- Remove workaround for a problem in an ancient GTK version (Thomas) (#513737)
|
||||
- Compositor efficiency fixes (Michael)
|
||||
- Various tools added (Thomas)
|
||||
|
||||
Translations
|
||||
Amitakhya Phukan (as), Rhys Jones (cy), Andre Klapper (de), Takeshi AIHANA (ja),
|
||||
Arangel Angov (mk), Tomasz Dominikowski (pl), Duarte Loreto (pt)
|
||||
|
||||
2.21.8
|
||||
======
|
||||
|
||||
Thanks to Paolo Borelli, Iain Holmes, Havoc Pennington, Christian Persch, Thomas
|
||||
Thurman, and Alex R.M. Turner for improvements in this version.
|
||||
|
||||
- Windows on other workspaces which need attention appear in the alt-tab
|
||||
list too (Alex) (#333548)
|
||||
- Remove deprecated function call (Christian) (#512561)
|
||||
- New release script (Thomas)
|
||||
- Made a start at improving the general number of comments (Thomas)
|
||||
- Updated copyright year to 2008, and some other tiny fixes (Thomas)
|
||||
- Don't do anything unusual when the compositor frees a window (Iain)
|
||||
- Mapping windows doesn't mark them as damaged (Iain)
|
||||
- Compositor uses the overlay window and not the root window (Iain)
|
||||
- Fixed several list leaks (Paolo)
|
||||
- Fixed warnings about printf formats (Havoc)
|
||||
- Move source files into subdirectories of the src directory (Havoc)
|
||||
|
||||
Translations
|
||||
Khaled Hosny (ar), Ihar Hrachyshka (be@latin), Petr Kovar (cs), Andre
|
||||
Klapper (de), Jorge González (es), Iñaki Larrañaga Murgoitio (eu), Seán de
|
||||
Búrca (ga), Yuval Tanny (he), Luca Ferretti (it), Takeshi AIHANA (ja), Arangel
|
||||
Angov (mk), sandeep shedmake (mr), Kjartan Maraas (nb), Yannig
|
||||
Marchegay (Kokoyaya) (oc), Daniel Nylander (sv), Theppitak Karoonboonyanan (th),
|
||||
Baris Cicek (tr), Clytie Siddall (vi)
|
||||
2.21.5
|
||||
======
|
||||
|
||||
Thanks to Iain Holmes and Thomas Thurman for improvements in this version.
|
||||
This contains the new compositor; downstream maintainers should note that
|
||||
its GConf key is initially turned off in src/metacity.schemas.in and consider
|
||||
whether to turn it on by default in their packages.
|
||||
|
||||
- merge compositor branch! (Iain) (499081)
|
||||
- print "Subversion" and not "CVS" when building (Thomas)
|
||||
|
||||
Translations
|
||||
Jorge González (es), Kjartan Maraas (nb), Daniel Nylander (sv)
|
||||
|
||||
2.21.3
|
||||
======
|
||||
|
||||
Thanks to Matthias Clasen, Martin Meyer, Kjartan Maraas, Thomas Thurman,
|
||||
and Lucas Rocha for improvements in this version.
|
||||
|
||||
- remove dead code (pointed out by Kjartan) (501365)
|
||||
- rewrote long key binding description for the sake of
|
||||
the translators (Thomas) (474889)
|
||||
- check for null before adding menu (Matthias) (496054)
|
||||
- let keys which end a grab also begin a grab (Thomas) (112560)
|
||||
- check the right variable in theme sanity check (Martin) (501362)
|
||||
- get session ID from environment if it's not passed in on the command
|
||||
line (Lucas) (498033)
|
||||
|
||||
Translations
|
||||
Ihar Hrachyshka (be@latin), Petr Kovar (cs), Jorge González (es),
|
||||
Ignacio Casal Quinteiro (gl), Rodrigo Flores (pt_BR), Pavol Šimo (sk),
|
||||
Matej Urbančič (sl)
|
||||
|
||||
2.21.2
|
||||
======
|
||||
|
||||
Thanks to Benjamin Gramlich, Thomas Thurman, and Peter Bloomfield
|
||||
for improvements in this release.
|
||||
|
||||
- Theme parser is compliant to XDG Base Directory Specification
|
||||
in searching for theme files. (Benjamin) (#480026)
|
||||
- Some source files which didn't get used were removed (Thomas)
|
||||
(#496947)
|
||||
- Fullscreen and maximise windows don't try to save their position
|
||||
(Peter) (#461927)
|
||||
|
||||
Translations
|
||||
Matej Urbančič (sl)
|
||||
|
||||
2.21.1
|
||||
======
|
||||
|
||||
Thanks to Elijah Newren, Alex R.M. Turner, Peter Bloomfield, Iain Holmes,
|
||||
Jans Granseuer, Federico Mena Quintero and Thomas Thurman for improvements
|
||||
in this release.
|
||||
|
||||
- Add --sync option, like all other GTK apps (Iain)
|
||||
- Don't save window's position if it's maximised (Peter) (#461927)
|
||||
- Memory leak fix in preview (Jans) (#469682)
|
||||
- Truncate tab popup string correctly, and refactor function (Alex)
|
||||
- Windows which pop up under always-on-top windows don't get the
|
||||
focus, but do get the "needs attention" hint (Thomas) (#486445)
|
||||
- Fix error in function call which caused focus problems (Federico)
|
||||
(partial fix of #488468)
|
||||
|
||||
Translations
|
||||
Djihed Afifi (ar), Metin Amiroff (az), Alexander Shopov (bg),
|
||||
Jordi Mallach (ca), David Lodge (en_GB), Jorge González (es),
|
||||
Iñaki Larrañaga Murgoitio (eu), Vincent Untz (fr), Alastair McKinstry (ga),
|
||||
Ankit Patel (gu), Rajesh Ranjan (hi), auto (hr), Changwoo Ryu (ko),
|
||||
Raivis Dejus (lv), Wouter Bolsterlee (nl), Gora Mohanty (or),
|
||||
ASB (pa), wadim dziedzic (pl), Duarte Loreto (pt),
|
||||
Og Maciel (pt_BR), Peter Tuhársky (sk), Matej Urbančič (sl),
|
||||
Daniel Nylander (sv), Maxim Dziumanenko (uk), Funda Wang (zh_CN)
|
||||
|
||||
2.20.0
|
||||
======
|
||||
|
||||
|
@@ -1,11 +1,11 @@
|
||||
#!/bin/sh
|
||||
#!/bin/bash
|
||||
# Run this to generate all the initial makefiles, etc.
|
||||
|
||||
srcdir=`dirname $0`
|
||||
test -z "$srcdir" && srcdir=.
|
||||
|
||||
PKG_NAME="metacity"
|
||||
REQUIRED_AUTOMAKE_VERSION=1.7
|
||||
REQUIRED_AUTOMAKE_VERSION=1.10
|
||||
|
||||
(test -f $srcdir/configure.in \
|
||||
&& test -d $srcdir/src) || {
|
||||
@@ -15,7 +15,8 @@ REQUIRED_AUTOMAKE_VERSION=1.7
|
||||
}
|
||||
|
||||
which gnome-autogen.sh || {
|
||||
echo "You need to install gnome-common from the GNOME CVS"
|
||||
echo "You need to install gnome-common from GNOME Subversion (or from"
|
||||
echo "your distribution's package manager)."
|
||||
exit 1
|
||||
}
|
||||
USE_GNOME2_MACROS=1 USE_COMMON_DOC_BUILD=yes . gnome-autogen.sh
|
||||
|
152
configure.in
152
configure.in
@@ -1,22 +1,37 @@
|
||||
AC_PREREQ(2.50)
|
||||
|
||||
m4_define([metacity_major_version], [2])
|
||||
m4_define([metacity_minor_version], [20])
|
||||
m4_define([metacity_minor_version], [25])
|
||||
# Fibonacci sequence for micro version numbering:
|
||||
# 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987
|
||||
m4_define([metacity_micro_version], [0])
|
||||
|
||||
m4_define([metacity_micro_version], [144])
|
||||
m4_define([mutter_version],[0.5])
|
||||
m4_define([metacity_version],
|
||||
[metacity_major_version.metacity_minor_version.metacity_micro_version])
|
||||
[metacity_major_version.metacity_minor_version.metacity_micro_version~mutter_version])
|
||||
|
||||
m4_define([metacity_clutter_plugin_api_version], [2])
|
||||
|
||||
AC_INIT([metacity], [metacity_version],
|
||||
[http://bugzilla.gnome.org/enter_bug.cgi?product=metacity])
|
||||
|
||||
AC_CONFIG_SRCDIR(src/display.c)
|
||||
AC_CONFIG_SRCDIR(src/core/display.c)
|
||||
AC_CONFIG_HEADERS(config.h)
|
||||
|
||||
AM_INIT_AUTOMAKE
|
||||
AM_MAINTAINER_MODE
|
||||
|
||||
METACITY_MAJOR_VERSION=metacity_major_version
|
||||
METACITY_MINOR_VERSION=metacity_minor_version
|
||||
METACITY_MICRO_VERSION=metacity_micro_version
|
||||
METACITY_CLUTTER_PLUGIN_API_VERSION=metacity_clutter_plugin_api_version
|
||||
AC_SUBST(METACITY_MAJOR_VERSION)
|
||||
AC_SUBST(METACITY_MINOR_VERSION)
|
||||
AC_SUBST(METACITY_MICRO_VERSION)
|
||||
AC_SUBST(METACITY_CLUTTER_PLUGIN_API_VERSION)
|
||||
|
||||
MUTTER_PLUGIN_DIR="$libdir/$PACKAGE/plugins/clutter"
|
||||
AC_SUBST(MUTTER_PLUGIN_DIR)
|
||||
|
||||
# Honor aclocal flags
|
||||
AC_SUBST(ACLOCAL_AMFLAGS, "\${ACLOCAL_FLAGS}")
|
||||
|
||||
@@ -31,7 +46,7 @@ AC_HEADER_STDC
|
||||
AC_LIBTOOL_WIN32_DLL
|
||||
AM_PROG_LIBTOOL
|
||||
|
||||
#### Integer sizes
|
||||
#### Integer sizes
|
||||
|
||||
AC_CHECK_SIZEOF(char)
|
||||
AC_CHECK_SIZEOF(short)
|
||||
@@ -120,7 +135,7 @@ if test x$enable_gconf = xyes; then
|
||||
fi
|
||||
|
||||
AC_ARG_ENABLE(verbose-mode,
|
||||
AC_HELP_STRING([--disable-verbose],
|
||||
AC_HELP_STRING([--disable-verbose-mode],
|
||||
[disable metacity's ability to do verbose logging, for embedded/size-sensitive custom builds]),,
|
||||
enable_verbose_mode=yes)
|
||||
|
||||
@@ -143,6 +158,11 @@ AC_ARG_ENABLE(compositor,
|
||||
[disable metacity's compositing manager]),,
|
||||
enable_compositor=auto)
|
||||
|
||||
AC_ARG_WITH(clutter,
|
||||
AC_HELP_STRING([--with-clutter],
|
||||
[Use clutter for compositing]),,
|
||||
with_clutter=auto)
|
||||
|
||||
AC_ARG_ENABLE(xsync,
|
||||
AC_HELP_STRING([--disable-xsync],
|
||||
[disable metacity's use of the XSync extension]),,
|
||||
@@ -164,7 +184,7 @@ AC_CHECK_HEADERS(execinfo.h, [AC_CHECK_FUNCS(backtrace)])
|
||||
AM_GLIB_GNU_GETTEXT
|
||||
|
||||
## here we get the flags we'll actually use
|
||||
# GOptionEntry requires glib-2.6.0
|
||||
# GOptionEntry requires glib-2.6.0
|
||||
PKG_CHECK_MODULES(ALL, glib-2.0 >= 2.6.0)
|
||||
# gtk_window_set_icon_name requires gtk2+-2.60
|
||||
PKG_CHECK_MODULES(METACITY_MESSAGE, gtk+-2.0 >= 2.6.0)
|
||||
@@ -176,11 +196,8 @@ else
|
||||
AC_MSG_ERROR("Pango 1.2.0 or greater based on Xft2 is required")
|
||||
fi
|
||||
|
||||
if $PKG_CONFIG --exists gnome-keybindings; then
|
||||
GNOME_KEYBINDINGS_KEYSDIR=$($PKG_CONFIG --variable keysdir gnome-keybindings)
|
||||
else
|
||||
GNOME_KEYBINDINGS_KEYSDIR="${datadir}/gnome-control-center/keybindings"
|
||||
fi
|
||||
# Unconditionally use this dir to avoid a circular dep with gnomecc
|
||||
GNOME_KEYBINDINGS_KEYSDIR="${datadir}/gnome-control-center/keybindings"
|
||||
AC_SUBST(GNOME_KEYBINDINGS_KEYSDIR)
|
||||
|
||||
STARTUP_NOTIFICATION_VERSION=0.7
|
||||
@@ -209,33 +226,45 @@ else
|
||||
echo "Building without libstartup-notification"
|
||||
fi
|
||||
|
||||
## init this, it gets set either in the compositor check below
|
||||
## init this, it gets set either in the compositor check below
|
||||
## or the render-specific check later
|
||||
have_xrender=no
|
||||
|
||||
XCOMPOSITE_VERSION=0.2
|
||||
AC_MSG_CHECKING([Xcomposite >= $XCOMPOSITE_VERSION])
|
||||
if $PKG_CONFIG --atleast-version $XCOMPOSITE_VERSION xcomposite; then
|
||||
if test x$enable_compositor = xyes; then
|
||||
have_xcomposite=yes
|
||||
elif test x$enable_compositor = xauto; then
|
||||
echo "Building compositing manager by default now."
|
||||
have_xcomposite=yes
|
||||
else
|
||||
have_xcomposite=no
|
||||
fi
|
||||
AC_MSG_RESULT($have_xcomposite)
|
||||
|
||||
if test x$enable_compositor = xyes; then
|
||||
if test x$with_clutter = xyes; then
|
||||
have_xcomposite=yes
|
||||
echo "CompositeExt support forced on"
|
||||
elif test x$enable_compositor = xauto; then
|
||||
echo "Not building compositing manager by default now, must enable explicitly to get it."
|
||||
have_xcomposite=no
|
||||
have_clutter=yes
|
||||
echo "CompositeExt support and Clutter forced on"
|
||||
elif test x$with_clutter = xauto; then
|
||||
have_clutter=no
|
||||
else
|
||||
have_xcomposite=no
|
||||
have_clutter=no
|
||||
fi
|
||||
|
||||
AM_CONDITIONAL(WITH_CLUTTER, test "$have_clutter" = "yes")
|
||||
|
||||
if test x$have_xcomposite = xyes; then
|
||||
AC_MSG_CHECKING([Xcomposite >= $XCOMPOSITE_VERSION])
|
||||
if $PKG_CONFIG --atleast-version $XCOMPOSITE_VERSION xcomposite; then
|
||||
AC_MSG_RESULT([yes])
|
||||
else
|
||||
AC_MSG_ERROR([no. Use --disable-compositor to disable.])
|
||||
fi
|
||||
fi
|
||||
|
||||
if test x$have_xcomposite = xyes; then
|
||||
echo "Building with CompositeExt"
|
||||
METACITY_PC_MODULES="$METACITY_PC_MODULES xcomposite >= $XCOMPOSITE_VERSION xfixes xrender xdamage cm"
|
||||
AC_DEFINE(HAVE_COMPOSITE_EXTENSIONS, , [Building with compositing manager support])
|
||||
METACITY_PC_MODULES="$METACITY_PC_MODULES xcomposite >= $XCOMPOSITE_VERSION xfixes xrender xdamage"
|
||||
AC_DEFINE(HAVE_COMPOSITE_EXTENSIONS, 1, [Building with compositing manager support])
|
||||
echo "Building with compositing manager"
|
||||
|
||||
## force on render also
|
||||
have_xrender=yes
|
||||
@@ -273,6 +302,27 @@ if test x$have_xrender = xyes; then
|
||||
AC_DEFINE(HAVE_RENDER, , [Building with Render extension support])
|
||||
fi
|
||||
|
||||
CLUTTER_PACKAGE=clutter-0.9
|
||||
AC_SUBST(CLUTTER_PACKAGE)
|
||||
if test x$have_clutter = xyes; then
|
||||
METACITY_PC_MODULES="$METACITY_PC_MODULES $CLUTTER_PACKAGE "
|
||||
PKG_CHECK_MODULES(CLUTTER, $CLUTTER_PACKAGE)
|
||||
AC_DEFINE(WITH_CLUTTER, , [Building with Clutter compositor])
|
||||
|
||||
dnl Check for the clutter-glx-texture-pixmap header
|
||||
metacity_save_cppflags="$CPPFLAGS"
|
||||
CPPFLAGS="$CPPFLAGS $CLUTTER_CFLAGS"
|
||||
AC_CHECK_HEADER([clutter/glx/clutter-glx-texture-pixmap.h],
|
||||
[have_glx_texture_pixmap=yes],
|
||||
[have_glx_texture_pixmap=no])
|
||||
CPPFLAGS="$metacity_save_cppflags"
|
||||
|
||||
if test x$have_glx_texture_pixmap = xyes; then
|
||||
AC_DEFINE(HAVE_GLX_TEXTURE_PIXMAP, ,
|
||||
[Is ClutterGLXTexturePixmap available?])
|
||||
fi
|
||||
fi
|
||||
|
||||
AC_MSG_CHECKING([Xcursor])
|
||||
if $PKG_CONFIG xcursor; then
|
||||
have_xcursor=yes
|
||||
@@ -284,7 +334,7 @@ if $PKG_CONFIG xcursor; then
|
||||
if test x$have_xcursor = xyes; then
|
||||
echo "Building with Xcursor"
|
||||
METACITY_PC_MODULES="$METACITY_PC_MODULES xcursor"
|
||||
AC_DEFINE(HAVE_XCURSOR, , [Building with Xcursor support])
|
||||
AC_DEFINE(HAVE_XCURSOR, , [Building with Xcursor support])
|
||||
fi
|
||||
|
||||
PKG_CHECK_MODULES(METACITY, $METACITY_PC_MODULES)
|
||||
@@ -321,7 +371,7 @@ if test "${try_xinerama}" != no; then
|
||||
AC_DEFINE(HAVE_XINERAMA, , [Have some version of Xinerama]),
|
||||
use_solaris_xinerama=no,
|
||||
[#include <X11/Xlib.h>])
|
||||
fi
|
||||
fi
|
||||
AC_MSG_CHECKING(for Xinerama support on Solaris)
|
||||
AC_MSG_RESULT($use_solaris_xinerama);
|
||||
;;
|
||||
@@ -330,12 +380,12 @@ if test "${try_xinerama}" != no; then
|
||||
use_xfree_xinerama=yes
|
||||
AC_CHECK_LIB(Xinerama, XineramaQueryExtension,
|
||||
[AC_CHECK_HEADER(X11/extensions/Xinerama.h,
|
||||
X_EXTRA_LIBS="-lXinerama $X_EXTRA_LIBS"
|
||||
X_EXTRA_LIBS="-lXinerama $X_EXTRA_LIBS"
|
||||
if test -z "`echo $ALL_X_LIBS | grep "\-lXext" 2> /dev/null`"; then
|
||||
X_EXTRA_LIBS="-lXext $X_EXTRA_LIBS"
|
||||
fi
|
||||
AC_DEFINE(HAVE_XFREE_XINERAMA, , [Have XFree86-style Xinerama])
|
||||
AC_DEFINE(HAVE_XINERAMA,, [Have some version of Xinerama]),
|
||||
AC_DEFINE(HAVE_XINERAMA,, [Have some version of Xinerama]),
|
||||
use_xfree_xinerama=no,
|
||||
[#include <X11/Xlib.h>])],
|
||||
use_xfree_xinerama=no, -lXext $ALL_X_LIBS)
|
||||
@@ -416,7 +466,7 @@ if test "x$found_xsync" = "xyes"; then
|
||||
AC_DEFINE(HAVE_XSYNC, , [Have the Xsync extension library])
|
||||
fi
|
||||
|
||||
METACITY_LIBS="$METACITY_LIBS $XSYNC_LIBS $RANDR_LIBS $SHAPE_LIBS $X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS"
|
||||
METACITY_LIBS="$METACITY_LIBS $XSYNC_LIBS $RANDR_LIBS $SHAPE_LIBS $X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS -lm"
|
||||
METACITY_MESSAGE_LIBS="$METACITY_MESSAGE_LIBS $X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS"
|
||||
METACITY_WINDOW_DEMO_LIBS="$METACITY_WINDOW_DEMO_LIBS $X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS"
|
||||
METACITY_PROPS_LIBS="$METACITY_PROPS_LIBS $X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS"
|
||||
@@ -427,9 +477,9 @@ case "$METACITY_LIBS" in
|
||||
found_sm=yes
|
||||
;;
|
||||
*)
|
||||
AC_CHECK_LIB(SM, SmcSaveYourselfDone,
|
||||
AC_CHECK_LIB(SM, SmcSaveYourselfDone,
|
||||
[AC_CHECK_HEADERS(X11/SM/SMlib.h,
|
||||
METACITY_LIBS="-lSM -lICE $METACITY_LIBS" found_sm=no)],
|
||||
METACITY_LIBS="-lSM -lICE $METACITY_LIBS" found_sm=yes)],
|
||||
, $METACITY_LIBS)
|
||||
;;
|
||||
esac
|
||||
@@ -449,7 +499,7 @@ if test "$found_sm" = "yes"; then
|
||||
AC_DEFINE(HAVE_SM, , [Building with SM support])
|
||||
fi
|
||||
|
||||
AM_CONDITIONAL(HAVE_SM, test "$found_sm" = "yes")
|
||||
AM_CONDITIONAL(HAVE_SM, test "$found_sm" = "yes")
|
||||
|
||||
HOST_ALIAS=$host_alias
|
||||
AC_SUBST(HOST_ALIAS)
|
||||
@@ -462,13 +512,7 @@ fi
|
||||
|
||||
AC_SUBST(GDK_PIXBUF_CSOURCE)
|
||||
|
||||
## hack to work with old GTK versions for now
|
||||
save_LDFLAGS=$LDFLAGS
|
||||
LDFLAGS="$METACITY_LIBS $LDFLAGS"
|
||||
AC_CHECK_FUNCS(gdk_pixbuf_new_from_stream)
|
||||
LDFLAGS=$save_LDFLAGS
|
||||
|
||||
if test x$enable_gconf = xyes; then
|
||||
if test x$enable_gconf = xyes; then
|
||||
AC_PATH_PROG(GCONFTOOL, gconftool-2, no)
|
||||
if test x"$GCONFTOOL" = xno; then
|
||||
AC_MSG_ERROR([gconftool-2 executable not found in your path - should be installed with GConf])
|
||||
@@ -480,15 +524,38 @@ else
|
||||
GCONF_SCHEMAS_INSTALL_FALSE=
|
||||
fi
|
||||
|
||||
AC_PATH_PROG(ZENITY, zenity, no)
|
||||
if test x"$ZENITY" = xno; then
|
||||
AC_MSG_ERROR([zenity not found in your path - needed for dialogs])
|
||||
fi
|
||||
|
||||
AC_ARG_ENABLE(debug,
|
||||
[ --enable-debug enable debugging],,
|
||||
enable_debug=no)
|
||||
if test "x$enable_debug" = "xyes"; then
|
||||
CFLAGS="$CFLAGS -g -O"
|
||||
fi
|
||||
|
||||
# Warnings are there for a reason
|
||||
if test "x$GCC" = "xyes"; then
|
||||
CFLAGS="$CFLAGS -Wall -Werror -ansi"
|
||||
fi
|
||||
|
||||
# Use gnome-doc-utils:
|
||||
GNOME_DOC_INIT([0.8.0])
|
||||
|
||||
AC_CONFIG_FILES([
|
||||
Makefile
|
||||
doc/Makefile
|
||||
doc/creating_themes/Makefile
|
||||
doc/man/Makefile
|
||||
src/Makefile
|
||||
src/wm-tester/Makefile
|
||||
src/libmetacity-private.pc
|
||||
src/metacity-plugins.pc
|
||||
src/tools/Makefile
|
||||
src/themes/Makefile
|
||||
src/compositor/mutter/plugins/Makefile
|
||||
po/Makefile.in
|
||||
])
|
||||
|
||||
@@ -528,6 +595,7 @@ metacity-$VERSION:
|
||||
Xsync: ${found_xsync}
|
||||
Render: ${have_xrender}
|
||||
Xcursor: ${have_xcursor}
|
||||
Clutter: ${have_clutter}
|
||||
"
|
||||
|
||||
METACITY_MINOR_VERSION=metacity_minor_version
|
||||
@@ -535,7 +603,7 @@ if test $(( $(echo $METACITY_MINOR_VERSION) %2)) == "1"; then
|
||||
stable_version=$(( ($METACITY_MINOR_VERSION / 2) * 2))
|
||||
echo "This is the UNSTABLE branch of metacity"
|
||||
echo -n "Use 2.$stable_version.x for stable "
|
||||
echo "(gnome-2-$stable_version branch in CVS)"
|
||||
echo "(gnome-2-$stable_version branch in Subversion)"
|
||||
else
|
||||
echo "This is the stable branch of metacity"
|
||||
fi
|
||||
|
@@ -1,4 +1,4 @@
|
||||
SUBDIRS = man
|
||||
SUBDIRS = man creating_themes
|
||||
|
||||
EXTRA_DIST=theme-format.txt metacity-theme.dtd dialogs.txt code-overview.txt \
|
||||
how-to-get-focus-right.txt
|
||||
|
286
doc/creating_themes/C/creating-metacity-themes.xml
Normal file
286
doc/creating_themes/C/creating-metacity-themes.xml
Normal file
@@ -0,0 +1,286 @@
|
||||
<?xml version="1.0"?>
|
||||
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
|
||||
"http://docbook.org/docbook/xml/4.5/docbookx.dtd" [
|
||||
]>
|
||||
|
||||
<book id="index">
|
||||
|
||||
<bookinfo>
|
||||
|
||||
<title>Understanding Metacity Themes</title>
|
||||
|
||||
<authorgroup>
|
||||
<author>
|
||||
<firstname>Thomas</firstname>
|
||||
<surname>Thurman</surname>
|
||||
</author>
|
||||
</authorgroup>
|
||||
|
||||
<abstract>
|
||||
|
||||
<para>
|
||||
We very much appreciate any reports of inaccuracies or other errors in
|
||||
this document. Contributions are also most welcome. Post your
|
||||
suggestions, critiques or addenda to the <ulink
|
||||
url="mailto:tthurman@gnome.org">team</ulink>.</para>
|
||||
|
||||
</abstract>
|
||||
|
||||
<copyright>
|
||||
<year>2008</year>
|
||||
<holder>Thomas Thurman</holder>
|
||||
</copyright>
|
||||
|
||||
<legalnotice>
|
||||
<para>
|
||||
Permission is granted to copy, distribute and/or modify this document
|
||||
under the terms of the GNU Free Documentation License, Version 1.2
|
||||
or any later version published by the Free Software Foundation;
|
||||
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
|
||||
You may obtain a copy of the GNU Free Documentation License from the Free Software Foundation by visiting their Web site or by writing to: Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
</para>
|
||||
</legalnotice>
|
||||
|
||||
</bookinfo>
|
||||
|
||||
<chapter id="sec-introduction">
|
||||
<title>Introduction</title>
|
||||
|
||||
<para>This is an article about how to theme Metacity. It is a work in progress, and I have had to dig deeply to find some answers; I may well have made mistakes and I welcome corrections and suggestions.</para>
|
||||
<para>GNOME lets you theme a bunch of different things, but we're only talking about <literal>window border</literal> themes here, which some people call Metacity themes; <ulink url="http://en.wikipedia.org/wiki/Metacity#Themes">Wikipedia begins a sentence</ulink> with "Despite the incomplete state of Metacity theme development documentation", and though there <emphasis>is</emphasis> <ulink url="http://svn.gnome.org/viewvc/metacity/trunk/doc/theme-format.txt?view=markup">documentation in the source</ulink>, apparently not many people find it, and it's written more for programmers than theme designers. Glynn Foster also wrote <ulink url="http://developer.gnome.org/doc/tutorials/metacity/metacity-themes.html">a very good introduction to Metacity themes</ulink> (<ulink url="http://home.arcor.de/rybaczyk/documents/tutorials/metacity/metacity-themes.de.html">[de]</ulink>) six years ago, but things have changed a little since then. <ulink url="http://lists.freedesktop.org/archives/compiz/2006-September/000445.html">Metacity themes can also be used by Compiz</ulink>, and perhaps by other window managers for all I know.</para>
|
||||
|
||||
<para>So, a Metacity theme is a set of instructions about how to "decorate" (draw the borders around) a window. Presumably you don't want to style all windows identically, so the format lets you specify details for different kinds of window:</para>
|
||||
|
||||
<para>
|
||||
<variablelist>
|
||||
<varlistentry>
|
||||
<term>state:</term><listitem><para>Every window must be in exactly one of these states: <literal>normal</literal>, <literal>dialog</literal>, <literal>modal dialog</literal> (i.e. a dialogue which means you can't interact with the rest of the program while it's up), <literal>menu</literal> (torn off from the main application, not that people do that much these days), <literal>utility</literal> (that is, palettes and toolboxes and things), and <literal>border</literal>. X also allows a window to explicitly ask to be undecorated, but of course we don't provide for those in a list of decoration instructions.</para></listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>focused</term><listitem><para>Every window is either the active window (which X people call "focused"), or it isn't.</para></listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>maximized</term><listitem><para>Every window is either (fully) maximised (horizontal and vertical only don't count), or it isn't.</para></listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>shaded</term><listitem><para>Every window is either rolled up to show just its titlebar (which techies call "shaded" for some reason I can't fathom), or it isn't.</para></listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
</para>
|
||||
|
||||
<para>
|
||||
<itemizedlist>
|
||||
<listitem><para><emphasis>If a window is not fully maximised and not shaded,</emphasis> it either allows horizontal resizing, or it doesn't.</para></listitem>
|
||||
<listitem><para><emphasis>If a window is not fully maximised and not shaded,</emphasis> it either allows vertical resizing, or it doesn't.</para></listitem>
|
||||
</itemizedlist>
|
||||
</para>
|
||||
|
||||
</chapter>
|
||||
|
||||
<chapter>
|
||||
<title>What's in the file</title>
|
||||
|
||||
<para>The files must be called either</para>
|
||||
|
||||
<para>
|
||||
<itemizedlist>
|
||||
<listitem><para>~/.themes/<varname>N</varname>/metacity-1/metacity-theme-<varname>V</varname>.xml
|
||||
for a theme used only by you, or</para></listitem>
|
||||
<listitem><para>/usr/share/themes/<varname>N</varname>/metacity-1/metacity-theme-<varname>V</varname>.xml
|
||||
for a theme installed for all users.</para></listitem>
|
||||
</itemizedlist>
|
||||
</para>
|
||||
|
||||
<para>where <varname>N</varname> is the name of the theme and <varname>V</varname> is the version of the format. Version 2, <ulink url="http://svn.gnome.org/viewvc/metacity?view=revision&revision=2973">introduced in October 2006</ulink>, adds a few extra features, but it's rarely used. Version 1 is the original format. The formats are fixed once they're stable for both backwards and forwards compatibility; <ulink url="http://bugzilla.gnome.org/show_bug.cgi?id=482165">new features</ulink> can't be added without introducing a new version number, which is why improvements come out rarely and in large clumps. <literal>metacity-1</literal> in the names is a fossil and doesn't mean version 1 of anything.</para>
|
||||
|
||||
<para>The metacity-theme-V.xml files are <ulink url="http://blogs.gnome.org/tthurman/2008/02/14/gmarkup/">GMarkup files</ulink>, which are very similar to XML. For now, you actually have to write these in a text editor or something; you can either start with a blank page, or modify a theme someone else has made. (I am thinking of writing a general theme editor program, but that'll have to wait until I've reduced Metacity's open bug queue a little.) If you want to see a fully-fledged one, you can look at <ulink url="http://svn.gnome.org/viewvc/metacity/trunk/src/themes/Atlanta/metacity-theme-1.xml?view=markup">the current version of "Atlanta"</ulink>, one of the simplest themes, but even that is quite complicated-looking at first.</para>
|
||||
<para>So, let's talk about what actually goes inside the files. As in any XML file, <!-<!-- x -->- … <!-- x -->> are comments. At its most basic, it would go:</para>
|
||||
|
||||
<para>
|
||||
<programlisting>
|
||||
<metacity_theme>
|
||||
<!-<!-- x -->- Helper stuff: -<!-- x -->->
|
||||
<info …> <!-<!-- x -->- to be explained -<!-- x -->->
|
||||
<constant …> <!-<!-- x -->- maybe; to be explained -<!-- x -->->
|
||||
|
||||
<draw_ops …> <!-<!-- x -->- maybe; to be explained -<!-- x -->->
|
||||
|
||||
<!-<!-- x -->- Things we build the top level onto: -<!-- x -->->
|
||||
<frame_geometry …> <!-<!-- x -->- to be explained -<!-- x -->->
|
||||
|
||||
<frame_style …> <!-<!-- x -->- to be explained -<!-- x -->->
|
||||
<frame_style_set …> <!-<!-- x -->- to be explained -<!-- x -->->
|
||||
|
||||
<!-<!-- x -->- And the top level: -<!-- x -->->
|
||||
|
||||
<window type="normal" style_set="…" />
|
||||
<window type="dialog" style_set="…" />
|
||||
<window type="modal_dialog" style_set="…" />
|
||||
|
||||
<window type="menu" style_set="…" />
|
||||
<window type="utility" style_set="…" />
|
||||
<window type="border" style_set="…" />
|
||||
|
||||
</metacity_theme>
|
||||
</programlisting>
|
||||
</para>
|
||||
|
||||
</chapter>
|
||||
|
||||
<chapter>
|
||||
<title>Matching windows</title>
|
||||
|
||||
<para>
|
||||
<variablelist>
|
||||
<varlistentry>
|
||||
<term>window</term><listitem><para>You see that at the top level we have a list of <window> tags, one for each window state we discussed above. The style_set argument of each of these gives the name of a frame_style_set.</para></listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>frame_style_set:</term><listitem><para>tells Metacity how to draw windows according to whether they're focused or not, maximised or not, shaded or not, and allowing resizing vertically, horizontally, both, or neither. It looks like this:</para></listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
</para>
|
||||
|
||||
<para>
|
||||
<programlisting>
|
||||
<frame_style_set>
|
||||
<frame focus="F" state="S" resize="R" style="N"/>
|
||||
<frame… />
|
||||
|
||||
…
|
||||
</frame_style_set>
|
||||
</programlisting>
|
||||
</para>
|
||||
|
||||
<para>where:</para>
|
||||
|
||||
<para>
|
||||
<variablelist>
|
||||
<varlistentry>
|
||||
<term>F</term><listitem><para>is yes for focused, no for unfocused.</para></listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>S</term><listitem><para>combines the shaded and maximized flags: normal, maximized, shaded, or maximized_and_shaded.</para></listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>R</term><listitem><para>represents resize permissions that the window gives us: none, vertical, horizontal, or both. Frame settings for maximised windows, which can't be resized, don't have this attribute.</para></listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
</para>
|
||||
|
||||
<para>
|
||||
<varname>N</varname> is the name of a <literal>frame_style</literal> to apply to a window which has these attributes.</para>
|
||||
|
||||
<para>A <literal>frame_style_set</literal> tag may also have a "parent" tag, which should be the name of another <literal>frame_style_set</literal>. This means that if Metacity wants to know about a kind of window which that <literal>frame_style_set</literal> doesn't describe, it should look in the parent. Most of the more complicated tags in Metacity theme files also have a "parent" attribute which work the same way. This is particularly useful because, taken together, all the <literal>frame_style_set</literal>s in a theme file must be capable of matching every possible kind of window; if a window turns up that they can't match, there will be an error at runtime.</para>
|
||||
|
||||
<para>Let's recap what we've seen so far. The combination of a <literal>window</literal>, which matches a window's state (normal, dialog, and so forth), with an entry in the corresponding <literal>frame_style_set</literal>, which matches its focus, shadedness, maximisedness, and resize permissions where relevant, will allow you to make a list of rules to match any window against. The next piece of this puzzle lets you specify what Metacity should do with such windows once it's matched them.</para>
|
||||
|
||||
</chapter>
|
||||
|
||||
<chapter>
|
||||
<title>Actually drawing stuff</title>
|
||||
|
||||
<para><literal>frame_style:</literal> This is probably the most complicated part of the whole system. A <literal>frame_style</literal> a series of <emphasis><literal>piece</literal></emphasis>s and <emphasis><literal>button</literal></emphasis>s. It looks like this:</para>
|
||||
|
||||
<para>
|
||||
<programlisting>
|
||||
<frame_style name="…" geometry="G">
|
||||
<piece position="P">
|
||||
<draw_ops>
|
||||
</draw_ops>
|
||||
</piece>
|
||||
…
|
||||
<button function="F" state="S" draw_ops="D"/>
|
||||
|
||||
<draw_ops>
|
||||
</draw_ops>
|
||||
</button>
|
||||
…
|
||||
</frame_style>
|
||||
</programlisting>
|
||||
</para>
|
||||
|
||||
<para>The <literal>pieces</literal> are pieces of the window frame. When Metacity draws a window frame, it renders its various pieces always in the same order. The bolded parts are all the possible values of P:</para>
|
||||
|
||||
<para>
|
||||
<itemizedlist>
|
||||
<listitem><para>the <literal>entire_background</literal>, covering the whole frame</para></listitem>
|
||||
|
||||
<listitem><para>the <literal>titlebar</literal>, covering the entire background of the titlebar</para></listitem>
|
||||
<listitem><para>the <literal>titlebar_middle</literal>, the part of the titlebar that doesn't touch its edges</para></listitem>
|
||||
<listitem><para>the <literal>left_titlebar_edge</literal>, <literal>right_titlebar_edge</literal>, <literal>top_titlebar_edge</literal>, and <literal>bottom_titlebar_edge</literal></para></listitem>
|
||||
|
||||
<listitem><para>the <literal>title</literal>, just exactly that area which is covered by the text on the titlebar</para></listitem>
|
||||
<listitem><para>the <literal>left_edge</literal>, <literal>right_edge</literal>, and <literal>bottom_edge</literal> of the frame (yes, there is no top_edge: it's identical to top_titlebar_edge, isn't it?)</para></listitem>
|
||||
<listitem><para>the <literal>overlay</literal>, which covers everything– the same as entire_background, but done last instead of first.</para></listitem>
|
||||
</itemizedlist>
|
||||
</para>
|
||||
|
||||
<para><emphasis>What</emphasis> Metacity draws in these pieces is decided by the theme. If a <literal>frame_style</literal> or its parents don't specify a particular piece, nothing will be drawn for that piece. You have two ways to specify what to draw: one is that the <literal>piece</literal> tag can have a <literal>draw_ops</literal> tag inside it which lists a sequence of drawing operations in Metacity's custom format. <ulink url="http://bugzilla.gnome.org/show_bug.cgi?id=107012">You might ask why we don't use SVG</ulink>; one answer is that SVG support wasn't very strong when this format was designed, and another answer is that these days you can use SVG all you like; just include it as an image and Metacity will know what to do.</para>
|
||||
|
||||
<para>An alternative to including a draw_ops tag inside a piece tag is to add a draw_ops attribute to the piece tag. Then you can add a draw_ops tag at top level (inside the metacity_theme tag) with a name attribute, and Metacity will use that. This is useful if you use similar draw_ops over and over.</para>
|
||||
<para>I'm not going to document draw_ops at present, because this is already very long. I will write it up later and link it from here.</para>
|
||||
<para>The <literal>button</literal> tag tells Metacity how, but not where, to draw buttons. Buttons are drawn after all the pieces are finished, and the way to draw them is also given using draw_ops. You ought to provide buttons for all the possible kinds of button; if you don't give one it won't be drawn, which is unfortunate for the user who wants to use it:</para>
|
||||
|
||||
<para>
|
||||
<itemizedlist>
|
||||
<listitem><para><literal>left_left_background</literal>, <literal>left_middle_background</literal>, and <literal>left_right_background</literal> don't represent buttons as such, but the background behind them, assuming there can be at most three buttons on the left. These days there can be more, so the extra ones also use left_middle_background.</para></listitem>
|
||||
|
||||
<listitem><para><literal>right_left_background</literal>, <literal>right_middle_background</literal>, and <literal>right_right_background</literal> similarly.</para></listitem>
|
||||
<listitem><para><literal>close</literal>, <literal>minimize</literal>, <literal>maximize</literal> are the obvious original three buttons.</para></listitem>
|
||||
<listitem><para><literal>menu</literal> is the menu button you can click to get a list of actions you can perform on the window.</para></listitem>
|
||||
|
||||
<listitem><para><literal>shade</literal>, <literal>above</literal>, <literal>stick</literal> are similar to the original buttons but only allowed in version 2</para></listitem>
|
||||
<listitem><para><literal>unshade</literal>, <literal>unabove</literal>, <literal>unstick</literal> are the toggled versions of these buttons. Again, version 2 only.</para></listitem>
|
||||
|
||||
</itemizedlist>
|
||||
</para>
|
||||
|
||||
<para>The reason there are toggled versions of shade, above, and stick, and not maximize, is that by the time you get this far you've probably already decided whether you're drawing a maximised window. So if you <emphasis>are</emphasis> drawing a maximised window, you can make the button called "maximize" look how you want the restore button to be; otherwise, make it look like you want the maximise button to be.</para>
|
||||
<para>For each button tag you should also set a "state" attribute; this time the state is either <literal>normal</literal> (the way you see it most of the time), <literal>pressed</literal>, or <literal>prelight</literal> (this makes the buttons subtly light up when you hover over them). You only really need "normal", but the others are good to have too.</para>
|
||||
|
||||
<para>The "geometry" attribute of a <literal>frame_style</literal> tag is the name of a…</para>
|
||||
|
||||
</chapter>
|
||||
|
||||
<chapter>
|
||||
<title>Geometry</title>
|
||||
|
||||
<para>The <literal>geometry</literal> tag defines the sizes of things around the window. It is important, but not easy to explain, and again this file has gone on too long. I'll write it up later.</para>
|
||||
|
||||
</chapter>
|
||||
|
||||
<chapter>
|
||||
<title>Other things which lie around a file</title>
|
||||
|
||||
<para>The most important other thing in a theme file is the metadata held in the <literal>info</literal> tag. This contains a set of tags each of which contains some text explaining something about the theme itself, in a sort of <ulink url="http://en.wikipedia.org/wiki/Dublin_Core">Dublin Core</ulink> sort of way. (Next time around, we should probably use the actual Dublin Core.) The tags are <literal>name</literal>, <literal>author</literal>, <literal>copyright</literal>, <literal>date</literal>, and <literal>description</literal>.</para>
|
||||
|
||||
<para>Version 1 of the format had a <literal>menu_icon</literal> tag at top level, which let themes specify the icons beside options in the menu you get from the menu icon. This has become redundant; the icons are taken from the icon theme! The tag can still be used in all formats, but does nothing and is deprecated.</para>
|
||||
<para>Version 2 of the format has a <literal>fallback</literal> tag at top level, which let the theme specify what icon a window should be considered to have if it doesn't provide an icon of its own. This should also be taken from the icon theme, <ulink url="http://bugzilla.gnome.org/show_bug.cgi?id=524343">if anyone fancies fixing it</ulink>, and the tag should also then be deprecated. It shouldn't be hard.</para>
|
||||
|
||||
</chapter>
|
||||
|
||||
<chapter>
|
||||
<title>When you're working on a theme</title>
|
||||
|
||||
<para>When you're editing a theme, you can view it without using it on the whole desktop using
|
||||
<command>metacity-theme-viewer YourThemeName</command></para>
|
||||
<para>and view it on the whole desktop using
|
||||
<command>gconftool -<!-- x -->-type=string -<!-- x -->-set /apps/metacity/general/theme YourThemeName</command></para>
|
||||
|
||||
<para>Whenever you change the selected theme in GConf, Metacity will load the newly-chosen theme. This is how control-center does it. But when you change a theme, as you're working on it, you might want to ask Metacity to reload the theme which is currently used on the whole desktop to reflect your changes. You can do this using the little-known <command>metacity-message</command> program, with the command <literal>metacity-message reload-theme</literal>. This works by sending the ClientMessage <literal>_METACITY_RELOAD_THEME_MESSAGE</literal> to the root window, in case you're interested.</para>
|
||||
|
||||
<para>Once you're done with your theme, consider submitting it to <ulink url="http://art.gnome.org/themes/metacity/">the art.gnome.org site</ulink>, or <ulink url="http://www.gnome-look.org/index.php?xcontentmode=101">the gnome-look site</ulink>.</para>
|
||||
|
||||
</chapter>
|
||||
|
||||
<chapter>
|
||||
<title>The future</title>
|
||||
|
||||
<para>Please feel free to link to this so people don't have to keep asking the basic questions and can start asking the deeper ones. One of the important deeper ones is: where should we go in the future? Since this format is becoming something of a de facto standard between window managers, should we set up some kind of freedesktop.org standards discussion? Would it be useful to spin off Metacity's theme parsing code into a separate, LGPL-licensed library so that other applications could use it more easily?</para>
|
||||
<para>What would a version 3 of this format look like? Could we simplify the window / frame_style_set system? (I can imagine abolishing both, and being able to write <literal><frame_style for="normal+unfocused+maximized">…</literal> and having Metacity assume it applied to all resize permissions and shadednesses.) Maybe we should try to do everything with SVG we can? Getting more wild and handwavey, is it worth keeping XML-like? Maybe if other window managers were dealing with the files, .ini-style files would be more universally useful? Or perhaps not. And then of course we need a decent graphical editor for it. I have a few ideas, but if anyone fancies jumping in...</para>
|
||||
</chapter>
|
||||
|
||||
</book>
|
||||
|
||||
|
24
doc/creating_themes/Makefile.am
Normal file
24
doc/creating_themes/Makefile.am
Normal file
@@ -0,0 +1,24 @@
|
||||
### This part of Makefile.am can be customized by you.
|
||||
|
||||
# gnome-doc-utils standard variables:
|
||||
include $(top_srcdir)/gnome-doc-utils.make
|
||||
dist-hook: doc-dist-hook
|
||||
|
||||
# The name of the directory in /usr/share/gnome/help/,
|
||||
# and the name of the main .xml file:
|
||||
DOC_MODULE = creating-metacity-themes
|
||||
|
||||
# The names of any files included via entity declarations.
|
||||
DOC_ENTITIES =
|
||||
|
||||
# The names of any files included by xincluded (preferred):
|
||||
DOC_INCLUDES =
|
||||
|
||||
# The names of any pictures:
|
||||
DOC_FIGURES =
|
||||
|
||||
# The names of any locales for which documentation translations exist:
|
||||
DOC_LINGUAS =
|
||||
|
||||
|
||||
|
@@ -1,3 +1,4 @@
|
||||
man_MANS = metacity.1 metacity-theme-viewer.1 metacity-window-demo.1
|
||||
man_MANS = metacity.1 metacity-theme-viewer.1 \
|
||||
metacity-window-demo.1 metacity-message.1
|
||||
|
||||
EXTRA_DIST = $(man_MANS)
|
||||
|
60
doc/man/metacity-message.1
Normal file
60
doc/man/metacity-message.1
Normal file
@@ -0,0 +1,60 @@
|
||||
.\" Hey, EMACS: -*- nroff -*-
|
||||
.\" First parameter, NAME, should be all caps
|
||||
.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
|
||||
.\" other parameters are allowed: see man(7), man(1)
|
||||
.\" -----
|
||||
.\" This file was confirmed to be licenced under the GPL
|
||||
.\" by its author and copyright holder, Akira TAGOH, on June 1st 2008:
|
||||
.\"
|
||||
.\" > I'm comfortable with DFSG-free. that sounds great if you think it's
|
||||
.\" > useful and worth containing it in upstream.
|
||||
.\" ...
|
||||
.\" > Right I know. any licenses that is DFSG-free, I'm ok with whatever,
|
||||
.\" > since I have contributed that for Debian. so GPL is no problem for me.
|
||||
.\" -----
|
||||
.TH METACITY\-MESSAGE 1 "28 August 2002"
|
||||
.\" Please adjust this date whenever revising the manpage.
|
||||
.\"
|
||||
.\" Some roff macros, for reference:
|
||||
.\" .nh disable hyphenation
|
||||
.\" .hy enable hyphenation
|
||||
.\" .ad l left justify
|
||||
.\" .ad b justify to both left and right margins
|
||||
.\" .nf disable filling
|
||||
.\" .fi enable filling
|
||||
.\" .br insert line break
|
||||
.\" .sp <n> insert n+1 empty lines
|
||||
.\" for manpage-specific macros, see man(7)
|
||||
.SH NAME
|
||||
METACITY\-MESSAGE \- a command to send a message to Metacity
|
||||
.SH SYNOPSIS
|
||||
.B METACITY\-MESSAGE
|
||||
[restart|reload\-theme|enable\-keybindings|disable\-keybindings]
|
||||
.SH DESCRIPTION
|
||||
This manual page documents briefly the
|
||||
.B metacity\-message\fP.
|
||||
This manual page was written for the Debian distribution
|
||||
because the original program does not have a manual page.
|
||||
.PP
|
||||
.\" TeX users may be more comfortable with the \fB<whatever>\fP and
|
||||
.\" \fI<whatever>\fP escape sequences to invode bold face and italics,
|
||||
.\" respectively.
|
||||
\fBmetacity\-message\fP send a specified message to \fBmetacity\fP(1).
|
||||
.SH OPTIONS
|
||||
.TP
|
||||
.B restart
|
||||
Restart \fBmetacity\fP(1) which is running.
|
||||
.TP
|
||||
.B reload-theme
|
||||
Reload a theme which is specified on gconf database.
|
||||
.TP
|
||||
.B enable-keybindings
|
||||
Enable all of keybindings which is specified on gconf database.
|
||||
.TP
|
||||
.B disable-keybindings
|
||||
Disable all of keybindings which is specified on gconf database.
|
||||
.SH SEE ALSO
|
||||
.BR metacity (1)
|
||||
.SH AUTHOR
|
||||
This manual page was written by Akira TAGOH <tagoh@debian.org>,
|
||||
for the Debian GNU/Linux system (but may be used by others).
|
710
metacity.doap
Normal file
710
metacity.doap
Normal file
@@ -0,0 +1,710 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<Project
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns="http://usefulinc.com/ns/doap#"
|
||||
xmlns:foaf="http://xmlns.com/foaf/0.1/"
|
||||
xmlns:admin="http://webns.net/mvcb/">
|
||||
|
||||
<name>The Metacity Window Manager</name>
|
||||
<shortname>Metacity</shortname>
|
||||
|
||||
<!-- It's a blog. Metacity has no homepage. -->
|
||||
<homepage rdf:resource="http://blogs.gnome.org/metacity/" />
|
||||
|
||||
<!-- The date when the source control was initialised. -->
|
||||
<created>2001-05-30</created>
|
||||
|
||||
<shortdesc xml:lang="en">
|
||||
Metacity is a simple compositing window manager that integrates nicely with GNOME 2.
|
||||
</shortdesc>
|
||||
<description xml:lang="en">
|
||||
A window manager for GNOME, with a focus on simplicity and usability
|
||||
rather than novelties or gimmicks. It uses GTK+ 2 for drawing window frames,
|
||||
so that it inherits colours, fonts, and so on from the GTK+ theme. Its author
|
||||
has characterised it as a "boring window manager for the adult in you.
|
||||
Many window managers are like Marshmallow Froot Loops; Metacity is like Cheerios."
|
||||
</description>
|
||||
|
||||
<!-- I haven't found anything appropriate; I made this up. -->
|
||||
<category>window-manager</category>
|
||||
|
||||
<wiki rdf:resource="http://live.gnome.org/Metacity" />
|
||||
<bug-database rdf:resource="http://bugzilla.gnome.org/browse.cgi?product=metacity" />
|
||||
<screenshots rdf:resource="http://commons.wikimedia.org/wiki/Image:Metacity-screenshot.png" />
|
||||
|
||||
<mailing-list rdf:resource="http://mail.gnome.org/mailman/listinfo/metacity-devel-list" />
|
||||
|
||||
<programming-language>C</programming-language>
|
||||
<license rdf:resource="http://usefulinc.com/doap/licenses/gpl" />
|
||||
<download-page rdf:resource="http://download.gnome.org/sources/metacity/" />
|
||||
|
||||
<repository>
|
||||
<SVNRepository>
|
||||
<location rdf:resource="http://svn.gnome.org/svn/metacity" />
|
||||
<browse rdf:resource="http://svn.gnome.org/viewvc/metacity/" />
|
||||
</SVNRepository>
|
||||
</repository>
|
||||
|
||||
<author>
|
||||
<foaf:Person>
|
||||
<foaf:name>Havoc Pennington</foaf:name>
|
||||
</foaf:Person>
|
||||
</author>
|
||||
|
||||
<maintainer>
|
||||
<foaf:Person>
|
||||
<foaf:name>Elijah Newren</foaf:name>
|
||||
</foaf:Person>
|
||||
</maintainer>
|
||||
|
||||
<maintainer>
|
||||
<foaf:Person>
|
||||
<foaf:name>Thomas Thurman</foaf:name>
|
||||
<foaf:mbox rdf:resource="mailto:tthurman@gnome.org"/>
|
||||
</foaf:Person>
|
||||
</maintainer>
|
||||
|
||||
<release><Version>
|
||||
<name>2.25.1 release</name>
|
||||
<created>2008-09-01</created>
|
||||
<branch></branch>
|
||||
<revision>2.25.1</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.25/2.25.1.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.25/2.25.1.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.25.0 release</name>
|
||||
<created>2008-08-18</created>
|
||||
<branch></branch>
|
||||
<revision>2.25.0</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.25/2.25.0.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.25/2.25.0.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.23.89 release</name>
|
||||
<created>2008-08-04</created>
|
||||
<branch></branch>
|
||||
<revision>2.23.89</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.23/2.23.89.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.23/2.23.89.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.23.55 release</name>
|
||||
<created>2008-07-14</created>
|
||||
<branch></branch>
|
||||
<revision>2.23.55</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.23/2.23.55.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.23/2.23.55.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.23.34 release</name>
|
||||
<created>2008-06-16</created>
|
||||
<branch></branch>
|
||||
<revision>2.23.34</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.23/2.23.34.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.23/2.23.34.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.23.34 release</name>
|
||||
<created>2008-06-16</created>
|
||||
<branch></branch>
|
||||
<revision>2.23.34</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.23/2.23.34.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.23/2.23.34.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.23.34 release</name>
|
||||
<created>2008-06-02</created>
|
||||
<branch></branch>
|
||||
<revision>2.23.34</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.23/2.23.34.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.23/2.23.34.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.23.21 release</name>
|
||||
<created>2008-05-26</created>
|
||||
<branch></branch>
|
||||
<revision>2.23.21</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.23/2.23.21.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.23/2.23.21.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.23.13 release</name>
|
||||
<created>2008-04-27</created>
|
||||
<branch></branch>
|
||||
<revision>2.23.13</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.23/2.23.13.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.23/2.23.13.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.23.8 release</name>
|
||||
<created>2008-04-22</created>
|
||||
<branch></branch>
|
||||
<revision>2.23.8</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.23/2.23.8.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.23/2.23.8.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.23.5 release</name>
|
||||
<created>2008-04-06</created>
|
||||
<branch></branch>
|
||||
<revision>2.23.5</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.23/2.23.5.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.23/2.23.5.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.23.3 release</name>
|
||||
<created>2008-03-21</created>
|
||||
<branch></branch>
|
||||
<revision>2.23.3</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.23/2.23.3.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.23/2.23.3.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.23.2 release</name>
|
||||
<created>2008-03-07</created>
|
||||
<branch></branch>
|
||||
<revision>2.23.2</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.23/2.23.2.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.23/2.23.2.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.23.1 release</name>
|
||||
<created>2008-03-06</created>
|
||||
<branch></branch>
|
||||
<revision>2.23.1</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.23/2.23.1.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.23/2.23.1.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.23.0 release</name>
|
||||
<created>2008-02-26</created>
|
||||
<branch></branch>
|
||||
<revision>2.23.0</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.23/2.23.0.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.23/2.23.0.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.21.13 release</name>
|
||||
<created>2008-02-11</created>
|
||||
<branch></branch>
|
||||
<revision>2.21.13</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.21/2.21.13.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.21/2.21.13.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.21.8 release</name>
|
||||
<created>2008-02-03</created>
|
||||
<branch></branch>
|
||||
<revision>2.21.8</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.21/2.21.8.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.21/2.21.8.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.21.5 release</name>
|
||||
<created>2007-12-19</created>
|
||||
<branch></branch>
|
||||
<revision>2.21.5</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.21/2.21.5.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.21/2.21.5.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.21.3 release</name>
|
||||
<created>2007-12-14</created>
|
||||
<branch></branch>
|
||||
<revision>2.21.3</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.21/2.21.3.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.21/2.21.3.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.21.2 release</name>
|
||||
<created>2007-11-17</created>
|
||||
<branch></branch>
|
||||
<revision>2.21.2</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.21/2.21.2.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.21/2.21.2.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.21.1 release</name>
|
||||
<created>2007-11-11</created>
|
||||
<branch></branch>
|
||||
<revision>2.21.1</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.21/2.21.1.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.21/2.21.1.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.20.0 release</name>
|
||||
<created>2007-09-15</created>
|
||||
<branch></branch>
|
||||
<revision>2.20.0</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.20/2.20.0.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.20/2.20.0.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.19.55 release</name>
|
||||
<created>2007-08-07</created>
|
||||
<branch></branch>
|
||||
<revision>2.19.55</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.19/2.19.55.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.19/2.19.55.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.19.34 release</name>
|
||||
<created>2007-07-22</created>
|
||||
<branch></branch>
|
||||
<revision>2.19.34</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.19/2.19.34.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.19/2.19.34.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.19.21 release</name>
|
||||
<created>2007-06-18</created>
|
||||
<branch></branch>
|
||||
<revision>2.19.21</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.19/2.19.21.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.19/2.19.21.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.19.13 release</name>
|
||||
<created>2007-06-10</created>
|
||||
<branch></branch>
|
||||
<revision>2.19.13</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.19/2.19.13.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.19/2.19.13.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.19.8 release</name>
|
||||
<created>2007-06-04</created>
|
||||
<branch></branch>
|
||||
<revision>2.19.8</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.19/2.19.8.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.19/2.19.8.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.19.5 release</name>
|
||||
<created>2007-04-23</created>
|
||||
<branch></branch>
|
||||
<revision>2.19.5</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.19/2.19.5.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.19/2.19.5.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.19.3 release</name>
|
||||
<created>2007-04-16</created>
|
||||
<branch></branch>
|
||||
<revision>2.19.3</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.19/2.19.3.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.19/2.19.3.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.19.2 release</name>
|
||||
<created>2007-04-09</created>
|
||||
<branch></branch>
|
||||
<revision>2.19.2</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.19/2.19.2.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.19/2.19.2.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.19.1 release</name>
|
||||
<created>2007-04-04</created>
|
||||
<branch></branch>
|
||||
<revision>2.19.1</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.19/2.19.1.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.19/2.19.1.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.17.3 release</name>
|
||||
<created>2006-12-10</created>
|
||||
<branch></branch>
|
||||
<revision>2.17.3</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.17/2.17.3.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.17/2.17.3.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.17.2 release</name>
|
||||
<created>2006-11-06</created>
|
||||
<branch></branch>
|
||||
<revision>2.17.2</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.17/2.17.2.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.17/2.17.2.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.17.1 release</name>
|
||||
<created>2006-10-16</created>
|
||||
<branch></branch>
|
||||
<revision>2.17.1</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.17/2.17.1.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.17/2.17.1.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.17.0 release</name>
|
||||
<created>2006-10-07</created>
|
||||
<branch></branch>
|
||||
<revision>2.17.0</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.17/2.17.0.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.17/2.17.0.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.16.2 release</name>
|
||||
<created>2006-09-18</created>
|
||||
<branch></branch>
|
||||
<revision>2.16.2</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.16/2.16.2.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.16/2.16.2.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.16.1 release</name>
|
||||
<created>2006-09-11</created>
|
||||
<branch></branch>
|
||||
<revision>2.16.1</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.16/2.16.1.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.16/2.16.1.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.16.0 release</name>
|
||||
<created>2006-09-04</created>
|
||||
<branch></branch>
|
||||
<revision>2.16.0</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.16/2.16.0.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.16/2.16.0.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.15.34 release</name>
|
||||
<created>2006-08-21</created>
|
||||
<branch></branch>
|
||||
<revision>2.15.34</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.15/2.15.34.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.15/2.15.34.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.15.21 release</name>
|
||||
<created>2006-08-07</created>
|
||||
<branch></branch>
|
||||
<revision>2.15.21</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.15/2.15.21.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.15/2.15.21.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.15.13 release</name>
|
||||
<created>2006-07-24</created>
|
||||
<branch></branch>
|
||||
<revision>2.15.13</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.15/2.15.13.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.15/2.15.13.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.15.8 release</name>
|
||||
<created>2006-07-10</created>
|
||||
<branch></branch>
|
||||
<revision>2.15.8</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.15/2.15.8.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.15/2.15.8.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.15.5 release</name>
|
||||
<created>2006-06-12</created>
|
||||
<branch></branch>
|
||||
<revision>2.15.5</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.15/2.15.5.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.15/2.15.5.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.15.3 release</name>
|
||||
<created>2006-05-15</created>
|
||||
<branch></branch>
|
||||
<revision>2.15.3</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.15/2.15.3.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.15/2.15.3.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.15.2 release</name>
|
||||
<created>2006-04-25</created>
|
||||
<branch></branch>
|
||||
<revision>2.15.2</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.15/2.15.2.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.15/2.15.2.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.15.1 release</name>
|
||||
<created>2006-04-25</created>
|
||||
<branch></branch>
|
||||
<revision>2.15.1</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.15/2.15.1.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.15/2.15.1.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.15.0 release</name>
|
||||
<created>2006-04-24</created>
|
||||
<branch></branch>
|
||||
<revision>2.15.0</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.15/2.15.0.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.15/2.15.0.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.13.89 release</name>
|
||||
<created>2006-02-13</created>
|
||||
<branch></branch>
|
||||
<revision>2.13.89</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.13/2.13.89.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.13/2.13.89.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.13.55 release</name>
|
||||
<created>2006-01-30</created>
|
||||
<branch></branch>
|
||||
<revision>2.13.55</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.13/2.13.55.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.13/2.13.55.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.13.34 release</name>
|
||||
<created>2006-01-20</created>
|
||||
<branch></branch>
|
||||
<revision>2.13.34</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.13/2.13.34.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.13/2.13.34.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.13.21 release</name>
|
||||
<created>2006-01-16</created>
|
||||
<branch></branch>
|
||||
<revision>2.13.21</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.13/2.13.21.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.13/2.13.21.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.13.13 release</name>
|
||||
<created>2006-01-10</created>
|
||||
<branch></branch>
|
||||
<revision>2.13.13</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.13/2.13.13.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.13/2.13.13.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.13.8 release</name>
|
||||
<created>2006-01-02</created>
|
||||
<branch></branch>
|
||||
<revision>2.13.8</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.13/2.13.8.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.13/2.13.8.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.13.5 release</name>
|
||||
<created>2005-12-12</created>
|
||||
<branch></branch>
|
||||
<revision>2.13.5</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.13/2.13.5.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.13/2.13.5.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.13.3 release</name>
|
||||
<created>2005-11-22</created>
|
||||
<branch></branch>
|
||||
<revision>2.13.3</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.13/2.13.3.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.13/2.13.3.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.13.2 release</name>
|
||||
<created>2005-11-19</created>
|
||||
<branch></branch>
|
||||
<revision>2.13.2</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.13/2.13.2.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.13/2.13.2.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.13.1 release</name>
|
||||
<created>2005-11-14</created>
|
||||
<branch></branch>
|
||||
<revision>2.13.1</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.13/2.13.1.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.13/2.13.1.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.13.0 release</name>
|
||||
<created>2005-10-24</created>
|
||||
<branch></branch>
|
||||
<revision>2.13.0</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.13/2.13.0.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.13/2.13.0.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.12.1 release</name>
|
||||
<created>2005-10-03</created>
|
||||
<branch></branch>
|
||||
<revision>2.12.1</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.12/2.12.1.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.12/2.12.1.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.12.0 release</name>
|
||||
<created>2005-09-05</created>
|
||||
<branch></branch>
|
||||
<revision>2.12.0</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.12/2.12.0.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.12/2.12.0.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.11.3 release</name>
|
||||
<created>2005-08-22</created>
|
||||
<branch></branch>
|
||||
<revision>2.11.3</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.11/2.11.3.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.11/2.11.3.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.11.2 release</name>
|
||||
<created>2005-08-08</created>
|
||||
<branch></branch>
|
||||
<revision>2.11.2</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.11/2.11.2.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.11/2.11.2.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.11.1 release</name>
|
||||
<created>2005-07-24</created>
|
||||
<branch></branch>
|
||||
<revision>2.11.1</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.11/2.11.1.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.11/2.11.1.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.11.0 release</name>
|
||||
<created>2005-07-12</created>
|
||||
<branch></branch>
|
||||
<revision>2.11.0</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.11/2.11.0.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.11/2.11.0.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.10.2 release</name>
|
||||
<created>2005-06-27</created>
|
||||
<branch></branch>
|
||||
<revision>2.10.2</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.10/2.10.2.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.10/2.10.2.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.10.1 release</name>
|
||||
<created>2005-04-11</created>
|
||||
<branch></branch>
|
||||
<revision>2.10.1</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.10/2.10.1.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.10/2.10.1.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.10.0 release</name>
|
||||
<created>2005-03-07</created>
|
||||
<branch></branch>
|
||||
<revision>2.10.0</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.10/2.10.0.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.10/2.10.0.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.8.5 release</name>
|
||||
<created>2004-09-13</created>
|
||||
<branch></branch>
|
||||
<revision>2.8.5</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.8/2.8.5.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.8/2.8.5.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.8.5 release</name>
|
||||
<created>2004-09-13</created>
|
||||
<branch></branch>
|
||||
<revision>2.8.5</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.8/2.8.5.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.8/2.8.5.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.8.4 release</name>
|
||||
<created>2004-08-29</created>
|
||||
<branch></branch>
|
||||
<revision>2.8.4</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.8/2.8.4.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.8/2.8.4.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<release><Version>
|
||||
<name>2.8.3 release</name>
|
||||
<created>2004-08-15</created>
|
||||
<branch></branch>
|
||||
<revision>2.8.3</revision>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.8/2.8.3.tar.gz"/>
|
||||
<file-release rdf:resource="http://download.gnome.org/sources/metacity/2.8/2.8.3.tar.bz2"/>
|
||||
</Version></release>
|
||||
|
||||
<!-- earlier ones not yet documented, and will have to be added by hand -->
|
||||
|
||||
</Project>
|
837
po/ChangeLog
837
po/ChangeLog
File diff suppressed because it is too large
Load Diff
10
po/LINGUAS
10
po/LINGUAS
@@ -2,6 +2,8 @@
|
||||
#
|
||||
am
|
||||
ar
|
||||
as
|
||||
ast
|
||||
az
|
||||
be
|
||||
be@latin
|
||||
@@ -10,6 +12,7 @@ bn
|
||||
bn_IN
|
||||
bs
|
||||
ca
|
||||
ca@valencia
|
||||
cs
|
||||
cy
|
||||
da
|
||||
@@ -27,18 +30,22 @@ fr
|
||||
ga
|
||||
gl
|
||||
gu
|
||||
ha
|
||||
he
|
||||
hi
|
||||
hr
|
||||
hu
|
||||
hy
|
||||
id
|
||||
ig
|
||||
is
|
||||
it
|
||||
ja
|
||||
ka
|
||||
kn
|
||||
ko
|
||||
ku
|
||||
la
|
||||
lt
|
||||
lv
|
||||
mg
|
||||
@@ -65,7 +72,7 @@ sk
|
||||
sl
|
||||
sq
|
||||
sr
|
||||
sr@Latn
|
||||
sr@latin
|
||||
sv
|
||||
ta
|
||||
th
|
||||
@@ -75,6 +82,7 @@ uk
|
||||
vi
|
||||
wa
|
||||
xh
|
||||
yo
|
||||
zh_CN
|
||||
zh_HK
|
||||
zh_TW
|
||||
|
@@ -2,28 +2,31 @@
|
||||
# Please keep this file sorted alphabetically.
|
||||
src/50-metacity-desktop-key.xml.in
|
||||
src/50-metacity-key.xml.in
|
||||
src/tools/metacity-message.c
|
||||
src/core.c
|
||||
src/delete.c
|
||||
src/display.c
|
||||
src/errors.c
|
||||
src/frames.c
|
||||
src/keybindings.c
|
||||
src/main.c
|
||||
src/menu.c
|
||||
src/metaaccellabel.c
|
||||
src/metacity-dialog.c
|
||||
src/core/core.c
|
||||
src/core/delete.c
|
||||
src/core/display.c
|
||||
src/core/errors.c
|
||||
src/core/keybindings.c
|
||||
src/core/main.c
|
||||
src/core/prefs.c
|
||||
src/core/screen.c
|
||||
src/core/schema-bindings.c
|
||||
src/core/session.c
|
||||
src/core/util.c
|
||||
src/core/window.c
|
||||
src/core/window-props.c
|
||||
src/core/xprops.c
|
||||
src/include/all-keybindings.h
|
||||
src/metacity.desktop.in
|
||||
src/metacity.schemas.in
|
||||
src/prefs.c
|
||||
src/resizepopup.c
|
||||
src/screen.c
|
||||
src/session.c
|
||||
src/theme-parser.c
|
||||
src/theme-viewer.c
|
||||
src/theme.c
|
||||
src/util.c
|
||||
src/window-props.c
|
||||
src/window.c
|
||||
src/workspace.c
|
||||
src/xprops.c
|
||||
src/metacity.schemas.in.in
|
||||
src/metacity-wm.desktop.in
|
||||
src/tools/metacity-message.c
|
||||
src/ui/frames.c
|
||||
src/ui/menu.c
|
||||
src/ui/metaaccellabel.c
|
||||
src/ui/metacity-dialog.c
|
||||
src/ui/resizepopup.c
|
||||
src/ui/theme.c
|
||||
src/ui/theme-parser.c
|
||||
src/ui/theme-viewer.c
|
||||
|
||||
|
2
po/POTFILES.skip
Normal file
2
po/POTFILES.skip
Normal file
@@ -0,0 +1,2 @@
|
||||
src/metacity.schemas.in
|
||||
|
1823
po/be@latin.po
1823
po/be@latin.po
File diff suppressed because it is too large
Load Diff
4079
po/ca@valencia.po
Normal file
4079
po/ca@valencia.po
Normal file
File diff suppressed because it is too large
Load Diff
5835
po/pt_BR.po
5835
po/pt_BR.po
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
5997
po/zh_CN.po
5997
po/zh_CN.po
File diff suppressed because it is too large
Load Diff
2123
po/zh_HK.po
2123
po/zh_HK.po
File diff suppressed because it is too large
Load Diff
2156
po/zh_TW.po
2156
po/zh_TW.po
File diff suppressed because it is too large
Load Diff
@@ -9,6 +9,7 @@ testboxes
|
||||
testgradient
|
||||
inlinepixbufs.h
|
||||
metacity.desktop
|
||||
metacity-wm.desktop
|
||||
metacity.schemas
|
||||
libmetacity-private.pc
|
||||
testasyncgetprop
|
||||
|
305
src/Makefile.am
305
src/Makefile.am
@@ -2,160 +2,211 @@ lib_LTLIBRARIES = libmetacity-private.la
|
||||
|
||||
SUBDIRS=wm-tester tools themes
|
||||
|
||||
INCLUDES=@METACITY_CFLAGS@ -DMETACITY_LIBEXECDIR=\"$(libexecdir)\" -DHOST_ALIAS=\"@HOST_ALIAS@\" -DMETACITY_LOCALEDIR=\"$(prefix)/@DATADIRNAME@/locale\" -DMETACITY_PKGDATADIR=\"$(pkgdatadir)\" -DMETACITY_DATADIR=\"$(datadir)\" -DG_LOG_DOMAIN=\"metacity\" -DSN_API_NOT_YET_FROZEN=1
|
||||
if WITH_CLUTTER
|
||||
SUBDIRS += compositor/mutter/plugins
|
||||
endif
|
||||
|
||||
INCLUDES=@METACITY_CFLAGS@ -I $(srcdir)/include -I$(srcdir)/compositor -DMETACITY_LIBEXECDIR=\"$(libexecdir)\" -DHOST_ALIAS=\"@HOST_ALIAS@\" -DMETACITY_LOCALEDIR=\"$(prefix)/@DATADIRNAME@/locale\" -DMETACITY_PKGDATADIR=\"$(pkgdatadir)\" -DMETACITY_DATADIR=\"$(datadir)\" -DG_LOG_DOMAIN=\"metacity\" -DSN_API_NOT_YET_FROZEN=1 -DMETACITY_MAJOR_VERSION=$(METACITY_MAJOR_VERSION) -DMETACITY_MINOR_VERSION=$(METACITY_MINOR_VERSION) -DMETACITY_MICRO_VERSION=$(METACITY_MICRO_VERSION) -DMETACITY_CLUTTER_PLUGIN_API_VERSION=$(METACITY_CLUTTER_PLUGIN_API_VERSION) -DMETACITY_PKGLIBDIR=\"$(pkglibdir)\" -DMUTTER_PLUGIN_DIR=\"@MUTTER_PLUGIN_DIR@\"
|
||||
|
||||
metacity_SOURCES= \
|
||||
async-getprop.c \
|
||||
async-getprop.h \
|
||||
bell.h \
|
||||
bell.c \
|
||||
boxes.h \
|
||||
boxes.c \
|
||||
common.h \
|
||||
c-screen.c \
|
||||
c-screen.h \
|
||||
c-window.c \
|
||||
c-window.h \
|
||||
compositor.c \
|
||||
compositor.h \
|
||||
constraints.c \
|
||||
constraints.h \
|
||||
core.c \
|
||||
core.h \
|
||||
delete.c \
|
||||
display.c \
|
||||
display.h \
|
||||
draw-workspace.c \
|
||||
draw-workspace.h \
|
||||
edge-resistance.c \
|
||||
edge-resistance.h \
|
||||
effects.c \
|
||||
effects.h \
|
||||
errors.c \
|
||||
errors.h \
|
||||
eventqueue.c \
|
||||
eventqueue.h \
|
||||
fixedtip.c \
|
||||
fixedtip.h \
|
||||
frame.c \
|
||||
frame.h \
|
||||
frames.c \
|
||||
frames.h \
|
||||
gradient.c \
|
||||
gradient.h \
|
||||
group.c \
|
||||
group.h \
|
||||
group-private.h \
|
||||
group-props.c \
|
||||
group-props.h \
|
||||
iconcache.c \
|
||||
iconcache.h \
|
||||
core/async-getprop.c \
|
||||
core/async-getprop.h \
|
||||
core/bell.c \
|
||||
core/bell.h \
|
||||
core/boxes.c \
|
||||
include/boxes.h \
|
||||
compositor/compositor.c \
|
||||
compositor/compositor-private.h \
|
||||
compositor/compositor-xrender.c \
|
||||
compositor/compositor-xrender.h \
|
||||
include/compositor.h \
|
||||
core/constraints.c \
|
||||
core/constraints.h \
|
||||
core/core.c \
|
||||
core/delete.c \
|
||||
core/display.c \
|
||||
core/display-private.h \
|
||||
include/display.h \
|
||||
ui/draw-workspace.c \
|
||||
ui/draw-workspace.h \
|
||||
core/edge-resistance.c \
|
||||
core/edge-resistance.h \
|
||||
core/effects.c \
|
||||
core/effects.h \
|
||||
core/errors.c \
|
||||
include/errors.h \
|
||||
core/eventqueue.c \
|
||||
core/eventqueue.h \
|
||||
core/frame.c \
|
||||
core/frame-private.h \
|
||||
include/frame.h \
|
||||
ui/gradient.c \
|
||||
ui/gradient.h \
|
||||
core/group-private.h \
|
||||
core/group-props.c \
|
||||
core/group-props.h \
|
||||
core/group.c \
|
||||
include/group.h \
|
||||
core/iconcache.c \
|
||||
core/iconcache.h \
|
||||
core/keybindings.c \
|
||||
core/keybindings-private.h \
|
||||
core/main.c \
|
||||
include/main.h \
|
||||
core/metacity-Xatomtype.h \
|
||||
core/place.c \
|
||||
core/place.h \
|
||||
core/prefs.c \
|
||||
include/prefs.h \
|
||||
core/screen.c \
|
||||
core/screen-private.h \
|
||||
include/screen.h \
|
||||
include/types.h \
|
||||
core/session.c \
|
||||
core/session.h \
|
||||
core/stack.c \
|
||||
core/stack.h \
|
||||
core/util.c \
|
||||
include/util.h \
|
||||
core/window-props.c \
|
||||
core/window-props.h \
|
||||
core/window.c \
|
||||
core/window-private.h \
|
||||
include/window.h \
|
||||
core/workspace.c \
|
||||
core/workspace-private.h \
|
||||
core/xprops.c \
|
||||
include/xprops.h \
|
||||
include/common.h \
|
||||
include/core.h \
|
||||
include/ui.h \
|
||||
inlinepixbufs.h \
|
||||
keybindings.c \
|
||||
keybindings.h \
|
||||
main.c \
|
||||
main.h \
|
||||
menu.c \
|
||||
menu.h \
|
||||
metaaccellabel.c \
|
||||
metaaccellabel.h \
|
||||
metacity-Xatomtype.h \
|
||||
place.c \
|
||||
place.h \
|
||||
prefs.c \
|
||||
prefs.h \
|
||||
resizepopup.c \
|
||||
resizepopup.h \
|
||||
screen.c \
|
||||
screen.h \
|
||||
session.c \
|
||||
session.h \
|
||||
spring-model.c \
|
||||
spring-model.h \
|
||||
stack.c \
|
||||
stack.h \
|
||||
tabpopup.c \
|
||||
tabpopup.h \
|
||||
theme.c \
|
||||
theme.h \
|
||||
theme-parser.c \
|
||||
theme-parser.h \
|
||||
themewidget.c \
|
||||
themewidget.h \
|
||||
ui.c \
|
||||
ui.h \
|
||||
util.c \
|
||||
util.h \
|
||||
window.c \
|
||||
window.h \
|
||||
window-props.c \
|
||||
window-props.h \
|
||||
workspace.c \
|
||||
workspace.h \
|
||||
xprops.c \
|
||||
xprops.h
|
||||
ui/fixedtip.c \
|
||||
ui/fixedtip.h \
|
||||
ui/frames.c \
|
||||
ui/frames.h \
|
||||
ui/menu.c \
|
||||
ui/menu.h \
|
||||
ui/metaaccellabel.c \
|
||||
ui/metaaccellabel.h \
|
||||
ui/resizepopup.c \
|
||||
include/resizepopup.h \
|
||||
ui/tabpopup.c \
|
||||
include/tabpopup.h \
|
||||
ui/theme-parser.c \
|
||||
ui/theme-parser.h \
|
||||
ui/theme.c \
|
||||
ui/theme.h \
|
||||
ui/themewidget.c \
|
||||
ui/themewidget.h \
|
||||
ui/ui.c \
|
||||
include/all-keybindings.h
|
||||
|
||||
if WITH_CLUTTER
|
||||
metacity_SOURCES += \
|
||||
compositor/mutter/compositor-mutter.c \
|
||||
compositor/mutter/mutter-shaped-texture.c \
|
||||
compositor/mutter/mutter-shaped-texture.h \
|
||||
compositor/mutter/mutter-plugin-manager.c \
|
||||
compositor/mutter/mutter-plugin-manager.h \
|
||||
compositor/mutter/tidy/tidy-texture-frame.c \
|
||||
compositor/mutter/tidy/tidy-texture-frame.h \
|
||||
compositor/mutter/mutter-module.c \
|
||||
compositor/mutter/mutter-module.h \
|
||||
compositor/mutter/mutter-plugin.c \
|
||||
include/mutter-plugin.h \
|
||||
include/compositor-mutter.h
|
||||
endif
|
||||
|
||||
# by setting libmetacity_private_la_CFLAGS, the files shared with
|
||||
# metacity proper will be compiled with different names.
|
||||
libmetacity_private_la_CFLAGS =
|
||||
libmetacity_private_la_SOURCES= \
|
||||
boxes.c \
|
||||
boxes.h \
|
||||
gradient.c \
|
||||
gradient.h \
|
||||
preview-widget.c \
|
||||
preview-widget.h \
|
||||
theme.c \
|
||||
theme.h \
|
||||
theme-parser.c \
|
||||
theme-parser.h \
|
||||
util.c \
|
||||
util.h \
|
||||
common.h
|
||||
libmetacity_private_la_SOURCES= \
|
||||
core/boxes.c \
|
||||
include/boxes.h \
|
||||
ui/gradient.c \
|
||||
ui/gradient.h \
|
||||
core/util.c \
|
||||
include/util.h \
|
||||
include/common.h \
|
||||
ui/preview-widget.c \
|
||||
ui/preview-widget.h \
|
||||
ui/theme-parser.c \
|
||||
ui/theme-parser.h \
|
||||
ui/theme.c \
|
||||
ui/theme.h
|
||||
|
||||
libmetacity_private_la_LDFLAGS = -no-undefined
|
||||
libmetacity_private_la_LIBADD = @METACITY_LIBS@
|
||||
|
||||
libmetacityincludedir = $(includedir)/metacity-1/metacity-private
|
||||
|
||||
libmetacityinclude_HEADERS = \
|
||||
boxes.h \
|
||||
common.h \
|
||||
gradient.h \
|
||||
preview-widget.h \
|
||||
theme.h \
|
||||
theme-parser.h \
|
||||
util.h
|
||||
libmetacityinclude_HEADERS = \
|
||||
include/boxes.h \
|
||||
ui/gradient.h \
|
||||
include/util.h \
|
||||
include/common.h \
|
||||
ui/preview-widget.h \
|
||||
ui/theme-parser.h \
|
||||
ui/theme.h \
|
||||
include/atomnames.h \
|
||||
include/prefs.h \
|
||||
include/window.h \
|
||||
include/workspace.h \
|
||||
include/compositor.h \
|
||||
include/compositor-mutter.h \
|
||||
include/types.h \
|
||||
include/screen.h \
|
||||
include/display.h \
|
||||
include/group.h \
|
||||
include/keybindings.h \
|
||||
include/mutter-plugin.h
|
||||
|
||||
metacity_theme_viewer_SOURCES= \
|
||||
theme-viewer.c
|
||||
ui/theme-viewer.c
|
||||
|
||||
metacity_dialog_SOURCES= \
|
||||
metacity-dialog.c
|
||||
ui/metacity-dialog.c
|
||||
|
||||
schema_bindings_SOURCES = \
|
||||
core/schema-bindings.c \
|
||||
metacity.schemas.in.in
|
||||
|
||||
schema_bindings_LDADD = @METACITY_LIBS@
|
||||
metacity.schemas.in: schema_bindings ${srcdir}/metacity.schemas.in.in
|
||||
@echo Generating keybinding schemas... ${srcdir}/metacity.schemas.in.in
|
||||
${builddir}/schema_bindings ${srcdir}/metacity.schemas.in.in ${builddir}/metacity.schemas.in
|
||||
|
||||
bin_PROGRAMS=metacity metacity-theme-viewer
|
||||
libexec_PROGRAMS=metacity-dialog
|
||||
|
||||
EFENCE=
|
||||
metacity_LDADD=@METACITY_LIBS@ $(EFENCE)
|
||||
metacity_LDFLAGS=-export-dynamic
|
||||
metacity_theme_viewer_LDADD= @METACITY_LIBS@ libmetacity-private.la
|
||||
metacity_dialog_LDADD=@METACITY_LIBS@
|
||||
|
||||
testboxes_SOURCES=util.h util.c boxes.h boxes.c testboxes.c
|
||||
testgradient_SOURCES=gradient.h gradient.c testgradient.c
|
||||
testasyncgetprop_SOURCES=async-getprop.h async-getprop.c testasyncgetprop.c
|
||||
testboxes_SOURCES=include/util.h core/util.c include/boxes.h core/boxes.c core/testboxes.c
|
||||
testgradient_SOURCES=ui/gradient.h ui/gradient.c ui/testgradient.c
|
||||
testasyncgetprop_SOURCES=core/async-getprop.h core/async-getprop.c core/testasyncgetprop.c
|
||||
|
||||
noinst_PROGRAMS=testboxes testgradient testasyncgetprop
|
||||
noinst_PROGRAMS=testboxes testgradient testasyncgetprop schema_bindings
|
||||
|
||||
testboxes_LDADD= @METACITY_LIBS@
|
||||
testgradient_LDADD= @METACITY_LIBS@
|
||||
testasyncgetprop_LDADD= @METACITY_LIBS@
|
||||
|
||||
desktopfilesdir=$(datadir)/gnome/wm-properties
|
||||
@INTLTOOL_DESKTOP_RULE@
|
||||
|
||||
desktopfilesdir=$(datadir)/applications
|
||||
desktopfiles_in_files=metacity.desktop.in
|
||||
desktopfiles_files=$(desktopfiles_in_files:.desktop.in=.desktop)
|
||||
desktopfiles_DATA = $(desktopfiles_files)
|
||||
@INTLTOOL_DESKTOP_RULE@
|
||||
|
||||
wmpropertiesdir=$(datadir)/gnome/wm-properties
|
||||
wmproperties_in_files=metacity-wm.desktop.in
|
||||
wmproperties_files=$(wmproperties_in_files:.desktop.in=.desktop)
|
||||
wmproperties_DATA = $(wmproperties_files)
|
||||
|
||||
schemadir = @GCONF_SCHEMA_FILE_DIR@
|
||||
schema_in_files = metacity.schemas.in
|
||||
@@ -176,26 +227,28 @@ else
|
||||
install-data-local:
|
||||
endif
|
||||
|
||||
IMAGES=default_icon.png stock_maximize.png stock_minimize.png stock_delete.png
|
||||
VARIABLES=default_icon_data $(srcdir)/default_icon.png \
|
||||
stock_maximize_data $(srcdir)/stock_maximize.png \
|
||||
IMAGES=stock_maximize.png stock_minimize.png stock_delete.png
|
||||
VARIABLES=stock_maximize_data $(srcdir)/stock_maximize.png \
|
||||
stock_minimize_data $(srcdir)/stock_minimize.png \
|
||||
stock_delete_data $(srcdir)/stock_delete.png
|
||||
|
||||
BUILT_SOURCES = inlinepixbufs.h
|
||||
CLEANFILES = inlinepixbufs.h metacity.desktop metacity.schemas 50-metacity-desktop-key.xml 50-metacity-key.xml
|
||||
CLEANFILES = inlinepixbufs.h metacity.desktop metacity-wm.desktop metacity.schemas metacity.schemas.in 50-metacity-desktop-key.xml 50-metacity-key.xml
|
||||
|
||||
inlinepixbufs.h: $(IMAGES)
|
||||
$(GDK_PIXBUF_CSOURCE) --raw --build-list $(VARIABLES) >$(srcdir)/inlinepixbufs.h
|
||||
$(GDK_PIXBUF_CSOURCE) --raw --build-list $(VARIABLES) >$(srcdir)/inlinepixbufs.h
|
||||
|
||||
pkgconfigdir = $(libdir)/pkgconfig
|
||||
|
||||
pkgconfig_DATA = libmetacity-private.pc
|
||||
pkgconfig_DATA = libmetacity-private.pc metacity-plugins.pc
|
||||
|
||||
EXTRA_DIST=$(desktopfiles_files) \
|
||||
$(wmproperties_files) \
|
||||
$(IMAGES) $(schema_DATA) \
|
||||
$(desktopfiles_in_files) \
|
||||
$(wmproperties_in_files) \
|
||||
$(schema_in_files) \
|
||||
$(xml_in_files) \
|
||||
libmetacity-private.pc.in
|
||||
libmetacity-private.pc.in \
|
||||
metacity-plugins.pc.in
|
||||
|
||||
|
55
src/api.c
55
src/api.c
@@ -1,55 +0,0 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/* Metacity misc. public entry points */
|
||||
|
||||
/*
|
||||
* Copyright (C) 2001 Havoc Pennington
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include "api.h"
|
||||
#include "display.h"
|
||||
#include "colors.h"
|
||||
|
||||
PangoContext*
|
||||
meta_get_pango_context (Screen *xscreen,
|
||||
const PangoFontDescription *desc)
|
||||
{
|
||||
MetaScreen *screen;
|
||||
|
||||
screen = meta_screen_for_x_screen (xscreen);
|
||||
|
||||
g_return_val_if_fail (screen != NULL, NULL);
|
||||
|
||||
return meta_screen_get_pango_context (screen,
|
||||
desc,
|
||||
/* FIXME, from the frame window */
|
||||
PANGO_DIRECTION_LTR);
|
||||
}
|
||||
|
||||
gulong
|
||||
meta_get_x_pixel (Screen *xscreen, const PangoColor *color)
|
||||
{
|
||||
MetaScreen *screen;
|
||||
|
||||
screen = meta_screen_for_x_screen (xscreen);
|
||||
|
||||
g_return_val_if_fail (screen != NULL, 0);
|
||||
|
||||
return meta_screen_get_x_pixel (screen, color);
|
||||
}
|
||||
|
64
src/api.h
64
src/api.h
@@ -1,64 +0,0 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/* Metacity misc. public entry points */
|
||||
|
||||
/*
|
||||
* Copyright (C) 2001 Havoc Pennington
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef META_API_H
|
||||
#define META_API_H
|
||||
|
||||
/* don't add any internal headers here; api.h is an installed/public
|
||||
* header. Only theme.h is also installed.
|
||||
*/
|
||||
#include <X11/Xlib.h>
|
||||
#include <pango/pangox.h>
|
||||
|
||||
/* Colors/state stuff matches GTK since we get the info from
|
||||
* the GTK UI slave
|
||||
*/
|
||||
typedef struct _MetaUIColors MetaUIColors;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
META_STATE_NORMAL,
|
||||
META_STATE_ACTIVE,
|
||||
META_STATE_PRELIGHT,
|
||||
META_STATE_SELECTED,
|
||||
META_STATE_INSENSITIVE
|
||||
} MetaUIState;
|
||||
|
||||
struct _MetaUIColors
|
||||
{
|
||||
PangoColor fg[5];
|
||||
PangoColor bg[5];
|
||||
PangoColor light[5];
|
||||
PangoColor dark[5];
|
||||
PangoColor mid[5];
|
||||
PangoColor text[5];
|
||||
PangoColor base[5];
|
||||
PangoColor text_aa[5];
|
||||
};
|
||||
|
||||
PangoContext* meta_get_pango_context (Screen *xscreen,
|
||||
const PangoFontDescription *desc);
|
||||
gulong meta_get_x_pixel (Screen *xscreen,
|
||||
const PangoColor *color);
|
||||
|
||||
#endif
|
677
src/c-screen.c
677
src/c-screen.c
@@ -1,677 +0,0 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/*
|
||||
* Copyright (C) 2006 Red Hat, Inc.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#ifdef HAVE_COMPOSITE_EXTENSIONS
|
||||
#include <cm/ws.h>
|
||||
#include <cm/stacker.h>
|
||||
#include <cm/wsint.h>
|
||||
#include <cm/drawable-node.h>
|
||||
#include <cm/state.h>
|
||||
#include <cm/magnifier.h>
|
||||
#include <cm/square.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "screen.h"
|
||||
#include "c-screen.h"
|
||||
#include "c-window.h"
|
||||
|
||||
struct MetaCompScreen
|
||||
{
|
||||
WsDisplay *display;
|
||||
CmStacker *stacker;
|
||||
CmMagnifier *magnifier;
|
||||
|
||||
WsWindow *gl_window;
|
||||
WsWindow *root_window;
|
||||
|
||||
WsScreen *screen;
|
||||
MetaScreen *meta_screen;
|
||||
|
||||
int repaint_id;
|
||||
int idle_id;
|
||||
|
||||
WsWindow *selection_window;
|
||||
|
||||
GHashTable *windows_by_xid;
|
||||
};
|
||||
|
||||
static MetaCompWindow *
|
||||
meta_comp_window_lookup (MetaCompScreen *info,
|
||||
Window xid)
|
||||
{
|
||||
MetaCompWindow *window;
|
||||
|
||||
window = g_hash_table_lookup (info->windows_by_xid, (gpointer)xid);
|
||||
|
||||
return window;
|
||||
}
|
||||
|
||||
MetaCompWindow *
|
||||
meta_comp_screen_lookup_window (MetaCompScreen *info,
|
||||
Window xwindow)
|
||||
{
|
||||
return meta_comp_window_lookup (info, xwindow);
|
||||
}
|
||||
|
||||
#if 0
|
||||
static void
|
||||
update_frame_counter (void)
|
||||
{
|
||||
#define BUFSIZE 128
|
||||
static GTimer *timer;
|
||||
static double buffer [BUFSIZE];
|
||||
static int next = 0;
|
||||
|
||||
if (!timer)
|
||||
timer = g_timer_new ();
|
||||
|
||||
buffer[next++] = g_timer_elapsed (timer, NULL);
|
||||
|
||||
if (next == BUFSIZE)
|
||||
{
|
||||
int i;
|
||||
double total;
|
||||
|
||||
next = 0;
|
||||
|
||||
total = 0.0;
|
||||
for (i = 1; i < BUFSIZE; ++i)
|
||||
total += buffer[i] - buffer[i - 1];
|
||||
|
||||
g_print ("frames per second: %f\n", 1 / (total / (BUFSIZE - 1)));
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static void
|
||||
dump_stacking_order (GList *nodes)
|
||||
{
|
||||
GList *list;
|
||||
|
||||
for (list = nodes; list != NULL; list = list->next)
|
||||
{
|
||||
CmDrawableNode *node = list->data;
|
||||
|
||||
if (node)
|
||||
g_print ("%lx, ", WS_RESOURCE_XID (node->drawable));
|
||||
}
|
||||
g_print ("\n");
|
||||
}
|
||||
|
||||
static gboolean
|
||||
repaint (gpointer data)
|
||||
{
|
||||
MetaCompScreen *info = data;
|
||||
CmState *state;
|
||||
#if 0
|
||||
g_print ("repaint\n");
|
||||
#endif
|
||||
glViewport (0, 0,
|
||||
info->meta_screen->rect.width,
|
||||
info->meta_screen->rect.height);
|
||||
|
||||
glLoadIdentity();
|
||||
|
||||
#if 0
|
||||
glClearColor (0, 0, 0, 1.0);
|
||||
glClear (GL_COLOR_BUFFER_BIT);
|
||||
#endif
|
||||
|
||||
ws_window_raise (info->gl_window);
|
||||
|
||||
#if 0
|
||||
glDisable (GL_TEXTURE_2D);
|
||||
glDisable (GL_TEXTURE_RECTANGLE_ARB);
|
||||
glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);
|
||||
glColor4f (0.0, 1.0, 0.0, 1.0);
|
||||
glRectf (-1.0, -1.0, 1.0, 1.0);
|
||||
glFinish();
|
||||
#endif
|
||||
|
||||
state = cm_state_new ();
|
||||
|
||||
cm_state_disable_depth_buffer_update (state);
|
||||
|
||||
cm_node_render (CM_NODE (info->magnifier), state);
|
||||
|
||||
cm_state_enable_depth_buffer_update (state);
|
||||
|
||||
g_object_unref (state);
|
||||
|
||||
ws_window_gl_swap_buffers (info->gl_window);
|
||||
glFinish();
|
||||
|
||||
#if 0
|
||||
dump_stacking_order (info->stacker->children);
|
||||
#endif
|
||||
|
||||
info->idle_id = 0;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static MetaCompWindow *
|
||||
find_comp_window (MetaCompScreen *info,
|
||||
Window xwindow)
|
||||
{
|
||||
return meta_comp_window_lookup (info, xwindow);
|
||||
}
|
||||
|
||||
static CmNode *
|
||||
find_node (MetaCompScreen *info,
|
||||
Window xwindow)
|
||||
{
|
||||
MetaCompWindow *window = meta_comp_window_lookup (info, xwindow);
|
||||
|
||||
if (window)
|
||||
return meta_comp_window_get_node (window);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static GList *all_screen_infos;
|
||||
|
||||
MetaCompScreen *
|
||||
meta_comp_screen_get_by_xwindow (Window xwindow)
|
||||
{
|
||||
GList *list;
|
||||
|
||||
for (list = all_screen_infos; list != NULL; list = list->next)
|
||||
{
|
||||
MetaCompScreen *info = list->data;
|
||||
|
||||
if (find_node (info, xwindow))
|
||||
return info;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
MetaCompScreen *
|
||||
meta_comp_screen_new (WsDisplay *display,
|
||||
MetaScreen *screen)
|
||||
{
|
||||
MetaCompScreen *scr_info = g_new0 (MetaCompScreen, 1);
|
||||
|
||||
scr_info->screen = ws_display_get_screen_from_number (
|
||||
display, screen->number);
|
||||
scr_info->root_window = ws_screen_get_root_window (scr_info->screen);
|
||||
scr_info->display = display;
|
||||
scr_info->meta_screen = screen;
|
||||
scr_info->windows_by_xid = g_hash_table_new (g_direct_hash, g_direct_equal);
|
||||
|
||||
all_screen_infos = g_list_prepend (all_screen_infos, scr_info);
|
||||
|
||||
return scr_info;
|
||||
}
|
||||
|
||||
static char *
|
||||
make_selection_name (MetaCompScreen *info)
|
||||
{
|
||||
char *buffer;
|
||||
|
||||
buffer = g_strdup_printf ("_NET_WM_CM_S%d", info->meta_screen->number);
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
static void
|
||||
on_selection_clear (WsWindow *window,
|
||||
WsSelectionClearEvent *event,
|
||||
gpointer data)
|
||||
{
|
||||
MetaCompScreen *info = data;
|
||||
char *buffer = make_selection_name (info);
|
||||
|
||||
if (strcmp (event->selection, buffer))
|
||||
{
|
||||
/* We lost the selection */
|
||||
meta_comp_screen_unredirect (info);
|
||||
}
|
||||
}
|
||||
|
||||
static WsWindow *
|
||||
claim_selection (MetaCompScreen *info)
|
||||
{
|
||||
WsWindow *window = ws_window_new (info->root_window);
|
||||
char *buffer = make_selection_name (info);
|
||||
|
||||
#if 0
|
||||
g_print ("selection window: %lx\n", WS_RESOURCE_XID (window));
|
||||
#endif
|
||||
|
||||
ws_window_own_selection (window, buffer, WS_CURRENT_TIME);
|
||||
|
||||
g_signal_connect (window, "selection_clear_event", G_CALLBACK (on_selection_clear), info);
|
||||
|
||||
g_free (buffer);
|
||||
|
||||
return window;
|
||||
}
|
||||
|
||||
static void
|
||||
queue_paint (CmNode *node,
|
||||
MetaCompScreen *info)
|
||||
{
|
||||
#if 0
|
||||
g_print ("queueing %s\n", G_OBJECT_TYPE_NAME (node));
|
||||
#endif
|
||||
meta_comp_screen_queue_paint (info);
|
||||
}
|
||||
|
||||
void
|
||||
meta_comp_screen_redirect (MetaCompScreen *info)
|
||||
{
|
||||
WsWindow *root = ws_screen_get_root_window (info->screen);
|
||||
WsRectangle source;
|
||||
WsRectangle target;
|
||||
WsServerRegion *region;
|
||||
int screen_w;
|
||||
int screen_h;
|
||||
CmSquare *square;
|
||||
|
||||
#if 0
|
||||
g_print ("redirecting %lx\n", WS_RESOURCE_XID (root));
|
||||
#endif
|
||||
|
||||
ws_window_redirect_subwindows (root);
|
||||
info->gl_window = ws_screen_get_gl_window (info->screen);
|
||||
/* FIXME: This should probably happen in libcm */
|
||||
ws_window_set_override_redirect (info->gl_window, TRUE);
|
||||
region = ws_server_region_new (info->display);
|
||||
ws_window_set_input_shape (info->gl_window, region);
|
||||
g_object_unref (G_OBJECT (region));
|
||||
|
||||
ws_display_begin_error_trap (info->display);
|
||||
|
||||
ws_window_unredirect (info->gl_window);
|
||||
|
||||
ws_display_end_error_trap (info->display);
|
||||
|
||||
info->selection_window = claim_selection (info);
|
||||
|
||||
ws_window_map (info->gl_window);
|
||||
|
||||
info->stacker = cm_stacker_new ();
|
||||
|
||||
square = cm_square_new (0.3, 0.3, 0.8, 1.0);
|
||||
|
||||
cm_stacker_add_child (info->stacker, CM_NODE (square));
|
||||
|
||||
g_object_unref (square);
|
||||
|
||||
screen_w = ws_screen_get_width (info->screen);
|
||||
screen_h = ws_screen_get_height (info->screen);
|
||||
|
||||
#if 0
|
||||
g_print ("width: %d height %d\n", screen_w, screen_h);
|
||||
#endif
|
||||
|
||||
source.x = (screen_w - (screen_w / 4)) / 2;
|
||||
source.y = screen_h / 16;
|
||||
source.width = screen_w / 4;
|
||||
source.height = screen_h / 16;
|
||||
|
||||
target.x = 0;
|
||||
target.y = screen_h - screen_h / 4;
|
||||
target.width = screen_w;
|
||||
target.height = screen_h / 4;
|
||||
|
||||
info->magnifier = cm_magnifier_new (CM_NODE (info->stacker), &source, &target);
|
||||
|
||||
if (g_getenv ("USE_MAGNIFIER"))
|
||||
cm_magnifier_set_active (info->magnifier, TRUE);
|
||||
else
|
||||
cm_magnifier_set_active (info->magnifier, FALSE);
|
||||
|
||||
info->repaint_id =
|
||||
g_signal_connect (info->magnifier, "need_repaint",
|
||||
G_CALLBACK (queue_paint), info);
|
||||
|
||||
ws_display_sync (info->display);
|
||||
}
|
||||
|
||||
static void
|
||||
listify (gpointer key,
|
||||
gpointer value,
|
||||
gpointer data)
|
||||
{
|
||||
GList **windows = data;
|
||||
|
||||
*windows = g_list_prepend (*windows, (gpointer)value);
|
||||
}
|
||||
|
||||
static void
|
||||
free_all_windows (MetaCompScreen *info)
|
||||
{
|
||||
GList *windows = NULL, *list;
|
||||
|
||||
g_hash_table_foreach (info->windows_by_xid, listify, &windows);
|
||||
|
||||
for (list = windows; list != NULL; list = list->next)
|
||||
{
|
||||
MetaCompWindow *window = list->data;
|
||||
|
||||
meta_comp_window_free (window);
|
||||
}
|
||||
|
||||
g_list_free (windows);
|
||||
}
|
||||
|
||||
void
|
||||
meta_comp_screen_unredirect (MetaCompScreen *info)
|
||||
{
|
||||
WsScreen *ws_screen = info->screen;
|
||||
WsWindow *root = ws_screen_get_root_window (ws_screen);
|
||||
|
||||
g_signal_handler_disconnect (info->magnifier, info->repaint_id);
|
||||
g_object_unref (info->magnifier);
|
||||
|
||||
ws_window_unredirect_subwindows (root);
|
||||
ws_screen_release_gl_window (ws_screen);
|
||||
|
||||
free_all_windows (info);
|
||||
|
||||
ws_display_sync (info->display);
|
||||
|
||||
/* FIXME: libcm needs a way to guarantee that a window is destroyed,
|
||||
* without relying on ref counting having it as a side effect
|
||||
*/
|
||||
g_object_unref (info->selection_window);
|
||||
}
|
||||
|
||||
void
|
||||
meta_comp_screen_queue_paint (MetaCompScreen *info)
|
||||
{
|
||||
#if 0
|
||||
g_print ("queuing\n");
|
||||
#endif
|
||||
if (!info->idle_id)
|
||||
info->idle_id = g_idle_add (repaint, info);
|
||||
}
|
||||
|
||||
void
|
||||
meta_comp_screen_restack (MetaCompScreen *info,
|
||||
Window window,
|
||||
Window above_this)
|
||||
{
|
||||
MetaCompWindow *comp_window = find_comp_window (info, window);
|
||||
MetaCompWindow *above_comp_window = find_comp_window (info, above_this);
|
||||
CmNode *window_node = find_node (info, window);
|
||||
CmNode *above_node = find_node (info, above_this);
|
||||
|
||||
if ((comp_window && meta_comp_window_stack_frozen (comp_window)) ||
|
||||
(above_comp_window && meta_comp_window_stack_frozen (above_comp_window)))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
#if 0
|
||||
dump_stacking_order (info->stacker->children);
|
||||
#endif
|
||||
|
||||
if (window_node == above_node)
|
||||
return;
|
||||
|
||||
if (window_node && above_this == WS_RESOURCE_XID (info->gl_window))
|
||||
{
|
||||
cm_stacker_raise_child (info->stacker, window_node);
|
||||
}
|
||||
else if (window_node && above_this == None)
|
||||
{
|
||||
cm_stacker_lower_child (info->stacker, window_node);
|
||||
}
|
||||
else if (window_node && above_node)
|
||||
{
|
||||
cm_stacker_restack_child (info->stacker, window_node, above_node);
|
||||
}
|
||||
#if 0
|
||||
else
|
||||
g_print ("nothing happened\n");
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
g_print ("done restacking; new order:\n");
|
||||
#endif
|
||||
#if 0
|
||||
dump_stacking_order (info->stacker->children);
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
meta_comp_screen_raise_window (MetaCompScreen *info,
|
||||
Window window)
|
||||
{
|
||||
CmNode *node = find_node (info, window);
|
||||
|
||||
if (node)
|
||||
cm_stacker_raise_child (info->stacker, node);
|
||||
}
|
||||
|
||||
void
|
||||
meta_comp_screen_set_size (MetaCompScreen *info,
|
||||
Window xwindow,
|
||||
gint x,
|
||||
gint y,
|
||||
gint width,
|
||||
gint height)
|
||||
{
|
||||
MetaCompWindow *comp_window = meta_comp_window_lookup (info, xwindow);
|
||||
|
||||
if (comp_window)
|
||||
{
|
||||
WsRectangle rect;
|
||||
|
||||
rect.x = x;
|
||||
rect.y = y;
|
||||
rect.width = width;
|
||||
rect.height = height;
|
||||
|
||||
meta_comp_window_set_size (comp_window, &rect);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
print_child_titles (WsWindow *window)
|
||||
{
|
||||
GList *children = ws_window_query_subwindows (window);
|
||||
GList *list;
|
||||
int i;
|
||||
|
||||
g_print ("window: %lx %s\n", WS_RESOURCE_XID (window), ws_window_query_title (window));
|
||||
|
||||
i = 0;
|
||||
for (list = children; list != NULL; list = list->next)
|
||||
{
|
||||
WsWindow *child = list->data;
|
||||
|
||||
g_print (" %d adding: %lx %s\n", i++, WS_RESOURCE_XID (child), ws_window_query_title (child));
|
||||
}
|
||||
}
|
||||
|
||||
typedef struct
|
||||
{
|
||||
MetaCompScreen *cscreen;
|
||||
XID xid;
|
||||
} DestroyData;
|
||||
|
||||
static void
|
||||
on_window_destroy (MetaCompWindow *comp_window,
|
||||
gpointer closure)
|
||||
{
|
||||
DestroyData *data = closure;
|
||||
CmNode *node = meta_comp_window_get_node (comp_window);
|
||||
|
||||
cm_stacker_remove_child (data->cscreen->stacker, node);
|
||||
g_hash_table_remove (data->cscreen->windows_by_xid, (gpointer)data->xid);
|
||||
}
|
||||
|
||||
void
|
||||
meta_comp_screen_add_window (MetaCompScreen *info,
|
||||
Window xwindow)
|
||||
{
|
||||
WsDrawable *drawable;
|
||||
MetaCompWindow *comp_window;
|
||||
DestroyData *data;
|
||||
|
||||
ws_display_begin_error_trap (info->display);
|
||||
|
||||
comp_window = meta_comp_window_lookup (info, xwindow);
|
||||
|
||||
if (comp_window)
|
||||
goto out;
|
||||
|
||||
drawable = WS_DRAWABLE (ws_window_lookup (info->display, xwindow));
|
||||
|
||||
if (ws_window_query_input_only (WS_WINDOW (drawable)))
|
||||
goto out;
|
||||
|
||||
if (WS_WINDOW (drawable) == info->gl_window ||
|
||||
WS_WINDOW (drawable) == info->screen->overlay_window)
|
||||
{
|
||||
#if 0
|
||||
g_print ("gl window\n");
|
||||
#endif
|
||||
goto out;
|
||||
}
|
||||
|
||||
data = g_new (DestroyData, 1);
|
||||
data->cscreen = info;
|
||||
data->xid = WS_RESOURCE_XID (drawable);
|
||||
|
||||
comp_window = meta_comp_window_new (info->meta_screen, drawable,
|
||||
on_window_destroy, data);
|
||||
|
||||
g_hash_table_insert (info->windows_by_xid, (gpointer)WS_RESOURCE_XID (drawable), comp_window);
|
||||
|
||||
cm_stacker_add_child (info->stacker, meta_comp_window_get_node (comp_window));
|
||||
|
||||
out:
|
||||
if (comp_window)
|
||||
{
|
||||
/* This function is called both when windows are created and when they
|
||||
* are mapped, so for now we have this silly function.
|
||||
*/
|
||||
meta_comp_window_refresh_attrs (comp_window);
|
||||
}
|
||||
|
||||
ws_display_end_error_trap (info->display);
|
||||
|
||||
#if 0
|
||||
g_print ("done checking\n");
|
||||
#endif
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
meta_comp_screen_remove_window (MetaCompScreen *info,
|
||||
Window xwindow)
|
||||
{
|
||||
MetaCompWindow *comp_window = meta_comp_window_lookup (info, xwindow);
|
||||
|
||||
if (comp_window)
|
||||
meta_comp_window_free (comp_window);
|
||||
}
|
||||
|
||||
void
|
||||
meta_comp_screen_set_updates (MetaCompScreen *info,
|
||||
Window xwindow,
|
||||
gboolean updates)
|
||||
{
|
||||
MetaCompWindow *comp_window = meta_comp_window_lookup (info, xwindow);
|
||||
|
||||
meta_comp_window_set_updates (comp_window, updates);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
meta_comp_screen_set_patch (MetaCompScreen *info,
|
||||
Window xwindow,
|
||||
CmPoint points[4][4])
|
||||
{
|
||||
CmDrawableNode *node = CM_DRAWABLE_NODE (find_node (info, xwindow));
|
||||
|
||||
if (node)
|
||||
cm_drawable_node_set_patch (node, points);
|
||||
}
|
||||
|
||||
void
|
||||
meta_comp_screen_unset_patch (MetaCompScreen *info,
|
||||
Window xwindow)
|
||||
{
|
||||
CmDrawableNode *node = CM_DRAWABLE_NODE (find_node (info, xwindow));
|
||||
|
||||
if (node)
|
||||
cm_drawable_node_unset_patch (node);
|
||||
}
|
||||
|
||||
void
|
||||
meta_comp_screen_set_alpha (MetaCompScreen *info,
|
||||
Window xwindow,
|
||||
gdouble alpha)
|
||||
{
|
||||
CmDrawableNode *node = CM_DRAWABLE_NODE (find_node (info, xwindow));
|
||||
#if 0
|
||||
g_print ("alpha: %f\n", alpha);
|
||||
#endif
|
||||
cm_drawable_node_set_alpha (node, alpha);
|
||||
}
|
||||
|
||||
void
|
||||
meta_comp_screen_get_real_size (MetaCompScreen *info,
|
||||
Window xwindow,
|
||||
WsRectangle *size)
|
||||
{
|
||||
CmDrawableNode *node = CM_DRAWABLE_NODE (find_node (info, xwindow));
|
||||
|
||||
if (!size)
|
||||
return;
|
||||
|
||||
cm_drawable_node_get_clipbox (node, size);
|
||||
}
|
||||
|
||||
void
|
||||
meta_comp_screen_unmap (MetaCompScreen *info,
|
||||
Window xwindow)
|
||||
{
|
||||
MetaCompWindow *window = find_comp_window (info, xwindow);
|
||||
|
||||
if (window)
|
||||
meta_comp_window_hide (window);
|
||||
}
|
||||
|
||||
void
|
||||
meta_comp_screen_set_target_rect (MetaCompScreen *info,
|
||||
Window xwindow,
|
||||
WsRectangle *rect)
|
||||
{
|
||||
CmDrawableNode *node = CM_DRAWABLE_NODE (find_node (info, xwindow));
|
||||
|
||||
if (node)
|
||||
cm_drawable_node_set_scale_rect (node, rect);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@@ -1,53 +0,0 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
#include "screen.h"
|
||||
#include "c-window.h"
|
||||
|
||||
typedef struct MetaCompScreen MetaCompScreen;
|
||||
|
||||
MetaCompScreen *meta_comp_screen_new (WsDisplay *display,
|
||||
MetaScreen *screen);
|
||||
MetaCompScreen *meta_comp_screen_get_by_xwindow (Window xwindow);
|
||||
void meta_comp_screen_destroy (MetaCompScreen *scr_info);
|
||||
void meta_comp_screen_redirect (MetaCompScreen *info);
|
||||
void meta_comp_screen_unredirect (MetaCompScreen *info);
|
||||
void meta_comp_screen_add_window (MetaCompScreen *scr_info,
|
||||
Window xwindow);
|
||||
void meta_comp_screen_remove_window (MetaCompScreen *scr_info,
|
||||
Window xwindow);
|
||||
void meta_comp_screen_restack (MetaCompScreen *scr_info,
|
||||
Window window,
|
||||
Window above_this);
|
||||
void meta_comp_screen_set_size (MetaCompScreen *info,
|
||||
Window window,
|
||||
gint x,
|
||||
gint y,
|
||||
gint width,
|
||||
gint height);
|
||||
void meta_comp_screen_raise_window (MetaCompScreen *scr_info,
|
||||
Window window);
|
||||
void meta_comp_screen_queue_paint (MetaCompScreen *info);
|
||||
void meta_comp_screen_set_updates (MetaCompScreen *info,
|
||||
Window xwindow,
|
||||
gboolean updates);
|
||||
void meta_comp_screen_set_patch (MetaCompScreen *info,
|
||||
Window xwindow,
|
||||
CmPoint points[4][4]);
|
||||
void meta_comp_screen_unset_patch (MetaCompScreen *info,
|
||||
Window xwindow);
|
||||
void meta_comp_screen_set_alpha (MetaCompScreen *info,
|
||||
Window xwindow,
|
||||
gdouble alpha);
|
||||
void meta_comp_screen_get_real_size (MetaCompScreen *info,
|
||||
Window xwindow,
|
||||
WsRectangle *size);
|
||||
void meta_comp_screen_set_target_rect (MetaCompScreen *info,
|
||||
Window xwindow,
|
||||
WsRectangle *rect);
|
||||
void meta_comp_screen_set_explode (MetaCompScreen *info,
|
||||
Window xwindow,
|
||||
gdouble level);
|
||||
void meta_comp_screen_unmap (MetaCompScreen *info,
|
||||
Window xwindow);
|
||||
MetaCompWindow *meta_comp_screen_lookup_window (MetaCompScreen *info,
|
||||
Window xwindow);
|
1259
src/c-window.c
1259
src/c-window.c
File diff suppressed because it is too large
Load Diff
@@ -1,72 +0,0 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
/*
|
||||
* Copyright (C) 2006 Red Hat, Inc.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include <cm/node.h>
|
||||
#include "display.h"
|
||||
#include "effects.h"
|
||||
|
||||
#ifndef C_WINDOW_H
|
||||
#define C_WINDOW_H
|
||||
|
||||
typedef struct _MetaCompWindow MetaCompWindow;
|
||||
|
||||
typedef void (* MetaCompWindowDestroy) (MetaCompWindow *window,
|
||||
gpointer closure);
|
||||
|
||||
MetaCompWindow *meta_comp_window_new (MetaScreen *screen,
|
||||
WsDrawable *drawable,
|
||||
MetaCompWindowDestroy destroy,
|
||||
gpointer data);
|
||||
CmNode *meta_comp_window_get_node (MetaCompWindow *window);
|
||||
gboolean meta_comp_window_free (MetaCompWindow *window);
|
||||
void meta_comp_window_set_size (MetaCompWindow *window,
|
||||
WsRectangle *size);
|
||||
|
||||
void meta_comp_window_hide (MetaCompWindow *comp_window);
|
||||
void meta_comp_window_show (MetaCompWindow *comp_window);
|
||||
void meta_comp_window_refresh_attrs (MetaCompWindow *comp_window);
|
||||
void meta_comp_window_set_updates (MetaCompWindow *comp_window,
|
||||
gboolean updates);
|
||||
|
||||
void meta_comp_window_explode (MetaCompWindow *comp_window,
|
||||
MetaEffect *effect);
|
||||
void meta_comp_window_shrink (MetaCompWindow *comp_window,
|
||||
MetaEffect *effect);
|
||||
void meta_comp_window_unshrink (MetaCompWindow *comp_window,
|
||||
MetaEffect *effect);
|
||||
void meta_comp_window_run_focus (MetaCompWindow *comp_window,
|
||||
MetaEffect *effect);
|
||||
void meta_comp_window_restack (MetaCompWindow *comp_window,
|
||||
MetaCompWindow *above);
|
||||
void meta_comp_window_freeze_stack (MetaCompWindow *comp_window);
|
||||
void meta_comp_window_thaw_stack (MetaCompWindow *comp_window);
|
||||
gboolean meta_comp_window_stack_frozen (MetaCompWindow *comp_window);
|
||||
void meta_comp_window_run_minimize (MetaCompWindow *window,
|
||||
MetaEffect *effect);
|
||||
void meta_comp_window_run_unminimize (MetaCompWindow *comp_window,
|
||||
MetaEffect *effect);
|
||||
|
||||
#if 0
|
||||
void meta_comp_window_set_explode (MetaCompWindow *comp_window,
|
||||
double level);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
370
src/colors.c
370
src/colors.c
@@ -1,370 +0,0 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/* Metacity RGB color stuff */
|
||||
|
||||
/*
|
||||
* Copyright (C) 2001 Havoc Pennington
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include "colors.h"
|
||||
|
||||
|
||||
static void
|
||||
visual_decompose_mask (gulong mask,
|
||||
gint *shift,
|
||||
gint *prec)
|
||||
{
|
||||
/* This code is from GTK+, (C) GTK+ Team */
|
||||
*shift = 0;
|
||||
*prec = 0;
|
||||
|
||||
while (!(mask & 0x1))
|
||||
{
|
||||
(*shift)++;
|
||||
mask >>= 1;
|
||||
}
|
||||
|
||||
while (mask & 0x1)
|
||||
{
|
||||
(*prec)++;
|
||||
mask >>= 1;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
meta_screen_init_visual_info (MetaScreen *screen)
|
||||
{
|
||||
Visual *xvisual;
|
||||
int nxvisuals;
|
||||
XVisualInfo *visual_list;
|
||||
XVisualInfo visual_template;
|
||||
|
||||
/* root window visual */
|
||||
xvisual = DefaultVisual (screen->display->xdisplay,
|
||||
screen->number);
|
||||
|
||||
visual_template.visualid = XVisualIDFromVisual (xvisual);
|
||||
visual_list = XGetVisualInfo (screen->display->xdisplay,
|
||||
VisualIDMask, &visual_template, &nxvisuals);
|
||||
|
||||
if (nxvisuals != 1)
|
||||
meta_warning ("Matched weird number of visuals %d\n", nxvisuals);
|
||||
|
||||
screen->visual_info = *visual_list;
|
||||
|
||||
meta_verbose ("Using visual class %d\n", screen->visual_info.class);
|
||||
|
||||
XFree (visual_list);
|
||||
}
|
||||
|
||||
gulong
|
||||
meta_screen_get_x_pixel (MetaScreen *screen,
|
||||
const PangoColor *color)
|
||||
{
|
||||
/* This code is derived from GTK+, (C) GTK+ Team */
|
||||
gulong pixel;
|
||||
|
||||
if (screen->visual_info.class == TrueColor ||
|
||||
screen->visual_info.class == DirectColor)
|
||||
{
|
||||
int red_prec, red_shift, green_prec, green_shift, blue_prec, blue_shift;
|
||||
|
||||
visual_decompose_mask (screen->visual_info.red_mask,
|
||||
&red_shift, &red_prec);
|
||||
visual_decompose_mask (screen->visual_info.green_mask,
|
||||
&green_shift, &green_prec);
|
||||
visual_decompose_mask (screen->visual_info.blue_mask,
|
||||
&blue_shift, &blue_prec);
|
||||
|
||||
pixel = (((color->red >> (16 - red_prec)) << red_shift) +
|
||||
((color->green >> (16 - green_prec)) << green_shift) +
|
||||
((color->blue >> (16 - blue_prec)) << blue_shift));
|
||||
}
|
||||
else
|
||||
{
|
||||
#define INTENSITY(r, g, b) ((r) * 0.30 + (g) * 0.59 + (b) * 0.11)
|
||||
double r, g, b;
|
||||
|
||||
r = color->red / (double) 0xffff;
|
||||
g = color->green / (double) 0xffff;
|
||||
b = color->blue / (double) 0xffff;
|
||||
|
||||
/* Now this is a low-bloat GdkRGB replacement! */
|
||||
if (INTENSITY (r, g, b) > 0.5)
|
||||
pixel = WhitePixel (screen->display->xdisplay, screen->number);
|
||||
else
|
||||
pixel = BlackPixel (screen->display->xdisplay, screen->number);
|
||||
#undef INTENSITY
|
||||
}
|
||||
|
||||
return pixel;
|
||||
}
|
||||
|
||||
void
|
||||
meta_screen_set_ui_colors (MetaScreen *screen,
|
||||
const MetaUIColors *colors)
|
||||
{
|
||||
screen->colors = *colors;
|
||||
meta_screen_queue_frame_redraws (screen);
|
||||
}
|
||||
|
||||
/* Straight out of gtkstyle.c */
|
||||
static PangoColor meta_default_normal_fg = { 0, 0, 0 };
|
||||
static PangoColor meta_default_active_fg = { 0, 0, 0 };
|
||||
static PangoColor meta_default_prelight_fg = { 0, 0, 0 };
|
||||
static PangoColor meta_default_selected_fg = { 0xffff, 0xffff, 0xffff };
|
||||
static PangoColor meta_default_insensitive_fg = { 0x7530, 0x7530, 0x7530 };
|
||||
|
||||
static PangoColor meta_default_normal_bg = { 0xd6d6, 0xd6d6, 0xd6d6 };
|
||||
static PangoColor meta_default_active_bg = { 0xc350, 0xc350, 0xc350 };
|
||||
static PangoColor meta_default_prelight_bg = { 0xea60, 0xea60, 0xea60 };
|
||||
static PangoColor meta_default_selected_bg = { 0, 0, 0x9c40 };
|
||||
static PangoColor meta_default_insensitive_bg = { 0xd6d6, 0xd6d6, 0xd6d6 };
|
||||
|
||||
static void
|
||||
rgb_to_hls (gdouble *r,
|
||||
gdouble *g,
|
||||
gdouble *b)
|
||||
{
|
||||
gdouble min;
|
||||
gdouble max;
|
||||
gdouble red;
|
||||
gdouble green;
|
||||
gdouble blue;
|
||||
gdouble h, l, s;
|
||||
gdouble delta;
|
||||
|
||||
red = *r;
|
||||
green = *g;
|
||||
blue = *b;
|
||||
|
||||
if (red > green)
|
||||
{
|
||||
if (red > blue)
|
||||
max = red;
|
||||
else
|
||||
max = blue;
|
||||
|
||||
if (green < blue)
|
||||
min = green;
|
||||
else
|
||||
min = blue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (green > blue)
|
||||
max = green;
|
||||
else
|
||||
max = blue;
|
||||
|
||||
if (red < blue)
|
||||
min = red;
|
||||
else
|
||||
min = blue;
|
||||
}
|
||||
|
||||
l = (max + min) / 2;
|
||||
s = 0;
|
||||
h = 0;
|
||||
|
||||
if (max != min)
|
||||
{
|
||||
if (l <= 0.5)
|
||||
s = (max - min) / (max + min);
|
||||
else
|
||||
s = (max - min) / (2 - max - min);
|
||||
|
||||
delta = max -min;
|
||||
if (red == max)
|
||||
h = (green - blue) / delta;
|
||||
else if (green == max)
|
||||
h = 2 + (blue - red) / delta;
|
||||
else if (blue == max)
|
||||
h = 4 + (red - green) / delta;
|
||||
|
||||
h *= 60;
|
||||
if (h < 0.0)
|
||||
h += 360;
|
||||
}
|
||||
|
||||
*r = h;
|
||||
*g = l;
|
||||
*b = s;
|
||||
}
|
||||
|
||||
static void
|
||||
hls_to_rgb (gdouble *h,
|
||||
gdouble *l,
|
||||
gdouble *s)
|
||||
{
|
||||
gdouble hue;
|
||||
gdouble lightness;
|
||||
gdouble saturation;
|
||||
gdouble m1, m2;
|
||||
gdouble r, g, b;
|
||||
|
||||
lightness = *l;
|
||||
saturation = *s;
|
||||
|
||||
if (lightness <= 0.5)
|
||||
m2 = lightness * (1 + saturation);
|
||||
else
|
||||
m2 = lightness + saturation - lightness * saturation;
|
||||
m1 = 2 * lightness - m2;
|
||||
|
||||
if (saturation == 0)
|
||||
{
|
||||
*h = lightness;
|
||||
*l = lightness;
|
||||
*s = lightness;
|
||||
}
|
||||
else
|
||||
{
|
||||
hue = *h + 120;
|
||||
while (hue > 360)
|
||||
hue -= 360;
|
||||
while (hue < 0)
|
||||
hue += 360;
|
||||
|
||||
if (hue < 60)
|
||||
r = m1 + (m2 - m1) * hue / 60;
|
||||
else if (hue < 180)
|
||||
r = m2;
|
||||
else if (hue < 240)
|
||||
r = m1 + (m2 - m1) * (240 - hue) / 60;
|
||||
else
|
||||
r = m1;
|
||||
|
||||
hue = *h;
|
||||
while (hue > 360)
|
||||
hue -= 360;
|
||||
while (hue < 0)
|
||||
hue += 360;
|
||||
|
||||
if (hue < 60)
|
||||
g = m1 + (m2 - m1) * hue / 60;
|
||||
else if (hue < 180)
|
||||
g = m2;
|
||||
else if (hue < 240)
|
||||
g = m1 + (m2 - m1) * (240 - hue) / 60;
|
||||
else
|
||||
g = m1;
|
||||
|
||||
hue = *h - 120;
|
||||
while (hue > 360)
|
||||
hue -= 360;
|
||||
while (hue < 0)
|
||||
hue += 360;
|
||||
|
||||
if (hue < 60)
|
||||
b = m1 + (m2 - m1) * hue / 60;
|
||||
else if (hue < 180)
|
||||
b = m2;
|
||||
else if (hue < 240)
|
||||
b = m1 + (m2 - m1) * (240 - hue) / 60;
|
||||
else
|
||||
b = m1;
|
||||
|
||||
*h = r;
|
||||
*l = g;
|
||||
*s = b;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
style_shade (PangoColor *a,
|
||||
PangoColor *b,
|
||||
gdouble k)
|
||||
{
|
||||
gdouble red;
|
||||
gdouble green;
|
||||
gdouble blue;
|
||||
|
||||
red = (gdouble) a->red / 65535.0;
|
||||
green = (gdouble) a->green / 65535.0;
|
||||
blue = (gdouble) a->blue / 65535.0;
|
||||
|
||||
rgb_to_hls (&red, &green, &blue);
|
||||
|
||||
green *= k;
|
||||
if (green > 1.0)
|
||||
green = 1.0;
|
||||
else if (green < 0.0)
|
||||
green = 0.0;
|
||||
|
||||
blue *= k;
|
||||
if (blue > 1.0)
|
||||
blue = 1.0;
|
||||
else if (blue < 0.0)
|
||||
blue = 0.0;
|
||||
|
||||
hls_to_rgb (&red, &green, &blue);
|
||||
|
||||
b->red = red * 65535.0;
|
||||
b->green = green * 65535.0;
|
||||
b->blue = blue * 65535.0;
|
||||
}
|
||||
|
||||
#define LIGHTNESS_MULT 1.3
|
||||
#define DARKNESS_MULT 0.7
|
||||
void
|
||||
meta_screen_init_ui_colors (MetaScreen *screen)
|
||||
{
|
||||
int i;
|
||||
MetaUIColors *colors;
|
||||
|
||||
colors = &screen->colors;
|
||||
|
||||
colors->fg[META_STATE_NORMAL] = meta_default_normal_fg;
|
||||
colors->fg[META_STATE_ACTIVE] = meta_default_active_fg;
|
||||
colors->fg[META_STATE_PRELIGHT] = meta_default_prelight_fg;
|
||||
colors->fg[META_STATE_SELECTED] = meta_default_selected_fg;
|
||||
colors->fg[META_STATE_INSENSITIVE] = meta_default_insensitive_fg;
|
||||
|
||||
colors->bg[META_STATE_NORMAL] = meta_default_normal_bg;
|
||||
colors->bg[META_STATE_ACTIVE] = meta_default_active_bg;
|
||||
colors->bg[META_STATE_PRELIGHT] = meta_default_prelight_bg;
|
||||
colors->bg[META_STATE_SELECTED] = meta_default_selected_bg;
|
||||
colors->bg[META_STATE_INSENSITIVE] = meta_default_insensitive_bg;
|
||||
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
colors->text[i] = colors->fg[i];
|
||||
colors->base[i].red = G_MAXUSHORT;
|
||||
colors->base[i].green = G_MAXUSHORT;
|
||||
colors->base[i].blue = G_MAXUSHORT;
|
||||
}
|
||||
|
||||
colors->base[META_STATE_SELECTED] = meta_default_selected_bg;
|
||||
colors->base[META_STATE_INSENSITIVE] = meta_default_prelight_bg;
|
||||
colors->text[META_STATE_INSENSITIVE] = meta_default_insensitive_fg;
|
||||
|
||||
for (i = 0; i < 5; i++)
|
||||
{
|
||||
style_shade (&colors->bg[i], &colors->light[i], LIGHTNESS_MULT);
|
||||
style_shade (&colors->bg[i], &colors->dark[i], DARKNESS_MULT);
|
||||
|
||||
colors->mid[i].red = (colors->light[i].red + colors->dark[i].red) / 2;
|
||||
colors->mid[i].green = (colors->light[i].green + colors->dark[i].green) / 2;
|
||||
colors->mid[i].blue = (colors->light[i].blue + colors->dark[i].blue) / 2;
|
||||
|
||||
colors->text_aa[i].red = (colors->text[i].red + colors->base[i].red) / 2;
|
||||
colors->text_aa[i].green = (colors->text[i].green + colors->base[i].green) / 2;
|
||||
colors->text_aa[i].blue = (colors->text[i].blue + colors->base[i].blue) / 2;
|
||||
}
|
||||
}
|
1024
src/compositor.c
1024
src/compositor.c
File diff suppressed because it is too large
Load Diff
@@ -1,92 +0,0 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/* Metacity compositing manager */
|
||||
|
||||
/*
|
||||
* Copyright (C) 2003 Red Hat, Inc.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef META_COMPOSITOR_H
|
||||
#define META_COMPOSITOR_H
|
||||
|
||||
#include "util.h"
|
||||
#include "display.h"
|
||||
#include "spring-model.h"
|
||||
|
||||
#ifdef HAVE_COMPOSITE_EXTENSIONS
|
||||
#include "cm/deform.h"
|
||||
/* FIXME: Needs namespacing. */
|
||||
void get_patch_points (Model *model, CmPoint points[4][4]);
|
||||
#endif
|
||||
|
||||
typedef void (* MetaAnimationFinishedFunc) (gpointer data);
|
||||
|
||||
/* XXX namespace me */
|
||||
void compute_window_rect (MetaWindow *window, MetaRectangle *rect);
|
||||
|
||||
MetaCompositor* meta_compositor_new (MetaDisplay *display);
|
||||
void meta_compositor_unref (MetaCompositor *compositor);
|
||||
void meta_compositor_process_event (MetaCompositor *compositor,
|
||||
XEvent *xevent,
|
||||
MetaWindow *window);
|
||||
void meta_compositor_add_window (MetaCompositor *compositor,
|
||||
Window xwindow,
|
||||
XWindowAttributes *attrs);
|
||||
void meta_compositor_remove_window (MetaCompositor *compositor,
|
||||
Window xwindow);
|
||||
void meta_compositor_set_debug_updates (MetaCompositor *compositor,
|
||||
gboolean debug_updates);
|
||||
|
||||
void meta_compositor_manage_screen (MetaCompositor *compositor,
|
||||
MetaScreen *screen);
|
||||
void meta_compositor_unmanage_screen (MetaCompositor *compositor,
|
||||
MetaScreen *screen);
|
||||
|
||||
#if 0
|
||||
void meta_compositor_minimize (MetaCompositor *compositor,
|
||||
MetaWindow *window,
|
||||
int x,
|
||||
int y,
|
||||
int width,
|
||||
int height,
|
||||
MetaAnimationFinishedFunc finished_cb,
|
||||
gpointer finished_data);
|
||||
#endif
|
||||
|
||||
void
|
||||
meta_compositor_set_updates (MetaCompositor *compositor,
|
||||
MetaWindow *window,
|
||||
gboolean updates);
|
||||
void
|
||||
meta_compositor_destroy (MetaCompositor *compositor);
|
||||
|
||||
void meta_compositor_begin_move (MetaCompositor *compositor,
|
||||
MetaWindow *window,
|
||||
MetaRectangle *initial,
|
||||
int grab_x, int grab_y);
|
||||
void meta_compositor_update_move (MetaCompositor *compositor,
|
||||
MetaWindow *window,
|
||||
int x, int y);
|
||||
void meta_compositor_end_move (MetaCompositor *compositor,
|
||||
MetaWindow *window);
|
||||
void meta_compositor_free_window (MetaCompositor *compositor,
|
||||
MetaWindow *window);
|
||||
void meta_compositor_free_window (MetaCompositor *compositor,
|
||||
MetaWindow *window);
|
||||
|
||||
#endif /* META_COMPOSITOR_H */
|
90
src/compositor/compositor-private.h
Normal file
90
src/compositor/compositor-private.h
Normal file
@@ -0,0 +1,90 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/*
|
||||
* Copyright (C) 2008 Iain Holmes
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef META_COMPOSITOR_PRIVATE_H
|
||||
#define META_COMPOSITOR_PRIVATE_H
|
||||
|
||||
#include "compositor.h"
|
||||
|
||||
struct _MetaCompositor
|
||||
{
|
||||
void (* destroy) (MetaCompositor *compositor);
|
||||
|
||||
void (*manage_screen) (MetaCompositor *compositor,
|
||||
MetaScreen *screen);
|
||||
void (*unmanage_screen) (MetaCompositor *compositor,
|
||||
MetaScreen *screen);
|
||||
void (*add_window) (MetaCompositor *compositor,
|
||||
MetaWindow *window);
|
||||
void (*remove_window) (MetaCompositor *compositor,
|
||||
MetaWindow *window);
|
||||
void (*set_updates) (MetaCompositor *compositor,
|
||||
MetaWindow *window,
|
||||
gboolean update);
|
||||
gboolean (*process_event) (MetaCompositor *compositor,
|
||||
XEvent *event,
|
||||
MetaWindow *window);
|
||||
Pixmap (*get_window_pixmap) (MetaCompositor *compositor,
|
||||
MetaWindow *window);
|
||||
void (*set_active_window) (MetaCompositor *compositor,
|
||||
MetaScreen *screen,
|
||||
MetaWindow *window);
|
||||
void (*map_window) (MetaCompositor *compositor,
|
||||
MetaWindow *window);
|
||||
void (*unmap_window) (MetaCompositor *compositor,
|
||||
MetaWindow *window);
|
||||
void (*minimize_window) (MetaCompositor *compositor,
|
||||
MetaWindow *window,
|
||||
MetaRectangle *window_rect,
|
||||
MetaRectangle *icon_rect);
|
||||
void (*unminimize_window) (MetaCompositor *compositor,
|
||||
MetaWindow *window,
|
||||
MetaRectangle *window_rect,
|
||||
MetaRectangle *icon_rect);
|
||||
void (*maximize_window) (MetaCompositor *compositor,
|
||||
MetaWindow *window,
|
||||
MetaRectangle *window_rect);
|
||||
void (*unmaximize_window) (MetaCompositor *compositor,
|
||||
MetaWindow *window,
|
||||
MetaRectangle *window_rect);
|
||||
void (*update_workspace_geometry) (MetaCompositor *compositor,
|
||||
MetaWorkspace *workspace);
|
||||
void (*switch_workspace) (MetaCompositor *compositor,
|
||||
MetaScreen *screen,
|
||||
MetaWorkspace *from,
|
||||
MetaWorkspace *to,
|
||||
MetaMotionDirection direction);
|
||||
void (*sync_stack) (MetaCompositor *compositor,
|
||||
MetaScreen *screen,
|
||||
GList *stack);
|
||||
void (*set_window_hidden) (MetaCompositor *compositor,
|
||||
MetaScreen *screen,
|
||||
MetaWindow *window,
|
||||
gboolean hidden);
|
||||
void (*sync_window_geometry) (MetaCompositor *compositor,
|
||||
MetaWindow *window);
|
||||
void (*sync_screen_size) (MetaCompositor *compositor,
|
||||
MetaScreen *screen,
|
||||
guint width,
|
||||
guint height);
|
||||
};
|
||||
|
||||
#endif
|
3067
src/compositor/compositor-xrender.c
Normal file
3067
src/compositor/compositor-xrender.c
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,9 +1,9 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/* Metacity fixed tooltip routine */
|
||||
|
||||
/*
|
||||
* Copyright (C) 2001 Havoc Pennington
|
||||
* Copyright (C) 2007 Iain Holmes
|
||||
* Based on xcompmgr - (c) 2003 Keith Packard
|
||||
* xfwm4 - (c) 2005-2007 Olivier Fourdan
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
@@ -21,16 +21,11 @@
|
||||
* 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef META_FIXED_TIP_H
|
||||
#define META_FIXED_TIP_H
|
||||
#ifndef META_COMPOSITOR_XRENDER_H_
|
||||
#define META_COMPOSITOR_XRENDER_H_
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
#include <gdk/gdkx.h>
|
||||
|
||||
void meta_fixed_tip_show (Display *xdisplay, int screen_number,
|
||||
int root_x, int root_y,
|
||||
const char *markup_text);
|
||||
void meta_fixed_tip_hide (void);
|
||||
#include "types.h"
|
||||
|
||||
MetaCompositor *meta_compositor_xrender_new (MetaDisplay *display);
|
||||
|
||||
#endif
|
301
src/compositor/compositor.c
Normal file
301
src/compositor/compositor.c
Normal file
@@ -0,0 +1,301 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/*
|
||||
* Copyright (C) 2008 Iain Holmes
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include "compositor-private.h"
|
||||
#include "compositor-xrender.h"
|
||||
#include "prefs.h"
|
||||
|
||||
#ifdef WITH_CLUTTER
|
||||
#include "compositor-mutter.h"
|
||||
int meta_compositor_can_use_clutter__ = 0;
|
||||
#endif
|
||||
|
||||
MetaCompositor *
|
||||
meta_compositor_new (MetaDisplay *display)
|
||||
{
|
||||
#ifdef HAVE_COMPOSITE_EXTENSIONS
|
||||
#ifdef WITH_CLUTTER
|
||||
/* At some point we would have a way to select between backends */
|
||||
/* return meta_compositor_xrender_new (display); */
|
||||
if (meta_compositor_can_use_clutter__ && !meta_prefs_get_clutter_disabled ())
|
||||
return mutter_new (display);
|
||||
else
|
||||
#endif
|
||||
return meta_compositor_xrender_new (display);
|
||||
#else
|
||||
return NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
meta_compositor_destroy (MetaCompositor *compositor)
|
||||
{
|
||||
#ifdef HAVE_COMPOSITE_EXTENSIONS
|
||||
if (compositor && compositor->destroy)
|
||||
compositor->destroy (compositor);
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
meta_compositor_add_window (MetaCompositor *compositor,
|
||||
MetaWindow *window)
|
||||
{
|
||||
#ifdef HAVE_COMPOSITE_EXTENSIONS
|
||||
if (compositor && compositor->add_window)
|
||||
compositor->add_window (compositor, window);
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
meta_compositor_remove_window (MetaCompositor *compositor,
|
||||
MetaWindow *window)
|
||||
{
|
||||
#ifdef HAVE_COMPOSITE_EXTENSIONS
|
||||
if (compositor && compositor->remove_window)
|
||||
compositor->remove_window (compositor, window);
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
meta_compositor_manage_screen (MetaCompositor *compositor,
|
||||
MetaScreen *screen)
|
||||
{
|
||||
#ifdef HAVE_COMPOSITE_EXTENSIONS
|
||||
if (compositor && compositor->manage_screen)
|
||||
compositor->manage_screen (compositor, screen);
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
meta_compositor_unmanage_screen (MetaCompositor *compositor,
|
||||
MetaScreen *screen)
|
||||
{
|
||||
#ifdef HAVE_COMPOSITE_EXTENSIONS
|
||||
if (compositor && compositor->unmanage_screen)
|
||||
compositor->unmanage_screen (compositor, screen);
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
meta_compositor_set_updates (MetaCompositor *compositor,
|
||||
MetaWindow *window,
|
||||
gboolean updates)
|
||||
{
|
||||
#ifdef HAVE_COMPOSITE_EXTENSIONS
|
||||
if (compositor && compositor->set_updates)
|
||||
compositor->set_updates (compositor, window, updates);
|
||||
#endif
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_compositor_process_event (MetaCompositor *compositor,
|
||||
XEvent *event,
|
||||
MetaWindow *window)
|
||||
{
|
||||
#ifdef HAVE_COMPOSITE_EXTENSIONS
|
||||
if (compositor && compositor->process_event)
|
||||
return compositor->process_event (compositor, event, window);
|
||||
else
|
||||
return FALSE;
|
||||
#endif
|
||||
}
|
||||
|
||||
Pixmap
|
||||
meta_compositor_get_window_pixmap (MetaCompositor *compositor,
|
||||
MetaWindow *window)
|
||||
{
|
||||
#ifdef HAVE_COMPOSITE_EXTENSIONS
|
||||
if (compositor && compositor->get_window_pixmap)
|
||||
return compositor->get_window_pixmap (compositor, window);
|
||||
else
|
||||
return None;
|
||||
#else
|
||||
return None;
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
meta_compositor_set_active_window (MetaCompositor *compositor,
|
||||
MetaScreen *screen,
|
||||
MetaWindow *window)
|
||||
{
|
||||
#ifdef HAVE_COMPOSITE_EXTENSIONS
|
||||
if (compositor && compositor->set_active_window)
|
||||
compositor->set_active_window (compositor, screen, window);
|
||||
#endif
|
||||
}
|
||||
|
||||
/* These functions are unused at the moment */
|
||||
void meta_compositor_begin_move (MetaCompositor *compositor,
|
||||
MetaWindow *window,
|
||||
MetaRectangle *initial,
|
||||
int grab_x,
|
||||
int grab_y)
|
||||
{
|
||||
}
|
||||
|
||||
void meta_compositor_update_move (MetaCompositor *compositor,
|
||||
MetaWindow *window,
|
||||
int x,
|
||||
int y)
|
||||
{
|
||||
}
|
||||
|
||||
void meta_compositor_end_move (MetaCompositor *compositor,
|
||||
MetaWindow *window)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
meta_compositor_map_window (MetaCompositor *compositor,
|
||||
MetaWindow *window)
|
||||
{
|
||||
#ifdef HAVE_COMPOSITE_EXTENSIONS
|
||||
if (compositor && compositor->map_window)
|
||||
compositor->map_window (compositor, window);
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
meta_compositor_unmap_window (MetaCompositor *compositor,
|
||||
MetaWindow *window)
|
||||
{
|
||||
#ifdef HAVE_COMPOSITE_EXTENSIONS
|
||||
if (compositor && compositor->unmap_window)
|
||||
compositor->unmap_window (compositor, window);
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
meta_compositor_minimize_window (MetaCompositor *compositor,
|
||||
MetaWindow *window,
|
||||
MetaRectangle *window_rect,
|
||||
MetaRectangle *icon_rect)
|
||||
{
|
||||
#ifdef HAVE_COMPOSITE_EXTENSIONS
|
||||
if (compositor && compositor->minimize_window)
|
||||
compositor->minimize_window (compositor, window, window_rect, icon_rect);
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
meta_compositor_unminimize_window (MetaCompositor *compositor,
|
||||
MetaWindow *window,
|
||||
MetaRectangle *window_rect,
|
||||
MetaRectangle *icon_rect)
|
||||
{
|
||||
#ifdef HAVE_COMPOSITE_EXTENSIONS
|
||||
if (compositor && compositor->unminimize_window)
|
||||
compositor->unminimize_window (compositor, window, window_rect, icon_rect);
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
meta_compositor_maximize_window (MetaCompositor *compositor,
|
||||
MetaWindow *window,
|
||||
MetaRectangle *window_rect)
|
||||
{
|
||||
#ifdef HAVE_COMPOSITE_EXTENSIONS
|
||||
if (compositor && compositor->maximize_window)
|
||||
compositor->maximize_window (compositor, window, window_rect);
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
meta_compositor_unmaximize_window (MetaCompositor *compositor,
|
||||
MetaWindow *window,
|
||||
MetaRectangle *window_rect)
|
||||
{
|
||||
#ifdef HAVE_COMPOSITE_EXTENSIONS
|
||||
if (compositor && compositor->unmaximize_window)
|
||||
compositor->unmaximize_window (compositor, window, window_rect);
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
meta_compositor_update_workspace_geometry (MetaCompositor *compositor,
|
||||
MetaWorkspace *workspace)
|
||||
{
|
||||
#ifdef HAVE_COMPOSITE_EXTENSIONS
|
||||
if (compositor && compositor->update_workspace_geometry)
|
||||
compositor->update_workspace_geometry (compositor, workspace);
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
meta_compositor_switch_workspace (MetaCompositor *compositor,
|
||||
MetaScreen *screen,
|
||||
MetaWorkspace *from,
|
||||
MetaWorkspace *to,
|
||||
MetaMotionDirection direction)
|
||||
{
|
||||
#ifdef HAVE_COMPOSITE_EXTENSIONS
|
||||
if (compositor && compositor->switch_workspace)
|
||||
compositor->switch_workspace (compositor, screen, from, to, direction);
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
meta_compositor_sync_stack (MetaCompositor *compositor,
|
||||
MetaScreen *screen,
|
||||
GList *stack)
|
||||
{
|
||||
#ifdef HAVE_COMPOSITE_EXTENSIONS
|
||||
if (compositor && compositor->sync_stack)
|
||||
compositor->sync_stack (compositor, screen, stack);
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
meta_compositor_set_window_hidden (MetaCompositor *compositor,
|
||||
MetaScreen *screen,
|
||||
MetaWindow *window,
|
||||
gboolean hidden)
|
||||
{
|
||||
#ifdef HAVE_COMPOSITE_EXTENSIONS
|
||||
if (compositor && compositor->set_window_hidden)
|
||||
compositor->set_window_hidden (compositor, screen, window, hidden);
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
meta_compositor_sync_window_geometry (MetaCompositor *compositor,
|
||||
MetaWindow *window)
|
||||
{
|
||||
#ifdef HAVE_COMPOSITE_EXTENSIONS
|
||||
if (compositor && compositor->sync_window_geometry)
|
||||
compositor->sync_window_geometry (compositor, window);
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
meta_compositor_sync_screen_size (MetaCompositor *compositor,
|
||||
MetaScreen *screen,
|
||||
guint width,
|
||||
guint height)
|
||||
{
|
||||
#ifdef HAVE_COMPOSITE_EXTENSIONS
|
||||
if (compositor && compositor->sync_screen_size)
|
||||
compositor->sync_screen_size (compositor, screen, width, height);
|
||||
#endif
|
||||
}
|
||||
|
10
src/compositor/mutter/README
Normal file
10
src/compositor/mutter/README
Normal file
@@ -0,0 +1,10 @@
|
||||
Intro
|
||||
=====
|
||||
|
||||
Fix me.
|
||||
|
||||
|
||||
Env Vars
|
||||
========
|
||||
|
||||
MUTTER_DISABLE_MIPMAPS - set to disable use of mipmaped windows.
|
2872
src/compositor/mutter/compositor-mutter.c
Normal file
2872
src/compositor/mutter/compositor-mutter.c
Normal file
File diff suppressed because it is too large
Load Diff
207
src/compositor/mutter/mutter-module.c
Normal file
207
src/compositor/mutter/mutter-module.c
Normal file
@@ -0,0 +1,207 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2008 Intel Corp.
|
||||
*
|
||||
* Author: Tomas Frydrych <tf@linux.intel.com>
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include "mutter-plugin.h"
|
||||
#include "mutter-module.h"
|
||||
|
||||
#include <gmodule.h>
|
||||
|
||||
enum
|
||||
{
|
||||
PROP_0,
|
||||
PROP_PATH,
|
||||
};
|
||||
|
||||
struct _MutterModulePrivate
|
||||
{
|
||||
GModule *lib;
|
||||
gchar *path;
|
||||
GType plugin_type;
|
||||
};
|
||||
|
||||
#define MUTTER_MODULE_GET_PRIVATE(obj) \
|
||||
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), MUTTER_TYPE_MODULE, MutterModulePrivate))
|
||||
|
||||
G_DEFINE_TYPE (MutterModule, mutter_module, G_TYPE_TYPE_MODULE);
|
||||
|
||||
static gboolean
|
||||
mutter_module_load (GTypeModule *gmodule)
|
||||
{
|
||||
MutterModulePrivate *priv = MUTTER_MODULE (gmodule)->priv;
|
||||
MutterPluginVersion *info = NULL;
|
||||
GType (*register_type) (GTypeModule *) = NULL;
|
||||
|
||||
if (priv->lib && priv->plugin_type)
|
||||
return TRUE;
|
||||
|
||||
g_assert (priv->path);
|
||||
|
||||
if (!priv->lib &&
|
||||
!(priv->lib = g_module_open (priv->path, G_MODULE_BIND_LOCAL)))
|
||||
{
|
||||
g_warning ("Could not load library [%s (%s)]",
|
||||
priv->path, g_module_error ());
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (g_module_symbol (priv->lib, "mutter_plugin_version", (gpointer *)&info) &&
|
||||
g_module_symbol (priv->lib, "mutter_plugin_register_type",
|
||||
(gpointer *)®ister_type) &&
|
||||
info && register_type)
|
||||
{
|
||||
if (info->version_api != METACITY_CLUTTER_PLUGIN_API_VERSION)
|
||||
g_warning ("Plugin API mismatch for [%s]", priv->path);
|
||||
else
|
||||
{
|
||||
GType plugin_type;
|
||||
|
||||
if (!(plugin_type = register_type (gmodule)))
|
||||
{
|
||||
g_warning ("Could not register type for plugin %s",
|
||||
priv->path);
|
||||
return FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
priv->plugin_type = plugin_type;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
else
|
||||
g_warning ("Broken plugin module [%s]", priv->path);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
mutter_module_unload (GTypeModule *gmodule)
|
||||
{
|
||||
MutterModulePrivate *priv = MUTTER_MODULE (gmodule)->priv;
|
||||
|
||||
g_module_close (priv->lib);
|
||||
|
||||
priv->lib = NULL;
|
||||
priv->plugin_type = 0;
|
||||
}
|
||||
|
||||
static void
|
||||
mutter_module_dispose (GObject *object)
|
||||
{
|
||||
G_OBJECT_CLASS (mutter_module_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
static void
|
||||
mutter_module_finalize (GObject *object)
|
||||
{
|
||||
MutterModulePrivate *priv = MUTTER_MODULE (object)->priv;
|
||||
|
||||
g_free (priv->path);
|
||||
priv->path = NULL;
|
||||
|
||||
G_OBJECT_CLASS (mutter_module_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
mutter_module_set_property (GObject *object,
|
||||
guint prop_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
MutterModulePrivate *priv = MUTTER_MODULE (object)->priv;
|
||||
|
||||
switch (prop_id)
|
||||
{
|
||||
case PROP_PATH:
|
||||
g_free (priv->path);
|
||||
priv->path = g_value_dup_string (value);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
mutter_module_get_property (GObject *object,
|
||||
guint prop_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
MutterModulePrivate *priv = MUTTER_MODULE (object)->priv;
|
||||
|
||||
switch (prop_id)
|
||||
{
|
||||
case PROP_PATH:
|
||||
g_value_set_string (value, priv->path);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
mutter_module_class_init (MutterModuleClass *klass)
|
||||
{
|
||||
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||
GTypeModuleClass *gmodule_class = G_TYPE_MODULE_CLASS (klass);
|
||||
|
||||
gobject_class->finalize = mutter_module_finalize;
|
||||
gobject_class->dispose = mutter_module_dispose;
|
||||
gobject_class->set_property = mutter_module_set_property;
|
||||
gobject_class->get_property = mutter_module_get_property;
|
||||
|
||||
gmodule_class->load = mutter_module_load;
|
||||
gmodule_class->unload = mutter_module_unload;
|
||||
|
||||
g_object_class_install_property (gobject_class,
|
||||
PROP_PATH,
|
||||
g_param_spec_string ("path",
|
||||
"Path",
|
||||
"Load path",
|
||||
NULL,
|
||||
G_PARAM_READWRITE |
|
||||
G_PARAM_CONSTRUCT_ONLY));
|
||||
|
||||
g_type_class_add_private (gobject_class, sizeof (MutterModulePrivate));
|
||||
}
|
||||
|
||||
static void
|
||||
mutter_module_init (MutterModule *self)
|
||||
{
|
||||
MutterModulePrivate *priv;
|
||||
|
||||
self->priv = priv = MUTTER_MODULE_GET_PRIVATE (self);
|
||||
|
||||
}
|
||||
|
||||
GType
|
||||
mutter_module_get_plugin_type (MutterModule *module)
|
||||
{
|
||||
MutterModulePrivate *priv = MUTTER_MODULE (module)->priv;
|
||||
|
||||
return priv->plugin_type;
|
||||
}
|
||||
|
57
src/compositor/mutter/mutter-module.h
Normal file
57
src/compositor/mutter/mutter-module.h
Normal file
@@ -0,0 +1,57 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2008 Intel Corp.
|
||||
*
|
||||
* Author: Tomas Frydrych <tf@linux.intel.com>
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef MUTTER_MODULE_H_
|
||||
#define MUTTER_MODULE_H_
|
||||
|
||||
#include <glib-object.h>
|
||||
|
||||
#define MUTTER_TYPE_MODULE (mutter_module_get_type ())
|
||||
#define MUTTER_MODULE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MUTTER_TYPE_MODULE, MutterModule))
|
||||
#define MUTTER_MODULE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MUTTER_TYPE_MODULE, MutterModuleClass))
|
||||
#define MUTTER_IS_MODULE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MUTTER_MODULE_TYPE))
|
||||
#define MUTTER_IS_MODULE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MUTTER_TYPE_MODULE))
|
||||
#define MUTTER_MODULE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MUTTER_TYPE_MODULE, MutterModuleClass))
|
||||
|
||||
typedef struct _MutterModule MutterModule;
|
||||
typedef struct _MutterModuleClass MutterModuleClass;
|
||||
typedef struct _MutterModulePrivate MutterModulePrivate;
|
||||
|
||||
struct _MutterModule
|
||||
{
|
||||
GTypeModule parent;
|
||||
|
||||
MutterModulePrivate *priv;
|
||||
};
|
||||
|
||||
struct _MutterModuleClass
|
||||
{
|
||||
GTypeModuleClass parent_class;
|
||||
};
|
||||
|
||||
|
||||
GType mutter_module_get_type (void);
|
||||
|
||||
GType mutter_module_get_plugin_type (MutterModule *module);
|
||||
|
||||
#endif
|
590
src/compositor/mutter/mutter-plugin-manager.c
Normal file
590
src/compositor/mutter/mutter-plugin-manager.c
Normal file
@@ -0,0 +1,590 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2008 Intel Corp.
|
||||
*
|
||||
* Author: Tomas Frydrych <tf@linux.intel.com>
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "mutter-plugin-manager.h"
|
||||
#include "prefs.h"
|
||||
#include "errors.h"
|
||||
#include "workspace.h"
|
||||
#include "mutter-module.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
/*
|
||||
* There is only one instace of each module per the process.
|
||||
*/
|
||||
static GHashTable *plugin_modules = NULL;
|
||||
|
||||
static gboolean mutter_plugin_manager_reload (MutterPluginManager *plugin_mgr);
|
||||
|
||||
struct MutterPluginManager
|
||||
{
|
||||
MetaScreen *screen;
|
||||
|
||||
GList *plugins;
|
||||
GList *unload; /* Plugins that are disabled and pending unload */
|
||||
|
||||
guint idle_unload_id;
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* Checks that the plugin is compatible with the WM and sets up the plugin
|
||||
* struct.
|
||||
*/
|
||||
static MutterPlugin *
|
||||
mutter_plugin_load (MutterPluginManager *mgr,
|
||||
MutterModule *module,
|
||||
const gchar *params)
|
||||
{
|
||||
MutterPlugin *plugin = NULL;
|
||||
GType plugin_type = mutter_module_get_plugin_type (module);
|
||||
|
||||
if (!plugin_type)
|
||||
{
|
||||
g_warning ("Plugin type not registered !!!");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
plugin = g_object_new (plugin_type,
|
||||
"screen", mgr->screen,
|
||||
"params", params,
|
||||
NULL);
|
||||
|
||||
return plugin;
|
||||
}
|
||||
|
||||
/*
|
||||
* Attempst to unload a plugin; returns FALSE if plugin cannot be unloaded at
|
||||
* present (e.g., and effect is in progress) and should be scheduled for
|
||||
* removal later.
|
||||
*/
|
||||
static gboolean
|
||||
mutter_plugin_unload (MutterPlugin *plugin)
|
||||
{
|
||||
if (mutter_plugin_running (plugin))
|
||||
{
|
||||
g_object_set (plugin, "disabled", TRUE, NULL);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
g_object_unref (plugin);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
* Iddle callback to remove plugins that could not be removed directly and are
|
||||
* pending for removal.
|
||||
*/
|
||||
static gboolean
|
||||
mutter_plugin_manager_idle_unload (MutterPluginManager *plugin_mgr)
|
||||
{
|
||||
GList *l = plugin_mgr->unload;
|
||||
gboolean dont_remove = TRUE;
|
||||
|
||||
while (l)
|
||||
{
|
||||
MutterPlugin *plugin = l->data;
|
||||
|
||||
if (mutter_plugin_unload (plugin))
|
||||
{
|
||||
/* Remove from list */
|
||||
GList *p = l->prev;
|
||||
GList *n = l->next;
|
||||
|
||||
if (!p)
|
||||
plugin_mgr->unload = n;
|
||||
else
|
||||
p->next = n;
|
||||
|
||||
if (n)
|
||||
n->prev = p;
|
||||
|
||||
g_list_free_1 (l);
|
||||
|
||||
l = n;
|
||||
}
|
||||
else
|
||||
l = l->next;
|
||||
}
|
||||
|
||||
if (!plugin_mgr->unload)
|
||||
{
|
||||
/* If no more unloads are pending, remove the handler as well */
|
||||
dont_remove = FALSE;
|
||||
plugin_mgr->idle_unload_id = 0;
|
||||
}
|
||||
|
||||
return dont_remove;
|
||||
}
|
||||
|
||||
/*
|
||||
* Unloads all plugins
|
||||
*/
|
||||
static void
|
||||
mutter_plugin_manager_unload (MutterPluginManager *plugin_mgr)
|
||||
{
|
||||
GList *plugins = plugin_mgr->plugins;
|
||||
|
||||
while (plugins)
|
||||
{
|
||||
MutterPlugin *plugin = plugins->data;
|
||||
|
||||
/* If the plugin could not be removed, move it to the unload list */
|
||||
if (!mutter_plugin_unload (plugin))
|
||||
{
|
||||
plugin_mgr->unload = g_list_prepend (plugin_mgr->unload, plugin);
|
||||
|
||||
if (!plugin_mgr->idle_unload_id)
|
||||
{
|
||||
plugin_mgr->idle_unload_id = g_idle_add ((GSourceFunc)
|
||||
mutter_plugin_manager_idle_unload,
|
||||
plugin_mgr);
|
||||
}
|
||||
}
|
||||
|
||||
plugins = plugins->next;
|
||||
}
|
||||
|
||||
g_list_free (plugin_mgr->plugins);
|
||||
plugin_mgr->plugins = NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
prefs_changed_callback (MetaPreference pref,
|
||||
void *data)
|
||||
{
|
||||
MutterPluginManager *plugin_mgr = data;
|
||||
|
||||
if (pref == META_PREF_CLUTTER_PLUGINS)
|
||||
{
|
||||
mutter_plugin_manager_reload (plugin_mgr);
|
||||
}
|
||||
}
|
||||
|
||||
static MutterModule *
|
||||
mutter_plugin_manager_get_module (const gchar *path)
|
||||
{
|
||||
MutterModule *module = g_hash_table_lookup (plugin_modules, path);
|
||||
|
||||
if (!module &&
|
||||
(module = g_object_new (MUTTER_TYPE_MODULE, "path", path, NULL)))
|
||||
{
|
||||
g_hash_table_insert (plugin_modules, g_strdup (path), module);
|
||||
}
|
||||
|
||||
return module;
|
||||
}
|
||||
|
||||
/*
|
||||
* Loads all plugins listed in gconf registry.
|
||||
*/
|
||||
static gboolean
|
||||
mutter_plugin_manager_load (MutterPluginManager *plugin_mgr)
|
||||
{
|
||||
const gchar *dpath = MUTTER_PLUGIN_DIR "/";
|
||||
GSList *plugins, *fallback = NULL;
|
||||
|
||||
plugins = meta_prefs_get_clutter_plugins ();
|
||||
|
||||
if (!plugins)
|
||||
{
|
||||
/*
|
||||
* If no plugins are specified, try to load the default plugin.
|
||||
*/
|
||||
fallback = g_slist_append (fallback, "default");
|
||||
plugins = fallback;
|
||||
}
|
||||
|
||||
while (plugins)
|
||||
{
|
||||
gchar *plugin_string;
|
||||
gchar *params;
|
||||
|
||||
plugin_string = g_strdup (plugins->data);
|
||||
|
||||
if (plugin_string)
|
||||
{
|
||||
MutterModule *module;
|
||||
gchar *path;
|
||||
|
||||
params = strchr (plugin_string, ':');
|
||||
|
||||
if (params)
|
||||
{
|
||||
*params = 0;
|
||||
++params;
|
||||
}
|
||||
|
||||
if (g_path_is_absolute (plugin_string))
|
||||
path = g_strdup (plugin_string);
|
||||
else
|
||||
path = g_strconcat (dpath, plugin_string, ".so", NULL);
|
||||
|
||||
module = mutter_plugin_manager_get_module (path);
|
||||
|
||||
if (module)
|
||||
{
|
||||
MutterPlugin *p;
|
||||
gboolean use_succeeded;
|
||||
|
||||
/*
|
||||
* This dlopens the module and registers the plugin type with the
|
||||
* GType system, if the module is not already loaded. When we
|
||||
* create a plugin, the type system also calls g_type_module_use()
|
||||
* to guarantee the module will not be unloaded during the plugin
|
||||
* life time. Consequently we can unuse() the module again.
|
||||
*/
|
||||
use_succeeded = g_type_module_use (G_TYPE_MODULE (module));
|
||||
|
||||
if (use_succeeded &&
|
||||
(p = mutter_plugin_load (plugin_mgr, module, params)))
|
||||
{
|
||||
plugin_mgr->plugins = g_list_prepend (plugin_mgr->plugins, p);
|
||||
}
|
||||
else
|
||||
{
|
||||
g_warning ("Plugin load for [%s] failed", path);
|
||||
}
|
||||
|
||||
if (use_succeeded)
|
||||
g_type_module_unuse (G_TYPE_MODULE (module));
|
||||
}
|
||||
else
|
||||
g_warning ("Unable to load plugin module [%s]: %s",
|
||||
path, g_module_error());
|
||||
|
||||
g_free (path);
|
||||
g_free (plugin_string);
|
||||
}
|
||||
|
||||
plugins = plugins->next;
|
||||
}
|
||||
|
||||
|
||||
if (fallback)
|
||||
g_slist_free (fallback);
|
||||
|
||||
if (plugin_mgr->plugins != NULL)
|
||||
{
|
||||
meta_prefs_add_listener (prefs_changed_callback, plugin_mgr);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/*
|
||||
* Reloads all plugins
|
||||
*/
|
||||
static gboolean
|
||||
mutter_plugin_manager_reload (MutterPluginManager *plugin_mgr)
|
||||
{
|
||||
/* TODO -- brute force; should we build a list of plugins to load and list of
|
||||
* plugins to unload? We are probably not going to have large numbers of
|
||||
* plugins loaded at the same time, so it might not be worth it.
|
||||
*/
|
||||
mutter_plugin_manager_unload (plugin_mgr);
|
||||
return mutter_plugin_manager_load (plugin_mgr);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
mutter_plugin_manager_init (MutterPluginManager *plugin_mgr)
|
||||
{
|
||||
return mutter_plugin_manager_load (plugin_mgr);
|
||||
}
|
||||
|
||||
MutterPluginManager *
|
||||
mutter_plugin_manager_new (MetaScreen *screen)
|
||||
{
|
||||
MutterPluginManager *plugin_mgr;
|
||||
|
||||
if (!plugin_modules)
|
||||
{
|
||||
plugin_modules = g_hash_table_new_full (g_str_hash, g_str_equal, g_free,
|
||||
NULL);
|
||||
}
|
||||
|
||||
plugin_mgr = g_new0 (MutterPluginManager, 1);
|
||||
|
||||
plugin_mgr->screen = screen;
|
||||
|
||||
if (!mutter_plugin_manager_init (plugin_mgr))
|
||||
{
|
||||
g_free (plugin_mgr);
|
||||
plugin_mgr = NULL;
|
||||
}
|
||||
|
||||
return plugin_mgr;
|
||||
}
|
||||
|
||||
static void
|
||||
mutter_plugin_manager_kill_effect (MutterPluginManager *plugin_mgr,
|
||||
MutterWindow *actor,
|
||||
unsigned long events)
|
||||
{
|
||||
GList *l = plugin_mgr->plugins;
|
||||
|
||||
while (l)
|
||||
{
|
||||
MutterPlugin *plugin = l->data;
|
||||
MutterPluginClass *klass = MUTTER_PLUGIN_GET_CLASS (plugin);
|
||||
|
||||
if (!mutter_plugin_disabled (plugin)
|
||||
&& (mutter_plugin_features (plugin) & events)
|
||||
&& klass->kill_effect)
|
||||
klass->kill_effect (plugin, actor, events);
|
||||
|
||||
l = l->next;
|
||||
}
|
||||
}
|
||||
|
||||
#define ALL_BUT_SWITCH \
|
||||
MUTTER_PLUGIN_ALL_EFFECTS & \
|
||||
~MUTTER_PLUGIN_SWITCH_WORKSPACE
|
||||
/*
|
||||
* Public method that the compositor hooks into for events that require
|
||||
* no additional parameters.
|
||||
*
|
||||
* Returns TRUE if at least one of the plugins handled the event type (i.e.,
|
||||
* if the return value is FALSE, there will be no subsequent call to the
|
||||
* manager completed() callback, and the compositor must ensure that any
|
||||
* appropriate post-effect cleanup is carried out.
|
||||
*/
|
||||
gboolean
|
||||
mutter_plugin_manager_event_simple (MutterPluginManager *plugin_mgr,
|
||||
MutterWindow *actor,
|
||||
unsigned long event)
|
||||
{
|
||||
GList *l = plugin_mgr->plugins;
|
||||
gboolean retval = FALSE;
|
||||
|
||||
while (l)
|
||||
{
|
||||
MutterPlugin *plugin = l->data;
|
||||
MutterPluginClass *klass = MUTTER_PLUGIN_GET_CLASS (plugin);
|
||||
|
||||
if (!mutter_plugin_disabled (plugin) &&
|
||||
(mutter_plugin_features (plugin) & event))
|
||||
{
|
||||
retval = TRUE;
|
||||
|
||||
switch (event)
|
||||
{
|
||||
case MUTTER_PLUGIN_MINIMIZE:
|
||||
if (klass->minimize)
|
||||
{
|
||||
mutter_plugin_manager_kill_effect (
|
||||
plugin_mgr,
|
||||
actor,
|
||||
ALL_BUT_SWITCH);
|
||||
|
||||
_mutter_plugin_effect_started (plugin);
|
||||
klass->minimize (plugin, actor);
|
||||
}
|
||||
break;
|
||||
case MUTTER_PLUGIN_MAP:
|
||||
if (klass->map)
|
||||
{
|
||||
mutter_plugin_manager_kill_effect (
|
||||
plugin_mgr,
|
||||
actor,
|
||||
ALL_BUT_SWITCH);
|
||||
|
||||
_mutter_plugin_effect_started (plugin);
|
||||
klass->map (plugin, actor);
|
||||
}
|
||||
break;
|
||||
case MUTTER_PLUGIN_DESTROY:
|
||||
if (klass->destroy)
|
||||
{
|
||||
_mutter_plugin_effect_started (plugin);
|
||||
klass->destroy (plugin, actor);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
g_warning ("Incorrect handler called for event %lu", event);
|
||||
}
|
||||
}
|
||||
|
||||
l = l->next;
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
/*
|
||||
* The public method that the compositor hooks into for maximize and unmaximize
|
||||
* events.
|
||||
*
|
||||
* Returns TRUE if at least one of the plugins handled the event type (i.e.,
|
||||
* if the return value is FALSE, there will be no subsequent call to the
|
||||
* manager completed() callback, and the compositor must ensure that any
|
||||
* appropriate post-effect cleanup is carried out.
|
||||
*/
|
||||
gboolean
|
||||
mutter_plugin_manager_event_maximize (MutterPluginManager *plugin_mgr,
|
||||
MutterWindow *actor,
|
||||
unsigned long event,
|
||||
gint target_x,
|
||||
gint target_y,
|
||||
gint target_width,
|
||||
gint target_height)
|
||||
{
|
||||
GList *l = plugin_mgr->plugins;
|
||||
gboolean retval = FALSE;
|
||||
|
||||
while (l)
|
||||
{
|
||||
MutterPlugin *plugin = l->data;
|
||||
MutterPluginClass *klass = MUTTER_PLUGIN_GET_CLASS (plugin);
|
||||
|
||||
if (!mutter_plugin_disabled (plugin) &&
|
||||
(mutter_plugin_features (plugin) & event))
|
||||
{
|
||||
retval = TRUE;
|
||||
|
||||
switch (event)
|
||||
{
|
||||
case MUTTER_PLUGIN_MAXIMIZE:
|
||||
if (klass->maximize)
|
||||
{
|
||||
mutter_plugin_manager_kill_effect (
|
||||
plugin_mgr,
|
||||
actor,
|
||||
ALL_BUT_SWITCH);
|
||||
|
||||
_mutter_plugin_effect_started (plugin);
|
||||
klass->maximize (plugin, actor,
|
||||
target_x, target_y,
|
||||
target_width, target_height);
|
||||
}
|
||||
break;
|
||||
case MUTTER_PLUGIN_UNMAXIMIZE:
|
||||
if (klass->unmaximize)
|
||||
{
|
||||
mutter_plugin_manager_kill_effect (
|
||||
plugin_mgr,
|
||||
actor,
|
||||
ALL_BUT_SWITCH);
|
||||
|
||||
_mutter_plugin_effect_started (plugin);
|
||||
klass->unmaximize (plugin, actor,
|
||||
target_x, target_y,
|
||||
target_width, target_height);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
g_warning ("Incorrect handler called for event %lu", event);
|
||||
}
|
||||
}
|
||||
|
||||
l = l->next;
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
/*
|
||||
* The public method that the compositor hooks into for desktop switching.
|
||||
*
|
||||
* Returns TRUE if at least one of the plugins handled the event type (i.e.,
|
||||
* if the return value is FALSE, there will be no subsequent call to the
|
||||
* manager completed() callback, and the compositor must ensure that any
|
||||
* appropriate post-effect cleanup is carried out.
|
||||
*/
|
||||
gboolean
|
||||
mutter_plugin_manager_switch_workspace (MutterPluginManager *plugin_mgr,
|
||||
const GList **actors,
|
||||
gint from,
|
||||
gint to,
|
||||
MetaMotionDirection direction)
|
||||
{
|
||||
GList *l = plugin_mgr->plugins;
|
||||
gboolean retval = FALSE;
|
||||
|
||||
while (l)
|
||||
{
|
||||
MutterPlugin *plugin = l->data;
|
||||
MutterPluginClass *klass = MUTTER_PLUGIN_GET_CLASS (plugin);
|
||||
|
||||
if (!mutter_plugin_disabled (plugin) &&
|
||||
(mutter_plugin_features (plugin) & MUTTER_PLUGIN_SWITCH_WORKSPACE) &&
|
||||
(actors && *actors))
|
||||
{
|
||||
if (klass->switch_workspace)
|
||||
{
|
||||
retval = TRUE;
|
||||
mutter_plugin_manager_kill_effect (
|
||||
plugin_mgr,
|
||||
MUTTER_WINDOW ((*actors)->data),
|
||||
MUTTER_PLUGIN_SWITCH_WORKSPACE);
|
||||
|
||||
_mutter_plugin_effect_started (plugin);
|
||||
klass->switch_workspace (plugin, actors, from, to, direction);
|
||||
}
|
||||
}
|
||||
|
||||
l = l->next;
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
/*
|
||||
* The public method that the compositor hooks into for desktop switching.
|
||||
*
|
||||
* Returns TRUE if at least one of the plugins handled the event type (i.e.,
|
||||
* if the return value is FALSE, there will be no subsequent call to the
|
||||
* manager completed() callback, and the compositor must ensure that any
|
||||
* appropriate post-effect cleanup is carried out.
|
||||
*/
|
||||
gboolean
|
||||
mutter_plugin_manager_xevent_filter (MutterPluginManager *plugin_mgr,
|
||||
XEvent *xev)
|
||||
{
|
||||
GList *l;
|
||||
|
||||
if (!plugin_mgr)
|
||||
return FALSE;
|
||||
|
||||
l = plugin_mgr->plugins;
|
||||
|
||||
while (l)
|
||||
{
|
||||
MutterPlugin *plugin = l->data;
|
||||
MutterPluginClass *klass = MUTTER_PLUGIN_GET_CLASS (plugin);
|
||||
|
||||
if (klass->xevent_filter)
|
||||
{
|
||||
if (klass->xevent_filter (plugin, xev) == TRUE)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
l = l->next;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
61
src/compositor/mutter/mutter-plugin-manager.h
Normal file
61
src/compositor/mutter/mutter-plugin-manager.h
Normal file
@@ -0,0 +1,61 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2008 Intel Corp.
|
||||
*
|
||||
* Author: Tomas Frydrych <tf@linux.intel.com>
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef MUTTER_PLUGIN_MANAGER_H_
|
||||
#define MUTTER_PLUGIN_MANAGER_H_
|
||||
|
||||
#include "types.h"
|
||||
#include "screen.h"
|
||||
|
||||
#define MUTTER_PLUGIN_FROM_MANAGER_
|
||||
#include "mutter-plugin.h"
|
||||
#undef MUTTER_PLUGIN_FROM_MANAGER_
|
||||
|
||||
typedef struct MutterPluginManager MutterPluginManager;
|
||||
|
||||
MutterPluginManager * mutter_plugin_manager_new (MetaScreen *screen);
|
||||
gboolean mutter_plugin_manager_event_simple (MutterPluginManager *mgr,
|
||||
MutterWindow *actor,
|
||||
unsigned long event);
|
||||
|
||||
gboolean mutter_plugin_manager_event_maximize (MutterPluginManager *mgr,
|
||||
MutterWindow *actor,
|
||||
unsigned long event,
|
||||
gint target_x,
|
||||
gint target_y,
|
||||
gint target_width,
|
||||
gint target_height);
|
||||
void mutter_plugin_manager_update_workspaces (MutterPluginManager *mgr);
|
||||
|
||||
void mutter_plugin_manager_update_workspace (MutterPluginManager *mgr, MetaWorkspace *w);
|
||||
|
||||
gboolean mutter_plugin_manager_switch_workspace (MutterPluginManager *mgr,
|
||||
const GList **actors,
|
||||
gint from,
|
||||
gint to,
|
||||
MetaMotionDirection direction);
|
||||
|
||||
gboolean mutter_plugin_manager_xevent_filter (MutterPluginManager *mgr,
|
||||
XEvent *xev);
|
||||
|
||||
#endif
|
515
src/compositor/mutter/mutter-plugin.c
Normal file
515
src/compositor/mutter/mutter-plugin.c
Normal file
@@ -0,0 +1,515 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2008 Intel Corp.
|
||||
*
|
||||
* Author: Tomas Frydrych <tf@linux.intel.com>
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include "mutter-plugin.h"
|
||||
#include "screen.h"
|
||||
#include "display.h"
|
||||
|
||||
#include <string.h>
|
||||
#include <X11/Xlib.h>
|
||||
#include <X11/extensions/Xfixes.h>
|
||||
#include <X11/extensions/shape.h>
|
||||
#include <clutter/x11/clutter-x11.h>
|
||||
|
||||
G_DEFINE_ABSTRACT_TYPE (MutterPlugin, mutter_plugin, G_TYPE_OBJECT);
|
||||
|
||||
#define MUTTER_PLUGIN_GET_PRIVATE(obj) \
|
||||
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), MUTTER_TYPE_PLUGIN, MutterPluginPrivate))
|
||||
|
||||
enum
|
||||
{
|
||||
PROP_0,
|
||||
PROP_SCREEN,
|
||||
PROP_PARAMS,
|
||||
PROP_FEATURES,
|
||||
PROP_DISABLED,
|
||||
PROP_DEBUG_MODE,
|
||||
};
|
||||
|
||||
struct _MutterPluginPrivate
|
||||
{
|
||||
MetaScreen *screen;
|
||||
gchar *params;
|
||||
gulong features;
|
||||
|
||||
gint running;
|
||||
|
||||
gboolean disabled : 1;
|
||||
gboolean debug : 1;
|
||||
};
|
||||
|
||||
static void
|
||||
mutter_plugin_dispose (GObject *object)
|
||||
{
|
||||
G_OBJECT_CLASS (mutter_plugin_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
static void
|
||||
mutter_plugin_finalize (GObject *object)
|
||||
{
|
||||
MutterPluginPrivate *priv = MUTTER_PLUGIN (object)->priv;
|
||||
|
||||
g_free (priv->params);
|
||||
priv->params = NULL;
|
||||
|
||||
G_OBJECT_CLASS (mutter_plugin_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
mutter_plugin_parse_params (MutterPlugin *plugin)
|
||||
{
|
||||
char *p;
|
||||
gulong features = 0;
|
||||
MutterPluginPrivate *priv = plugin->priv;
|
||||
MutterPluginClass *klass = MUTTER_PLUGIN_GET_CLASS (plugin);
|
||||
|
||||
/*
|
||||
* Feature flags: identify events that the plugin can handle; a plugin can
|
||||
* handle one or more events.
|
||||
*/
|
||||
if (klass->minimize)
|
||||
features |= MUTTER_PLUGIN_MINIMIZE;
|
||||
|
||||
if (klass->maximize)
|
||||
features |= MUTTER_PLUGIN_MAXIMIZE;
|
||||
|
||||
if (klass->unmaximize)
|
||||
features |= MUTTER_PLUGIN_UNMAXIMIZE;
|
||||
|
||||
if (klass->map)
|
||||
features |= MUTTER_PLUGIN_MAP;
|
||||
|
||||
if (klass->destroy)
|
||||
features |= MUTTER_PLUGIN_DESTROY;
|
||||
|
||||
if (klass->switch_workspace)
|
||||
features |= MUTTER_PLUGIN_SWITCH_WORKSPACE;
|
||||
|
||||
if (priv->params)
|
||||
{
|
||||
gboolean debug = FALSE;
|
||||
|
||||
if ((p = strstr (priv->params, "disable:")))
|
||||
{
|
||||
gchar *d = g_strdup (p+8);
|
||||
|
||||
p = strchr (d, ';');
|
||||
|
||||
if (p)
|
||||
*p = 0;
|
||||
|
||||
if (strstr (d, "minimize"))
|
||||
features &= ~ MUTTER_PLUGIN_MINIMIZE;
|
||||
|
||||
if (strstr (d, "maximize"))
|
||||
features &= ~ MUTTER_PLUGIN_MAXIMIZE;
|
||||
|
||||
if (strstr (d, "unmaximize"))
|
||||
features &= ~ MUTTER_PLUGIN_UNMAXIMIZE;
|
||||
|
||||
if (strstr (d, "map"))
|
||||
features &= ~ MUTTER_PLUGIN_MAP;
|
||||
|
||||
if (strstr (d, "destroy"))
|
||||
features &= ~ MUTTER_PLUGIN_DESTROY;
|
||||
|
||||
if (strstr (d, "switch-workspace"))
|
||||
features &= ~MUTTER_PLUGIN_SWITCH_WORKSPACE;
|
||||
|
||||
g_free (d);
|
||||
}
|
||||
|
||||
if (strstr (priv->params, "debug"))
|
||||
debug = TRUE;
|
||||
|
||||
if (debug != priv->debug)
|
||||
{
|
||||
priv->debug = debug;
|
||||
|
||||
g_object_notify (G_OBJECT (plugin), "debug-mode");
|
||||
}
|
||||
}
|
||||
|
||||
if (features != priv->features)
|
||||
{
|
||||
priv->features = features;
|
||||
|
||||
g_object_notify (G_OBJECT (plugin), "features");
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
mutter_plugin_set_property (GObject *object,
|
||||
guint prop_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
MutterPluginPrivate *priv = MUTTER_PLUGIN (object)->priv;
|
||||
|
||||
switch (prop_id)
|
||||
{
|
||||
case PROP_SCREEN:
|
||||
priv->screen = g_value_get_object (value);
|
||||
break;
|
||||
case PROP_PARAMS:
|
||||
priv->params = g_value_dup_string (value);
|
||||
mutter_plugin_parse_params (MUTTER_PLUGIN (object));
|
||||
break;
|
||||
case PROP_DISABLED:
|
||||
priv->disabled = g_value_get_boolean (value);
|
||||
break;
|
||||
case PROP_DEBUG_MODE:
|
||||
priv->debug = g_value_get_boolean (value);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
mutter_plugin_get_property (GObject *object,
|
||||
guint prop_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
MutterPluginPrivate *priv = MUTTER_PLUGIN (object)->priv;
|
||||
|
||||
switch (prop_id)
|
||||
{
|
||||
case PROP_SCREEN:
|
||||
g_value_set_object (value, priv->screen);
|
||||
break;
|
||||
case PROP_PARAMS:
|
||||
g_value_set_string (value, priv->params);
|
||||
break;
|
||||
case PROP_DISABLED:
|
||||
g_value_set_boolean (value, priv->disabled);
|
||||
break;
|
||||
case PROP_DEBUG_MODE:
|
||||
g_value_set_boolean (value, priv->debug);
|
||||
break;
|
||||
case PROP_FEATURES:
|
||||
g_value_set_ulong (value, priv->features);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
mutter_plugin_class_init (MutterPluginClass *klass)
|
||||
{
|
||||
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||
|
||||
gobject_class->finalize = mutter_plugin_finalize;
|
||||
gobject_class->dispose = mutter_plugin_dispose;
|
||||
gobject_class->set_property = mutter_plugin_set_property;
|
||||
gobject_class->get_property = mutter_plugin_get_property;
|
||||
|
||||
g_object_class_install_property (gobject_class,
|
||||
PROP_SCREEN,
|
||||
g_param_spec_object ("screen",
|
||||
"MetaScreen",
|
||||
"MetaScreen",
|
||||
META_TYPE_SCREEN,
|
||||
G_PARAM_READWRITE |
|
||||
G_PARAM_CONSTRUCT_ONLY));
|
||||
|
||||
g_object_class_install_property (gobject_class,
|
||||
PROP_PARAMS,
|
||||
g_param_spec_string ("params",
|
||||
"Parameters",
|
||||
"Plugin Parameters",
|
||||
NULL,
|
||||
G_PARAM_READWRITE |
|
||||
G_PARAM_CONSTRUCT));
|
||||
|
||||
g_object_class_install_property (gobject_class,
|
||||
PROP_FEATURES,
|
||||
g_param_spec_ulong ("features",
|
||||
"Features",
|
||||
"Plugin Features",
|
||||
0 , G_MAXULONG, 0,
|
||||
G_PARAM_READABLE));
|
||||
|
||||
g_object_class_install_property (gobject_class,
|
||||
PROP_DISABLED,
|
||||
g_param_spec_boolean ("disabled",
|
||||
"Plugin disabled",
|
||||
"Plugin disabled",
|
||||
FALSE,
|
||||
G_PARAM_READWRITE));
|
||||
|
||||
g_object_class_install_property (gobject_class,
|
||||
PROP_DEBUG_MODE,
|
||||
g_param_spec_boolean ("debug-mode",
|
||||
"Debug Mode",
|
||||
"Debug Mode",
|
||||
FALSE,
|
||||
G_PARAM_READABLE));
|
||||
|
||||
g_type_class_add_private (gobject_class, sizeof (MutterPluginPrivate));
|
||||
}
|
||||
|
||||
static void
|
||||
mutter_plugin_init (MutterPlugin *self)
|
||||
{
|
||||
MutterPluginPrivate *priv;
|
||||
|
||||
self->priv = priv = MUTTER_PLUGIN_GET_PRIVATE (self);
|
||||
}
|
||||
|
||||
gulong
|
||||
mutter_plugin_features (MutterPlugin *plugin)
|
||||
{
|
||||
MutterPluginPrivate *priv = MUTTER_PLUGIN (plugin)->priv;
|
||||
|
||||
return priv->features;
|
||||
}
|
||||
|
||||
gboolean
|
||||
mutter_plugin_disabled (MutterPlugin *plugin)
|
||||
{
|
||||
MutterPluginPrivate *priv = MUTTER_PLUGIN (plugin)->priv;
|
||||
|
||||
return priv->disabled;
|
||||
}
|
||||
|
||||
gboolean
|
||||
mutter_plugin_running (MutterPlugin *plugin)
|
||||
{
|
||||
MutterPluginPrivate *priv = MUTTER_PLUGIN (plugin)->priv;
|
||||
|
||||
return (priv->running > 0);
|
||||
}
|
||||
|
||||
gboolean
|
||||
mutter_plugin_debug_mode (MutterPlugin *plugin)
|
||||
{
|
||||
MutterPluginPrivate *priv = MUTTER_PLUGIN (plugin)->priv;
|
||||
|
||||
return priv->debug;
|
||||
}
|
||||
|
||||
const MutterPluginInfo *
|
||||
mutter_plugin_get_info (MutterPlugin *plugin)
|
||||
{
|
||||
MutterPluginClass *klass = MUTTER_PLUGIN_GET_CLASS (plugin);
|
||||
|
||||
if (klass && klass->plugin_info)
|
||||
return klass->plugin_info (plugin);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ClutterActor *
|
||||
mutter_plugin_get_overlay_group (MutterPlugin *plugin)
|
||||
{
|
||||
MutterPluginPrivate *priv = MUTTER_PLUGIN (plugin)->priv;
|
||||
|
||||
return mutter_get_overlay_group_for_screen (priv->screen);
|
||||
}
|
||||
|
||||
ClutterActor *
|
||||
mutter_plugin_get_stage (MutterPlugin *plugin)
|
||||
{
|
||||
MutterPluginPrivate *priv = MUTTER_PLUGIN (plugin)->priv;
|
||||
|
||||
return mutter_get_stage_for_screen (priv->screen);
|
||||
}
|
||||
|
||||
ClutterActor *
|
||||
mutter_plugin_get_window_group (MutterPlugin *plugin)
|
||||
{
|
||||
MutterPluginPrivate *priv = MUTTER_PLUGIN (plugin)->priv;
|
||||
|
||||
return mutter_get_window_group_for_screen (priv->screen);
|
||||
}
|
||||
|
||||
/**
|
||||
* _mutter_plugin_effect_started:
|
||||
* @plugin: the plugin
|
||||
*
|
||||
* Mark that an effect has started for the plugin. This is called
|
||||
* internally by MutterPluginManager.
|
||||
*/
|
||||
void
|
||||
_mutter_plugin_effect_started (MutterPlugin *plugin)
|
||||
{
|
||||
MutterPluginPrivate *priv = MUTTER_PLUGIN (plugin)->priv;
|
||||
|
||||
priv->running++;
|
||||
}
|
||||
|
||||
void
|
||||
mutter_plugin_effect_completed (MutterPlugin *plugin,
|
||||
MutterWindow *actor,
|
||||
unsigned long event)
|
||||
{
|
||||
MutterPluginPrivate *priv = MUTTER_PLUGIN (plugin)->priv;
|
||||
|
||||
if (priv->running-- < 0)
|
||||
{
|
||||
g_warning ("Error in running effect accounting, adjusting.");
|
||||
priv->running = 0;
|
||||
}
|
||||
|
||||
if (!actor)
|
||||
{
|
||||
const MutterPluginInfo *info;
|
||||
const gchar *name = NULL;
|
||||
|
||||
if (plugin && (info = mutter_plugin_get_info (plugin)))
|
||||
name = info->name;
|
||||
|
||||
g_warning ("Plugin [%s] passed NULL for actor!",
|
||||
name ? name : "unknown");
|
||||
}
|
||||
|
||||
mutter_window_effect_completed (actor, event);
|
||||
}
|
||||
|
||||
void
|
||||
mutter_plugin_query_screen_size (MutterPlugin *plugin,
|
||||
int *width,
|
||||
int *height)
|
||||
{
|
||||
MutterPluginPrivate *priv = MUTTER_PLUGIN (plugin)->priv;
|
||||
|
||||
meta_screen_get_size (priv->screen, width, height);
|
||||
}
|
||||
|
||||
void
|
||||
mutter_plugin_set_stage_reactive (MutterPlugin *plugin,
|
||||
gboolean reactive)
|
||||
{
|
||||
MutterPluginPrivate *priv = MUTTER_PLUGIN (plugin)->priv;
|
||||
MetaScreen *screen = priv->screen;
|
||||
MetaDisplay *display = meta_screen_get_display (screen);
|
||||
Display *xdpy = meta_display_get_xdisplay (display);
|
||||
Window xstage, xoverlay;
|
||||
ClutterActor *stage;
|
||||
|
||||
stage = mutter_get_stage_for_screen (screen);
|
||||
xstage = clutter_x11_get_stage_window (CLUTTER_STAGE (stage));
|
||||
xoverlay = mutter_get_overlay_window (screen);
|
||||
|
||||
static XserverRegion region = None;
|
||||
|
||||
if (region == None)
|
||||
region = XFixesCreateRegion (xdpy, NULL, 0);
|
||||
|
||||
if (reactive)
|
||||
{
|
||||
XFixesSetWindowShapeRegion (xdpy, xstage,
|
||||
ShapeInput, 0, 0, None);
|
||||
XFixesSetWindowShapeRegion (xdpy, xoverlay,
|
||||
ShapeInput, 0, 0, None);
|
||||
}
|
||||
else
|
||||
{
|
||||
XFixesSetWindowShapeRegion (xdpy, xstage,
|
||||
ShapeInput, 0, 0, region);
|
||||
XFixesSetWindowShapeRegion (xdpy, xoverlay,
|
||||
ShapeInput, 0, 0, region);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
mutter_plugin_set_stage_input_area (MutterPlugin *plugin,
|
||||
gint x, gint y, gint width, gint height)
|
||||
{
|
||||
MutterPluginPrivate *priv = MUTTER_PLUGIN (plugin)->priv;
|
||||
MetaScreen *screen = priv->screen;
|
||||
MetaDisplay *display = meta_screen_get_display (screen);
|
||||
Display *xdpy = meta_display_get_xdisplay (display);
|
||||
Window xstage, xoverlay;
|
||||
ClutterActor *stage;
|
||||
XRectangle rect;
|
||||
XserverRegion region;
|
||||
|
||||
stage = mutter_get_stage_for_screen (screen);
|
||||
xstage = clutter_x11_get_stage_window (CLUTTER_STAGE (stage));
|
||||
xoverlay = mutter_get_overlay_window (screen);
|
||||
|
||||
rect.x = x;
|
||||
rect.y = y;
|
||||
rect.width = width;
|
||||
rect.height = height;
|
||||
|
||||
region = XFixesCreateRegion (xdpy, &rect, 1);
|
||||
|
||||
XFixesSetWindowShapeRegion (xdpy, xstage, ShapeInput, 0, 0, region);
|
||||
XFixesSetWindowShapeRegion (xdpy, xoverlay, ShapeInput, 0, 0, region);
|
||||
|
||||
XFixesDestroyRegion (xdpy, region);
|
||||
}
|
||||
|
||||
void
|
||||
mutter_plugin_set_stage_input_region (MutterPlugin *plugin,
|
||||
XserverRegion region)
|
||||
{
|
||||
MutterPluginPrivate *priv = MUTTER_PLUGIN (plugin)->priv;
|
||||
MetaScreen *screen = priv->screen;
|
||||
MetaDisplay *display = meta_screen_get_display (screen);
|
||||
Display *xdpy = meta_display_get_xdisplay (display);
|
||||
Window xstage, xoverlay;
|
||||
ClutterActor *stage;
|
||||
|
||||
stage = mutter_get_stage_for_screen (screen);
|
||||
xstage = clutter_x11_get_stage_window (CLUTTER_STAGE (stage));
|
||||
xoverlay = mutter_get_overlay_window (screen);
|
||||
|
||||
XFixesSetWindowShapeRegion (xdpy, xstage, ShapeInput, 0, 0, region);
|
||||
XFixesSetWindowShapeRegion (xdpy, xoverlay, ShapeInput, 0, 0, region);
|
||||
}
|
||||
|
||||
GList *
|
||||
mutter_plugin_get_windows (MutterPlugin *plugin)
|
||||
{
|
||||
MutterPluginPrivate *priv = MUTTER_PLUGIN (plugin)->priv;
|
||||
|
||||
return mutter_get_windows (priv->screen);
|
||||
}
|
||||
|
||||
Display *
|
||||
mutter_plugin_get_xdisplay (MutterPlugin *plugin)
|
||||
{
|
||||
MutterPluginPrivate *priv = MUTTER_PLUGIN (plugin)->priv;
|
||||
MetaDisplay *display = meta_screen_get_display (priv->screen);
|
||||
Display *xdpy = meta_display_get_xdisplay (display);
|
||||
|
||||
return xdpy;
|
||||
}
|
||||
|
||||
MetaScreen *
|
||||
mutter_plugin_get_screen (MutterPlugin *plugin)
|
||||
{
|
||||
MutterPluginPrivate *priv = MUTTER_PLUGIN (plugin)->priv;
|
||||
|
||||
return priv->screen;
|
||||
}
|
||||
|
466
src/compositor/mutter/mutter-shaped-texture.c
Executable file
466
src/compositor/mutter/mutter-shaped-texture.c
Executable file
@@ -0,0 +1,466 @@
|
||||
/*
|
||||
* shaped texture
|
||||
*
|
||||
* An actor to draw a texture clipped to a list of rectangles
|
||||
*
|
||||
* Authored By Neil Roberts <neil@linux.intel.com>
|
||||
*
|
||||
* Copyright (C) 2008 Intel Corporation
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#include "mutter-shaped-texture.h"
|
||||
|
||||
#include <clutter/clutter.h>
|
||||
#include <cogl/cogl.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
static void mutter_shaped_texture_dispose (GObject *object);
|
||||
static void mutter_shaped_texture_finalize (GObject *object);
|
||||
|
||||
static void mutter_shaped_texture_paint (ClutterActor *actor);
|
||||
static void mutter_shaped_texture_pick (ClutterActor *actor,
|
||||
const ClutterColor *color);
|
||||
|
||||
static void mutter_shaped_texture_dirty_mask (MutterShapedTexture *stex);
|
||||
|
||||
#ifdef HAVE_GLX_TEXTURE_PIXMAP
|
||||
G_DEFINE_TYPE (MutterShapedTexture, mutter_shaped_texture,
|
||||
CLUTTER_GLX_TYPE_TEXTURE_PIXMAP);
|
||||
#else /* HAVE_GLX_TEXTURE_PIXMAP */
|
||||
G_DEFINE_TYPE (MutterShapedTexture, mutter_shaped_texture,
|
||||
CLUTTER_X11_TYPE_TEXTURE_PIXMAP);
|
||||
#endif /* HAVE_GLX_TEXTURE_PIXMAP */
|
||||
|
||||
#define MUTTER_SHAPED_TEXTURE_GET_PRIVATE(obj) \
|
||||
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), MUTTER_TYPE_SHAPED_TEXTURE, \
|
||||
MutterShapedTexturePrivate))
|
||||
|
||||
struct _MutterShapedTexturePrivate
|
||||
{
|
||||
CoglHandle mask_texture;
|
||||
CoglHandle material;
|
||||
#if 1 /* see workaround comment in mutter_shaped_texture_paint */
|
||||
CoglHandle material_workaround;
|
||||
#endif
|
||||
|
||||
guint mask_width, mask_height;
|
||||
|
||||
GArray *rectangles;
|
||||
};
|
||||
|
||||
static void
|
||||
mutter_shaped_texture_class_init (MutterShapedTextureClass *klass)
|
||||
{
|
||||
GObjectClass *gobject_class = (GObjectClass *) klass;
|
||||
ClutterActorClass *actor_class = (ClutterActorClass *) klass;
|
||||
|
||||
gobject_class->dispose = mutter_shaped_texture_dispose;
|
||||
gobject_class->finalize = mutter_shaped_texture_finalize;
|
||||
|
||||
actor_class->paint = mutter_shaped_texture_paint;
|
||||
actor_class->pick = mutter_shaped_texture_pick;
|
||||
|
||||
g_type_class_add_private (klass, sizeof (MutterShapedTexturePrivate));
|
||||
}
|
||||
|
||||
static void
|
||||
mutter_shaped_texture_init (MutterShapedTexture *self)
|
||||
{
|
||||
MutterShapedTexturePrivate *priv;
|
||||
|
||||
priv = self->priv = MUTTER_SHAPED_TEXTURE_GET_PRIVATE (self);
|
||||
|
||||
priv->rectangles = g_array_new (FALSE, FALSE, sizeof (XRectangle));
|
||||
|
||||
priv->mask_texture = COGL_INVALID_HANDLE;
|
||||
}
|
||||
|
||||
static void
|
||||
mutter_shaped_texture_dispose (GObject *object)
|
||||
{
|
||||
MutterShapedTexture *self = (MutterShapedTexture *) object;
|
||||
MutterShapedTexturePrivate *priv = self->priv;
|
||||
|
||||
mutter_shaped_texture_dirty_mask (self);
|
||||
|
||||
if (priv->material != COGL_INVALID_HANDLE)
|
||||
{
|
||||
cogl_material_unref (priv->material);
|
||||
priv->material = COGL_INVALID_HANDLE;
|
||||
}
|
||||
#if 1 /* see comment in mutter_shaped_texture_paint */
|
||||
if (priv->material_workaround != COGL_INVALID_HANDLE)
|
||||
{
|
||||
cogl_material_unref (priv->material_workaround);
|
||||
priv->material_workaround = COGL_INVALID_HANDLE;
|
||||
}
|
||||
#endif
|
||||
|
||||
G_OBJECT_CLASS (mutter_shaped_texture_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
static void
|
||||
mutter_shaped_texture_finalize (GObject *object)
|
||||
{
|
||||
MutterShapedTexture *self = (MutterShapedTexture *) object;
|
||||
MutterShapedTexturePrivate *priv = self->priv;
|
||||
|
||||
g_array_free (priv->rectangles, TRUE);
|
||||
|
||||
G_OBJECT_CLASS (mutter_shaped_texture_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
mutter_shaped_texture_dirty_mask (MutterShapedTexture *stex)
|
||||
{
|
||||
MutterShapedTexturePrivate *priv = stex->priv;
|
||||
|
||||
if (priv->mask_texture != COGL_INVALID_HANDLE)
|
||||
{
|
||||
GLuint mask_gl_tex;
|
||||
GLenum mask_gl_target;
|
||||
|
||||
cogl_texture_get_gl_texture (priv->mask_texture,
|
||||
&mask_gl_tex, &mask_gl_target);
|
||||
|
||||
if (mask_gl_target == CGL_TEXTURE_RECTANGLE_ARB)
|
||||
glDeleteTextures (1, &mask_gl_tex);
|
||||
|
||||
cogl_texture_unref (priv->mask_texture);
|
||||
priv->mask_texture = COGL_INVALID_HANDLE;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
mutter_shaped_texture_ensure_mask (MutterShapedTexture *stex)
|
||||
{
|
||||
MutterShapedTexturePrivate *priv = stex->priv;
|
||||
CoglHandle paint_tex;
|
||||
guint tex_width, tex_height;
|
||||
|
||||
paint_tex = clutter_texture_get_cogl_texture (CLUTTER_TEXTURE (stex));
|
||||
|
||||
if (paint_tex == COGL_INVALID_HANDLE)
|
||||
return;
|
||||
|
||||
tex_width = cogl_texture_get_width (paint_tex);
|
||||
tex_height = cogl_texture_get_height (paint_tex);
|
||||
|
||||
/* If the mask texture we have was created for a different size then
|
||||
recreate it */
|
||||
if (priv->mask_texture != COGL_INVALID_HANDLE
|
||||
&& (priv->mask_width != tex_width || priv->mask_height != tex_height))
|
||||
mutter_shaped_texture_dirty_mask (stex);
|
||||
|
||||
/* If we don't have a mask texture yet then create one */
|
||||
if (priv->mask_texture == COGL_INVALID_HANDLE)
|
||||
{
|
||||
guchar *mask_data;
|
||||
const XRectangle *rect;
|
||||
GLenum paint_gl_target;
|
||||
|
||||
/* Create data for an empty image */
|
||||
mask_data = g_malloc0 (tex_width * tex_height);
|
||||
|
||||
/* Cut out a hole for each rectangle */
|
||||
for (rect = (XRectangle *) priv->rectangles->data
|
||||
+ priv->rectangles->len;
|
||||
rect-- > (XRectangle *) priv->rectangles->data;)
|
||||
{
|
||||
gint x1 = rect->x, x2 = x1 + rect->width;
|
||||
gint y1 = rect->y, y2 = y1 + rect->height;
|
||||
guchar *p;
|
||||
|
||||
/* Clip the rectangle to the size of the texture */
|
||||
x1 = CLAMP (x1, 0, (gint) tex_width - 1);
|
||||
x2 = CLAMP (x2, x1, (gint) tex_width);
|
||||
y1 = CLAMP (y1, 0, (gint) tex_height - 1);
|
||||
y2 = CLAMP (y2, y1, (gint) tex_height);
|
||||
|
||||
/* Fill the rectangle */
|
||||
for (p = mask_data + y1 * tex_width + x1;
|
||||
y1 < y2;
|
||||
y1++, p += tex_width)
|
||||
memset (p, 255, x2 - x1);
|
||||
}
|
||||
|
||||
cogl_texture_get_gl_texture (paint_tex, NULL, &paint_gl_target);
|
||||
|
||||
if (paint_gl_target == CGL_TEXTURE_RECTANGLE_ARB)
|
||||
{
|
||||
GLuint tex;
|
||||
|
||||
glGenTextures (1, &tex);
|
||||
glBindTexture (CGL_TEXTURE_RECTANGLE_ARB, tex);
|
||||
glPixelStorei (GL_UNPACK_ROW_LENGTH, tex_width);
|
||||
glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
|
||||
glPixelStorei (GL_UNPACK_SKIP_ROWS, 0);
|
||||
glPixelStorei (GL_UNPACK_SKIP_PIXELS, 0);
|
||||
glTexImage2D (CGL_TEXTURE_RECTANGLE_ARB, 0,
|
||||
GL_ALPHA, tex_width, tex_height,
|
||||
0, GL_ALPHA, GL_UNSIGNED_BYTE, mask_data);
|
||||
|
||||
priv->mask_texture
|
||||
= cogl_texture_new_from_foreign (tex,
|
||||
CGL_TEXTURE_RECTANGLE_ARB,
|
||||
tex_width, tex_height,
|
||||
0, 0,
|
||||
COGL_PIXEL_FORMAT_A_8);
|
||||
}
|
||||
else
|
||||
priv->mask_texture = cogl_texture_new_from_data (tex_width, tex_height,
|
||||
-1, FALSE,
|
||||
COGL_PIXEL_FORMAT_A_8,
|
||||
COGL_PIXEL_FORMAT_ANY,
|
||||
tex_width,
|
||||
mask_data);
|
||||
|
||||
g_free (mask_data);
|
||||
|
||||
priv->mask_width = tex_width;
|
||||
priv->mask_height = tex_height;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
mutter_shaped_texture_paint (ClutterActor *actor)
|
||||
{
|
||||
MutterShapedTexture *stex = (MutterShapedTexture *) actor;
|
||||
MutterShapedTexturePrivate *priv = stex->priv;
|
||||
CoglHandle paint_tex;
|
||||
guint tex_width, tex_height;
|
||||
ClutterActorBox alloc;
|
||||
CoglHandle material;
|
||||
#if 1 /* please see comment below about workaround */
|
||||
guint depth;
|
||||
#endif
|
||||
|
||||
if (!CLUTTER_ACTOR_IS_REALIZED (CLUTTER_ACTOR (stex)))
|
||||
clutter_actor_realize (CLUTTER_ACTOR (stex));
|
||||
|
||||
paint_tex = clutter_texture_get_cogl_texture (CLUTTER_TEXTURE (stex));
|
||||
|
||||
tex_width = cogl_texture_get_width (paint_tex);
|
||||
tex_height = cogl_texture_get_height (paint_tex);
|
||||
|
||||
if (tex_width == 0 || tex_width == 0) /* no contents yet */
|
||||
return;
|
||||
|
||||
/* If there are no rectangles fallback to the regular paint
|
||||
method */
|
||||
if (priv->rectangles->len < 1)
|
||||
{
|
||||
CLUTTER_ACTOR_CLASS (mutter_shaped_texture_parent_class)
|
||||
->paint (actor);
|
||||
return;
|
||||
}
|
||||
|
||||
if (paint_tex == COGL_INVALID_HANDLE)
|
||||
return;
|
||||
|
||||
mutter_shaped_texture_ensure_mask (stex);
|
||||
|
||||
if (priv->material == COGL_INVALID_HANDLE)
|
||||
{
|
||||
priv->material = cogl_material_new ();
|
||||
|
||||
/* Replace the RGB from layer 1 with the RGB from layer 0 */
|
||||
cogl_material_set_layer_combine_function
|
||||
(priv->material, 1,
|
||||
COGL_MATERIAL_LAYER_COMBINE_CHANNELS_RGB,
|
||||
COGL_MATERIAL_LAYER_COMBINE_FUNC_REPLACE);
|
||||
cogl_material_set_layer_combine_arg_src
|
||||
(priv->material, 1, 0,
|
||||
COGL_MATERIAL_LAYER_COMBINE_CHANNELS_RGB,
|
||||
COGL_MATERIAL_LAYER_COMBINE_SRC_PREVIOUS);
|
||||
|
||||
/* Modulate the alpha in layer 1 with the alpha from the
|
||||
previous layer */
|
||||
cogl_material_set_layer_combine_function
|
||||
(priv->material, 1,
|
||||
COGL_MATERIAL_LAYER_COMBINE_CHANNELS_ALPHA,
|
||||
COGL_MATERIAL_LAYER_COMBINE_FUNC_MODULATE);
|
||||
cogl_material_set_layer_combine_arg_src
|
||||
(priv->material, 1, 0,
|
||||
COGL_MATERIAL_LAYER_COMBINE_CHANNELS_ALPHA,
|
||||
COGL_MATERIAL_LAYER_COMBINE_SRC_PREVIOUS);
|
||||
cogl_material_set_layer_combine_arg_src
|
||||
(priv->material, 1, 1,
|
||||
COGL_MATERIAL_LAYER_COMBINE_CHANNELS_ALPHA,
|
||||
COGL_MATERIAL_LAYER_COMBINE_SRC_TEXTURE);
|
||||
}
|
||||
material = priv->material;
|
||||
|
||||
#if 1
|
||||
/* This was added as a workaround. It seems that with the intel
|
||||
* drivers when multi-texturing using an RGB TFP texture, the
|
||||
* texture is actually setup internally as an RGBA texture, where
|
||||
* the alpha channel is mostly 0.0 so you only see a shimmer of the
|
||||
* window. This workaround forcibly defines the alpha channel as
|
||||
* 1.0. Maybe there is some clutter/cogl state that is interacting
|
||||
* with this that is being overlooked, but for now this seems to
|
||||
* work. */
|
||||
g_object_get (stex, "pixmap-depth", &depth, NULL);
|
||||
if (depth == 24)
|
||||
{
|
||||
if (priv->material_workaround == COGL_INVALID_HANDLE)
|
||||
{
|
||||
material = priv->material_workaround = cogl_material_new ();
|
||||
|
||||
/* Replace the RGB from layer 1 with the RGB from layer 0 */
|
||||
cogl_material_set_layer_combine_function
|
||||
(material, 1,
|
||||
COGL_MATERIAL_LAYER_COMBINE_CHANNELS_RGB,
|
||||
COGL_MATERIAL_LAYER_COMBINE_FUNC_REPLACE);
|
||||
cogl_material_set_layer_combine_arg_src
|
||||
(material, 1, 0,
|
||||
COGL_MATERIAL_LAYER_COMBINE_CHANNELS_RGB,
|
||||
COGL_MATERIAL_LAYER_COMBINE_SRC_PREVIOUS);
|
||||
|
||||
/* Use the alpha from layer 1 modulated with the alpha from
|
||||
the primary color */
|
||||
cogl_material_set_layer_combine_function
|
||||
(material, 1,
|
||||
COGL_MATERIAL_LAYER_COMBINE_CHANNELS_ALPHA,
|
||||
COGL_MATERIAL_LAYER_COMBINE_FUNC_MODULATE);
|
||||
cogl_material_set_layer_combine_arg_src
|
||||
(material, 1, 0,
|
||||
COGL_MATERIAL_LAYER_COMBINE_CHANNELS_ALPHA,
|
||||
COGL_MATERIAL_LAYER_COMBINE_SRC_PRIMARY_COLOR);
|
||||
cogl_material_set_layer_combine_arg_src
|
||||
(material, 1, 1,
|
||||
COGL_MATERIAL_LAYER_COMBINE_CHANNELS_ALPHA,
|
||||
COGL_MATERIAL_LAYER_COMBINE_SRC_TEXTURE);
|
||||
}
|
||||
|
||||
material = priv->material_workaround;
|
||||
}
|
||||
#endif
|
||||
|
||||
cogl_material_set_layer (material, 0, paint_tex);
|
||||
cogl_material_set_layer (material, 1, priv->mask_texture);
|
||||
|
||||
{
|
||||
CoglColor color;
|
||||
cogl_color_set_from_4ub (&color, 255, 255, 255,
|
||||
clutter_actor_get_paint_opacity (actor));
|
||||
cogl_material_set_color (material, &color);
|
||||
}
|
||||
|
||||
cogl_set_source (material);
|
||||
|
||||
clutter_actor_get_allocation_box (actor, &alloc);
|
||||
cogl_rectangle (0, 0,
|
||||
CLUTTER_UNITS_TO_FLOAT (alloc.x2 - alloc.x1),
|
||||
CLUTTER_UNITS_TO_FLOAT (alloc.y2 - alloc.y1));
|
||||
}
|
||||
|
||||
static void
|
||||
mutter_shaped_texture_pick (ClutterActor *actor,
|
||||
const ClutterColor *color)
|
||||
{
|
||||
MutterShapedTexture *stex = (MutterShapedTexture *) actor;
|
||||
MutterShapedTexturePrivate *priv = stex->priv;
|
||||
|
||||
/* If there are no rectangles then use the regular pick */
|
||||
if (priv->rectangles->len < 1)
|
||||
CLUTTER_ACTOR_CLASS (mutter_shaped_texture_parent_class)
|
||||
->pick (actor, color);
|
||||
else if (clutter_actor_should_pick_paint (actor))
|
||||
{
|
||||
CoglHandle paint_tex;
|
||||
ClutterActorBox alloc;
|
||||
guint tex_width, tex_height;
|
||||
|
||||
paint_tex = clutter_texture_get_cogl_texture (CLUTTER_TEXTURE (stex));
|
||||
|
||||
if (paint_tex == COGL_INVALID_HANDLE)
|
||||
return;
|
||||
|
||||
tex_width = cogl_texture_get_width (paint_tex);
|
||||
tex_height = cogl_texture_get_height (paint_tex);
|
||||
|
||||
if (tex_width == 0 || tex_width == 0) /* no contents yet */
|
||||
return;
|
||||
|
||||
mutter_shaped_texture_ensure_mask (stex);
|
||||
|
||||
cogl_set_source_color4ub (color->red, color->green, color->blue,
|
||||
color->alpha);
|
||||
|
||||
clutter_actor_get_allocation_box (actor, &alloc);
|
||||
|
||||
/* Paint the mask rectangle in the given color */
|
||||
cogl_set_source_texture (priv->mask_texture);
|
||||
cogl_rectangle_with_texture_coords (0, 0,
|
||||
CLUTTER_UNITS_TO_FLOAT (alloc.x2 - alloc.x1),
|
||||
CLUTTER_UNITS_TO_FLOAT (alloc.y2 - alloc.y1),
|
||||
0, 0, 1, 1);
|
||||
}
|
||||
}
|
||||
|
||||
ClutterActor *
|
||||
mutter_shaped_texture_new (void)
|
||||
{
|
||||
ClutterActor *self = g_object_new (MUTTER_TYPE_SHAPED_TEXTURE, NULL);
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
void
|
||||
mutter_shaped_texture_clear_rectangles (MutterShapedTexture *stex)
|
||||
{
|
||||
MutterShapedTexturePrivate *priv;
|
||||
|
||||
g_return_if_fail (MUTTER_IS_SHAPED_TEXTURE (stex));
|
||||
|
||||
priv = stex->priv;
|
||||
|
||||
g_array_set_size (priv->rectangles, 0);
|
||||
mutter_shaped_texture_dirty_mask (stex);
|
||||
clutter_actor_queue_redraw (CLUTTER_ACTOR (stex));
|
||||
}
|
||||
|
||||
void
|
||||
mutter_shaped_texture_add_rectangle (MutterShapedTexture *stex,
|
||||
const XRectangle *rect)
|
||||
{
|
||||
g_return_if_fail (MUTTER_IS_SHAPED_TEXTURE (stex));
|
||||
|
||||
mutter_shaped_texture_add_rectangles (stex, 1, rect);
|
||||
}
|
||||
|
||||
void
|
||||
mutter_shaped_texture_add_rectangles (MutterShapedTexture *stex,
|
||||
size_t num_rects,
|
||||
const XRectangle *rects)
|
||||
{
|
||||
MutterShapedTexturePrivate *priv;
|
||||
|
||||
g_return_if_fail (MUTTER_IS_SHAPED_TEXTURE (stex));
|
||||
|
||||
priv = stex->priv;
|
||||
|
||||
g_array_append_vals (priv->rectangles, rects, num_rects);
|
||||
|
||||
mutter_shaped_texture_dirty_mask (stex);
|
||||
clutter_actor_queue_redraw (CLUTTER_ACTOR (stex));
|
||||
}
|
95
src/compositor/mutter/mutter-shaped-texture.h
Normal file
95
src/compositor/mutter/mutter-shaped-texture.h
Normal file
@@ -0,0 +1,95 @@
|
||||
/*
|
||||
* shaped texture
|
||||
*
|
||||
* An actor to draw a texture clipped to a list of rectangles
|
||||
*
|
||||
* Authored By Neil Roberts <neil@linux.intel.com>
|
||||
*
|
||||
* Copyright (C) 2008 Intel Corporation
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef __MUTTER_SHAPED_TEXTURE_H__
|
||||
#define __MUTTER_SHAPED_TEXTURE_H__
|
||||
|
||||
#include <clutter/clutter.h>
|
||||
#ifdef HAVE_GLX_TEXTURE_PIXMAP
|
||||
#include <clutter/glx/clutter-glx.h>
|
||||
#endif /* HAVE_GLX_TEXTURE_PIXMAP */
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define MUTTER_TYPE_SHAPED_TEXTURE \
|
||||
(mutter_shaped_texture_get_type())
|
||||
#define MUTTER_SHAPED_TEXTURE(obj) \
|
||||
(G_TYPE_CHECK_INSTANCE_CAST ((obj), \
|
||||
MUTTER_TYPE_SHAPED_TEXTURE, \
|
||||
MutterShapedTexture))
|
||||
#define MUTTER_SHAPED_TEXTURE_CLASS(klass) \
|
||||
(G_TYPE_CHECK_CLASS_CAST ((klass), \
|
||||
MUTTER_TYPE_SHAPED_TEXTURE, \
|
||||
MutterShapedTextureClass))
|
||||
#define MUTTER_IS_SHAPED_TEXTURE(obj) \
|
||||
(G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
|
||||
MUTTER_TYPE_SHAPED_TEXTURE))
|
||||
#define MUTTER_IS_SHAPED_TEXTURE_CLASS(klass) \
|
||||
(G_TYPE_CHECK_CLASS_TYPE ((klass), \
|
||||
MUTTER_TYPE_SHAPED_TEXTURE))
|
||||
#define MUTTER_SHAPED_TEXTURE_GET_CLASS(obj) \
|
||||
(G_TYPE_INSTANCE_GET_CLASS ((obj), \
|
||||
MUTTER_TYPE_SHAPED_TEXTURE, \
|
||||
MutterShapedTextureClass))
|
||||
|
||||
typedef struct _MutterShapedTexture MutterShapedTexture;
|
||||
typedef struct _MutterShapedTextureClass MutterShapedTextureClass;
|
||||
typedef struct _MutterShapedTexturePrivate MutterShapedTexturePrivate;
|
||||
|
||||
struct _MutterShapedTextureClass
|
||||
{
|
||||
#ifdef HAVE_GLX_TEXTURE_PIXMAP
|
||||
ClutterGLXTexturePixmapClass parent_class;
|
||||
#else
|
||||
ClutterX11TexturePixmapClass parent_class;
|
||||
#endif
|
||||
};
|
||||
|
||||
struct _MutterShapedTexture
|
||||
{
|
||||
#ifdef HAVE_GLX_TEXTURE_PIXMAP
|
||||
ClutterGLXTexturePixmap parent;
|
||||
#else
|
||||
ClutterX11TexturePixmap parent;
|
||||
#endif
|
||||
|
||||
MutterShapedTexturePrivate *priv;
|
||||
};
|
||||
|
||||
GType mutter_shaped_texture_get_type (void) G_GNUC_CONST;
|
||||
|
||||
ClutterActor *mutter_shaped_texture_new (void);
|
||||
|
||||
void mutter_shaped_texture_clear_rectangles (MutterShapedTexture *stex);
|
||||
|
||||
void mutter_shaped_texture_add_rectangle (MutterShapedTexture *stex,
|
||||
const XRectangle *rect);
|
||||
void mutter_shaped_texture_add_rectangles (MutterShapedTexture *stex,
|
||||
size_t num_rects,
|
||||
const XRectangle *rects);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __MUTTER_SHAPED_TEXTURE_H__ */
|
22
src/compositor/mutter/plugins/Makefile.am
Normal file
22
src/compositor/mutter/plugins/Makefile.am
Normal file
@@ -0,0 +1,22 @@
|
||||
|
||||
pkglibdir=@MUTTER_PLUGIN_DIR@
|
||||
|
||||
if WITH_CLUTTER
|
||||
|
||||
INCLUDES=@METACITY_CFLAGS@ -I $(top_srcdir)/src/include -DMETACITY_LIBEXECDIR=\"$(libexecdir)\" -DHOST_ALIAS=\"@HOST_ALIAS@\" -DMETACITY_LOCALEDIR=\"$(prefix)/@DATADIRNAME@/locale\" -DMETACITY_PKGDATADIR=\"$(pkgdatadir)\" -DMETACITY_DATADIR=\"$(datadir)\" -DG_LOG_DOMAIN=\"metacity\" -DSN_API_NOT_YET_FROZEN=1 -DMETACITY_MAJOR_VERSION=$(METACITY_MAJOR_VERSION) -DMETACITY_MINOR_VERSION=$(METACITY_MINOR_VERSION) -DMETACITY_MICRO_VERSION=$(METACITY_MICRO_VERSION) -DMETACITY_CLUTTER_PLUGIN_API_VERSION=$(METACITY_CLUTTER_PLUGIN_API_VERSION) -DMUTTER_PLUGIN_DIR=\"@MUTTER_PLUGIN_DIR@\"
|
||||
|
||||
default_la_CFLAGS = -fPIC
|
||||
default_la_SOURCES = default.c
|
||||
default_la_LDFLAGS = -module -avoid-version -no-undefined
|
||||
default_la_LIBADD = @CLUTTER_LIBS@
|
||||
|
||||
pkglib_LTLIBRARIES = default.la
|
||||
|
||||
# post-install hook to remove the .la and .a files we are not interested in
|
||||
# (There is no way to stop libtool generating static libs locally, and we
|
||||
# cannot do this globally because of libmetacity-private.so).
|
||||
install-exec-hook:
|
||||
-rm $(DESTDIR)$(pkglibdir)/*.a
|
||||
-rm $(DESTDIR)$(pkglibdir)/*.la
|
||||
|
||||
endif
|
41
src/compositor/mutter/plugins/README
Normal file
41
src/compositor/mutter/plugins/README
Normal file
@@ -0,0 +1,41 @@
|
||||
|
||||
Plugins implement effects associated with WM events, such as window map,
|
||||
minimizing, maximizing, unmaximizing, destruction and workspace switching. The
|
||||
plugin API is documented in src/include/compositor-clutter-plugin.h; in
|
||||
addition the simple plugin can be used as a reference implementation.
|
||||
|
||||
The API is intended to be generic, exposing no implementation details of the WM
|
||||
to the plugins; this will facilitate reuse without modification with another WM
|
||||
(there are plans to use the same plugin API with Matchbox 2).
|
||||
|
||||
Multiple plugins can implement the same effect and be loaded at the same time;
|
||||
however, stacking arbitrary effects in this way might not work as expected;
|
||||
this is particularly true of more complex effects, such as those for workspace
|
||||
switching.
|
||||
|
||||
Plugins are installed in ${prefix}/lib/metacity/plugins/clutter; from there the
|
||||
WM will load plugins listed in the clutter_plugins key in the Metacity gconf
|
||||
general preferences group. Each entry in preferences has the format
|
||||
|
||||
'name: optional parameters'
|
||||
|
||||
where 'name' is the name of the library without the .so suffix.
|
||||
|
||||
As noted above, additional parameters can be passed to the plugin via the
|
||||
preference key. In such case, the plugin name is immediately followed by a
|
||||
colon, separating it from the parameters. Two common parameters should be
|
||||
handled by all plugins:
|
||||
|
||||
'debug' indicates that the plugin is run in a debug mode (what exactly that
|
||||
means is left to the plugin to determine).
|
||||
|
||||
'disable' parameter indicates which effects within the plugin should be
|
||||
disabled; the format of the disable parameter is
|
||||
|
||||
'disable: effect1[, effect2];'
|
||||
|
||||
where effect1, etc., matches the effects listed in the
|
||||
compositor-clutter-plugin.h file (currently one of 'map', 'destroy',
|
||||
'maximize', 'unmaximize', 'switch-workspace'). Example 'disable:
|
||||
minimize, maximize;'.
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user