Compare commits
1850 Commits
METACITY_2
...
METACITY_2
Author | SHA1 | Date | |
---|---|---|---|
![]() |
a5165ee24d | ||
![]() |
a7201d27d1 | ||
![]() |
cfb3bd081a | ||
![]() |
d0095e947f | ||
![]() |
ef486d855c | ||
![]() |
2e10145b33 | ||
![]() |
6677b55cd5 | ||
![]() |
7c1aa16c3b | ||
![]() |
e2e2c6401b | ||
![]() |
4752ef55c7 | ||
![]() |
55f62585d0 | ||
![]() |
a11e758b4b | ||
![]() |
828d2ca01e | ||
![]() |
064303e98e | ||
![]() |
094449d097 | ||
![]() |
ddd1d6616d | ||
![]() |
f2acdda740 | ||
![]() |
7c70749ae8 | ||
![]() |
37ced4cc32 | ||
![]() |
0bf176de5b | ||
![]() |
f4a587f05e | ||
![]() |
27b0a5e0b0 | ||
![]() |
62fb5e6eb4 | ||
![]() |
9292fe606a | ||
![]() |
7ef871f73a | ||
![]() |
29e38a2f53 | ||
![]() |
3e77dd1ace | ||
![]() |
5b28d889fa | ||
![]() |
fcf89cc2fa | ||
![]() |
0a13bf3270 | ||
![]() |
4aaf6e3eb4 | ||
![]() |
12daca5cb1 | ||
![]() |
1a8c2aa027 | ||
![]() |
26dbf9856b | ||
![]() |
ea4cd88285 | ||
![]() |
47f1a8634b | ||
![]() |
c3624745ae | ||
![]() |
2aee817a56 | ||
![]() |
ef5299ee92 | ||
![]() |
fcba59e685 | ||
![]() |
662da0ec3c | ||
![]() |
66c5548061 | ||
![]() |
9503b4ba21 | ||
![]() |
72c5649bc3 | ||
![]() |
43d72674e9 | ||
![]() |
943f4f66fb | ||
![]() |
997b5dcccf | ||
![]() |
94da2b94d7 | ||
![]() |
c502053ffc | ||
![]() |
213833f333 | ||
![]() |
9136686aa4 | ||
![]() |
8eed998780 | ||
![]() |
0d1c28948d | ||
![]() |
d02dc0e89a | ||
![]() |
b4f123c332 | ||
![]() |
422ee61608 | ||
![]() |
06df0d64ad | ||
![]() |
4c96a68427 | ||
![]() |
86bbde337c | ||
![]() |
809a1c173f | ||
![]() |
735188fd2b | ||
![]() |
6bb6566b86 | ||
![]() |
304a05b9a3 | ||
![]() |
7f90738dba | ||
![]() |
909de04b89 | ||
![]() |
b751ceb159 | ||
![]() |
feebb2f42e | ||
![]() |
2139d4e25e | ||
![]() |
3ed91c8e14 | ||
![]() |
02d6e62aec | ||
![]() |
8126d0953d | ||
![]() |
fc6dbd84b9 | ||
![]() |
e16863f783 | ||
![]() |
96c238bbc6 | ||
![]() |
2df2e18a9b | ||
![]() |
5305e17392 | ||
![]() |
cb19fdc3ce | ||
![]() |
7d1e1b042f | ||
![]() |
4b4d6cac42 | ||
![]() |
905a92a20a | ||
![]() |
f1bcb6b51a | ||
![]() |
a39cb116c7 | ||
![]() |
87f613fbbe | ||
![]() |
f38e760506 | ||
![]() |
05dcc58174 | ||
![]() |
ce42492db4 | ||
![]() |
893fadf7d6 | ||
![]() |
a182b353ce | ||
![]() |
f335b0c381 | ||
![]() |
2972ab6df6 | ||
![]() |
8e927fd300 | ||
![]() |
c50c8e6f7d | ||
![]() |
d8a1b9750b | ||
![]() |
1b2e5e56a8 | ||
![]() |
7a9be72bdf | ||
![]() |
d5705ef576 | ||
![]() |
20b7ee18ef | ||
![]() |
7311386172 | ||
![]() |
91e594863c | ||
![]() |
455dbdf67a | ||
![]() |
7f1fd68952 | ||
![]() |
9c97fd2b9b | ||
![]() |
266f78d9a8 | ||
![]() |
c25b8ec616 | ||
![]() |
c64bda776b | ||
![]() |
ef5c3f976a | ||
![]() |
7e2a44039f | ||
![]() |
225407f3b3 | ||
![]() |
845a7fe554 | ||
![]() |
969a4ab3ef | ||
![]() |
10ea37ec4a | ||
![]() |
b102891467 | ||
![]() |
4c143b3635 | ||
![]() |
eb04fe1ec7 | ||
![]() |
2126caf511 | ||
![]() |
b6fa0deff3 | ||
![]() |
10ee3e89dc | ||
![]() |
364b402e8d | ||
![]() |
65e2f2ba4b | ||
![]() |
4c7dc0bbb4 | ||
![]() |
1b52fa05e6 | ||
![]() |
3f214dd33d | ||
![]() |
b54ff6be9f | ||
![]() |
c62efca089 | ||
![]() |
6c023bfef7 | ||
![]() |
020736a42f | ||
![]() |
c635ac51cb | ||
![]() |
053c1b9d19 | ||
![]() |
241a44e69c | ||
![]() |
b22e85f81a | ||
![]() |
7bda73a415 | ||
![]() |
0e956c674f | ||
![]() |
d09fb9f806 | ||
![]() |
61c6519798 | ||
![]() |
786af7ea61 | ||
![]() |
8ce054b21b | ||
![]() |
7335b44d3e | ||
![]() |
e4bd174a7b | ||
![]() |
3a6a4966e2 | ||
![]() |
14d54719d7 | ||
![]() |
bd56f4ec07 | ||
![]() |
3b6f14fa6f | ||
![]() |
947e45d27d | ||
![]() |
a85aea8b18 | ||
![]() |
c35bc07c74 | ||
![]() |
4f98706852 | ||
![]() |
b5b0255e4c | ||
![]() |
e003ba87d1 | ||
![]() |
064a86e620 | ||
![]() |
1ff193b819 | ||
![]() |
3fdf721286 | ||
![]() |
90dc2116ad | ||
![]() |
d5eaa386dd | ||
![]() |
14b8de3727 | ||
![]() |
1799ef6006 | ||
![]() |
be49961944 | ||
![]() |
7b416a0a2d | ||
![]() |
2e0d27d0f1 | ||
![]() |
e1891161d0 | ||
![]() |
eb46b01e97 | ||
![]() |
b71671f94f | ||
![]() |
5f23d91c39 | ||
![]() |
54f2bb3648 | ||
![]() |
4223bc53f8 | ||
![]() |
7b1f4e8a8b | ||
![]() |
18f7f5f76d | ||
![]() |
9c4d95d9c8 | ||
![]() |
6f5fedcc7c | ||
![]() |
da578b2e4a | ||
![]() |
030ad7c7fc | ||
![]() |
2876a8ea4d | ||
![]() |
a11aaf96c7 | ||
![]() |
b49c0ec888 | ||
![]() |
1ba71ab9ff | ||
![]() |
82c8ca4588 | ||
![]() |
7d9d9f52cd | ||
![]() |
9cb157caf8 | ||
![]() |
8eb38bb871 | ||
![]() |
2b86f5d870 | ||
![]() |
0a7bbc9b06 | ||
![]() |
16012cb7f2 | ||
![]() |
c9592c587e | ||
![]() |
c48b52456b | ||
![]() |
48fa3d5fcb | ||
![]() |
5b2061b520 | ||
![]() |
c16108aba3 | ||
![]() |
de4ab5cede | ||
![]() |
1a9d5ef701 | ||
![]() |
4fd7ed876d | ||
![]() |
8c2b7c174c | ||
![]() |
c56b7d8334 | ||
![]() |
c897d3f17c | ||
![]() |
f58cf15ac2 | ||
![]() |
e881c2dbda | ||
![]() |
73b36aa64d | ||
![]() |
3b00d7a6a8 | ||
![]() |
c7ebe972e6 | ||
![]() |
fae2f68f24 | ||
![]() |
63d8f5faf6 | ||
![]() |
bea407e309 | ||
![]() |
6375bee8a2 | ||
![]() |
3c1a7cc190 | ||
![]() |
ebae340a1e | ||
![]() |
8ac94e45b5 | ||
![]() |
3a0277561a | ||
![]() |
15e8482635 | ||
![]() |
882432372a | ||
![]() |
0df4e194d3 | ||
![]() |
6e40e576a4 | ||
![]() |
612507260a | ||
![]() |
ad99427b49 | ||
![]() |
480c8bb085 | ||
![]() |
53a6545b04 | ||
![]() |
84fe920ff1 | ||
![]() |
987514c702 | ||
![]() |
992f237090 | ||
![]() |
8de466b582 | ||
![]() |
79f2b91679 | ||
![]() |
b93960ac9d | ||
![]() |
1f0fd137f5 | ||
![]() |
50312dd0e8 | ||
![]() |
11508ce27e | ||
![]() |
0b3e902319 | ||
![]() |
5e1b0c8764 | ||
![]() |
7d2f2fe632 | ||
![]() |
754a75546d | ||
![]() |
d1e630235d | ||
![]() |
37becd9a79 | ||
![]() |
626c5fcf54 | ||
![]() |
3fb2eb0856 | ||
![]() |
c729adfc5e | ||
![]() |
0488efc8c1 | ||
![]() |
9fa5c1d4b9 | ||
![]() |
d31a0829be | ||
![]() |
f8c41ca016 | ||
![]() |
450cee78b5 | ||
![]() |
f7aad0d647 | ||
![]() |
fe1416c65f | ||
![]() |
454e595ef8 | ||
![]() |
50596a6f97 | ||
![]() |
4726d89661 | ||
![]() |
ffceb7819f | ||
![]() |
249c105d01 | ||
![]() |
a7116f94a6 | ||
![]() |
0aa903f0d4 | ||
![]() |
a0b192aa5e | ||
![]() |
459c6668fb | ||
![]() |
d11681e505 | ||
![]() |
114c7c0be5 | ||
![]() |
10c6e1de17 | ||
![]() |
0bde8fe275 | ||
![]() |
2b2b70e80e | ||
![]() |
6679c6cd9c | ||
![]() |
7aab9f97d9 | ||
![]() |
9057b7112e | ||
![]() |
959a997eba | ||
![]() |
84312194e8 | ||
![]() |
58b323e4cc | ||
![]() |
c39fb62e1d | ||
![]() |
e25ed00bfb | ||
![]() |
de5588c10e | ||
![]() |
03adcdac31 | ||
![]() |
36b0b6d4d5 | ||
![]() |
bb1783b999 | ||
![]() |
05928106c5 | ||
![]() |
3489defbe8 | ||
![]() |
490fe640ab | ||
![]() |
017aa0dfd5 | ||
![]() |
7961c987a7 | ||
![]() |
77854b808a | ||
![]() |
e2eb979ecd | ||
![]() |
51bbd0e1a8 | ||
![]() |
595c86f427 | ||
![]() |
a7c2bacd64 | ||
![]() |
dab5dc2c70 | ||
![]() |
5d8da70f33 | ||
![]() |
2f0f36eea0 | ||
![]() |
4e3243b122 | ||
![]() |
a1caa2ae9e | ||
![]() |
194eee175d | ||
![]() |
2aae99381f | ||
![]() |
aa2da7d82e | ||
![]() |
9221a550db | ||
![]() |
c66adff00d | ||
![]() |
7d0ef20a9c | ||
![]() |
cabf4fc359 | ||
![]() |
5389f135ce | ||
![]() |
1e580d1e52 | ||
![]() |
d93d26aaeb | ||
![]() |
0a95c706bf | ||
![]() |
b0d15aa44f | ||
![]() |
5fe06b5fff | ||
![]() |
fa5bc6ff51 | ||
![]() |
893309b372 | ||
![]() |
cf102c12f4 | ||
![]() |
ebaa77c312 | ||
![]() |
bb03725397 | ||
![]() |
49479d9b67 | ||
![]() |
ea4d4b7b3e | ||
![]() |
f388d1111f | ||
![]() |
f5984f4365 | ||
![]() |
a8347dfd2f | ||
![]() |
f31c57a049 | ||
![]() |
3afcb9c963 | ||
![]() |
640d793ce4 | ||
![]() |
b5529bc5e8 | ||
![]() |
2dcaa941b4 | ||
![]() |
145d134095 | ||
![]() |
1a5d738e68 | ||
![]() |
2d0d5e8cac | ||
![]() |
814cc4b698 | ||
![]() |
6630963a1d | ||
![]() |
667796d53b | ||
![]() |
686ce45a7b | ||
![]() |
11dc788fbe | ||
![]() |
a1cdbf6d03 | ||
![]() |
46ededed08 | ||
![]() |
47221dcce2 | ||
![]() |
48a6dd603a | ||
![]() |
89dd94bf1e | ||
![]() |
b8c8000b44 | ||
![]() |
00f7c002ba | ||
![]() |
7dce1a4b6f | ||
![]() |
2e465de233 | ||
![]() |
1830a35000 | ||
![]() |
d9e622b375 | ||
![]() |
7d747092a6 | ||
![]() |
be29c69653 | ||
![]() |
c0924402d4 | ||
![]() |
7549d1511a | ||
![]() |
7c8faf3eda | ||
![]() |
68b14b6b9a | ||
![]() |
9382d5810f | ||
![]() |
890ffe18f2 | ||
![]() |
78e54ee7ee | ||
![]() |
4e636d0951 | ||
![]() |
c74ab35c6c | ||
![]() |
0bf6bffb16 | ||
![]() |
1ce080d733 | ||
![]() |
aab8f21475 | ||
![]() |
ce8c2d9463 | ||
![]() |
d5a484479f | ||
![]() |
892cb8a8dd | ||
![]() |
e46fc46701 | ||
![]() |
f4f8699d84 | ||
![]() |
85d4c396d0 | ||
![]() |
575bbe7342 | ||
![]() |
80ced567d3 | ||
![]() |
dbbe2854fe | ||
![]() |
cf74d02ef0 | ||
![]() |
548638f0fc | ||
![]() |
cda3904b93 | ||
![]() |
e7deeb609d | ||
![]() |
d178f5e330 | ||
![]() |
d8d77bd65b | ||
![]() |
c3a607f999 | ||
![]() |
1e8fd966b7 | ||
![]() |
c654b7c502 | ||
![]() |
8235fa831f | ||
![]() |
d9f4f54b7d | ||
![]() |
28b7e937d1 | ||
![]() |
86ba6115d4 | ||
![]() |
d34fe419b7 | ||
![]() |
60789cdec4 | ||
![]() |
73d9932081 | ||
![]() |
3942bebc1e | ||
![]() |
bae7135b48 | ||
![]() |
bc9e517842 | ||
![]() |
f3743bc494 | ||
![]() |
122d6ddd35 | ||
![]() |
f45682efbd | ||
![]() |
4d936588af | ||
![]() |
bb02f83bc8 | ||
![]() |
2a5689911f | ||
![]() |
8b26849517 | ||
![]() |
6d77251c71 | ||
![]() |
ccd4414a0f | ||
![]() |
adc578e32d | ||
![]() |
c397af4896 | ||
![]() |
e84778d1eb | ||
![]() |
e6fe440612 | ||
![]() |
3c974b87b4 | ||
![]() |
b6679a65f2 | ||
![]() |
e1df22ae31 | ||
![]() |
65c7332618 | ||
![]() |
0ff5eea9d1 | ||
![]() |
05388194fc | ||
![]() |
b03558dc4d | ||
![]() |
278b5807f1 | ||
![]() |
13e0c20ab0 | ||
![]() |
81fe64991c | ||
![]() |
79b4de04fc | ||
![]() |
714fb3d539 | ||
![]() |
70e40c235c | ||
![]() |
e8877141b7 | ||
![]() |
546fe7b5b3 | ||
![]() |
16b9aff47c | ||
![]() |
7d4c302598 | ||
![]() |
5db3108815 | ||
![]() |
7b1e571919 | ||
![]() |
3b9ec3ce50 | ||
![]() |
aa63e0884d | ||
![]() |
7ee43e5a36 | ||
![]() |
43cc3b8606 | ||
![]() |
9d9c744490 | ||
![]() |
63e1624bd7 | ||
![]() |
cffe7e9566 | ||
![]() |
b8b647e346 | ||
![]() |
101a097f02 | ||
![]() |
5ac6fcad73 | ||
![]() |
a880f5d401 | ||
![]() |
4b9fe2cae7 | ||
![]() |
c188ae0954 | ||
![]() |
b7323c9859 | ||
![]() |
32a38f64e8 | ||
![]() |
a738000745 | ||
![]() |
7e0bc1e387 | ||
![]() |
310f16e4da | ||
![]() |
0cc258a4ef | ||
![]() |
3f6f93ddc2 | ||
![]() |
8b6e78800d | ||
![]() |
23f9090099 | ||
![]() |
bd534f4412 | ||
![]() |
9dc40e3277 | ||
![]() |
94b76b0762 | ||
![]() |
96bb3fd89a | ||
![]() |
4a69151d20 | ||
![]() |
5a25925606 | ||
![]() |
f0cb77ffc4 | ||
![]() |
d12719dd59 | ||
![]() |
178178e5e6 | ||
![]() |
4d1972d3b5 | ||
![]() |
2a9d9dc334 | ||
![]() |
fed80bf081 | ||
![]() |
8c7f81eac9 | ||
![]() |
f3ffa919ee | ||
![]() |
0a3d3d6069 | ||
![]() |
19b808c4f5 | ||
![]() |
744efc95a1 | ||
![]() |
522e9916b6 | ||
![]() |
b682a9f945 | ||
![]() |
a8fd516aa0 | ||
![]() |
1f7f29e059 | ||
![]() |
0b497e95ed | ||
![]() |
044d8999a3 | ||
![]() |
07c406cad9 | ||
![]() |
822059d078 | ||
![]() |
6198facc42 | ||
![]() |
9cee95f210 | ||
![]() |
9d02a6c163 | ||
![]() |
06a58f43c0 | ||
![]() |
e81b5978b0 | ||
![]() |
4248d86c98 | ||
![]() |
2b86bd7a9e | ||
![]() |
4541919fb4 | ||
![]() |
6b13680315 | ||
![]() |
31b0c1a3ba | ||
![]() |
98731903ec | ||
![]() |
977d7d3b9c | ||
![]() |
afee4a4251 | ||
![]() |
caaad4449c | ||
![]() |
8100b93048 | ||
![]() |
69ef1b673f | ||
![]() |
ec0bd19156 | ||
![]() |
50d452c634 | ||
![]() |
50f25b6162 | ||
![]() |
a209d2fe9c | ||
![]() |
4908fe3bed | ||
![]() |
b58ab6be64 | ||
![]() |
f650c1f876 | ||
![]() |
766d46b70d | ||
![]() |
5f1de4bf7a | ||
![]() |
2e0bb772ea | ||
![]() |
118a1fb76a | ||
![]() |
bd73853f72 | ||
![]() |
de4c7a0610 | ||
![]() |
7bcc485701 | ||
![]() |
c127a4691c | ||
![]() |
e81659d2ff | ||
![]() |
385248044d | ||
![]() |
731ac41cd7 | ||
![]() |
8dd95010c7 | ||
![]() |
abe183c14c | ||
![]() |
b834001fe7 | ||
![]() |
65ba48ad3f | ||
![]() |
646521fc1d | ||
![]() |
3aa119e99e | ||
![]() |
a45b6cccbe | ||
![]() |
cd09a27aa6 | ||
![]() |
38d02fff26 | ||
![]() |
e5f672e67e | ||
![]() |
12f4f7c6b0 | ||
![]() |
e60da6c006 | ||
![]() |
c2bbd8b66c | ||
![]() |
29fc267353 | ||
![]() |
d437930868 | ||
![]() |
7ccc81982e | ||
![]() |
f077527c9a | ||
![]() |
a2fea22402 | ||
![]() |
8af2b95d03 | ||
![]() |
20b264d81f | ||
![]() |
c79fed1661 | ||
![]() |
cb820084dd | ||
![]() |
c6ab972143 | ||
![]() |
0608d1f4ee | ||
![]() |
6f9b2cf11e | ||
![]() |
2a649ecd95 | ||
![]() |
3972258abc | ||
![]() |
42a3a97b37 | ||
![]() |
06db1e4ad6 | ||
![]() |
9fb7667ea0 | ||
![]() |
feb5c06e25 | ||
![]() |
858757aaf3 | ||
![]() |
8c86d5cd5e | ||
![]() |
5a27308cde | ||
![]() |
c144f22de6 | ||
![]() |
3e95ae127b | ||
![]() |
ef3d6a5d4e | ||
![]() |
dc40fe8257 | ||
![]() |
d8241886b7 | ||
![]() |
1a31caa3fc | ||
![]() |
56bef55e92 | ||
![]() |
04c09f068e | ||
![]() |
25c4bb1455 | ||
![]() |
d0d0925e29 | ||
![]() |
9d1d8fa062 | ||
![]() |
702a4c0da7 | ||
![]() |
fe341bb927 | ||
![]() |
8131988b5e | ||
![]() |
28a54c6bb4 | ||
![]() |
ef1ecc8128 | ||
![]() |
adb26d0543 | ||
![]() |
4cfb5152f7 | ||
![]() |
952c1f415b | ||
![]() |
b5a912e232 | ||
![]() |
9170f58f3b | ||
![]() |
9942588184 | ||
![]() |
a7513e84fc | ||
![]() |
77a1e8ec8b | ||
![]() |
0ceb317ac6 | ||
![]() |
4fda4ed806 | ||
![]() |
5c01798884 | ||
![]() |
09c929ce3f | ||
![]() |
0399fb7d4b | ||
![]() |
4b9a23e8eb | ||
![]() |
c60ec1802a | ||
![]() |
929619f145 | ||
![]() |
c043cd4dae | ||
![]() |
9fb6cea799 | ||
![]() |
7a441616f3 | ||
![]() |
43693d2b6a | ||
![]() |
b76e62226b | ||
![]() |
706791d582 | ||
![]() |
b6dca7f3cb | ||
![]() |
43ede25908 | ||
![]() |
5856fd8ef2 | ||
![]() |
332adc45fc | ||
![]() |
a76b1075df | ||
![]() |
d2d8d96778 | ||
![]() |
3ae3a2558f | ||
![]() |
6efaa8d45c | ||
![]() |
2876d2f43f | ||
![]() |
1341d50518 | ||
![]() |
11e56f841a | ||
![]() |
72dd7ff621 | ||
![]() |
10425302c7 | ||
![]() |
ab16ef096a | ||
![]() |
e632c8ebf5 | ||
![]() |
9a5ca2055e | ||
![]() |
307f49f735 | ||
![]() |
6ca6596309 | ||
![]() |
1c50c27613 | ||
![]() |
f0ae093877 | ||
![]() |
8273612a87 | ||
![]() |
09d35abc95 | ||
![]() |
b1769b3cb9 | ||
![]() |
a1bfe15eb5 | ||
![]() |
51a98800f8 | ||
![]() |
c7b55ccb9f | ||
![]() |
b42ac36ac8 | ||
![]() |
91c8674acf | ||
![]() |
a50c7cd589 | ||
![]() |
3a7ce7d109 | ||
![]() |
9ef1da6ec2 | ||
![]() |
cd1885cec4 | ||
![]() |
27797e7f78 | ||
![]() |
0de86fc8ea | ||
![]() |
c0452be980 | ||
![]() |
963ac3ff32 | ||
![]() |
f3cc59c78a | ||
![]() |
56609cbb39 | ||
![]() |
16a8add6f8 | ||
![]() |
036a61d198 | ||
![]() |
9739346c85 | ||
![]() |
47e6bd5648 | ||
![]() |
502003e47b | ||
![]() |
57b16ab4c7 | ||
![]() |
83480c1ac9 | ||
![]() |
db108c1fc3 | ||
![]() |
5a28c4c423 | ||
![]() |
f1701a751f | ||
![]() |
ad65847d7d | ||
![]() |
88ea02a77a | ||
![]() |
b70fdf1a5f | ||
![]() |
2195dfc9f8 | ||
![]() |
27eb5a60f3 | ||
![]() |
339719568f | ||
![]() |
fd13022dc4 | ||
![]() |
d53afd3ae1 | ||
![]() |
57f9a51a58 | ||
![]() |
799f3274d9 | ||
![]() |
a788bee6f9 | ||
![]() |
0a83c10948 | ||
![]() |
dfa9c24b87 | ||
![]() |
7bf8eee605 | ||
![]() |
664216dc8b | ||
![]() |
b3f95bf7d1 | ||
![]() |
f2e783b2c5 | ||
![]() |
e68b1b6c42 | ||
![]() |
217ba6c1b7 | ||
![]() |
74a8b5b78b | ||
![]() |
81fab83067 | ||
![]() |
0f23f3f05b | ||
![]() |
4b3b706369 | ||
![]() |
595cbe2ac0 | ||
![]() |
b20391780d | ||
![]() |
dd8e9e5725 | ||
![]() |
007a1f0d0d | ||
![]() |
40a710dad0 | ||
![]() |
6770329e69 | ||
![]() |
4f448440d4 | ||
![]() |
039ffb0cb4 | ||
![]() |
2f561e5553 | ||
![]() |
2d314d84cd | ||
![]() |
3b7f92ae5d | ||
![]() |
4f7e28ff3c | ||
![]() |
47cf3085e7 | ||
![]() |
3d996ff73d | ||
![]() |
1b7a651a33 | ||
![]() |
a605da04c1 | ||
![]() |
cc7195547a | ||
![]() |
c820769bce | ||
![]() |
b2d009d01d | ||
![]() |
fe8abfa887 | ||
![]() |
2fdb75ad45 | ||
![]() |
07c0a53316 | ||
![]() |
e5cf7ff55b | ||
![]() |
3c1fe8bedd | ||
![]() |
88aeeb8cd5 | ||
![]() |
1b323f87d7 | ||
![]() |
2d74e25058 | ||
![]() |
98e882720c | ||
![]() |
93c5a042ee | ||
![]() |
99d7cadf67 | ||
![]() |
0e3ecc7a31 | ||
![]() |
c635a55612 | ||
![]() |
5a088c5bbc | ||
![]() |
a27089a110 | ||
![]() |
35c64b45dd | ||
![]() |
daf93c5ed0 | ||
![]() |
56d75ebf44 | ||
![]() |
5815ebd3a4 | ||
![]() |
78f925c6a6 | ||
![]() |
1115e22481 | ||
![]() |
c2ba0a7d67 | ||
![]() |
e699ff2e83 | ||
![]() |
804411bd68 | ||
![]() |
690100f1ad | ||
![]() |
95b0ee480e | ||
![]() |
4be245a26a | ||
![]() |
a0863fc437 | ||
![]() |
c9f0005b05 | ||
![]() |
104786735a | ||
![]() |
191b3f2c21 | ||
![]() |
860ae37db5 | ||
![]() |
9bde925d3d | ||
![]() |
7630d22b8d | ||
![]() |
a92be6e319 | ||
![]() |
0bb3361b73 | ||
![]() |
b1c1e4a7db | ||
![]() |
82673cb51f | ||
![]() |
4ebdb0b9c0 | ||
![]() |
4c5e4442c1 | ||
![]() |
01fa9cfc63 | ||
![]() |
6ff017e875 | ||
![]() |
8d892f76da | ||
![]() |
03bbe3de17 | ||
![]() |
47a1c285c7 | ||
![]() |
4ccb120922 | ||
![]() |
423b5f5f39 | ||
![]() |
feefcdd892 | ||
![]() |
927a6def1b | ||
![]() |
d538690bd4 | ||
![]() |
24d8655188 | ||
![]() |
917dfefd6c | ||
![]() |
9378a4fb4d | ||
![]() |
67c36f0917 | ||
![]() |
d5083baea0 | ||
![]() |
6a0f4f6ccb | ||
![]() |
901ad18a67 | ||
![]() |
6ac67f80a6 | ||
![]() |
a88f44ea64 | ||
![]() |
5c10e0a859 | ||
![]() |
3c384d37c6 | ||
![]() |
2592efeee4 | ||
![]() |
66b2e8bc3f | ||
![]() |
17dc2d6151 | ||
![]() |
2218b79143 | ||
![]() |
17b8a1f3e6 | ||
![]() |
830a52ee25 | ||
![]() |
18b38ac526 | ||
![]() |
8658268847 | ||
![]() |
8a271ee5ac | ||
![]() |
cf15ea0a3d | ||
![]() |
669cdc4bb6 | ||
![]() |
68d6a92972 | ||
![]() |
4770da34b3 | ||
![]() |
9197c4f835 | ||
![]() |
6aff3466c6 | ||
![]() |
e98fad3e62 | ||
![]() |
6628acb59c | ||
![]() |
d76d953d69 | ||
![]() |
e9358b5eea | ||
![]() |
6d7d586f3c | ||
![]() |
481accd6bd | ||
![]() |
2a97ddd60a | ||
![]() |
8441fada07 | ||
![]() |
a60b735e2d | ||
![]() |
199d20197e | ||
![]() |
5fdb8ab7d6 | ||
![]() |
7c80b0a335 | ||
![]() |
7eb5a67b3d | ||
![]() |
37640a925e | ||
![]() |
c446955b8d | ||
![]() |
0895abd894 | ||
![]() |
f7c04aff1e | ||
![]() |
89ca4aab3d | ||
![]() |
a4dc0d581a | ||
![]() |
a889ff3469 | ||
![]() |
320ef83bfc | ||
![]() |
8849fad8f9 | ||
![]() |
9839087306 | ||
![]() |
d31e28be70 | ||
![]() |
26c2ae81ea | ||
![]() |
922932d240 | ||
![]() |
28fbdc611e | ||
![]() |
99c7dc8b85 | ||
![]() |
ef0816bdce | ||
![]() |
e99ebf6ef0 | ||
![]() |
ef44f8066b | ||
![]() |
47d5189812 | ||
![]() |
d71ef42ded | ||
![]() |
e37091654f | ||
![]() |
dcd097d67e | ||
![]() |
b5261cdbda | ||
![]() |
dc40522ea7 | ||
![]() |
de44b2d794 | ||
![]() |
1117d45f8a | ||
![]() |
294cc23179 | ||
![]() |
bd74d85560 | ||
![]() |
3a119e13db | ||
![]() |
b413f5e7e0 | ||
![]() |
d75b9158bd | ||
![]() |
b5b127f083 | ||
![]() |
1206f9880e | ||
![]() |
629af6bb36 | ||
![]() |
08ca40aad9 | ||
![]() |
fa4c0bf54a | ||
![]() |
01f94925a5 | ||
![]() |
ae83b19b28 | ||
![]() |
9cdbfc53a8 | ||
![]() |
a13dbea266 | ||
![]() |
a236cfd7a8 | ||
![]() |
27b4e46a16 | ||
![]() |
9ddacb019e | ||
![]() |
a4a32a54c3 | ||
![]() |
8ff2a10c96 | ||
![]() |
586eda6199 | ||
![]() |
a522c3479e | ||
![]() |
e5a2ddd777 | ||
![]() |
77fb995c4c | ||
![]() |
0494e221af | ||
![]() |
6e77b6f656 | ||
![]() |
dbcf03535d | ||
![]() |
a644753073 | ||
![]() |
23b5ea0eee | ||
![]() |
a2b6ff6d42 | ||
![]() |
5ea067a1d8 | ||
![]() |
8b924ece14 | ||
![]() |
9615538389 | ||
![]() |
9c53e2f5f1 | ||
![]() |
81da59a8a4 | ||
![]() |
22eab481b1 | ||
![]() |
71cd8948d2 | ||
![]() |
288e10f7fe | ||
![]() |
a9e5560c36 | ||
![]() |
fcd56c3ef0 | ||
![]() |
7dc793c3be | ||
![]() |
2fc880db19 | ||
![]() |
60a453f5a0 | ||
![]() |
32a587e4a3 | ||
![]() |
8deed5d601 | ||
![]() |
f8b4a391e3 | ||
![]() |
2f3ed8ab65 | ||
![]() |
306fc4ee61 | ||
![]() |
5200e59ba3 | ||
![]() |
d06dee2778 | ||
![]() |
19105eedb2 | ||
![]() |
a252050cb8 | ||
![]() |
435bf3f2e4 | ||
![]() |
1fcd5e9704 | ||
![]() |
5188e9c4d0 | ||
![]() |
1d57293511 | ||
![]() |
ebbc388205 | ||
![]() |
fb5f3f6bb0 | ||
![]() |
5558451c11 | ||
![]() |
5727235572 | ||
![]() |
74fa2a7ab2 | ||
![]() |
e49cc883bb | ||
![]() |
3b54d71058 | ||
![]() |
2a90c0225d | ||
![]() |
f7e42bc4c4 | ||
![]() |
2ffc505c19 | ||
![]() |
154da1f68a | ||
![]() |
b45a357652 | ||
![]() |
7962cfa83e | ||
![]() |
2d89ba9c87 | ||
![]() |
00672554ed | ||
![]() |
f2c0ff8979 | ||
![]() |
dc52a32aad | ||
![]() |
bd779534af | ||
![]() |
cf0bd5bdc1 | ||
![]() |
5dcc25693a | ||
![]() |
1443f06471 | ||
![]() |
63a6f2121e | ||
![]() |
68fca2e5e5 | ||
![]() |
42182cbe77 | ||
![]() |
d08fa29612 | ||
![]() |
311f435120 | ||
![]() |
788ea66b1f | ||
![]() |
fa075eb8f1 | ||
![]() |
e1102bc6ff | ||
![]() |
f92eadf9d6 | ||
![]() |
34ec58af0a | ||
![]() |
b6389fbf60 | ||
![]() |
e26992e419 | ||
![]() |
40ea74f46c | ||
![]() |
971f3f1207 | ||
![]() |
3a39036dcb | ||
![]() |
3428ed1adf | ||
![]() |
81e4cb44aa | ||
![]() |
acb625ddeb | ||
![]() |
44508380dc | ||
![]() |
4d8414acfd | ||
![]() |
70d0446190 | ||
![]() |
793a630e2f | ||
![]() |
2936391fc8 | ||
![]() |
85826d0d9a | ||
![]() |
0a20419628 | ||
![]() |
2d4503ee59 | ||
![]() |
010e620a34 | ||
![]() |
3f6bad087d | ||
![]() |
c523d2827c | ||
![]() |
a53fea96ab | ||
![]() |
0bb8538e2f | ||
![]() |
03b3e98a51 | ||
![]() |
e0963e6b66 | ||
![]() |
6262db51a2 | ||
![]() |
58df4ee985 | ||
![]() |
85abc9bfe7 | ||
![]() |
993c7075f3 | ||
![]() |
4469a42a77 | ||
![]() |
bf965f8465 | ||
![]() |
f87a8c212f | ||
![]() |
3663ba0259 | ||
![]() |
b9900681e7 | ||
![]() |
3edad8599c | ||
![]() |
903f3d7e6e | ||
![]() |
051e404d09 | ||
![]() |
d1a853557b | ||
![]() |
f441033959 | ||
![]() |
0fa4954c46 | ||
![]() |
59958b0f0a | ||
![]() |
4549e42480 | ||
![]() |
1620fd5408 | ||
![]() |
1d692936e0 | ||
![]() |
6153a17a64 | ||
![]() |
b77590ba7a | ||
![]() |
c9df553d02 | ||
![]() |
967ac0f1d9 | ||
![]() |
ebf2c77c50 | ||
![]() |
c370a3e503 | ||
![]() |
9e2608524d | ||
![]() |
7fc6c99987 | ||
![]() |
3ad5618596 | ||
![]() |
4b02b0ddf1 | ||
![]() |
1ac3f938de | ||
![]() |
b422d86256 | ||
![]() |
8ac4e04e12 | ||
![]() |
d05cfba523 | ||
![]() |
6f458fc9d6 | ||
![]() |
a0d8c3c703 | ||
![]() |
11ee26bb65 | ||
![]() |
96e20f83bb | ||
![]() |
e841a492c8 | ||
![]() |
d93b0d319c | ||
![]() |
a7c344bbc5 | ||
![]() |
f64a231620 | ||
![]() |
a8f9e2e919 | ||
![]() |
9569096991 | ||
![]() |
2722c277ee | ||
![]() |
2eec8daff5 | ||
![]() |
75fa56391d | ||
![]() |
ec9cf27a81 | ||
![]() |
0996da5e8e | ||
![]() |
a8708e1c55 | ||
![]() |
7c5e40e0ea | ||
![]() |
e1d2b95459 | ||
![]() |
9bd17f4fae | ||
![]() |
40ec58787f | ||
![]() |
304fae9369 | ||
![]() |
72a7f57e5d | ||
![]() |
0fee2ac499 | ||
![]() |
708a86cfee | ||
![]() |
04fcad7c13 | ||
![]() |
ebbc4c499b | ||
![]() |
3c8b051e31 | ||
![]() |
d34e54785d | ||
![]() |
51e74d4027 | ||
![]() |
2d662f67a5 | ||
![]() |
67cbbeb6c1 | ||
![]() |
cc7493cac9 | ||
![]() |
be96be95f6 | ||
![]() |
6b144cd2eb | ||
![]() |
38412b4460 | ||
![]() |
b8287d3aca | ||
![]() |
5eb4eea57e | ||
![]() |
af3b5b77b1 | ||
![]() |
5f75334d57 | ||
![]() |
4481be72d1 | ||
![]() |
c595a7ac0f | ||
![]() |
fa3de81741 | ||
![]() |
6094763def | ||
![]() |
4e96dd7ea6 | ||
![]() |
6e6e85632a | ||
![]() |
6af9a11361 | ||
![]() |
8377c7776c | ||
![]() |
73cce3b174 | ||
![]() |
947adb6d07 | ||
![]() |
d0f1f084e8 | ||
![]() |
c27d89218c | ||
![]() |
15c5ddbec4 | ||
![]() |
546679cbd1 | ||
![]() |
b54c422b93 | ||
![]() |
5049fdc13a | ||
![]() |
d8bb7c8ae9 | ||
![]() |
61d5423b5d | ||
![]() |
d85012ecfd | ||
![]() |
fb9ad1eb13 | ||
![]() |
8764b89942 | ||
![]() |
48bc82e82f | ||
![]() |
e8d63890fc | ||
![]() |
6ed08019c2 | ||
![]() |
00d6f549f9 | ||
![]() |
02a491c1bc | ||
![]() |
ed25155fc1 | ||
![]() |
e65a70ded9 | ||
![]() |
3b49b81ff5 | ||
![]() |
bdcc6cb20d | ||
![]() |
e616f930d3 | ||
![]() |
536d51183c | ||
![]() |
6a3c1fbe57 | ||
![]() |
2cca0f0eac | ||
![]() |
cdb4e2541c | ||
![]() |
9b03b75aaf | ||
![]() |
f5072b7f3a | ||
![]() |
b60bb724aa | ||
![]() |
7d7f8aab93 | ||
![]() |
3b133195fd | ||
![]() |
18990530b0 | ||
![]() |
b424364710 | ||
![]() |
4fb05e54ab | ||
![]() |
3ee5ad8b12 | ||
![]() |
b73ea5eb0a | ||
![]() |
e710d9f1b8 | ||
![]() |
ae07c8677d | ||
![]() |
2a24562f45 | ||
![]() |
b7d27d9114 | ||
![]() |
5169a06dd0 | ||
![]() |
e868a001f9 | ||
![]() |
a8526454b0 | ||
![]() |
fabc5507f3 | ||
![]() |
82bd20911c | ||
![]() |
95d747269b | ||
![]() |
d02dbd62e9 | ||
![]() |
bcb9de9198 | ||
![]() |
3558657e53 | ||
![]() |
1187edeadb | ||
![]() |
0c684c6f35 | ||
![]() |
c1b863ee75 | ||
![]() |
8922b0ecc6 | ||
![]() |
6cd916ea39 | ||
![]() |
4b18f64914 | ||
![]() |
1e6a8a31d1 | ||
![]() |
9e7a26500c | ||
![]() |
5d862ac29b | ||
![]() |
25b9a9e37d | ||
![]() |
da7918554e | ||
![]() |
e45eda148b | ||
![]() |
b24308eab1 | ||
![]() |
366399eb0c | ||
![]() |
25615f929e | ||
![]() |
667a056066 | ||
![]() |
c2fbb37c8c | ||
![]() |
45269e0e2d | ||
![]() |
8f7eda43a8 | ||
![]() |
339a86150b | ||
![]() |
374e5d400d | ||
![]() |
0e5727eeb3 | ||
![]() |
9073724c2b | ||
![]() |
92c8ba0497 | ||
![]() |
efb26cb769 | ||
![]() |
050e55c9d7 | ||
![]() |
e402f41b33 | ||
![]() |
859c1e752d | ||
![]() |
198398ba88 | ||
![]() |
5d2f307735 | ||
![]() |
70bd23278b | ||
![]() |
76bfdcf038 | ||
![]() |
8e14da1759 | ||
![]() |
24ecc29f49 | ||
![]() |
4a23782f51 | ||
![]() |
b619f9baa8 | ||
![]() |
878d6df404 | ||
![]() |
5e5ebc7914 | ||
![]() |
e2155c8fee | ||
![]() |
036747fba5 | ||
![]() |
a8f93c454a | ||
![]() |
aad72e575d | ||
![]() |
b799630ba5 | ||
![]() |
90748385c2 | ||
![]() |
1d22cb8518 | ||
![]() |
4832cc6d63 | ||
![]() |
f8226bf1bb | ||
![]() |
6cfcc01334 | ||
![]() |
f8b2f6ca5c | ||
![]() |
d9a2207ebe | ||
![]() |
1be097628f | ||
![]() |
c51a55b0e5 | ||
![]() |
f88852cff6 | ||
![]() |
8d266f5550 | ||
![]() |
b9e86197f2 | ||
![]() |
b9e4faa1aa | ||
![]() |
625b7a25b0 | ||
![]() |
0e6b393896 | ||
![]() |
109761e973 | ||
![]() |
fd5557f44c | ||
![]() |
79d28b4709 | ||
![]() |
5cf84e6702 | ||
![]() |
f218216a2c | ||
![]() |
5f99b61f07 | ||
![]() |
a5fa06ebb1 | ||
![]() |
a0d3c8e20b | ||
![]() |
1ece207400 | ||
![]() |
91641c2cf3 | ||
![]() |
4045ee474d | ||
![]() |
e3b364c055 | ||
![]() |
89c31c43ca | ||
![]() |
0d1e643e1c | ||
![]() |
f6b4f11ebe | ||
![]() |
908198c25d | ||
![]() |
f4cb740aac | ||
![]() |
a2d0235d68 | ||
![]() |
bda692174a | ||
![]() |
e7e47a8b85 | ||
![]() |
32a8bf50b7 | ||
![]() |
b0818f97f2 | ||
![]() |
ea45e43082 | ||
![]() |
1ad94dec1c | ||
![]() |
995aef2577 | ||
![]() |
5817e204b4 | ||
![]() |
50b5a2b8d8 | ||
![]() |
8a9a4aba77 | ||
![]() |
4ad2d1a048 | ||
![]() |
07296490b4 | ||
![]() |
d3b2764ff6 | ||
![]() |
6c51b8ae6a | ||
![]() |
4fdc3667a3 | ||
![]() |
fd8c3514d6 | ||
![]() |
c2700863ca | ||
![]() |
18d32248ab | ||
![]() |
d8a59d7cd1 | ||
![]() |
4213beea4b | ||
![]() |
967777b965 | ||
![]() |
ba18c630b7 | ||
![]() |
a70fc3259f | ||
![]() |
094df1295c | ||
![]() |
8db78742c3 | ||
![]() |
9c337d0a8f | ||
![]() |
e0c8b245ef | ||
![]() |
8d314aead8 | ||
![]() |
15d28dfd97 | ||
![]() |
48b00403b6 | ||
![]() |
d78fab02eb | ||
![]() |
d275e4bbc2 | ||
![]() |
d26ad2c490 | ||
![]() |
cef58f676d | ||
![]() |
214bcceaea | ||
![]() |
5e1439f89e | ||
![]() |
eb40c5c2cf | ||
![]() |
ba3cf950ba | ||
![]() |
d26eb15bff | ||
![]() |
aed65de051 | ||
![]() |
bf767e8420 | ||
![]() |
ad65fda1a8 | ||
![]() |
170d3ed121 | ||
![]() |
7f1dfffab3 | ||
![]() |
40e3058408 | ||
![]() |
3e05c7c6c6 | ||
![]() |
fd135d0869 | ||
![]() |
5452a0ecac | ||
![]() |
6557627d8f | ||
![]() |
cfa2e165ba | ||
![]() |
e9999aa93c | ||
![]() |
b8788e9c0d | ||
![]() |
60293ee189 | ||
![]() |
2541da1d83 | ||
![]() |
bd537dcfc6 | ||
![]() |
b95dd0574c | ||
![]() |
49dca9e5b1 | ||
![]() |
02a8fb4a37 | ||
![]() |
1a5b861dff | ||
![]() |
0970829146 | ||
![]() |
3ee131245c | ||
![]() |
80a1a8d26b | ||
![]() |
d1aaf6a9b1 | ||
![]() |
5590e8878b | ||
![]() |
de703edfd7 | ||
![]() |
772bbb8d91 | ||
![]() |
b17b88595e | ||
![]() |
e64d1bf881 | ||
![]() |
40696052ca | ||
![]() |
b567879eac | ||
![]() |
0163c58ee1 | ||
![]() |
bc3b64f922 | ||
![]() |
765cb51df3 | ||
![]() |
b56824f650 | ||
![]() |
c613fed9ef | ||
![]() |
6c18374142 | ||
![]() |
a64b868dbd | ||
![]() |
cfd2d87fea | ||
![]() |
77349f6878 | ||
![]() |
5efd276a22 | ||
![]() |
373f6de13e | ||
![]() |
e0a4c2a1df | ||
![]() |
9feebc05c7 | ||
![]() |
d7917c02fe | ||
![]() |
1d0b5ef660 | ||
![]() |
ee84fbb81f | ||
![]() |
6a1abc7482 | ||
![]() |
7f36a8c7d1 | ||
![]() |
d1d7767033 | ||
![]() |
18973c23b3 | ||
![]() |
93289dc950 | ||
![]() |
817c357335 | ||
![]() |
f5bf830754 | ||
![]() |
b3a1122b2a | ||
![]() |
c7d9042e5d | ||
![]() |
4512f8317a | ||
![]() |
effec94613 | ||
![]() |
c9c67387ce | ||
![]() |
81089c2d8c | ||
![]() |
04c9c3e058 | ||
![]() |
4d5cc9d0bb | ||
![]() |
0d88e93787 | ||
![]() |
5a8af8c2fb | ||
![]() |
e8097a6f8f | ||
![]() |
cb27f0c4be | ||
![]() |
c3a5c4c169 | ||
![]() |
bc46b2f0e0 | ||
![]() |
ce657d7807 | ||
![]() |
9702903343 | ||
![]() |
15a05467bd | ||
![]() |
0041f49d3f | ||
![]() |
0cfb05a661 | ||
![]() |
c6b475b251 | ||
![]() |
37a1e6f57b | ||
![]() |
0c5cacf7cc | ||
![]() |
95e5a13131 | ||
![]() |
c1a88f5457 | ||
![]() |
70b6a57003 | ||
![]() |
915c2db3b9 | ||
![]() |
eb647577c3 | ||
![]() |
1094410ff8 | ||
![]() |
6e90c238e8 | ||
![]() |
44a63a9911 | ||
![]() |
149e8d12cd | ||
![]() |
9888f0434d | ||
![]() |
370982b812 | ||
![]() |
5c5de1c6b3 | ||
![]() |
5ba2fa893f | ||
![]() |
4eb8a93c83 | ||
![]() |
3da0b1c7d9 | ||
![]() |
aa62466091 | ||
![]() |
337812d51d | ||
![]() |
17ac646f70 | ||
![]() |
e3cfa163d0 | ||
![]() |
9657b6cebe | ||
![]() |
90b8a5a20b | ||
![]() |
54c50e96e7 | ||
![]() |
8c2e8ddf5c | ||
![]() |
9740b3f1df | ||
![]() |
0c57ebca70 | ||
![]() |
ae577d7724 | ||
![]() |
82e5cb578c | ||
![]() |
4ba0ce89c4 | ||
![]() |
0df65b9f9f | ||
![]() |
30e3cf5050 | ||
![]() |
25ca0e21db | ||
![]() |
f08337d939 | ||
![]() |
372dc090fd | ||
![]() |
81b6316081 | ||
![]() |
fc4a0aef0d | ||
![]() |
a1bb0e0015 | ||
![]() |
b8e5a4d707 | ||
![]() |
979392efa5 | ||
![]() |
9de7b59e93 | ||
![]() |
0388149904 | ||
![]() |
7b0cd87838 | ||
![]() |
7641c6f952 | ||
![]() |
261c9a74ef | ||
![]() |
a544f68ac9 | ||
![]() |
ba9d2d1a71 | ||
![]() |
f4920a9249 | ||
![]() |
94b6dde6bb | ||
![]() |
791ab07bd4 | ||
![]() |
437093dee0 | ||
![]() |
407ec7b495 | ||
![]() |
3407dffed0 | ||
![]() |
e802acf413 | ||
![]() |
f001625e5b | ||
![]() |
43a726efe7 | ||
![]() |
f37245ace2 | ||
![]() |
08ddfbb884 | ||
![]() |
e96e7ffc89 | ||
![]() |
2926f0a501 | ||
![]() |
6c325e9070 | ||
![]() |
efc82ee1b9 | ||
![]() |
5ae85e9c07 | ||
![]() |
74b3bca93d | ||
![]() |
e7e41b045d | ||
![]() |
47f67eb270 | ||
![]() |
e608366a8e | ||
![]() |
03a3183b1c | ||
![]() |
e64a42732f | ||
![]() |
45a2c2e905 | ||
![]() |
f5f20efe0d | ||
![]() |
49a9e74900 | ||
![]() |
207eef305e | ||
![]() |
4694ded7cd | ||
![]() |
d027c27ca1 | ||
![]() |
ee26de98de | ||
![]() |
94e75ba53c | ||
![]() |
f4e602a791 | ||
![]() |
6ab198ac22 | ||
![]() |
a030448cde | ||
![]() |
5da8c8f708 | ||
![]() |
09cc9e5d93 | ||
![]() |
195d136faa | ||
![]() |
d2cd398594 | ||
![]() |
8232b8ba6d | ||
![]() |
cfa98e02fc | ||
![]() |
efa3a05a35 | ||
![]() |
34fdccd3fb | ||
![]() |
b9db62bc43 | ||
![]() |
9ae52f1e46 | ||
![]() |
419b29f5b4 | ||
![]() |
0134973907 | ||
![]() |
fcb791d5a0 | ||
![]() |
175565eb71 | ||
![]() |
aa91d9f78b | ||
![]() |
730715228a | ||
![]() |
e151a2f153 | ||
![]() |
1a04ec9f33 | ||
![]() |
3d47456f56 | ||
![]() |
3bdf5ea05e | ||
![]() |
4b91c5aa03 | ||
![]() |
0932b98c34 | ||
![]() |
cbb0b8e66c | ||
![]() |
a6a7407faa | ||
![]() |
a5c4eaa55c | ||
![]() |
44cbcaa387 | ||
![]() |
a5237524b2 | ||
![]() |
9e062cd7a8 | ||
![]() |
5eddcaef89 | ||
![]() |
95bddff99d | ||
![]() |
34ea09264a | ||
![]() |
20c5761bcd | ||
![]() |
900de3c304 | ||
![]() |
8b7447b282 | ||
![]() |
66f03613b7 | ||
![]() |
f1b58398b0 | ||
![]() |
cbb4a91113 | ||
![]() |
b9002db37f | ||
![]() |
7e29e47e4b | ||
![]() |
0f9bdb18f5 | ||
![]() |
29d17da1ba | ||
![]() |
ce78866002 | ||
![]() |
0ac412da0f | ||
![]() |
2ba63f3462 | ||
![]() |
590c2d72ab | ||
![]() |
db3fe54006 | ||
![]() |
b23b32f84d | ||
![]() |
c39a03ad59 | ||
![]() |
0ac034ad4c | ||
![]() |
8d36bbd7ab | ||
![]() |
e74969bd17 | ||
![]() |
b5a99f049c | ||
![]() |
f86c3e6253 | ||
![]() |
964e69127c | ||
![]() |
f3a4631395 | ||
![]() |
1afc7df221 | ||
![]() |
51521d147d | ||
![]() |
c3b9b816f7 | ||
![]() |
f881cdaae6 | ||
![]() |
600501924f | ||
![]() |
80d64e6418 | ||
![]() |
c36a344387 | ||
![]() |
2581654922 | ||
![]() |
d86c90a162 | ||
![]() |
9ed1636ffe | ||
![]() |
bb9cc21d8e | ||
![]() |
b9529231b4 | ||
![]() |
689bcd14aa | ||
![]() |
42440b17e8 | ||
![]() |
27e35b8bcd | ||
![]() |
501264647e | ||
![]() |
fb09ca1868 | ||
![]() |
8a847ee7dc | ||
![]() |
2c41717e30 | ||
![]() |
2fb121b1c9 | ||
![]() |
c17e916978 | ||
![]() |
75109ac211 | ||
![]() |
02bcf06809 | ||
![]() |
c540438b91 | ||
![]() |
154e38e71e | ||
![]() |
7179d77d0c | ||
![]() |
4c3a20c3f2 | ||
![]() |
b78ad2e12d | ||
![]() |
f36d236a55 | ||
![]() |
9a72bf1858 | ||
![]() |
79857803de | ||
![]() |
4fcc9f052e | ||
![]() |
8c5369d522 | ||
![]() |
311052d555 | ||
![]() |
d299fbd8da | ||
![]() |
8a5cce91bf | ||
![]() |
7a598e5567 | ||
![]() |
ceb771aeb6 | ||
![]() |
ebae7a654e | ||
![]() |
1e0d6c3346 | ||
![]() |
ff652ff407 | ||
![]() |
f6853d0947 | ||
![]() |
6ec56406cf | ||
![]() |
00dcef82e3 | ||
![]() |
f15e959634 | ||
![]() |
43c7a44e1d | ||
![]() |
9cdd64b58f | ||
![]() |
1cd4938224 | ||
![]() |
f3446fad9a | ||
![]() |
d81fdce482 | ||
![]() |
585e362526 | ||
![]() |
8984fd358b | ||
![]() |
583596178f | ||
![]() |
ae148bc89f | ||
![]() |
dc5a81ac77 | ||
![]() |
b51e6bdaa4 | ||
![]() |
95e4c6ac2a | ||
![]() |
9e86812928 | ||
![]() |
43dd208874 | ||
![]() |
e8a9a6063b | ||
![]() |
e22eea105f | ||
![]() |
319f590e1a | ||
![]() |
69090f0bf0 | ||
![]() |
f289b64030 | ||
![]() |
cb57ebd470 | ||
![]() |
509495e224 | ||
![]() |
96f64031d4 | ||
![]() |
9abae5b0a2 | ||
![]() |
98c3b06ffd | ||
![]() |
1af2020151 | ||
![]() |
88a0d1ff03 | ||
![]() |
28958e51ef | ||
![]() |
78a2866980 | ||
![]() |
6f6e533380 | ||
![]() |
f7b55bfdcc | ||
![]() |
5975c80270 | ||
![]() |
7e0b4d4a78 | ||
![]() |
f51eed31d8 | ||
![]() |
197c81178c | ||
![]() |
dc73aaeb39 | ||
![]() |
9c08499787 | ||
![]() |
8e2d576805 | ||
![]() |
26ea31107f | ||
![]() |
a6620b663b | ||
![]() |
dccd7a9b99 | ||
![]() |
badb397bce | ||
![]() |
812f783084 | ||
![]() |
826a0c4e10 | ||
![]() |
ebb788140a | ||
![]() |
637d35a74b | ||
![]() |
2be93847ce | ||
![]() |
f0a74e2e95 | ||
![]() |
b30802e35f | ||
![]() |
086f74fb29 | ||
![]() |
b908e45208 | ||
![]() |
23cefa0bb5 | ||
![]() |
42639fc9fb | ||
![]() |
a38c16e57e | ||
![]() |
a535ef6117 | ||
![]() |
eb42281fd4 | ||
![]() |
93902aabfd | ||
![]() |
7d068e6909 | ||
![]() |
7593c6fdee | ||
![]() |
4e66c5dc6c | ||
![]() |
a62b3c8b29 | ||
![]() |
8c3437fd27 | ||
![]() |
efeedae712 | ||
![]() |
b392d206d7 | ||
![]() |
d826e620a9 | ||
![]() |
1db28d3b3f | ||
![]() |
b6177f74a7 | ||
![]() |
086f3d807e | ||
![]() |
6b72d622a5 | ||
![]() |
f0a811421f | ||
![]() |
b3a72a61fd | ||
![]() |
f94a3d08e0 | ||
![]() |
d910267364 | ||
![]() |
d7b4eec74a | ||
![]() |
86b34a45b1 | ||
![]() |
34c04823ff | ||
![]() |
7cff2734d1 | ||
![]() |
e5dc1b01ac | ||
![]() |
6e577c12c1 | ||
![]() |
97b629ad5b | ||
![]() |
5eca441b1c | ||
![]() |
8a8171ebc7 | ||
![]() |
0243071f15 | ||
![]() |
de42a62f4e | ||
![]() |
854e58fd82 | ||
![]() |
fb49dabcc2 | ||
![]() |
b0d3660c91 | ||
![]() |
dbcacfa5ba | ||
![]() |
e51e7ab77a | ||
![]() |
6cda7d0b11 | ||
![]() |
c7a72aeed3 | ||
![]() |
e354442c93 | ||
![]() |
3e3bbe0eb5 | ||
![]() |
82a6ba0238 | ||
![]() |
82a43d88f5 | ||
![]() |
c3b63c96d7 | ||
![]() |
899b6347b1 | ||
![]() |
213846a685 | ||
![]() |
346a8b5aaf | ||
![]() |
5faeb552b7 | ||
![]() |
b44845ad66 | ||
![]() |
f1097bfbe1 | ||
![]() |
47353f88c7 | ||
![]() |
7ff56e67e9 | ||
![]() |
d7cac40332 | ||
![]() |
e0e6dab50f | ||
![]() |
00e572800c | ||
![]() |
702eab3a6c | ||
![]() |
3ed032bf8b | ||
![]() |
b3f3014058 | ||
![]() |
39f2c804a3 | ||
![]() |
4dfc8d16be | ||
![]() |
bab3f73370 | ||
![]() |
dc9d951255 | ||
![]() |
fecaa42962 | ||
![]() |
8057a2f68a | ||
![]() |
9bad861649 | ||
![]() |
deed8016ed | ||
![]() |
b168954ed3 | ||
![]() |
fb5a3a8998 | ||
![]() |
459d8f9c9d | ||
![]() |
1efd5432ef | ||
![]() |
31b211550f | ||
![]() |
538a06fd55 | ||
![]() |
be44a1d9a5 | ||
![]() |
e694f07144 | ||
![]() |
2b780e5486 | ||
![]() |
9e8800561e | ||
![]() |
5fba648e85 | ||
![]() |
019b5cacc3 | ||
![]() |
81e52735a2 | ||
![]() |
9bcdc8be00 | ||
![]() |
a7c8cea1b5 | ||
![]() |
47f0557175 | ||
![]() |
24c91c3a37 | ||
![]() |
89b00f25a7 | ||
![]() |
8ebadbce28 | ||
![]() |
875e6dc0f9 | ||
![]() |
7df9ce1731 | ||
![]() |
8d07496c75 | ||
![]() |
c776871d52 | ||
![]() |
7fea250304 | ||
![]() |
6617781f4f | ||
![]() |
ac31a7f143 | ||
![]() |
fffb277250 | ||
![]() |
966c399154 | ||
![]() |
fb448b2f31 | ||
![]() |
85815f8188 | ||
![]() |
22bbeb0ae0 | ||
![]() |
3e4253f23e | ||
![]() |
400e82daa3 | ||
![]() |
0a513b0678 | ||
![]() |
b4743ee236 | ||
![]() |
dd8acae43c | ||
![]() |
e28902b102 | ||
![]() |
d5bcea27e3 | ||
![]() |
d0e109f96c | ||
![]() |
9d68b98bc9 | ||
![]() |
a242f622ea | ||
![]() |
4e2d5154fe | ||
![]() |
d5e31129d5 | ||
![]() |
b7f1a5fae7 | ||
![]() |
fe20139722 | ||
![]() |
c6b3408398 | ||
![]() |
d4b91dc654 | ||
![]() |
8da3b943a9 | ||
![]() |
3a745537f0 | ||
![]() |
3d62f360fe | ||
![]() |
bfd67fadef | ||
![]() |
2f74af1c04 | ||
![]() |
49f9ba96cc | ||
![]() |
90ff51acdb | ||
![]() |
f7c2b446f2 | ||
![]() |
619e2c36b5 | ||
![]() |
737d3cbbf5 | ||
![]() |
6aaf2738c9 | ||
![]() |
31ba0b1f95 | ||
![]() |
68eb780c75 | ||
![]() |
03498549b2 | ||
![]() |
6077c26cdf | ||
![]() |
0498d55314 | ||
![]() |
4b5eda0b0a | ||
![]() |
0cf10075e1 | ||
![]() |
ceb2f700f5 | ||
![]() |
2e19e3c9f7 | ||
![]() |
aad6035c57 | ||
![]() |
2eeb984e4e | ||
![]() |
a1c5f93ef0 | ||
![]() |
b0af92b1d8 | ||
![]() |
068c16b162 | ||
![]() |
91bf299f16 | ||
![]() |
f24be6ccc3 | ||
![]() |
0cbf47ca30 | ||
![]() |
a40a9eccf4 | ||
![]() |
e19d4c048a | ||
![]() |
35bdbec054 | ||
![]() |
af845f4de7 | ||
![]() |
d466c615ed | ||
![]() |
cc3c995d80 | ||
![]() |
a4fe1ad960 | ||
![]() |
750cb70f69 | ||
![]() |
4f70698493 | ||
![]() |
30ff4540d0 | ||
![]() |
71552fb08d | ||
![]() |
2536b82084 | ||
![]() |
d70e08039c | ||
![]() |
49fe8f0399 | ||
![]() |
4e9ac83b15 | ||
![]() |
0f1f2283e7 | ||
![]() |
2567ee81b8 | ||
![]() |
b29a41fa43 | ||
![]() |
1b8dd23884 | ||
![]() |
860a1298b5 | ||
![]() |
7366527aa7 | ||
![]() |
6e7669e4d7 | ||
![]() |
691c6f802d | ||
![]() |
009a439259 | ||
![]() |
82b064ed7d | ||
![]() |
bb35f88925 | ||
![]() |
9b39feab95 | ||
![]() |
74cf783be3 | ||
![]() |
6c38f577fe | ||
![]() |
5f65ca07d7 | ||
![]() |
2c73ab41ed | ||
![]() |
53bddf9ceb | ||
![]() |
5151c5102d | ||
![]() |
973662d5c3 | ||
![]() |
b94beb3289 | ||
![]() |
af83598ad3 | ||
![]() |
41e99288b5 | ||
![]() |
a3460b8ac8 | ||
![]() |
9598affa03 | ||
![]() |
2679d3cf00 | ||
![]() |
487c6cfaaa | ||
![]() |
052a794427 | ||
![]() |
6fe940afc7 | ||
![]() |
912afb6e6b | ||
![]() |
6d2c558bd8 | ||
![]() |
8f5c12d76d | ||
![]() |
0494b044d5 | ||
![]() |
3f7203a3a4 | ||
![]() |
9138b9aa3c | ||
![]() |
de41777c69 | ||
![]() |
7b9877258f | ||
![]() |
41120f2a79 | ||
![]() |
6f8a7f1870 | ||
![]() |
7fbbd0200f | ||
![]() |
cf4ef8cab2 | ||
![]() |
011a7f77a6 | ||
![]() |
80fb12a0b9 | ||
![]() |
80c4897ced | ||
![]() |
c56914dd5d | ||
![]() |
559f6e8f19 | ||
![]() |
718b077b82 | ||
![]() |
14dccacfde | ||
![]() |
82ceb7c837 | ||
![]() |
03481ae2d0 | ||
![]() |
17b4eab4d4 | ||
![]() |
cb1b7deefa | ||
![]() |
cd40cc9edb | ||
![]() |
e8267b20fe | ||
![]() |
c64ada94a5 | ||
![]() |
a32503a75a | ||
![]() |
53268f985f | ||
![]() |
e4e200a1dc | ||
![]() |
e9053f1f52 | ||
![]() |
e3156b007d | ||
![]() |
e691b664e3 | ||
![]() |
4ee70f0780 | ||
![]() |
995e8da006 | ||
![]() |
5fd4fb96f7 | ||
![]() |
1d818b7b7c | ||
![]() |
8183c509d9 | ||
![]() |
115c086eb9 | ||
![]() |
6603ee6084 | ||
![]() |
f5c10f387b | ||
![]() |
458e125c09 | ||
![]() |
b98ae68f39 | ||
![]() |
d23fa8c870 | ||
![]() |
ebc69e1127 | ||
![]() |
4c64e88631 | ||
![]() |
dd56688cd8 | ||
![]() |
afcd24b603 | ||
![]() |
7527670eef | ||
![]() |
089e595b28 | ||
![]() |
2a71cab8c4 | ||
![]() |
1ee119f3dc | ||
![]() |
206cff1547 | ||
![]() |
d02060e201 | ||
![]() |
f965726d15 | ||
![]() |
38ff6a49c4 | ||
![]() |
fa0592ebc7 | ||
![]() |
a500a7e668 | ||
![]() |
4c323b8f33 | ||
![]() |
4aea4e7dc6 | ||
![]() |
1e28a50647 | ||
![]() |
4677a6ab76 | ||
![]() |
661c0fdad9 | ||
![]() |
faf818940d | ||
![]() |
615abebd9d | ||
![]() |
62c5d3df06 | ||
![]() |
bfc47ccd6e | ||
![]() |
80cd793f75 | ||
![]() |
42936562de | ||
![]() |
9e2cfcd699 | ||
![]() |
9b86849068 | ||
![]() |
11089cb824 | ||
![]() |
35a2f2df76 | ||
![]() |
447eba6007 | ||
![]() |
5e8ceda7e7 | ||
![]() |
c89be4ac8a | ||
![]() |
fdb20df78b | ||
![]() |
262e6fab27 | ||
![]() |
d443d92446 | ||
![]() |
5429690467 | ||
![]() |
a922dadde0 | ||
![]() |
c1358625c9 | ||
![]() |
20a98e1c2a | ||
![]() |
ac2aa5337d | ||
![]() |
efa0ae8373 | ||
![]() |
bedddaa717 | ||
![]() |
2d01419577 | ||
![]() |
20218dac92 | ||
![]() |
214ac20a69 | ||
![]() |
3b8db16d9f | ||
![]() |
6f8474cf04 | ||
![]() |
53bdcfc12b | ||
![]() |
ca38a13205 | ||
![]() |
1feeb731c9 | ||
![]() |
37dd796b53 | ||
![]() |
a7378b709b | ||
![]() |
813e6f459f | ||
![]() |
0ed0c3bab6 | ||
![]() |
c6ebcae729 | ||
![]() |
0ca04ed7aa | ||
![]() |
28cae9c995 | ||
![]() |
56da0d3df7 | ||
![]() |
78478110fa | ||
![]() |
1b0100792f | ||
![]() |
a9b7683110 | ||
![]() |
a2d4594e19 | ||
![]() |
dffad0e982 | ||
![]() |
e48976b926 | ||
![]() |
e5b944ce09 | ||
![]() |
d06be91342 | ||
![]() |
ac56962c29 | ||
![]() |
f5e9ff5a82 | ||
![]() |
2bad2844f5 | ||
![]() |
245c9c2d7e | ||
![]() |
29a86695d1 | ||
![]() |
7b9eccb489 | ||
![]() |
339bdf8dd2 | ||
![]() |
116fc5546f | ||
![]() |
844a8ac13f | ||
![]() |
bd712d7f8f | ||
![]() |
9d84a23cd1 | ||
![]() |
ed2e19e4d7 | ||
![]() |
f233617a90 | ||
![]() |
4f3b78c64c | ||
![]() |
75fa1d1b09 | ||
![]() |
ced833fdfc | ||
![]() |
51d9f9dce6 | ||
![]() |
43b67afc41 | ||
![]() |
d91715dc8f | ||
![]() |
090096b1e2 | ||
![]() |
d2061f8398 | ||
![]() |
835863e397 | ||
![]() |
e605dff37f | ||
![]() |
e6984e727c | ||
![]() |
5ad12fbe90 | ||
![]() |
8f1cfefbb2 | ||
![]() |
f33a46072b | ||
![]() |
7279f2a9cd | ||
![]() |
84c3050a7c | ||
![]() |
8ae714eeae | ||
![]() |
2be2d8ccbe | ||
![]() |
fee55e548c | ||
![]() |
41e5fbb963 | ||
![]() |
9c5809ce5e | ||
![]() |
089eb7e6de | ||
![]() |
add8c23c13 | ||
![]() |
e263d441f5 | ||
![]() |
26022db469 | ||
![]() |
ad47a95074 | ||
![]() |
195dd875a7 | ||
![]() |
23079e848b | ||
![]() |
f374f94644 | ||
![]() |
838d999d86 | ||
![]() |
8ddeb4f953 | ||
![]() |
33dd196cba | ||
![]() |
c4bc6b7445 | ||
![]() |
d1889d1395 | ||
![]() |
a63cbb186d | ||
![]() |
b52ee424e4 | ||
![]() |
5b4e9c01cc | ||
![]() |
7eac9e4958 | ||
![]() |
855d19cc0a | ||
![]() |
d34cc4a683 | ||
![]() |
5fdb8463de | ||
![]() |
19d2e8c7e1 | ||
![]() |
3194faaa9c | ||
![]() |
e532a300b0 | ||
![]() |
229589616f | ||
![]() |
b2bbb306f4 | ||
![]() |
da6ded6f3f | ||
![]() |
884dcec781 | ||
![]() |
402c0b5036 | ||
![]() |
9ed27d3dcb | ||
![]() |
f36ba88085 | ||
![]() |
ac85e1e225 | ||
![]() |
d9934a2d8c | ||
![]() |
8b680dfdd2 | ||
![]() |
3d1d70b727 | ||
![]() |
029004f289 | ||
![]() |
06ec2b948f | ||
![]() |
60f48e44ff | ||
![]() |
501a60ab20 | ||
![]() |
b9701454b8 | ||
![]() |
ee1361fb6e | ||
![]() |
86e9191d34 | ||
![]() |
edb4d0a8c4 | ||
![]() |
362e9af8e8 | ||
![]() |
a665b422bd | ||
![]() |
ac7f2cdef9 | ||
![]() |
8bf3fe0d19 | ||
![]() |
921e556b3a | ||
![]() |
c92222b1b2 | ||
![]() |
7134dc513a | ||
![]() |
a29d12c67d | ||
![]() |
da9bae158b | ||
![]() |
ae659e1c52 | ||
![]() |
946a2dc446 | ||
![]() |
69dae32c37 | ||
![]() |
ac7524508b | ||
![]() |
4af0425d72 | ||
![]() |
fa803fd88f | ||
![]() |
3fa131695b | ||
![]() |
7fa28277a1 | ||
![]() |
041b33c450 | ||
![]() |
06a0c62f86 | ||
![]() |
6981a8198b | ||
![]() |
b3778e4470 | ||
![]() |
8c8d500495 | ||
![]() |
e312daffd5 | ||
![]() |
3f05f34286 | ||
![]() |
248487a63c | ||
![]() |
420c29dea9 | ||
![]() |
5ccb32efed | ||
![]() |
4f107f84eb | ||
![]() |
6bae734d41 | ||
![]() |
8c5e683296 | ||
![]() |
ff5315d551 | ||
![]() |
4395fd581a | ||
![]() |
3b9c81f390 | ||
![]() |
abc8cb6ff7 | ||
![]() |
f663a511b3 | ||
![]() |
3e92e3b1df | ||
![]() |
d080f816b6 | ||
![]() |
bacc9c0afc | ||
![]() |
2af36b1e56 | ||
![]() |
85a01b3945 | ||
![]() |
7069fc9b50 | ||
![]() |
01a5b5762d | ||
![]() |
1c1f4d7c93 | ||
![]() |
a29c93a95a | ||
![]() |
842eb3fa93 | ||
![]() |
bbd6396f40 | ||
![]() |
fcaeaa0328 | ||
![]() |
282b52d6b7 | ||
![]() |
9c8824542e | ||
![]() |
e8bc8e95e2 | ||
![]() |
cfd3cdd64e | ||
![]() |
ec4edcb78c | ||
![]() |
94c3b02eef | ||
![]() |
f83ac8476c | ||
![]() |
4edccc4eb5 | ||
![]() |
0398a78b4a | ||
![]() |
ec6a455fb0 | ||
![]() |
e55ead0419 | ||
![]() |
f22b9dfd94 | ||
![]() |
ec4dfd0cbc | ||
![]() |
350ecb1dcf | ||
![]() |
38a878171a | ||
![]() |
dad1b107f5 | ||
![]() |
582a80f518 |
31
.cvsignore
Normal file
31
.cvsignore
Normal file
@@ -0,0 +1,31 @@
|
||||
Makefile
|
||||
Makefile.in
|
||||
aclocal.m4
|
||||
confdefs.h
|
||||
config.cache
|
||||
config.guess
|
||||
config.h
|
||||
config.log
|
||||
config.status
|
||||
config.sub
|
||||
configure
|
||||
configure.scan
|
||||
libtool
|
||||
ltconfig
|
||||
ltmain.sh
|
||||
stamp-h
|
||||
stamp-h.in
|
||||
stamp-h1
|
||||
stamp.h
|
||||
version.h
|
||||
config.h.in
|
||||
install-sh
|
||||
missing
|
||||
mkinstalldirs
|
||||
INSTALL
|
||||
intl
|
||||
ABOUT-NLS
|
||||
COPYING
|
||||
intltool-*
|
||||
metacity.spec
|
||||
autom4te.cache
|
159
COMPLIANCE
Normal file
159
COMPLIANCE
Normal file
@@ -0,0 +1,159 @@
|
||||
Metacity Standards Compliance
|
||||
=============================
|
||||
$Id$
|
||||
|
||||
1) Introduction
|
||||
2) EWMH Compliance
|
||||
a. Root Window Properties
|
||||
b. Root Window Messages
|
||||
c. Application Window Properties
|
||||
d. Window Manager Protocols
|
||||
3) ICCCM Compliance
|
||||
|
||||
1) Introduction
|
||||
---------------
|
||||
|
||||
This document details metacity compliance with the relevent standards.
|
||||
The format of this document is as follows:
|
||||
|
||||
[-/+?] Hint Name/Feature Name (Version number)
|
||||
Errata/Comments
|
||||
|
||||
The first character indicates the level of compliance as follows:
|
||||
- none
|
||||
/ partial
|
||||
+ complete
|
||||
? unknown
|
||||
|
||||
The title indicates a feature or a hint in the specification, and the
|
||||
version number indicates the minimum version of the specification
|
||||
supported by metacity. Later versions may be supported if no
|
||||
incompatible changes have been made in the specification.
|
||||
|
||||
2) EWMH Compliance
|
||||
------------------
|
||||
|
||||
The EWMH, or Extended Window Manager Hints is a freedesktop.org-
|
||||
developed standard to support a number of conventions for
|
||||
communication between the window manager and clients. It builds on
|
||||
and extends the ICCCM (See Section 3). A copy of the current EWMH
|
||||
standard is available at http://freedesktop.org/Standards/wm-spec/
|
||||
|
||||
a. Root Window Properties
|
||||
-------------------------
|
||||
|
||||
+ _NET_SUPPORTED (1.3)
|
||||
|
||||
+ _NET_CLIENT_LIST (1.3)
|
||||
|
||||
+ _NET_NUMBER_OF_DESKTOPS (1.3)
|
||||
|
||||
+ _NET_DESKTOP_GEOMETRY (1.3)
|
||||
Metacity does not implement large desktops, so this is kept set to
|
||||
the screen size.
|
||||
|
||||
+ _NET_DESKTOP_VIEWPORT (1.3)
|
||||
Metacity does not implement viewports, so this is a constant (0,0).
|
||||
|
||||
+ _NET_CURRENT_DESKTOP (1.3)
|
||||
|
||||
+ _NET_DESKTOP_NAMES (1.3)
|
||||
|
||||
+ _NET_ACTIVE_WINDOW (1.3)
|
||||
|
||||
+ _NET_WORKAREA (1.3)
|
||||
|
||||
+ _NET_SUPPORTING_WM_CHECK (1.3)
|
||||
|
||||
+ _NET_VIRTUAL_ROOTS (1.3)
|
||||
Metacity does not read or set this property, but it does not use
|
||||
virtual roots to implement virtual desktops, so it complies with the
|
||||
specification.
|
||||
|
||||
+ _NET_DESKTOP_LAYOUT (1.3)
|
||||
|
||||
+ _NET_SHOWING_DESKTOP (1.3)
|
||||
|
||||
b. Root Window Messages
|
||||
-----------------------
|
||||
|
||||
+ _NET_CLOSE_WINDOW (1.3)
|
||||
|
||||
- _NET_MOVERESIZE_WINDOW (1.3)
|
||||
Metacity supports this message, but the specification is unclear on
|
||||
the layout of the detail value, and as such it is #if 0'd in the code
|
||||
|
||||
+ _NET_WM_MOVERESIZE (1.3)
|
||||
|
||||
- _NET_RESTACK_WINDOW (1.3)
|
||||
Metacity will raise or lower windows in response to this message,
|
||||
but the sibling restack modes are not supported, and it is currently
|
||||
#if 0'd in the code.
|
||||
|
||||
+ _NET_REQUEST_FRAME_EXTENTS (1.3)
|
||||
|
||||
c. Application Window Properties
|
||||
--------------------------------
|
||||
|
||||
+ _NET_WM_NAME (1.3)
|
||||
|
||||
+ _NET_WM_VISIBLE_NAME (1.3)
|
||||
Metacity does not set this property, but metacity will never display
|
||||
a name different from _NET_WM_NAME
|
||||
|
||||
+ _NET_WM_ICON_NAME (1.3)
|
||||
|
||||
+ _NET_WM_VISIBLE_ICON_NAME (1.3)
|
||||
Metacity does not set this property, but metacity will never display
|
||||
a name different from _NET_WM_NAME
|
||||
|
||||
+ _NET_WM_DESKTOP (1.3)
|
||||
|
||||
+ _NET_WM_WINDOW_TYPE (1.3)
|
||||
|
||||
/ _NET_WM_STATE (1.3)
|
||||
This property is read and updated according to the specification,
|
||||
but see caveat below.
|
||||
Metacity does not recognize separate vertical and horizontal
|
||||
maximization states. Currently metacity will do a two-dimensional
|
||||
maximization if either property is set.
|
||||
See: http://bugzilla.gnome.org/show_bug.cgi?id=113601
|
||||
Metacity doesn't implement viewports so _NET_WM_STATE_STICKY is
|
||||
unimplemented.
|
||||
|
||||
+ _NET_WM_ALLOWED_ACTIONS (1.3)
|
||||
Metacity keeps this hint up to date. The code is somewhat crufty
|
||||
and should be rewritten, though it is functional.
|
||||
See: http://bugzilla.gnome.org/show_bug.cgi?id=90420
|
||||
|
||||
+ _NET_WM_STRUT (1.3)
|
||||
|
||||
+ _NET_WM_STRUT_PARTIAL (1.3)
|
||||
|
||||
+ _NET_WM_ICON_GEOMETRY (1.3)
|
||||
Metacity uses this property to draw minimize/restore animations
|
||||
|
||||
+ _NET_WM_ICON (1.3)
|
||||
|
||||
+ _NET_WM_PID (1.3)
|
||||
|
||||
+ _NET_WM_HANDLED_ICONS (1.3)
|
||||
Metacity does not read or set this property. However, metacity
|
||||
never manages iconified windows, and so has no need to do so.
|
||||
|
||||
+ _NET_WM_USER_TIME (1.3)
|
||||
Metacity uses this property to prevent applications from stealing
|
||||
focus if supported by the toolkit.
|
||||
|
||||
+ _NET_FRAME_EXTENTS (1.3)
|
||||
If set in response to a _NET_REQUEST_FRAME_EXTENTS message received
|
||||
prior to the window being mapped, this may be an estimate. This is,
|
||||
however, expressly allowed by the specification.
|
||||
|
||||
d. Window Manager Protocols
|
||||
---------------------------
|
||||
+ _NET_WM_PING (1.3)
|
||||
|
||||
3) ICCCM Compliance
|
||||
-------------------
|
||||
TODO
|
290
HACKING
290
HACKING
@@ -1,52 +1,246 @@
|
||||
Intro...
|
||||
|
||||
Don't commit substantive code in here without asking me,
|
||||
hp@redhat.com. Adding translations, no-brainer typo fixes, etc. is
|
||||
fine.
|
||||
Window managers have a few ways in which they are significantly different
|
||||
from other applications. This file, combined with the code overview in
|
||||
doc/code-overview.txt, should hopefully provide a series of relatively
|
||||
quick pointers (hopefully only a few minutes each) to some of the places
|
||||
one can look to orient themselves and get started. Some of this will be
|
||||
general to window managers on X, much will be specific to Metacity, and
|
||||
there's probably some information that's common to programs in general but
|
||||
is nonetheless useful.
|
||||
|
||||
The script src/run-metacity.sh is useful to hack on the window manager.
|
||||
It runs metacity in an Xnest. e.g.:
|
||||
CLIENTS=3 ./run-metacity.sh
|
||||
or
|
||||
DEBUG=memprof ./run-metacity.sh
|
||||
or whatever.
|
||||
|
||||
src/window.c is where all the guts of the window manager live. This is
|
||||
basically the only remotely scary file.
|
||||
|
||||
src/frames.c is the GtkWidget that handles drawing window frames.
|
||||
|
||||
src/core.h defines the interface used by the GTK portion of the window
|
||||
manager to talk to the other portions. There's some cruft in here
|
||||
that's unused, since nearly all window operations have moved out of
|
||||
this file so frameless apps can have window operations.
|
||||
|
||||
src/ui.h defines the interface the plain Xlib portion of the window
|
||||
manager uses to talk to the GTK portion.
|
||||
|
||||
Files that include gdk.h or gtk.h are not supposed to include
|
||||
display.h or window.h or other core files.
|
||||
|
||||
Files in the core (display.[hc], window.[hc]) are not supposed to
|
||||
include gdk.h or gtk.h.
|
||||
|
||||
When hacking, remember that you can have multiple screens. The code is
|
||||
also written to support multiple displays, but this is useless, since
|
||||
you can just run two copies of the WM. Also, an XKillClient() or
|
||||
shutdown on any display causes Xlib to exit the app, so it would be
|
||||
broken. So the multi-display thing is mostly just for code
|
||||
cleanliness. Multi-screen on the other hand is important for some
|
||||
people.
|
||||
|
||||
Remember that strings stored in X properties are not in UTF-8, and
|
||||
they have to end up in UTF-8 before we try putting them through Pango.
|
||||
|
||||
If you make any X request involving a client window, you have to
|
||||
meta_error_trap_push() around the call; this is not necessary for
|
||||
X requests on the frame windows.
|
||||
|
||||
Remember that not all windows have frames, and window->frame can
|
||||
be NULL.
|
||||
|
||||
The code could use cleanup in a lot of places, feel free to do so.
|
||||
Overview
|
||||
Administrative issues
|
||||
Relevant standards and X properties
|
||||
Debugging and testing
|
||||
Debugging logs
|
||||
Adding information to the log
|
||||
Valgrind
|
||||
Testing Utilities
|
||||
Technical gotchas to keep in mind
|
||||
Other important reading
|
||||
Extra reading
|
||||
Ideas for tasks to work on
|
||||
|
||||
|
||||
Administrative issues
|
||||
Don't commit substantive code in here without asking hp@redhat.com.
|
||||
Adding translations, no-brainer typo fixes, etc. is fine.
|
||||
|
||||
The code could use cleanup in a lot of places, feel free to do so.
|
||||
|
||||
See http://developer.gnome.org/dotplan/for_maintainers.html for
|
||||
information on how to make a release. The only difference from those
|
||||
instructions is that the minor version number of a Metacity release
|
||||
should always be a number from the Fibonacci sequence.
|
||||
|
||||
Relevant standards and X properties
|
||||
There are two documents that describe some basics about how window
|
||||
managers should behave: the ICCCM (Inter-Client Communication Conventions
|
||||
Manual) and EWMH (Extended Window Manager Hints). You can find these at
|
||||
the following locations:
|
||||
ICCCM - http://tronche.com/gui/x/icccm/
|
||||
EWMH - :pserver:anoncvs@pdx.freedesktop.org:/cvs
|
||||
The ICCCM is usually available in RPM or DEB format as well. There is
|
||||
actually an online version of the EWMH, but it is almost always woefully
|
||||
out of date. Just get it from cvs with these commands (the backslash
|
||||
means include the stuff from the next line):
|
||||
cvs -d :pserver:anoncvs@cvs.freedesktop.org:/cvs/icccm-extensions login
|
||||
cvs -d :pserver:anoncvs@cvs.freedesktop.org:/cvs/icccm-extensions \
|
||||
checkout wm-spec
|
||||
|
||||
DO NOT GO AND READ THOSE THINGS. THEY ARE REALLY, REALLY BORING.
|
||||
|
||||
If you do, you'll probably end up catching up on your sleep instead of
|
||||
hacking on Metacity. ;-) Instead, just look at the table of contents and
|
||||
glance at a page or two to get an idea of what's in there. Then only
|
||||
refer to it if you see something weird in the code and you don't know
|
||||
what it is but has some funny looking name like you see in one of those
|
||||
two documents.
|
||||
|
||||
You can refer to the COMPLIANCE file for additional information on these
|
||||
specifications and Metacity's compliance therewith.
|
||||
|
||||
One of the major things those documents cover that are useful to learn
|
||||
about immediately are X properties. The right way to learn about those,
|
||||
though, is through hand on experimentation with the xprop command (and
|
||||
then look up things you find from xprop in those two manuals if you're
|
||||
curious enough). First, try running
|
||||
xprop
|
||||
in a terminal and click on one of the windows on your screen. That gives
|
||||
you the x properties for that window. Look through them and get a basic
|
||||
idea of what's there for kicks. Note that you can get rid of some of the
|
||||
verboseness by grepping out the _NET_WM_ICON stuff, i.e.
|
||||
xprop | grep -v _NET_WM_ICON
|
||||
Next, try running
|
||||
xprop -root
|
||||
in a terminal. There's all the properties of the root window (which you
|
||||
can think of as the "main" Xserver window). You can also manually
|
||||
specify individual windows that you want the properties of with
|
||||
xprop -id <id>
|
||||
if you know the id of the window in question. You can get the id of a
|
||||
given window by either running xwininfo, e.g.
|
||||
xwininfo | grep "Window id" | cut -f 4 -d ' '
|
||||
or by looking at the _NET_CLIENT_STACKING property of the root
|
||||
window. Finally, it can also be useful to add "-spy" (without the
|
||||
quotes) to the xprop command to get it to continually monitor that
|
||||
window and report any changes to you.
|
||||
|
||||
Debugging information
|
||||
Trying to run a window manager under a typical debugger, such as gdb,
|
||||
unfortunately just doesn't work very well. So, we have to resort to
|
||||
other methods.
|
||||
|
||||
Debugging logs
|
||||
|
||||
First, note that you can start a new version of metacity to replace the
|
||||
existing one by running
|
||||
metacity --replace
|
||||
(which also comes in handy in the form "./src/metacity --replace" when
|
||||
trying to quickly test a small change while hacking on metacity without
|
||||
doing a full "make install", though I'm going off topic...) This will
|
||||
allow you to see any warnings printed at the terminal. Sometimes it's
|
||||
useful to have these directed to a logfile instead, which you can do by
|
||||
running
|
||||
METACITY_USE_LOGFILE=1 metacity --replace
|
||||
The logfile it uses will be printed in the terminal. Sometimes, it's
|
||||
useful to get more information than just warnings. You can set
|
||||
METACITY_VERBOSE to do that, like so:
|
||||
METACITY_VERBOSE=1 METACITY_USE_LOGFILE=1 metacity --replace
|
||||
(note that METACITY_VERBOSE=1 can be problematic without
|
||||
METACITY_USE_LOGFILE=1; avoid it unless running in from something that
|
||||
won't be managed by the new Metacity--see bug 305091 for more details).
|
||||
There are also other flags, such as METACITY_DEBUG, most of which I
|
||||
haven't tried and don't know what they do. Go to the source code
|
||||
directory and run
|
||||
grep "METACITY_" * | grep getenv
|
||||
to find out what the other ones are.
|
||||
|
||||
Adding information to the log
|
||||
|
||||
Since we can't single step with a debugger, we often have to fall back to
|
||||
the primitive method of getting information we want to know: adding
|
||||
"print" statements. Metacity has a fairly structured way to do this,
|
||||
using the functions meta_warning, meta_topic, and meta_verbose. All
|
||||
three have the same basic format as printf, except that meta_topic also
|
||||
takes a leading enumeration parameter to specify the type of message
|
||||
being shown (makes it easier for grepping in a verbose log). You'll find
|
||||
tons of examples in the source code if you need them; just do a quick
|
||||
grep or look in most any file. Note that meta_topic and meta_verbose
|
||||
messages only appear if verbosity is turned on. I tend to frequently add
|
||||
temporary meta_warning statements (or switch meta_topic or meta_verbose
|
||||
ones to meta_warning ones) and then undo the changes once I've learned
|
||||
the info that I needed.
|
||||
|
||||
There is also a meta_print_backtrace (which again is only active if
|
||||
verbosity is turned on) that can also be useful if you want to learn how
|
||||
a particular line of code gets called. And, of course, there's always
|
||||
g_assert if you want to make sure some section isn't executed (or isn't
|
||||
executed under certain conditions).
|
||||
|
||||
Valgrind
|
||||
|
||||
Valgrind is awesome for finding memory leaks or corruption and
|
||||
uninitialized variables. But I also tend to use it in a non-traditional
|
||||
way as a partial substitute for a normal debugger: it can provide me with
|
||||
a stack trace of where metacity is crashing if I made a change that
|
||||
caused it to do so, which is one of the major uses of debuggers. (And,
|
||||
what makes it cooler than a debugger is that there will also often be
|
||||
warnings pinpointing the cause of the crash from either some kind of
|
||||
simple memory corruption or an uninitialized variable). Sometimes, when
|
||||
I merely want to know what is calling a particular function I'll just
|
||||
throw in an "int i; printf("%d\n", i);" just because valgrind will give
|
||||
me a full stacktrace whenever it sees that uninitialized variable being
|
||||
used (yes, I could use meta_print_backtrace, but that means I have to
|
||||
turn verbosity on).
|
||||
|
||||
To run metacity under valgrind, use options typical for any Gnome
|
||||
program, such as
|
||||
valgrind --logfile=metacity.log --tool=memcheck --num-callers=48 \
|
||||
--leak-check=yes --leak-resolution=high --show-reachable=yes \
|
||||
./src/metacity --replace
|
||||
where, again, the backslashes mean to join all the stuff on the following
|
||||
line with the previous one.
|
||||
|
||||
However, there is a downside. Things run a little bit slowly, and it
|
||||
appears that you'll need about 1.5GB of ram, which unfortunately prevents
|
||||
most people from trying this.
|
||||
|
||||
Testing Utilities
|
||||
|
||||
src/run-metacity.sh
|
||||
The script src/run-metacity.sh is useful to hack on the window manager.
|
||||
It runs metacity in an Xnest. e.g.:
|
||||
CLIENTS=3 ./run-metacity.sh
|
||||
or
|
||||
DEBUG=memprof ./run-metacity.sh
|
||||
or
|
||||
DEBUG_TEST=1 ./run-metacity-sh
|
||||
or whatever.
|
||||
|
||||
metacity-message
|
||||
The tool metacity-message can be used as follows:
|
||||
metacity-message reload-theme
|
||||
metacity-message restart
|
||||
metacity-message enable-keybindings
|
||||
metacity-message disable-keybindings
|
||||
|
||||
metacity-window-demo
|
||||
metacity-window-demo is good for trying behavior of various kinds
|
||||
of window without launching a full desktop.
|
||||
|
||||
Technical gotchas to keep in mind
|
||||
Files that include gdk.h or gtk.h are not supposed to include display.h
|
||||
or window.h or other core files.
|
||||
|
||||
Files in the core (display.[hc], window.[hc]) are not supposed to include
|
||||
gdk.h or gtk.h.
|
||||
|
||||
Remember that strings stored in X properties are not in UTF-8, and they
|
||||
have to end up in UTF-8 before we try putting them through Pango.
|
||||
|
||||
If you make any X request involving a client window, you have to
|
||||
meta_error_trap_push() around the call; this is not necessary for X
|
||||
requests on the frame windows.
|
||||
|
||||
Remember that not all windows have frames, and window->frame can be NULL.
|
||||
|
||||
Other important reading & where to get started
|
||||
Extra reading
|
||||
|
||||
There are some other important things to read to get oriented as well.
|
||||
These are:
|
||||
http://pobox.com/~hp/features.html
|
||||
rationales.txt
|
||||
doc/code-overview.txt
|
||||
|
||||
It pays to read http://pobox.com/~hp/features.html in order
|
||||
to understand the philosophy of Metacity.
|
||||
|
||||
The rationales.txt file has two things: (1) a list of design choices with
|
||||
links in the form of bugzilla bugs that discuss the issue, and (2) a list
|
||||
outstanding bug categories, each of which is tracked by a particular
|
||||
tracker bug in bugzilla from which you can find several closely related
|
||||
bug reports.
|
||||
|
||||
doc/code-overview.txt provides a fairly good overview of the code,
|
||||
including coverage of the function of the various files, the main
|
||||
structures and their relationships, and places to start looking in the
|
||||
code tailored to general categories of tasks.
|
||||
|
||||
Ideas for tasks to work on
|
||||
|
||||
There are a variety of things you could work on in the code. You may
|
||||
have ideas of your own, but in case you don't, let me provide a list of
|
||||
ideas you could choose from:
|
||||
|
||||
If you're ambitious, there's a list of things Havoc made that he'd really
|
||||
like to see tackled, which you can find at
|
||||
http://log.ometer.com/2004-05.html. Be sure to double check with someone
|
||||
to make sure the item is still relevant if you're interested in one of
|
||||
these. Another place to look for ideas, of course, is bugzilla. One can
|
||||
just do queries and look for things that look fixable.
|
||||
|
||||
However, perhaps the best way of getting ideas of related tasks to work
|
||||
on, is to look at the second half of the rationales.txt file, which tries
|
||||
to group bugs by type.
|
||||
|
@@ -1,4 +1,7 @@
|
||||
|
||||
SUBDIRS=src
|
||||
SUBDIRS=src po doc
|
||||
|
||||
EXTRA_DIST=HACKING
|
||||
EXTRA_DIST=HACKING rationales.txt \
|
||||
intltool-extract.in intltool-merge.in intltool-update.in
|
||||
|
||||
DISTCLEANFILES = intltool-extract intltool-merge intltool-update
|
||||
|
974
NEWS
974
NEWS
@@ -0,0 +1,974 @@
|
||||
2.13.2
|
||||
==
|
||||
|
||||
This release just contains a merge of all the changes on the
|
||||
constraints_experiments branch.
|
||||
|
||||
Thanks to Havoc Pennington for reviewing the gargantuan patch and
|
||||
suggesting lots of little fixes for making it better, to Rob Adams and
|
||||
Soeren Sandmann for grilling me on how some of the difficult internals work
|
||||
-- allowing me to improve the documentation, to Olav Vitters for finding an
|
||||
easy-to-fix crasher bug in early testing and for repeatedly extending my
|
||||
deadline for switching from working on Metacity to Bugzilla, to Ray Strode
|
||||
for finding two crashers and fixing one of them in early testing, to Bryan
|
||||
Clark for usability advice, to Davyd Madeley and Christian Kellner for
|
||||
testing Xinerama stuff, to Sebastien Bacher for packaging an early version
|
||||
and finding some obscure bugs (that I unfortunately still can't duplicate
|
||||
and will probably still need to fix once I can),
|
||||
|
||||
Bugs fixed:
|
||||
unfiled - constraints.c is overly complicated[1]
|
||||
unfiled - constraints.c is not robust when all constraints cannot
|
||||
simultaneously be met (constraints need to be prioritized)
|
||||
unfiled - keep-titlebar-onscreen constraint is decoration unaware (since
|
||||
get_outermost_onscreen_positions() forgets to include
|
||||
decorations)
|
||||
unfiled - keyboard snap-moving and snap-resizing snap to hidden edges
|
||||
109553 - gravity w/ simultaneous move & resize doesn't work
|
||||
113601 - maximize vertical and horizontal should toggle and be
|
||||
constrained
|
||||
122196 - windows show up under vertical panels
|
||||
122670 - jerky/random resizing of window via keyboard[2]
|
||||
124582 - keyboard and mouse snap-resizing and snap-moving erroneously
|
||||
moves the window multidimensionally
|
||||
136307 - don't allow apps to resize themselves off the screen (*cough*
|
||||
filechooser *cough*)
|
||||
142016, 143784 - windows should not span multiple xineramas unless
|
||||
placed there by the user
|
||||
143145 - clamp new windows to screensize and force them onscreen, if
|
||||
they'll fit
|
||||
144126 - Handle pathological strut lists sanely[3]
|
||||
149867 - fixed aspect ratio windows are difficult to resize[4]
|
||||
152898 - make screen edges consistent; allow easy slamming of windows
|
||||
into the left, right, and bottom edges of the screen too.
|
||||
154706 - bouncing weirdness at screen edge with keyboard moving or
|
||||
resizing
|
||||
156699 - avoid struts when placing windows, if possible (nasty a11y
|
||||
blocker)
|
||||
302456 - dragging offscreen too restrictive
|
||||
304857 - wireframe moving off the top of the screen is misleading
|
||||
308521 - make uni-directional resizing easier with alt-middle-drag and
|
||||
prevent the occasional super annoying resize-the-wrong-side(s)
|
||||
behavior
|
||||
312007 - snap-resize moves windows with a minimum size constraint
|
||||
312104 - resizing the top of a window can cause the bottom to grow
|
||||
319351 - don't instantly snap on mouse-move-snapping, remove
|
||||
braindeadedness of having order of releasing shift and
|
||||
releasing button press matter so much
|
||||
|
||||
[1] fixed in my opinion, anyway.
|
||||
[2] Actually, it's not totally fixed--it's just annoying
|
||||
instead of almost completely unusable. Matthias had a
|
||||
suggestion that may fix the remainder of the problems (see
|
||||
http://tinyurl.com/bwzuu).
|
||||
[3] This bug was originally about not-quite-so-pathological
|
||||
cases but was left open for the worse cases. The code from
|
||||
the branch handles the remainder of the cases mentioned in
|
||||
this bug.
|
||||
[4] Actually, although it's far better there's still some minor
|
||||
issues left: a slight drift that's only noticeable after
|
||||
lots of resizing, and potential problems with partially
|
||||
onscreen constraints due to not clearing any
|
||||
fixed_directions flags (aspect ratio windows get resized in
|
||||
both directions and thus aren't fixed in one of them)
|
||||
|
||||
New feature:
|
||||
81704 - edge resistance for user move and resize operations; in
|
||||
particular 3 different kinds of resistance are implemented:
|
||||
Pixel-Distance: window movement is resisted when it aligns with an
|
||||
edge unless the movement is greater than a threshold number of
|
||||
pixels
|
||||
Timeout: window movement past an edge is prevented until a certain
|
||||
amount of time has elapsed during the operation since the first
|
||||
request to move it past that edge
|
||||
Keyboard-Buildup: when moving or resizing with the keyboard, once a
|
||||
window is aligned with a certain edge it cannot move past until the
|
||||
correct direction has been pressed enough times (e.g. 2 or 3 times)
|
||||
|
||||
Major code changes:
|
||||
- constraints.c has been rewritten; very few lines of code from the old
|
||||
version remain. There is a comment near the top of the function
|
||||
explaining the basics of how the new framework works. A more detailed
|
||||
explanation can be found in doc/how-constraints-works.txt
|
||||
- edge-resistance.[ch] are new files implementing edge-resistance.
|
||||
- boxes.[ch] are new files containing low-level error-prone functions
|
||||
used heavily in constraints.c and edge-resistance.c, among various
|
||||
places throughout the code. testboxes.c contains a thorough testsuite
|
||||
for the boxes.[ch] functions compiled into a program, testboxes.
|
||||
- meta_window_move_resize_internal() *must* be told the gravity of the
|
||||
associated operation (if it's just a move operation, the gravity will
|
||||
be ignored, but for resize and move+resize the correct value is needed)
|
||||
- the craziness of different values that
|
||||
meta_window_move_resize_internal() accepts has been documented in a
|
||||
large comment at the beginning of the function. It may be possible to
|
||||
clean this up some, but until then things will remain as they were
|
||||
before--caller beware.
|
||||
- screen and xinerama usable areas (i.e. places not covered by
|
||||
e.g. panels) are cached in the workspace now, as are the screen and
|
||||
xinerama edges. These get updated with the workarea in
|
||||
src/workspace.c:ensure_work_areas_validated()
|
||||
|
||||
Translation
|
||||
Michiel Sikkes (nl)
|
||||
|
||||
2.13.1
|
||||
==
|
||||
|
||||
Thanks to Philip O'Brien, Kjartan Maraas, and Aidan Delaney for
|
||||
improvements in this release.
|
||||
|
||||
- add handling for META_PREF_CURSOR_THEME and META_PREF_CURSOR_SIZE
|
||||
for more complete debug info (Philip) [#318976]
|
||||
- Remove possible g_source leak in #ifdef'd out code, in case anyone uses
|
||||
it in the future (Kjartan) [#320050]
|
||||
- Changed the 'minimized' field of the MetaTabEntry struct to 'hidden'
|
||||
(Aidan) [#168455]
|
||||
|
||||
Translations
|
||||
Miloslav Trmac (cs), Francisco Javier F. Serrador (es), Takeshi AIHANA (ja),
|
||||
Erdal Ronahi (ku), Theppitak Karoonboonyanan (th)
|
||||
|
||||
2.13.0
|
||||
==
|
||||
|
||||
Thanks to Bj<42>rn Lindqvist, Kjartan Maraas, S<>ren Sandmann,
|
||||
Elijah Newren, Ross Cohen, and Muktha for improvements in this release
|
||||
since 2.12.1.
|
||||
|
||||
- Mave ancestors come along with the transient when moving the window from
|
||||
one workspace to another (Bj<42>rn) [#314977]
|
||||
- Fix the workspace switcher tabpopup to display the right windows and to
|
||||
fix the pick-a-new-window-to-focus algorithm in order to not select
|
||||
windows that aren't showing (Bj<42>rn) [#170475]
|
||||
- Fix a couple memory leaks (Kjartan, S<>ren, Elijah) [#313030]
|
||||
- Make alt-esc (the "switch between windows immediately" keybinding)
|
||||
actually show minimized windows too (Ross) [#107072]
|
||||
- Make alt-esc consistent with alt-tab by leaving stacking of unselected
|
||||
windows unchanged (Ross) [#314285]
|
||||
- Clarify the meaning of the auto_raise preference (Elijah) [#312421]
|
||||
- Fix a crash that occurs when removing some virtual desktops and windows
|
||||
happen to be on those desktops (Elijah) [#318306]
|
||||
- Make the unfocussed Simple window border visible with high contrast
|
||||
inverse theme (Muktha) [#121361]
|
||||
- Fix edge snapping for multi-screen (non-xinerama) setups (Elijah)
|
||||
[#319425]
|
||||
|
||||
Translations
|
||||
Vladimir Petkov (bg), Kostas Papadimas (el), Adam Weinberger (en_CA),
|
||||
Ivar Smolin (et), Michiel Sikkes (nl), Marcel Telka (sk), Funda
|
||||
Wang (zh_CN)
|
||||
|
||||
2.12.1
|
||||
==
|
||||
|
||||
Thanks to Ray Strode, Havoc Pennington, and Elijah Newren for
|
||||
improvements in this release.
|
||||
|
||||
- Truncate ridiculously long titles to avoid crashing or letting the
|
||||
pager crash (Ray, Havoc, Elijah) [#315070]
|
||||
- Get the tabbing window outline to work with gtk+ 2.8.4 again
|
||||
(Elijah) [#317528]
|
||||
|
||||
Translations
|
||||
Mahay Alam Khan (bn), Francisco Javier F. Serrador (es), Ivar Smolin (et),
|
||||
I<>aki Larra<72>aga Murgoitio (eu), Luca Ferretti (it), Christian Rose (sv),
|
||||
Clytie Siddall (vi), Funda Wang (zh_CN)
|
||||
|
||||
2.12.0
|
||||
==
|
||||
|
||||
Thanks to Brent Smith for finding the crasher in the release candidate!
|
||||
|
||||
- Fix an uninitialized variable problem causing crashes (Brent) [#315000]
|
||||
|
||||
Translations
|
||||
Bryn Salisbury (cy), Hendrik Richter (de), Christophe Merlet (RedFox) (fr),
|
||||
Ignacio Casal Quinteiro (gl), Norayr Chilingaryan (hy), Young-Ho Cha (ko),
|
||||
<20>ygimantas Berucka (lt), Michiel Sikkes (nl), Leonid Kanter (ru), Danilo
|
||||
<1B>egan(sr), Baris Cicek (tr)
|
||||
|
||||
2.11.3
|
||||
==
|
||||
|
||||
Thanks to Bj<42>rn Lindqvist and Elijah Newren for improvements in
|
||||
this release.
|
||||
|
||||
- Check for the right versions of glib and gtk+ (Bj<42>rn) [#314116]
|
||||
- Avoid obscuring centered-on-desktop windows which are denied focus
|
||||
(Elijah) [#313234]
|
||||
|
||||
Translations
|
||||
Vladimir Petkov (bg), Jordi Mallach (ca), Kostas Papadimas (el),
|
||||
Ivar Smolin (et), Gabor Kelemen (hu), Mohammad DAMT (id), Duarte
|
||||
Loreto (pt), Mugurel Tudor (ro), Laurent Dhima (sq), Maxim
|
||||
Dziumanenko (uk)
|
||||
|
||||
2.11.2
|
||||
==
|
||||
|
||||
Thanks to Elijah Newren, Jaap Haitsma, Ray Strode, and Brent Smith for
|
||||
improvements in this release.
|
||||
|
||||
- Fix an easy to trigger crasher in 2.11.1 caused by unneeded
|
||||
debugging spew (Elijah) [#311819]
|
||||
- Make sure that Metacity dialogs have icons (Jaap) [#309876]
|
||||
- Fix an infinite restacking flicker loop in sloppy and mouse focus
|
||||
with fullscreen windows (Elijah) [#311400]
|
||||
- Change default theme from Simple to Clearlooks (Elijah)
|
||||
- Vastly improve the behavior of keyboard move/resize and edge
|
||||
snapping (Ray) [#310888]
|
||||
- Remove a duplicate string (Brent) [#309774]
|
||||
|
||||
Translations
|
||||
Yuval Tanny (he), Gnome PL Team (pl), Raphael Higino (pt_BR),
|
||||
Chao-Hsiung Liao (zh_TW)
|
||||
|
||||
2.11.1
|
||||
==
|
||||
|
||||
Thanks to Elijah Newren, Ken Harris, Matthias Clasen, Christian
|
||||
Persch, and Billy Biggs for improvements in this release.
|
||||
|
||||
- Fix a miscoloring of parts of the titlebar introduced in the last
|
||||
unstable release (Elijah) [follow-up to #169982]
|
||||
- Provide a more lenient threshold for drawing rounded corners (Ken)
|
||||
[#122065]
|
||||
- Make the Xcursor changes in the last unstable release effective
|
||||
(Matthias) [follow-up to #308106]
|
||||
- Revert the _NET_ACTIVE_WINDOW behavior change made in the 2.9.x
|
||||
unstable series; activation includes changing a window to the
|
||||
current workspace again (Elijah) [reversion of #128380]
|
||||
- Restore original window size if the window was maximized upon
|
||||
withdrawing it (Elijah, Christian) [#137185]
|
||||
- Fix a raising bug with a window that has more than one child window
|
||||
(Elijah, Billy) [part of #307875]
|
||||
- Try to place windows denied focus near the focus window and fix a
|
||||
xinerama bug with the placement (Elijah) [part of #307875]
|
||||
- Avoid modal dialogs being obscured in somewhat pathologically
|
||||
strange circumstances that Eclipse seems to be good at triggering
|
||||
(Elijah) [part of #307875]
|
||||
|
||||
Translations
|
||||
Miloslav Trmac (cs), Kostas Papadimas (el), Adam Weinberger (en_CA),
|
||||
Francisco Javier F. Serrador (es), Ilkka Tuohela (fi), Christophe
|
||||
Merlet (RedFox) (fr), Ignacio Casal Quinteiro (gl), Ankit
|
||||
Patel (gu), Yair Hershkovitz (he), Takeshi AIHANA (ja), Kjartan
|
||||
Maraas (nb), Kjartan Maraas (no), Marcel Telka (sk), Theppitak
|
||||
Karoonboonyanan (th), Clytie Siddall (vi), Funda Wang (zh_CN)
|
||||
|
||||
2.11.0
|
||||
==
|
||||
|
||||
This release contains all fixes up to Metacity 2.10.2 plus some new goodies.
|
||||
|
||||
Thanks to Matthias Clasen, Aivars Kalvans, Bj<42>rn Lindqvist, and
|
||||
Andrew Johnson for improvements in this release.
|
||||
|
||||
- React to cursor theme changes (Matthias) [#308106]
|
||||
- Plug a small leak with xinerama information (Aivars) [#307884]
|
||||
- Split up main() into more manageable chunks and make use of GOpt
|
||||
(Bj<42>rn) [#305331]
|
||||
- Speed up vertical gradients (Andrew) [#169982]
|
||||
|
||||
Translations
|
||||
Hendrik Richter (de), Ivar Smolin (et), Ignacio Casal
|
||||
Quinteiro (gl), Clytie Siddall (vi)
|
||||
|
||||
2.10.2
|
||||
==
|
||||
|
||||
Thanks to Billy Biggs, Greg Hudson, Elijah Newren, Ray Strode, Ryan
|
||||
Lortie, and Soeren Sandmann for improvements in this release.
|
||||
|
||||
- Makes metacity a bit faster when dragging windows around (Soeren) [#141813]
|
||||
- Fix simple memory error, using the address of a local variable as a
|
||||
hash key (Ryan) [#307209]
|
||||
- Fix a small leak in the case of a SYNC_COUNTER property value and
|
||||
HAVE_XSYNC not defined (Ryan) [#307214]
|
||||
- Cleanup font data when done with it (Ray) [#306720]
|
||||
- If the window has a modal transient which is being unmanaged, don't
|
||||
focus it (Elijah) [#305362]
|
||||
- Make sure window position is calculated correctly for reconfigure
|
||||
requests when part of the XWindowChanges structure is uninitialized
|
||||
(Greg) [#305257]
|
||||
- Add a resize popup when resizing constrained windows (Ray) [#305564]
|
||||
- Don't accidentally treat maximize vertically as maximize in both
|
||||
directions (Elijah) [#302204]
|
||||
- Put all transients of the new window, if any exist, in the
|
||||
calc_showing queue (Elijah, Billy) [#303284]
|
||||
|
||||
Translations
|
||||
Kostas Papadimas (el), Priit Laes (et), Pauli Virtanen (fi), Ignacio
|
||||
Casal Quinteiro (gl), Theppitak Karoonboonyanan (th), Canonical
|
||||
Ltd (xh), Woodman Tuen (zh_TW)
|
||||
|
||||
2.10.1
|
||||
==
|
||||
|
||||
This is a stable release to coincide with the release of Gnome 2.10.0.
|
||||
|
||||
Thanks to Dan Winship and Lex Hider for fixes in this release.
|
||||
|
||||
- Make sure the "Close" button has the focus in the
|
||||
buggy-session-management-applications-warning dialog instead of the
|
||||
table (Dan) [#172703]
|
||||
- add doc/code-overview.txt and doc/how-to-get-focus-right.txt to the
|
||||
distributed files (Lex) [#170519]
|
||||
|
||||
Translations
|
||||
Adam Weinberger (en_CA), Christopher Orr (en_GB), Elnaz Sarbar (fa),
|
||||
Gabor Kelemen (hu), Jyotsna Shrestha (ne), Steve Murphy (rw),
|
||||
Baris Cicek (tr), Canonical Ltd (xh)
|
||||
|
||||
2.10.0
|
||||
==
|
||||
|
||||
This is a stable release to coincide with the release of Gnome 2.10.0.
|
||||
The only difference between this version and 2.9.34 is some
|
||||
translation updates.
|
||||
|
||||
Translations
|
||||
Vladimir Petkov (bg), Gabor Kelemen (hu), <20>ygimantas Berucka (lt),
|
||||
Reinout van Schouwen (nl), Mugurel Tudor (ro), Danilo <20>egan (sr),
|
||||
Woodman Tuen (zh_TW)
|
||||
|
||||
2.9.34
|
||||
==
|
||||
|
||||
This is an unstable release to coincide with the release of Gnome
|
||||
2.10.0 release candidate 1 (2.9.92).
|
||||
|
||||
Thanks to Aidan Delaney, Elijah Newren, and Joe Marcus Clarke for
|
||||
fixes in this release.
|
||||
|
||||
- Fix crash that occurs when stupid apps claim that a window is its
|
||||
own parent (Elijah, Joe) [#168207]
|
||||
- Prevent the visual bell from changing the focus window (Elijah)
|
||||
[#123366]
|
||||
- Make sure that icons in the alt-tab popup are dimmed for all hidden
|
||||
windows, not just minimized ones (Aidan) [#168455]
|
||||
|
||||
Translations
|
||||
Elnaz Sarbar (fa), Ankit Patel (gu), Luca Ferretti (it),
|
||||
Reinout van Schouwen (nl), Gnome PL Team (pl),
|
||||
Alexandre Folle de Menezes (pt_BR)
|
||||
|
||||
2.9.21
|
||||
==
|
||||
|
||||
This is an unstable release heading towards Gnome 2.10. Since there
|
||||
have been an awful lot of fixes since Gnome 2.10 Beta 2, we are hoping
|
||||
to get an extra week of wider testing of all these changes before hard
|
||||
code freeze.
|
||||
|
||||
Thanks to Aidan Delaney, Crispin Flowerday, Elijah Newren, and Joe
|
||||
Marcus Clarke for fixes in this release.
|
||||
|
||||
- Make sure we get a valid timestamp if one doesn't come with the
|
||||
_NET_ACTIVE_WINDOW message (Elijah, Crispin) [#166728]
|
||||
- Avoid sending CurrentTime to our XSetInputFocus wrappers, but
|
||||
handle it better in case we miss any cases (Elijah) [#166732]
|
||||
- Remove useless function call (Aidan) [#166730]
|
||||
- Avoid new windows being obscured by the focus window and thus
|
||||
possibly lost (Elijah) [#166524]
|
||||
- Don't unconditionally place not-to-be-focused windows, such as
|
||||
splashscreens, below the focus window (Elijah) [#167042]
|
||||
- Raise the ancestor of a window instead of the window itself
|
||||
(Elijah) [#166894]
|
||||
- Cover half a dozen issues needed to fix a variety of rare timestamp
|
||||
bugs (Elijah) [#167358]
|
||||
- Fix a possible crash on logout (Joe) [#167935]
|
||||
- Fix an obscure xinerama placement bug with windows that are too
|
||||
large to fit in the workarea in both dimensions (Elijah) [#166757]
|
||||
- Ignore all focus and focus-stealing-prevention code in
|
||||
meta_window_show when not showing the window for the first time
|
||||
(Elijah) [#167199]
|
||||
- when receiving a _NET_ACTIVE_WINDOW message, switch to the desktop
|
||||
where the window is located before activating instead of moving the
|
||||
window to the current desktop (Elijah) [#128380]
|
||||
- Handle _NET_CURRENT_DESKTOP messages that come with timestamps
|
||||
(Elijah) [#161361]
|
||||
- Handle keynav vs. mousenav in mouse and sloppy focus modes (Elijah)
|
||||
[#167545]
|
||||
|
||||
Translations
|
||||
Jordi Mallach (ca), Martin Willemoes Hansen (da),
|
||||
Kostas Papadimas (el), David Lodge (en_GB),
|
||||
Francisco Javier F. Serrador (es), T<>ivo Leedj<64>rv (et),
|
||||
Christophe Merlet (RedFox) (fr), Takeshi AIHANA (ja),
|
||||
Young-Ho, Cha (ko), Kjartan Maraas (nb), Michiel Sikkes (nl),
|
||||
Kjartan Maraas (no), Duarte Loreto (pt), Leonid Kanter (ru),
|
||||
Marcel Telka (sk), Laurent Dhima (sq), Maxim Dziumanenko (uk)
|
||||
|
||||
2.9.13
|
||||
==
|
||||
|
||||
This is an unstable release to coincide with the release of Gnome
|
||||
2.10.0 Beta 2 (2.9.91).
|
||||
|
||||
Thanks to Elijah Newren, Balamurali Viswanathan, Stephane Loeuillet,
|
||||
Benjamin Kahn, Garrett (LeSage?), Jose Moya, Dave Ahlswede, Arvind
|
||||
Samptur, John Paul Wallington, Tim Herold, Muktha Narayan, Sinisa
|
||||
Segvic, Owen Taylor, Crispin Flowerday, "RHEL-3", KWin, and Google for
|
||||
improvements in this release.
|
||||
|
||||
- Refuse to focus a window with a modal transient, and focus the
|
||||
transient instead (Elijah) [#164716]
|
||||
- Make sure we get gconf notifications about the terminal command
|
||||
changing (Balamurali) [#160934]
|
||||
- Specify encoding of src/metacity.desktop.in (Stephane) [#151850]
|
||||
- New 48x48 default icon (Benjamin, Garrett) [#160660]
|
||||
- Add man pages for metacity-window-demo and metacity-theme-viewer
|
||||
(Jose, Dave) [#143513]
|
||||
- Fix minimized window display in workspace switcher after relogin
|
||||
with a saved session (Elijah) [#164677]
|
||||
- Ignore sticky windows for non-active workspaces (Elijah) [#165259]
|
||||
- Don't wireframe when accessibility is on, it apparently causes a
|
||||
desktop wide freeze. (Arvind) [#159538]
|
||||
- Keep tooltip on screen horizontally for xinerama (John) [#165261]
|
||||
- Stick and unstick transients with their parent automatically
|
||||
(Elijah) [#152283]
|
||||
- Shaded windows should not show up in pagers (Elijah) [#165377]
|
||||
- Treat splashscreens same as other windows for stacking (Elijah)
|
||||
[#165243]
|
||||
- Plug a pair of leaks (Elijah) [#165378]
|
||||
- Take into account the appropriate list of windows when placing a
|
||||
new one (Elijah) [#165381]
|
||||
- Correct misleading and inaccurate wording (Elijah) [#165380]
|
||||
- Handle xcomposite pkgconfig version regression (Tim) [#149368]
|
||||
- Make the warn-about-buggy-session-management-apps dialog be sticky
|
||||
(Elijah) [#164745]
|
||||
- Fix the problem with fullscreen windows on a different xinerama
|
||||
monitor not staying on top ("RHEL-3") [#156511]
|
||||
- Make the unfocussed title bar distinguishable in cases where it
|
||||
otherwise isn't for the Atlanta, Simple, and Bright themes (Muktha)
|
||||
[#125291]
|
||||
- Correct the stacking when returning from fullscreen mode (Elijah)
|
||||
[#165718]
|
||||
- Focus parents of dismissed transient windows in preference to the
|
||||
window that most recently had keyboard focus (Elijah) [#157360]
|
||||
- Make sure window->border_only is initialized so we don't get random
|
||||
windows without decorations (Elijah, Sinisa, Owen) [#145131]
|
||||
- Add period to the end of reduced_resources' description (Dave)
|
||||
[#165780]
|
||||
- If activation requests are too old, set the demands_attention hint
|
||||
instead of actually activating (Elijah, Crispin) [#166395]
|
||||
- Ignore xconfigurerequest events for stacking when it should be safe
|
||||
to do so (Elijah, Crispin, KWin, Google) [#166395]
|
||||
- Set a _METACITY_VERSION property (a utf8 string) on the WM check
|
||||
window (Elijah) [#165350]
|
||||
|
||||
Translations
|
||||
Vladimir Petkov (bg), Miloslav Trmac (cs), Frank Arnold (de),
|
||||
Adam Weinberger (en_CA), David Lodge (en_GB),
|
||||
Francisco Javier F. Serrador (es), Pauli Virtanen (fi),
|
||||
Young-Ho, Changwoo Ryu (ko), <20>ygimantas Berucka (lt),
|
||||
Kjartan Maraas (nb), Kjartan Maraas (no), Duarte Loreto (pt),
|
||||
Marcel Telka (sk), Christian Rose (sv),
|
||||
Theppitak Karoonboonyanan (th)
|
||||
|
||||
2.9.8
|
||||
==
|
||||
|
||||
This is a brown paper bag release to cover up the crash I introduced
|
||||
in version 2.9.5. Thanks to Sebastien Bacher and the bleeding edge
|
||||
Ubuntu users for quickly catching the occasional crash that my fix in
|
||||
#123576 could cause, and for verifying that the patch I made fixed
|
||||
this issue (I couldn't duplicate).
|
||||
|
||||
- Don't forget to initialize display->grab_old_window_stacking
|
||||
[#165093]
|
||||
|
||||
2.9.5
|
||||
==
|
||||
|
||||
This is an unstable release to coincide with the release of Gnome
|
||||
2.10.0 Beta 1 (2.9.90).
|
||||
|
||||
Thanks to Vincent Noel, Elijah Newren, and John Paul Wallington for
|
||||
fixes in this release.
|
||||
|
||||
- Restore original stacking when aborting an alt-esc window switch
|
||||
operation (Elijah) [#123576]
|
||||
- Fix vertical maximization for second screen (John) [#163420]
|
||||
- Show labels in bold for windows that demand attention (Vincent)
|
||||
[#164590]
|
||||
- In the tab task switcher popup, dim the window icon and put its
|
||||
name between brackets when the window is minimized (Vincent)
|
||||
[#136666]
|
||||
- Correct highlighting of windows in workspace switcher popup
|
||||
(Elijah) [#163450]
|
||||
|
||||
Translations
|
||||
zh_CN (Funda Wang), nb (Kjartan Maraas), nn (Kjartan Maraas), de
|
||||
(Frank Arnold)
|
||||
|
||||
2.9.3
|
||||
==
|
||||
|
||||
This is an unstable release to coincide with the release of Gnome 2.9.4.
|
||||
|
||||
Thanks to Leena Gunda, Thomas Fitzsimmons, and mild7 users sourceforge
|
||||
net, and Elijah Newren for fixes in this release.
|
||||
|
||||
- Don't focus the panel on click (Elijah) [#160470, and others]
|
||||
- Make sure the save session dialog appears focused (Elijah) [#162983]
|
||||
- Correctly restore size of window when double clicking the titlebar
|
||||
to unmaximize (Leena) [#161236]
|
||||
- Install schema data from builddir not srcdir (Thomas) [#161417]
|
||||
- Provide more documentation to make it easier for people to
|
||||
contribute to Metacity (Elijah) [#162646]
|
||||
- Allow users to move the window around immediately after
|
||||
double-clicking to shade (Elijah) [#90290]
|
||||
- Focus windows that manually position themselves too (Elijah) [#107347]
|
||||
- Don't show window menu if all options are invalid (Elijah) [#148915]
|
||||
- Exclude windows with skip_taskbar hint set from the alt-tab list;
|
||||
they'll appear in the ctrl-alt-tab list instead. (mild7 users
|
||||
sourceforge net) [#106249]
|
||||
- Wrap XSetInputFocus to make display->expected_focus_window more
|
||||
reliable (Elijah) [#154598]
|
||||
- Remove conflict between windows on multiple workspaces and hidden
|
||||
being a global quantity (Elijah) [#156182]
|
||||
|
||||
Translations
|
||||
es (Francisco Javier F. Serrador), sv (Christian Rose), cs (Miloslav
|
||||
Trmac), ja (Takeshi AIHANA)
|
||||
|
||||
2.9.2
|
||||
==
|
||||
|
||||
This is an unstable release to coincide with the release of Gnome 2.9.3.
|
||||
|
||||
Thanks to Alex Duggan, ash AT contact bg, Elijah Newren, and Baptiste
|
||||
Mille-Mathias for fixes in this release.
|
||||
|
||||
- Add a missing period at the end of a sentence (Baptiste) [#158210]
|
||||
- When snap-moving don't snap to hidden windows, such as transients
|
||||
of minimized windows (Elijah) [#157180]
|
||||
- Focus the desktop when showing it (Elijah) [#159257]
|
||||
- Remove deprecated capplet (Alex, ash) [#160753]
|
||||
|
||||
Translations
|
||||
da (Martin Willemoes Hansen), bg (Alexander Shopov), en_CA (Adam
|
||||
Weinberger)
|
||||
|
||||
2.9.1
|
||||
==
|
||||
|
||||
This is an unstable release heading towards Gnome 2.10, released a
|
||||
little late for Gnome 2.9.2 but there weren't many changes anyway this
|
||||
time...
|
||||
|
||||
Thanks to Benjamin Kahn, Marco Pesenti Gritti, James Henstridge, and
|
||||
Vincent Untz for fixes/features in this release.
|
||||
|
||||
- gnome-panel-screenshot was renamed to gnome-screenshot (Vincent) [#157529]
|
||||
- Update build stuff (use newer automake, etc.) (James)
|
||||
- Fix build out of src directory (Marco) [#158325]
|
||||
- Use a better default application icon (Benjamin) [#160373]
|
||||
|
||||
Translations
|
||||
da (Martin Willemoes Hansen), fr(Christophe Merlet, Baptiste
|
||||
Mille-Mathias), lt(<28>ygimantas Berucka), ja(Takeshi AIHANA)
|
||||
|
||||
2.9.0
|
||||
==
|
||||
|
||||
This is an unstable release heading towards Gnome 2.10.
|
||||
|
||||
Thanks to Rob Adams, Anders Carlsson, Elijah Newren, Soeren Sandmann,
|
||||
and Vincent Untz for fixes and features in this release.
|
||||
|
||||
- Add a keybinding to launch a terminal (Vincent) [#154232]
|
||||
- Correct the requested number of keycodes (Rob) [#155247]
|
||||
- Add tracker bugs to rationales.txt file
|
||||
- Make the "showing desktop" mode be per-workspace instead of
|
||||
per-screen. (Elijah) [#142198]
|
||||
- Don't try to use an ARGB visual at all if the depth isn't
|
||||
32-bit. This caused major slowdowns with Composite
|
||||
enabled. (Anders)
|
||||
- Fix the modifier key breakage introduced by an Xorg
|
||||
change. (Soeren) [#151554]
|
||||
- Update _NET_WM_STATE_HIDDEN so the pager on the panel will know
|
||||
whether to display windows as visible or hidden (Elijah) [#105665]
|
||||
- Fix the alt-tab order--if the most recently used window is not
|
||||
focused, start alt tabbing with that window instead of the one
|
||||
after it (Elijah) [#156251]
|
||||
- Don't lower newly mapped windows when they're denied focus if they
|
||||
are transients of the focused window. Instead, defocus the
|
||||
currently focused window (Elijah) [#151996]
|
||||
- Re-enable focus stealing prevention (Elijah)
|
||||
|
||||
Translations
|
||||
es(Francisco Javier F. Serrador), sq(Laurent Dhima), sr(Danilo <20>egan),
|
||||
cs(Miloslav Trmac), en_CA(Adam Weinberger), en_GB(David Lodge)
|
||||
|
||||
2.8.6
|
||||
==
|
||||
|
||||
This is a stable release for Gnome 2.8.1.
|
||||
|
||||
Thanks to the Ken Harris, Kjartan Maraas, and the tireless efforts of
|
||||
Elijah Newren for fixes in this release.
|
||||
|
||||
Fixes
|
||||
* Ensure the correct window is focused when minimizing (Elijah)
|
||||
* Fix keynav with mouse focus (Elijah)
|
||||
* Fix several race conditions in window focusing (Elijah)
|
||||
* Focus the top window when lowering by frame click (Ken)
|
||||
* Fix some compiler warnings (Kjartan)
|
||||
* Fix some valgrind-reported errors (Elijah)
|
||||
* Fix some potential issues with autoraising windows (Elijah)
|
||||
|
||||
Translations
|
||||
* en_CA(Adam Weinberger), it(Luca Ferretti)
|
||||
|
||||
2.8.5
|
||||
==
|
||||
|
||||
This is a stable release for Gnome 2.8. Only translations and some
|
||||
new developer documentation were added since the last unstable release.
|
||||
This release boasts improved standards-compliance and a number of
|
||||
bug fixes since the last stable release.
|
||||
|
||||
Translations
|
||||
|
||||
* ar(Abdulaziz Al-Arfaj), cs(Miloslav Trmac), cy(Dafydd Harries),
|
||||
en_GB(David Lodge), fr(Christophe Merlet (RedFox)),
|
||||
nn(<28>smund Skj<6B>veland), or(Gora Mohanty),
|
||||
pr_BR(Gustavo Noronha Silva), ro(Mugurel Tudor),
|
||||
th(Paisa Seeluangsawat), tr(Baris Cicek), zh_TW(Woodman Tuen)
|
||||
|
||||
2.8.4
|
||||
==
|
||||
|
||||
This release features a number of bug fixes, and also the disabling of
|
||||
the focus-stealing-prevention code (we're entering hard code freeze in
|
||||
Gnome so it's too late to fix the remaining issues, especially since
|
||||
it requires several patches to modules other than Metacity).
|
||||
|
||||
Thanks to Havoc Pennington, Soeren Sandmann, Elijah Newren, and Rich
|
||||
Wareham for fixes in this release
|
||||
|
||||
Fixes
|
||||
* track the last_xor_rect, for wireframe painting (Havoc)
|
||||
* Move wireframe code before grab is released to prevent endless
|
||||
loops with fullscreen windows. (Soeren)
|
||||
* Make dialogs that Metacity shows follow focus-stealing-prevention
|
||||
conventions. (Elijah; part of #149028)
|
||||
* add render extension check to the display, don't build the
|
||||
compositing manager by default, use an ARGB visual when available
|
||||
for the window frame (Rich Wareham; various tweaks added later by
|
||||
Havoc)
|
||||
* move the have_xrender variable initialization up in the file since
|
||||
it can be set as part of composite check (Havoc)
|
||||
* make argb stuff compile, add some code from xcompmgr (Havoc)
|
||||
* fix an assertion failure that would occur after increasing the
|
||||
number of workspaces; fix stacking order when a window is denied
|
||||
focus (Elijah; #150615)
|
||||
* disable some compositor code that wasn't working, don't grab the
|
||||
server during repaint, various set_background fixes and
|
||||
refactoring (Havoc)
|
||||
|
||||
Translations
|
||||
* az(Metin Amiroff), bs(Kemal Sanjta), ca(Jordi Mallach),
|
||||
el(Kostas Papadimas), es(Francisco Javier F. Serrador),
|
||||
eu(I<><49>aki Larra<72><61>aga Murgoitio), fi(Pauli Virtanen),
|
||||
nb(Kjartan Maraas), sq(Laurent Dhima), uk(Maxim Dziumanenko)
|
||||
|
||||
|
||||
2.8.3
|
||||
==
|
||||
|
||||
Some important bug fixes in this release, including somy a11y bugs,
|
||||
and a compile issue on Solaris.
|
||||
|
||||
Thanks to Rob Adams, Bill Haneman, Peter O'Shea, Mike Castle, Soeren
|
||||
Sandman, Elijah Newren, and Havoc Pennington for fixes in this
|
||||
release.
|
||||
|
||||
Fixes
|
||||
* Adjust the MRU list when preventing focus stealing (Elijah)
|
||||
* Ensure that we maintain a focus window when switching workspaces
|
||||
in mouse focus mode (Elijah)
|
||||
* Some improvements in the showing desktop mode, and window
|
||||
activation (Elijah)
|
||||
* Make sure cursors changes are handled correctly (Havoc, Soeren)
|
||||
* Some fixes to the window menu (Rob)
|
||||
* Fix a compile issue on Solaris (Peter, Mike)
|
||||
* Allow struts to go past the middle of the screen, provided there's
|
||||
a gap between them, fixing an issue with gnome magnifier (Bill)
|
||||
|
||||
Translations
|
||||
* fi (Pauli Virtanen), ja (Takeshi AIHANA), ko (Young-Ho, Cha),
|
||||
pl (Gnome PL Team), ru (Dmitry G. Mastrukov), sr (Danilo <20>Ł<EFBFBD>egan),
|
||||
tk (Gurban M. Tewekgeli), zh_CN (Funda Wang)
|
||||
|
||||
2.8.2
|
||||
===
|
||||
|
||||
Many bugfixes and better support for the freedesktop.org EWMH spec.
|
||||
|
||||
Thanks to Rob Adams, Anders Carlsson, Elijah Newren, Soeren Sandmann,
|
||||
Emil Soleyman-Zomalan, Michael Terry, and Jeff Waugh for fixes in this
|
||||
release.
|
||||
|
||||
- set titlebar_uses_system_font = false (it was ugly)
|
||||
- make naming for "move a window"/"move the window"/"move window"
|
||||
more consistent (fixes #142235)
|
||||
- Add trailing quotes to keybinding explanation text.
|
||||
- support for EWMH update counter spec & add compensation events
|
||||
when events are ignored. (fixes #143333 and #109362)
|
||||
- Fix focus bugs: remove race condition on window close/minimize
|
||||
(#131582), make focus choice consistent for each focus mode
|
||||
(#135810), choose correct focus window when "un-showing the
|
||||
desktop (#144900), make sure correct window is focused when using
|
||||
the workspace switcher (#120100).
|
||||
- Use meta_topic instead of meta_warning when failing to connect to
|
||||
a session manager; reduces metacity verbosity. (fixes #136218)
|
||||
- Make meta_window_delete take a timestamp, and be sure to pass it
|
||||
one.
|
||||
- Add support for EWMH _NET_WM_USER_TIME spec. This enables part of
|
||||
preventing focus stealing. (bug #118372) Also fix bug with
|
||||
windows not being focused on unminimizing caused by original
|
||||
patch. (also bug #118372)
|
||||
- Fix some support for EWMH hints, and fix USER_TIME support to
|
||||
include the DEMANDS_ATTENTION hint. Also includes some code for
|
||||
implementing _NET_RESTACK_WINDOW and _NET_MOVERESIZE_WINDOW, but
|
||||
this is disabled pending feature thaw.
|
||||
|
||||
2.8.1
|
||||
===
|
||||
|
||||
Thanks to Olivier Crete, Jarrod Johnson, Neil Muller, Elijah Newren,
|
||||
Mark McLoughlin, Rob Adams, and foser AT gentoo.org for fixes in this
|
||||
release.
|
||||
|
||||
- make the --enable-xinerama switch work properly
|
||||
- prevent unwanted grab op from occurring
|
||||
- don't down-size nitems from a gulong to an int
|
||||
- add a value type check for the visual/audible bell gconf settings
|
||||
- make the no sm support warning resizable
|
||||
- more translations
|
||||
|
||||
2.8.0
|
||||
===
|
||||
|
||||
No code changes in this release, but some new translations.
|
||||
|
||||
2.7.1
|
||||
===
|
||||
|
||||
Thanks to Rob Adams for fixes in this release.
|
||||
|
||||
- bug #122016 - fix a focus race
|
||||
- Change move_to_workspace_left/right/up/down keybindings to
|
||||
<Control><Alt><Shift> arrow to avoid conflicting with new
|
||||
keybindings in spacial nautilus.
|
||||
- fix dialog stacking order issues so e.g. panel properties
|
||||
dialog is above the panel
|
||||
|
||||
2.7.0
|
||||
===
|
||||
|
||||
First unstable release tarball for GNOME 2.6.
|
||||
|
||||
Thanks to Anders Carlsson, Elijah Newren, Rob Adams, James Cape,
|
||||
Thomas Fitzimmons, Calum Benson for fixes in this release.
|
||||
|
||||
2.6.2
|
||||
===
|
||||
|
||||
Thanks to Yukihiro Nakai, Rached Ben Mustapha, Gwenole Beauchesne,
|
||||
Padraig O'Briain, Laurent Vivier, Rob Adams for contributions to this
|
||||
release.
|
||||
|
||||
- fix to repaint after resize always, so on maximize
|
||||
and theme changes we get things drawn properly
|
||||
- fix a compile issue on HPUX
|
||||
- fix translations of metacity-message output
|
||||
- fix to update window icons when they change
|
||||
- put a limit on number of characters displayed in
|
||||
window titles during Alt+tab
|
||||
- fix configure check for Xrandr
|
||||
- fix 64-bit bug in property reading that broke
|
||||
things badly on 64-bit
|
||||
- don't move focus when clicking close button on a window
|
||||
- fix a crash in getting pixmap icons
|
||||
- spawn dialogs and child processes on the proper
|
||||
screen in multihead situations
|
||||
- if the focus gets set to None, set it back to
|
||||
something sane
|
||||
- load accessibility modules and set accessibility roles
|
||||
- fix hang after displaying warning dialogs
|
||||
- fix a memory corruption when sticking/unsticking windows
|
||||
that lead to a frequent crash and windows appearing
|
||||
in Alt+tab improperly
|
||||
- fix some handling of partial-width panel struts
|
||||
- more translations
|
||||
|
||||
2.6.1
|
||||
===
|
||||
|
||||
- rebuild with fixed glib-gettext.m4
|
||||
|
||||
2.6.0
|
||||
===
|
||||
|
||||
- some additional translations
|
||||
|
||||
2.5.5
|
||||
===
|
||||
|
||||
Thanks to Rob Adams, Arvind Samptur, Andreas Volz, Ray Strode, John
|
||||
Paul Wallington, Soeren Sandmann for contributions to this release.
|
||||
And as always thanks to the translators.
|
||||
|
||||
- fix aspect ratio handling
|
||||
- fix "shake loose" functionality for maximized windows
|
||||
- handle Xrandr size changes properly again
|
||||
- fix fullscreen window detection
|
||||
- fix workspace name handling
|
||||
- don't steal button press events on root window
|
||||
- nuke metacity.spec due to nonmaintenance
|
||||
- allow too-large-for-screen windows to move their titlebar offscreen
|
||||
- keep an MRU list of windows per-workspace and use it to focus
|
||||
the next window when the focused window disappears
|
||||
- fix cursor when moving
|
||||
- improve appearance of opaque resize
|
||||
- make BELOW window state work
|
||||
- fix a crash when gdk_pixmap_foreign_new() returned NULL
|
||||
|
||||
2.5.3
|
||||
===
|
||||
|
||||
Thanks to Jordi Mallach, Padraig O'Briain, Rob Adams, Julio Merino,
|
||||
Ben Jansens, Jurg Billeter, Ray Strode, marcus@freebsd.org, James
|
||||
Laska, for contributions to this release. Thanks also to
|
||||
all the tireless translators.
|
||||
|
||||
- fixups to .desktop file
|
||||
- activate window prior to grab end, avoiding
|
||||
extra focus events
|
||||
- add support for partial-width panels (fixes corner panel
|
||||
and xinerama window position constraints)
|
||||
- added keybinding to toggle window as "always on top"
|
||||
- support --disable-schemas-install option to configure
|
||||
- destroy support for legacy GNOME 1.x hints; metacity
|
||||
no longer works with GNOME 1.x
|
||||
- disable raise-on-click for mouse focus modes
|
||||
- fix bug that broke many Javascript popup menus with mozilla
|
||||
- allow "shaking loose" maximized windows, to move them
|
||||
between Xinerama heads or whatever
|
||||
- honor desktop-wide double click timeout
|
||||
- handle window placement properly for windows that
|
||||
start out maximized
|
||||
- integrate Ximian patch to go ahead and log out after 4 minutes
|
||||
even if a dialog is open
|
||||
- fix a segfault
|
||||
- fix bug where window groups weren't always kept up to date
|
||||
- fix bug where focus got confused when switching workspaces
|
||||
with mouse focus mode
|
||||
- fix 64-bit crash on s390x
|
||||
- chdir to user's homedir on startup
|
||||
- keep window in fullscreen layer when its transients are focused
|
||||
- fix keybindings bug when you had ScrollLock enabled
|
||||
- many translation updates
|
||||
|
||||
2.5.2
|
||||
===
|
||||
|
||||
Thanks to David Santiago, Julien Olivier, Anders Carlsson, Rob Adams
|
||||
for fixes in this release.
|
||||
|
||||
- improved wording/UI for some dialogs
|
||||
- while clicking a window button, if you move the mouse outside
|
||||
the button such that releasing the mouse button won't activate
|
||||
the window button, visually indicate by "popping out" the button.
|
||||
- fix some valgrind errors
|
||||
- change "show desktop mode" to convert to "everything is minimized
|
||||
mode" if you open a new window while showing desktop, rather
|
||||
than previous behavior of simply leaving show desktop mode.
|
||||
- fix a trivial memory leak
|
||||
- change "move to workspace N" so it doesn't switch workspaces,
|
||||
just moves the window.
|
||||
- translation updates
|
||||
|
||||
2.5.1
|
||||
===
|
||||
|
||||
Thanks to Rob Adams, Peter O'Shea, Dafydd Harries, Masahiro Sakai,
|
||||
Soeren Sandmann for fixes in this release.
|
||||
|
||||
- fix bug where fullscreen windows were below top panels
|
||||
- build fix for Solaris
|
||||
- support diagonal window movement with numeric keypad
|
||||
- multihead fix
|
||||
- build fix for Cygwin
|
||||
- place on xinerama containing the pointer
|
||||
- fix totally hosed window placement/movement for frameless
|
||||
windows
|
||||
- improvement to smoothness of window move/resize
|
||||
|
||||
2.5.0
|
||||
===
|
||||
|
||||
Thanks to Rob Adams, Owen Taylor, Frederic Crozat, Arvind Samptur,
|
||||
Bill Haneman, Akira Tagoh for help with fixes in this release.
|
||||
|
||||
- many new translations
|
||||
- fix an infinite loop while holding a server grab triggered by
|
||||
some recent Qt versions doing weird stuff
|
||||
- fix bug where Alt+rightclick repeatedly on titlebar resulted
|
||||
in zillions of menus
|
||||
- fix Alt+Tab to *actually* put minimized windows at the end,
|
||||
though this was always intended
|
||||
- rewrite size/positions constraint code (currently known
|
||||
to be quite buggy, e.g. xmms is hosed)
|
||||
- enforce size of at least 1x1 on windows
|
||||
- reduce latency of managing new windows still further
|
||||
by using async properties code in more places
|
||||
- don't grab keybindings on docks, so gnome-panel
|
||||
can handle them
|
||||
- suck in the panel's screenshot and run dialog global
|
||||
bindings
|
||||
- lots of improvements to window placement
|
||||
- sync max number of workspaces with pager applet
|
||||
- fix to keep focus when inside window frame in
|
||||
strict mouse focus mode
|
||||
- make it possible to start a reverse tab with
|
||||
shift+alt+tab (vs. alt+tab then shift)
|
||||
- fix a multihead issue with constraints between two
|
||||
windows on different heads
|
||||
- require GTK+ 2.2.0 and fontconfig
|
||||
- default theme is now Simple
|
||||
- add visual bell feature
|
||||
- incorporate many fixes from 2.4.34
|
||||
- other stuff
|
||||
|
||||
2.4.13
|
||||
===
|
||||
|
||||
- we were making all dialogs skip the taskbar, even non-transient
|
||||
ones, though this was supposedly fixed a while ago. Now really
|
||||
fixed.
|
||||
- change back to Alt+click by default for the window drag feature.
|
||||
- assign Alt+F12 to shade window
|
||||
- fix not deleting enough workspaces when the number
|
||||
was reduced via the pager config dialog (readams@hmc.edu)
|
||||
- don't allow windows under the top panel ever, even if they
|
||||
are tall windows (Arvind)
|
||||
- fix up the window layout for directional workspace nav,
|
||||
so you always stop at the edges and always end up
|
||||
where you expect (hp, with tweaks from readams@hmc.edu)
|
||||
- focus new windows in mouse focus mode (readams@hmc.edu)
|
||||
- support xeyes, oclock, etc. by applying shape mask
|
||||
to the window manager frame (yeah it resizes slow, deal)
|
||||
- fix vertical/horizontal maximize
|
||||
- handle crossing events resizing for more opaque resize goodness
|
||||
(Soeren)
|
||||
- add wacky _METACITY_UPDATE_COUNTER experimental extension
|
||||
to do nice opaque resizing (does nothing without a GTK patch)
|
||||
- fix a crash setting workspace names
|
||||
- fix internationalized WM_NAME reading
|
||||
|
||||
|
537
README
537
README
@@ -3,33 +3,73 @@ Meta-ness as in the state of being meta. i.e. metacity : meta as
|
||||
opacity : opaque. Also it may have something to do with the Meta key
|
||||
on UNIX keyboards.
|
||||
|
||||
The first release of Metacity is version 2.3. Metacity has no need for
|
||||
The first release of Metacity was version 2.3. Metacity has no need for
|
||||
your petty hangups about version numbers.
|
||||
|
||||
The stable releases so far are 2.4.x, 2.6.x, 2.8.[01], 2.8.1.x, 2.8.5-, 2.10.x,
|
||||
2.12.x.
|
||||
|
||||
Unstable branches are 2.3.x, 2.5.x, 2.8.2-4, 2.9.x, 2.11.x, 2.13.x
|
||||
|
||||
COMPILING METACITY
|
||||
===
|
||||
|
||||
You need GTK+ 1.3.x (to become 2.0), at least version 1.3.7. At the
|
||||
moment CVS HEAD works, but that can change. Metacity is a fairly
|
||||
trivial 6000-line C program, so once you get GTK+ built it should be
|
||||
no problem to build Metacity.
|
||||
|
||||
There are SRPMs on the ftp site (there were also binaries for a bit,
|
||||
but I am taking them down because they only worked with Rawhide, so it
|
||||
was sort of pointless). Just "rpm --rebuild metacity-whatever.src.rpm"
|
||||
after installing the GTK packages from ftp.gtk.org.
|
||||
You need GTK+ 2.2. For startup notification to work you need
|
||||
libstartup-notification at
|
||||
http://www.freedesktop.org/software/startup-notification/ or on the
|
||||
GNOME ftp site. You also need GConf 1.2 (unless building a funky
|
||||
extra-small embedded metacity with --disable-gconf, see below).
|
||||
|
||||
REPORTING BUGS AND SUBMITTING PATCHES
|
||||
===
|
||||
|
||||
Report new bugs to hp@redhat.com for now. Will switch to Bugzilla
|
||||
sometime probably.
|
||||
Report new bugs on http://bugzilla.gnome.org. Please check for
|
||||
duplicates, *especially* if you are reporting a feature request.
|
||||
|
||||
Feel free to send patches too; Metacity is really small and simple, so
|
||||
if you find a bug or want to add a feature it should be pretty easy.
|
||||
Please do *not* add "me too!" or "yes I really want this!" comments to
|
||||
feature requests in bugzilla. Please read
|
||||
http://pobox.com/~hp/features.html prior to adding any kind of flame
|
||||
about missing features or misfeatures.
|
||||
|
||||
Feel free to send patches too; Metacity is relatively small and
|
||||
simple, so if you find a bug or want to add a feature it should be
|
||||
pretty easy. Send me mail, or put the patch in bugzilla.
|
||||
|
||||
See the HACKING file for some notes on hacking Metacity.
|
||||
|
||||
SHRINKING METACITY
|
||||
===
|
||||
|
||||
Not that metacity is huge, but a substantial amount of code is in
|
||||
preferences handling, in static strings that aren't essential, and in
|
||||
the theme engine.
|
||||
|
||||
You can strip about 70K from the metacity binary by compiling with
|
||||
options such as:
|
||||
|
||||
--disable-gconf
|
||||
--disable-sm
|
||||
--disable-verbose
|
||||
--disable-startup-notification
|
||||
|
||||
However the result is no good for desktop use, all prefs have to be
|
||||
hardcoded in the binary, for example. If you wanted to make a really
|
||||
small metacity, here's some additional stuff you might consider
|
||||
implementing:
|
||||
|
||||
- add --disable-themes, which would replace theme.c and theme-parser.c
|
||||
with a hardcoded implementation of the interface in theme.h,
|
||||
should save about 80K. This should be fairly easy.
|
||||
|
||||
- add --disable-gtk, which would implement the interface in ui.h
|
||||
without using GTK. This one is easier than you think because the
|
||||
main part of the window manager doesn't use GTK directly, but is
|
||||
still fairly hard to do. You would probably have to give up some
|
||||
of the features, such as window menus, as menus are pretty complex
|
||||
to implement well. So time may be better spent adding a GTK
|
||||
configure script feature to build GTK with only a small core set of
|
||||
functionality.
|
||||
|
||||
METACITY FEATURES
|
||||
===
|
||||
|
||||
@@ -39,18 +79,62 @@ METACITY FEATURES
|
||||
- Uses GTK+ 2.0 for drawing window frames. This means colors, fonts,
|
||||
etc. come from GTK+ theme.
|
||||
|
||||
- There are 6 workspaces.
|
||||
- Does not expose the concept of "window manager" to the user. Some
|
||||
of the features in the GNOME control panel and other parts of the
|
||||
desktop happen to be implemented in metacity, such as changing your
|
||||
window border theme, or changing your window navigation shortcuts,
|
||||
but the user doesn't need to know this.
|
||||
|
||||
- Global keybindings:
|
||||
Alt-F1 to Alt-F6 switch workspaces
|
||||
Alt-1 to Alt-6 switch workspaces
|
||||
Alt-Tab forward cycle window focus
|
||||
Alt-Shift-Tab backward cycle focus
|
||||
Alt-Escape focus previous window
|
||||
Alt-Left Arrow previous workspace
|
||||
Alt-Right Arrow next workspace
|
||||
- Includes only the window manager; does not try to be a desktop
|
||||
environment. The pager, configuration, etc. are all separate and
|
||||
modular. The "libwnck" library (which I also wrote) is available
|
||||
for writing metacity extensions, pagers, and so on. (But libwnck
|
||||
isn't metacity specific, or GNOME-dependent; it requires only GTK,
|
||||
and should work with KWin, fvwm2, and other EWMH-compliant WMs.)
|
||||
|
||||
- Has a simple theme system and a couple of extra themes come with it.
|
||||
Change themes via gconf-editor or gconftool or GNOME themes control
|
||||
panel:
|
||||
gconftool-2 --type=string --set /apps/metacity/general/theme Crux
|
||||
gconftool-2 --type=string --set /apps/metacity/general/theme Gorilla
|
||||
gconftool-2 --type=string --set /apps/metacity/general/theme Atlanta
|
||||
gconftool-2 --type=string --set /apps/metacity/general/theme Bright
|
||||
|
||||
See theme-format.txt for docs on the theme format. Use
|
||||
metacity-theme-viewer to preview themes.
|
||||
|
||||
- Change number of workspaces via gconf-editor or gconftool:
|
||||
gconftool-2 --type=int --set /apps/metacity/general/num_workspaces 5
|
||||
|
||||
Can also change workspaces from GNOME 2 pager.
|
||||
|
||||
- Change focus mode:
|
||||
gconftool-2 --type=string --set /apps/metacity/general/focus_mode mouse
|
||||
gconftool-2 --type=string --set /apps/metacity/general/focus_mode sloppy
|
||||
gconftool-2 --type=string --set /apps/metacity/general/focus_mode click
|
||||
|
||||
- Global keybinding defaults include:
|
||||
|
||||
Alt-Tab forward cycle window focus
|
||||
Alt-Shift-Tab backward cycle focus
|
||||
Alt-Ctrl-Tab forward cycle focus among panels
|
||||
Alt-Ctrl-Shift-Tab backward cycle focus among panels
|
||||
Alt-Escape cycle window focus without a popup thingy
|
||||
Ctrl-Alt-Left Arrow previous workspace
|
||||
Ctrl-Alt-Right Arrow next workspace
|
||||
Ctrl-Alt-D minimize/unminimize all, to show desktop
|
||||
|
||||
Change keybindings for example:
|
||||
|
||||
unst gconftool-2 --type=string --set /apps/metacity/global_keybindings/switch_to_workspace_1 '<Alt>F1'
|
||||
|
||||
Also try the GNOME keyboard shortcuts control panel, or
|
||||
gconf-editor.
|
||||
|
||||
See metacity.schemas for all available bindings.
|
||||
|
||||
- Window keybindings:
|
||||
|
||||
Alt-space window menu
|
||||
|
||||
Mnemonics work in the menu. That is, Alt-space then underlined
|
||||
@@ -62,7 +146,11 @@ METACITY FEATURES
|
||||
Shift to snap to edges.
|
||||
|
||||
Choose Resize from menu, and nothing happens yet, but
|
||||
eventually I might implement something.
|
||||
eventually I might implement something.
|
||||
|
||||
Keybindings for things like maximize window, vertical maximize,
|
||||
etc. can be bound, but may not all exist by default. See
|
||||
metacity.schemas.
|
||||
|
||||
- Window mouse bindings:
|
||||
|
||||
@@ -77,14 +165,15 @@ METACITY FEATURES
|
||||
If you click and drag the titlebar with button 1 it moves the
|
||||
window.
|
||||
|
||||
If you click anywhere on the frame with button 2 it moves the window,
|
||||
without raising it.
|
||||
If you click anywhere on the frame with button 2 it lowers the
|
||||
window.
|
||||
|
||||
If you click anywhere on the frame with button 3 it shows the
|
||||
window menu.
|
||||
|
||||
If you hold down Alt and click inside a window, it will move the
|
||||
window (buttons 1 and 2) or show menu (button 3).
|
||||
If you hold down Super (windows key) and click inside a window, it
|
||||
will move the window (buttons 1 and 2) or show menu (button 3).
|
||||
Or you can configure a different modifier for this.
|
||||
|
||||
If you pick up a window with button 1 and then switch workspaces
|
||||
the window will come with you to the new workspace, this is
|
||||
@@ -99,230 +188,109 @@ METACITY FEATURES
|
||||
be respawned. It theoretically restores sizes/positions/workspace
|
||||
for session-aware applications.
|
||||
|
||||
- Here is an example of how you can configure the Metacity
|
||||
window border appearance in ~/.gtkrc-2.0:
|
||||
|
||||
style "metacity-style"
|
||||
{
|
||||
font_name = "Sans 16"
|
||||
MetaFrames::title_border = { 7, 7, 7, 7 }
|
||||
MetaFrames::button_width = 25
|
||||
bg[NORMAL] = { 0.0, 0.0, 0.0 }
|
||||
}
|
||||
|
||||
class "MetaFrames" style "metacity-style"
|
||||
|
||||
You get the idea. It is just your basic GTK+ rc file, the
|
||||
window borders are a widget called MetaFrames,
|
||||
look in frames.c:meta_frames_class_init() for all the style
|
||||
properties that you can configure.
|
||||
|
||||
Metacity-specific styles can also be included in any GTK+
|
||||
theme.
|
||||
|
||||
- Metacity implements much of the new window manager spec from
|
||||
freedesktop.org, and much of the ICCCM. But then there are
|
||||
parts of each that it doesn't implement, just because I haven't
|
||||
yet.
|
||||
- Metacity implements much of the EWMH window manager specification
|
||||
from freedesktop.org, as well as the older ICCCM. Please refer to
|
||||
the COMPLIANCE file for information on metacity compliance with
|
||||
these standards.
|
||||
|
||||
- Uses Pango to render text, so has cool i18n capabilities.
|
||||
Supports UTF-8 window titles and such.
|
||||
|
||||
- There are simple animations for actions such as minimization,
|
||||
to help users see what is happening. Should probably
|
||||
have a few more of these.
|
||||
have a few more of these and make them nicer.
|
||||
|
||||
- if you have the proper X setup, set the GDK_USE_XFT=1
|
||||
environment variable to get antialiased window titles.
|
||||
|
||||
- considers the panel when placing windows and maximizing
|
||||
them.
|
||||
|
||||
- handles the window manager selection from the ICCCM. Will exit if
|
||||
another WM claims it, and can claim it from another WM if you pass
|
||||
the --replace argument. So if you're running another
|
||||
ICCCM-compliant WM, you can run "metacity --replace" to replace it
|
||||
with Metacity.
|
||||
|
||||
- does basic colormap handling
|
||||
|
||||
- and much more! well, maybe not a lot more.
|
||||
|
||||
HOW TO ADD EXTERNAL FEATURES
|
||||
===
|
||||
|
||||
You can write a metacity "plugin" such as a pager, window list, icon
|
||||
box, task menu, or even things like "window matching" using the
|
||||
Extended Window Manager Hints. See http://www.freedesktop.org for the
|
||||
EWMH specification. An easy-to-use library called "libwnck" is
|
||||
available that uses the EWMH and is specifically designed for writing
|
||||
WM accessories.
|
||||
|
||||
You might be interested in existing accessories such as "Devil's Pie"
|
||||
by Ross Burton, which add features to Metacity (or other
|
||||
EWMH-compliant WMs).
|
||||
|
||||
METACITY BUGS, NON-FEATURES, AND CAVEATS
|
||||
===
|
||||
|
||||
- Metacity creates a big file in your home directory called
|
||||
~/metacity.log with a bunch of debug spew.
|
||||
|
||||
- If you want a number of workspaces which is not 6, you have to
|
||||
edit screen.c and recompile.
|
||||
|
||||
- If you want keybindings which are not the ones mentioned above
|
||||
as features, you have to edit keybindings.c and recompile.
|
||||
|
||||
- Metacity does not have any way to unminimize a window. So
|
||||
clicking the minimize button is sort of a bad idea.
|
||||
(If you had a WM-spec-compliant tasklist, it would work
|
||||
for unminimization.)
|
||||
|
||||
- Metacity uses the new window manager spec, but only random bits of
|
||||
the old GNOME spec. It correctly advertises exactly which parts of
|
||||
the GNOME spec it supports, but it does not support enough of it to
|
||||
make the GNOME task list and desk guide happy, and they do not
|
||||
support the new spec. I don't want anyone to spend time sending me
|
||||
patches to support the old GNOME spec in Metacity; instead, send
|
||||
patches to the task list and desk guide to support the new spec. As
|
||||
far as I know, Metacity does support enough of the new spec to
|
||||
allow a working tasklist and pager.
|
||||
|
||||
Upshot: task list and desk guide DO NOT WORK with Metacity.
|
||||
|
||||
- Metacity turns off its keybindings for Emacs, because I use
|
||||
Alt-space in Emacs, and getting a window menu annoys me.
|
||||
This is a broken feature. My planned fix is to use super/hyper
|
||||
instead of Alt as the main keybinding shortcut, if super/hyper
|
||||
exist, and then keyboards with a windows key can use that for
|
||||
WM functions and Alt for application shortcuts.
|
||||
We'd fall back to Alt if no other suitable modifier existed.
|
||||
|
||||
- Cycling windows with Alt-Tab is flickery, AFAIK because
|
||||
Metacity passes the entire window stack to XRestackWindows()
|
||||
every time you restack. Instead it should probably only restack
|
||||
windows that have changed their stacking with respect to one
|
||||
another. (But sometimes I don't see the flicker, so
|
||||
I'm not sure.)
|
||||
|
||||
- I haven't even read the ICCCM section about colormaps. So if you
|
||||
have an 8-bit display you are basically screwed.
|
||||
|
||||
- Metacity doesn't properly claim the window manager selection
|
||||
as described in the ICCCM. But then, most other window managers
|
||||
don't handle this correctly either.
|
||||
|
||||
- There are probably other ICCCM-compliance issues.
|
||||
|
||||
- Window placement is always cascade for now; I want to implement
|
||||
"first fit, falling back to cascade if no fit."
|
||||
(Configurable placement algorithms are stupid though, don't
|
||||
send me patches for any bogus ones. Let's just pick a good one.)
|
||||
|
||||
- Maximization and movement constraints do not take the
|
||||
GNOME panel into account. Most of the code already handles
|
||||
this (using workspace->workarea in workspace.h), but
|
||||
workspace->workarea isn't ever actually calculated.
|
||||
Metacity needs to keep this area up-to-date using the hints the
|
||||
panel sets.
|
||||
|
||||
- Should support click-to-focus as an option.
|
||||
|
||||
- Should Metacity support flipping in right-to-left locales?
|
||||
I don't know what window managers look like in a right-to-left
|
||||
locale. I assume the window titles should be right-justified;
|
||||
should the window controls also be flipped?
|
||||
|
||||
- Need keyboard shortcuts for hide/show desktop (minimize/unminimize
|
||||
all windows temporarily, basically, and focus desktop); also
|
||||
for focusing dock windows (though since current GNOME panel has
|
||||
no useful keynav, this doesn't get you far at the moment).
|
||||
|
||||
- Resize menu item doesn't do anything. It's intended to enter
|
||||
resize-with-the-keyboard mode, similar to Move menu item.
|
||||
|
||||
- I haven't set up the po subdir and translations, mostly because
|
||||
autotools seem to get all confused if you set these up but
|
||||
don't actually have any translations. So if someone translates
|
||||
something we can set it up.
|
||||
|
||||
- If you switch from sawfish to metacity without restarting X,
|
||||
the panel often ends up buried behind the Nautilus desktop window.
|
||||
|
||||
What happens is that the panel detects Sawfish has gone away, and
|
||||
turns on override redirect mode because no GNOME-aware WM is
|
||||
running (i.e. it goes into "ignore the window manager" mode). But
|
||||
the panel doesn't notice that Metacity has appeared and is
|
||||
(partially) GNOME-compliant. So Metacity doesn't see the override
|
||||
redirect panel, and leaves it behind the Nautilus desktop. I'm not
|
||||
sure whether Metacity or the panel is to blame for this.
|
||||
|
||||
(To debug - use "xwininfo" on the panel, if override redirect is
|
||||
"Yes" then Metacity won't have any awareness of a window and can't
|
||||
properly stack it above the desktop. If override redirect is "No"
|
||||
then Metacity can see the panel and handle it properly. Look at
|
||||
xstuff.c:xstuff_is_compliant_wm() in the panel to get started on
|
||||
how the panel deals with this.)
|
||||
|
||||
- If you have "put panel below other windows" turned on
|
||||
in panel Global Preferences, Miscellaneous tab, you need to change
|
||||
this to "Put panel on top of other windows." That's because
|
||||
Metacity uses semantic categories, not the legacy layer system
|
||||
in the GNOME spec. It treats things in the legacy "dock" layer
|
||||
as semantic type dock, but if you have the panel set to be
|
||||
in another layer, Metacity will think it's a normal window.
|
||||
|
||||
You can diagnose this problem because Metacity will put panels in
|
||||
the wrong place, and Alt+rightclick will let you perform operations
|
||||
like minimize/maximize, and Alt+leftclick will let you move the panel.
|
||||
If Metacity has detected that the panel is a panel, then none of
|
||||
this will be enabled.
|
||||
|
||||
I put a patch in the CVS version of the panel to fix this by
|
||||
setting the new non-legacy type hint, but a panel with that
|
||||
patch hasn't been released yet.
|
||||
See bugzilla: http://bugzilla.gnome.org/query.cgi
|
||||
|
||||
FAQ
|
||||
===
|
||||
|
||||
Q: Will you add my feature?
|
||||
|
||||
A: If it makes sense to turn on unconditionally,
|
||||
or is genuinely a harmless preference that I would not
|
||||
be embarrassed to put in a simple, uncluttered, user-friendly
|
||||
configuration dialog.
|
||||
A: If it makes sense to turn on unconditionally, or is genuinely a
|
||||
harmless preference that I would not be embarrassed to put in a
|
||||
simple, uncluttered, user-friendly configuration dialog.
|
||||
|
||||
If the only rationale for your feature is that other window
|
||||
managers have it, or that you are personally used to it, or something
|
||||
like that, then I will not be impressed. Metacity is firmly in the
|
||||
"choose good defaults" camp rather than the "offer 6 equally broken
|
||||
ways to do it, and let the user pick one" camp.
|
||||
managers have it, or that you are personally used to it, or
|
||||
something like that, then I will not be impressed. Metacity is
|
||||
firmly in the "choose good defaults" camp rather than the "offer 6
|
||||
equally broken ways to do it, and let the user pick one" camp.
|
||||
|
||||
This is part of a "no crackrock" policy, despite some exceptions
|
||||
I'm mildly embarrassed about. For example, multiple workspaces
|
||||
probably constitute crackrock, they confuse most users
|
||||
and really are not that useful if you have a decent tasklist and
|
||||
so on. But I am too used to them to turn them off.
|
||||
Or alternatively iconification/tasklist is crack, and workspaces/pager
|
||||
are good. But having both is certainly a bit wrong.
|
||||
Sloppy focus is probably crackrock too. Oh, and my Alt-1 thru Alt-6
|
||||
keybindings are definitely on crack.
|
||||
probably constitute crackrock, they confuse most users and really
|
||||
are not that useful if you have a decent tasklist and so on. But I
|
||||
am too used to them to turn them off. Or alternatively
|
||||
iconification/tasklist is crack, and workspaces/pager are good. But
|
||||
having both is certainly a bit wrong. Sloppy focus is probably
|
||||
crackrock too.
|
||||
|
||||
But don't think unlimited crack is OK just because I slipped up a
|
||||
little. No slippery slope here.
|
||||
little. No slippery slope here.
|
||||
|
||||
Don't let this discourage patches and fixes - I love those. ;-)
|
||||
Just be prepared to hear the above objections if your patch
|
||||
adds some crack-ridden configuration option.
|
||||
Just be prepared to hear the above objections if your patch adds
|
||||
some crack-ridden configuration option.
|
||||
|
||||
Q: How do I add a configuration option?
|
||||
|
||||
A: You don't, until GConf 2 is relatively easy to compile and I feel
|
||||
like adding it as a dependency.
|
||||
http://pobox.com/~hp/free-software-ui.html
|
||||
http://pobox.com/~hp/features.html
|
||||
|
||||
Q: Will Metacity be part of GNOME?
|
||||
|
||||
A: This is not the current plan, though of course I'm happy to see the
|
||||
code used by anyone who's interested. Metacity may continue to suck
|
||||
forever because I might get tired of working on it; or Metacity's
|
||||
feature set might not make sense for GNOME. Who knows.
|
||||
|
||||
For now Metacity is my toy hobby project that I work on when I feel
|
||||
like it.
|
||||
A: It is officially part of GNOME as of GNOME 2.2. Prior to that,
|
||||
it was unofficially shipped as the default GNOME WM by several
|
||||
OS vendors.
|
||||
|
||||
Q: Is Metacity a Red Hat project?
|
||||
|
||||
A: Metacity is in no way funded, endorsed, or encouraged by Red Hat,
|
||||
Inc. - I'm guessing Red Hat would not consider "insufficient number
|
||||
of window managers for Linux" an urgent problem. Just a wild guess
|
||||
though.
|
||||
A: Metacity's original creation was in no way funded, endorsed, or
|
||||
encouraged by Red Hat, Inc. - I'm guessing Red Hat would not
|
||||
consider "insufficient number of window managers for Linux" an
|
||||
urgent problem. Just a wild guess though.
|
||||
|
||||
Now that metacity is the default WM however, Red Hat supports some
|
||||
bugfixing and other work.
|
||||
|
||||
Q: Why can't I move XMMS?
|
||||
|
||||
A: Because XMMS is broken and is trying to move itself. Metacity
|
||||
does not tolerate insolent windows who believe they can
|
||||
self-manage. Use Alt-button1 to move XMMS using Metacity.
|
||||
|
||||
Q: Why does Metacity remember the workspace/position of some apps
|
||||
but not others?
|
||||
but not others across logout/login?
|
||||
|
||||
A: Metacity only stores sizes/positions for apps that are session
|
||||
managed. As far as I can determine, there is no way to attempt
|
||||
to remember workspace/position for non-session-aware apps without
|
||||
A: Metacity only stores sizes/positions for apps that are session
|
||||
managed. As far as I can determine, there is no way to attempt to
|
||||
remember workspace/position for non-session-aware apps without
|
||||
causing a lot of weird effects.
|
||||
|
||||
The reason is that you don't know which non-SM-aware apps were
|
||||
@@ -361,17 +329,144 @@ A: I could conceivably be convinced to use viewports _instead_ of
|
||||
think it makes any sense to have both; it's just confusing. They
|
||||
are functionally equivalent.
|
||||
|
||||
You may think this means that you won't have certain keybindings,
|
||||
or something like that. This is a misconception. The only
|
||||
_fundamental_ difference between viewports and workspaces is that
|
||||
with viewports, windows can "overlap" and appear partially on
|
||||
one and partially on another. All other differences that
|
||||
traditionally exist in other window managers are accidental -
|
||||
the features commonly associated with viewports can be implemented
|
||||
for workspaces, and vice versa.
|
||||
|
||||
So I don't want to have two kinds of
|
||||
workspace/desktop/viewport/whatever, but I'm willing to add
|
||||
features traditionally associated with either kind if those
|
||||
features make sense.
|
||||
|
||||
Q: Why is the panel always on top?
|
||||
|
||||
A: Because it's a better user interface, and until we made this not
|
||||
configurable a bunch of apps were not getting fixed (the app
|
||||
authors were just saying "put your panel on the bottom" instead of
|
||||
properly supporting fullscreen mode, and such).
|
||||
|
||||
rationales.txt has the bugzilla URL for some flamefesting on this,
|
||||
if you want to go back and relive the glory.
|
||||
Read these and the bugzilla stuff before asking/commenting:
|
||||
http://pobox.com/~hp/free-software-ui.html
|
||||
http://pobox.com/~hp/features.html
|
||||
|
||||
Q: Why is there no edge flipping?
|
||||
|
||||
A: This one is also in rationales.txt. Because "ouija board" UI, where
|
||||
you just move the mouse around and the computer guesses what you
|
||||
mean, has a lot of issues. This includes mouse focus, shade-hover
|
||||
mode, edge flipping, autoraise, etc. Metacity has mouse focus and
|
||||
autoraise as a compromise, but these features are all confusing for
|
||||
many users, and cause problems with accessibility, fitt's law, and
|
||||
so on.
|
||||
|
||||
Read these and the bugzilla stuff before asking/commenting:
|
||||
http://pobox.com/~hp/free-software-ui.html
|
||||
http://pobox.com/~hp/features.html
|
||||
|
||||
Q: Why does wireframe move/resize suck?
|
||||
|
||||
A: You can turn it on with the reduced_resources setting.
|
||||
|
||||
But: it has low usability, and is a pain
|
||||
to implement, and there's no reason opaque move/resize should be a
|
||||
problem on any setup that can run a modern desktop worth a darn to
|
||||
begin with.
|
||||
|
||||
Read these and the bugzilla stuff before asking/commenting:
|
||||
http://pobox.com/~hp/free-software-ui.html
|
||||
http://pobox.com/~hp/features.html
|
||||
|
||||
The reason we had to add wireframe anyway was broken
|
||||
proprietary apps that can't handle lots of resize events.
|
||||
|
||||
Q: Why no XYZ?
|
||||
|
||||
A: You are probably getting the idea by now - check rationales.txt,
|
||||
query/search bugzilla, and read http://pobox.com/~hp/features.html
|
||||
and http://pobox.com/~hp/free-software-ui.html
|
||||
|
||||
Then sit down and answer the question for yourself. Is the feature
|
||||
good? What's the rationale for it? Answer "why" not just "why not."
|
||||
Justify in terms of users as a whole, not just users like
|
||||
yourself. How else can you solve the same problem? etc. If that
|
||||
leads you to a strong opinion, then please, post the rationale for
|
||||
discussion to an appropriate bugzilla bug, or to
|
||||
usability@gnome.org.
|
||||
|
||||
Please don't just "me too!" on bugzilla bugs, please don't think
|
||||
flames will get you anywhere, and please don't repeat rationale
|
||||
that's already been offered.
|
||||
|
||||
Q: Your dumb web pages you made me read talk about solving problems in
|
||||
fundamental ways instead of adding preferences or workarounds.
|
||||
What are some examples where metacity has done this?
|
||||
|
||||
A: There are quite a few, though many opportunities remain. Sometimes
|
||||
the real fix involves application changes. The metacity approach is
|
||||
that it's OK to require apps to change, though there are also
|
||||
plenty of workarounds in metacity for battles considered too hard
|
||||
to fight.
|
||||
|
||||
Here are some examples:
|
||||
|
||||
- fullscreen mode was introduced to allow position constraints,
|
||||
panel-on-top, and other such things to apply to normal windows
|
||||
while still allowing video players etc. to "just work"
|
||||
|
||||
- "whether to include minimized windows in Alt+Tab" was solved
|
||||
by putting minimized windows at the *end* of the tab order.
|
||||
|
||||
- Whether to pop up a feedback display during Alt+Tab was solved by
|
||||
having both Alt+Tab and Alt+Esc
|
||||
|
||||
- Whether to have a "kill" feature was solved by automatically
|
||||
detecting and offering to kill stuck apps. Better, metacity
|
||||
actually does "kill -9" on the process, it doesn't just
|
||||
disconnect the process from the X server. You'll appreciate this
|
||||
if you ever did a "kill" on Netscape 4, and watched it keep
|
||||
eating 100% CPU even though the X server had booted it.
|
||||
|
||||
- The workspaces vs. viewports mess was avoided by adding
|
||||
directional navigation and such to workspaces, see discussion
|
||||
earlier in this file.
|
||||
|
||||
- Instead of configurable placement algorithms, there's just one
|
||||
that works fairly well most of the time.
|
||||
|
||||
- To avoid excess CPU use during opaque move/resize, we rate limit
|
||||
the updates to the application window's size.
|
||||
|
||||
- Instead of configurable "show size of window while resizing,"
|
||||
it's only shown for windows where it matters, such as terminals.
|
||||
(Only use-case given for all windows is for web designers
|
||||
choosing their web browser size, but there are web sites and
|
||||
desktop backgrounds that do this for you.)
|
||||
|
||||
- Using startup notification, applications open on the workspace
|
||||
where you launched them, not the active workspace when their
|
||||
window is opened.
|
||||
|
||||
- and much more.
|
||||
|
||||
Q: I think metacity sucks.
|
||||
|
||||
A: Feel free to use any WM you like. The reason metacity follows the
|
||||
ICCCM and EWMH specifications is that it makes metacity a modular,
|
||||
interchangeable part in the desktop. libwnck-based apps such as the
|
||||
GNOME window list will work just fine with any EWMH-compliant WM.
|
||||
|
||||
Q: Did you spend a lot of time on this?
|
||||
|
||||
A: Metacity is about 6000 lines of code, which took a few weekends and
|
||||
evenings to write. If it ever becomes more polished it will
|
||||
probably grow 2-3 more thousand lines of code and suck a few more
|
||||
weekends of time. If I started adding all kinds of features and
|
||||
crack-ridden configuration options, it might take more time than that.
|
||||
A: Originally the answer was no. Sadly the answer is now yes.
|
||||
|
||||
Q: How can you claim that you are anti-crack, while still
|
||||
writing a window manager?
|
||||
|
||||
A: I have no comment on that.
|
||||
|
||||
|
||||
|
12
acconfig.h
12
acconfig.h
@@ -1,12 +0,0 @@
|
||||
#undef PACKAGE
|
||||
#undef VERSION
|
||||
#undef HAVE_CATGETS
|
||||
#undef HAVE_GETTEXT
|
||||
#undef HAVE_LC_MESSAGES
|
||||
#undef HAVE_STPCPY
|
||||
#undef ENABLE_NLS
|
||||
#undef HAVE_PTHREAD_H
|
||||
#undef GETTEXT_PACKAGE
|
||||
#undef HAVE_SHAPE_EXT
|
||||
#undef HAVE_XFT
|
||||
#undef HAVE_SM
|
138
autogen.sh
138
autogen.sh
@@ -16,38 +16,60 @@ DIE=0
|
||||
echo
|
||||
echo "You must have autoconf installed to compile $PROJECT."
|
||||
echo "Download the appropriate package for your distribution,"
|
||||
echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/"
|
||||
echo "or get the source tarball at http://ftp.gnu.org/gnu/autoconf/"
|
||||
DIE=1
|
||||
}
|
||||
|
||||
(automake --version) < /dev/null > /dev/null 2>&1 || {
|
||||
echo
|
||||
echo "You must have automake installed to compile $PROJECT."
|
||||
echo "Get ftp://sourceware.cygnus.com/pub/automake/automake-1.4.tar.gz"
|
||||
echo "(or a newer version if it is available)"
|
||||
DIE=1
|
||||
}
|
||||
if automake-1.9 --version < /dev/null > /dev/null 2>&1; then
|
||||
AUTOMAKE=automake-1.9
|
||||
ACLOCAL=aclocal-1.9
|
||||
elif automake-1.8 --version < /dev/null > /dev/null 2>&1; then
|
||||
AUTOMAKE=automake-1.8
|
||||
ACLOCAL=aclocal-1.8
|
||||
elif automake-1.7 --version < /dev/null > /dev/null 2>&1; then
|
||||
AUTOMAKE=automake-1.7
|
||||
ACLOCAL=aclocal-1.7
|
||||
else
|
||||
echo
|
||||
echo "You must have automake >= 1.7 installed to compile $PROJECT."
|
||||
echo "Get http://ftp.gnu.org/gnu/automake/automake-1.9.3.tar.bz2"
|
||||
echo "(or a newer version if it is available)"
|
||||
DIE=1
|
||||
fi
|
||||
|
||||
(grep "^AM_PROG_LIBTOOL" configure.in >/dev/null) && {
|
||||
(libtool --version) < /dev/null > /dev/null 2>&1 || {
|
||||
echo
|
||||
echo "**Error**: You must have \`libtool' installed to compile $PROJECT."
|
||||
echo "Get ftp://ftp.gnu.org/pub/gnu/libtool-1.2d.tar.gz"
|
||||
echo "Get http://ftp.gnu.org/gnu/libtool/libtool-1.5.10.tar.gz"
|
||||
echo "(or a newer version if it is available)"
|
||||
DIE=1
|
||||
}
|
||||
}
|
||||
|
||||
grep "^AM_GNU_GETTEXT" configure.in >/dev/null && {
|
||||
grep "sed.*POTFILES" $srcdir/configure.in >/dev/null || \
|
||||
(gettext --version) < /dev/null > /dev/null 2>&1 || {
|
||||
echo
|
||||
echo "**Error**: You must have \`gettext' installed to compile $PROJECT."
|
||||
echo "Get ftp://alpha.gnu.org/gnu/gettext-0.10.35.tar.gz"
|
||||
echo "(or a newer version if it is available)"
|
||||
DIE=1
|
||||
}
|
||||
}
|
||||
CONFIGURE=configure.in
|
||||
if grep "^AM_[A-Z0-9_]\{1,\}_GETTEXT" "$CONFIGURE" >/dev/null; then
|
||||
if grep "sed.*POTFILES" "$CONFIGURE" >/dev/null; then
|
||||
GETTEXTIZE=""
|
||||
else
|
||||
if grep "^AM_GLIB_GNU_GETTEXT" "$CONFIGURE" >/dev/null; then
|
||||
GETTEXTIZE="glib-gettextize"
|
||||
GETTEXTIZE_URL="ftp://ftp.gtk.org/pub/gtk/v2.0/glib-2.0.0.tar.gz"
|
||||
else
|
||||
GETTEXTIZE="gettextize"
|
||||
GETTEXTIZE_URL="ftp://alpha.gnu.org/gnu/gettext-0.10.35.tar.gz"
|
||||
fi
|
||||
|
||||
$GETTEXTIZE --version < /dev/null > /dev/null 2>&1
|
||||
if test $? -ne 0; then
|
||||
echo
|
||||
echo "**Error**: You must have \`$GETTEXTIZE' installed to compile $PKG_NAME."
|
||||
echo "Get $GETTEXTIZE_URL"
|
||||
echo "(or a newer version if it is available)"
|
||||
DIE=1
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
if test "$DIE" -eq 1; then
|
||||
exit 1
|
||||
@@ -63,62 +85,48 @@ if test -z "$*"; then
|
||||
echo "to pass any to it, please specify them on the $0 command line."
|
||||
fi
|
||||
|
||||
case $CC in
|
||||
*xlc | *xlc\ * | *lcc | *lcc\ *) am_opt=--include-deps;;
|
||||
esac
|
||||
|
||||
for coin in `find . -name configure.in -print`
|
||||
topdir=`pwd`
|
||||
for coin in .
|
||||
do
|
||||
dr=`dirname $coin`
|
||||
if test -f $dr/NO-AUTO-GEN; then
|
||||
echo skipping $dr -- flagged as no auto-gen
|
||||
else
|
||||
echo processing $dr
|
||||
macrodirs=`sed -n -e 's,AM_ACLOCAL_INCLUDE(\(.*\)),\1,gp' < $coin`
|
||||
( cd $dr
|
||||
aclocalinclude="$ACLOCAL_FLAGS"
|
||||
for k in $macrodirs; do
|
||||
if test -d $k; then
|
||||
aclocalinclude="$aclocalinclude -I $k"
|
||||
##else
|
||||
## echo "**Warning**: No such directory \`$k'. Ignored."
|
||||
fi
|
||||
done
|
||||
if grep "^AM_GNU_GETTEXT" configure.in >/dev/null; then
|
||||
if grep "sed.*POTFILES" configure.in >/dev/null; then
|
||||
: do nothing -- we still have an old unmodified configure.in
|
||||
else
|
||||
echo "Creating $dr/aclocal.m4 ..."
|
||||
test -r $dr/aclocal.m4 || touch $dr/aclocal.m4
|
||||
echo "Running gettextize... Ignore non-fatal messages."
|
||||
echo "no" | gettextize --force --copy
|
||||
echo "Making $dr/aclocal.m4 writable ..."
|
||||
test -r $dr/aclocal.m4 && chmod u+w $dr/aclocal.m4
|
||||
fi
|
||||
fi
|
||||
if grep "^AM_GNOME_GETTEXT" configure.in >/dev/null; then
|
||||
cd $dr
|
||||
if grep "^AM_GLIB_GNU_GETTEXT" configure.in >/dev/null; then
|
||||
if grep "sed.*POTFILES" configure.in >/dev/null; then
|
||||
: do nothing -- we still have an old unmodified configure.in
|
||||
else
|
||||
echo "Creating $dr/aclocal.m4 ..."
|
||||
test -r $dr/aclocal.m4 || touch $dr/aclocal.m4
|
||||
echo "Running gettextize... Ignore non-fatal messages."
|
||||
echo "no" | gettextize --force --copy
|
||||
echo "Running glib-gettextize... Ignore non-fatal messages."
|
||||
echo "no" | glib-gettextize --force --copy || exit $?
|
||||
echo "Making $dr/aclocal.m4 writable ..."
|
||||
test -r $dr/aclocal.m4 && chmod u+w $dr/aclocal.m4
|
||||
fi
|
||||
if grep "^AM_PROG_LIBTOOL" configure.in >/dev/null; then
|
||||
echo "Running libtoolize..."
|
||||
libtoolize --force --copy
|
||||
fi
|
||||
echo "Running aclocal $aclocalinclude ..."
|
||||
aclocal $aclocalinclude
|
||||
if grep "^AM_CONFIG_HEADER" configure.in >/dev/null; then
|
||||
echo "Running autoheader..."
|
||||
autoheader
|
||||
fi
|
||||
echo "Running automake --gnu $am_opt ..."
|
||||
automake --add-missing --gnu $am_opt
|
||||
echo "Running autoconf ..."
|
||||
autoconf
|
||||
)
|
||||
fi
|
||||
if grep "^AC_PROG_INTLTOOL" configure.in >/dev/null; then
|
||||
echo "Running intltoolize..."
|
||||
intltoolize --force --copy --automake || exit $?
|
||||
fi
|
||||
if grep "^AM_PROG_LIBTOOL" configure.in >/dev/null; then
|
||||
echo "Running libtoolize..."
|
||||
libtoolize --force --copy || exit $?
|
||||
fi
|
||||
|
||||
echo "Running $ACLOCAL $ACLOCAL_FLAGS ..."
|
||||
$ACLOCAL $ACLOCAL_FLAGS || exit $?
|
||||
echo "Running autoconf ..."
|
||||
autoconf || exit $?
|
||||
if grep "^AC_CONFIG_HEADERS" configure.in >/dev/null; then
|
||||
echo "Running autoheader..."
|
||||
autoheader || exit $?
|
||||
fi
|
||||
echo "Running $AUTOMAKE..."
|
||||
$AUTOMAKE --add-missing --force --gnu || exit $?
|
||||
|
||||
cd $topdir
|
||||
fi
|
||||
done
|
||||
|
||||
@@ -129,7 +137,7 @@ cd "$ORIGDIR"
|
||||
if test x$NOCONFIGURE = x; then
|
||||
echo Running $srcdir/configure $conf_flags "$@" ...
|
||||
$srcdir/configure $conf_flags "$@" \
|
||||
&& echo Now type \`make\' to compile $PROJECT || exit 1
|
||||
&& echo Now type \`make\' to compile $PROJECT || exit $?
|
||||
else
|
||||
echo Skipping configure process.
|
||||
fi
|
||||
|
477
configure.in
477
configure.in
@@ -1,21 +1,45 @@
|
||||
AC_INIT(src/display.c)
|
||||
AC_PREREQ(2.50)
|
||||
|
||||
AM_CONFIG_HEADER(config.h)
|
||||
# Fibonacci sequence for micro version numbering:
|
||||
# 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987
|
||||
AC_INIT([metacity], [2.13.2],
|
||||
[http://bugzilla.gnome.org/enter_bug.cgi?product=metacity])
|
||||
|
||||
AM_INIT_AUTOMAKE(metacity, 2.3.8)
|
||||
AC_CONFIG_SRCDIR(src/display.c)
|
||||
AC_CONFIG_HEADERS(config.h)
|
||||
|
||||
AM_INIT_AUTOMAKE
|
||||
AM_MAINTAINER_MODE
|
||||
|
||||
# Honor aclocal flags
|
||||
AC_SUBST(ACLOCAL_AMFLAGS, "\${ACLOCAL_FLAGS}")
|
||||
|
||||
GETTEXT_PACKAGE=metacity
|
||||
AC_SUBST(GETTEXT_PACKAGE)
|
||||
AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE")
|
||||
|
||||
AM_MAINTAINER_MODE
|
||||
AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE",[Name of default gettext domain])
|
||||
|
||||
AC_PROG_INTLTOOL([0.21])
|
||||
AC_PROG_CC
|
||||
AC_ISC_POSIX
|
||||
AC_HEADER_STDC
|
||||
AC_ARG_PROGRAM
|
||||
AC_LIBTOOL_WIN32_DLL
|
||||
AM_PROG_LIBTOOL
|
||||
|
||||
#### Integer sizes
|
||||
|
||||
AC_CHECK_SIZEOF(char)
|
||||
AC_CHECK_SIZEOF(short)
|
||||
AC_CHECK_SIZEOF(long)
|
||||
AC_CHECK_SIZEOF(int)
|
||||
AC_CHECK_SIZEOF(void *)
|
||||
AC_CHECK_SIZEOF(long long)
|
||||
AC_CHECK_SIZEOF(__int64)
|
||||
|
||||
## byte order
|
||||
AC_C_BIGENDIAN
|
||||
|
||||
#### Warnings
|
||||
|
||||
changequote(,)dnl
|
||||
if test "x$GCC" = "xyes"; then
|
||||
case " $CFLAGS " in
|
||||
@@ -23,6 +47,46 @@ if test "x$GCC" = "xyes"; then
|
||||
*) CFLAGS="$CFLAGS -Wall" ;;
|
||||
esac
|
||||
|
||||
# case " $CFLAGS " in
|
||||
# *[\ \ ]-Wshadow[\ \ ]*) ;;
|
||||
# *) CFLAGS="$CFLAGS -Wshadow" ;;
|
||||
# esac
|
||||
|
||||
case " $CFLAGS " in
|
||||
*[\ \ ]-Wchar-subscripts[\ \ ]*) ;;
|
||||
*) CFLAGS="$CFLAGS -Wchar-subscripts" ;;
|
||||
esac
|
||||
|
||||
case " $CFLAGS " in
|
||||
*[\ \ ]-Wmissing-declarations[\ \ ]*) ;;
|
||||
*) CFLAGS="$CFLAGS -Wmissing-declarations" ;;
|
||||
esac
|
||||
|
||||
case " $CFLAGS " in
|
||||
*[\ \ ]-Wmissing-prototypes[\ \ ]*) ;;
|
||||
*) CFLAGS="$CFLAGS -Wmissing-prototypes" ;;
|
||||
esac
|
||||
|
||||
case " $CFLAGS " in
|
||||
*[\ \ ]-Wnested-externs[\ \ ]*) ;;
|
||||
*) CFLAGS="$CFLAGS -Wnested-externs" ;;
|
||||
esac
|
||||
|
||||
case " $CFLAGS " in
|
||||
*[\ \ ]-Wpointer-arith[\ \ ]*) ;;
|
||||
*) CFLAGS="$CFLAGS -Wpointer-arith" ;;
|
||||
esac
|
||||
|
||||
case " $CFLAGS " in
|
||||
*[\ \ ]-Wcast-align[\ \ ]*) ;;
|
||||
*) CFLAGS="$CFLAGS -Wcast-align" ;;
|
||||
esac
|
||||
|
||||
case " $CFLAGS " in
|
||||
*[\ \ ]-Wsign-compare[\ \ ]*) ;;
|
||||
*) CFLAGS="$CFLAGS -Wsign-compare" ;;
|
||||
esac
|
||||
|
||||
if test "x$enable_ansi" = "xyes"; then
|
||||
case " $CFLAGS " in
|
||||
*[\ \ ]-ansi[\ \ ]*) ;;
|
||||
@@ -37,32 +101,343 @@ if test "x$GCC" = "xyes"; then
|
||||
fi
|
||||
changequote([,])dnl
|
||||
|
||||
ALL_LINGUAS=""
|
||||
dnl AM_GNU_GETTEXT
|
||||
METACITY_PC_MODULES='gtk+-2.0 >= 2.2.0 pango >= 1.2.0'
|
||||
|
||||
AC_ARG_ENABLE(gconf,
|
||||
AC_HELP_STRING([--disable-gconf],
|
||||
[disable gconf usage, for embedded/size-sensitive non-GNOME builds]),,
|
||||
enable_gconf=yes)
|
||||
|
||||
if test x$enable_gconf = xyes; then
|
||||
AC_DEFINE(HAVE_GCONF,1,[Build with gconf support])
|
||||
METACITY_PC_MODULES="$METACITY_PC_MODULES gconf-2.0 >= 1.2.0"
|
||||
fi
|
||||
|
||||
AC_ARG_ENABLE(verbose-mode,
|
||||
AC_HELP_STRING([--disable-verbose],
|
||||
[disable metacity's ability to do verbose logging, for embedded/size-sensitive custom builds]),,
|
||||
enable_verbose_mode=yes)
|
||||
|
||||
if test x$enable_verbose_mode = xyes; then
|
||||
AC_DEFINE(WITH_VERBOSE_MODE,1,[Build with verbose mode support])
|
||||
fi
|
||||
|
||||
AC_ARG_ENABLE(sm,
|
||||
AC_HELP_STRING([--disable-sm],
|
||||
[disable metacity's session management support, for embedded/size-sensitive custom non-GNOME builds]),,
|
||||
enable_sm=auto)
|
||||
|
||||
AC_ARG_ENABLE(startup-notification,
|
||||
AC_HELP_STRING([--disable-startup-notification],
|
||||
[disable metacity's startup notification support, for embedded/size-sensitive custom non-GNOME builds]),,
|
||||
enable_startup_notification=auto)
|
||||
|
||||
AC_ARG_ENABLE(compositor,
|
||||
AC_HELP_STRING([--disable-compositor],
|
||||
[disable metacity's compositing manager]),,
|
||||
enable_compositor=auto)
|
||||
|
||||
AC_ARG_ENABLE(xsync,
|
||||
AC_HELP_STRING([--disable-xsync],
|
||||
[disable metacity's use of the XSync extension]),,
|
||||
enable_xsync=auto)
|
||||
|
||||
AC_ARG_ENABLE(render,
|
||||
AC_HELP_STRING([--disable-render],
|
||||
[disable metacity's use of the RENDER extension]),,
|
||||
enable_render=auto)
|
||||
|
||||
AC_ARG_ENABLE(shape,
|
||||
AC_HELP_STRING([--disable-shape],
|
||||
[disable metacity's use of the shaped window extension]),,
|
||||
enable_shape=auto)
|
||||
|
||||
## try definining HAVE_BACKTRACE
|
||||
AC_CHECK_HEADERS(execinfo.h, [AC_CHECK_FUNCS(backtrace)])
|
||||
|
||||
ALL_LINGUAS="am ar az be bg bn bs ca cs cy da de el en_CA en_GB es et eu fa fi fr ga gl gu he hi hr hu hy id is it ja ko ku lt lv mk ml mn ms nb ne nl nn no or pa pl pt pt_BR ro ru rw sl sk sq sr sr@Latn sv ta th tk tr uk vi wa xh zh_CN zh_TW"
|
||||
AM_GLIB_GNU_GETTEXT
|
||||
|
||||
## here we get the flags we'll actually use
|
||||
PKG_CHECK_MODULES(METACITY, gtk+-2.0 >= 1.3.7)
|
||||
# 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)
|
||||
PKG_CHECK_MODULES(METACITY_WINDOW_DEMO, gtk+-2.0 >= 2.6.0)
|
||||
|
||||
CFLAGS="$METACITY_CFLAGS $CFLAGS"
|
||||
if $PKG_CONFIG --atleast-version 1.2.0 pangoxft; then
|
||||
echo "pangoxft found"
|
||||
else
|
||||
AC_MSG_ERROR("Pango 1.2.0 or greater based on Xft2 is required")
|
||||
fi
|
||||
|
||||
found_sm=false
|
||||
STARTUP_NOTIFICATION_VERSION=0.7
|
||||
AC_MSG_CHECKING([Startup notification library >= $STARTUP_NOTIFICATION_VERSION])
|
||||
if $PKG_CONFIG --atleast-version $STARTUP_NOTIFICATION_VERSION libstartup-notification-1.0; then
|
||||
have_startup_notification=yes
|
||||
else
|
||||
have_startup_notification=no
|
||||
fi
|
||||
AC_MSG_RESULT($have_startup_notification)
|
||||
|
||||
if test x$enable_startup_notification = xyes; then
|
||||
have_startup_notification=yes
|
||||
echo "startup-notification support forced on"
|
||||
elif test x$enable_startup_notification = xauto; then
|
||||
true
|
||||
else
|
||||
have_startup_notification=no
|
||||
fi
|
||||
|
||||
if test x$have_startup_notification = xyes; then
|
||||
echo "Building with libstartup-notification"
|
||||
METACITY_PC_MODULES="$METACITY_PC_MODULES libstartup-notification-1.0 >= $STARTUP_NOTIFICATION_VERSION"
|
||||
AC_DEFINE(HAVE_STARTUP_NOTIFICATION, , [Building with startup notification support])
|
||||
else
|
||||
echo "Building without libstartup-notification"
|
||||
fi
|
||||
|
||||
## 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
|
||||
have_xcomposite=yes
|
||||
else
|
||||
have_xcomposite=no
|
||||
fi
|
||||
AC_MSG_RESULT($have_xcomposite)
|
||||
|
||||
if test x$enable_compositor = 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. And it doesn't work, so don't bother unless you want to hack on it..."
|
||||
have_xcomposite=no
|
||||
else
|
||||
have_xcomposite=no
|
||||
fi
|
||||
|
||||
if test x$have_xcomposite = xyes; then
|
||||
echo "Building with CompositeExt"
|
||||
METACITY_PC_MODULES="$METACITY_PC_MODULES xcomposite >= $XCOMPOSITE_VERSION xfixes xrender xdamage"
|
||||
AC_DEFINE(HAVE_COMPOSITE_EXTENSIONS, , [Building with compositing manager support])
|
||||
|
||||
## force on render also
|
||||
have_xrender=yes
|
||||
else
|
||||
echo "Building without compositing manager"
|
||||
fi
|
||||
|
||||
## if no compositor, still possibly enable render
|
||||
if test x$have_xcomposite = xno; then
|
||||
XRENDER_VERSION=0.0
|
||||
AC_MSG_CHECKING([xrender >= $XRENDER_VERSION])
|
||||
if $PKG_CONFIG --atleast-version $XRENDER_VERSION xrender; then
|
||||
have_xrender=yes
|
||||
else
|
||||
have_xrender=no
|
||||
fi
|
||||
AC_MSG_RESULT($have_xrender)
|
||||
|
||||
if test x$enable_render = xyes; then
|
||||
have_xrender=yes
|
||||
echo "Render support forced on"
|
||||
elif test x$enable_render = xauto; then
|
||||
true
|
||||
else
|
||||
have_xrender=no
|
||||
fi
|
||||
|
||||
if test x$have_xrender = xyes; then
|
||||
echo "Building with Render"
|
||||
METACITY_PC_MODULES="$METACITY_PC_MODULES xrender >= $XRENDER_VERSION"
|
||||
fi
|
||||
fi ## have_composite
|
||||
|
||||
if test x$have_xrender = xyes; then
|
||||
AC_DEFINE(HAVE_RENDER, , [Building with Render extension support])
|
||||
fi
|
||||
|
||||
AC_MSG_CHECKING([Xcursor])
|
||||
if $PKG_CONFIG xcursor; then
|
||||
have_xcursor=yes
|
||||
else
|
||||
have_xcursor=no
|
||||
fi
|
||||
AC_MSG_RESULT($have_xcursor)
|
||||
|
||||
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])
|
||||
fi
|
||||
|
||||
PKG_CHECK_MODULES(METACITY, $METACITY_PC_MODULES)
|
||||
|
||||
AC_PATH_XTRA
|
||||
|
||||
ALL_X_LIBS="$X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS"
|
||||
|
||||
# Check for Xinerama extension (Solaris impl or Xfree impl)
|
||||
metacity_save_cppflags="$CPPFLAGS"
|
||||
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
|
||||
|
||||
AC_ARG_ENABLE(xinerama,
|
||||
AC_HELP_STRING([--disable-xinerama],
|
||||
[disable metacity's use of the Xinerama extension]),
|
||||
try_xinerama=$enable_xinerama,try_xinerama=yes)
|
||||
|
||||
use_solaris_xinerama=no
|
||||
use_xfree_xinerama=no
|
||||
if test "${try_xinerama}" != no; then
|
||||
case "$host" in
|
||||
*-*-solaris*)
|
||||
# Check for solaris
|
||||
use_solaris_xinerama=yes
|
||||
AC_CHECK_LIB(Xext, XineramaGetInfo,
|
||||
use_solaris_xinerama=yes, use_solaris_xinerama=no,
|
||||
$ALL_X_LIBS)
|
||||
if test "x$use_solaris_xinerama" = "xyes"; then
|
||||
AC_CHECK_HEADER(X11/extensions/xinerama.h,
|
||||
if test -z "`echo $ALL_X_LIBS | grep "\-lXext" 2> /dev/null`"; then
|
||||
X_EXTRA_LIBS="-lXext $X_EXTRA_LIBS"
|
||||
fi
|
||||
AC_DEFINE(HAVE_SOLARIS_XINERAMA, , [Have Solaris-style Xinerama])
|
||||
AC_DEFINE(HAVE_XINERAMA, , [Have some version of Xinerama]),
|
||||
use_solaris_xinerama=no,
|
||||
[#include <X11/Xlib.h>])
|
||||
fi
|
||||
AC_MSG_CHECKING(for Xinerama support on Solaris)
|
||||
AC_MSG_RESULT($use_solaris_xinerama);
|
||||
;;
|
||||
*)
|
||||
# Check for XFree
|
||||
use_xfree_xinerama=yes
|
||||
AC_CHECK_LIB(Xinerama, XineramaQueryExtension,
|
||||
[AC_CHECK_HEADER(X11/extensions/Xinerama.h,
|
||||
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]),
|
||||
use_xfree_xinerama=no,
|
||||
[#include <X11/Xlib.h>])],
|
||||
use_xfree_xinerama=no, -lXext $ALL_X_LIBS)
|
||||
AC_MSG_CHECKING(for Xinerama support on XFree86)
|
||||
AC_MSG_RESULT($use_xfree_xinerama);
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
CPPFLAGS="$metacity_save_cppflags"
|
||||
|
||||
SHAPE_LIBS=
|
||||
found_shape=no
|
||||
AC_CHECK_LIB(Xext, XShapeQueryExtension,
|
||||
[AC_CHECK_HEADER(X11/extensions/shape.h,
|
||||
SHAPE_LIBS=-lXext found_shape=yes)],
|
||||
, $ALL_X_LIBS)
|
||||
|
||||
if test x$enable_shape = xno; then
|
||||
found_shape=no
|
||||
fi
|
||||
|
||||
if test x$enable_shape = xyes; then
|
||||
if test "$found_shape" = "no"; then
|
||||
AC_MSG_ERROR([--enable-shape forced and Shape not found])
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
if test "x$found_shape" = "xyes"; then
|
||||
AC_DEFINE(HAVE_SHAPE, , [Have the shape extension library])
|
||||
fi
|
||||
|
||||
found_xkb=no
|
||||
AC_CHECK_LIB(X11, XkbQueryExtension,
|
||||
[AC_CHECK_HEADER(X11/XKBlib.h,
|
||||
found_xkb=yes)],
|
||||
, $ALL_X_LIBS)
|
||||
|
||||
if test "x$found_xkb" = "xyes"; then
|
||||
AC_DEFINE(HAVE_XKB, , [Have keyboard extension library])
|
||||
fi
|
||||
|
||||
|
||||
RANDR_LIBS=
|
||||
found_randr=no
|
||||
AC_CHECK_LIB(Xrandr, XRRUpdateConfiguration,
|
||||
[AC_CHECK_HEADER(X11/extensions/Xrandr.h,
|
||||
RANDR_LIBS=-lXrandr found_randr=yes,,
|
||||
[#include <X11/Xlib.h>])],
|
||||
, -lXrender -lXext $ALL_X_LIBS)
|
||||
|
||||
if test "x$found_randr" = "xyes"; then
|
||||
AC_DEFINE(HAVE_RANDR, , [Have the Xrandr extension library])
|
||||
fi
|
||||
|
||||
XSYNC_LIBS=
|
||||
found_xsync=no
|
||||
AC_CHECK_LIB(Xext, XSyncQueryExtension,
|
||||
[AC_CHECK_HEADER(X11/extensions/sync.h,
|
||||
found_xsync=yes,,
|
||||
[#include <X11/Xlib.h>])],
|
||||
, $ALL_X_LIBS)
|
||||
|
||||
if test x$enable_xsync = xno; then
|
||||
found_xsync=no
|
||||
fi
|
||||
|
||||
if test x$enable_xsync = xyes; then
|
||||
if test "$found_xsync" = "no"; then
|
||||
AC_MSG_ERROR([--enable-xsync forced and XSync not found])
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
if test "x$found_xsync" = "xyes"; then
|
||||
XSYNC_LIBS=-lXext
|
||||
AC_DEFINE(HAVE_XSYNC, , [Have the Xsync extension library])
|
||||
fi
|
||||
|
||||
METACITY_LIBS="$XSYNC_LIBS $RANDR_LIBS $SHAPE_LIBS $X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS $METACITY_LIBS"
|
||||
METACITY_MESSAGE_LIBS="$X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS $METACITY_MESSAGE_LIBS"
|
||||
METACITY_WINDOW_DEMO_LIBS="$X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS $METACITY_WINDOW_DEMO_LIBS"
|
||||
METACITY_PROPS_LIBS="$X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS $METACITY_PROPS_LIBS"
|
||||
|
||||
found_sm=no
|
||||
case "$METACITY_LIBS" in
|
||||
*-lSM*)
|
||||
found_sm=true
|
||||
found_sm=yes
|
||||
;;
|
||||
*)
|
||||
AC_CHECK_LIB(SM, SmcSaveYourselfDone,
|
||||
AC_CHECK_HEADERS(X11/SM/SMlib.h,
|
||||
METACITY_LIBS="-lSM -lICE $METACITY_LIBS" found_sm=true),
|
||||
[AC_CHECK_HEADERS(X11/SM/SMlib.h,
|
||||
METACITY_LIBS="-lSM -lICE $METACITY_LIBS" found_sm=no)],
|
||||
, $METACITY_LIBS)
|
||||
;;
|
||||
esac
|
||||
|
||||
if test "$found_sm" = "true"; then
|
||||
AC_DEFINE(HAVE_SM)
|
||||
if test x$enable_sm = xno; then
|
||||
found_sm=no
|
||||
fi
|
||||
|
||||
AM_CONDITIONAL(HAVE_SM, test "$found_sm" = "true")
|
||||
if test x$enable_sm = xyes; then
|
||||
if test "$found_sm" = "no"; then
|
||||
AC_MSG_ERROR([--enable-sm forced and -lSM not found])
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
if test "$found_sm" = "yes"; then
|
||||
AC_DEFINE(HAVE_SM, , [Building with SM support])
|
||||
fi
|
||||
|
||||
AM_CONDITIONAL(HAVE_SM, test "$found_sm" = "yes")
|
||||
|
||||
HOST_ALIAS=$host_alias
|
||||
AC_SUBST(HOST_ALIAS)
|
||||
@@ -75,8 +450,72 @@ fi
|
||||
|
||||
AC_SUBST(GDK_PIXBUF_CSOURCE)
|
||||
|
||||
AC_OUTPUT([
|
||||
## 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
|
||||
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])
|
||||
fi
|
||||
|
||||
AM_GCONF_SOURCE_2
|
||||
fi
|
||||
|
||||
AC_CONFIG_FILES([
|
||||
Makefile
|
||||
doc/Makefile
|
||||
doc/man/Makefile
|
||||
src/Makefile
|
||||
src/wm-tester/Makefile
|
||||
src/libmetacity-private.pc
|
||||
src/tools/Makefile
|
||||
src/themes/Makefile
|
||||
po/Makefile.in
|
||||
])
|
||||
|
||||
AC_OUTPUT
|
||||
|
||||
if test x$enable_gconf = xno; then
|
||||
echo "*** WARNING WARNING WARNING WARNING WARNING"
|
||||
echo "*** Building without GConf"
|
||||
echo "*** This means there's no way to change prefs except"
|
||||
echo "*** hacking source code, at least for now."
|
||||
echo "*** Also, some prefs may have broken defaults."
|
||||
echo "*** Patches needed for a simple no-gconf config file."
|
||||
echo "*** This is intended for embedded systems etc., not for normal use."
|
||||
fi
|
||||
|
||||
if test x$enable_verbose_mode = xno; then
|
||||
echo "*** WARNING WARNING WARNING WARNING WARNING"
|
||||
echo "*** Building without verbose mode"
|
||||
echo "*** This means there's no way to debug metacity problems."
|
||||
echo "*** Please build normal desktop versions of metacity"
|
||||
echo "*** with verbose mode enabled so users can use it when they report bugs."
|
||||
fi
|
||||
|
||||
dnl ==========================================================================
|
||||
echo "
|
||||
metacity-$VERSION:
|
||||
|
||||
prefix: ${prefix}
|
||||
source code location: ${srcdir}
|
||||
compiler: ${CC}
|
||||
|
||||
GConf: ${enable_gconf}
|
||||
XFree86 Xinerama: ${use_xfree_xinerama}
|
||||
Solaris Xinerama: ${use_solaris_xinerama}
|
||||
Startup notification: ${have_startup_notification}
|
||||
Compositing manager: ${have_xcomposite}
|
||||
Session management: ${found_sm}
|
||||
Shape extension: ${found_shape}
|
||||
Resize-and-rotate: ${found_randr}
|
||||
Xsync: ${found_xsync}
|
||||
Render: ${have_xrender}
|
||||
Xcursor: ${have_xcursor}
|
||||
"
|
||||
echo "This is the UNSTABLE branch of metacity"
|
||||
echo "Use 2.12.x for stable (gnome-2-12 branch in CVS)"
|
||||
|
2
doc/.cvsignore
Normal file
2
doc/.cvsignore
Normal file
@@ -0,0 +1,2 @@
|
||||
Makefile
|
||||
Makefile.in
|
4
doc/Makefile.am
Normal file
4
doc/Makefile.am
Normal file
@@ -0,0 +1,4 @@
|
||||
SUBDIRS = man
|
||||
|
||||
EXTRA_DIST=theme-format.txt metacity-theme.dtd dialogs.txt code-overview.txt \
|
||||
how-to-get-focus-right.txt
|
185
doc/code-overview.txt
Normal file
185
doc/code-overview.txt
Normal file
@@ -0,0 +1,185 @@
|
||||
This is not meant to be comprehensive by any means. Rather it is
|
||||
meant as just a brief overview of some of the bigger structures and
|
||||
files, with guides for a variety of task categories providing places
|
||||
to start looking in the code and things to look for.
|
||||
|
||||
Overview
|
||||
Jobs of various files
|
||||
Major data structures and their relationships
|
||||
Getting started -- where to look
|
||||
|
||||
|
||||
Jobs of various files
|
||||
src/window.c is where all the guts of the window manager live. This is
|
||||
basically the only remotely scary file.
|
||||
|
||||
src/frames.c is the GtkWidget that handles drawing window frames.
|
||||
|
||||
src/core.h defines the interface used by the GTK portion of the window
|
||||
manager to talk to the other portions. There's some cruft in here that's
|
||||
unused, since nearly all window operations have moved out of this file so
|
||||
frameless apps can have window operations.
|
||||
|
||||
src/ui.h defines the interface the plain Xlib portion of the window
|
||||
manager uses to talk to the GTK portion.
|
||||
|
||||
src/theme.c and src/theme-parser.c have the theme system; this is
|
||||
well-modularized from the rest of the code, since the theme viewer app
|
||||
links to these files in addition to the WM itself.
|
||||
|
||||
Major data structures and their relationships
|
||||
Major structs have a "Meta" prefix, thus MetaDisplay, MetaScreen,
|
||||
MetaWindow, etc. This serves as a way of namespacing in C. It also has
|
||||
the side effect of avoiding conflicts with common names that X already
|
||||
uses such as Display, Screen, Window, etc. Note that when I refer to a
|
||||
display below, I'm meaning a MetaDisplay and not a Display.
|
||||
|
||||
Don't confuse displays and screens. While Metacity can run with multiple
|
||||
displays, it is kind of useless since you might as well just run two
|
||||
copies of Metacity. However, having multiple screens per display is
|
||||
useful and increasingly common (known as "multiscreen" and "xinerama"
|
||||
setups, where users make use of more than one monitor). You should
|
||||
basically think of a display as a combination of one or more monitors
|
||||
with a single keyboard (...and usually only one mouse).
|
||||
|
||||
There is also a significant difference between multiscreen and xinerama
|
||||
as well. Basically, each MetaScreen is a root window (root node in the
|
||||
tree of windows). With Xinerama, a single root window appears to span
|
||||
multiple monitors, whereas with multiscreen a root window is confined to
|
||||
a single monitor. To re-emphasize the distinction between a display and
|
||||
a screen, the pointer and keyboard are shared between all root windows
|
||||
for a given display.
|
||||
|
||||
The display keeps track of a lot of various global quantities, but in
|
||||
particular has a compositor and a list (GList) of screens.
|
||||
|
||||
A compositor is an opaque structure (only defined in compositor.c),
|
||||
meaning that you'll only reference the API for it. It handles (or will
|
||||
handle) cool stuff with the new X extensions, such as smooth resizing and
|
||||
alpha transparency.
|
||||
|
||||
A screen keeps track of a number of quantities as well, in particular a
|
||||
stack and a list of workspaces.
|
||||
|
||||
A stack is basically a list of windows, and the depth order they have
|
||||
relative to each other (which thus determines which windows are on top
|
||||
and which are obscured).
|
||||
|
||||
A workspace mostly contains a list of windows for the workspace, but also
|
||||
has a few other quantities as well (a list of struts which are areas
|
||||
where windows should not be placed and an mru_list or "most recently used
|
||||
window list").
|
||||
|
||||
A window has a huge list of quantities for keeping track of things about
|
||||
a window on the screen. (We want to avoid making this list larger
|
||||
because the memory for all these quantities is per window.) One item in
|
||||
particular that a window has, though, is a frame.
|
||||
|
||||
A frame is the decorations that surround the window (i.e. the titlebar and
|
||||
the minimize and close buttons and the part that you can use to resize),
|
||||
and contains a handful of variables related to that, but no other major
|
||||
structures.
|
||||
|
||||
Getting started -- where to look
|
||||
Getting started on developing free software projects can often be like
|
||||
being dropped off in a town that is unknown to you and being told to make
|
||||
a map, when various road and building signs are missing or fading. To
|
||||
try to alleviate that initial difficulty in orientation, below I list a
|
||||
variety of general task categories with file, function, variable, and x
|
||||
property names that may be useful to fixing bugs or writing features that
|
||||
fall within that category.
|
||||
|
||||
First, though, it's useful to note that most event and message passing
|
||||
goes through display.c:event_callback(), so that's often a good place to
|
||||
start reading for general familiarity with the code (actually, I'd
|
||||
suggest skipping down to the first switch statement within that
|
||||
function). Of course, not all events go through that function, as there
|
||||
are a few other places that handle events too such as frames.c.
|
||||
|
||||
Anyway, without further ado, here are the categories and (hopefully)
|
||||
useful things to look at for each:
|
||||
|
||||
Focus issues (i.e. issues with which window is active):
|
||||
doc/how-to-get-focus-right.txt
|
||||
meta_workspace_focus_default_window
|
||||
_NET_ACTIVE_WINDOW
|
||||
_NET_WM_USER_TIME
|
||||
meta_window_focus
|
||||
meta_display_(set_input|focus_the_no)_focus_window
|
||||
XSetInputFocus (only for purposes of understanding how X focus/input works)
|
||||
CurrentTime (mostly, you should just think "Bad; don't use it")
|
||||
|
||||
Compositor stuff (X extension for eye candy like transparency):
|
||||
compositor.c
|
||||
The luminocity module in CVS
|
||||
|
||||
Window depth (i.e. stacking or lowering/raising) issues:
|
||||
stack.c
|
||||
_NET_CLIENT_LIST_STACKING
|
||||
transient_for
|
||||
WM_TRANSIENT_FOR
|
||||
meta_window_(raise|lower)
|
||||
_NET_WM_WINDOW_TYPE
|
||||
_NET_WM_MOUSE_ACTION/_NET_WM_TAKE_ACTIVITY? (aren't yet in EWMH)
|
||||
|
||||
Window placement issues:
|
||||
place.c
|
||||
constraints.c
|
||||
_NET_WM_STRUT
|
||||
WM_SIZE_HINTS
|
||||
|
||||
Moving and resizing issues:
|
||||
constraints.c
|
||||
update_move
|
||||
update_resize
|
||||
meta_window_handle_mouse_grab_op_event
|
||||
_NET_MOVERESIZE_WINDOW
|
||||
_NET_WM_STRUT
|
||||
|
||||
Drag and drop issues:
|
||||
the XDND protocol (see http://www.newplanetsoftware.com/xdnd/ and
|
||||
http://freedesktop.org/Standards/XDND)
|
||||
_NET_WM_MOUSE_ACTION/_NET_WM_TAKE_ACTIVITY (aren't yet in EWMH)
|
||||
A general pointer: what causes the difficulty here is that when the
|
||||
application receives a mouse click to start a drag, it does a grab
|
||||
so that the window manager doesn't get any further events; thus
|
||||
correcting things require standards so that applications and window
|
||||
managers can collaborate correctly
|
||||
|
||||
Theme issues: ???
|
||||
doc/theme-format.txt
|
||||
theme.c
|
||||
theme-parser.c
|
||||
(ui.c, core.c, frames.c, frame.c? I dunno...)
|
||||
|
||||
Session management issues: ???
|
||||
session.c
|
||||
http://www.x.org/X11R6.8.1/doc/SM/xsmp.pdf ?
|
||||
http://www.x.org/X11R6.8.1/doc/SM/SMlib.pdf ?
|
||||
meta_window_apply_session_info
|
||||
|
||||
Tasklist and Workspace switcher issues:
|
||||
window-props.c
|
||||
various functions in screen.c (especially ones using XChangeProperty)
|
||||
xprops.c
|
||||
The libwnck module in cvs
|
||||
meta_window_client_message
|
||||
Lots of the EWMH
|
||||
|
||||
Window and workspace selection/changing issues:
|
||||
tabpopup.c
|
||||
keybindings.c, functions: *_workspace*, *_tab_*
|
||||
meta_screen_ensure_*_popup
|
||||
display.c, functions: *_tab*
|
||||
|
||||
Key and mouse binding actions:
|
||||
keybindings.c
|
||||
meta_frames_button_(press|release)_event
|
||||
display.c: event_callback, but only the (Key|Button)_(Press|Release) cases
|
||||
|
||||
Xinerama and multiscreen: ???
|
||||
In general, just search for Xinerama, but in particular see
|
||||
screen.c
|
||||
window.c
|
||||
place.c
|
||||
constraints.c
|
32
doc/dialogs.txt
Normal file
32
doc/dialogs.txt
Normal file
@@ -0,0 +1,32 @@
|
||||
Dialogs which have no transient parent or root window being
|
||||
their tranisent parent are the ones which will be visible in
|
||||
the tasklist.
|
||||
|
||||
All such dialogs will be *always* on top of the window
|
||||
group i.e they would transients for the whole group.
|
||||
|
||||
|
||||
1) Modal dialogs
|
||||
|
||||
|
||||
* If you wish to open another window from a modal dialog
|
||||
|
||||
open *only* a modal dialog and set it's transient parent.
|
||||
|
||||
|
||||
2) Normal dialog
|
||||
|
||||
|
||||
without transient parent
|
||||
|
||||
* If you wish to open another window from a normal dialog
|
||||
|
||||
open either a normal dialog or a modal dialog only.
|
||||
Set the transient parent for the child dialog if you do not
|
||||
want them to be transient for all the other windows in the group.
|
||||
|
||||
with transient parent
|
||||
|
||||
* If you wish to open another window from a normal dialog
|
||||
|
||||
you could open any type of window.
|
283
doc/how-constraints-works.txt
Normal file
283
doc/how-constraints-works.txt
Normal file
@@ -0,0 +1,283 @@
|
||||
File contents:
|
||||
Basic Ideas
|
||||
Important points to remember
|
||||
Explanation of fields in the ConstraintInfo struct
|
||||
Gory details of resize_gravity vs. fixed_directions
|
||||
|
||||
IMPORTANT NOTE: There's a big comment at the top of constraints.c
|
||||
explaining how to add extra constraints or tweak others. Read it. I put
|
||||
that information there because it may be enough information by itself for
|
||||
people to hack on constraints.c. I won't duplicate that information in
|
||||
this file; this file is for deeper details.
|
||||
|
||||
|
||||
---------------------------------------------------------------------------
|
||||
Basic Ideas
|
||||
---------------------------------------------------------------------------
|
||||
There are a couple basic ideas behind how this constraints.c code works and
|
||||
why it works that way:
|
||||
|
||||
1) Split the low-level error-prone operations into a special file
|
||||
2) Add robustness by prioritizing constraints
|
||||
3) Make use of a minimal spanning set of rectangles for the
|
||||
"onscreen region" (screen minus struts).
|
||||
4) Constraints can be user-action vs app-action oriented
|
||||
5) Avoid over-complification ;-)
|
||||
|
||||
Some more details explaining these basic ideas:
|
||||
|
||||
1) Split tedious operations out
|
||||
|
||||
boxes.[ch] have been added which contain many common, tedious, and
|
||||
error-prone operations. I find that this separation helps a lot for
|
||||
managing the complexity and ensuring that things work correctly.
|
||||
Also, note that testboxes.c thoroughly tests all functionality in
|
||||
boxes.[ch] and a testboxes program is automatically compiled.
|
||||
|
||||
Note that functions have also been added to this file to handle some
|
||||
of the tedium necessary for edge resistance as well.
|
||||
|
||||
2) Prioritize constraints
|
||||
|
||||
In the old code, if each and every constraint could not be
|
||||
simultaneously satisfied, then it would result in some
|
||||
difficult-to-predict set of constraints being violated. This was
|
||||
because constraints were applied in order, with the possibility for
|
||||
each making changes that violated previous constraints, with no
|
||||
checking done at the end.
|
||||
|
||||
Now, all constraints have an associated priority, defined in the
|
||||
ConstraintPriority enum near the top of constraints.c. The
|
||||
constraints are all applied, and then are all checked; if not all are
|
||||
satisfied then the least important constraints are dropped and the
|
||||
process is repeated. This ensures that the most important constraints
|
||||
are satisfied.
|
||||
|
||||
A special note to make here is that if any one given constraint is
|
||||
impossible to satisfy even individually (e.g. if minimum size hints
|
||||
specify a larger window than the screen size, making the
|
||||
fully-onscreen constraint impossible to satisfy) then we treat the
|
||||
constraint as being satisfied. This sounds counter-intuitive, but the
|
||||
idea is that we want to satisfy as many constraints as possible and if
|
||||
we treat it as a violation then all constraints with a lesser priority
|
||||
also get dropped along with the impossible to satisfy one.
|
||||
|
||||
3) Using maximal/spanning rectangles
|
||||
|
||||
The constraints rely heavily on something I call spanning rectangles
|
||||
(which Soeren referred to as maximal rectangles, a name which I think
|
||||
I like better but I don't want to go change all the code now). These
|
||||
spanning rectangles have the property that a window will fit on the
|
||||
screen if and only if it fits within at least one of the rectangles.
|
||||
Soeren had an alternative way of describing these rectangles, namely
|
||||
that they were rectangles with the property that if you made any of
|
||||
them larger in any direction, they would overlap with struts or be
|
||||
offscreen (with the implicit assumption that there are enough of these
|
||||
rectangles that combined they cover all relevant parts of the screen).
|
||||
Note that, by necessity, these spanning/maximal rectangles will often
|
||||
overlap each other.
|
||||
|
||||
Such a list makes it relatively easy to define operations like
|
||||
window-is-onscreen or clamp-window-to-region or
|
||||
shove-window-into-region. Since we have a on-single-xinerama
|
||||
constraint in addition to the onscreen constraint(s), we cache
|
||||
number_xineramas + 1 of these lists in the workspace. These lists
|
||||
then only need to be updated whenever the workarea is (e.g. when strut
|
||||
list change or screen or xinerama size changes).
|
||||
|
||||
4) Constraints can be user-action vs app-action oriented
|
||||
|
||||
Such differentiation requires special care for the constraints to be
|
||||
consistent; e.g. if the user does something and one constraint
|
||||
applies, then the app does something you have to be careful that the
|
||||
constraint on the app action doesn't result in some jarring motion.
|
||||
|
||||
In particular, the constraints currently allow offscreen movement or
|
||||
resizing for user actions only. The way consistency is handled is
|
||||
that at the end of the constraints, update_onscreen_requirements()
|
||||
checks to see if the window is offscreen or split across xineramas and
|
||||
updates window->require_fully_onscreen and
|
||||
window->require_on_single_xinerama appropriately.
|
||||
|
||||
5) Avoid over-complification
|
||||
|
||||
The previous code tried to reform the constraints into terms of a
|
||||
single variable. This made the code rather difficult to
|
||||
understand. ("This is a rather complicated fix for an obscure bug
|
||||
that happened when resizing a window and encountering a constraint
|
||||
such as the top edge of the screen.") It also failed, even on the
|
||||
very example for which it used as justification for the complexity
|
||||
(bug 312104 -- when keyboard resizing the top of the window,
|
||||
Metacity extends the bottom once the titlebar hits the top panel),
|
||||
though the reason why it failed is somewhat mysterious as it should
|
||||
have worked. Further, it didn't really reform the constraints in
|
||||
terms of a single variable -- there was both an x_move_delta and an
|
||||
x_resize_delta, and the existence of both caused bug 109553
|
||||
(gravity with simultaneous move and resize doesn't work)
|
||||
|
||||
|
||||
---------------------------------------------------------------------------
|
||||
Important points to remember
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
- Inner vs Outer window
|
||||
|
||||
Note that because of how configure requests work and
|
||||
meta_window_move_resize_internal() and friends are set up, that the
|
||||
rectangles passed to meta_window_constrain() are with respect to inner
|
||||
window positions instead of outer window positions (meaning that window
|
||||
manager decorations are not included in the position/size). For the
|
||||
constraints that need to be enforced with respect to outer window
|
||||
positions, you'll need to make use of the extend_by_frame() and
|
||||
unextend_by_frame() functions.
|
||||
|
||||
- meta_window_move_resize_internal() accepts a really hairy set of
|
||||
inputs. See the huge comment at the beginning of that function.
|
||||
constraints gets screwed up if that function can't sanitize the input,
|
||||
so be very careful about that. It used to be pretty busted.
|
||||
|
||||
|
||||
---------------------------------------------------------------------------
|
||||
Explanation of fields in the ConstraintInfo strut
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
As of the time of this writing, ConstraintInfo had the following fields:
|
||||
orig
|
||||
current
|
||||
fgeom
|
||||
action_type
|
||||
is_user_action
|
||||
resize_gravity
|
||||
fixed_directions
|
||||
work_area_xinerama
|
||||
entire_xinerama
|
||||
usable_screen_region
|
||||
usable_xinerama_region
|
||||
|
||||
A brief description of each and/or pointers to more information are found
|
||||
below:
|
||||
orig
|
||||
The previous position and size of the window, ignoring any window
|
||||
decorations
|
||||
current
|
||||
The requested position and size of the window, ignoring any window
|
||||
decorations. This rectangle gets modified by the various constraints
|
||||
to specify the allowed position closest to the requested position.
|
||||
fgeom
|
||||
The geometry of the window frame (i.e. "decorations"), if it exists.
|
||||
Otherwise, it's a dummy 0-size frame for convenience (i.e. this pointer
|
||||
is guaranteed to be non-NULL so you don't have to do the stupid check).
|
||||
action_type
|
||||
Whether the action being constrained is a move, resize, or a combined
|
||||
move and resize. Some constraints can run faster with this information
|
||||
(e.g. constraining size increment hints or min size hints don't need to
|
||||
do anything for pure move operations). This may also be used for
|
||||
providing slightly different behavior (e.g. clip-to-region instead of
|
||||
shove-into-region for resize vs. moving operations), but doesn't
|
||||
currently have a lot of use for this.
|
||||
is_user_action
|
||||
Used to determine whether the action being constrained is a user
|
||||
action. If so, certain parts of the constraint may be relaxed. Note
|
||||
that this requires care to get right; see item 4 of the basic ideas
|
||||
section for more details.
|
||||
resize_gravity
|
||||
The gravity used in the resize operation, used in order to make sure
|
||||
windows are resized correctly if constraints specify that their size
|
||||
must be modified. Explained further in the resize_gravity
|
||||
vs. fixed_directions section.
|
||||
fixed_directions
|
||||
There may be multiple solutions to shoving a window back onscreen.
|
||||
Typically, the shortest distance used is the solution picked, but if
|
||||
e.g. an application only moved its window in a single direction, it's
|
||||
more desirable that the window is shoved back in that direction than in
|
||||
a different one. fixed_directions facilitates that. Explained further
|
||||
in the resize_gravity vs. fixed_directions section.
|
||||
work_area_xinerama
|
||||
This region is defined in the workspace and just cached here for
|
||||
convenience. It is basically the area obtained by taking the current
|
||||
xinerama, treating all partial struts as full struts, and then
|
||||
subtracting all struts from the current xinerama region. Useful
|
||||
e.g. for enforcing maximization constraints.
|
||||
entire_xinerama
|
||||
Just a cache of the rectangle corresponding to the entire current
|
||||
xinerama, including struts. Useful e.g. for enforcing fullscreen
|
||||
constraints.
|
||||
usable_screen_region
|
||||
The set of maximal/spanning rectangles for the entire screen; this
|
||||
region doesn't overlap with any struts and helps to enforce
|
||||
e.g. onscreen constraints.
|
||||
usable_xinerama_region
|
||||
The set of maximal/spanning rectangles for the current xinerama; this
|
||||
region doesn't overlap with any struts on the xinerama and helps to
|
||||
enforce e.g. the on-single-xinerama constraint.
|
||||
|
||||
|
||||
---------------------------------------------------------------------------
|
||||
Gory details of resize_gravity vs. fixed_directions
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
Note that although resize_gravity and fixed_directions look similar, they
|
||||
are used for different purposes:
|
||||
|
||||
- resize_gravity is only for resize operations and is used for
|
||||
constraints unrelated to keeping a window within a certain region
|
||||
- fixed_directions is for both move and resize operations and is
|
||||
specifically for keeping a window within a specified region.
|
||||
|
||||
Examples of where each are used:
|
||||
|
||||
- If a window is simultaneously moved and resized to the southeast corner
|
||||
with SouthEastGravity, but it turns out that the window was sized to
|
||||
something smaller than the minimum size hint, then the size_hints
|
||||
constraint should resize the window using the resize_gravity to ensure
|
||||
that the southeast corner doesn't move.
|
||||
- If an application resizes itself so that it grows downward only (which
|
||||
I note could be using any of three different gravities, most likely
|
||||
NorthWest), and happens to put the southeast part of the window under a
|
||||
partial strut, then the window needs to be forced back on screen.
|
||||
(Yes, shoved onscreen and not clipped; see bug 136307). It may be the
|
||||
case that moving the window to the left results in less movement of the
|
||||
window than moving the window up, which, in the absence of fixed
|
||||
directions would cause us to chose moving to the left. But since the
|
||||
user knows that only the height of the window is changing, they would
|
||||
find moving to the left weird (especially if this were a dialog that
|
||||
had been centered on its parent). It'd be better to shove the window
|
||||
upwards so we make sure to keep the left and right sides fixed in this
|
||||
case. Note that moving the window upwards (or leftwards) is probably
|
||||
totally against the gravity in this case; but that's okay because
|
||||
gravity typically assumes there's more than enough onscreen space for
|
||||
the resize and we only override the gravity when that assumption is
|
||||
wrong.
|
||||
|
||||
For the paranoid, a fixed directions might give an impossible to fulfill
|
||||
constraint (I don't think that's true currently in the code, but I haven't
|
||||
thought it through in a while). If this ever becomes a problem, it should
|
||||
be relatively simple to throw out the fixed directions when this happens
|
||||
and rerun the constraint. Of course, it might be better to rethink things
|
||||
to just avoid such a problem.
|
||||
|
||||
The nitty gritty of what gets fixed:
|
||||
User move:
|
||||
in x direction - y direction fixed
|
||||
in y direction - x direction fixed
|
||||
in both dirs. - neither direction fixed
|
||||
User resize: (note that for clipping, only 1 side ever changed)
|
||||
in x direction - y direction fixed (technically opposite x side fixed too)
|
||||
in y direction - x direction fixed (technically opposite y side fixed too)
|
||||
in both dirs. - neither direction fixed
|
||||
App move:
|
||||
in x direction - y direction fixed
|
||||
in y direction - x direction fixed
|
||||
in both dirs. - neither direction fixed
|
||||
App resize
|
||||
in x direction - y direction fixed
|
||||
in y direction - x direction fixed
|
||||
in 2 parallel directions (center side gravity) - other dir. fixed
|
||||
in 2 orthogonal directions (corner gravity) - neither dir. fixed
|
||||
in 3 or 4 directions (a center-like gravity) - neither dir. fixed
|
||||
Move & resize
|
||||
Treat like resize case though this will usually mean all four sides
|
||||
change and result in neither direction being fixed
|
||||
Note that in all cases, if neither direction moves it is likely do to a
|
||||
change in struts and thus neither direction should be fixed despite the
|
||||
lack of movement.
|
250
doc/how-to-get-focus-right.txt
Normal file
250
doc/how-to-get-focus-right.txt
Normal file
@@ -0,0 +1,250 @@
|
||||
To make choice of focus window consistent for each focus method, a
|
||||
number of guidelines should be followed. (For purposes of discussion
|
||||
here, I'm excluding things like the panel and the desktop from
|
||||
"windows". It is technically incorrect to do this, but I'm lazy and
|
||||
"windows" is shorter than something like "normal windows". See the
|
||||
end of the discussion for how these special cases are handled.) The
|
||||
basics are easy:
|
||||
|
||||
Focus method Behavior
|
||||
click When a user clicks on a window, focus it
|
||||
sloppy When an EnterNotify is received, focus the window
|
||||
mouse Same as sloppy, but also defocus on LeaveNotify
|
||||
|
||||
Note that these choices (along with the choice that clicking on a
|
||||
window raises it for the click focus method) introduces the following
|
||||
invariants for focus from mouse activity:
|
||||
|
||||
Focus method Invariant
|
||||
click The window on top is focused
|
||||
sloppy If the mouse is in a window, then it is focused; if the
|
||||
mouse is not in a window, then the most recently used
|
||||
window is focused.
|
||||
mouse If the mouse is in a window, then it is focused; otherwise,
|
||||
the designated "no_focus_window" is focused
|
||||
|
||||
However, there are a number of cases where the current focus window
|
||||
becomes invalid and another should be chosen. Some examples are when
|
||||
a focused window is closed or minimized, or when the user changes
|
||||
workspaces. In these cases, there needs to be a rule consistent with
|
||||
the above about the new window to choose.
|
||||
|
||||
Focus method Behavior
|
||||
click Focus the most recently used window (same as the window
|
||||
on top)
|
||||
sloppy Focus the window containing the pointer if there is such
|
||||
a window, otherwise focus the most recently used window.
|
||||
mouse Focus the window containing the pointer if there is one,
|
||||
otherwise focus the designated "no_focus_window".
|
||||
|
||||
Note that "most recently used window", as used here, has a slightly
|
||||
different connotation than "most recent to have keyboard focus". This
|
||||
is because when a user activates a window that is a transient, its
|
||||
ancestor(s) should be considered to be more recently used than other
|
||||
windows that have had the keyboard focus more recently. (See bug
|
||||
157360; this may mean that the alt-tab order should also change
|
||||
simultaneously, although the current implementation does not do that.)
|
||||
|
||||
Also, sometimes a new window will be mapped (e.g. unminimizing a
|
||||
window or launching a new application). Most users want to interact
|
||||
with new windows right away, so these should typically be focused.
|
||||
This does conflict with the invariants for sloppy and mouse focus
|
||||
modes, so this wouldn't be true for a strict-pointer-focus mode. For
|
||||
all other modes (non-strict-pointer-focus modes), there are only two
|
||||
cases in which a new window shouldn't be focused:
|
||||
|
||||
1) If the window takes a while to launch and the user starts
|
||||
interacting with a different application, the new window should
|
||||
not take focus.
|
||||
2) If the window that will appear was not launched by the user
|
||||
(error dialogs, instant messaging windows, etc.), then the window
|
||||
should not take focus when it appears.
|
||||
|
||||
To handle these cases, Metacity compares timestamps of the event that
|
||||
caused the launch and the timestamp of the last interaction with the
|
||||
focused window. (Case 2 is handled by providing a special timestamp
|
||||
of 0 for the launch time, which ensures that the window that appears
|
||||
doesn't get focus)
|
||||
|
||||
If the newly launched window isn't focused, some things should be done
|
||||
to alert the user that there is a window to work with:
|
||||
1) The _NET_WM_DEMANDS_ATTENTION hint should be set
|
||||
2) If the new window isn't modal for the focused window, it should
|
||||
appear below the focused window so that it doesn't obscure the
|
||||
focused window that the user is interacting with.
|
||||
3) If the new window is modal to the focused window, the currently
|
||||
focused window should lose focus but the modal window should
|
||||
appear on top.
|
||||
|
||||
Additionally, the user may decide to use the keyboard instead of the mouse
|
||||
to navigate between windows (referred to as "keynav"). This poses no
|
||||
problems for click-to-focus (because the same invariant can be
|
||||
maintained), but for sloppy and mouse focus it requires extra work to
|
||||
attempt to handle the INHERENTLY CONFLICTING CONSTRAINTS. Metacity does
|
||||
this by having a mouse_mode boolean used to determine which of the two
|
||||
sets of invariants holds. This mode is set according to which method was
|
||||
most recently used to choose a focus window:
|
||||
1) When receiving EnterNotify/LeaveNotify events from mouse movement, set
|
||||
mouse_mode to TRUE.
|
||||
2) When using keynav to choose a focus window (e.g. alt-tab, alt-esc,
|
||||
move-window-to-workspace keybindings), set mouse_mode to FALSE.
|
||||
3) When handling events that don't choose a focus window but rather need
|
||||
a focus_window chosen for them (e.g. switch-to-workspace keybindings),
|
||||
don't change the mouse_mode and just use the current value.
|
||||
Note that grabs present a special case since they can generate EnterNotify
|
||||
and LeaveNotify events without using the mouse, thus these events should be
|
||||
ignored when the crossing mode is NotifyGrab or NotifyUngrab. THIS
|
||||
MOUSENAV/KEYNAV MODERATION METHOD IS NOT PERFECT--there are corner cases
|
||||
when trying to mix-and-match between mousenav and keynav simultaneously
|
||||
that cause problems; but it appears to be the most reasonable tradeoff and
|
||||
works well in most cases, especially if the user sticks to just mousenav
|
||||
for a long time or just keynav for a long time.
|
||||
|
||||
Finally, windows of type WM_DOCK or WM_DESKTOP (e.g. the desktop and
|
||||
the panel) present a special case, at least partially due to the lack
|
||||
of decorations. For WM_DESKTOP windows, we only focus them if the
|
||||
user explicitly requests it (e.g. clicks on the window, uses
|
||||
Ctrl-Alt-Tab to navigate to it, uses a keybinding to show the desktop,
|
||||
etc.). For WM_DOCK windows, we do not focus unless we receive a very
|
||||
explicit request (e.g. Ctrl-Alt-Tab or a _NET_ACTIVE_WINDOW message;
|
||||
not normal clicks).
|
||||
|
||||
|
||||
|
||||
|
||||
To read more about the bugs that inspired these choices:
|
||||
- When a focused window becomes invalid and another should be chosen
|
||||
http://bugzilla.gnome.org/show_bug.cgi?id=135810
|
||||
- When a new window is mapped
|
||||
http://bugzilla.gnome.org/show_bug.cgi?id=118372
|
||||
Also, the EWMH spec, especially the parts relating to _NET_WM_USER_TIME
|
||||
- Modal vs. non-modal dialogs that get denied focus when mapped
|
||||
http://bugzilla.gnome.org/show_bug.cgi?id=151996
|
||||
- Mousenav vs. Keynav in mouse and sloppy focus modes
|
||||
http://bugzilla.gnome.org/show_bug.cgi?id=167545
|
||||
http://bugzilla.gnome.org/show_bug.cgi?id=101190
|
||||
- Not focusing panels
|
||||
http://bugzilla.gnome.org/show_bug.cgi?id=160470
|
||||
http://bugzilla.gnome.org/show_bug.cgi?id=120100
|
||||
|
||||
There were many bugs which had to be fixed to get all the above
|
||||
working; they helped form these policies and/or show the difficulties
|
||||
in implementing this policy (my apologies in advance for producing a
|
||||
list heavily lopsided to what I've done; it's just that these bugs are
|
||||
the ones I'm the most familiar with):
|
||||
bug 72314 ignore LeaveNotify events from grabs
|
||||
bug 82921 focus windows on map
|
||||
bug 87531 only show focus for sticky windows on active workspace (pager)
|
||||
bug 94545 focus window on workspace switch is non-deterministic
|
||||
bug 95747 should ignore EnterNotify events with NotifyInferior detail set
|
||||
bug 97635 sticky windows always keep focus when switching workspaces
|
||||
bug 102665 a window unminimized from the tasklist should be focused
|
||||
bug 107347 focus windows that manually position themselves too
|
||||
bug 108643 focus in MRU order instead of stack order
|
||||
bug 110970 moving a window to another workspace loses focus
|
||||
bug 112031 closing a dialog can result in a strange focus window
|
||||
bug 115650 add _NET_WM_USER_TIME support to gtk+ (see also 150502)
|
||||
bug 120100 panel shouldn't be focused after workspace applet usage
|
||||
bug 123803 need final EnterNotify after workspace switch (see also 124798)
|
||||
bug 124981 focus clicked window in pager only if on current workspace
|
||||
bug 125492 catch the xserver unfocusing everything and fix its braindeadedness
|
||||
bug 128200 focus correct window on libwnck window minimize (see 107681 too)
|
||||
bug 131582 fix race condition on window minimize/close
|
||||
bug 133120 wrong window focused when changing workspaces
|
||||
bug 135024 _NET_ACTIVE_WINDOW messages need timestamps
|
||||
bug 135786 middle-clicking on focused window to lower it should defocus too
|
||||
bug 136581 window minimization vs. activation for mouse focus
|
||||
bug 144900 fix focus choice on "un-showing" the desktop
|
||||
bug 147475 don't lock keyboard on workspace change
|
||||
bug 148364 DEMANDS_ATTENTION support for metacity & libwnck (and other stuff)
|
||||
bug 149028 focus-stealing-prevention for metacity-dialog (and other stuff)
|
||||
bug 149366 windows denied focus on map occur in wrong order in alt-tab list
|
||||
bug 149543 consistent focus window when unshowing desktop
|
||||
bug 149589 race in focus choice from libwnck messages
|
||||
bug 150271 make sure "run application" dialog gets focused
|
||||
bug 150668 update gtk+ _NET_ACTIVE_WINDOW support
|
||||
bug 151245 application startup notification forwarding (partially rejected)
|
||||
bug 151984 Soeren's idea--backup timestamp when startup notification not used
|
||||
bug 151990 prevent focus inconsistencies by only providing one focus method
|
||||
bug 151996 modal dialogs denied focus should not be lowered
|
||||
bug 152000 fix race on window close followed by rapid mouse movement
|
||||
bug 152004 ways to handle new window versus mouse invariants
|
||||
bug 153220 catch the root window getting focus and reset to default window
|
||||
bug 157360 focus parents of dismissed transient windows in preference to
|
||||
the window that most recently had focus
|
||||
bug 159257 focus the desktop when showing it
|
||||
bug 160470 don't focus panels on click
|
||||
bug 163450 correct highlighting in workspace switcher popup
|
||||
bug 164716 refuse to focus a window with a modal transient, and focus
|
||||
the transient instead
|
||||
bug 166524 avoid new windows being obscured by the focus window
|
||||
bug 167545 mousenav vs. keynav in mouse and sloppy focus modes
|
||||
<a massive heap of bugs relating to focus stealing prevention...>
|
||||
|
||||
|
||||
Addendum on sloppy and mouse focus
|
||||
You may occasionally hear people refer to sloppy or mouse focus
|
||||
modes as inherently buggy. This is what they mean by that:
|
||||
|
||||
1) Keynav doesn't maintain the same invariants as mouse navigation
|
||||
for these focus modes; switching back and forth between
|
||||
navigation methods, therefore, may have or appear to have
|
||||
inconsistencies. Examples:
|
||||
a) If the user uses Alt-Tab to change the window with focus, then
|
||||
starts to move the mouse, at that moment the window where the
|
||||
mouse is does not have focus.
|
||||
b) Users expect that a workspace they previously used will not
|
||||
change when the return to it. This means things like window
|
||||
position and stacking order, but also the focus window.
|
||||
Unfortunately, using the original focus window (which would be
|
||||
the most recently used window on that workspace) will
|
||||
sometimes conflict with the invariants for mouse and sloppy
|
||||
focus modes. Users are much more surprised by the invariant
|
||||
being broken than by having the focus window changed (see bug
|
||||
94545 and probably others), so we maintain the invariant.
|
||||
This only matters when using Ctrl-Alt-Arrow to switch
|
||||
workspaces instead of clicking in the workspace switcher, so
|
||||
this really is a keynav vs mouse issue. Either that, or a
|
||||
windows-are-being-mapped exception. ;-)
|
||||
c) Opening a menu, then moving the mouse to a different window,
|
||||
and then pressing escape to dismiss the menu will result in
|
||||
the window containing the mouse not being focused. This is
|
||||
actually correct behavior (because pressing escape shows that
|
||||
the user is using key navigation to interact with the window
|
||||
containing the menu) but is one of those hard-to-get-right
|
||||
keynav and mouse focus mixture cases. (See bug 101190 for
|
||||
more details)
|
||||
d) Similar to (c), moving the mouse off the menu doesn't immediately
|
||||
focus the window that the mouse goes over, due to an application
|
||||
grab (we couldn't change this and wouldn't want to, but
|
||||
technically it does break the invariant).
|
||||
e) If mouse_mode is off and the user does something to cause focus to
|
||||
change (e.g. switch workspaces, close or minimize a window, etc.)
|
||||
and simultaneously tries to move the mouse, the choice of which
|
||||
window to focus is inherently race-y. (You probably can't satisfy
|
||||
both keynav and mousenav invariants simultaneously...)
|
||||
2) The sloppy/mouse invariants are often not strictly maintained;
|
||||
for example, we provide an exception to the invariant for newly
|
||||
mapped windows. (Most find that not allowing this exception is
|
||||
confusing)
|
||||
3) There are an awful lot of little cases to handle to get any focus
|
||||
mode right, even for click-to-focus. Since mouse and sloppy
|
||||
focus have sometimes been hard to even determine what correct
|
||||
behavior is, it is much harder to get them completely right.
|
||||
Plus mouse and sloppy focus users are a minority, decreasing the
|
||||
motivation of window manager implementors to get those focus
|
||||
modes right.
|
||||
4) Because of -1-, -2-, and -3-, implementations are often buggy or
|
||||
inconsistent and people form their opinions from usage of these
|
||||
implementations.
|
||||
5) Sloppy focus suffers from a bit of a discoverability problem (for
|
||||
example, I have seen a scientist sit down to a computer for which
|
||||
sloppy focus was in use and take a few minutes before figuring
|
||||
out how window activation worked; granted the layout of the
|
||||
windows in that situation was a bit unusual but it still
|
||||
illustrates that sloppy focus is harder than it should be to
|
||||
figure out). Mouse focus solves this problem; however, people
|
||||
that have experience with other computing environments are
|
||||
accustomed to being able to move their mouse outside the window
|
||||
they are working with and still continue interacting with that
|
||||
window, which conflicts with mouse focus.
|
2
doc/man/.cvsignore
Normal file
2
doc/man/.cvsignore
Normal file
@@ -0,0 +1,2 @@
|
||||
Makefile
|
||||
Makefile.in
|
3
doc/man/Makefile.am
Normal file
3
doc/man/Makefile.am
Normal file
@@ -0,0 +1,3 @@
|
||||
man_MANS = metacity-theme-viewer.1 metacity-window-demo.1
|
||||
|
||||
EXTRA_DIST = $(man_MANS)
|
43
doc/man/metacity-theme-viewer.1
Normal file
43
doc/man/metacity-theme-viewer.1
Normal file
@@ -0,0 +1,43 @@
|
||||
.\" In .TH, FOO should be all caps, SECTION should be 1-8, maybe w/ subsection
|
||||
.\" other parms are allowed: see man(7), man(1)
|
||||
.\"
|
||||
.\" Based on template provided by Tom Christiansen <tchrist@jhereg.perl.com>.
|
||||
.\"
|
||||
.TH METACITY-THEME-VIEWER 1 "1 June 2004"
|
||||
.SH NAME
|
||||
metacity-theme-viewer \- view metacity themes
|
||||
.SH SYNOPSIS
|
||||
.B metacity-theme-viewer
|
||||
[
|
||||
.I THEMENAME
|
||||
]
|
||||
.SH DESCRIPTION
|
||||
.\" Putting a newline after each sentence can generate better output.
|
||||
.B metacity-theme-viewer
|
||||
allows you to preview any installed Metacity theme.
|
||||
.PP
|
||||
When designing a new Metacity theme, you can use
|
||||
.B metacity-theme-viewer
|
||||
to measure the performance of a window frame option, and to preview
|
||||
the option.
|
||||
.SH OPTIONS
|
||||
.TP
|
||||
.I THEMENAME
|
||||
Name of the theme to be shown (\fIAtlanta\fR by default).
|
||||
It is case-sensitive.
|
||||
.SH FILES
|
||||
.br
|
||||
.nf
|
||||
.TP
|
||||
.I /usr/share/themes
|
||||
system themes directory
|
||||
.TP
|
||||
.I /usr/share/themes/*/metacity-1/metacity-theme-1.xml
|
||||
theme specification file
|
||||
.SH AUTHOR
|
||||
This manual page was written by Jose M. Moya <josem@die.upm.es>, for
|
||||
the Debian GNU/Linux system (but may be used by others).
|
||||
.SH "SEE ALSO"
|
||||
.\" Always quote multiple words for .SH
|
||||
.BR metacity (1),
|
||||
.BR metacity-window-demo (1).
|
25
doc/man/metacity-window-demo.1
Normal file
25
doc/man/metacity-window-demo.1
Normal file
@@ -0,0 +1,25 @@
|
||||
.\" In .TH, FOO should be all caps, SECTION should be 1-8, maybe w/ subsection
|
||||
.\" other parms are allowed: see man(7), man(1)
|
||||
.\"
|
||||
.\" Based on template provided by Tom Christiansen <tchrist@jhereg.perl.com>.
|
||||
.\"
|
||||
.TH METACITY-WINDOW-DEMO 1 "1 June 2004"
|
||||
.SH NAME
|
||||
metacity-window-demo \- demo of window features
|
||||
.SH SYNOPSIS
|
||||
.B metacity-window-demo
|
||||
.SH DESCRIPTION
|
||||
.\" Putting a newline after each sentence can generate better output.
|
||||
This program demonstrates various kinds of windows that window
|
||||
managers and window manager themes should handle.
|
||||
.PP
|
||||
Be sure to tear off the menu and toolbar, those are also a special
|
||||
kind of window.
|
||||
.SH AUTHOR
|
||||
This manual page was written by Jose M. Moya <josem@die.upm.es>, for
|
||||
the Debian GNU/Linux system (but may be used by others).
|
||||
.SH "SEE ALSO"
|
||||
.\" Always quote multiple words for .SH
|
||||
.BR x-window-manager (1),
|
||||
.BR metacity (1),
|
||||
.BR metacity-theme-viewer (1).
|
273
doc/metacity-theme.dtd
Normal file
273
doc/metacity-theme.dtd
Normal file
@@ -0,0 +1,273 @@
|
||||
<!--
|
||||
DTD for Metacity themes, as of Metacity 2.4.1
|
||||
Author: Ross Burton <ross@burtonini.com>
|
||||
Copyright (C) 2002 Ross Burton
|
||||
Licensed under the GPL, version 2
|
||||
-->
|
||||
|
||||
<!-- Top-level element -->
|
||||
<!ELEMENT metacity_theme (info,(window|frame_style_set|frame_style|frame_geometry|constant|draw_ops|menu_icon)+)>
|
||||
|
||||
<!-- Theme metadata -->
|
||||
<!ELEMENT info (name?|author?|copyright?|date?|description?)*>
|
||||
<!ELEMENT name (#PCDATA)>
|
||||
<!ELEMENT author (#PCDATA)>
|
||||
<!ELEMENT copyright (#PCDATA)>
|
||||
<!ELEMENT date (#PCDATA)>
|
||||
<!ELEMENT description (#PCDATA)>
|
||||
|
||||
<!ENTITY % xyrequired "
|
||||
x CDATA #REQUIRED
|
||||
y CDATA #REQUIRED
|
||||
">
|
||||
|
||||
<!ENTITY % xyimplied "
|
||||
x CDATA #IMPLIED
|
||||
y CDATA #IMPLIED
|
||||
">
|
||||
|
||||
<!ENTITY % widthheightrequired "
|
||||
width CDATA #REQUIRED
|
||||
height CDATA #REQUIRED
|
||||
">
|
||||
|
||||
<!ENTITY % widthheightimplied "
|
||||
width CDATA #IMPLIED
|
||||
height CDATA #IMPLIED
|
||||
">
|
||||
|
||||
<!ENTITY % boolean "(true|false)">
|
||||
|
||||
<!ENTITY % piece_positions "
|
||||
(entire_background|titlebar|titlebar_middle|left_titlebar_edge|right_titlebar_edge|top_titlebar_edge|bottom_titlebar_edge|title|left_edge|right_edge|bottom_edge|overlay)
|
||||
">
|
||||
|
||||
<!ENTITY % gtk-state "
|
||||
state (normal|prelight|active|selected|insensitive) #REQUIRED
|
||||
">
|
||||
|
||||
<!ENTITY % gtk-shadow "
|
||||
shadow (none|in|out|etched_in|etched_out) #REQUIRED
|
||||
">
|
||||
|
||||
|
||||
<!-- The actual theme -->
|
||||
|
||||
<!ELEMENT window EMPTY>
|
||||
<!ATTLIST window
|
||||
type (normal|dialog|modal_dialog|menu|utility|border) #REQUIRED
|
||||
style_set CDATA #REQUIRED
|
||||
>
|
||||
|
||||
|
||||
<!ELEMENT frame_style_set (frame+)>
|
||||
<!ATTLIST frame_style_set
|
||||
name CDATA #REQUIRED
|
||||
parent CDATA #IMPLIED
|
||||
>
|
||||
|
||||
<!ELEMENT frame EMPTY>
|
||||
<!ATTLIST frame
|
||||
focus (yes|no) #REQUIRED
|
||||
state (normal|maximized|shaded|maximized_and_shaded) #REQUIRED
|
||||
resize (both|horizontal|vertical|none) #IMPLIED
|
||||
style CDATA #REQUIRED
|
||||
>
|
||||
|
||||
<!ELEMENT frame_style (piece|button)*>
|
||||
<!ATTLIST frame_style
|
||||
name CDATA #REQUIRED
|
||||
geometry CDATA #REQUIRED
|
||||
parent CDATA #IMPLIED
|
||||
>
|
||||
|
||||
<!ELEMENT piece (draw_ops?)>
|
||||
<!ATTLIST piece
|
||||
position %piece_positions; #REQUIRED
|
||||
draw_ops CDATA #IMPLIED
|
||||
>
|
||||
|
||||
<!ELEMENT button (draw_ops?)>
|
||||
<!ATTLIST button
|
||||
function (menu|minimize|maximize|close|left_left_background|left_middle_background|left_right_background|right_left_background|right_middle_background|right_right_background) #REQUIRED
|
||||
state (normal|prelight|pressed) #REQUIRED
|
||||
draw_ops CDATA #IMPLIED
|
||||
>
|
||||
|
||||
<!ELEMENT frame_geometry (border|(aspect_ratio|distance))+>
|
||||
<!ATTLIST frame_geometry
|
||||
name CDATA #REQUIRED
|
||||
parent CDATA #IMPLIED
|
||||
title_scale (xx-small|x-small|small|medium|large|x-large|xx-large) #IMPLIED
|
||||
has_title (true|false) 'true'
|
||||
rounded_top_left %boolean; #IMPLIED
|
||||
rounded_top_right %boolean; #IMPLIED
|
||||
rounded_bottom_left %boolean; #IMPLIED
|
||||
rounded_bottom_right %boolean; #IMPLIED
|
||||
>
|
||||
|
||||
<!ELEMENT distance EMPTY>
|
||||
<!ATTLIST distance
|
||||
name (left_width|right_width|bottom_height|title_vertical_pad|right_titlebar_edge|left_titlebar_edge|button_width|button_height) #REQUIRED
|
||||
value CDATA #REQUIRED
|
||||
>
|
||||
|
||||
<!ELEMENT border EMPTY>
|
||||
<!ATTLIST border
|
||||
name CDATA #REQUIRED
|
||||
top CDATA #REQUIRED
|
||||
bottom CDATA #REQUIRED
|
||||
left CDATA #REQUIRED
|
||||
right CDATA #REQUIRED
|
||||
>
|
||||
|
||||
<!ELEMENT aspect_ratio EMPTY>
|
||||
<!ATTLIST aspect_ratio
|
||||
name CDATA #REQUIRED
|
||||
value CDATA #REQUIRED
|
||||
>
|
||||
|
||||
<!ELEMENT draw_ops (line|rectangle|arc|tint|gradient|image|gtk_arrow|gtk_box|gtk_vline|icon|title|clip|include|tile)*>
|
||||
<!-- not sure about this.. maybe it should be removed. see #3478 in theme-parser.c -->
|
||||
<!ATTLIST draw_ops
|
||||
name CDATA #IMPLIED
|
||||
>
|
||||
|
||||
<!ELEMENT line EMPTY>
|
||||
<!ATTLIST line
|
||||
color CDATA #REQUIRED
|
||||
x1 CDATA #REQUIRED
|
||||
y1 CDATA #REQUIRED
|
||||
x2 CDATA #REQUIRED
|
||||
y2 CDATA #REQUIRED
|
||||
width CDATA #IMPLIED
|
||||
dash_on_length CDATA #IMPLIED
|
||||
dash_off_length CDATA #IMPLIED
|
||||
>
|
||||
|
||||
<!ELEMENT rectangle EMPTY>
|
||||
<!ATTLIST rectangle
|
||||
color CDATA #REQUIRED
|
||||
%xyrequired;
|
||||
%widthheightrequired;
|
||||
filled %boolean; 'false'
|
||||
>
|
||||
|
||||
<!ELEMENT arc EMPTY>
|
||||
<!ATTLIST arc
|
||||
color CDATA #REQUIRED
|
||||
%xyrequired;
|
||||
%widthheightrequired;
|
||||
start_angle CDATA #REQUIRED
|
||||
extent_angle CDATA #REQUIRED
|
||||
filled %boolean; 'false'
|
||||
>
|
||||
|
||||
<!ELEMENT icon EMPTY>
|
||||
<!ATTLIST icon
|
||||
%xyrequired;
|
||||
width CDATA #REQUIRED
|
||||
height CDATA #REQUIRED
|
||||
alpha CDATA #IMPLIED
|
||||
fill_type (tile|scale) 'scale'
|
||||
>
|
||||
|
||||
<!ELEMENT image EMPTY>
|
||||
<!ATTLIST image
|
||||
filename CDATA #REQUIRED
|
||||
colorize CDATA #IMPLIED
|
||||
%xyrequired;
|
||||
%widthheightrequired;
|
||||
alpha CDATA #IMPLIED
|
||||
fill_type (tile|scale) 'scale'
|
||||
>
|
||||
|
||||
<!ELEMENT tile EMPTY>
|
||||
<!ATTLIST tile
|
||||
name CDATA #REQUIRED
|
||||
%xyrequired;
|
||||
%widthheightrequired;
|
||||
tile_xoffset CDATA #IMPLIED
|
||||
tile_yoffset CDATA #IMPLIED
|
||||
tile_width CDATA #REQUIRED
|
||||
tile_height CDATA #REQUIRED
|
||||
>
|
||||
|
||||
<!ELEMENT clip EMPTY>
|
||||
<!ATTLIST clip
|
||||
%xyrequired;
|
||||
%widthheightrequired;
|
||||
>
|
||||
|
||||
<!ELEMENT title EMPTY>
|
||||
<!ATTLIST title
|
||||
color CDATA #REQUIRED
|
||||
%xyrequired;
|
||||
>
|
||||
|
||||
<!ELEMENT tint EMPTY>
|
||||
<!ATTLIST tint
|
||||
color CDATA #REQUIRED
|
||||
%xyrequired;
|
||||
%widthheightrequired;
|
||||
alpha CDATA #REQUIRED
|
||||
>
|
||||
|
||||
<!ELEMENT gtk_box EMPTY>
|
||||
<!ATTLIST gtk_box
|
||||
%gtk-state;
|
||||
%gtk-shadow;
|
||||
%xyrequired;
|
||||
%widthheightrequired;
|
||||
>
|
||||
|
||||
<!ELEMENT gtk_arrow EMPTY>
|
||||
<!ATTLIST gtk_arrow
|
||||
%gtk-state;
|
||||
%gtk-shadow;
|
||||
arrow (up|down|left|right) #REQUIRED
|
||||
%xyrequired;
|
||||
%widthheightrequired;
|
||||
filed CDATA #IMPLIED
|
||||
>
|
||||
|
||||
<!ELEMENT gtk_vline EMPTY>
|
||||
<!ATTLIST gtk_vline
|
||||
%gtk-state;
|
||||
x CDATA #REQUIRED
|
||||
y1 CDATA #REQUIRED
|
||||
y2 CDATA #REQUIRED
|
||||
>
|
||||
|
||||
<!ELEMENT gradient (color)+>
|
||||
<!ATTLIST gradient
|
||||
type (vertical|horizontal|diagonal) #REQUIRED
|
||||
%xyrequired;
|
||||
%widthheightrequired;
|
||||
alpha CDATA #IMPLIED
|
||||
>
|
||||
|
||||
<!ELEMENT color EMPTY>
|
||||
<!ATTLIST color
|
||||
value CDATA #REQUIRED
|
||||
>
|
||||
|
||||
<!ELEMENT include EMPTY>
|
||||
<!ATTLIST include
|
||||
name CDATA #REQUIRED
|
||||
%xyimplied;
|
||||
%widthheightimplied;
|
||||
>
|
||||
|
||||
<!ELEMENT constant EMPTY>
|
||||
<!ATTLIST constant
|
||||
name CDATA #REQUIRED
|
||||
value CDATA #REQUIRED
|
||||
>
|
||||
|
||||
<!ELEMENT menu_icon (draw_ops?)>
|
||||
<!ATTLIST menu_icon
|
||||
function (close|maximize|minimize|unmaximize) #REQUIRED
|
||||
%gtk-state;
|
||||
draw_ops CDATA #IMPLIED
|
||||
>
|
245
doc/theme-format.txt
Normal file
245
doc/theme-format.txt
Normal file
@@ -0,0 +1,245 @@
|
||||
Docs on the theme format
|
||||
|
||||
Themes are in a simple XML-subset format.
|
||||
|
||||
<?xml version="1.0"?>
|
||||
<metacity_theme>
|
||||
<!-- Only one info section is allowed -->
|
||||
<info>
|
||||
<name>Foo</name>
|
||||
<author>Foo P. Bar</author>
|
||||
<copyright>whoever, 2002</copyright>
|
||||
<date>Jan 31 2005</date>
|
||||
<description>A sentence about the theme.</description>
|
||||
</info>
|
||||
|
||||
<!-- define a frame geometry to be referenced later -->
|
||||
<!-- frame_geometry has an optional has_title attribute which
|
||||
determines whether the title text height is included in the
|
||||
height calculation. if not specified, defaults to true.
|
||||
It also has an optional text_size="medium" attribute
|
||||
(same sizes as with Pango markup, xx-small thru medium thru
|
||||
xx-large)
|
||||
|
||||
Finally it has optional args rounded_top_left=true,
|
||||
rounded_top_right=true, rounded_bottom_left=true,
|
||||
rounded_bottom_right=true.
|
||||
|
||||
-->
|
||||
<frame_geometry name="normal" has_title="true" title_scale="medium">
|
||||
<distance name="left_width" value="6"/>
|
||||
<distance name="right_width" value="6"/>
|
||||
<distance name="bottom_height" value="7"/>
|
||||
<distance name="left_titlebar_edge" value="6"/>
|
||||
<distance name="right_titlebar_edge" value="6"/>
|
||||
<distance name="button_width" value="17"/>
|
||||
<distance name="button_height" value="17"/>
|
||||
<!-- alternative to button_width button_height distances -->
|
||||
<aspect_ratio name="button" value="1.0"/>
|
||||
<distance name="title_vertical_pad" value="4"/>
|
||||
<border name="title_border" left="3" right="12" top="4" bottom="3"/>
|
||||
<border name="button_border" left="0" right="0" top="1" bottom="1"/>
|
||||
</frame_geometry>
|
||||
|
||||
<!-- inheritance is allowed; simply overwrites values from parent -->
|
||||
<frame_geometry name="borderless" parent="normal">
|
||||
<distance name="left_width" value="0"/>
|
||||
<distance name="right_width" value="0"/>
|
||||
<distance name="bottom_height" value="0"/>
|
||||
<distance name="left_titlebar_edge" value="0"/>
|
||||
<distance name="right_titlebar_edge" value="0"/>
|
||||
</frame_geometry>
|
||||
|
||||
<!-- define a constant to use in positions/sizes of draw operations;
|
||||
constant names must start with a capital letter.
|
||||
-->
|
||||
<constant name="LineOffset" value="3"/>
|
||||
|
||||
<!-- define drawing operations to be referenced later;
|
||||
these draw-op lists can also be placed inline.
|
||||
|
||||
Positions/lengths are given as expressions.
|
||||
Operators are: +,-,*,/,%,`max`,`min`
|
||||
All operators are infix including `max` and `min`,
|
||||
i.e. "2 `max` 5"
|
||||
|
||||
Some variables are predefined, and constants can also
|
||||
be used. Variables are:
|
||||
|
||||
width - width of target area
|
||||
height - height of target area
|
||||
object_width - natural width of object being drawn
|
||||
object_height - natural height of object being drawn
|
||||
left_width - distance from left of frame to client window
|
||||
right_width - distance from right of frame to client window
|
||||
top_height - distance from top of frame to client window
|
||||
bottom_height - distance from bottom of frame to client window
|
||||
mini_icon_width - width of mini icon for window
|
||||
mini_icon_height - height of mini icon
|
||||
icon_width - width of large icon
|
||||
icon_height - height of large icon
|
||||
title_width - width of title text
|
||||
title_height - height of title text
|
||||
|
||||
All these are always defined, except object_width/object_height
|
||||
which only exists for <image> right now.
|
||||
|
||||
-->
|
||||
|
||||
<draw_ops name="demo_all_ops">
|
||||
<line color="#00FF00" x1="LineOffset" y1="0" x2="0" y2="height"/>
|
||||
<line color="gtk:fg[NORMAL]"
|
||||
x1="width - 1" y1="0" x2="width - 1" y2="height"
|
||||
width="3" dash_on_length="2" dash_off_length="3"/>
|
||||
<rectangle color="blend/gtk:fg[NORMAL]/gtk:bg[NORMAL]/0.7"
|
||||
x="0" y="0" width="width - 1" height="height - 1" filled="true"/>
|
||||
<arc color="dark gray" x="0" y="0" width="width - 1" height="height - 1"
|
||||
filled="false" start_angle="30" extent_angle="180"/>
|
||||
<tint color="orange" alpha="0.5" x="0" y="0" width="width" height="height"/>
|
||||
<!-- may be vertical, horizontal, diagonal -->
|
||||
<gradient type="diagonal"
|
||||
x="10" y="30" width="width / 3" height="height / 4">
|
||||
<!-- any number of colors allowed here. A color can be
|
||||
a color name like "blue" (look at gcolorsel), a hex color
|
||||
as in HTML (#FFBB99), or a color from the gtk theme
|
||||
given as "gtk:base[NORMAL]", "gtk:fg[ACTIVE]", etc.
|
||||
-->
|
||||
<color value="gtk:fg[SELECTED]"/>
|
||||
<!-- color obtained by a 0.5 alpha composite of the second color onto the first -->
|
||||
<color value="blend/gtk:bg[SELECTED]/gtk:fg[SELECTED]/0.5"/>
|
||||
</gradient>
|
||||
<!-- image has an optional colorize="#color" attribute to give the
|
||||
image a certain color -->
|
||||
<image filename="foo.png" alpha="0.7"
|
||||
x="10" y="30" width="width / 3" height="height / 4"/>
|
||||
<gtk_arrow state="normal" shadow="in" arrow="up"
|
||||
filled="true"
|
||||
x="2" y="2" width="width - 4" height="height - 4"/>
|
||||
<gtk_box state="normal" shadow="out"
|
||||
x="2" y="2" width="width - 4" height="height - 4"/>
|
||||
<gtk_vline state="normal" x="2" y1="0" y2="height"/>
|
||||
<!-- window's icon -->
|
||||
<icon alpha="0.7"
|
||||
x="10" y="30" width="width / 3" height="height / 4"/>
|
||||
<!-- window's title -->
|
||||
<title color="gtk:text[NORMAL]" x="20" y="30"/>
|
||||
<!-- include another draw ops list; has optional x/y/width/height attrs -->
|
||||
<include name="some_other_draw_ops"/>
|
||||
<!-- tile another draw ops list; has optional
|
||||
x/y/width/height/tile_xoffset/tile_yoffset -->
|
||||
<tile name="some_other_draw_ops" tile_width="10" tile_height="10"/>
|
||||
</draw_ops>
|
||||
|
||||
<frame_style name="normal" geometry="normal">
|
||||
<!-- How to draw each piece of the frame.
|
||||
For each piece, a draw_ops can be given inline or referenced
|
||||
by name. If a piece is omitted, then nothing will be drawn
|
||||
for that piece.
|
||||
|
||||
For each piece, the "width" and "height" variables in
|
||||
coordinate expressions refers to the dimensions of the piece,
|
||||
the origin is at the top left of the piece.
|
||||
|
||||
So <rectangle x="0" y="0" width="width-1" height="height-1"/>
|
||||
will outline a piece.
|
||||
-->
|
||||
|
||||
<piece position="entire_background" draw_ops="demo_all_ops"/>
|
||||
<piece position="left_titlebar_edge">
|
||||
<draw_ops>
|
||||
<line color="#00FF00" x1="0" y1="0" x2="0" y2="height"/>
|
||||
</draw_ops>
|
||||
</piece>
|
||||
|
||||
<!-- The complete list of frame pieces:
|
||||
|
||||
entire_background: whole frame
|
||||
titlebar: entire area above the app's window
|
||||
titlebar_middle: area of titlebar_background not considered
|
||||
part of an edge
|
||||
left_titlebar_edge: left side of titlebar background
|
||||
right_titlebar_edge: right side of titlebar background
|
||||
top_titlebar_edge: top side of titlebar background
|
||||
bottom_titlebar_edge: bottom side of titlebar background
|
||||
title: the title area (doesn't include buttons)
|
||||
left_edge: left edge of the frame
|
||||
right_edge: right edge of the frame
|
||||
bottom_edge: bottom edge of the frame
|
||||
overlay: same area as entire_background, but drawn after
|
||||
drawing all sub-pieces instead of before
|
||||
|
||||
-->
|
||||
|
||||
<!-- For buttons, drawing methods have to be provided for
|
||||
each of three states:
|
||||
normal, pressed, prelight
|
||||
and the button function or position must be provided:
|
||||
close, maximize, minimize, menu,
|
||||
left_left_background, left_middle_background,
|
||||
left_right_background, right_left_background,
|
||||
right_middle_background, right_right_background
|
||||
So a working theme needs 3*4 = 12 button declarations
|
||||
and a theme may have up to 3*10 = 30 button declarations
|
||||
in order to handle button-rearrangement preferences.
|
||||
|
||||
(The name "function" for the attribute is from before the
|
||||
background values existed.)
|
||||
-->
|
||||
|
||||
<button function="close" state="normal" draw_ops="previously_named"/>
|
||||
<button function="menu" state="normal">
|
||||
<draw_ops>
|
||||
<icon alpha="0.7"
|
||||
x="0" y="0" width="object_width" height="object_height"/>
|
||||
</draw_ops>
|
||||
</button>
|
||||
|
||||
</frame_style>
|
||||
|
||||
<!-- styles can inherit from each other with the parent="" attribute.
|
||||
In a subclass anything can be re-specified to override
|
||||
the parent style. -->
|
||||
<frame_style name="focused" parent="normal">
|
||||
<piece position="title">
|
||||
<draw_ops>
|
||||
<rectangle color="gtk:bg[SELECTED]"
|
||||
x="0" y="0" width="width-1" height="height-1"/>
|
||||
<title color="gtk:fg[SELECTED]" x="(width - title_width) / 2"
|
||||
y="(height - title_height) / 2"/>
|
||||
</draw_ops>
|
||||
</piece>
|
||||
</frame_style>
|
||||
|
||||
<!-- Maps styles to states of frame.
|
||||
|
||||
Focus: yes (focused), no (not focused)
|
||||
Window states: normal, maximized, shaded, maximized_and_shaded
|
||||
Window resizability: none, vertical, horizontal, both
|
||||
|
||||
Everything unspecified just does the same as
|
||||
unfocused/normal/both.
|
||||
|
||||
only state="normal" needs a resize="" attribute.
|
||||
-->
|
||||
<frame_style_set name="normal">
|
||||
<frame focus="yes" state="normal" resize="both" style="focused"/>
|
||||
<frame focus="no" state="normal" resize="both" style="normal"/>
|
||||
</frame_style_set>
|
||||
|
||||
<!-- Each window type needs a style set
|
||||
Types: normal, dialog, modal_dialog, menu, utility, border
|
||||
-->
|
||||
<window type="normal" style_set="normal"/>
|
||||
|
||||
|
||||
<!-- For menu icons, drawing methods are needed for the same
|
||||
four types as the buttons, and GTK states
|
||||
(insensitive,prelight,normal,etc.)
|
||||
-->
|
||||
|
||||
<menu_icon function="close" state="normal" draw_ops="previously_named"/>
|
||||
|
||||
|
||||
</metacity_theme>
|
||||
|
||||
|
@@ -1,6 +1,11 @@
|
||||
*.gmo
|
||||
*.mo
|
||||
*.pot
|
||||
Makefile
|
||||
Makefile.in
|
||||
Makefile.in.in
|
||||
POTFILES
|
||||
Makefile.in
|
||||
Makefile
|
||||
stamp-cat-id
|
||||
cat-id-tbl.c
|
||||
messages
|
||||
missing
|
||||
stamp-cat-id
|
||||
|
2850
po/ChangeLog
Normal file
2850
po/ChangeLog
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,26 @@
|
||||
# List of source files containing translatable strings.
|
||||
# Please keep this file sorted alphabetically.
|
||||
src/tools/metacity-message.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/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
|
||||
|
3193
po/en_CA.po
Normal file
3193
po/en_CA.po
Normal file
File diff suppressed because it is too large
Load Diff
3200
po/en_GB.po
Normal file
3200
po/en_GB.po
Normal file
File diff suppressed because it is too large
Load Diff
3290
po/pt_BR.po
Normal file
3290
po/pt_BR.po
Normal file
File diff suppressed because it is too large
Load Diff
3238
po/sr@Latn.po
Normal file
3238
po/sr@Latn.po
Normal file
File diff suppressed because it is too large
Load Diff
3049
po/zh_CN.po
Normal file
3049
po/zh_CN.po
Normal file
File diff suppressed because it is too large
Load Diff
3052
po/zh_TW.po
Normal file
3052
po/zh_TW.po
Normal file
File diff suppressed because it is too large
Load Diff
62
rationales.txt
Normal file
62
rationales.txt
Normal file
@@ -0,0 +1,62 @@
|
||||
|
||||
History
|
||||
====
|
||||
|
||||
Focus issues:
|
||||
see doc/how-to-get-focus-right.txt
|
||||
|
||||
Keep panel always on top:
|
||||
http://bugzilla.gnome.org/show_bug.cgi?id=81551
|
||||
|
||||
Edge flipping:
|
||||
http://bugzilla.gnome.org/show_bug.cgi?id=82917
|
||||
|
||||
Opaque resize:
|
||||
http://bugzilla.gnome.org/show_bug.cgi?id=92618
|
||||
|
||||
Alt+click to move/resize:
|
||||
http://bugzilla.gnome.org/show_bug.cgi?id=101151
|
||||
https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=80918
|
||||
|
||||
minimized windows in Alt+tab:
|
||||
http://bugzilla.gnome.org/show_bug.cgi?id=89416
|
||||
|
||||
dialogs above entire app group:
|
||||
http://bugzilla.gnome.org/show_bug.cgi?id=88926
|
||||
|
||||
display window size/position:
|
||||
http://bugzilla.gnome.org/show_bug.cgi?id=85213
|
||||
http://bugzilla.gnome.org/show_bug.cgi?id=106645
|
||||
http://bugzilla.gnome.org/show_bug.cgi?id=130821
|
||||
|
||||
configure click actions, alt+click:
|
||||
http://bugzilla.gnome.org/show_bug.cgi?id=83210
|
||||
|
||||
system modal dialogs:
|
||||
http://bugzilla.gnome.org/show_bug.cgi?id=83357
|
||||
|
||||
workspace wrapping:
|
||||
http://bugzilla.gnome.org/show_bug.cgi?id=89315
|
||||
|
||||
raise windows on click:
|
||||
http://bugzilla.gnome.org/show_bug.cgi?id=86108
|
||||
http://bugzilla.gnome.org/show_bug.cgi?id=115072
|
||||
http://bugzilla.gnome.org/show_bug.cgi?id=115753
|
||||
|
||||
|
||||
Tracking bugs
|
||||
====
|
||||
|
||||
revise theme format: http://bugzilla.gnome.org/show_bug.cgi?id=102547
|
||||
session management: http://bugzilla.gnome.org/show_bug.cgi?id=107063
|
||||
focus-stealing-prevention: http://bugzilla.gnome.org/show_bug.cgi?id=149028
|
||||
other focus bugs: http://bugzilla.gnome.org/show_bug.cgi?id=155450
|
||||
drag-and-drop: http://bugzilla.gnome.org/show_bug.cgi?id=155451
|
||||
raising/stacking: http://bugzilla.gnome.org/show_bug.cgi?id=155452
|
||||
tasklist/workspace switcher: http://bugzilla.gnome.org/show_bug.cgi?id=155453
|
||||
window/workspace selection: http://bugzilla.gnome.org/show_bug.cgi?id=155456
|
||||
key/mouse-binding actions: http://bugzilla.gnome.org/show_bug.cgi?id=155457
|
||||
moving/resizing (constraints): http://bugzilla.gnome.org/show_bug.cgi?id=155458
|
||||
window placement: http://bugzilla.gnome.org/show_bug.cgi?id=155460
|
||||
logout/system-monitor keys: http://bugzilla.gnome.org/show_bug.cgi?id=155462
|
||||
modal dialogs: http://bugzilla.gnome.org/show_bug.cgi?id=164841
|
@@ -3,3 +3,12 @@ Makefile.in
|
||||
Makefile
|
||||
.deps
|
||||
metacity
|
||||
metacity-theme-viewer
|
||||
metacity-dialog
|
||||
testboxes
|
||||
testgradient
|
||||
inlinepixbufs.h
|
||||
metacity.desktop
|
||||
metacity.schemas
|
||||
libmetacity-private.pc
|
||||
testasyncgetprop
|
||||
|
153
src/Makefile.am
153
src/Makefile.am
@@ -1,14 +1,34 @@
|
||||
lib_LTLIBRARIES = libmetacity-private.la
|
||||
|
||||
SUBDIRS=wm-tester
|
||||
SUBDIRS=wm-tester tools themes
|
||||
|
||||
INCLUDES=@METACITY_CFLAGS@ -DMETACITY_LIBEXECDIR=\"$(libexecdir)\" -DHOST_ALIAS=\"@HOST_ALIAS@\"
|
||||
INCLUDES=@METACITY_CFLAGS@ -DMETACITY_LIBEXECDIR=\"$(libexecdir)\" -DMETACITY_LIBDIR=\"$(libdir)\" -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
|
||||
|
||||
EGGFILES= \
|
||||
eggaccelerators.c \
|
||||
eggaccelerators.h
|
||||
|
||||
metacity_SOURCES= \
|
||||
async-getprop.c \
|
||||
async-getprop.h \
|
||||
bell.h \
|
||||
bell.c \
|
||||
boxes.h \
|
||||
boxes.c \
|
||||
common.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 \
|
||||
@@ -21,14 +41,31 @@ metacity_SOURCES= \
|
||||
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 \
|
||||
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 \
|
||||
@@ -37,29 +74,123 @@ metacity_SOURCES= \
|
||||
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
|
||||
workspace.h \
|
||||
xprops.c \
|
||||
xprops.h \
|
||||
$(EGGFILES)
|
||||
|
||||
bin_PROGRAMS=metacity
|
||||
# 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= \
|
||||
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
|
||||
|
||||
metacity_LDADD= @METACITY_LIBS@
|
||||
libmetacity_private_la_LDFLAGS = -no-undefined
|
||||
libmetacity_private_la_LIBADD = @METACITY_LIBS@
|
||||
|
||||
libmetacityincludedir = $(includedir)/metacity-1/metacity-private
|
||||
|
||||
libmetacityinclude_HEADERS = \
|
||||
common.h \
|
||||
gradient.h \
|
||||
preview-widget.h \
|
||||
theme.h \
|
||||
theme-parser.h \
|
||||
util.h
|
||||
|
||||
metacity_theme_viewer_SOURCES= \
|
||||
theme-viewer.c
|
||||
|
||||
metacity_dialog_SOURCES= \
|
||||
metacity-dialog.c
|
||||
|
||||
bin_PROGRAMS=metacity metacity-theme-viewer
|
||||
libexec_PROGRAMS=metacity-dialog
|
||||
|
||||
EFENCE=
|
||||
metacity_LDADD=@METACITY_LIBS@ $(EFENCE)
|
||||
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
|
||||
|
||||
noinst_PROGRAMS=testboxes testgradient testasyncgetprop
|
||||
|
||||
testboxes_LDADD= @METACITY_LIBS@
|
||||
testgradient_LDADD= @METACITY_LIBS@
|
||||
testasyncgetprop_LDADD= @METACITY_LIBS@
|
||||
|
||||
desktopfilesdir=$(datadir)/gnome/wm-properties
|
||||
desktopfiles_DATA=metacity.desktop
|
||||
desktopfiles_in_files=metacity.desktop.in
|
||||
desktopfiles_files=$(desktopfiles_in_files:.desktop.in=.desktop)
|
||||
desktopfiles_DATA = $(desktopfiles_files)
|
||||
@INTLTOOL_DESKTOP_RULE@
|
||||
|
||||
IMAGES=default_icon.png
|
||||
VARIABLES=default_icon_data $(srcdir)/default_icon.png
|
||||
schemadir = @GCONF_SCHEMA_FILE_DIR@
|
||||
schema_in_files = metacity.schemas.in
|
||||
schema_DATA = $(schema_in_files:.schemas.in=.schemas)
|
||||
|
||||
noinst_DATA = inlinepixbufs.h
|
||||
CLEANFILES += $(noinst_DATA)
|
||||
@INTLTOOL_SCHEMAS_RULE@
|
||||
|
||||
if GCONF_SCHEMAS_INSTALL
|
||||
install-data-local:
|
||||
GCONF_CONFIG_SOURCE=$(GCONF_SCHEMA_CONFIG_SOURCE) $(GCONFTOOL) --makefile-install-rule $(schema_DATA)
|
||||
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 \
|
||||
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
|
||||
|
||||
inlinepixbufs.h: $(IMAGES)
|
||||
$(GDK_PIXBUF_CSOURCE) --raw --build-list $(VARIABLES) >$(srcdir)/inlinepixbufs.h
|
||||
|
||||
EXTRA_DIST=$(desktopfiles_DATA) $(IMAGES)
|
||||
pkgconfigdir = $(libdir)/pkgconfig
|
||||
|
||||
pkgconfig_DATA = libmetacity-private.pc
|
||||
|
||||
EXTRA_DIST=$(desktopfiles_files) \
|
||||
$(IMAGES) $(schema_DATA) \
|
||||
update-from-egg.sh \
|
||||
$(desktopfiles_in_files) \
|
||||
$(schema_in_files) \
|
||||
libmetacity-private.pc.in
|
||||
|
||||
|
||||
EGGDIR=$(srcdir)/../../libegg/libegg
|
||||
|
||||
regenerate-built-sources:
|
||||
EGGFILES="$(EGGFILES)" EGGDIR="$(EGGDIR)" $(srcdir)/update-from-egg.sh
|
||||
|
681
src/async-getprop.c
Normal file
681
src/async-getprop.c
Normal file
@@ -0,0 +1,681 @@
|
||||
/* Asynchronous X property getting hack */
|
||||
|
||||
/*
|
||||
* Copyright (C) 2002 Havoc Pennington
|
||||
* Copyright (C) 1986, 1998 The Open Group
|
||||
*
|
||||
* Permission to use, copy, modify, distribute, and sell this software
|
||||
* and its documentation for any purpose is hereby granted without
|
||||
* fee, provided that the above copyright notice appear in all copies
|
||||
* and that both that copyright notice and this permission notice
|
||||
* appear in supporting documentation.
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR
|
||||
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
|
||||
* CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Except as contained in this notice, the name of The Open Group shall not be
|
||||
* used in advertising or otherwise to promote the sale, use or other dealings
|
||||
* in this Software without prior written authorization from The Open Group.
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
#undef DEBUG_SPEW
|
||||
#ifdef DEBUG_SPEW
|
||||
#include <stdio.h>
|
||||
#endif
|
||||
|
||||
#include "async-getprop.h"
|
||||
|
||||
#define NEED_REPLIES
|
||||
#include <X11/Xlibint.h>
|
||||
|
||||
#ifndef NULL
|
||||
#define NULL ((void*)0)
|
||||
#endif
|
||||
|
||||
typedef struct _ListNode ListNode;
|
||||
typedef struct _AgPerDisplayData AgPerDisplayData;
|
||||
|
||||
struct _ListNode
|
||||
{
|
||||
ListNode *next;
|
||||
};
|
||||
|
||||
struct _AgGetPropertyTask
|
||||
{
|
||||
ListNode node;
|
||||
|
||||
AgPerDisplayData *dd;
|
||||
Window window;
|
||||
Atom property;
|
||||
|
||||
unsigned long request_seq;
|
||||
int error;
|
||||
|
||||
Atom actual_type;
|
||||
int actual_format;
|
||||
|
||||
unsigned long n_items;
|
||||
unsigned long bytes_after;
|
||||
unsigned char *data;
|
||||
|
||||
Bool have_reply;
|
||||
};
|
||||
|
||||
struct _AgPerDisplayData
|
||||
{
|
||||
ListNode node;
|
||||
_XAsyncHandler async;
|
||||
|
||||
Display *display;
|
||||
ListNode *pending_tasks;
|
||||
ListNode *pending_tasks_tail;
|
||||
ListNode *completed_tasks;
|
||||
ListNode *completed_tasks_tail;
|
||||
int n_tasks_pending;
|
||||
int n_tasks_completed;
|
||||
};
|
||||
|
||||
static ListNode *display_datas = NULL;
|
||||
static ListNode *display_datas_tail = NULL;
|
||||
|
||||
static void
|
||||
append_to_list (ListNode **head,
|
||||
ListNode **tail,
|
||||
ListNode *task)
|
||||
{
|
||||
task->next = NULL;
|
||||
|
||||
if (*tail == NULL)
|
||||
{
|
||||
assert (*head == NULL);
|
||||
*head = task;
|
||||
*tail = task;
|
||||
}
|
||||
else
|
||||
{
|
||||
(*tail)->next = task;
|
||||
*tail = task;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
remove_from_list (ListNode **head,
|
||||
ListNode **tail,
|
||||
ListNode *task)
|
||||
{
|
||||
ListNode *prev;
|
||||
ListNode *node;
|
||||
|
||||
prev = NULL;
|
||||
node = *head;
|
||||
while (node != NULL)
|
||||
{
|
||||
if (node == task)
|
||||
{
|
||||
if (prev)
|
||||
prev->next = node->next;
|
||||
else
|
||||
*head = node->next;
|
||||
|
||||
if (node == *tail)
|
||||
*tail = prev;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
prev = node;
|
||||
node = node->next;
|
||||
}
|
||||
|
||||
/* can't remove what's not there */
|
||||
assert (node != NULL);
|
||||
|
||||
node->next = NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
move_to_completed (AgPerDisplayData *dd,
|
||||
AgGetPropertyTask *task)
|
||||
{
|
||||
remove_from_list (&dd->pending_tasks,
|
||||
&dd->pending_tasks_tail,
|
||||
&task->node);
|
||||
|
||||
append_to_list (&dd->completed_tasks,
|
||||
&dd->completed_tasks_tail,
|
||||
&task->node);
|
||||
|
||||
dd->n_tasks_pending -= 1;
|
||||
dd->n_tasks_completed += 1;
|
||||
}
|
||||
|
||||
static AgGetPropertyTask*
|
||||
find_pending_by_request_sequence (AgPerDisplayData *dd,
|
||||
unsigned long request_seq)
|
||||
{
|
||||
ListNode *node;
|
||||
|
||||
/* if the sequence is after our last pending task, we
|
||||
* aren't going to find a match
|
||||
*/
|
||||
{
|
||||
AgGetPropertyTask *task = (AgGetPropertyTask*) dd->pending_tasks_tail;
|
||||
if (task != NULL)
|
||||
{
|
||||
if (task->request_seq < request_seq)
|
||||
return NULL;
|
||||
else if (task->request_seq == request_seq)
|
||||
return task; /* why not check this */
|
||||
}
|
||||
}
|
||||
|
||||
/* Generally we should get replies in the order we sent
|
||||
* requests, so we should usually be using the task
|
||||
* at the head of the list, if we use any task at all.
|
||||
* I'm not sure this is 100% guaranteed, if it is,
|
||||
* it would be a big speedup.
|
||||
*/
|
||||
|
||||
node = dd->pending_tasks;
|
||||
while (node != NULL)
|
||||
{
|
||||
AgGetPropertyTask *task = (AgGetPropertyTask*) node;
|
||||
|
||||
if (task->request_seq == request_seq)
|
||||
return task;
|
||||
|
||||
node = node->next;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static Bool
|
||||
async_get_property_handler (Display *dpy,
|
||||
xReply *rep,
|
||||
char *buf,
|
||||
int len,
|
||||
XPointer data)
|
||||
{
|
||||
xGetPropertyReply replbuf;
|
||||
xGetPropertyReply *reply;
|
||||
AgGetPropertyTask *task;
|
||||
AgPerDisplayData *dd;
|
||||
int bytes_read;
|
||||
|
||||
dd = (AgPerDisplayData*) data;
|
||||
|
||||
#if 0
|
||||
printf ("%s: seeing request seq %ld buflen %d\n", __FUNCTION__,
|
||||
dpy->last_request_read, len);
|
||||
#endif
|
||||
|
||||
task = find_pending_by_request_sequence (dd, dpy->last_request_read);
|
||||
|
||||
if (task == NULL)
|
||||
return False;
|
||||
|
||||
assert (dpy->last_request_read == task->request_seq);
|
||||
|
||||
task->have_reply = True;
|
||||
move_to_completed (dd, task);
|
||||
|
||||
/* read bytes so far */
|
||||
bytes_read = SIZEOF (xReply);
|
||||
|
||||
if (rep->generic.type == X_Error)
|
||||
{
|
||||
xError errbuf;
|
||||
|
||||
task->error = rep->error.errorCode;
|
||||
|
||||
#ifdef DEBUG_SPEW
|
||||
printf ("%s: error code = %d (ignoring error, eating %d bytes, generic.length = %ld)\n",
|
||||
__FUNCTION__, task->error, (SIZEOF (xError) - bytes_read),
|
||||
rep->generic.length);
|
||||
#endif
|
||||
|
||||
/* We return True (meaning we consumed the reply)
|
||||
* because otherwise it would invoke the X error handler,
|
||||
* and an async API is useless if you have to synchronously
|
||||
* trap X errors. Also GetProperty can always fail, pretty
|
||||
* much, so trapping errors is always what you want.
|
||||
*
|
||||
* We have to eat all the error reply data here.
|
||||
* (kind of a charade as we know sizeof(xError) == sizeof(xReply))
|
||||
*
|
||||
* Passing discard = True seems to break things; I don't understand
|
||||
* why, because there should be no extra data in an error reply,
|
||||
* right?
|
||||
*/
|
||||
_XGetAsyncReply (dpy, (char *)&errbuf, rep, buf, len,
|
||||
(SIZEOF (xError) - bytes_read) >> 2, /* in 32-bit words */
|
||||
False); /* really seems like it should be True */
|
||||
|
||||
return True;
|
||||
}
|
||||
|
||||
#ifdef DEBUG_SPEW
|
||||
printf ("%s: already read %d bytes reading %d more for total of %d; generic.length = %ld\n",
|
||||
__FUNCTION__, bytes_read, (SIZEOF (xGetPropertyReply) - bytes_read) >> 2,
|
||||
SIZEOF (xGetPropertyReply), rep->generic.length);
|
||||
#endif
|
||||
|
||||
/* (kind of a silly as we know sizeof(xGetPropertyReply) == sizeof(xReply)) */
|
||||
reply = (xGetPropertyReply *)
|
||||
_XGetAsyncReply (dpy, (char *)&replbuf, rep, buf, len,
|
||||
(SIZEOF (xGetPropertyReply) - bytes_read) >> 2, /* in 32-bit words */
|
||||
False); /* False means expecting more data to follow,
|
||||
* don't eat the rest of the reply
|
||||
*/
|
||||
|
||||
bytes_read = SIZEOF (xGetPropertyReply);
|
||||
|
||||
#ifdef DEBUG_SPEW
|
||||
printf ("%s: have reply propertyType = %ld format = %d n_items = %ld\n",
|
||||
__FUNCTION__, reply->propertyType, reply->format, reply->nItems);
|
||||
#endif
|
||||
|
||||
assert (task->data == NULL);
|
||||
|
||||
/* This is all copied from XGetWindowProperty(). Not sure we should
|
||||
* LockDisplay(). Not sure I'm passing the right args to
|
||||
* XGetAsyncData(). Not sure about a lot of things.
|
||||
*/
|
||||
|
||||
/* LockDisplay (dpy); */
|
||||
|
||||
if (reply->propertyType != None)
|
||||
{
|
||||
long nbytes, netbytes;
|
||||
|
||||
/* this alignment macro from orbit2 */
|
||||
#define ALIGN_VALUE(this, boundary) \
|
||||
(( ((unsigned long)(this)) + (((unsigned long)(boundary)) -1)) & (~(((unsigned long)(boundary))-1)))
|
||||
|
||||
switch (reply->format)
|
||||
{
|
||||
/*
|
||||
* One extra byte is malloced than is needed to contain the property
|
||||
* data, but this last byte is null terminated and convenient for
|
||||
* returning string properties, so the client doesn't then have to
|
||||
* recopy the string to make it null terminated.
|
||||
*/
|
||||
case 8:
|
||||
nbytes = reply->nItems;
|
||||
/* there's padding to word boundary */
|
||||
netbytes = ALIGN_VALUE (nbytes, 4);
|
||||
if (nbytes + 1 > 0 &&
|
||||
(task->data = (unsigned char *) Xmalloc ((unsigned)nbytes + 1)))
|
||||
{
|
||||
#ifdef DEBUG_SPEW
|
||||
printf ("%s: already read %d bytes using %ld, more eating %ld more\n",
|
||||
__FUNCTION__, bytes_read, nbytes, netbytes);
|
||||
#endif
|
||||
/* _XReadPad (dpy, (char *) task->data, netbytes); */
|
||||
_XGetAsyncData (dpy, task->data, buf, len,
|
||||
bytes_read, nbytes,
|
||||
netbytes);
|
||||
}
|
||||
break;
|
||||
|
||||
case 16:
|
||||
nbytes = reply->nItems * sizeof (short);
|
||||
netbytes = reply->nItems << 1;
|
||||
netbytes = ALIGN_VALUE (netbytes, 4); /* align to word boundary */
|
||||
if (nbytes + 1 > 0 &&
|
||||
(task->data = (unsigned char *) Xmalloc ((unsigned)nbytes + 1)))
|
||||
{
|
||||
#ifdef DEBUG_SPEW
|
||||
printf ("%s: already read %d bytes using %ld more, eating %ld more\n",
|
||||
__FUNCTION__, bytes_read, nbytes, netbytes);
|
||||
#endif
|
||||
/* _XRead16Pad (dpy, (short *) task->data, netbytes); */
|
||||
_XGetAsyncData (dpy, task->data, buf, len,
|
||||
bytes_read, nbytes, netbytes);
|
||||
}
|
||||
break;
|
||||
|
||||
case 32:
|
||||
/* NOTE buffer is in longs to match XGetWindowProperty() */
|
||||
nbytes = reply->nItems * sizeof (long);
|
||||
netbytes = reply->nItems << 2; /* wire size is always 32 bits though */
|
||||
if (nbytes + 1 > 0 &&
|
||||
(task->data = (unsigned char *) Xmalloc ((unsigned)nbytes + 1)))
|
||||
{
|
||||
#ifdef DEBUG_SPEW
|
||||
printf ("%s: already read %d bytes using %ld more, eating %ld more\n",
|
||||
__FUNCTION__, bytes_read, nbytes, netbytes);
|
||||
#endif
|
||||
|
||||
/* We have to copy the XGetWindowProperty() crackrock
|
||||
* and get format 32 as long even on 64-bit platforms.
|
||||
*/
|
||||
if (sizeof (long) == 8)
|
||||
{
|
||||
unsigned char *netdata;
|
||||
unsigned char *lptr;
|
||||
unsigned char *end_lptr;
|
||||
|
||||
/* Store the 32-bit values in the end of the array */
|
||||
netdata = task->data + nbytes / 2;
|
||||
|
||||
_XGetAsyncData (dpy, netdata, buf, len,
|
||||
bytes_read, netbytes,
|
||||
netbytes);
|
||||
|
||||
/* Now move the 32-bit values to the front */
|
||||
|
||||
lptr = task->data;
|
||||
end_lptr = task->data + nbytes;
|
||||
while (lptr != end_lptr)
|
||||
{
|
||||
*(long*) lptr = *(CARD32*) netdata;
|
||||
lptr += sizeof (long);
|
||||
netdata += sizeof (CARD32);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Here the wire format matches our actual format */
|
||||
_XGetAsyncData (dpy, task->data, buf, len,
|
||||
bytes_read, netbytes,
|
||||
netbytes);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
/*
|
||||
* This part of the code should never be reached. If it is,
|
||||
* the server sent back a property with an invalid format.
|
||||
* This is a BadImplementation error.
|
||||
*
|
||||
* However this async GetProperty API doesn't report errors
|
||||
* via the standard X mechanism, so don't do anything about
|
||||
* it, other than store it in task->error.
|
||||
*/
|
||||
{
|
||||
#if 0
|
||||
xError error;
|
||||
#endif
|
||||
|
||||
task->error = BadImplementation;
|
||||
|
||||
#if 0
|
||||
error.sequenceNumber = task->request_seq;
|
||||
error.type = X_Error;
|
||||
error.majorCode = X_GetProperty;
|
||||
error.minorCode = 0;
|
||||
error.errorCode = BadImplementation;
|
||||
|
||||
_XError (dpy, &error);
|
||||
#endif
|
||||
}
|
||||
|
||||
nbytes = netbytes = 0L;
|
||||
break;
|
||||
}
|
||||
|
||||
if (task->data == NULL)
|
||||
{
|
||||
task->error = BadAlloc;
|
||||
|
||||
#ifdef DEBUG_SPEW
|
||||
printf ("%s: already read %d bytes eating %ld\n",
|
||||
__FUNCTION__, bytes_read, netbytes);
|
||||
#endif
|
||||
/* _XEatData (dpy, (unsigned long) netbytes); */
|
||||
_XGetAsyncData (dpy, NULL, buf, len,
|
||||
bytes_read, 0, netbytes);
|
||||
|
||||
/* UnlockDisplay (dpy); */
|
||||
return BadAlloc; /* not Success */
|
||||
}
|
||||
|
||||
(task->data)[nbytes] = '\0';
|
||||
}
|
||||
|
||||
#ifdef DEBUG_SPEW
|
||||
printf ("%s: have data\n", __FUNCTION__);
|
||||
#endif
|
||||
|
||||
task->actual_type = reply->propertyType;
|
||||
task->actual_format = reply->format;
|
||||
task->n_items = reply->nItems;
|
||||
task->bytes_after = reply->bytesAfter;
|
||||
|
||||
/* UnlockDisplay (dpy); */
|
||||
|
||||
return True;
|
||||
}
|
||||
|
||||
static AgPerDisplayData*
|
||||
get_display_data (Display *display,
|
||||
Bool create)
|
||||
{
|
||||
ListNode *node;
|
||||
AgPerDisplayData *dd;
|
||||
|
||||
node = display_datas;
|
||||
while (node != NULL)
|
||||
{
|
||||
dd = (AgPerDisplayData*) node;
|
||||
|
||||
if (dd->display == display)
|
||||
return dd;
|
||||
|
||||
node = node->next;
|
||||
}
|
||||
|
||||
if (!create)
|
||||
return NULL;
|
||||
|
||||
dd = Xcalloc (1, sizeof (AgPerDisplayData));
|
||||
if (dd == NULL)
|
||||
return NULL;
|
||||
|
||||
dd->display = display;
|
||||
dd->async.next = display->async_handlers;
|
||||
dd->async.handler = async_get_property_handler;
|
||||
dd->async.data = (XPointer) dd;
|
||||
dd->display->async_handlers = &dd->async;
|
||||
|
||||
append_to_list (&display_datas,
|
||||
&display_datas_tail,
|
||||
&dd->node);
|
||||
|
||||
return dd;
|
||||
}
|
||||
|
||||
static void
|
||||
maybe_free_display_data (AgPerDisplayData *dd)
|
||||
{
|
||||
if (dd->pending_tasks == NULL &&
|
||||
dd->completed_tasks == NULL)
|
||||
{
|
||||
DeqAsyncHandler (dd->display, &dd->async);
|
||||
remove_from_list (&display_datas, &display_datas_tail,
|
||||
&dd->node);
|
||||
XFree (dd);
|
||||
}
|
||||
}
|
||||
|
||||
AgGetPropertyTask*
|
||||
ag_task_create (Display *dpy,
|
||||
Window window,
|
||||
Atom property,
|
||||
long offset,
|
||||
long length,
|
||||
Bool delete,
|
||||
Atom req_type)
|
||||
{
|
||||
AgGetPropertyTask *task;
|
||||
xGetPropertyReq *req;
|
||||
xError error;
|
||||
AgPerDisplayData *dd;
|
||||
|
||||
/* Fire up our request */
|
||||
LockDisplay (dpy);
|
||||
|
||||
dd = get_display_data (dpy, True);
|
||||
if (dd == NULL)
|
||||
{
|
||||
UnlockDisplay (dpy);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
GetReq (GetProperty, req);
|
||||
req->window = window;
|
||||
req->property = property;
|
||||
req->type = req_type;
|
||||
req->delete = delete;
|
||||
req->longOffset = offset;
|
||||
req->longLength = length;
|
||||
|
||||
error.sequenceNumber = dpy->request;
|
||||
|
||||
/* Queue up our async task */
|
||||
task = Xcalloc (1, sizeof (AgGetPropertyTask));
|
||||
if (task == NULL)
|
||||
{
|
||||
UnlockDisplay (dpy);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
task->dd = dd;
|
||||
task->window = window;
|
||||
task->property = property;
|
||||
task->request_seq = dpy->request;
|
||||
|
||||
append_to_list (&dd->pending_tasks,
|
||||
&dd->pending_tasks_tail,
|
||||
&task->node);
|
||||
dd->n_tasks_pending += 1;
|
||||
|
||||
UnlockDisplay (dpy);
|
||||
|
||||
SyncHandle ();
|
||||
|
||||
return task;
|
||||
}
|
||||
|
||||
static void
|
||||
free_task (AgGetPropertyTask *task)
|
||||
{
|
||||
remove_from_list (&task->dd->completed_tasks,
|
||||
&task->dd->completed_tasks_tail,
|
||||
&task->node);
|
||||
task->dd->n_tasks_completed -= 1;
|
||||
maybe_free_display_data (task->dd);
|
||||
XFree (task);
|
||||
}
|
||||
|
||||
Status
|
||||
ag_task_get_reply_and_free (AgGetPropertyTask *task,
|
||||
Atom *actual_type,
|
||||
int *actual_format,
|
||||
unsigned long *nitems,
|
||||
unsigned long *bytesafter,
|
||||
unsigned char **prop)
|
||||
{
|
||||
Display *dpy;
|
||||
|
||||
*prop = NULL;
|
||||
|
||||
dpy = task->dd->display; /* Xlib macros require a variable named "dpy" */
|
||||
|
||||
if (task->error != Success)
|
||||
{
|
||||
Status s = task->error;
|
||||
|
||||
free_task (task);
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
if (!task->have_reply)
|
||||
{
|
||||
free_task (task);
|
||||
|
||||
return BadAlloc; /* not Success */
|
||||
}
|
||||
|
||||
*actual_type = task->actual_type;
|
||||
*actual_format = task->actual_format;
|
||||
*nitems = task->n_items;
|
||||
*bytesafter = task->bytes_after;
|
||||
|
||||
*prop = task->data; /* pass out ownership of task->data */
|
||||
|
||||
SyncHandle ();
|
||||
|
||||
free_task (task);
|
||||
|
||||
return Success;
|
||||
}
|
||||
|
||||
Bool
|
||||
ag_task_have_reply (AgGetPropertyTask *task)
|
||||
{
|
||||
return task->have_reply;
|
||||
}
|
||||
|
||||
Atom
|
||||
ag_task_get_property (AgGetPropertyTask *task)
|
||||
{
|
||||
return task->property;
|
||||
}
|
||||
|
||||
Window
|
||||
ag_task_get_window (AgGetPropertyTask *task)
|
||||
{
|
||||
return task->window;
|
||||
}
|
||||
|
||||
Display*
|
||||
ag_task_get_display (AgGetPropertyTask *task)
|
||||
{
|
||||
return task->dd->display;
|
||||
}
|
||||
|
||||
AgGetPropertyTask*
|
||||
ag_get_next_completed_task (Display *display)
|
||||
{
|
||||
AgPerDisplayData *dd;
|
||||
|
||||
dd = get_display_data (display, False);
|
||||
|
||||
if (dd == NULL)
|
||||
return NULL;
|
||||
|
||||
#ifdef DEBUG_SPEW
|
||||
printf ("%d pending %d completed\n",
|
||||
dd->n_tasks_pending,
|
||||
dd->n_tasks_completed);
|
||||
#endif
|
||||
|
||||
return (AgGetPropertyTask*) dd->completed_tasks;
|
||||
}
|
||||
|
||||
void*
|
||||
ag_Xmalloc (unsigned long bytes)
|
||||
{
|
||||
return (void*) Xmalloc (bytes);
|
||||
}
|
||||
|
||||
void*
|
||||
ag_Xmalloc0 (unsigned long bytes)
|
||||
{
|
||||
return (void*) Xcalloc (bytes, 1);
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user