Compare commits
916 Commits
METACITY_2
...
METACITY_2
Author | SHA1 | Date | |
---|---|---|---|
![]() |
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 |
@@ -26,3 +26,5 @@ 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
|
44
HACKING
44
HACKING
@@ -1,3 +1,40 @@
|
||||
Making a release
|
||||
===
|
||||
|
||||
To make a release of metacity, do the following:
|
||||
|
||||
- check out a fresh copy from CVS
|
||||
|
||||
- increment the version number in configure.in,
|
||||
see the comment above the version for the next fibonacci number
|
||||
|
||||
- update the file NEWS based on the ChangeLog
|
||||
|
||||
- add a ChangeLog entry containing the version number
|
||||
you're releasing ("Released 2.5.4" or something)
|
||||
so people can see which changes were before and after
|
||||
a given release.
|
||||
|
||||
- "make distcheck" (DO NOT just "make dist" - pass the check!)
|
||||
|
||||
- if make distcheck fails, fix it.
|
||||
|
||||
- once distcheck succeeds, "cvs commit"
|
||||
|
||||
- if someone else made changes and the commit fails,
|
||||
you have to "cvs up" and run "make distcheck" again
|
||||
|
||||
- once the commit succeeds, WITHOUT cvs updating, "cvs tag
|
||||
METACITY_X_Y_Z" where
|
||||
X_Y_Z map to version X.Y.Z
|
||||
|
||||
- scp the tarball to master.gnome.org
|
||||
|
||||
- run install-module on master.gnome.org to install the tarball
|
||||
on the ftp site
|
||||
|
||||
Misc stuff
|
||||
===
|
||||
|
||||
Don't commit substantive code in here without asking me,
|
||||
hp@redhat.com. Adding translations, no-brainer typo fixes, etc. is
|
||||
@@ -64,4 +101,9 @@ be NULL.
|
||||
|
||||
The code could use cleanup in a lot of places, feel free to do so.
|
||||
|
||||
|
||||
Metacity is ideally a fully ICCCM and EWMH-compliant window manager.
|
||||
Reading these specifications is a useful first step to understanding
|
||||
the role of a window manager on an X11 desktop and the standards and
|
||||
conventions on which X11 desktops are based. Please refer to the
|
||||
COMPLIANCE file for additional information on these specifications and
|
||||
metacity's compliance therewith.
|
||||
|
@@ -1,5 +1,7 @@
|
||||
|
||||
SUBDIRS=src po
|
||||
SUBDIRS=src po doc
|
||||
|
||||
EXTRA_DIST=HACKING theme-format.txt metacity.spec.in metacity.spec \
|
||||
EXTRA_DIST=HACKING rationales.txt \
|
||||
intltool-extract.in intltool-merge.in intltool-update.in
|
||||
|
||||
DISTCLEANFILES = intltool-extract intltool-merge intltool-update
|
||||
|
421
NEWS
421
NEWS
@@ -1 +1,420 @@
|
||||
See README.
|
||||
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
|
||||
|
||||
|
309
README
309
README
@@ -6,15 +6,29 @@ on UNIX keyboards.
|
||||
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.0, 2.8.1, 2.8.1.x, 2.8.5-6
|
||||
|
||||
Unstable branches are 2.3.x, 2.5.x, 2.8.2-4, 2.9.x)
|
||||
|
||||
COMPILING METACITY
|
||||
===
|
||||
|
||||
You need GTK+ 2.0, ideally the latest in the 2.0.x series.
|
||||
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 on http://bugzilla.gnome.org.
|
||||
Report new bugs on http://bugzilla.gnome.org. Please check for
|
||||
duplicates, *especially* if you are reporting a feature request.
|
||||
|
||||
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
|
||||
@@ -22,6 +36,39 @@ 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
|
||||
===
|
||||
|
||||
@@ -31,8 +78,22 @@ METACITY FEATURES
|
||||
- Uses GTK+ 2.0 for drawing window frames. This means colors, fonts,
|
||||
etc. come from GTK+ theme.
|
||||
|
||||
- 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.
|
||||
|
||||
- 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:
|
||||
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
|
||||
@@ -51,7 +112,7 @@ METACITY FEATURES
|
||||
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:
|
||||
- Global keybinding defaults include:
|
||||
|
||||
Alt-Tab forward cycle window focus
|
||||
Alt-Shift-Tab backward cycle focus
|
||||
@@ -66,7 +127,10 @@ METACITY FEATURES
|
||||
|
||||
unst gconftool-2 --type=string --set /apps/metacity/global_keybindings/switch_to_workspace_1 '<Alt>F1'
|
||||
|
||||
See metacity.schemas for available bindings.
|
||||
Also try the GNOME keyboard shortcuts control panel, or
|
||||
gconf-editor.
|
||||
|
||||
See metacity.schemas for all available bindings.
|
||||
|
||||
- Window keybindings:
|
||||
|
||||
@@ -83,8 +147,9 @@ METACITY FEATURES
|
||||
Choose Resize from menu, and nothing happens yet, but
|
||||
eventually I might implement something.
|
||||
|
||||
Keybindings for things like maximize window, etc. can be bound,
|
||||
but don't exist by default. See metacity.schemas.
|
||||
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:
|
||||
|
||||
@@ -99,11 +164,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 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
|
||||
@@ -118,10 +187,10 @@ METACITY FEATURES
|
||||
be respawned. It theoretically restores sizes/positions/workspace
|
||||
for session-aware applications.
|
||||
|
||||
- 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.
|
||||
@@ -144,80 +213,83 @@ METACITY FEATURES
|
||||
|
||||
- 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
|
||||
===
|
||||
|
||||
- You need an EWMH-spec compliant pager/tasklist to be able
|
||||
to navigate graphically; this does NOT include GNOME 1.x,
|
||||
but should include GNOME 2 and KDE 3.
|
||||
|
||||
- doesn't do WM_COLORMAPS from the ICCCM, may matter on some really
|
||||
old obscure hardware with some really obscure apps.
|
||||
|
||||
- There are probably other ICCCM-compliance issues.
|
||||
|
||||
- The first-fit algorithm for placement isn't very clever.
|
||||
|
||||
- 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?
|
||||
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.
|
||||
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.
|
||||
|
||||
http://pobox.com/~hp/free-software-ui.html
|
||||
http://pobox.com/~hp/features.html
|
||||
|
||||
Q: Will Metacity be part of GNOME?
|
||||
|
||||
A: Many people are now asking for this, though it was not the original
|
||||
plan - Metacity started out as sort of an experiment.
|
||||
|
||||
A decision hasn't really been made but the issue will probably
|
||||
be raised shortly after the GNOME 2 release.
|
||||
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 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
|
||||
@@ -270,6 +342,125 @@ A: I could conceivably be convinced to use viewports _instead_ of
|
||||
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: Originally the answer was no. Sadly the answer is now yes.
|
||||
@@ -278,5 +469,3 @@ Q: How can you claim that you are anti-crack, while still
|
||||
writing a window manager?
|
||||
|
||||
A: I have no comment on that.
|
||||
|
||||
|
||||
|
14
acconfig.h
14
acconfig.h
@@ -1,14 +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
|
||||
#undef HAVE_XINERAMA
|
||||
#undef HAVE_SHAPE
|
148
autogen.sh
148
autogen.sh
@@ -12,50 +12,64 @@ FILE=src/display.c
|
||||
|
||||
DIE=0
|
||||
|
||||
AUTOMAKE=automake-1.4
|
||||
ACLOCAL=aclocal-1.4
|
||||
|
||||
($AUTOMAKE --version) < /dev/null > /dev/null 2>&1 || {
|
||||
AUTOMAKE=automake
|
||||
ACLOCAL=aclocal
|
||||
}
|
||||
|
||||
(autoconf --version) < /dev/null > /dev/null 2>&1 || {
|
||||
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_GLIB_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
|
||||
@@ -71,10 +85,7 @@ 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
|
||||
|
||||
topdir=`pwd`
|
||||
for coin in .
|
||||
do
|
||||
dr=`dirname $coin`
|
||||
@@ -82,51 +93,40 @@ do
|
||||
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_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 glib-gettextize... Ignore non-fatal messages."
|
||||
echo "no" | glib-gettextize --force --copy
|
||||
echo "Making $dr/aclocal.m4 writable ..."
|
||||
test -r $dr/aclocal.m4 && chmod u+w $dr/aclocal.m4
|
||||
fi
|
||||
fi
|
||||
if grep "^AC_PROG_INTLTOOL" configure.in >/dev/null; then
|
||||
echo "Running intltoolize..."
|
||||
intltoolize --force --copy --automake
|
||||
fi
|
||||
if grep "^AM_PROG_LIBTOOL" configure.in >/dev/null; then
|
||||
echo "Running libtoolize..."
|
||||
libtoolize --force --copy
|
||||
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 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
|
||||
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 $aclocalinclude ..."
|
||||
$ACLOCAL $aclocalinclude
|
||||
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 $?
|
||||
|
||||
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
|
||||
)
|
||||
cd $topdir
|
||||
fi
|
||||
done
|
||||
|
||||
@@ -137,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
|
||||
|
422
configure.in
422
configure.in
@@ -1,26 +1,42 @@
|
||||
AC_INIT(src/display.c)
|
||||
AC_PREREQ(2.50)
|
||||
AC_INIT([metacity], [2.9.1],
|
||||
[http://bugzilla.gnome.org/enter_bug.cgi?product=metacity])
|
||||
|
||||
AM_CONFIG_HEADER(config.h)
|
||||
AC_CONFIG_SRCDIR(src/display.c)
|
||||
AC_CONFIG_HEADERS(config.h)
|
||||
|
||||
# 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987
|
||||
AM_INIT_AUTOMAKE(metacity, 2.4.1)
|
||||
AM_INIT_AUTOMAKE
|
||||
AM_MAINTAINER_MODE
|
||||
|
||||
# Honor aclocal flags
|
||||
ACLOCAL="$ACLOCAL $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
|
||||
@@ -82,75 +98,340 @@ if test "x$GCC" = "xyes"; then
|
||||
fi
|
||||
changequote([,])dnl
|
||||
|
||||
METACITY_PC_MODULES='gtk+-2.0 >= 2.2.0 pango >= 1.2.0'
|
||||
|
||||
AC_ARG_ENABLE(config-dialog,
|
||||
AC_HELP_STRING([--enable-config-dialog],
|
||||
[enable the config dialog that you need with GNOME 2.0 (obsolete with GNOME 2.2)]),,
|
||||
enable_config_dialog=no)
|
||||
|
||||
AM_CONDITIONAL(BUILD_CONFIG_DIALOG, test x$enable_config_dialog = xyes)
|
||||
if test x$enable_config_dialog = xyes; then
|
||||
AC_DEFINE(BUILD_CONFIG_DIALOG,1,[Build configuration dialog])
|
||||
fi
|
||||
|
||||
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="az ca da de el es fr gl it ja ko lv ms no pl pt pt_BR ro ru sk sv tr uk vi zh_CN zh_TW"
|
||||
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 id is it ja ko lt lv mk ml mn ms nb nl nn no or pa pl pt pt_BR ro ru sl sk sq sr sr@Latn sv ta th tk tr uk vi wa zh_CN zh_TW"
|
||||
AM_GLIB_GNU_GETTEXT
|
||||
|
||||
## here we get the flags we'll actually use
|
||||
PKG_CHECK_MODULES(METACITY, gtk+-2.0 >= 2.0.0 gconf-2.0 >= 1.1.9)
|
||||
PKG_CHECK_MODULES(METACITY_MESSAGE, gtk+-2.0 >= 2.0.0)
|
||||
PKG_CHECK_MODULES(METACITY_WINDOW_DEMO, gtk+-2.0 >= 2.0.0)
|
||||
PKG_CHECK_MODULES(METACITY_PROPS, gtk+-2.0 >= 2.0.0 gconf-2.0 >= 1.1.9 libglade-2.0)
|
||||
PKG_CHECK_MODULES(METACITY_MESSAGE, gtk+-2.0 >= 2.2.0)
|
||||
PKG_CHECK_MODULES(METACITY_WINDOW_DEMO, gtk+-2.0 >= 2.2.0)
|
||||
|
||||
if $PKG_CONFIG --atleast-version 2.1.0 gtk+-2.0; then
|
||||
AC_DEFINE(HAVE_GTK_MULTIHEAD,,[gtk+ with multihead support found])
|
||||
if test x$enable_config_dialog = xyes; then
|
||||
PKG_CHECK_MODULES(METACITY_PROPS, gtk+-2.0 >= 2.2.0 gconf-2.0 >= 1.1.9 libglade-2.0)
|
||||
fi
|
||||
|
||||
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
|
||||
|
||||
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=1.0
|
||||
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
|
||||
|
||||
PKG_CHECK_MODULES(METACITY, $METACITY_PC_MODULES)
|
||||
|
||||
AC_PATH_XTRA
|
||||
|
||||
XINERAMA_LIBS=
|
||||
found_xinerama=false
|
||||
save_CPPFLAGS="$CPPFLAGS"
|
||||
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
|
||||
AC_CHECK_LIB(Xext, XineramaQueryExtension,
|
||||
[AC_CHECK_HEADERS(X11/extensions/Xinerama.h,
|
||||
XINERAMA_LIBS=-lXinerama found_xinerama=true)],
|
||||
, -lXinerama $X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS)
|
||||
ALL_X_LIBS="$X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS"
|
||||
|
||||
if test "$found_xinerama" = "true"; then
|
||||
AC_DEFINE(HAVE_XINERAMA)
|
||||
# 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=false
|
||||
found_shape=no
|
||||
AC_CHECK_LIB(Xext, XShapeQueryExtension,
|
||||
[AC_CHECK_HEADERS(X11/extensions/shape.h,
|
||||
SHAPE_LIBS=-lXext found_shape=true)],
|
||||
, -lXext $X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS)
|
||||
[AC_CHECK_HEADER(X11/extensions/shape.h,
|
||||
SHAPE_LIBS=-lXext found_shape=yes)],
|
||||
, $ALL_X_LIBS)
|
||||
|
||||
if test "$found_shape" = "true"; then
|
||||
AC_DEFINE(HAVE_SHAPE)
|
||||
if test x$enable_shape = xno; then
|
||||
found_shape=no
|
||||
fi
|
||||
|
||||
CPPFLAGS="$save_CPPFLAGS"
|
||||
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
|
||||
|
||||
METACITY_LIBS="$XINERAMA_LIBS $SHAPE_LIBS $X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS $METACITY_LIBS"
|
||||
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=false
|
||||
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)],
|
||||
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)
|
||||
@@ -169,20 +450,65 @@ LDFLAGS="$METACITY_LIBS $LDFLAGS"
|
||||
AC_CHECK_FUNCS(gdk_pixbuf_new_from_stream)
|
||||
LDFLAGS=$save_LDFLAGS
|
||||
|
||||
AC_PATH_PROG(GCONFTOOL, gconftool-2, no)
|
||||
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
|
||||
|
||||
if test x"$GCONFTOOL" = xno; then
|
||||
AC_MSG_ERROR([gconftool-2 executable not found in your path - should be installed with GConf])
|
||||
AM_GCONF_SOURCE_2
|
||||
fi
|
||||
|
||||
AM_GCONF_SOURCE_2
|
||||
|
||||
AC_OUTPUT([
|
||||
AC_CONFIG_FILES([
|
||||
Makefile
|
||||
doc/Makefile
|
||||
src/Makefile
|
||||
src/wm-tester/Makefile
|
||||
src/libmetacity-private.pc
|
||||
src/tools/Makefile
|
||||
src/themes/Makefile
|
||||
po/Makefile.in
|
||||
metacity.spec
|
||||
])
|
||||
|
||||
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}
|
||||
Deprecated config dialog: ${enable_config_dialog}
|
||||
"
|
||||
echo "This is the UNSTABLE branch of metacity"
|
||||
echo "Use 2.8.x (where x > 5) for stable (gnome-2-8 branch in CVS)"
|
||||
|
2
doc/.cvsignore
Normal file
2
doc/.cvsignore
Normal file
@@ -0,0 +1,2 @@
|
||||
Makefile
|
||||
Makefile.in
|
2
doc/Makefile.am
Normal file
2
doc/Makefile.am
Normal file
@@ -0,0 +1,2 @@
|
||||
|
||||
EXTRA_DIST=theme-format.txt metacity-theme.dtd dialogs.txt
|
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.
|
196
doc/how-to-get-focus-right.txt
Normal file
196
doc/how-to-get-focus-right.txt
Normal file
@@ -0,0 +1,196 @@
|
||||
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".
|
||||
|
||||
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 means that EnterNotify
|
||||
and LeaveNotify events should be ignored (they can be generated
|
||||
without using the mouse, for example, by grabs).
|
||||
|
||||
Finally, windows of type WM_DOCK or WM_DESKTOP (e.g. the desktop and
|
||||
the panel) present a special case. For all focus modes, we only focus
|
||||
these windows if the user clicks on them or uses Ctrl-Alt-Tab to
|
||||
navigate to them.
|
||||
|
||||
|
||||
|
||||
|
||||
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
|
||||
- Ignoring EnterNotify and LeaveNotify events during keynav
|
||||
http://bugzilla.gnome.org/show_bug.cgi?id=101190
|
||||
- Not focusing panels
|
||||
http://bugzilla.gnome.org/show_bug.cgi?id=120100 (maybe a different bug?)
|
||||
|
||||
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 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 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
|
||||
|
||||
|
||||
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 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)
|
||||
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.
|
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
|
||||
>
|
@@ -1,87 +0,0 @@
|
||||
%define ver @VERSION@
|
||||
%define RELEASE 1
|
||||
%define rel %{?CUSTOM_RELEASE} %{!?CUSTOM_RELEASE:%RELEASE}
|
||||
|
||||
Summary: Metacity window manager
|
||||
Name: metacity
|
||||
Version: %ver
|
||||
Release: %rel
|
||||
URL: http://people.redhat.com/~hp/metacity/
|
||||
Source0: %{name}-%{version}.tar.gz
|
||||
License: GPL
|
||||
Group: User Interface/Desktops
|
||||
BuildRoot: %{_tmppath}/%{name}-root
|
||||
BuildRequires: gtk2-devel >= 2.0.0
|
||||
BuildRequires: GConf2-devel >= 1.1.9
|
||||
|
||||
%description
|
||||
|
||||
Metacity is a simple window manager that integrates nicely with
|
||||
GNOME 2.
|
||||
|
||||
%prep
|
||||
%setup -q
|
||||
|
||||
%build
|
||||
%configure
|
||||
make %{?_smp_mflags}
|
||||
|
||||
%install
|
||||
rm -rf $RPM_BUILD_ROOT
|
||||
|
||||
export GCONF_DISABLE_MAKEFILE_SCHEMA_INSTALL=1
|
||||
%makeinstall
|
||||
unset GCONF_DISABLE_MAKEFILE_SCHEMA_INSTALL
|
||||
|
||||
%clean
|
||||
rm -rf $RPM_BUILD_ROOT
|
||||
|
||||
%post
|
||||
|
||||
export GCONF_CONFIG_SOURCE=`gconftool-2 --get-default-source`
|
||||
SCHEMAS="metacity.schemas"
|
||||
for S in $SCHEMAS; do
|
||||
gconftool-2 --makefile-install-rule %{_sysconfdir}/gconf/schemas/$S > /dev/null
|
||||
done
|
||||
|
||||
%files
|
||||
%defattr(-,root,root)
|
||||
%doc README AUTHORS COPYING NEWS HACKING theme-format.txt
|
||||
%{_bindir}/*
|
||||
%{_libexecdir}/*
|
||||
%{_datadir}/gnome/wm-properties/*
|
||||
%{_sysconfdir}/gconf/schemas/*.schemas
|
||||
%{_datadir}/control-center-2.0/capplets/*
|
||||
%{_datadir}/metacity
|
||||
%{_datadir}/pixmaps/*
|
||||
%{_datadir}/themes/*
|
||||
|
||||
%changelog
|
||||
* Tue Aug 20 2002 Steve Fox <drfickle@k-lug.org>
|
||||
- Autoconf-ize the spec file to magic updates
|
||||
- Include missing dirs
|
||||
|
||||
* Thu May 2 2002 Havoc Pennington <hp@redhat.com>
|
||||
- 2.3.233
|
||||
|
||||
* Thu Apr 25 2002 Havoc Pennington <hp@redhat.com>
|
||||
- rebuild in different environment
|
||||
- add gconf schemas boilerplate
|
||||
|
||||
* Mon Apr 15 2002 Havoc Pennington <hp@pobox.com>
|
||||
- 2.3.89
|
||||
|
||||
* Tue Oct 30 2001 Havoc Pennington <hp@redhat.com>
|
||||
- 2.3.34
|
||||
|
||||
* Fri Oct 13 2001 Havoc Pennington <hp@redhat.com>
|
||||
- 2.3.21
|
||||
|
||||
* Mon Sep 17 2001 Havoc Pennington <hp@redhat.com>
|
||||
- 2.3.8
|
||||
- 2.3.13
|
||||
|
||||
* Wed Sep 5 2001 Havoc Pennington <hp@redhat.com>
|
||||
- Initial build.
|
||||
|
||||
|
1609
po/ChangeLog
1609
po/ChangeLog
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,6 @@
|
||||
# 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
|
||||
@@ -7,6 +8,7 @@ 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
|
||||
@@ -15,10 +17,12 @@ src/resizepopup.c
|
||||
src/screen.c
|
||||
src/session.c
|
||||
src/theme-parser.c
|
||||
src/theme-viewer.c
|
||||
src/theme.c
|
||||
src/tools/metacity-properties.desktop.in
|
||||
src/tools/metacity-properties.glade
|
||||
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
3194
po/en_GB.po
Normal file
3194
po/en_GB.po
Normal file
File diff suppressed because it is too large
Load Diff
2552
po/pt_BR.po
2552
po/pt_BR.po
File diff suppressed because it is too large
Load Diff
3257
po/sr@Latn.po
Normal file
3257
po/sr@Latn.po
Normal file
File diff suppressed because it is too large
Load Diff
2971
po/zh_CN.po
2971
po/zh_CN.po
File diff suppressed because it is too large
Load Diff
2810
po/zh_TW.po
2810
po/zh_TW.po
File diff suppressed because it is too large
Load Diff
@@ -1,3 +1,61 @@
|
||||
|
||||
Focus windows on map: see http://bugzilla.gnome.org/show_bug.cgi?id=82921
|
||||
Keep panel always on top: http://bugzilla.gnome.org/show_bug.cgi?id=81551
|
||||
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
|
||||
|
@@ -9,3 +9,5 @@ testgradient
|
||||
inlinepixbufs.h
|
||||
metacity.desktop
|
||||
metacity.schemas
|
||||
libmetacity-private.pc
|
||||
testasyncgetprop
|
||||
|
@@ -1,14 +1,23 @@
|
||||
lib_LTLIBRARIES = libmetacity-private.la
|
||||
|
||||
SUBDIRS=wm-tester tools themes
|
||||
|
||||
INCLUDES=@METACITY_CFLAGS@ -DMETACITY_LIBEXECDIR=\"$(libexecdir)\" -DHOST_ALIAS=\"@HOST_ALIAS@\" -DMETACITY_LOCALEDIR=\"$(prefix)/@DATADIRNAME@/locale\" -DMETACITY_PKGDATADIR=\"$(pkgdatadir)\" -DMETACITY_DATADIR=\"$(datadir)\"
|
||||
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 \
|
||||
common.h \
|
||||
compositor.c \
|
||||
compositor.h \
|
||||
constraints.c \
|
||||
constraints.h \
|
||||
core.c \
|
||||
core.h \
|
||||
delete.c \
|
||||
@@ -32,6 +41,9 @@ metacity_SOURCES= \
|
||||
gradient.h \
|
||||
group.c \
|
||||
group.h \
|
||||
group-private.h \
|
||||
group-props.c \
|
||||
group-props.h \
|
||||
iconcache.c \
|
||||
iconcache.h \
|
||||
inlinepixbufs.h \
|
||||
@@ -41,6 +53,9 @@ metacity_SOURCES= \
|
||||
main.h \
|
||||
menu.c \
|
||||
menu.h \
|
||||
metaaccellabel.c \
|
||||
metaaccellabel.h \
|
||||
metacity-Xatomtype.h \
|
||||
place.c \
|
||||
place.h \
|
||||
prefs.c \
|
||||
@@ -67,13 +82,18 @@ metacity_SOURCES= \
|
||||
util.h \
|
||||
window.c \
|
||||
window.h \
|
||||
window-props.c \
|
||||
window-props.h \
|
||||
workspace.c \
|
||||
workspace.h \
|
||||
xprops.c \
|
||||
xprops.h \
|
||||
$(EGGFILES)
|
||||
|
||||
metacity_theme_viewer_SOURCES= \
|
||||
# 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 \
|
||||
@@ -82,9 +102,25 @@ metacity_theme_viewer_SOURCES= \
|
||||
theme.h \
|
||||
theme-parser.c \
|
||||
theme-parser.h \
|
||||
theme-viewer.c \
|
||||
util.c \
|
||||
util.h
|
||||
util.h \
|
||||
common.h
|
||||
|
||||
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
|
||||
@@ -92,19 +128,23 @@ metacity_dialog_SOURCES= \
|
||||
bin_PROGRAMS=metacity metacity-theme-viewer
|
||||
libexec_PROGRAMS=metacity-dialog
|
||||
|
||||
metacity_LDADD= @METACITY_LIBS@
|
||||
metacity_theme_viewer_LDADD= @METACITY_LIBS@
|
||||
EFENCE=
|
||||
metacity_LDADD=@METACITY_LIBS@ $(EFENCE)
|
||||
metacity_theme_viewer_LDADD= @METACITY_LIBS@ libmetacity-private.la
|
||||
metacity_dialog_LDADD=@METACITY_LIBS@
|
||||
|
||||
testgradient_SOURCES=gradient.h gradient.c testgradient.c
|
||||
testasyncgetprop_SOURCES=async-getprop.h async-getprop.c testasyncgetprop.c
|
||||
|
||||
noinst_PROGRAMS=testgradient
|
||||
noinst_PROGRAMS=testgradient testasyncgetprop
|
||||
|
||||
testgradient_LDADD= @METACITY_LIBS@
|
||||
testasyncgetprop_LDADD= @METACITY_LIBS@
|
||||
|
||||
desktopfilesdir=$(datadir)/gnome/wm-properties
|
||||
desktopfiles_in_files=metacity.desktop.in
|
||||
desktopfiles_DATA = $(desktopfiles_in_files:.desktop.in=.desktop)
|
||||
desktopfiles_files=$(desktopfiles_in_files:.desktop.in=.desktop)
|
||||
desktopfiles_DATA = $(desktopfiles_files)
|
||||
@INTLTOOL_DESKTOP_RULE@
|
||||
|
||||
schemadir = @GCONF_SCHEMA_FILE_DIR@
|
||||
@@ -113,8 +153,12 @@ schema_DATA = $(schema_in_files:.schemas.in=.schemas)
|
||||
|
||||
@INTLTOOL_SCHEMAS_RULE@
|
||||
|
||||
if GCONF_SCHEMAS_INSTALL
|
||||
install-data-local:
|
||||
GCONF_CONFIG_SOURCE=$(GCONF_SCHEMA_CONFIG_SOURCE) $(GCONFTOOL) --makefile-install-rule $(srcdir)/$(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 \
|
||||
@@ -123,12 +167,22 @@ VARIABLES=default_icon_data $(srcdir)/default_icon.png \
|
||||
stock_delete_data $(srcdir)/stock_delete.png
|
||||
|
||||
BUILT_SOURCES = inlinepixbufs.h
|
||||
CLEANFILES = 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) $(schema_DATA) update-from-egg.sh $(desktopfiles_in_files) $(schema_in_files)
|
||||
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
|
||||
|
||||
|
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);
|
||||
}
|
65
src/async-getprop.h
Normal file
65
src/async-getprop.h
Normal file
@@ -0,0 +1,65 @@
|
||||
/* Asynchronous X property getting hack */
|
||||
|
||||
/*
|
||||
* Copyright (C) 2002 Havoc Pennington
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef ASYNC_GETPROP_H
|
||||
#define ASYNC_GETPROP_H
|
||||
|
||||
#include <X11/Xlib.h>
|
||||
#include <X11/Xutil.h>
|
||||
|
||||
typedef struct _AgGetPropertyTask AgGetPropertyTask;
|
||||
|
||||
AgGetPropertyTask* ag_task_create (Display *display,
|
||||
Window window,
|
||||
Atom property,
|
||||
long offset,
|
||||
long length,
|
||||
Bool delete,
|
||||
Atom req_type);
|
||||
Status ag_task_get_reply_and_free (AgGetPropertyTask *task,
|
||||
Atom *actual_type,
|
||||
int *actual_format,
|
||||
unsigned long *nitems,
|
||||
unsigned long *bytesafter,
|
||||
unsigned char **prop);
|
||||
|
||||
Bool ag_task_have_reply (AgGetPropertyTask *task);
|
||||
Atom ag_task_get_property (AgGetPropertyTask *task);
|
||||
Window ag_task_get_window (AgGetPropertyTask *task);
|
||||
Display* ag_task_get_display (AgGetPropertyTask *task);
|
||||
|
||||
AgGetPropertyTask* ag_get_next_completed_task (Display *display);
|
||||
|
||||
/* so other headers don't have to include internal Xlib goo */
|
||||
void* ag_Xmalloc (unsigned long bytes);
|
||||
void* ag_Xmalloc0 (unsigned long bytes);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
250
src/bell.c
Normal file
250
src/bell.c
Normal file
@@ -0,0 +1,250 @@
|
||||
/* Metacity visual bell */
|
||||
|
||||
/*
|
||||
* Copyright (C) 2002 Sun Microsystems Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
* 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include "bell.h"
|
||||
#include "screen.h"
|
||||
#include "prefs.h"
|
||||
|
||||
static void
|
||||
meta_bell_flash_screen (MetaDisplay *display,
|
||||
MetaScreen *screen)
|
||||
{
|
||||
Window root = screen->xroot;
|
||||
int width = screen->width;
|
||||
int height = screen->height;
|
||||
|
||||
if (screen->flash_window == None)
|
||||
{
|
||||
Visual *visual = (Visual *)CopyFromParent;
|
||||
XSetWindowAttributes xswa;
|
||||
int depth = CopyFromParent;
|
||||
xswa.save_under = True;
|
||||
xswa.override_redirect = True;
|
||||
/*
|
||||
* TODO: use XGetVisualInfo and determine which is an
|
||||
* overlay, if one is present, and use the Overlay visual
|
||||
* for this window (for performance reasons).
|
||||
* Not sure how to tell this yet...
|
||||
*/
|
||||
screen->flash_window = XCreateWindow (display->xdisplay, root,
|
||||
0, 0, width, height,
|
||||
0, depth,
|
||||
InputOutput,
|
||||
visual,
|
||||
/* note: XSun doesn't like SaveUnder here */
|
||||
CWSaveUnder | CWOverrideRedirect,
|
||||
&xswa);
|
||||
XSelectInput (display->xdisplay, screen->flash_window, ExposureMask);
|
||||
XMapWindow (display->xdisplay, screen->flash_window);
|
||||
XSync (display->xdisplay, False);
|
||||
XFlush (display->xdisplay);
|
||||
XUnmapWindow (display->xdisplay, screen->flash_window);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* just draw something in the window */
|
||||
GC gc = XCreateGC (display->xdisplay, screen->flash_window, 0, NULL);
|
||||
XMapWindow (display->xdisplay, screen->flash_window);
|
||||
XSetForeground (display->xdisplay, gc,
|
||||
WhitePixel (display->xdisplay,
|
||||
XScreenNumberOfScreen (screen->xscreen)));
|
||||
XFillRectangle (display->xdisplay, screen->flash_window, gc,
|
||||
0, 0, width, height);
|
||||
XSetForeground (display->xdisplay, gc,
|
||||
BlackPixel (display->xdisplay,
|
||||
XScreenNumberOfScreen (screen->xscreen)));
|
||||
XFillRectangle (display->xdisplay, screen->flash_window, gc,
|
||||
0, 0, width, height);
|
||||
XFlush (display->xdisplay);
|
||||
XSync (display->xdisplay, False);
|
||||
XUnmapWindow (display->xdisplay, screen->flash_window);
|
||||
}
|
||||
XFlush (display->xdisplay);
|
||||
}
|
||||
|
||||
#ifdef HAVE_XKB
|
||||
static void
|
||||
meta_bell_flash_fullscreen (MetaDisplay *display,
|
||||
XkbAnyEvent *xkb_ev)
|
||||
{
|
||||
XkbBellNotifyEvent *xkb_bell_ev = (XkbBellNotifyEvent *) xkb_ev;
|
||||
MetaScreen *screen;
|
||||
|
||||
g_assert (xkb_ev->xkb_type == XkbBellNotify);
|
||||
if (xkb_bell_ev->window != None)
|
||||
{
|
||||
screen = meta_display_screen_for_xwindow (display, xkb_bell_ev->window);
|
||||
if (screen)
|
||||
meta_bell_flash_screen (display, screen);
|
||||
}
|
||||
else
|
||||
{
|
||||
GSList *screen_list = display->screens;
|
||||
while (screen_list)
|
||||
{
|
||||
screen = (MetaScreen *) screen_list->data;
|
||||
meta_bell_flash_screen (display, screen);
|
||||
screen_list = screen_list->next;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static gboolean
|
||||
meta_bell_unflash_frame (gpointer data)
|
||||
{
|
||||
MetaFrame *frame = (MetaFrame *) data;
|
||||
frame->is_flashing = 0;
|
||||
meta_frame_queue_draw (frame);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_bell_flash_window_frame (MetaWindow *window)
|
||||
{
|
||||
g_assert (window->frame != NULL);
|
||||
window->frame->is_flashing = 1;
|
||||
meta_frame_queue_draw (window->frame);
|
||||
g_timeout_add_full (G_PRIORITY_DEFAULT_IDLE, 100,
|
||||
meta_bell_unflash_frame, window->frame, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_bell_flash_frame (MetaDisplay *display,
|
||||
XkbAnyEvent *xkb_ev)
|
||||
{
|
||||
XkbBellNotifyEvent *xkb_bell_event = (XkbBellNotifyEvent *) xkb_ev;
|
||||
MetaWindow *window;
|
||||
|
||||
g_assert (xkb_ev->xkb_type == XkbBellNotify);
|
||||
window = meta_display_lookup_x_window (display, xkb_bell_event->window);
|
||||
if (!window && (display->focus_window) && (display->focus_window->frame))
|
||||
{
|
||||
window = display->focus_window;
|
||||
}
|
||||
if (window)
|
||||
{
|
||||
meta_bell_flash_window_frame (window);
|
||||
}
|
||||
else /* revert to fullscreen flash if there's no focussed window */
|
||||
{
|
||||
meta_bell_flash_fullscreen (display, xkb_ev);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
meta_bell_visual_notify (MetaDisplay *display,
|
||||
XkbAnyEvent *xkb_ev)
|
||||
{
|
||||
switch (meta_prefs_get_visual_bell_type ())
|
||||
{
|
||||
case META_VISUAL_BELL_FULLSCREEN_FLASH:
|
||||
meta_bell_flash_fullscreen (display, xkb_ev);
|
||||
break;
|
||||
case META_VISUAL_BELL_FRAME_FLASH:
|
||||
meta_bell_flash_frame (display, xkb_ev); /* does nothing yet */
|
||||
break;
|
||||
case META_VISUAL_BELL_INVALID:
|
||||
/* do nothing */
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
meta_bell_notify (MetaDisplay *display,
|
||||
XkbAnyEvent *xkb_ev)
|
||||
{
|
||||
/* flash something */
|
||||
if (meta_prefs_get_visual_bell ())
|
||||
meta_bell_visual_notify (display, xkb_ev);
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
meta_bell_set_audible (MetaDisplay *display, gboolean audible)
|
||||
{
|
||||
#ifdef HAVE_XKB
|
||||
XkbChangeEnabledControls (display->xdisplay,
|
||||
XkbUseCoreKbd,
|
||||
XkbAudibleBellMask,
|
||||
audible ? XkbAudibleBellMask : 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_bell_init (MetaDisplay *display)
|
||||
{
|
||||
#ifdef HAVE_XKB
|
||||
int xkb_base_error_type, xkb_opcode;
|
||||
|
||||
if (!XkbQueryExtension (display->xdisplay, &xkb_opcode,
|
||||
&display->xkb_base_event_type,
|
||||
&xkb_base_error_type,
|
||||
NULL, NULL))
|
||||
{
|
||||
display->xkb_base_event_type = -1;
|
||||
g_message ("could not find XKB extension.");
|
||||
return FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
unsigned int mask = XkbBellNotifyMask;
|
||||
gboolean visual_bell_auto_reset = FALSE;
|
||||
/* TRUE if and when non-broken version is available */
|
||||
XkbSelectEvents (display->xdisplay,
|
||||
XkbUseCoreKbd,
|
||||
XkbBellNotifyMask,
|
||||
XkbBellNotifyMask);
|
||||
XkbChangeEnabledControls (display->xdisplay,
|
||||
XkbUseCoreKbd,
|
||||
XkbAudibleBellMask,
|
||||
meta_prefs_bell_is_audible ()
|
||||
? XkbAudibleBellMask : 0);
|
||||
if (visual_bell_auto_reset) {
|
||||
XkbSetAutoResetControls (display->xdisplay,
|
||||
XkbAudibleBellMask,
|
||||
&mask,
|
||||
&mask);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
#endif
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void
|
||||
meta_bell_shutdown (MetaDisplay *display)
|
||||
{
|
||||
#ifdef HAVE_XKB
|
||||
/* TODO: persist initial bell state in display, reset here */
|
||||
XkbChangeEnabledControls (display->xdisplay,
|
||||
XkbUseCoreKbd,
|
||||
XkbAudibleBellMask,
|
||||
XkbAudibleBellMask);
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
meta_bell_notify_frame_destroy (MetaFrame *frame)
|
||||
{
|
||||
if (frame->is_flashing)
|
||||
g_idle_remove_by_data (frame);
|
||||
}
|
35
src/bell.h
Normal file
35
src/bell.h
Normal file
@@ -0,0 +1,35 @@
|
||||
/* Metacity visual bell */
|
||||
|
||||
/*
|
||||
* Copyright (C) 2002 Sun Microsystems Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
* 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include <X11/Xlib.h>
|
||||
#ifdef HAVE_XKB
|
||||
#include <X11/XKBlib.h>
|
||||
#endif
|
||||
#include "display.h"
|
||||
#include "frame.h"
|
||||
|
||||
#ifdef HAVE_XKB
|
||||
void meta_bell_notify (MetaDisplay *display, XkbAnyEvent *xkb_ev);
|
||||
#endif
|
||||
void meta_bell_set_audible (MetaDisplay *display, gboolean audible);
|
||||
gboolean meta_bell_init (MetaDisplay *display);
|
||||
void meta_bell_shutdown (MetaDisplay *display);
|
||||
void meta_bell_notify_frame_destroy (MetaFrame *frame);
|
49
src/common.h
49
src/common.h
@@ -42,7 +42,8 @@ typedef enum
|
||||
META_FRAME_MAXIMIZED = 1 << 9,
|
||||
META_FRAME_ALLOWS_SHADE = 1 << 10,
|
||||
META_FRAME_ALLOWS_MOVE = 1 << 11,
|
||||
META_FRAME_FULLSCREEN = 1 << 12
|
||||
META_FRAME_FULLSCREEN = 1 << 12,
|
||||
META_FRAME_IS_FLASHING = 1 << 13
|
||||
} MetaFrameFlags;
|
||||
|
||||
typedef enum
|
||||
@@ -57,7 +58,13 @@ typedef enum
|
||||
META_MENU_OP_STICK = 1 << 7,
|
||||
META_MENU_OP_WORKSPACES = 1 << 8,
|
||||
META_MENU_OP_MOVE = 1 << 9,
|
||||
META_MENU_OP_RESIZE = 1 << 10
|
||||
META_MENU_OP_RESIZE = 1 << 10,
|
||||
META_MENU_OP_ABOVE = 1 << 11,
|
||||
META_MENU_OP_UNABOVE = 1 << 12,
|
||||
META_MENU_OP_MOVE_LEFT = 1 << 13,
|
||||
META_MENU_OP_MOVE_RIGHT = 1 << 14,
|
||||
META_MENU_OP_MOVE_UP = 1 << 15,
|
||||
META_MENU_OP_MOVE_DOWN = 1 << 16
|
||||
} MetaMenuOp;
|
||||
|
||||
typedef struct _MetaWindowMenu MetaWindowMenu;
|
||||
@@ -65,6 +72,7 @@ typedef struct _MetaWindowMenu MetaWindowMenu;
|
||||
typedef void (* MetaWindowMenuFunc) (MetaWindowMenu *menu,
|
||||
Display *xdisplay,
|
||||
Window client_xwindow,
|
||||
Time timestamp,
|
||||
MetaMenuOp op,
|
||||
int workspace,
|
||||
gpointer data);
|
||||
@@ -117,7 +125,6 @@ typedef enum
|
||||
META_GRAB_OP_CLICKING_MENU
|
||||
} MetaGrabOp;
|
||||
|
||||
|
||||
typedef enum
|
||||
{
|
||||
META_CURSOR_DEFAULT,
|
||||
@@ -130,7 +137,8 @@ typedef enum
|
||||
META_CURSOR_NE_RESIZE,
|
||||
META_CURSOR_NW_RESIZE,
|
||||
META_CURSOR_MOVE_WINDOW,
|
||||
META_CURSOR_RESIZE_WINDOW
|
||||
META_CURSOR_RESIZE_WINDOW,
|
||||
META_CURSOR_BUSY
|
||||
|
||||
} MetaCursor;
|
||||
|
||||
@@ -141,6 +149,13 @@ typedef enum
|
||||
META_FOCUS_MODE_MOUSE
|
||||
} MetaFocusMode;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
META_ACTION_DOUBLE_CLICK_TITLEBAR_TOGGLE_SHADE,
|
||||
META_ACTION_DOUBLE_CLICK_TITLEBAR_TOGGLE_MAXIMIZE,
|
||||
META_ACTION_DOUBLE_CLICK_TITLEBAR_LAST
|
||||
} MetaActionDoubleClickTitlebar;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
META_FRAME_TYPE_NORMAL,
|
||||
@@ -169,6 +184,32 @@ typedef enum
|
||||
META_VIRTUAL_MOD5_MASK = 1 << 14
|
||||
} MetaVirtualModifier;
|
||||
|
||||
|
||||
/* Function a window button can have. Note, you can't add stuff here
|
||||
* without extending the theme format to draw a new function and
|
||||
* breaking all existing themes.
|
||||
*/
|
||||
typedef enum
|
||||
{
|
||||
META_BUTTON_FUNCTION_MENU,
|
||||
META_BUTTON_FUNCTION_MINIMIZE,
|
||||
META_BUTTON_FUNCTION_MAXIMIZE,
|
||||
META_BUTTON_FUNCTION_CLOSE,
|
||||
META_BUTTON_FUNCTION_LAST
|
||||
} MetaButtonFunction;
|
||||
|
||||
#define MAX_BUTTONS_PER_CORNER META_BUTTON_FUNCTION_LAST
|
||||
|
||||
typedef struct _MetaButtonLayout MetaButtonLayout;
|
||||
struct _MetaButtonLayout
|
||||
{
|
||||
/* buttons in the group on the left side */
|
||||
MetaButtonFunction left_buttons[MAX_BUTTONS_PER_CORNER];
|
||||
|
||||
/* buttons in the group on the right side */
|
||||
MetaButtonFunction right_buttons[MAX_BUTTONS_PER_CORNER];
|
||||
};
|
||||
|
||||
/* should investigate changing these to whatever most apps use */
|
||||
#define META_ICON_WIDTH 32
|
||||
#define META_ICON_HEIGHT 32
|
||||
|
1359
src/compositor.c
Normal file
1359
src/compositor.c
Normal file
File diff suppressed because it is too large
Load Diff
56
src/compositor.h
Normal file
56
src/compositor.h
Normal file
@@ -0,0 +1,56 @@
|
||||
/* Metacity compositing manager */
|
||||
|
||||
/*
|
||||
* Copyright (C) 2003 Red Hat, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
* 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef META_COMPOSITOR_H
|
||||
#define META_COMPOSITOR_H
|
||||
|
||||
#include "util.h"
|
||||
#include "display.h"
|
||||
|
||||
MetaCompositor* meta_compositor_new (MetaDisplay *display);
|
||||
void meta_compositor_unref (MetaCompositor *compositor);
|
||||
void meta_compositor_process_event (MetaCompositor *compositor,
|
||||
XEvent *xevent,
|
||||
MetaWindow *window);
|
||||
void meta_compositor_add_window (MetaCompositor *compositor,
|
||||
Window xwindow,
|
||||
XWindowAttributes *attrs);
|
||||
void meta_compositor_remove_window (MetaCompositor *compositor,
|
||||
Window xwindow);
|
||||
|
||||
void meta_compositor_manage_screen (MetaCompositor *compositor,
|
||||
MetaScreen *screen);
|
||||
void meta_compositor_unmanage_screen (MetaCompositor *compositor,
|
||||
MetaScreen *screen);
|
||||
|
||||
void meta_compositor_damage_window (MetaCompositor *compositor,
|
||||
MetaWindow *window);
|
||||
|
||||
#endif /* META_COMPOSITOR_H */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
216
src/core.c
216
src/core.c
@@ -2,6 +2,7 @@
|
||||
|
||||
/*
|
||||
* Copyright (C) 2001 Havoc Pennington
|
||||
* Copyright (C) 2003 Rob Adams
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
@@ -19,9 +20,11 @@
|
||||
* 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include "core.h"
|
||||
#include "frame.h"
|
||||
#include "workspace.h"
|
||||
#include "prefs.h"
|
||||
|
||||
void
|
||||
meta_core_get_client_size (Display *xdisplay,
|
||||
@@ -44,6 +47,22 @@ meta_core_get_client_size (Display *xdisplay,
|
||||
*height = window->rect.height;
|
||||
}
|
||||
|
||||
Window
|
||||
meta_core_get_client_xwindow (Display *xdisplay,
|
||||
Window frame_xwindow)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
MetaWindow *window;
|
||||
|
||||
display = meta_display_for_x_display (xdisplay);
|
||||
window = meta_display_lookup_x_window (display, frame_xwindow);
|
||||
|
||||
if (window == NULL || window->frame == NULL)
|
||||
meta_bug ("No such frame window 0x%lx!\n", frame_xwindow);
|
||||
|
||||
return window->xwindow;
|
||||
}
|
||||
|
||||
MetaFrameFlags
|
||||
meta_core_get_frame_flags (Display *xdisplay,
|
||||
Window frame_xwindow)
|
||||
@@ -216,6 +235,55 @@ meta_core_user_raise (Display *xdisplay,
|
||||
meta_window_raise (window);
|
||||
}
|
||||
|
||||
void
|
||||
meta_core_user_lower_and_unfocus (Display *xdisplay,
|
||||
Window frame_xwindow,
|
||||
Time timestamp)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
MetaWindow *window;
|
||||
|
||||
display = meta_display_for_x_display (xdisplay);
|
||||
window = meta_display_lookup_x_window (display, frame_xwindow);
|
||||
|
||||
if (window == NULL || window->frame == NULL)
|
||||
meta_bug ("No such frame window 0x%lx!\n", frame_xwindow);
|
||||
|
||||
meta_window_lower (window);
|
||||
|
||||
if (meta_prefs_get_focus_mode () == META_FOCUS_MODE_CLICK)
|
||||
{
|
||||
/* Move window to the back of the focusing workspace's MRU list.
|
||||
* Do extra sanity checks to avoid possible race conditions.
|
||||
* (Borrowed from window.c.)
|
||||
*/
|
||||
if (window->screen->active_workspace &&
|
||||
meta_window_visible_on_workspace (window,
|
||||
window->screen->active_workspace))
|
||||
{
|
||||
GList* link;
|
||||
link = g_list_find (window->screen->active_workspace->mru_list,
|
||||
window);
|
||||
g_assert (link);
|
||||
|
||||
window->screen->active_workspace->mru_list =
|
||||
g_list_remove_link (window->screen->active_workspace->mru_list,
|
||||
link);
|
||||
g_list_free (link);
|
||||
|
||||
window->screen->active_workspace->mru_list =
|
||||
g_list_append (window->screen->active_workspace->mru_list,
|
||||
window);
|
||||
}
|
||||
}
|
||||
|
||||
/* focus the default window, if needed */
|
||||
if (window->has_focus)
|
||||
meta_workspace_focus_default_window (window->screen->active_workspace,
|
||||
NULL,
|
||||
timestamp);
|
||||
}
|
||||
|
||||
void
|
||||
meta_core_user_focus (Display *xdisplay,
|
||||
Window frame_xwindow,
|
||||
@@ -305,6 +373,25 @@ meta_core_maximize (Display *xdisplay,
|
||||
meta_window_maximize (window);
|
||||
}
|
||||
|
||||
void
|
||||
meta_core_toggle_maximize (Display *xdisplay,
|
||||
Window frame_xwindow)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
MetaWindow *window;
|
||||
|
||||
display = meta_display_for_x_display (xdisplay);
|
||||
window = meta_display_lookup_x_window (display, frame_xwindow);
|
||||
|
||||
if (window == NULL || window->frame == NULL)
|
||||
meta_bug ("No such frame window 0x%lx!\n", frame_xwindow);
|
||||
|
||||
if (window->maximized)
|
||||
meta_window_unmaximize (window);
|
||||
else
|
||||
meta_window_maximize (window);
|
||||
}
|
||||
|
||||
void
|
||||
meta_core_unmaximize (Display *xdisplay,
|
||||
Window frame_xwindow)
|
||||
@@ -417,9 +504,8 @@ meta_core_change_workspace (Display *xdisplay,
|
||||
meta_bug ("No such frame window 0x%lx!\n", frame_xwindow);
|
||||
|
||||
meta_window_change_workspace (window,
|
||||
meta_display_get_workspace_by_screen_index (display,
|
||||
window->screen,
|
||||
new_workspace));
|
||||
meta_screen_get_workspace_by_index (window->screen,
|
||||
new_workspace));
|
||||
}
|
||||
|
||||
int
|
||||
@@ -439,7 +525,7 @@ meta_core_get_active_workspace (Screen *xscreen)
|
||||
|
||||
screen = meta_screen_for_x_screen (xscreen);
|
||||
|
||||
return meta_workspace_screen_index (screen->active_workspace);
|
||||
return meta_workspace_index (screen->active_workspace);
|
||||
}
|
||||
|
||||
int
|
||||
@@ -509,16 +595,128 @@ meta_core_show_window_menu (Display *xdisplay,
|
||||
meta_window_show_menu (window, root_x, root_y, button, timestamp);
|
||||
}
|
||||
|
||||
char *
|
||||
void
|
||||
meta_core_get_menu_accelerator (MetaMenuOp menu_op,
|
||||
int workspace,
|
||||
unsigned int *keysym,
|
||||
MetaVirtualModifier *modifiers)
|
||||
{
|
||||
const char *name;
|
||||
|
||||
name = NULL;
|
||||
|
||||
switch (menu_op)
|
||||
{
|
||||
case META_MENU_OP_DELETE:
|
||||
name = META_KEYBINDING_CLOSE;
|
||||
break;
|
||||
case META_MENU_OP_MINIMIZE:
|
||||
name = META_KEYBINDING_MINIMIZE;
|
||||
break;
|
||||
case META_MENU_OP_UNMAXIMIZE:
|
||||
name = META_KEYBINDING_UNMAXIMIZE;
|
||||
break;
|
||||
case META_MENU_OP_MAXIMIZE:
|
||||
name = META_KEYBINDING_MAXIMIZE;
|
||||
break;
|
||||
case META_MENU_OP_UNSHADE:
|
||||
case META_MENU_OP_SHADE:
|
||||
name = META_KEYBINDING_TOGGLE_SHADE;
|
||||
break;
|
||||
case META_MENU_OP_UNSTICK:
|
||||
case META_MENU_OP_STICK:
|
||||
name = META_KEYBINDING_TOGGLE_STICKY;
|
||||
break;
|
||||
case META_MENU_OP_ABOVE:
|
||||
case META_MENU_OP_UNABOVE:
|
||||
name = META_KEYBINDING_TOGGLE_ABOVE;
|
||||
break;
|
||||
case META_MENU_OP_WORKSPACES:
|
||||
switch (workspace)
|
||||
{
|
||||
case 1:
|
||||
name = META_KEYBINDING_MOVE_WORKSPACE_1;
|
||||
break;
|
||||
case 2:
|
||||
name = META_KEYBINDING_MOVE_WORKSPACE_2;
|
||||
break;
|
||||
case 3:
|
||||
name = META_KEYBINDING_MOVE_WORKSPACE_3;
|
||||
break;
|
||||
case 4:
|
||||
name = META_KEYBINDING_MOVE_WORKSPACE_4;
|
||||
break;
|
||||
case 5:
|
||||
name = META_KEYBINDING_MOVE_WORKSPACE_5;
|
||||
break;
|
||||
case 6:
|
||||
name = META_KEYBINDING_MOVE_WORKSPACE_6;
|
||||
break;
|
||||
case 7:
|
||||
name = META_KEYBINDING_MOVE_WORKSPACE_7;
|
||||
break;
|
||||
case 8:
|
||||
name = META_KEYBINDING_MOVE_WORKSPACE_8;
|
||||
break;
|
||||
case 9:
|
||||
name = META_KEYBINDING_MOVE_WORKSPACE_9;
|
||||
break;
|
||||
case 10:
|
||||
name = META_KEYBINDING_MOVE_WORKSPACE_10;
|
||||
break;
|
||||
case 11:
|
||||
name = META_KEYBINDING_MOVE_WORKSPACE_11;
|
||||
break;
|
||||
case 12:
|
||||
name = META_KEYBINDING_MOVE_WORKSPACE_12;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case META_MENU_OP_MOVE:
|
||||
name = META_KEYBINDING_BEGIN_MOVE;
|
||||
break;
|
||||
case META_MENU_OP_RESIZE:
|
||||
name = META_KEYBINDING_BEGIN_RESIZE;
|
||||
break;
|
||||
case META_MENU_OP_MOVE_LEFT:
|
||||
name = META_KEYBINDING_MOVE_WORKSPACE_LEFT;
|
||||
break;
|
||||
case META_MENU_OP_MOVE_RIGHT:
|
||||
name = META_KEYBINDING_MOVE_WORKSPACE_RIGHT;
|
||||
break;
|
||||
case META_MENU_OP_MOVE_UP:
|
||||
name = META_KEYBINDING_MOVE_WORKSPACE_UP;
|
||||
break;
|
||||
case META_MENU_OP_MOVE_DOWN:
|
||||
name = META_KEYBINDING_MOVE_WORKSPACE_DOWN;
|
||||
break;
|
||||
}
|
||||
|
||||
if (name)
|
||||
{
|
||||
meta_prefs_get_window_binding (name, keysym, modifiers);
|
||||
}
|
||||
else
|
||||
{
|
||||
*keysym = 0;
|
||||
*modifiers = 0;
|
||||
}
|
||||
}
|
||||
|
||||
const char*
|
||||
meta_core_get_workspace_name_with_index (Display *xdisplay,
|
||||
int index)
|
||||
Window xroot,
|
||||
int index)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
MetaScreen *screen;
|
||||
MetaWorkspace *workspace;
|
||||
|
||||
display = meta_display_for_x_display (xdisplay);
|
||||
workspace = meta_display_get_workspace_by_index (display, index);
|
||||
return (workspace != NULL) ? workspace->name : NULL;
|
||||
screen = meta_display_screen_for_root (display, xroot);
|
||||
g_assert (screen != NULL);
|
||||
workspace = meta_screen_get_workspace_by_index (screen, index);
|
||||
return workspace ? meta_workspace_get_name (workspace) : NULL;
|
||||
}
|
||||
|
||||
gboolean
|
||||
@@ -526,6 +724,7 @@ meta_core_begin_grab_op (Display *xdisplay,
|
||||
Window frame_xwindow,
|
||||
MetaGrabOp op,
|
||||
gboolean pointer_already_grabbed,
|
||||
int event_serial,
|
||||
int button,
|
||||
gulong modmask,
|
||||
Time timestamp,
|
||||
@@ -547,6 +746,7 @@ meta_core_begin_grab_op (Display *xdisplay,
|
||||
|
||||
return meta_display_begin_grab_op (display, screen, window,
|
||||
op, pointer_already_grabbed,
|
||||
event_serial,
|
||||
button, modmask,
|
||||
timestamp, root_x, root_y);
|
||||
}
|
||||
|
21
src/core.h
21
src/core.h
@@ -31,6 +31,9 @@ void meta_core_get_client_size (Display *xdisplay,
|
||||
int *width,
|
||||
int *height);
|
||||
|
||||
Window meta_core_get_client_xwindow (Display *xdisplay,
|
||||
Window frame_xwindow);
|
||||
|
||||
MetaFrameFlags meta_core_get_frame_flags (Display *xdisplay,
|
||||
Window frame_xwindow);
|
||||
MetaFrameType meta_core_get_frame_type (Display *xdisplay,
|
||||
@@ -57,6 +60,9 @@ void meta_core_user_resize (Display *xdisplay,
|
||||
|
||||
void meta_core_user_raise (Display *xdisplay,
|
||||
Window frame_xwindow);
|
||||
void meta_core_user_lower_and_unfocus (Display *xdisplay,
|
||||
Window frame_xwindow,
|
||||
Time timestamp);
|
||||
|
||||
void meta_core_user_focus (Display *xdisplay,
|
||||
Window frame_xwindow,
|
||||
@@ -75,6 +81,8 @@ void meta_core_get_size (Display *xdisplay,
|
||||
|
||||
void meta_core_minimize (Display *xdisplay,
|
||||
Window frame_xwindow);
|
||||
void meta_core_toggle_maximize (Display *xdisplay,
|
||||
Window frame_xwindow);
|
||||
void meta_core_unmaximize (Display *xdisplay,
|
||||
Window frame_xwindow);
|
||||
void meta_core_maximize (Display *xdisplay,
|
||||
@@ -98,8 +106,9 @@ int meta_core_get_num_workspaces (Screen *xscreen);
|
||||
int meta_core_get_active_workspace (Screen *xscreen);
|
||||
int meta_core_get_frame_workspace (Display *xdisplay,
|
||||
Window frame_xwindow);
|
||||
char* meta_core_get_workspace_name_with_index (Display *xdisplay,
|
||||
int index);
|
||||
const char* meta_core_get_workspace_name_with_index (Display *xdisplay,
|
||||
Window xroot,
|
||||
int index);
|
||||
|
||||
void meta_core_get_frame_extents (Display *xdisplay,
|
||||
Window frame_xwindow,
|
||||
@@ -116,10 +125,16 @@ void meta_core_show_window_menu (Display *xdisplay,
|
||||
int button,
|
||||
Time timestamp);
|
||||
|
||||
void meta_core_get_menu_accelerator (MetaMenuOp menu_op,
|
||||
int workspace,
|
||||
unsigned int *keysym,
|
||||
MetaVirtualModifier *modifiers);
|
||||
|
||||
gboolean meta_core_begin_grab_op (Display *xdisplay,
|
||||
Window frame_xwindow,
|
||||
MetaGrabOp op,
|
||||
gboolean pointer_already_grabbed,
|
||||
int event_serial,
|
||||
int button,
|
||||
gulong modmask,
|
||||
Time timestamp,
|
||||
@@ -150,6 +165,8 @@ void meta_core_get_screen_size (Display *xdisplay,
|
||||
*/
|
||||
void meta_core_increment_event_serial (Display *display);
|
||||
|
||||
int meta_ui_get_last_event_serial (Display *xdisplay);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 424 B After Width: | Height: | Size: 273 B |
45
src/delete.c
45
src/delete.c
@@ -23,6 +23,7 @@
|
||||
#include "util.h"
|
||||
#include "window.h"
|
||||
#include "errors.h"
|
||||
#include "workspace.h"
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <signal.h>
|
||||
@@ -30,19 +31,19 @@
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
static void meta_window_present_delete_dialog (MetaWindow *window);
|
||||
|
||||
static void
|
||||
delete_ping_reply_func (MetaDisplay *display,
|
||||
Window xwindow,
|
||||
Time timestamp,
|
||||
void *user_data)
|
||||
{
|
||||
MetaWindow *window = user_data;
|
||||
|
||||
meta_topic (META_DEBUG_PING,
|
||||
"Got reply to delete ping for %s\n",
|
||||
window->desc);
|
||||
((MetaWindow*)user_data)->desc);
|
||||
|
||||
/* we do nothing */
|
||||
}
|
||||
@@ -290,13 +291,16 @@ io_from_ping_dialog (GIOChannel *channel,
|
||||
static void
|
||||
delete_ping_timeout_func (MetaDisplay *display,
|
||||
Window xwindow,
|
||||
Time timestamp,
|
||||
void *user_data)
|
||||
{
|
||||
MetaWindow *window = user_data;
|
||||
GError *err;
|
||||
int child_pid;
|
||||
int outpipe;
|
||||
char *argv[5];
|
||||
char *argv[9];
|
||||
char numbuf[32];
|
||||
char timestampbuf[32];
|
||||
char *window_id_str;
|
||||
GIOChannel *channel;
|
||||
|
||||
@@ -311,12 +315,19 @@ delete_ping_timeout_func (MetaDisplay *display,
|
||||
}
|
||||
|
||||
window_id_str = g_strdup_printf ("0x%lx", window->xwindow);
|
||||
|
||||
sprintf (numbuf, "%d", window->screen->number);
|
||||
sprintf (timestampbuf, "%lu", timestamp);
|
||||
|
||||
argv[0] = METACITY_LIBEXECDIR"/metacity-dialog";
|
||||
argv[1] = "--kill-window-question";
|
||||
argv[2] = window->title;
|
||||
argv[3] = window_id_str;
|
||||
argv[4] = NULL;
|
||||
argv[1] = "--screen";
|
||||
argv[2] = numbuf;
|
||||
argv[3] = "--timestamp";
|
||||
argv[4] = timestampbuf;
|
||||
argv[5] = "--kill-window-question";
|
||||
argv[6] = window->title;
|
||||
argv[7] = window_id_str;
|
||||
argv[8] = NULL;
|
||||
|
||||
err = NULL;
|
||||
if (!g_spawn_async_with_pipes ("/",
|
||||
@@ -371,7 +382,7 @@ meta_window_delete (MetaWindow *window,
|
||||
window->desc);
|
||||
XKillClient (window->display->xdisplay, window->xwindow);
|
||||
}
|
||||
meta_error_trap_pop (window->display);
|
||||
meta_error_trap_pop (window->display, FALSE);
|
||||
|
||||
meta_display_ping_window (window->display,
|
||||
window,
|
||||
@@ -382,14 +393,24 @@ meta_window_delete (MetaWindow *window,
|
||||
|
||||
if (window->has_focus)
|
||||
{
|
||||
/* FIXME Clean this up someday
|
||||
* http://bugzilla.gnome.org/show_bug.cgi?id=108706
|
||||
*/
|
||||
#if 0
|
||||
/* This is unfortunately going to result in weirdness
|
||||
* if the window doesn't respond to the delete event.
|
||||
* I don't know how to avoid that though.
|
||||
*/
|
||||
meta_topic (META_DEBUG_FOCUS,
|
||||
"Focusing top window because focus window %s was deleted/killed\n",
|
||||
"Focusing default window because focus window %s was deleted/killed\n",
|
||||
window->desc);
|
||||
meta_screen_focus_top_window (window->screen, window);
|
||||
meta_workspace_focus_default_window (window->screen->active_workspace,
|
||||
window);
|
||||
#else
|
||||
meta_topic (META_DEBUG_FOCUS,
|
||||
"Not unfocusing %s on delete/kill\n",
|
||||
window->desc);
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -438,7 +459,7 @@ meta_window_kill (MetaWindow *window)
|
||||
window->desc);
|
||||
meta_error_trap_push (window->display);
|
||||
XKillClient (window->display->xdisplay, window->xwindow);
|
||||
meta_error_trap_pop (window->display);
|
||||
meta_error_trap_pop (window->display, FALSE);
|
||||
}
|
||||
|
||||
void
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user