Compare commits
549 Commits
gnome-3-22
...
wip/carlos
Author | SHA1 | Date | |
---|---|---|---|
![]() |
8d75ea69e3 | ||
![]() |
a7ee7559e4 | ||
![]() |
af3475f65f | ||
![]() |
77fd682c8b | ||
![]() |
fa8e4f60f6 | ||
![]() |
b98a8d9932 | ||
![]() |
864bc793aa | ||
![]() |
e5b06754e0 | ||
![]() |
3402c50625 | ||
![]() |
060543466c | ||
![]() |
65e816908a | ||
![]() |
27b949d6ba | ||
![]() |
27ea62a79d | ||
![]() |
cf1edff9ed | ||
![]() |
5cb5baa7d4 | ||
![]() |
d620189ae3 | ||
![]() |
bc041e02b3 | ||
![]() |
4b4c2b1afa | ||
![]() |
05d15f8885 | ||
![]() |
561d71b8ae | ||
![]() |
177e47952a | ||
![]() |
374bb630f0 | ||
![]() |
fe5138dfc4 | ||
![]() |
68a9675d42 | ||
![]() |
020e0bb2ac | ||
![]() |
b47de58edd | ||
![]() |
24195d8d15 | ||
![]() |
3a7c37c60a | ||
![]() |
c69d5d978c | ||
![]() |
2f30098ab5 | ||
![]() |
e146428038 | ||
![]() |
5758401443 | ||
![]() |
f241bdba93 | ||
![]() |
410d66ca37 | ||
![]() |
f2309cdb55 | ||
![]() |
3887d25dbc | ||
![]() |
d6d01c85a6 | ||
![]() |
d0bfb94ff0 | ||
![]() |
2b1537cdf5 | ||
![]() |
d3362a6f05 | ||
![]() |
9cf8aa4584 | ||
![]() |
c76eedd794 | ||
![]() |
9131f26cae | ||
![]() |
8ed0dda40d | ||
![]() |
0fd9e38175 | ||
![]() |
891cab3bb3 | ||
![]() |
454bd88d27 | ||
![]() |
3ced749c89 | ||
![]() |
69b6479502 | ||
![]() |
a641b59f22 | ||
![]() |
704bd4c331 | ||
![]() |
229ac9c9dc | ||
![]() |
e435cf301f | ||
![]() |
0608ae2d4e | ||
![]() |
3f107da479 | ||
![]() |
813de50eba | ||
![]() |
a4cb1f0f7a | ||
![]() |
612432ac3e | ||
![]() |
47a01013b1 | ||
![]() |
69e7ad4402 | ||
![]() |
c214eb15bf | ||
![]() |
e6eac46629 | ||
![]() |
de61da16ae | ||
![]() |
bdcb395b33 | ||
![]() |
1caa7f7627 | ||
![]() |
5b4a96e3a3 | ||
![]() |
15dd23a323 | ||
![]() |
04d7fcf60d | ||
![]() |
9755cd469c | ||
![]() |
1bdadfa3e1 | ||
![]() |
20fcb88632 | ||
![]() |
6791d1b8e2 | ||
![]() |
6c8b103a7b | ||
![]() |
95d0117784 | ||
![]() |
740436ab4d | ||
![]() |
89fbf1e1d2 | ||
![]() |
c391cefd71 | ||
![]() |
52af529950 | ||
![]() |
c30cb069f5 | ||
![]() |
99a0b43f28 | ||
![]() |
af4017de49 | ||
![]() |
d804ecbd95 | ||
![]() |
1ad3382bff | ||
![]() |
9787b1cfd5 | ||
![]() |
0ac2eba4d3 | ||
![]() |
17c54c6e03 | ||
![]() |
dd14e1cebc | ||
![]() |
1e2266aa47 | ||
![]() |
472a434212 | ||
![]() |
7c226462e0 | ||
![]() |
93c6a869ec | ||
![]() |
9d914091f5 | ||
![]() |
afcc1bf512 | ||
![]() |
8a29c51b73 | ||
![]() |
d38c4c1f2d | ||
![]() |
2091df3856 | ||
![]() |
744b4dcb7c | ||
![]() |
0c64c35a8a | ||
![]() |
57acbc53fb | ||
![]() |
ac68631f4c | ||
![]() |
8163ca6821 | ||
![]() |
094e0356e8 | ||
![]() |
63450d69d3 | ||
![]() |
0952409de4 | ||
![]() |
1c54c7a1bb | ||
![]() |
f25f14351c | ||
![]() |
691e7951ea | ||
![]() |
7eaeba520a | ||
![]() |
9a5b94a340 | ||
![]() |
079b125430 | ||
![]() |
770a5a5bff | ||
![]() |
0548c9e7d5 | ||
![]() |
68a6cc5976 | ||
![]() |
2035f2f2e2 | ||
![]() |
1892a6b0c4 | ||
![]() |
b464004bb3 | ||
![]() |
ea4438284f | ||
![]() |
d050fdb17f | ||
![]() |
9003a42df3 | ||
![]() |
9e8ee491e6 | ||
![]() |
3b46345db4 | ||
![]() |
6b2a111428 | ||
![]() |
bc56971e18 | ||
![]() |
fcc0288f0c | ||
![]() |
4e03e89869 | ||
![]() |
4e17017501 | ||
![]() |
63bc86cd43 | ||
![]() |
ee32ca3efe | ||
![]() |
a393a614a1 | ||
![]() |
753e9c65a1 | ||
![]() |
409c92a68f | ||
![]() |
53a93deafc | ||
![]() |
3a374a6db5 | ||
![]() |
aec4b4af97 | ||
![]() |
2392432780 | ||
![]() |
0d5274b3b7 | ||
![]() |
42c0809216 | ||
![]() |
420311b463 | ||
![]() |
efae039ad9 | ||
![]() |
e60dfd5b23 | ||
![]() |
df45c50d0b | ||
![]() |
8f691c28f3 | ||
![]() |
a77da353f3 | ||
![]() |
70a4f59960 | ||
![]() |
ac813d5285 | ||
![]() |
5d3e7d6ffd | ||
![]() |
5b378ea648 | ||
![]() |
ea04ff5d46 | ||
![]() |
982ad7361b | ||
![]() |
10dfe2059b | ||
![]() |
61e9594f63 | ||
![]() |
2d8eaa082f | ||
![]() |
29b240e883 | ||
![]() |
e081bb3921 | ||
![]() |
ad24967d78 | ||
![]() |
90d83b4bb9 | ||
![]() |
eb3ff3f44a | ||
![]() |
db14e6099e | ||
![]() |
5aa02c0378 | ||
![]() |
73b2b30a1d | ||
![]() |
cf6b7bcb79 | ||
![]() |
4b86af839f | ||
![]() |
f434f88c0c | ||
![]() |
cdedd017d6 | ||
![]() |
a48c9d6cd9 | ||
![]() |
1039386e10 | ||
![]() |
944339f6a5 | ||
![]() |
4cfcd4bce0 | ||
![]() |
4f386e5131 | ||
![]() |
3ace913aed | ||
![]() |
8f2daed9e0 | ||
![]() |
c5dc0f4a2e | ||
![]() |
615587cd06 | ||
![]() |
df068a3649 | ||
![]() |
7967ceee98 | ||
![]() |
979bc4390a | ||
![]() |
e20e60783a | ||
![]() |
38c5a1610e | ||
![]() |
572610d01e | ||
![]() |
21b2eff334 | ||
![]() |
35388fb33c | ||
![]() |
aa5738c777 | ||
![]() |
f7ffb1790f | ||
![]() |
65e9c89ed9 | ||
![]() |
5fafaf92df | ||
![]() |
4e4b24e7a8 | ||
![]() |
542ed1d024 | ||
![]() |
eda0f45ab5 | ||
![]() |
4fdc551209 | ||
![]() |
58043cbc8b | ||
![]() |
09fa27cd09 | ||
![]() |
d8ee96c6cb | ||
![]() |
3821ed162b | ||
![]() |
1f20e82a96 | ||
![]() |
1079850621 | ||
![]() |
aab5f7c42b | ||
![]() |
f8a6c27791 | ||
![]() |
95e9fa10ef | ||
![]() |
89871e04aa | ||
![]() |
1705a26fc7 | ||
![]() |
95c924460a | ||
![]() |
97b1a8dfc8 | ||
![]() |
fbcc8fae77 | ||
![]() |
3d2cb7f1ef | ||
![]() |
fc9a24824a | ||
![]() |
383ba566bd | ||
![]() |
d200868459 | ||
![]() |
690b232258 | ||
![]() |
e078838774 | ||
![]() |
1b03dd6704 | ||
![]() |
1171c4f16d | ||
![]() |
a9f139cab6 | ||
![]() |
5ba38a4ab6 | ||
![]() |
8f5a0ec83d | ||
![]() |
bb2e8ff09a | ||
![]() |
1fe10f09d7 | ||
![]() |
328b4d24c6 | ||
![]() |
4b2d4a0169 | ||
![]() |
3564b5845e | ||
![]() |
2907b234c9 | ||
![]() |
e1ffe15d94 | ||
![]() |
1b0a3f11f9 | ||
![]() |
b202f5d094 | ||
![]() |
cd5c52b550 | ||
![]() |
46d516cb04 | ||
![]() |
4d0a886c45 | ||
![]() |
5db3eebfbb | ||
![]() |
36ee6f656a | ||
![]() |
966725fcb4 | ||
![]() |
90923903ae | ||
![]() |
191525cdb4 | ||
![]() |
2d18b18fe5 | ||
![]() |
ead62f1901 | ||
![]() |
f97b2d49f5 | ||
![]() |
827db6f7c7 | ||
![]() |
91c6a144da | ||
![]() |
cb86745245 | ||
![]() |
6b384dc8d1 | ||
![]() |
a25915f4f9 | ||
![]() |
92a7690e19 | ||
![]() |
1372690c7f | ||
![]() |
bd2ca79a48 | ||
![]() |
6d64123849 | ||
![]() |
042a95ef98 | ||
![]() |
2d3af657e7 | ||
![]() |
4ebc55f2b3 | ||
![]() |
7c80e80a92 | ||
![]() |
4c5ec5dfa8 | ||
![]() |
c995c0ad1f | ||
![]() |
d870ed4317 | ||
![]() |
9950b4de75 | ||
![]() |
7e3fbfbdd2 | ||
![]() |
ff453c1143 | ||
![]() |
efd9d467f2 | ||
![]() |
07ce981cb0 | ||
![]() |
5af848d991 | ||
![]() |
fff7da2a96 | ||
![]() |
d6fc41b73e | ||
![]() |
9d38ffa6e3 | ||
![]() |
8bcdf9ba61 | ||
![]() |
938891a2e2 | ||
![]() |
45c9786434 | ||
![]() |
cfbc4fe4d0 | ||
![]() |
dae5f06069 | ||
![]() |
1ff9bbd59c | ||
![]() |
cc838ead8b | ||
![]() |
9a123847e0 | ||
![]() |
1f0659d516 | ||
![]() |
4f31b53521 | ||
![]() |
962e1d5a69 | ||
![]() |
57f80f091f | ||
![]() |
9c79a1631d | ||
![]() |
c7853730ed | ||
![]() |
2cd78bffd9 | ||
![]() |
1597b357a1 | ||
![]() |
73524cadd4 | ||
![]() |
6fa8238ebf | ||
![]() |
1c6eef48f1 | ||
![]() |
1fdf2ac746 | ||
![]() |
3ae9feef0c | ||
![]() |
e9a8208607 | ||
![]() |
e357b4a46a | ||
![]() |
097ca01411 | ||
![]() |
e8197e8e05 | ||
![]() |
7fc6b8a746 | ||
![]() |
0fd9c00580 | ||
![]() |
4a51a1dfe5 | ||
![]() |
9fb8abf840 | ||
![]() |
449320cd23 | ||
![]() |
12b69dbabb | ||
![]() |
4652bde3d7 | ||
![]() |
9b4e1903e1 | ||
![]() |
702facbc91 | ||
![]() |
339340df34 | ||
![]() |
1ad386bc28 | ||
![]() |
28a8c714ea | ||
![]() |
c9f18bfef3 | ||
![]() |
20cd885443 | ||
![]() |
3f994646f2 | ||
![]() |
f45e7703ba | ||
![]() |
1ee0412177 | ||
![]() |
4b33f05eda | ||
![]() |
81923410f6 | ||
![]() |
f19cb6a610 | ||
![]() |
cde1a730e8 | ||
![]() |
d6efdfab4b | ||
![]() |
f7b6271d86 | ||
![]() |
8d1be7ffc0 | ||
![]() |
a0af7e94a6 | ||
![]() |
f607b03456 | ||
![]() |
644ee666f6 | ||
![]() |
ee0677a021 | ||
![]() |
0b4d80d74f | ||
![]() |
1a2b493d17 | ||
![]() |
9ceeddd952 | ||
![]() |
e1849ccbfa | ||
![]() |
6262b46928 | ||
![]() |
8752f40792 | ||
![]() |
8c5600e81b | ||
![]() |
4c1b48d0cc | ||
![]() |
536ae8430b | ||
![]() |
aaddf44d45 | ||
![]() |
0c42faf34d | ||
![]() |
be13d0f8ee | ||
![]() |
81438eebef | ||
![]() |
b70187c2d9 | ||
![]() |
c041851fa5 | ||
![]() |
b59a8b1de3 | ||
![]() |
e3b9fe7e58 | ||
![]() |
0177ab45af | ||
![]() |
bc951557e8 | ||
![]() |
2c32d94e1d | ||
![]() |
5d9e2d8d2e | ||
![]() |
0637537355 | ||
![]() |
63ed134165 | ||
![]() |
a6f464a600 | ||
![]() |
0a0c49af71 | ||
![]() |
3c6d688c87 | ||
![]() |
5d66a13397 | ||
![]() |
ff633f295e | ||
![]() |
310064601c | ||
![]() |
78799e58d2 | ||
![]() |
4fa8b74dc7 | ||
![]() |
bf8b4e9927 | ||
![]() |
f48acd8448 | ||
![]() |
d0c9d2dc7b | ||
![]() |
d9a0f2a88d | ||
![]() |
4e812410cc | ||
![]() |
0873e3812b | ||
![]() |
7eac28189b | ||
![]() |
1650c35e38 | ||
![]() |
156c478ccb | ||
![]() |
10e6eae0dd | ||
![]() |
f519093f89 | ||
![]() |
8a8ab6c673 | ||
![]() |
9e28303588 | ||
![]() |
6776329cf5 | ||
![]() |
2e4c516d43 | ||
![]() |
d920eaba4a | ||
![]() |
376a76a082 | ||
![]() |
c6d940d3b2 | ||
![]() |
95c101a0ba | ||
![]() |
239671f882 | ||
![]() |
12150c1ca7 | ||
![]() |
a251675cc0 | ||
![]() |
d188949101 | ||
![]() |
d3920ddb67 | ||
![]() |
bc5077f623 | ||
![]() |
68f3b5849a | ||
![]() |
6de3e4a07e | ||
![]() |
1fb0e8e9bb | ||
![]() |
20b8743f21 | ||
![]() |
016359ede2 | ||
![]() |
410bad88a8 | ||
![]() |
c98bab8327 | ||
![]() |
a422d6fe08 | ||
![]() |
98ee85ce82 | ||
![]() |
5a8509f895 | ||
![]() |
06770b0dd4 | ||
![]() |
af616c96d4 | ||
![]() |
f5b2d79f3b | ||
![]() |
d644993a74 | ||
![]() |
2df4ebff47 | ||
![]() |
9337d18468 | ||
![]() |
317b734dcc | ||
![]() |
e35ac9be8d | ||
![]() |
6dbb524b9f | ||
![]() |
a3f0bf3ff8 | ||
![]() |
ecf796f82b | ||
![]() |
0a4fb008f3 | ||
![]() |
79fd91ec35 | ||
![]() |
e659b07c39 | ||
![]() |
441b854d41 | ||
![]() |
c936056663 | ||
![]() |
e22bbd4b14 | ||
![]() |
103df63023 | ||
![]() |
36f2d5b0f1 | ||
![]() |
920cc15ea9 | ||
![]() |
842ff5d6aa | ||
![]() |
e1b10769e5 | ||
![]() |
4177d4f9f4 | ||
![]() |
9b64e09a24 | ||
![]() |
f5a70aa1e2 | ||
![]() |
2df35d636e | ||
![]() |
f7fd018cf8 | ||
![]() |
405aa8fb9e | ||
![]() |
0a826da330 | ||
![]() |
139bed73f8 | ||
![]() |
778f92e170 | ||
![]() |
5a43cc5cf9 | ||
![]() |
81b11929f7 | ||
![]() |
46b8624833 | ||
![]() |
76012506ff | ||
![]() |
1ab6ac2996 | ||
![]() |
c98d5448ec | ||
![]() |
cfafb0bfca | ||
![]() |
71077d582b | ||
![]() |
5eb5f72434 | ||
![]() |
7f49b5144b | ||
![]() |
e8380d11c4 | ||
![]() |
ff5a7ba9b9 | ||
![]() |
c50ae726a9 | ||
![]() |
2b59b4c793 | ||
![]() |
0249993377 | ||
![]() |
d9a9844005 | ||
![]() |
227187f1f1 | ||
![]() |
77384ffa9a | ||
![]() |
1956a6ae76 | ||
![]() |
5df5b00927 | ||
![]() |
1d280d8fa1 | ||
![]() |
9c03e78505 | ||
![]() |
4af62438f2 | ||
![]() |
0aa6d9782c | ||
![]() |
c2e72823fc | ||
![]() |
d829fa19d2 | ||
![]() |
76b6cc02d6 | ||
![]() |
8acfa0a79c | ||
![]() |
2ed7ca5b6a | ||
![]() |
5774fcdd80 | ||
![]() |
eed4dab0fc | ||
![]() |
f5bdf75f70 | ||
![]() |
1f0ce80fb4 | ||
![]() |
7c31fb2450 | ||
![]() |
11783ffdd0 | ||
![]() |
41c96921d6 | ||
![]() |
23455985cd | ||
![]() |
659c987335 | ||
![]() |
ecc1f56009 | ||
![]() |
18b9cf8a85 | ||
![]() |
934184e236 | ||
![]() |
b735bdcf2f | ||
![]() |
f692eb3677 | ||
![]() |
b1597b4291 | ||
![]() |
faa96444b5 | ||
![]() |
78c121eb10 | ||
![]() |
cb6adc45d1 | ||
![]() |
59b4b5e9e8 | ||
![]() |
ad784501a6 | ||
![]() |
68d690225a | ||
![]() |
8f716772c2 | ||
![]() |
da21f02eb9 | ||
![]() |
4ce7d3a772 | ||
![]() |
77b7ecfd04 | ||
![]() |
da1c1d9c22 | ||
![]() |
f7cd6af9c6 | ||
![]() |
678ebbb7f6 | ||
![]() |
87d6e45da5 | ||
![]() |
80c61c4b3b | ||
![]() |
4547c6e9f3 | ||
![]() |
cde622b8e1 | ||
![]() |
8b810193dd | ||
![]() |
22f019826c | ||
![]() |
7fa3f41df2 | ||
![]() |
f99a086444 | ||
![]() |
925b1aec64 | ||
![]() |
be5c2ebcb5 | ||
![]() |
ae73e9d84d | ||
![]() |
af920851ca | ||
![]() |
ea4dbdd66f | ||
![]() |
ff9753688f | ||
![]() |
b35b531f00 | ||
![]() |
6257f1195b | ||
![]() |
b252771a8f | ||
![]() |
75c3f0ffba | ||
![]() |
bd83873a7f | ||
![]() |
cea7d629d9 | ||
![]() |
1831a1dd9b | ||
![]() |
9abf6892c4 | ||
![]() |
674a48335d | ||
![]() |
db9d8fcc90 | ||
![]() |
15db18901c | ||
![]() |
4cfc21d49d | ||
![]() |
cf0a453d32 | ||
![]() |
4186833df7 | ||
![]() |
30fa764c90 | ||
![]() |
236417be38 | ||
![]() |
2641b364e8 | ||
![]() |
fb5e591bc9 | ||
![]() |
bfb46ff850 | ||
![]() |
2012eab842 | ||
![]() |
9ecb488437 | ||
![]() |
4295fdb892 | ||
![]() |
998d921d41 | ||
![]() |
d491063110 | ||
![]() |
e2bfaf0751 | ||
![]() |
f1e1a5ff06 | ||
![]() |
ef2000053a | ||
![]() |
8a7876ded5 | ||
![]() |
b50da46f43 | ||
![]() |
8b0e9706ca | ||
![]() |
1d4a5a7520 | ||
![]() |
8290e1f09a | ||
![]() |
89672fad04 | ||
![]() |
1cb9cfe11d | ||
![]() |
280e297afe | ||
![]() |
fc8de3d0c8 | ||
![]() |
3e2555667f | ||
![]() |
1ecadb6e57 | ||
![]() |
2abee91dbc | ||
![]() |
68645df3a3 | ||
![]() |
d2f79afc1a | ||
![]() |
8a6fa726d3 | ||
![]() |
a3d7ae6214 | ||
![]() |
c0c132a320 | ||
![]() |
0dfb5d3ef7 | ||
![]() |
6480a7ee4a | ||
![]() |
6cc8450f8e | ||
![]() |
7ae4b28bda | ||
![]() |
bb8e6afae6 | ||
![]() |
d7f61e48ac | ||
![]() |
9de6de5802 | ||
![]() |
6e7057426e | ||
![]() |
5306d36522 | ||
![]() |
7990182f56 | ||
![]() |
93a6be08a5 | ||
![]() |
d5d5084151 | ||
![]() |
d3cff9a962 | ||
![]() |
133bbdfefa | ||
![]() |
a8c3470cf2 | ||
![]() |
578e527869 | ||
![]() |
312f215fc3 | ||
![]() |
d639c28e3b | ||
![]() |
c3f7259cbb | ||
![]() |
56e8f98c13 | ||
![]() |
c2217373df | ||
![]() |
4a3781d7db | ||
![]() |
911a838c3a | ||
![]() |
c6106f90d4 | ||
![]() |
ed52e17886 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -86,6 +86,7 @@ src/pointer-constraints-unstable-v*-server-protocol.h
|
|||||||
src/xdg-foreign-unstable-v*-protocol.c
|
src/xdg-foreign-unstable-v*-protocol.c
|
||||||
src/xdg-foreign-unstable-v*-server-protocol.h
|
src/xdg-foreign-unstable-v*-server-protocol.h
|
||||||
src/meta/meta-version.h
|
src/meta/meta-version.h
|
||||||
|
src/libmutter-*.pc
|
||||||
doc/reference/*.args
|
doc/reference/*.args
|
||||||
doc/reference/*.bak
|
doc/reference/*.bak
|
||||||
doc/reference/*.hierarchy
|
doc/reference/*.hierarchy
|
||||||
|
146
NEWS
146
NEWS
@@ -1,3 +1,149 @@
|
|||||||
|
3.25.1
|
||||||
|
======
|
||||||
|
* Always sync window geometry on state changes [Jonas; #780292]
|
||||||
|
* Use EGL instead of GLX when drawing using GLES [Jonas; #771636]
|
||||||
|
* Fix HiDPI detection on vertical monitor layouts [Carlos; #777687]
|
||||||
|
* Get double-click timing from desktop mouse settings [Armin; #771576]
|
||||||
|
* Scale relative motion deltas with monitor scale [Jonas, Carlos; #778119]
|
||||||
|
* Use texture fallback when setting hardware cursor fails [Jente; #770020]
|
||||||
|
* Fix lock-up when using additional theme variants [Shantanu; #780254]
|
||||||
|
* Rework low-level monitor configuration [Jonas; #777732]
|
||||||
|
* Fix building with GLES2 instead of GL [Mario; #781398]
|
||||||
|
* Misc. bug fixes [Jonas, Piotr, Philip; #780304, #772218, #781242, #781391]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Jonas Ådahl, Philip Chimento, Piotr Drąg, Carlos Garnacho, Shantanu Goel,
|
||||||
|
Jente Hidskes, Armin Krezović, Rui Matos, Florian Müllner, Mario Sanchez Prada
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Yuras Shumovich [be], Yosef Or Boczko [he], Tom Tryfonidis [el],
|
||||||
|
Fabio Tomat [fur], Kukuh Syafaat [id]
|
||||||
|
|
||||||
|
3.24.0
|
||||||
|
======
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Yuri Myasoedov [ru], Rūdolfs Mazurs [lv], Jordi Mas [ca]
|
||||||
|
|
||||||
|
3.23.92
|
||||||
|
=======
|
||||||
|
* Properly handle EGLOutput acquire errors [Jonas, Miguel; #779112]
|
||||||
|
* Fix crash when a window closes during Alt+Tab [Rui; #779483]
|
||||||
|
* Implement DnD handling code in wayland [Hyungwon; #765003]
|
||||||
|
* Fix fallout from pixel conversion optimization in 3.23.91 [Carlos; #779234]
|
||||||
|
* Fix mouse input stopping to work in applications [Carlos; #763246]
|
||||||
|
* Fix DnD between QT5 and GTK3 applications on wayland [Carlos; #779757]
|
||||||
|
* Make EDID reading less fragile [Jonas; #779837]
|
||||||
|
* Add support for tablet grouping [Carlos; #779986]
|
||||||
|
* Misc. bug fixes and cleanups [Rui, Jonas; #779436, #779001, #779745]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Jonas Ådahl, Miguel A. Vico, Olivier Fourdan, Carlos Garnacho,
|
||||||
|
Hyungwon Hwang, Rui Matos
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Chao-Hsiung Liao [zh_TW], Sveinn í Felli [is], Ask Hjorth Larsen [da],
|
||||||
|
Changwoo Ryu [ko], Aurimas Černius [lt], GNOME Translation Robot [gd],
|
||||||
|
Marek Černocký [cs], Fran Dieguez [gl], Dušan Kazik [sk]
|
||||||
|
|
||||||
|
3.23.91
|
||||||
|
=======
|
||||||
|
* Give libinput read-only access to /sys [Carlos; #778472]
|
||||||
|
* Allow edge-scrolling without 2-finger-scroll capable devices [Rui; #778554]
|
||||||
|
* Fullscreen windows on the requested monitor on wayland [Rui; #772525]
|
||||||
|
* Implement threaded swap_event fallback for NVIDIA driver [Owen; #779039]
|
||||||
|
* Avoid pixel conversions when storing textures from cairo [Carlos; #779234]
|
||||||
|
* Misc. bug fixes [Piotr, Rui, Florian; #772218, #776919, #778831, #642652]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Piotr Drąg, Carlos Garnacho, Rui Matos, Florian Müllner, Owen W. Taylor
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Inaki Larranaga Murgoitio [eu], Daniel Mustieles [es], Claude Paroz [fr],
|
||||||
|
Mario Blättermann [de], Kjartan Maraas [nb], Piotr Drąg [pl],
|
||||||
|
Andika Triwidada [id], Anders Jonsson [sv], Milo Casagrande [it],
|
||||||
|
Fabio Tomat [fur], Rafael Fontenelle [pt_BR],
|
||||||
|
Мирослав Николић [sr, sr@latin], Balázs Meskó [hu], Chao-Hsiung Liao [zh_TW]
|
||||||
|
|
||||||
|
3.23.90
|
||||||
|
=======
|
||||||
|
* Fix window menu placement with HiDPI [Jonas; #776055]
|
||||||
|
* Improve EGLStream support [Jonas; #773629]
|
||||||
|
* Start moving low-level monitor configuration into mutter [Jonas; #777732]
|
||||||
|
* Fix erroneous key event repeats [Rui; #774989]
|
||||||
|
* Don't hardcode seat ID in ClutterDeviceManager [Carlos; #778092]
|
||||||
|
* Fix "ghost" cursors in multi-monitor setups [Jonas; #771056]
|
||||||
|
* Use eglGetPlatformDisplay [Adam; #772422]
|
||||||
|
* Fix erratic raise_or_lower behavior [Jose; #705200]
|
||||||
|
* Fix coordinate mapping of absolute devices [Carlos; #774115]
|
||||||
|
* Show OSD on tablet mode switches [Carlos; #771098]
|
||||||
|
* Make mutter libs parallel installable [Jonas; #777317]
|
||||||
|
* Only apply keymap when not running nested [Jonas; #777800]
|
||||||
|
* Set right scale for tablet tool cursors on HiDPI [Carlos; #778474]
|
||||||
|
* Adjust server-side shadows to match Adwaita [Juraj; #744667]
|
||||||
|
* Misc. bug fixes [Jonas, Bastien, Carlos, Peter, Lionel, Jeremy, Florian;
|
||||||
|
#774891, #777389, #777691, #778262, #776543, #778684, #778699, #744667]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Jonas Ådahl, Jeremy Bicha, Piotr Drąg, Juraj Fiala, Carlos Garnacho,
|
||||||
|
Peter Hutterer, Adam Jackson, Lionel Landwerlin, Jose Marino, Rui Matos,
|
||||||
|
Florian Müllner, Bastien Nocera
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Kjartan Maraas [nb], Mandy Wang [zh_CN], Marek Černocký [cs],
|
||||||
|
Anders Jonsson [sv], Dušan Kazik [sk], Piotr Drąg [pl], Matej Urbančič [sl]
|
||||||
|
|
||||||
|
3.23.3
|
||||||
|
======
|
||||||
|
* Fix frequent freezes in multihead setups on wayland [Rui; #774557]
|
||||||
|
* Preserve root window mask on XSelectionRequest [Olivier; #776128]
|
||||||
|
* Misc. bug fixes [Carlos, Florian, Rui, Olivier; #775478, #774891, #775986,
|
||||||
|
#776036]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Olivier Fourdan, Carlos Garnacho, Rui Matos, Florian Müllner
|
||||||
|
|
||||||
|
3.23.2
|
||||||
|
======
|
||||||
|
* Stack docks below other windows on fullscreen monitors [Rui; #772937]
|
||||||
|
* Fix popup grabs blocking screen lock on wayland [Rui; #771235]
|
||||||
|
* Handle touchpad pinch gestures with more than two fingers [Carlos; #765937]
|
||||||
|
* Implement drawing tablet support on X11 [Carlos; #773779]
|
||||||
|
* Fix some Wine games starting minimized [Carlos; #774333]
|
||||||
|
* Fix switching between two finger- and edge scrolling on wayland [Rui; #771744]
|
||||||
|
* Implement support for EGLStream/EGLDevice [Jonas; #773629]
|
||||||
|
* Add size_changed vfunc to handle async client size changes [Rui; #770345]
|
||||||
|
* Change focus window on clicks with any modifiers [Rui; #746642]
|
||||||
|
* Misc. bug fixes and cleanups [Carlos, Daniel, Jonas, Rui; #771067, #774330, #774613,
|
||||||
|
#771297, #774135, #774827, #774923]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Jonas Ådahl, Carlos Garnacho, Rui Matos, Florian Müllner, Daniel Stone
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Kjartan Maraas [nb]
|
||||||
|
|
||||||
|
3.23.1
|
||||||
|
======
|
||||||
|
* Fix handling of Escape shortcut in force-quit dialog [Landry; #737109]
|
||||||
|
* Improve pointer constraints support [Jonas; #771859]
|
||||||
|
* Really fix framebuffer capture origin offset [Rui; #771502]
|
||||||
|
* Fix session going into idle mode immediately on startup [Rui; #772839]
|
||||||
|
* Fix mirror mode with stage views [Rui; #773115]
|
||||||
|
* Fall back to X with connectors spread across multiple GPUs [Ray; #771442]
|
||||||
|
* Fix various crashes on wayland [Jonas, Carlos; #771646, #771858, #772929]
|
||||||
|
* Fix various placement issues on wayland [Olivier, Jonas, Sjoerd; #772729,
|
||||||
|
#768039, #771841, #771841, #773141]
|
||||||
|
* Misc. bug fixes [Rui, Jonas, Olivier; #771019, #773116, #772914, #773210]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Jonas Ådahl, Olivier Fourdan, Carlos Garnacho, Rui Matos, Landry MINOZA,
|
||||||
|
Sjoerd Simons, Ray Strode
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Theppitak Karoonboonyanan [th], Kjartan Maraas [nb], Hannie Dumoleyn [nl],
|
||||||
|
liushuyu [zh_CN]
|
||||||
|
|
||||||
3.22.1
|
3.22.1
|
||||||
======
|
======
|
||||||
* Fix feedback loop between StClipboard and X11 bridge [Carlos; #760745]
|
* Fix feedback loop between StClipboard and X11 bridge [Carlos; #760745]
|
||||||
|
25
autogen.sh
25
autogen.sh
@@ -6,16 +6,23 @@ test -z "$srcdir" && srcdir=.
|
|||||||
|
|
||||||
REQUIRED_AUTOMAKE_VERSION=1.11
|
REQUIRED_AUTOMAKE_VERSION=1.11
|
||||||
|
|
||||||
(test -f $srcdir/configure.ac \
|
olddir="$(pwd)"
|
||||||
&& test -d $srcdir/src) || {
|
|
||||||
|
cd "${srcdir}"
|
||||||
|
|
||||||
|
(test -f configure.ac \
|
||||||
|
&& test -d src) || {
|
||||||
echo -n "**Error**: Directory "\`$srcdir\'" does not look like the"
|
echo -n "**Error**: Directory "\`$srcdir\'" does not look like the"
|
||||||
echo " top-level metacity directory"
|
echo " top-level mutter directory"
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
which gnome-autogen.sh || {
|
aclocal --install || exit 1
|
||||||
echo "You need to install gnome-common from GNOME Subversion (or from"
|
intltoolize --force --copy --automake || exit 1
|
||||||
echo "your distribution's package manager)."
|
autoreconf --verbose --force --install || exit 1
|
||||||
exit 1
|
|
||||||
}
|
cd "${olddir}"
|
||||||
. gnome-autogen.sh
|
|
||||||
|
if [ "$NOCONFIGURE" = "" ]; then
|
||||||
|
"${srcdir}/configure" "$@" || exit 1
|
||||||
|
fi
|
||||||
|
@@ -25,6 +25,7 @@ AM_CPPFLAGS = \
|
|||||||
-I$(top_builddir)/clutter \
|
-I$(top_builddir)/clutter \
|
||||||
-I$(top_srcdir)/../cogl \
|
-I$(top_srcdir)/../cogl \
|
||||||
-I$(top_builddir)/../cogl \
|
-I$(top_builddir)/../cogl \
|
||||||
|
-I$(top_builddir)/../cogl/cogl \
|
||||||
$(CLUTTER_DEPRECATED_CFLAGS) \
|
$(CLUTTER_DEPRECATED_CFLAGS) \
|
||||||
$(CLUTTER_DEBUG_CFLAGS) \
|
$(CLUTTER_DEBUG_CFLAGS) \
|
||||||
$(CLUTTER_HIDDEN_VISIBILITY_CFLAGS) \
|
$(CLUTTER_HIDDEN_VISIBILITY_CFLAGS) \
|
||||||
@@ -36,7 +37,7 @@ AM_CFLAGS = $(CLUTTER_CFLAGS) $(MAINTAINER_CFLAGS)
|
|||||||
INTROSPECTION_GIRS =
|
INTROSPECTION_GIRS =
|
||||||
|
|
||||||
# the base include path for headers
|
# the base include path for headers
|
||||||
clutter_base_includedir = $(includedir)/mutter/clutter-$(CLUTTER_API_VERSION)
|
clutter_base_includedir = $(includedir)/mutter/clutter-$(LIBMUTTER_API_VERSION)
|
||||||
clutter_includedir = $(clutter_base_includedir)/clutter
|
clutter_includedir = $(clutter_base_includedir)/clutter
|
||||||
clutter_deprecateddir = $(clutter_base_includedir)/clutter/deprecated
|
clutter_deprecateddir = $(clutter_base_includedir)/clutter/deprecated
|
||||||
|
|
||||||
@@ -112,7 +113,6 @@ source_h = \
|
|||||||
clutter-snap-constraint.h \
|
clutter-snap-constraint.h \
|
||||||
clutter-stage.h \
|
clutter-stage.h \
|
||||||
clutter-stage-manager.h \
|
clutter-stage-manager.h \
|
||||||
clutter-stage-view.h \
|
|
||||||
clutter-tap-action.h \
|
clutter-tap-action.h \
|
||||||
clutter-test-utils.h \
|
clutter-test-utils.h \
|
||||||
clutter-texture.h \
|
clutter-texture.h \
|
||||||
@@ -198,7 +198,6 @@ source_c = \
|
|||||||
clutter-snap-constraint.c \
|
clutter-snap-constraint.c \
|
||||||
clutter-stage.c \
|
clutter-stage.c \
|
||||||
clutter-stage-manager.c \
|
clutter-stage-manager.c \
|
||||||
clutter-stage-view.c \
|
|
||||||
clutter-stage-window.c \
|
clutter-stage-window.c \
|
||||||
clutter-tap-action.c \
|
clutter-tap-action.c \
|
||||||
clutter-test-utils.c \
|
clutter-test-utils.c \
|
||||||
@@ -240,6 +239,7 @@ source_h_priv = \
|
|||||||
clutter-settings-private.h \
|
clutter-settings-private.h \
|
||||||
clutter-stage-manager-private.h \
|
clutter-stage-manager-private.h \
|
||||||
clutter-stage-private.h \
|
clutter-stage-private.h \
|
||||||
|
clutter-stage-view.h \
|
||||||
clutter-stage-window.h \
|
clutter-stage-window.h \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
@@ -248,6 +248,7 @@ source_c_priv = \
|
|||||||
clutter-easing.c \
|
clutter-easing.c \
|
||||||
clutter-event-translator.c \
|
clutter-event-translator.c \
|
||||||
clutter-id-pool.c \
|
clutter-id-pool.c \
|
||||||
|
clutter-stage-view.c \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
# deprecated installed headers
|
# deprecated installed headers
|
||||||
@@ -355,7 +356,7 @@ EXTRA_DIST += clutter-version.h.in clutter-version.h
|
|||||||
# key symbol update script
|
# key symbol update script
|
||||||
EXTRA_DIST += clutter-keysyms-update.pl
|
EXTRA_DIST += clutter-keysyms-update.pl
|
||||||
|
|
||||||
pc_files += mutter-clutter-$(CLUTTER_API_VERSION).pc
|
pc_files += mutter-clutter-$(LIBMUTTER_API_VERSION).pc
|
||||||
|
|
||||||
# in order to be compatible with Clutter < 1.10, when we shipped a single
|
# in order to be compatible with Clutter < 1.10, when we shipped a single
|
||||||
# shared library whose name was determined by the single backend it
|
# shared library whose name was determined by the single backend it
|
||||||
@@ -413,11 +414,13 @@ x11_source_c_priv = \
|
|||||||
x11_source_c += \
|
x11_source_c += \
|
||||||
x11/clutter-device-manager-xi2.c \
|
x11/clutter-device-manager-xi2.c \
|
||||||
x11/clutter-input-device-xi2.c \
|
x11/clutter-input-device-xi2.c \
|
||||||
|
x11/clutter-input-device-tool-xi2.c \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
x11_source_h_priv += \
|
x11_source_h_priv += \
|
||||||
x11/clutter-device-manager-xi2.h \
|
x11/clutter-device-manager-xi2.h \
|
||||||
x11/clutter-input-device-xi2.h \
|
x11/clutter-input-device-xi2.h \
|
||||||
|
x11/clutter-input-device-tool-xi2.h \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
x11_source_c += \
|
x11_source_c += \
|
||||||
@@ -439,10 +442,10 @@ x11_introspection = $(x11_source_c) $(x11_source_h)
|
|||||||
clutterx11_includedir = $(clutter_includedir)/x11
|
clutterx11_includedir = $(clutter_includedir)/x11
|
||||||
clutterx11_include_HEADERS = $(x11_source_h)
|
clutterx11_include_HEADERS = $(x11_source_h)
|
||||||
|
|
||||||
mutter-clutter-x11-$(CLUTTER_API_VERSION).pc: mutter-clutter-$(CLUTTER_API_VERSION).pc
|
mutter-clutter-x11-@LIBMUTTER_API_VERSION@.pc: mutter-clutter-$(LIBMUTTER_API_VERSION).pc
|
||||||
$(QUIET_GEN)cp -f $< $(@F)
|
$(QUIET_GEN)cp -f $< $(@F)
|
||||||
|
|
||||||
pc_files += mutter-clutter-x11-$(CLUTTER_API_VERSION).pc
|
pc_files += mutter-clutter-x11-$(LIBMUTTER_API_VERSION).pc
|
||||||
|
|
||||||
# Shared cogl backend files
|
# Shared cogl backend files
|
||||||
cogl_source_h =
|
cogl_source_h =
|
||||||
@@ -580,17 +583,17 @@ nodist_clutter_include_HEADERS = clutter-config.h $(built_source_h)
|
|||||||
clutter_deprecated_HEADERS = $(deprecated_h)
|
clutter_deprecated_HEADERS = $(deprecated_h)
|
||||||
|
|
||||||
mutterlibdir = $(libdir)/mutter
|
mutterlibdir = $(libdir)/mutter
|
||||||
mutterlib_LTLIBRARIES = libmutter-clutter-@CLUTTER_API_VERSION@.la
|
mutterlib_LTLIBRARIES = libmutter-clutter-@LIBMUTTER_API_VERSION@.la
|
||||||
|
|
||||||
libmutter_clutter_@CLUTTER_API_VERSION@_la_LIBADD = \
|
libmutter_clutter_@LIBMUTTER_API_VERSION@_la_LIBADD = \
|
||||||
$(LIBM) \
|
$(LIBM) \
|
||||||
$(CLUTTER_LIBS) \
|
$(CLUTTER_LIBS) \
|
||||||
$(top_builddir)/../cogl/cogl/libmutter-cogl.la \
|
$(top_builddir)/../cogl/cogl/libmutter-cogl-$(LIBMUTTER_API_VERSION).la \
|
||||||
$(top_builddir)/../cogl/cogl-pango/libmutter-cogl-pango.la \
|
$(top_builddir)/../cogl/cogl-pango/libmutter-cogl-pango-$(LIBMUTTER_API_VERSION).la \
|
||||||
$(top_builddir)/../cogl/cogl-path/libmutter-cogl-path.la \
|
$(top_builddir)/../cogl/cogl-path/libmutter-cogl-path-$(LIBMUTTER_API_VERSION).la \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
libmutter_clutter_@CLUTTER_API_VERSION@_la_SOURCES = \
|
libmutter_clutter_@LIBMUTTER_API_VERSION@_la_SOURCES = \
|
||||||
$(backend_source_c) \
|
$(backend_source_c) \
|
||||||
$(backend_source_h) \
|
$(backend_source_h) \
|
||||||
$(backend_source_c_priv) \
|
$(backend_source_c_priv) \
|
||||||
@@ -608,12 +611,12 @@ libmutter_clutter_@CLUTTER_API_VERSION@_la_SOURCES = \
|
|||||||
$(cally_sources_private) \
|
$(cally_sources_private) \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
nodist_libmutter_clutter_@CLUTTER_API_VERSION@_la_SOURCES = \
|
nodist_libmutter_clutter_@LIBMUTTER_API_VERSION@_la_SOURCES = \
|
||||||
$(backend_source_built) \
|
$(backend_source_built) \
|
||||||
$(built_source_c) \
|
$(built_source_c) \
|
||||||
$(built_source_h)
|
$(built_source_h)
|
||||||
|
|
||||||
libmutter_clutter_@CLUTTER_API_VERSION@_la_LDFLAGS = \
|
libmutter_clutter_@LIBMUTTER_API_VERSION@_la_LDFLAGS = \
|
||||||
$(CLUTTER_LINK_FLAGS) \
|
$(CLUTTER_LINK_FLAGS) \
|
||||||
$(CLUTTER_LT_LDFLAGS) \
|
$(CLUTTER_LT_LDFLAGS) \
|
||||||
-export-dynamic \
|
-export-dynamic \
|
||||||
@@ -627,13 +630,13 @@ install-exec-local:
|
|||||||
rm -f $$lib.0.$(CLUTTER_LT_CURRENT).$(CLUTTER_LT_REVISION); \
|
rm -f $$lib.0.$(CLUTTER_LT_CURRENT).$(CLUTTER_LT_REVISION); \
|
||||||
) ; \
|
) ; \
|
||||||
(cd $(DESTDIR)$(mutterlibdir) && \
|
(cd $(DESTDIR)$(mutterlibdir) && \
|
||||||
{ ln -s -f libmutter-clutter-$(CLUTTER_API_VERSION).so.0.$(CLUTTER_LT_CURRENT).$(CLUTTER_LT_REVISION) $$lib.0 || \
|
{ ln -s -f libmutter-clutter-$(LIBMUTTER_API_VERSION).so.0.$(CLUTTER_LT_CURRENT).$(CLUTTER_LT_REVISION) $$lib.0 || \
|
||||||
{ rm -f $$lib.0 && ln -s libmutter-clutter-1.0.so.0.$(CLUTTER_LT_CURRENT).$(CLUTTER_LT_REVISION) $$lib.0; }; \
|
{ rm -f $$lib.0 && ln -s libmutter-clutter-$(LIBMUTTER_API_VERSION).so.0.$(CLUTTER_LT_CURRENT).$(CLUTTER_LT_REVISION) $$lib.0; }; \
|
||||||
} \
|
} \
|
||||||
) ; \
|
) ; \
|
||||||
(cd $(DESTDIR)$(mutterlibdir) && \
|
(cd $(DESTDIR)$(mutterlibdir) && \
|
||||||
{ ln -s -f libmutter-clutter-$(CLUTTER_API_VERSION).so.0.$(CLUTTER_LT_CURRENT).$(CLUTTER_LT_REVISION) $$lib || \
|
{ ln -s -f libmutter-clutter-$(LIBMUTTER_API_VERSION).so.0.$(CLUTTER_LT_CURRENT).$(CLUTTER_LT_REVISION) $$lib || \
|
||||||
{ rm -f $$lib && ln -s libmutter-clutter-1.0.so.0.$(CLUTTER_LT_CURRENT).$(CLUTTER_LT_REVISION) $$lib; }; \
|
{ rm -f $$lib && ln -s libmutter-clutter-$(LIBMUTTER_API_VERSION).so.0.$(CLUTTER_LT_CURRENT).$(CLUTTER_LT_REVISION) $$lib; }; \
|
||||||
} \
|
} \
|
||||||
) ; \
|
) ; \
|
||||||
done
|
done
|
||||||
@@ -641,59 +644,65 @@ install-exec-local:
|
|||||||
# gobject-introspection rules
|
# gobject-introspection rules
|
||||||
-include $(INTROSPECTION_MAKEFILE)
|
-include $(INTROSPECTION_MAKEFILE)
|
||||||
|
|
||||||
INTROSPECTION_SCANNER_ARGS = --add-include-path=$(top_builddir)/../cogl/cogl --add-include-path=$(top_builddir)/../cogl/cogl-pango
|
INTROSPECTION_SCANNER_ARGS = \
|
||||||
INTROSPECTION_COMPILER_ARGS = --includedir=$(top_builddir)/../cogl/cogl --includedir=$(top_builddir)/../cogl/cogl-pango
|
--add-include-path=$(top_builddir)/../cogl/cogl \
|
||||||
|
--add-include-path=$(top_builddir)/../cogl/cogl-pango
|
||||||
|
INTROSPECTION_COMPILER_ARGS = \
|
||||||
|
--includedir=$(top_builddir)/../cogl/cogl \
|
||||||
|
--includedir=$(top_builddir)/../cogl/cogl-pango
|
||||||
|
INTROSPECTION_SCANNER_ENV = \
|
||||||
|
PKG_CONFIG_PATH=$(top_builddir)/../cogl/cogl/:$(top_builddir)/../cogl/cogl-pango/:$${PKG_CONFIG_PATH}
|
||||||
|
|
||||||
Clutter-@CLUTTER_API_VERSION@.gir: libmutter-clutter-@CLUTTER_API_VERSION@.la Makefile
|
Clutter-@LIBMUTTER_API_VERSION@.gir: libmutter-clutter-@LIBMUTTER_API_VERSION@.la Makefile
|
||||||
|
|
||||||
Clutter_@CLUTTER_API_VERSION_AM@_gir_NAMESPACE = Clutter
|
Clutter_@LIBMUTTER_API_VERSION@_gir_NAMESPACE = Clutter
|
||||||
Clutter_@CLUTTER_API_VERSION_AM@_gir_VERSION = @CLUTTER_API_VERSION@
|
Clutter_@LIBMUTTER_API_VERSION@_gir_VERSION = @LIBMUTTER_API_VERSION@
|
||||||
Clutter_@CLUTTER_API_VERSION_AM@_gir_LIBS = libmutter-clutter-@CLUTTER_API_VERSION@.la
|
Clutter_@LIBMUTTER_API_VERSION@_gir_LIBS = libmutter-clutter-@LIBMUTTER_API_VERSION@.la
|
||||||
Clutter_@CLUTTER_API_VERSION_AM@_gir_FILES = \
|
Clutter_@LIBMUTTER_API_VERSION@_gir_FILES = \
|
||||||
$(clutter_include_HEADERS) \
|
$(clutter_include_HEADERS) \
|
||||||
$(clutter_deprecated_HEADERS) \
|
$(clutter_deprecated_HEADERS) \
|
||||||
$(nodist_clutter_include_HEADERS) \
|
$(nodist_clutter_include_HEADERS) \
|
||||||
$(source_c) \
|
$(source_c) \
|
||||||
$(deprecated_c) \
|
$(deprecated_c) \
|
||||||
$(built_source_c)
|
$(built_source_c)
|
||||||
Clutter_@CLUTTER_API_VERSION_AM@_gir_CFLAGS = $(AM_CPPFLAGS) $(CLUTTER_CFLAGS)
|
Clutter_@LIBMUTTER_API_VERSION@_gir_CFLAGS = $(AM_CPPFLAGS) $(CLUTTER_CFLAGS)
|
||||||
Clutter_@CLUTTER_API_VERSION_AM@_gir_INCLUDES = GL-1.0 GObject-2.0 cairo-1.0 Cogl-1.0 CoglPango-1.0 Atk-1.0 Json-1.0
|
Clutter_@LIBMUTTER_API_VERSION@_gir_INCLUDES = GL-1.0 GObject-2.0 cairo-1.0 Cogl-@LIBMUTTER_API_VERSION@ CoglPango-@LIBMUTTER_API_VERSION@ Atk-1.0 Json-1.0
|
||||||
Clutter_@CLUTTER_API_VERSION_AM@_gir_SCANNERFLAGS = \
|
Clutter_@LIBMUTTER_API_VERSION@_gir_SCANNERFLAGS = \
|
||||||
--warn-all \
|
--warn-all \
|
||||||
--c-include='clutter/clutter.h' \
|
--c-include='clutter/clutter.h' \
|
||||||
--pkg-export=mutter-clutter-@CLUTTER_API_VERSION@
|
--pkg-export=mutter-clutter-@LIBMUTTER_API_VERSION@
|
||||||
|
|
||||||
INTROSPECTION_GIRS += Clutter-@CLUTTER_API_VERSION@.gir
|
INTROSPECTION_GIRS += Clutter-@LIBMUTTER_API_VERSION@.gir
|
||||||
|
|
||||||
Cally-@CLUTTER_API_VERSION@.gir: Makefile Clutter-@CLUTTER_API_VERSION@.gir
|
Cally-@LIBMUTTER_API_VERSION@.gir: Makefile Clutter-@LIBMUTTER_API_VERSION@.gir
|
||||||
|
|
||||||
Cally_@CLUTTER_API_VERSION_AM@_gir_NAMESPACE = Cally
|
Cally_@LIBMUTTER_API_VERSION@_gir_NAMESPACE = Cally
|
||||||
Cally_@CLUTTER_API_VERSION_AM@_gir_VERSION = @CLUTTER_API_VERSION@
|
Cally_@LIBMUTTER_API_VERSION@_gir_VERSION = @LIBMUTTER_API_VERSION@
|
||||||
Cally_@CLUTTER_API_VERSION_AM@_gir_LIBS = libmutter-clutter-@CLUTTER_API_VERSION@.la
|
Cally_@LIBMUTTER_API_VERSION@_gir_LIBS = libmutter-clutter-@LIBMUTTER_API_VERSION@.la
|
||||||
Cally_@CLUTTER_API_VERSION_AM@_gir_FILES = $(cally_sources_h) $(cally_sources_c)
|
Cally_@LIBMUTTER_API_VERSION@_gir_FILES = $(cally_sources_h) $(cally_sources_c)
|
||||||
Cally_@CLUTTER_API_VERSION_AM@_gir_CFLAGS = $(AM_CPPFLAGS) $(CLUTTER_CFLAGS)
|
Cally_@LIBMUTTER_API_VERSION@_gir_CFLAGS = $(AM_CPPFLAGS) $(CLUTTER_CFLAGS)
|
||||||
Cally_@CLUTTER_API_VERSION_AM@_gir_SCANNERFLAGS = \
|
Cally_@LIBMUTTER_API_VERSION@_gir_SCANNERFLAGS = \
|
||||||
--warn-all \
|
--warn-all \
|
||||||
--c-include='cally/cally.h' \
|
--c-include='cally/cally.h' \
|
||||||
--pkg-export=mutter-cally-@CLUTTER_API_VERSION@ \
|
--pkg-export=mutter-cally-@LIBMUTTER_API_VERSION@ \
|
||||||
--include-uninstalled=$(top_builddir)/clutter/Clutter-@CLUTTER_API_VERSION@.gir
|
--include-uninstalled=$(top_builddir)/clutter/Clutter-@LIBMUTTER_API_VERSION@.gir
|
||||||
|
|
||||||
INTROSPECTION_GIRS += Cally-@CLUTTER_API_VERSION@.gir
|
INTROSPECTION_GIRS += Cally-@LIBMUTTER_API_VERSION@.gir
|
||||||
|
|
||||||
ClutterX11-@CLUTTER_API_VERSION@.gir: Makefile Clutter-@CLUTTER_API_VERSION@.gir
|
ClutterX11-@LIBMUTTER_API_VERSION@.gir: Makefile Clutter-@LIBMUTTER_API_VERSION@.gir
|
||||||
|
|
||||||
ClutterX11_@CLUTTER_API_VERSION_AM@_gir_NAMESPACE = ClutterX11
|
ClutterX11_@LIBMUTTER_API_VERSION@_gir_NAMESPACE = ClutterX11
|
||||||
ClutterX11_@CLUTTER_API_VERSION_AM@_gir_INCLUDES = xlib-2.0
|
ClutterX11_@LIBMUTTER_API_VERSION@_gir_INCLUDES = xlib-2.0
|
||||||
ClutterX11_@CLUTTER_API_VERSION_AM@_gir_LIBS = libmutter-clutter-@CLUTTER_API_VERSION@.la
|
ClutterX11_@LIBMUTTER_API_VERSION@_gir_LIBS = libmutter-clutter-@LIBMUTTER_API_VERSION@.la
|
||||||
ClutterX11_@CLUTTER_API_VERSION_AM@_gir_FILES = $(x11_introspection)
|
ClutterX11_@LIBMUTTER_API_VERSION@_gir_FILES = $(x11_introspection)
|
||||||
ClutterX11_@CLUTTER_API_VERSION_AM@_gir_CFLAGS = $(AM_CPPFLAGS) $(CLUTTER_CFLAGS)
|
ClutterX11_@LIBMUTTER_API_VERSION@_gir_CFLAGS = $(AM_CPPFLAGS) $(CLUTTER_CFLAGS)
|
||||||
ClutterX11_@CLUTTER_API_VERSION_AM@_gir_SCANNERFLAGS = \
|
ClutterX11_@LIBMUTTER_API_VERSION@_gir_SCANNERFLAGS = \
|
||||||
--warn-all \
|
--warn-all \
|
||||||
--c-include='clutter/x11/clutter-x11.h' \
|
--c-include='clutter/x11/clutter-x11.h' \
|
||||||
--pkg-export=mutter-clutter-x11-@CLUTTER_API_VERSION@ \
|
--pkg-export=mutter-clutter-x11-@LIBMUTTER_API_VERSION@ \
|
||||||
--include-uninstalled=$(top_builddir)/clutter/Clutter-@CLUTTER_API_VERSION@.gir
|
--include-uninstalled=$(top_builddir)/clutter/Clutter-@LIBMUTTER_API_VERSION@.gir
|
||||||
|
|
||||||
INTROSPECTION_GIRS += ClutterX11-@CLUTTER_API_VERSION@.gir
|
INTROSPECTION_GIRS += ClutterX11-@LIBMUTTER_API_VERSION@.gir
|
||||||
|
|
||||||
# INTROSPECTION_GIRDIR/INTROSPECTION_TYPELIBDIR aren't the right place to
|
# INTROSPECTION_GIRDIR/INTROSPECTION_TYPELIBDIR aren't the right place to
|
||||||
# install anything - we need to install inside our prefix.
|
# install anything - we need to install inside our prefix.
|
||||||
|
@@ -43,10 +43,9 @@ $(marshal_h): stamp-marshal
|
|||||||
@true
|
@true
|
||||||
|
|
||||||
$(marshal_c): $(marshal_h)
|
$(marshal_c): $(marshal_h)
|
||||||
$(AM_V_GEN)(echo "#include \"$(marshal_h)\"" ; \
|
$(AM_V_GEN)$(GLIB_GENMARSHAL) \
|
||||||
$(GLIB_GENMARSHAL) \
|
|
||||||
--prefix=$(glib_marshal_prefix) \
|
--prefix=$(glib_marshal_prefix) \
|
||||||
--body \
|
--body \
|
||||||
$(marshal_list)) > xgen-mc \
|
$(marshal_list) > xgen-mc \
|
||||||
&& cp xgen-mc $(marshal_c) \
|
&& (cmp -s xgen-mc $(marshal_c) || cp -f xgen-mc $(marshal_c)) \
|
||||||
&& rm -f xgen-mc
|
&& rm -f xgen-mc
|
||||||
|
@@ -781,7 +781,7 @@ _cally_actor_get_top_level_origin (ClutterActor *actor,
|
|||||||
"position of the stage");
|
"position of the stage");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#else
|
#endif
|
||||||
{
|
{
|
||||||
static gboolean yet_warned = FALSE;
|
static gboolean yet_warned = FALSE;
|
||||||
|
|
||||||
@@ -793,7 +793,6 @@ _cally_actor_get_top_level_origin (ClutterActor *actor,
|
|||||||
"atk_component_get_extents() with ATK_XY_SCREEN.");
|
"atk_component_get_extents() with ATK_XY_SCREEN.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
if (xp)
|
if (xp)
|
||||||
*xp = x;
|
*xp = x;
|
||||||
|
@@ -283,9 +283,6 @@ void _clutter_actor_queue_redraw_full
|
|||||||
ClutterPaintVolume *volume,
|
ClutterPaintVolume *volume,
|
||||||
ClutterEffect *effect);
|
ClutterEffect *effect);
|
||||||
|
|
||||||
ClutterPaintVolume * _clutter_actor_get_queue_redraw_clip (ClutterActor *self);
|
|
||||||
void _clutter_actor_set_queue_redraw_clip (ClutterActor *self,
|
|
||||||
ClutterPaintVolume *clip_volume);
|
|
||||||
void _clutter_actor_finish_queue_redraw (ClutterActor *self,
|
void _clutter_actor_finish_queue_redraw (ClutterActor *self,
|
||||||
ClutterPaintVolume *clip);
|
ClutterPaintVolume *clip);
|
||||||
|
|
||||||
|
@@ -840,6 +840,7 @@ struct _ClutterActorPrivate
|
|||||||
guint needs_compute_expand : 1;
|
guint needs_compute_expand : 1;
|
||||||
guint needs_x_expand : 1;
|
guint needs_x_expand : 1;
|
||||||
guint needs_y_expand : 1;
|
guint needs_y_expand : 1;
|
||||||
|
guint needs_paint_volume_update : 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum
|
enum
|
||||||
@@ -2619,6 +2620,7 @@ clutter_actor_real_allocate (ClutterActor *self,
|
|||||||
g_object_freeze_notify (G_OBJECT (self));
|
g_object_freeze_notify (G_OBJECT (self));
|
||||||
|
|
||||||
changed = clutter_actor_set_allocation_internal (self, box, flags);
|
changed = clutter_actor_set_allocation_internal (self, box, flags);
|
||||||
|
priv->needs_paint_volume_update = changed;
|
||||||
|
|
||||||
/* we allocate our children before we notify changes in our geometry,
|
/* we allocate our children before we notify changes in our geometry,
|
||||||
* so that people connecting to properties will be able to get valid
|
* so that people connecting to properties will be able to get valid
|
||||||
@@ -2641,9 +2643,12 @@ clutter_actor_real_allocate (ClutterActor *self,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_clutter_actor_signal_queue_redraw (ClutterActor *self,
|
_clutter_actor_propagate_queue_redraw (ClutterActor *self,
|
||||||
ClutterActor *origin)
|
ClutterActor *origin,
|
||||||
|
ClutterPaintVolume *pv)
|
||||||
{
|
{
|
||||||
|
gboolean stop = FALSE;
|
||||||
|
|
||||||
/* no point in queuing a redraw on a destroyed actor */
|
/* no point in queuing a redraw on a destroyed actor */
|
||||||
if (CLUTTER_ACTOR_IN_DESTRUCTION (self))
|
if (CLUTTER_ACTOR_IN_DESTRUCTION (self))
|
||||||
return;
|
return;
|
||||||
@@ -2652,19 +2657,33 @@ _clutter_actor_signal_queue_redraw (ClutterActor *self,
|
|||||||
* the actor bas been cloned. In this case the clone will need to
|
* the actor bas been cloned. In this case the clone will need to
|
||||||
* receive the signal so it can queue its own redraw.
|
* receive the signal so it can queue its own redraw.
|
||||||
*/
|
*/
|
||||||
|
while (self)
|
||||||
|
{
|
||||||
|
_clutter_actor_queue_redraw_on_clones (self);
|
||||||
|
|
||||||
_clutter_actor_queue_redraw_on_clones (self);
|
/* calls klass->queue_redraw in default handler */
|
||||||
|
if (g_signal_has_handler_pending (self, actor_signals[QUEUE_REDRAW],
|
||||||
|
0, TRUE))
|
||||||
|
{
|
||||||
|
g_signal_emit (self, actor_signals[QUEUE_REDRAW], 0, origin, pv, &stop);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
stop = CLUTTER_ACTOR_GET_CLASS (self)->queue_redraw (self, origin, pv);
|
||||||
|
}
|
||||||
|
|
||||||
/* calls klass->queue_redraw in default handler */
|
if (stop)
|
||||||
g_signal_emit (self, actor_signals[QUEUE_REDRAW], 0, origin);
|
break;
|
||||||
|
|
||||||
|
self = clutter_actor_get_parent (self);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static gboolean
|
||||||
clutter_actor_real_queue_redraw (ClutterActor *self,
|
clutter_actor_real_queue_redraw (ClutterActor *self,
|
||||||
ClutterActor *origin)
|
ClutterActor *origin,
|
||||||
|
ClutterPaintVolume *paint_volume)
|
||||||
{
|
{
|
||||||
ClutterActor *parent;
|
|
||||||
|
|
||||||
CLUTTER_NOTE (PAINT, "Redraw queued on '%s' (from: '%s')",
|
CLUTTER_NOTE (PAINT, "Redraw queued on '%s' (from: '%s')",
|
||||||
_clutter_actor_get_debug_name (self),
|
_clutter_actor_get_debug_name (self),
|
||||||
origin != NULL ? _clutter_actor_get_debug_name (origin)
|
origin != NULL ? _clutter_actor_get_debug_name (origin)
|
||||||
@@ -2672,13 +2691,14 @@ clutter_actor_real_queue_redraw (ClutterActor *self,
|
|||||||
|
|
||||||
/* no point in queuing a redraw on a destroyed actor */
|
/* no point in queuing a redraw on a destroyed actor */
|
||||||
if (CLUTTER_ACTOR_IN_DESTRUCTION (self))
|
if (CLUTTER_ACTOR_IN_DESTRUCTION (self))
|
||||||
return;
|
return TRUE;
|
||||||
|
|
||||||
/* If the queue redraw is coming from a child then the actor has
|
/* If the queue redraw is coming from a child then the actor has
|
||||||
become dirty and any queued effect is no longer valid */
|
become dirty and any queued effect is no longer valid */
|
||||||
if (self != origin)
|
if (self != origin)
|
||||||
{
|
{
|
||||||
self->priv->is_dirty = TRUE;
|
self->priv->is_dirty = TRUE;
|
||||||
|
self->priv->needs_paint_volume_update = TRUE;
|
||||||
self->priv->effect_to_redraw = NULL;
|
self->priv->effect_to_redraw = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2687,7 +2707,7 @@ clutter_actor_real_queue_redraw (ClutterActor *self,
|
|||||||
* won't change so we don't have to propagate up the hierarchy.
|
* won't change so we don't have to propagate up the hierarchy.
|
||||||
*/
|
*/
|
||||||
if (!CLUTTER_ACTOR_IS_VISIBLE (self))
|
if (!CLUTTER_ACTOR_IS_VISIBLE (self))
|
||||||
return;
|
return TRUE;
|
||||||
|
|
||||||
/* Although we could determine here that a full stage redraw
|
/* Although we could determine here that a full stage redraw
|
||||||
* has already been queued and immediately bail out, we actually
|
* has already been queued and immediately bail out, we actually
|
||||||
@@ -2701,7 +2721,7 @@ clutter_actor_real_queue_redraw (ClutterActor *self,
|
|||||||
ClutterActor *stage = _clutter_actor_get_stage_internal (self);
|
ClutterActor *stage = _clutter_actor_get_stage_internal (self);
|
||||||
if (stage != NULL &&
|
if (stage != NULL &&
|
||||||
_clutter_stage_has_full_redraw_queued (CLUTTER_STAGE (stage)))
|
_clutter_stage_has_full_redraw_queued (CLUTTER_STAGE (stage)))
|
||||||
return;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
self->priv->propagated_one_redraw = TRUE;
|
self->priv->propagated_one_redraw = TRUE;
|
||||||
@@ -2709,12 +2729,7 @@ clutter_actor_real_queue_redraw (ClutterActor *self,
|
|||||||
/* notify parents, if they are all visible eventually we'll
|
/* notify parents, if they are all visible eventually we'll
|
||||||
* queue redraw on the stage, which queues the redraw idle.
|
* queue redraw on the stage, which queues the redraw idle.
|
||||||
*/
|
*/
|
||||||
parent = clutter_actor_get_parent (self);
|
return FALSE;
|
||||||
if (parent != NULL)
|
|
||||||
{
|
|
||||||
/* this will go up recursively */
|
|
||||||
_clutter_actor_signal_queue_redraw (parent, origin);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -4015,7 +4030,11 @@ clutter_actor_continue_paint (ClutterActor *self)
|
|||||||
clutter_paint_node_unref (dummy);
|
clutter_paint_node_unref (dummy);
|
||||||
|
|
||||||
/* XXX:2.0 - Call the paint() virtual directly */
|
/* XXX:2.0 - Call the paint() virtual directly */
|
||||||
g_signal_emit (self, actor_signals[PAINT], 0);
|
if (g_signal_has_handler_pending (self, actor_signals[PAINT],
|
||||||
|
0, TRUE))
|
||||||
|
g_signal_emit (self, actor_signals[PAINT], 0);
|
||||||
|
else
|
||||||
|
CLUTTER_ACTOR_GET_CLASS (self)->paint (self);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -4029,7 +4048,11 @@ clutter_actor_continue_paint (ClutterActor *self)
|
|||||||
*
|
*
|
||||||
* XXX:2.0 - Call the pick() virtual directly
|
* XXX:2.0 - Call the pick() virtual directly
|
||||||
*/
|
*/
|
||||||
g_signal_emit (self, actor_signals[PICK], 0, &col);
|
if (g_signal_has_handler_pending (self, actor_signals[PICK],
|
||||||
|
0, TRUE))
|
||||||
|
g_signal_emit (self, actor_signals[PICK], 0, &col);
|
||||||
|
else
|
||||||
|
CLUTTER_ACTOR_GET_CLASS (self)->pick (self, &col);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -4812,7 +4835,8 @@ clutter_actor_set_scale_factor (ClutterActor *self,
|
|||||||
g_assert (pspec != NULL);
|
g_assert (pspec != NULL);
|
||||||
g_assert (scale_p != NULL);
|
g_assert (scale_p != NULL);
|
||||||
|
|
||||||
_clutter_actor_create_transition (self, pspec, *scale_p, factor);
|
if (*scale_p != factor)
|
||||||
|
_clutter_actor_create_transition (self, pspec, *scale_p, factor);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
@@ -7994,10 +8018,12 @@ clutter_actor_class_init (ClutterActorClass *klass)
|
|||||||
G_SIGNAL_RUN_LAST |
|
G_SIGNAL_RUN_LAST |
|
||||||
G_SIGNAL_NO_HOOKS,
|
G_SIGNAL_NO_HOOKS,
|
||||||
G_STRUCT_OFFSET (ClutterActorClass, queue_redraw),
|
G_STRUCT_OFFSET (ClutterActorClass, queue_redraw),
|
||||||
NULL, NULL,
|
g_signal_accumulator_true_handled,
|
||||||
_clutter_marshal_VOID__OBJECT,
|
NULL,
|
||||||
G_TYPE_NONE, 1,
|
_clutter_marshal_BOOLEAN__OBJECT_BOXED,
|
||||||
CLUTTER_TYPE_ACTOR);
|
G_TYPE_BOOLEAN, 2,
|
||||||
|
CLUTTER_TYPE_ACTOR,
|
||||||
|
CLUTTER_TYPE_PAINT_VOLUME);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ClutterActor::queue-relayout:
|
* ClutterActor::queue-relayout:
|
||||||
@@ -8502,6 +8528,7 @@ clutter_actor_init (ClutterActor *self)
|
|||||||
priv->needs_width_request = TRUE;
|
priv->needs_width_request = TRUE;
|
||||||
priv->needs_height_request = TRUE;
|
priv->needs_height_request = TRUE;
|
||||||
priv->needs_allocation = TRUE;
|
priv->needs_allocation = TRUE;
|
||||||
|
priv->needs_paint_volume_update = TRUE;
|
||||||
|
|
||||||
priv->cached_width_age = 1;
|
priv->cached_width_age = 1;
|
||||||
priv->cached_height_age = 1;
|
priv->cached_height_age = 1;
|
||||||
@@ -8595,8 +8622,7 @@ _clutter_actor_finish_queue_redraw (ClutterActor *self,
|
|||||||
ClutterPaintVolume *clip)
|
ClutterPaintVolume *clip)
|
||||||
{
|
{
|
||||||
ClutterActorPrivate *priv = self->priv;
|
ClutterActorPrivate *priv = self->priv;
|
||||||
ClutterPaintVolume *pv;
|
ClutterPaintVolume *pv = NULL;
|
||||||
gboolean clipped;
|
|
||||||
|
|
||||||
/* Remove queue entry early in the process, otherwise a new
|
/* Remove queue entry early in the process, otherwise a new
|
||||||
queue_redraw() during signal handling could put back this
|
queue_redraw() during signal handling could put back this
|
||||||
@@ -8623,8 +8649,7 @@ _clutter_actor_finish_queue_redraw (ClutterActor *self,
|
|||||||
*/
|
*/
|
||||||
if (clip)
|
if (clip)
|
||||||
{
|
{
|
||||||
_clutter_actor_set_queue_redraw_clip (self, clip);
|
pv = clip;
|
||||||
clipped = TRUE;
|
|
||||||
}
|
}
|
||||||
else if (G_LIKELY (priv->last_paint_volume_valid))
|
else if (G_LIKELY (priv->last_paint_volume_valid))
|
||||||
{
|
{
|
||||||
@@ -8634,36 +8659,12 @@ _clutter_actor_finish_queue_redraw (ClutterActor *self,
|
|||||||
ClutterActor *stage = _clutter_actor_get_stage_internal (self);
|
ClutterActor *stage = _clutter_actor_get_stage_internal (self);
|
||||||
|
|
||||||
/* make sure we redraw the actors old position... */
|
/* make sure we redraw the actors old position... */
|
||||||
_clutter_actor_set_queue_redraw_clip (stage,
|
_clutter_actor_propagate_queue_redraw (stage, stage,
|
||||||
&priv->last_paint_volume);
|
&priv->last_paint_volume);
|
||||||
_clutter_actor_signal_queue_redraw (stage, stage);
|
|
||||||
_clutter_actor_set_queue_redraw_clip (stage, NULL);
|
|
||||||
|
|
||||||
/* XXX: Ideally the redraw signal would take a clip volume
|
|
||||||
* argument, but that would be an ABI break. Until we can
|
|
||||||
* break the ABI we pass the argument out-of-band
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* setup the clip for the actors new position... */
|
|
||||||
_clutter_actor_set_queue_redraw_clip (self, pv);
|
|
||||||
clipped = TRUE;
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
clipped = FALSE;
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
clipped = FALSE;
|
|
||||||
|
|
||||||
_clutter_actor_signal_queue_redraw (self, self);
|
_clutter_actor_propagate_queue_redraw (self, self, pv);
|
||||||
|
|
||||||
/* Just in case anyone is manually firing redraw signals without
|
|
||||||
* using the public queue_redraw() API we are careful to ensure that
|
|
||||||
* our out-of-band clip member is cleared before returning...
|
|
||||||
*
|
|
||||||
* Note: A NULL clip denotes a full-stage, un-clipped redraw
|
|
||||||
*/
|
|
||||||
if (G_LIKELY (clipped))
|
|
||||||
_clutter_actor_set_queue_redraw_clip (self, NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -8824,8 +8825,7 @@ _clutter_actor_queue_redraw_full (ClutterActor *self,
|
|||||||
{
|
{
|
||||||
/* NB: NULL denotes an undefined clip which will result in a
|
/* NB: NULL denotes an undefined clip which will result in a
|
||||||
* full redraw... */
|
* full redraw... */
|
||||||
_clutter_actor_set_queue_redraw_clip (self, NULL);
|
_clutter_actor_propagate_queue_redraw (self, self, NULL);
|
||||||
_clutter_actor_signal_queue_redraw (self, self);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -8899,6 +8899,7 @@ _clutter_actor_queue_redraw_full (ClutterActor *self,
|
|||||||
}
|
}
|
||||||
|
|
||||||
priv->is_dirty = TRUE;
|
priv->is_dirty = TRUE;
|
||||||
|
priv->needs_paint_volume_update = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -10247,9 +10248,10 @@ clutter_actor_set_position (ClutterActor *self,
|
|||||||
cur_position.x = clutter_actor_get_x (self);
|
cur_position.x = clutter_actor_get_x (self);
|
||||||
cur_position.y = clutter_actor_get_y (self);
|
cur_position.y = clutter_actor_get_y (self);
|
||||||
|
|
||||||
_clutter_actor_create_transition (self, obj_props[PROP_POSITION],
|
if (!clutter_point_equals (&cur_position, &new_position))
|
||||||
&cur_position,
|
_clutter_actor_create_transition (self, obj_props[PROP_POSITION],
|
||||||
&new_position);
|
&cur_position,
|
||||||
|
&new_position);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -12955,6 +12957,7 @@ clutter_actor_add_child_internal (ClutterActor *self,
|
|||||||
child->priv->needs_width_request = TRUE;
|
child->priv->needs_width_request = TRUE;
|
||||||
child->priv->needs_height_request = TRUE;
|
child->priv->needs_height_request = TRUE;
|
||||||
child->priv->needs_allocation = TRUE;
|
child->priv->needs_allocation = TRUE;
|
||||||
|
child->priv->needs_paint_volume_update = TRUE;
|
||||||
|
|
||||||
/* we only queue a relayout here, because any possible
|
/* we only queue a relayout here, because any possible
|
||||||
* redraw has already been queued either by show() or
|
* redraw has already been queued either by show() or
|
||||||
@@ -16632,26 +16635,6 @@ clutter_actor_has_pointer (ClutterActor *self)
|
|||||||
return self->priv->has_pointer;
|
return self->priv->has_pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* XXX: This is a workaround for not being able to break the ABI of
|
|
||||||
* the QUEUE_REDRAW signal. It is an out-of-band argument. See
|
|
||||||
* clutter_actor_queue_clipped_redraw() for details.
|
|
||||||
*/
|
|
||||||
ClutterPaintVolume *
|
|
||||||
_clutter_actor_get_queue_redraw_clip (ClutterActor *self)
|
|
||||||
{
|
|
||||||
return g_object_get_data (G_OBJECT (self),
|
|
||||||
"-clutter-actor-queue-redraw-clip");
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
_clutter_actor_set_queue_redraw_clip (ClutterActor *self,
|
|
||||||
ClutterPaintVolume *clip)
|
|
||||||
{
|
|
||||||
g_object_set_data (G_OBJECT (self),
|
|
||||||
"-clutter-actor-queue-redraw-clip",
|
|
||||||
clip);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* clutter_actor_has_allocation:
|
* clutter_actor_has_allocation:
|
||||||
* @self: a #ClutterActor
|
* @self: a #ClutterActor
|
||||||
@@ -17498,16 +17481,22 @@ _clutter_actor_get_paint_volume_mutable (ClutterActor *self)
|
|||||||
priv = self->priv;
|
priv = self->priv;
|
||||||
|
|
||||||
if (priv->paint_volume_valid)
|
if (priv->paint_volume_valid)
|
||||||
clutter_paint_volume_free (&priv->paint_volume);
|
{
|
||||||
|
if (!priv->needs_paint_volume_update)
|
||||||
|
return &priv->paint_volume;
|
||||||
|
clutter_paint_volume_free (&priv->paint_volume);
|
||||||
|
}
|
||||||
|
|
||||||
if (_clutter_actor_get_paint_volume_real (self, &priv->paint_volume))
|
if (_clutter_actor_get_paint_volume_real (self, &priv->paint_volume))
|
||||||
{
|
{
|
||||||
priv->paint_volume_valid = TRUE;
|
priv->paint_volume_valid = TRUE;
|
||||||
|
priv->needs_paint_volume_update = FALSE;
|
||||||
return &priv->paint_volume;
|
return &priv->paint_volume;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
priv->paint_volume_valid = FALSE;
|
priv->paint_volume_valid = FALSE;
|
||||||
|
priv->needs_paint_volume_update = FALSE;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -236,8 +236,9 @@ struct _ClutterActorClass
|
|||||||
void (* pick) (ClutterActor *actor,
|
void (* pick) (ClutterActor *actor,
|
||||||
const ClutterColor *color);
|
const ClutterColor *color);
|
||||||
|
|
||||||
void (* queue_redraw) (ClutterActor *actor,
|
gboolean (* queue_redraw) (ClutterActor *actor,
|
||||||
ClutterActor *leaf_that_queued);
|
ClutterActor *leaf_that_queued,
|
||||||
|
ClutterPaintVolume *paint_volume);
|
||||||
|
|
||||||
/* size negotiation */
|
/* size negotiation */
|
||||||
void (* get_preferred_width) (ClutterActor *self,
|
void (* get_preferred_width) (ClutterActor *self,
|
||||||
|
@@ -76,9 +76,6 @@ struct _ClutterCanvasPrivate
|
|||||||
gboolean dirty;
|
gboolean dirty;
|
||||||
|
|
||||||
CoglBitmap *buffer;
|
CoglBitmap *buffer;
|
||||||
|
|
||||||
int scale_factor;
|
|
||||||
guint scale_factor_set : 1;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
enum
|
enum
|
||||||
@@ -87,8 +84,6 @@ enum
|
|||||||
|
|
||||||
PROP_WIDTH,
|
PROP_WIDTH,
|
||||||
PROP_HEIGHT,
|
PROP_HEIGHT,
|
||||||
PROP_SCALE_FACTOR,
|
|
||||||
PROP_SCALE_FACTOR_SET,
|
|
||||||
|
|
||||||
LAST_PROP
|
LAST_PROP
|
||||||
};
|
};
|
||||||
@@ -185,11 +180,6 @@ clutter_canvas_set_property (GObject *gobject,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_SCALE_FACTOR:
|
|
||||||
clutter_canvas_set_scale_factor (CLUTTER_CANVAS (gobject),
|
|
||||||
g_value_get_int (value));
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
@@ -214,17 +204,6 @@ clutter_canvas_get_property (GObject *gobject,
|
|||||||
g_value_set_int (value, priv->height);
|
g_value_set_int (value, priv->height);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_SCALE_FACTOR:
|
|
||||||
if (priv->scale_factor_set)
|
|
||||||
g_value_set_int (value, priv->scale_factor);
|
|
||||||
else
|
|
||||||
g_value_set_int (value, -1);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PROP_SCALE_FACTOR_SET:
|
|
||||||
g_value_set_boolean (value, priv->scale_factor_set);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
@@ -268,46 +247,6 @@ clutter_canvas_class_init (ClutterCanvasClass *klass)
|
|||||||
G_PARAM_READWRITE |
|
G_PARAM_READWRITE |
|
||||||
G_PARAM_STATIC_STRINGS);
|
G_PARAM_STATIC_STRINGS);
|
||||||
|
|
||||||
/**
|
|
||||||
* ClutterCanvas:scale-factor-set:
|
|
||||||
*
|
|
||||||
* Whether the #ClutterCanvas:scale-factor property is set.
|
|
||||||
*
|
|
||||||
* If the #ClutterCanvas:scale-factor-set property is %FALSE
|
|
||||||
* then #ClutterCanvas will use the #ClutterSettings:window-scaling-factor
|
|
||||||
* property.
|
|
||||||
*
|
|
||||||
* Since: 1.18
|
|
||||||
*/
|
|
||||||
obj_props[PROP_SCALE_FACTOR_SET] =
|
|
||||||
g_param_spec_boolean ("scale-factor-set",
|
|
||||||
P_("Scale Factor Set"),
|
|
||||||
P_("Whether the scale-factor property is set"),
|
|
||||||
FALSE,
|
|
||||||
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ClutterCanvas:scale-factor:
|
|
||||||
*
|
|
||||||
* The scaling factor to be applied to the Cairo surface used for
|
|
||||||
* drawing.
|
|
||||||
*
|
|
||||||
* If #ClutterCanvas:scale-factor is set to a negative value, the
|
|
||||||
* value of the #ClutterSettings:window-scaling-factor property is
|
|
||||||
* used instead.
|
|
||||||
*
|
|
||||||
* Use #ClutterCanvas:scale-factor-set to check if the scale factor
|
|
||||||
* is set.
|
|
||||||
*
|
|
||||||
* Since: 1.18
|
|
||||||
*/
|
|
||||||
obj_props[PROP_SCALE_FACTOR] =
|
|
||||||
g_param_spec_int ("scale-factor",
|
|
||||||
P_("Scale Factor"),
|
|
||||||
P_("The scaling factor for the surface"),
|
|
||||||
-1, 1000,
|
|
||||||
-1,
|
|
||||||
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ClutterCanvas::draw:
|
* ClutterCanvas::draw:
|
||||||
@@ -354,7 +293,6 @@ clutter_canvas_init (ClutterCanvas *self)
|
|||||||
|
|
||||||
self->priv->width = -1;
|
self->priv->width = -1;
|
||||||
self->priv->height = -1;
|
self->priv->height = -1;
|
||||||
self->priv->scale_factor = -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -397,7 +335,6 @@ clutter_canvas_emit_draw (ClutterCanvas *self)
|
|||||||
gboolean mapped_buffer;
|
gboolean mapped_buffer;
|
||||||
unsigned char *data;
|
unsigned char *data;
|
||||||
CoglBuffer *buffer;
|
CoglBuffer *buffer;
|
||||||
int window_scale = 1;
|
|
||||||
gboolean res;
|
gboolean res;
|
||||||
cairo_t *cr;
|
cairo_t *cr;
|
||||||
|
|
||||||
@@ -405,20 +342,11 @@ clutter_canvas_emit_draw (ClutterCanvas *self)
|
|||||||
|
|
||||||
priv->dirty = TRUE;
|
priv->dirty = TRUE;
|
||||||
|
|
||||||
if (priv->scale_factor_set)
|
real_width = priv->width;
|
||||||
window_scale = priv->scale_factor;
|
real_height = priv->height;
|
||||||
else
|
|
||||||
g_object_get (clutter_settings_get_default (),
|
|
||||||
"window-scaling-factor", &window_scale,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
real_width = priv->width * window_scale;
|
CLUTTER_NOTE (MISC, "Creating Cairo surface with size %d x %d",
|
||||||
real_height = priv->height * window_scale;
|
priv->width, priv->height);
|
||||||
|
|
||||||
CLUTTER_NOTE (MISC, "Creating Cairo surface with size %d x %d (real: %d x %d, scale: %d)",
|
|
||||||
priv->width, priv->height,
|
|
||||||
real_width, real_height,
|
|
||||||
window_scale);
|
|
||||||
|
|
||||||
if (priv->buffer == NULL)
|
if (priv->buffer == NULL)
|
||||||
{
|
{
|
||||||
@@ -461,8 +389,6 @@ clutter_canvas_emit_draw (ClutterCanvas *self)
|
|||||||
mapped_buffer = FALSE;
|
mapped_buffer = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
cairo_surface_set_device_scale (surface, window_scale, window_scale);
|
|
||||||
|
|
||||||
self->priv->cr = cr = cairo_create (surface);
|
self->priv->cr = cr = cairo_create (surface);
|
||||||
|
|
||||||
g_signal_emit (self, canvas_signals[DRAW], 0,
|
g_signal_emit (self, canvas_signals[DRAW], 0,
|
||||||
@@ -636,81 +562,3 @@ clutter_canvas_set_size (ClutterCanvas *canvas,
|
|||||||
|
|
||||||
return clutter_canvas_invalidate_internal (canvas, width, height);
|
return clutter_canvas_invalidate_internal (canvas, width, height);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* clutter_canvas_set_scale_factor:
|
|
||||||
* @canvas: a #ClutterCanvas
|
|
||||||
* @scale: the scale factor, or -1 for the default
|
|
||||||
*
|
|
||||||
* Sets the scaling factor for the Cairo surface used by @canvas.
|
|
||||||
*
|
|
||||||
* This function should rarely be used.
|
|
||||||
*
|
|
||||||
* The default scaling factor of a #ClutterCanvas content uses the
|
|
||||||
* #ClutterSettings:window-scaling-factor property, which is set by
|
|
||||||
* the windowing system. By using this function it is possible to
|
|
||||||
* override that setting.
|
|
||||||
*
|
|
||||||
* Changing the scale factor will invalidate the @canvas.
|
|
||||||
*
|
|
||||||
* Since: 1.18
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
clutter_canvas_set_scale_factor (ClutterCanvas *canvas,
|
|
||||||
int scale)
|
|
||||||
{
|
|
||||||
ClutterCanvasPrivate *priv;
|
|
||||||
GObject *obj;
|
|
||||||
|
|
||||||
g_return_if_fail (CLUTTER_IS_CANVAS (canvas));
|
|
||||||
g_return_if_fail (scale != 0);
|
|
||||||
|
|
||||||
priv = canvas->priv;
|
|
||||||
|
|
||||||
if (scale < 0)
|
|
||||||
{
|
|
||||||
if (!priv->scale_factor_set)
|
|
||||||
return;
|
|
||||||
|
|
||||||
priv->scale_factor_set = FALSE;
|
|
||||||
priv->scale_factor = -1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (priv->scale_factor_set && priv->scale_factor == scale)
|
|
||||||
return;
|
|
||||||
|
|
||||||
priv->scale_factor_set = TRUE;
|
|
||||||
priv->scale_factor = scale;
|
|
||||||
}
|
|
||||||
|
|
||||||
clutter_content_invalidate (CLUTTER_CONTENT (canvas));
|
|
||||||
|
|
||||||
obj = G_OBJECT (canvas);
|
|
||||||
|
|
||||||
g_object_notify_by_pspec (obj, obj_props[PROP_SCALE_FACTOR]);
|
|
||||||
g_object_notify_by_pspec (obj, obj_props[PROP_SCALE_FACTOR_SET]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* clutter_canvas_get_scale_factor:
|
|
||||||
* @canvas: a #ClutterCanvas
|
|
||||||
*
|
|
||||||
* Retrieves the scaling factor of @canvas, as set using
|
|
||||||
* clutter_canvas_set_scale_factor().
|
|
||||||
*
|
|
||||||
* Return value: the scaling factor, or -1 if the @canvas
|
|
||||||
* uses the default from #ClutterSettings
|
|
||||||
*
|
|
||||||
* Since: 1.18
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
clutter_canvas_get_scale_factor (ClutterCanvas *canvas)
|
|
||||||
{
|
|
||||||
g_return_val_if_fail (CLUTTER_IS_CANVAS (canvas), -1);
|
|
||||||
|
|
||||||
if (!canvas->priv->scale_factor_set)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
return canvas->priv->scale_factor;
|
|
||||||
}
|
|
||||||
|
@@ -54,6 +54,7 @@
|
|||||||
struct _ClutterClonePrivate
|
struct _ClutterClonePrivate
|
||||||
{
|
{
|
||||||
ClutterActor *clone_source;
|
ClutterActor *clone_source;
|
||||||
|
gulong source_destroy_id;
|
||||||
};
|
};
|
||||||
|
|
||||||
G_DEFINE_TYPE_WITH_PRIVATE (ClutterClone, clutter_clone, CLUTTER_TYPE_ACTOR)
|
G_DEFINE_TYPE_WITH_PRIVATE (ClutterClone, clutter_clone, CLUTTER_TYPE_ACTOR)
|
||||||
@@ -376,6 +377,13 @@ clutter_clone_new (ClutterActor *source)
|
|||||||
return g_object_new (CLUTTER_TYPE_CLONE, "source", source, NULL);
|
return g_object_new (CLUTTER_TYPE_CLONE, "source", source, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
on_source_destroyed (ClutterActor *source,
|
||||||
|
ClutterClone *self)
|
||||||
|
{
|
||||||
|
clutter_clone_set_source_internal (self, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
clutter_clone_set_source_internal (ClutterClone *self,
|
clutter_clone_set_source_internal (ClutterClone *self,
|
||||||
ClutterActor *source)
|
ClutterActor *source)
|
||||||
@@ -387,6 +395,8 @@ clutter_clone_set_source_internal (ClutterClone *self,
|
|||||||
|
|
||||||
if (priv->clone_source != NULL)
|
if (priv->clone_source != NULL)
|
||||||
{
|
{
|
||||||
|
g_signal_handler_disconnect (priv->clone_source, priv->source_destroy_id);
|
||||||
|
priv->source_destroy_id = 0;
|
||||||
_clutter_actor_detach_clone (priv->clone_source, CLUTTER_ACTOR (self));
|
_clutter_actor_detach_clone (priv->clone_source, CLUTTER_ACTOR (self));
|
||||||
g_object_unref (priv->clone_source);
|
g_object_unref (priv->clone_source);
|
||||||
priv->clone_source = NULL;
|
priv->clone_source = NULL;
|
||||||
@@ -396,6 +406,8 @@ clutter_clone_set_source_internal (ClutterClone *self,
|
|||||||
{
|
{
|
||||||
priv->clone_source = g_object_ref (source);
|
priv->clone_source = g_object_ref (source);
|
||||||
_clutter_actor_attach_clone (priv->clone_source, CLUTTER_ACTOR (self));
|
_clutter_actor_attach_clone (priv->clone_source, CLUTTER_ACTOR (self));
|
||||||
|
priv->source_destroy_id = g_signal_connect (priv->clone_source, "destroy",
|
||||||
|
G_CALLBACK (on_source_destroyed), self);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_SOURCE]);
|
g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_SOURCE]);
|
||||||
|
@@ -48,7 +48,7 @@
|
|||||||
#include "clutter-debug.h"
|
#include "clutter-debug.h"
|
||||||
|
|
||||||
/* XXX - keep in sync with the ClutterStaticColor enumeration order */
|
/* XXX - keep in sync with the ClutterStaticColor enumeration order */
|
||||||
static const ClutterColor const static_colors[] = {
|
static const ClutterColor static_colors[] = {
|
||||||
/* CGA/EGA color palette */
|
/* CGA/EGA color palette */
|
||||||
{ 0xff, 0xff, 0xff, 0xff }, /* white */
|
{ 0xff, 0xff, 0xff, 0xff }, /* white */
|
||||||
{ 0x00, 0x00, 0x00, 0xff }, /* black */
|
{ 0x00, 0x00, 0x00, 0xff }, /* black */
|
||||||
|
@@ -154,6 +154,15 @@ struct _ClutterInputDeviceClass
|
|||||||
guint *evdev_keycode);
|
guint *evdev_keycode);
|
||||||
void (* update_from_tool) (ClutterInputDevice *device,
|
void (* update_from_tool) (ClutterInputDevice *device,
|
||||||
ClutterInputDeviceTool *tool);
|
ClutterInputDeviceTool *tool);
|
||||||
|
|
||||||
|
gboolean (* is_mode_switch_button) (ClutterInputDevice *device,
|
||||||
|
guint group,
|
||||||
|
guint button);
|
||||||
|
gint (* get_group_n_modes) (ClutterInputDevice *device,
|
||||||
|
gint group);
|
||||||
|
|
||||||
|
gboolean (* is_grouped) (ClutterInputDevice *device,
|
||||||
|
ClutterInputDevice *other_device);
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Platform-dependent interface */
|
/* Platform-dependent interface */
|
||||||
|
@@ -48,6 +48,7 @@
|
|||||||
#include "clutter-private.h"
|
#include "clutter-private.h"
|
||||||
#include "clutter-stage-private.h"
|
#include "clutter-stage-private.h"
|
||||||
#include "clutter-virtual-input-device.h"
|
#include "clutter-virtual-input-device.h"
|
||||||
|
#include "clutter-input-device-tool.h"
|
||||||
|
|
||||||
struct _ClutterDeviceManagerPrivate
|
struct _ClutterDeviceManagerPrivate
|
||||||
{
|
{
|
||||||
@@ -70,6 +71,7 @@ enum
|
|||||||
{
|
{
|
||||||
DEVICE_ADDED,
|
DEVICE_ADDED,
|
||||||
DEVICE_REMOVED,
|
DEVICE_REMOVED,
|
||||||
|
TOOL_CHANGED,
|
||||||
|
|
||||||
LAST_SIGNAL
|
LAST_SIGNAL
|
||||||
};
|
};
|
||||||
@@ -184,6 +186,16 @@ clutter_device_manager_class_init (ClutterDeviceManagerClass *klass)
|
|||||||
_clutter_marshal_VOID__OBJECT,
|
_clutter_marshal_VOID__OBJECT,
|
||||||
G_TYPE_NONE, 1,
|
G_TYPE_NONE, 1,
|
||||||
CLUTTER_TYPE_INPUT_DEVICE);
|
CLUTTER_TYPE_INPUT_DEVICE);
|
||||||
|
|
||||||
|
manager_signals[TOOL_CHANGED] =
|
||||||
|
g_signal_new (I_("tool-changed"),
|
||||||
|
G_TYPE_FROM_CLASS (klass),
|
||||||
|
G_SIGNAL_RUN_LAST,
|
||||||
|
0, NULL, NULL,
|
||||||
|
_clutter_marshal_VOID__OBJECT_OBJECT,
|
||||||
|
G_TYPE_NONE, 2,
|
||||||
|
CLUTTER_TYPE_INPUT_DEVICE,
|
||||||
|
CLUTTER_TYPE_INPUT_DEVICE_TOOL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@@ -83,7 +83,7 @@ struct _ClutterDeviceManagerClass
|
|||||||
ClutterInputDevice *device);
|
ClutterInputDevice *device);
|
||||||
void (* select_stage_events) (ClutterDeviceManager *manager,
|
void (* select_stage_events) (ClutterDeviceManager *manager,
|
||||||
ClutterStage *stage);
|
ClutterStage *stage);
|
||||||
ClutterVirtualInputDevice *(* create_virtual_device) (ClutterDeviceManager *manager,
|
ClutterVirtualInputDevice *(* create_virtual_device) (ClutterDeviceManager *device_manager,
|
||||||
ClutterInputDeviceType device_type);
|
ClutterInputDeviceType device_type);
|
||||||
void (* compress_motion) (ClutterDeviceManager *device_manger,
|
void (* compress_motion) (ClutterDeviceManager *device_manger,
|
||||||
ClutterEvent *event,
|
ClutterEvent *event,
|
||||||
|
@@ -1990,22 +1990,28 @@ clutter_event_remove_filter (guint id)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* clutter_event_get_gesture_swipe_finger_count:
|
* clutter_event_get_touchpad_gesture_finger_count:
|
||||||
* @event: a touchpad swipe event
|
* @event: a touchpad swipe/pinch event
|
||||||
*
|
*
|
||||||
* Returns the number of fingers that is triggering the touchpad gesture.
|
* Returns the number of fingers that is triggering the touchpad gesture.
|
||||||
*
|
*
|
||||||
* Returns: the number of fingers swiping.
|
* Returns: the number of fingers in the gesture.
|
||||||
*
|
*
|
||||||
* Since: 1.24
|
* Since: 1.24
|
||||||
**/
|
**/
|
||||||
guint
|
guint
|
||||||
clutter_event_get_gesture_swipe_finger_count (const ClutterEvent *event)
|
clutter_event_get_touchpad_gesture_finger_count (const ClutterEvent *event)
|
||||||
{
|
{
|
||||||
g_return_val_if_fail (event != NULL, 0);
|
g_return_val_if_fail (event != NULL, 0);
|
||||||
g_return_val_if_fail (event->type == CLUTTER_TOUCHPAD_SWIPE, 0);
|
g_return_val_if_fail (event->type == CLUTTER_TOUCHPAD_SWIPE ||
|
||||||
|
event->type == CLUTTER_TOUCHPAD_PINCH, 0);
|
||||||
|
|
||||||
return event->touchpad_swipe.n_fingers;
|
if (event->type == CLUTTER_TOUCHPAD_SWIPE)
|
||||||
|
return event->touchpad_swipe.n_fingers;
|
||||||
|
else if (event->type == CLUTTER_TOUCHPAD_PINCH)
|
||||||
|
return event->touchpad_pinch.n_fingers;
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -459,6 +459,7 @@ struct _ClutterTouchpadPinchEvent
|
|||||||
gfloat dy;
|
gfloat dy;
|
||||||
gfloat angle_delta;
|
gfloat angle_delta;
|
||||||
gfloat scale;
|
gfloat scale;
|
||||||
|
guint n_fingers;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -507,6 +508,7 @@ struct _ClutterPadButtonEvent
|
|||||||
guint32 button;
|
guint32 button;
|
||||||
guint32 group;
|
guint32 group;
|
||||||
ClutterInputDevice *device;
|
ClutterInputDevice *device;
|
||||||
|
guint32 mode;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _ClutterPadStripEvent
|
struct _ClutterPadStripEvent
|
||||||
@@ -522,6 +524,7 @@ struct _ClutterPadStripEvent
|
|||||||
guint32 strip_number;
|
guint32 strip_number;
|
||||||
guint32 group;
|
guint32 group;
|
||||||
gdouble value;
|
gdouble value;
|
||||||
|
guint32 mode;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _ClutterPadRingEvent
|
struct _ClutterPadRingEvent
|
||||||
@@ -537,6 +540,7 @@ struct _ClutterPadRingEvent
|
|||||||
guint32 ring_number;
|
guint32 ring_number;
|
||||||
guint32 group;
|
guint32 group;
|
||||||
gdouble angle;
|
gdouble angle;
|
||||||
|
guint32 mode;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -752,7 +756,7 @@ CLUTTER_AVAILABLE_IN_1_2
|
|||||||
const ClutterEvent * clutter_get_current_event (void);
|
const ClutterEvent * clutter_get_current_event (void);
|
||||||
|
|
||||||
CLUTTER_AVAILABLE_IN_1_24
|
CLUTTER_AVAILABLE_IN_1_24
|
||||||
guint clutter_event_get_gesture_swipe_finger_count (const ClutterEvent *event);
|
guint clutter_event_get_touchpad_gesture_finger_count (const ClutterEvent *event);
|
||||||
|
|
||||||
CLUTTER_AVAILABLE_IN_1_24
|
CLUTTER_AVAILABLE_IN_1_24
|
||||||
gdouble clutter_event_get_gesture_pinch_angle_delta (const ClutterEvent *event);
|
gdouble clutter_event_get_gesture_pinch_angle_delta (const ClutterEvent *event);
|
||||||
|
@@ -2175,6 +2175,63 @@ clutter_input_device_get_n_mode_groups (ClutterInputDevice *device)
|
|||||||
return device->n_mode_groups;
|
return device->n_mode_groups;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gint
|
||||||
|
clutter_input_device_get_group_n_modes (ClutterInputDevice *device,
|
||||||
|
gint group)
|
||||||
|
{
|
||||||
|
ClutterInputDeviceClass *device_class;
|
||||||
|
|
||||||
|
g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE (device), 0);
|
||||||
|
g_return_val_if_fail (clutter_input_device_get_device_type (device) ==
|
||||||
|
CLUTTER_PAD_DEVICE, 0);
|
||||||
|
g_return_val_if_fail (group >= 0, 0);
|
||||||
|
|
||||||
|
device_class = CLUTTER_INPUT_DEVICE_GET_CLASS (device);
|
||||||
|
|
||||||
|
if (device_class->get_group_n_modes)
|
||||||
|
return device_class->get_group_n_modes (device, group);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
clutter_input_device_is_mode_switch_button (ClutterInputDevice *device,
|
||||||
|
guint group,
|
||||||
|
guint button)
|
||||||
|
{
|
||||||
|
ClutterInputDeviceClass *device_class;
|
||||||
|
|
||||||
|
g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE (device), FALSE);
|
||||||
|
g_return_val_if_fail (clutter_input_device_get_device_type (device) ==
|
||||||
|
CLUTTER_PAD_DEVICE, FALSE);
|
||||||
|
|
||||||
|
device_class = CLUTTER_INPUT_DEVICE_GET_CLASS (device);
|
||||||
|
|
||||||
|
if (device_class->is_mode_switch_button)
|
||||||
|
return device_class->is_mode_switch_button (device, group, button);
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
gint
|
||||||
|
clutter_input_device_get_mode_switch_button_group (ClutterInputDevice *device,
|
||||||
|
guint button)
|
||||||
|
{
|
||||||
|
gint group;
|
||||||
|
|
||||||
|
g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE (device), -1);
|
||||||
|
g_return_val_if_fail (clutter_input_device_get_device_type (device) ==
|
||||||
|
CLUTTER_PAD_DEVICE, -1);
|
||||||
|
|
||||||
|
for (group = 0; group < device->n_mode_groups; group++)
|
||||||
|
{
|
||||||
|
if (clutter_input_device_is_mode_switch_button (device, group, button))
|
||||||
|
return group;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
const gchar *
|
const gchar *
|
||||||
clutter_input_device_get_device_node (ClutterInputDevice *device)
|
clutter_input_device_get_device_node (ClutterInputDevice *device)
|
||||||
{
|
{
|
||||||
@@ -2209,3 +2266,13 @@ clutter_input_device_set_mapping_mode (ClutterInputDevice *device,
|
|||||||
device->mapping_mode = mapping;
|
device->mapping_mode = mapping;
|
||||||
g_object_notify (G_OBJECT (device), "mapping-mode");
|
g_object_notify (G_OBJECT (device), "mapping-mode");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
clutter_input_device_is_grouped (ClutterInputDevice *device,
|
||||||
|
ClutterInputDevice *other_device)
|
||||||
|
{
|
||||||
|
g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE (device), FALSE);
|
||||||
|
g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE (other_device), FALSE);
|
||||||
|
|
||||||
|
return CLUTTER_INPUT_DEVICE_GET_CLASS (device)->is_grouped (device, other_device);
|
||||||
|
}
|
||||||
|
@@ -147,6 +147,18 @@ gint clutter_input_device_get_n_strips (ClutterInputDev
|
|||||||
CLUTTER_AVAILABLE_IN_ALL
|
CLUTTER_AVAILABLE_IN_ALL
|
||||||
gint clutter_input_device_get_n_mode_groups (ClutterInputDevice *device);
|
gint clutter_input_device_get_n_mode_groups (ClutterInputDevice *device);
|
||||||
|
|
||||||
|
CLUTTER_AVAILABLE_IN_ALL
|
||||||
|
gint clutter_input_device_get_group_n_modes (ClutterInputDevice *device,
|
||||||
|
gint group);
|
||||||
|
|
||||||
|
CLUTTER_AVAILABLE_IN_ALL
|
||||||
|
gboolean clutter_input_device_is_mode_switch_button (ClutterInputDevice *device,
|
||||||
|
guint group,
|
||||||
|
guint button);
|
||||||
|
CLUTTER_AVAILABLE_IN_ALL
|
||||||
|
gint clutter_input_device_get_mode_switch_button_group (ClutterInputDevice *device,
|
||||||
|
guint button);
|
||||||
|
|
||||||
CLUTTER_AVAILABLE_IN_ALL
|
CLUTTER_AVAILABLE_IN_ALL
|
||||||
const gchar * clutter_input_device_get_device_node (ClutterInputDevice *device);
|
const gchar * clutter_input_device_get_device_node (ClutterInputDevice *device);
|
||||||
|
|
||||||
@@ -156,6 +168,9 @@ ClutterInputDeviceMapping clutter_input_device_get_mapping_mode (ClutterInputDev
|
|||||||
CLUTTER_AVAILABLE_IN_ALL
|
CLUTTER_AVAILABLE_IN_ALL
|
||||||
void clutter_input_device_set_mapping_mode (ClutterInputDevice *device,
|
void clutter_input_device_set_mapping_mode (ClutterInputDevice *device,
|
||||||
ClutterInputDeviceMapping mapping);
|
ClutterInputDeviceMapping mapping);
|
||||||
|
CLUTTER_AVAILABLE_IN_ALL
|
||||||
|
gboolean clutter_input_device_is_grouped (ClutterInputDevice *device,
|
||||||
|
ClutterInputDevice *other_device);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
BOOLEAN:BOXED
|
BOOLEAN:BOXED
|
||||||
BOOLEAN:BOXED,INT,INT
|
BOOLEAN:BOXED,INT,INT
|
||||||
BOOLEAN:OBJECT,BOOLEAN
|
BOOLEAN:OBJECT,BOOLEAN
|
||||||
|
BOOLEAN:OBJECT,BOXED
|
||||||
BOOLEAN:OBJECT,BOXED,DOUBLE
|
BOOLEAN:OBJECT,BOXED,DOUBLE
|
||||||
BOOLEAN:OBJECT,DOUBLE
|
BOOLEAN:OBJECT,DOUBLE
|
||||||
BOOLEAN:OBJECT,ENUM
|
BOOLEAN:OBJECT,ENUM
|
||||||
@@ -17,12 +18,14 @@ VOID:BOXED,FLAGS
|
|||||||
VOID:INT
|
VOID:INT
|
||||||
VOID:INT64,INT64,FLOAT,BOOLEAN
|
VOID:INT64,INT64,FLOAT,BOOLEAN
|
||||||
VOID:INT,INT
|
VOID:INT,INT
|
||||||
|
VOID:INT,POINTER
|
||||||
VOID:FLOAT,FLOAT
|
VOID:FLOAT,FLOAT
|
||||||
VOID:INT,INT,INT,INT
|
VOID:INT,INT,INT,INT
|
||||||
VOID:OBJECT
|
VOID:OBJECT
|
||||||
VOID:OBJECT,FLAGS
|
VOID:OBJECT,FLAGS
|
||||||
VOID:OBJECT,FLOAT,FLOAT
|
VOID:OBJECT,FLOAT,FLOAT
|
||||||
VOID:OBJECT,FLOAT,FLOAT,FLAGS
|
VOID:OBJECT,FLOAT,FLOAT,FLAGS
|
||||||
|
VOID:OBJECT,OBJECT
|
||||||
VOID:OBJECT,PARAM
|
VOID:OBJECT,PARAM
|
||||||
VOID:OBJECT,POINTER
|
VOID:OBJECT,POINTER
|
||||||
VOID:OBJECT,UINT
|
VOID:OBJECT,UINT
|
||||||
|
@@ -1166,6 +1166,21 @@ _clutter_paint_volume_get_stage_paint_box (ClutterPaintVolume *pv,
|
|||||||
|
|
||||||
_clutter_paint_volume_get_bounding_box (&projected_pv, box);
|
_clutter_paint_volume_get_bounding_box (&projected_pv, box);
|
||||||
|
|
||||||
|
if (pv->is_2d && pv->actor &&
|
||||||
|
clutter_actor_get_z_position (pv->actor) == 0)
|
||||||
|
{
|
||||||
|
/* If the volume/actor are perfectly 2D, take the bounding box as
|
||||||
|
* good. We won't need to add any extra room for sub-pixel positioning
|
||||||
|
* in this case.
|
||||||
|
*/
|
||||||
|
clutter_paint_volume_free (&projected_pv);
|
||||||
|
box->x1 = CLUTTER_NEARBYINT (box->x1);
|
||||||
|
box->y1 = CLUTTER_NEARBYINT (box->y1);
|
||||||
|
box->x2 = CLUTTER_NEARBYINT (box->x2);
|
||||||
|
box->y2 = CLUTTER_NEARBYINT (box->y2);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* The aim here is that for a given rectangle defined with floating point
|
/* The aim here is that for a given rectangle defined with floating point
|
||||||
* coordinates we want to determine a stable quantized size in pixels
|
* coordinates we want to determine a stable quantized size in pixels
|
||||||
* that doesn't vary due to the original box's sub-pixel position.
|
* that doesn't vary due to the original box's sub-pixel position.
|
||||||
|
@@ -77,9 +77,7 @@ struct _ClutterSettings
|
|||||||
|
|
||||||
guint password_hint_time;
|
guint password_hint_time;
|
||||||
|
|
||||||
gint window_scaling_factor;
|
|
||||||
gint unscaled_font_dpi;
|
gint unscaled_font_dpi;
|
||||||
guint fixed_scaling_factor : 1;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _ClutterSettingsClass
|
struct _ClutterSettingsClass
|
||||||
@@ -112,7 +110,6 @@ enum
|
|||||||
|
|
||||||
PROP_PASSWORD_HINT_TIME,
|
PROP_PASSWORD_HINT_TIME,
|
||||||
|
|
||||||
PROP_WINDOW_SCALING_FACTOR,
|
|
||||||
PROP_UNSCALED_FONT_DPI,
|
PROP_UNSCALED_FONT_DPI,
|
||||||
|
|
||||||
PROP_LAST
|
PROP_LAST
|
||||||
@@ -355,14 +352,6 @@ clutter_settings_set_property (GObject *gobject,
|
|||||||
self->password_hint_time = g_value_get_uint (value);
|
self->password_hint_time = g_value_get_uint (value);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_WINDOW_SCALING_FACTOR:
|
|
||||||
if (!self->fixed_scaling_factor)
|
|
||||||
{
|
|
||||||
self->window_scaling_factor = g_value_get_int (value);
|
|
||||||
self->fixed_scaling_factor = TRUE;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PROP_UNSCALED_FONT_DPI:
|
case PROP_UNSCALED_FONT_DPI:
|
||||||
self->font_dpi = g_value_get_int (value);
|
self->font_dpi = g_value_get_int (value);
|
||||||
settings_update_resolution (self);
|
settings_update_resolution (self);
|
||||||
@@ -382,14 +371,7 @@ clutter_settings_set_property_internal (ClutterSettings *self,
|
|||||||
|
|
||||||
property = g_intern_string (property);
|
property = g_intern_string (property);
|
||||||
|
|
||||||
if (property == I_("window-scaling-factor") &&
|
|
||||||
self->fixed_scaling_factor)
|
|
||||||
return;
|
|
||||||
|
|
||||||
g_object_set_property (G_OBJECT (self), property, value);
|
g_object_set_property (G_OBJECT (self), property, value);
|
||||||
|
|
||||||
if (property == I_("window-scaling-factor"))
|
|
||||||
self->fixed_scaling_factor = FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -446,10 +428,6 @@ clutter_settings_get_property (GObject *gobject,
|
|||||||
g_value_set_uint (value, self->password_hint_time);
|
g_value_set_uint (value, self->password_hint_time);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_WINDOW_SCALING_FACTOR:
|
|
||||||
g_value_set_int (value, self->window_scaling_factor);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
@@ -677,14 +655,6 @@ clutter_settings_class_init (ClutterSettingsClass *klass)
|
|||||||
500,
|
500,
|
||||||
CLUTTER_PARAM_READWRITE);
|
CLUTTER_PARAM_READWRITE);
|
||||||
|
|
||||||
obj_props[PROP_WINDOW_SCALING_FACTOR] =
|
|
||||||
g_param_spec_int ("window-scaling-factor",
|
|
||||||
P_("Window Scaling Factor"),
|
|
||||||
P_("The scaling factor to be applied to windows"),
|
|
||||||
1, G_MAXINT,
|
|
||||||
1,
|
|
||||||
CLUTTER_PARAM_READWRITE);
|
|
||||||
|
|
||||||
obj_props[PROP_FONTCONFIG_TIMESTAMP] =
|
obj_props[PROP_FONTCONFIG_TIMESTAMP] =
|
||||||
g_param_spec_uint ("fontconfig-timestamp",
|
g_param_spec_uint ("fontconfig-timestamp",
|
||||||
P_("Fontconfig configuration timestamp"),
|
P_("Fontconfig configuration timestamp"),
|
||||||
@@ -722,8 +692,6 @@ clutter_settings_class_init (ClutterSettingsClass *klass)
|
|||||||
static void
|
static void
|
||||||
clutter_settings_init (ClutterSettings *self)
|
clutter_settings_init (ClutterSettings *self)
|
||||||
{
|
{
|
||||||
const char *scale_str;
|
|
||||||
|
|
||||||
self->resolution = -1.0;
|
self->resolution = -1.0;
|
||||||
|
|
||||||
self->font_dpi = -1;
|
self->font_dpi = -1;
|
||||||
@@ -742,18 +710,6 @@ clutter_settings_init (ClutterSettings *self)
|
|||||||
self->xft_rgba = NULL;
|
self->xft_rgba = NULL;
|
||||||
|
|
||||||
self->long_press_duration = 500;
|
self->long_press_duration = 500;
|
||||||
|
|
||||||
/* if the scaling factor was set by the environment we ignore
|
|
||||||
* any explicit setting
|
|
||||||
*/
|
|
||||||
scale_str = g_getenv ("CLUTTER_SCALE");
|
|
||||||
if (scale_str != NULL)
|
|
||||||
{
|
|
||||||
self->window_scaling_factor = atol (scale_str);
|
|
||||||
self->fixed_scaling_factor = TRUE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
self->window_scaling_factor = 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -28,6 +28,7 @@ enum
|
|||||||
PROP_LAYOUT,
|
PROP_LAYOUT,
|
||||||
PROP_FRAMEBUFFER,
|
PROP_FRAMEBUFFER,
|
||||||
PROP_OFFSCREEN,
|
PROP_OFFSCREEN,
|
||||||
|
PROP_SCALE,
|
||||||
|
|
||||||
PROP_LAST
|
PROP_LAST
|
||||||
};
|
};
|
||||||
@@ -37,6 +38,7 @@ static GParamSpec *obj_props[PROP_LAST];
|
|||||||
typedef struct _ClutterStageViewPrivate
|
typedef struct _ClutterStageViewPrivate
|
||||||
{
|
{
|
||||||
cairo_rectangle_int_t layout;
|
cairo_rectangle_int_t layout;
|
||||||
|
int scale;
|
||||||
CoglFramebuffer *framebuffer;
|
CoglFramebuffer *framebuffer;
|
||||||
|
|
||||||
CoglOffscreen *offscreen;
|
CoglOffscreen *offscreen;
|
||||||
@@ -141,6 +143,15 @@ clutter_stage_view_blit_offscreen (ClutterStageView *view,
|
|||||||
cogl_framebuffer_pop_matrix (priv->framebuffer);
|
cogl_framebuffer_pop_matrix (priv->framebuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
clutter_stage_view_get_scale (ClutterStageView *view)
|
||||||
|
{
|
||||||
|
ClutterStageViewPrivate *priv =
|
||||||
|
clutter_stage_view_get_instance_private (view);
|
||||||
|
|
||||||
|
return priv->scale;
|
||||||
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
clutter_stage_view_is_dirty_viewport (ClutterStageView *view)
|
clutter_stage_view_is_dirty_viewport (ClutterStageView *view)
|
||||||
{
|
{
|
||||||
@@ -179,16 +190,24 @@ clutter_stage_view_set_dirty_projection (ClutterStageView *view,
|
|||||||
priv->dirty_projection = dirty;
|
priv->dirty_projection = dirty;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
clutter_stage_view_get_offscreen_transformation_matrix (ClutterStageView *view,
|
||||||
|
CoglMatrix *matrix)
|
||||||
|
{
|
||||||
|
ClutterStageViewClass *view_class = CLUTTER_STAGE_VIEW_GET_CLASS (view);
|
||||||
|
|
||||||
|
view_class->get_offscreen_transformation_matrix (view, matrix);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
clutter_stage_view_transform_to_onscreen (ClutterStageView *view,
|
clutter_stage_view_transform_to_onscreen (ClutterStageView *view,
|
||||||
gfloat *x,
|
gfloat *x,
|
||||||
gfloat *y)
|
gfloat *y)
|
||||||
{
|
{
|
||||||
ClutterStageViewClass *view_class = CLUTTER_STAGE_VIEW_GET_CLASS (view);
|
|
||||||
gfloat z = 0, w = 1;
|
gfloat z = 0, w = 1;
|
||||||
CoglMatrix matrix;
|
CoglMatrix matrix;
|
||||||
|
|
||||||
view_class->get_offscreen_transformation_matrix (view, &matrix);
|
clutter_stage_view_get_offscreen_transformation_matrix (view, &matrix);
|
||||||
cogl_matrix_get_inverse (&matrix, &matrix);
|
cogl_matrix_get_inverse (&matrix, &matrix);
|
||||||
cogl_matrix_transform_point (&matrix, x, y, &z, &w);
|
cogl_matrix_transform_point (&matrix, x, y, &z, &w);
|
||||||
}
|
}
|
||||||
@@ -221,6 +240,9 @@ clutter_stage_view_get_property (GObject *object,
|
|||||||
case PROP_OFFSCREEN:
|
case PROP_OFFSCREEN:
|
||||||
g_value_set_boxed (value, priv->offscreen);
|
g_value_set_boxed (value, priv->offscreen);
|
||||||
break;
|
break;
|
||||||
|
case PROP_SCALE:
|
||||||
|
g_value_set_int (value, priv->scale);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
}
|
}
|
||||||
@@ -249,6 +271,9 @@ clutter_stage_view_set_property (GObject *object,
|
|||||||
case PROP_OFFSCREEN:
|
case PROP_OFFSCREEN:
|
||||||
priv->offscreen = g_value_dup_boxed (value);
|
priv->offscreen = g_value_dup_boxed (value);
|
||||||
break;
|
break;
|
||||||
|
case PROP_SCALE:
|
||||||
|
priv->scale = g_value_get_int (value);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
}
|
}
|
||||||
@@ -276,6 +301,7 @@ clutter_stage_view_init (ClutterStageView *view)
|
|||||||
|
|
||||||
priv->dirty_viewport = TRUE;
|
priv->dirty_viewport = TRUE;
|
||||||
priv->dirty_projection = TRUE;
|
priv->dirty_projection = TRUE;
|
||||||
|
priv->scale = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -315,5 +341,13 @@ clutter_stage_view_class_init (ClutterStageViewClass *klass)
|
|||||||
G_PARAM_CONSTRUCT_ONLY |
|
G_PARAM_CONSTRUCT_ONLY |
|
||||||
G_PARAM_STATIC_STRINGS);
|
G_PARAM_STATIC_STRINGS);
|
||||||
|
|
||||||
|
obj_props[PROP_SCALE] =
|
||||||
|
g_param_spec_int ("scale",
|
||||||
|
"View scale",
|
||||||
|
"The view scale",
|
||||||
|
1, G_MAXINT, 1,
|
||||||
|
G_PARAM_READWRITE |
|
||||||
|
G_PARAM_STATIC_STRINGS);
|
||||||
|
|
||||||
g_object_class_install_properties (object_class, PROP_LAST, obj_props);
|
g_object_class_install_properties (object_class, PROP_LAST, obj_props);
|
||||||
}
|
}
|
||||||
|
@@ -60,6 +60,9 @@ void clutter_stage_view_transform_to_onscreen (ClutterStageView *vie
|
|||||||
void clutter_stage_view_blit_offscreen (ClutterStageView *view,
|
void clutter_stage_view_blit_offscreen (ClutterStageView *view,
|
||||||
const cairo_rectangle_int_t *clip);
|
const cairo_rectangle_int_t *clip);
|
||||||
|
|
||||||
|
CLUTTER_AVAILABLE_IN_MUTTER
|
||||||
|
int clutter_stage_view_get_scale (ClutterStageView *view);
|
||||||
|
|
||||||
gboolean clutter_stage_view_is_dirty_viewport (ClutterStageView *view);
|
gboolean clutter_stage_view_is_dirty_viewport (ClutterStageView *view);
|
||||||
|
|
||||||
void clutter_stage_view_set_dirty_viewport (ClutterStageView *view,
|
void clutter_stage_view_set_dirty_viewport (ClutterStageView *view,
|
||||||
@@ -70,4 +73,8 @@ gboolean clutter_stage_view_is_dirty_projection (ClutterStageView *view);
|
|||||||
void clutter_stage_view_set_dirty_projection (ClutterStageView *view,
|
void clutter_stage_view_set_dirty_projection (ClutterStageView *view,
|
||||||
gboolean dirty);
|
gboolean dirty);
|
||||||
|
|
||||||
|
CLUTTER_AVAILABLE_IN_MUTTER
|
||||||
|
void clutter_stage_view_get_offscreen_transformation_matrix (ClutterStageView *view,
|
||||||
|
CoglMatrix *matrix);
|
||||||
|
|
||||||
#endif /* __CLUTTER_STAGE_VIEW_H__ */
|
#endif /* __CLUTTER_STAGE_VIEW_H__ */
|
||||||
|
@@ -231,19 +231,35 @@ _clutter_stage_window_ignoring_redraw_clips (ClutterStageWindow *window)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
cairo_region_t *
|
||||||
_clutter_stage_window_get_redraw_clip_bounds (ClutterStageWindow *window,
|
_clutter_stage_window_get_redraw_clip (ClutterStageWindow *window)
|
||||||
cairo_rectangle_int_t *stage_clip)
|
|
||||||
{
|
{
|
||||||
ClutterStageWindowIface *iface;
|
ClutterStageWindowIface *iface;
|
||||||
|
|
||||||
g_return_val_if_fail (CLUTTER_IS_STAGE_WINDOW (window), FALSE);
|
g_return_val_if_fail (CLUTTER_IS_STAGE_WINDOW (window), FALSE);
|
||||||
|
|
||||||
iface = CLUTTER_STAGE_WINDOW_GET_IFACE (window);
|
iface = CLUTTER_STAGE_WINDOW_GET_IFACE (window);
|
||||||
if (iface->get_redraw_clip_bounds != NULL)
|
if (iface->get_redraw_clip != NULL)
|
||||||
return iface->get_redraw_clip_bounds (window, stage_clip);
|
return iface->get_redraw_clip (window);
|
||||||
|
|
||||||
return FALSE;
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
_clutter_stage_window_get_redraw_clip_bounds (ClutterStageWindow *window,
|
||||||
|
cairo_rectangle_int_t *stage_clip)
|
||||||
|
{
|
||||||
|
cairo_region_t *redraw_clip;
|
||||||
|
|
||||||
|
g_return_val_if_fail (CLUTTER_IS_STAGE_WINDOW (window), FALSE);
|
||||||
|
|
||||||
|
redraw_clip = _clutter_stage_window_get_redraw_clip (window);
|
||||||
|
if (!redraw_clip)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
cairo_region_get_extents (redraw_clip, stage_clip);
|
||||||
|
cairo_region_destroy (redraw_clip);
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -303,33 +319,6 @@ _clutter_stage_window_can_clip_redraws (ClutterStageWindow *window)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
_clutter_stage_window_set_scale_factor (ClutterStageWindow *window,
|
|
||||||
int factor)
|
|
||||||
{
|
|
||||||
ClutterStageWindowIface *iface;
|
|
||||||
|
|
||||||
g_return_if_fail (CLUTTER_IS_STAGE_WINDOW (window));
|
|
||||||
|
|
||||||
iface = CLUTTER_STAGE_WINDOW_GET_IFACE (window);
|
|
||||||
if (iface->set_scale_factor != NULL)
|
|
||||||
iface->set_scale_factor (window, factor);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
_clutter_stage_window_get_scale_factor (ClutterStageWindow *window)
|
|
||||||
{
|
|
||||||
ClutterStageWindowIface *iface;
|
|
||||||
|
|
||||||
g_return_val_if_fail (CLUTTER_IS_STAGE_WINDOW (window), 1);
|
|
||||||
|
|
||||||
iface = CLUTTER_STAGE_WINDOW_GET_IFACE (window);
|
|
||||||
if (iface->get_scale_factor != NULL)
|
|
||||||
return iface->get_scale_factor (window);
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
GList *
|
GList *
|
||||||
_clutter_stage_window_get_views (ClutterStageWindow *window)
|
_clutter_stage_window_get_views (ClutterStageWindow *window)
|
||||||
{
|
{
|
||||||
|
@@ -68,9 +68,7 @@ struct _ClutterStageWindowIface
|
|||||||
cairo_rectangle_int_t *stage_rectangle);
|
cairo_rectangle_int_t *stage_rectangle);
|
||||||
gboolean (* has_redraw_clips) (ClutterStageWindow *stage_window);
|
gboolean (* has_redraw_clips) (ClutterStageWindow *stage_window);
|
||||||
gboolean (* ignoring_redraw_clips) (ClutterStageWindow *stage_window);
|
gboolean (* ignoring_redraw_clips) (ClutterStageWindow *stage_window);
|
||||||
gboolean (* get_redraw_clip_bounds) (ClutterStageWindow *stage_window,
|
cairo_region_t * (* get_redraw_clip) (ClutterStageWindow *stage_window);
|
||||||
cairo_rectangle_int_t *clip);
|
|
||||||
|
|
||||||
|
|
||||||
void (* set_accept_focus) (ClutterStageWindow *stage_window,
|
void (* set_accept_focus) (ClutterStageWindow *stage_window,
|
||||||
gboolean accept_focus);
|
gboolean accept_focus);
|
||||||
@@ -83,9 +81,6 @@ struct _ClutterStageWindowIface
|
|||||||
|
|
||||||
gboolean (* can_clip_redraws) (ClutterStageWindow *stage_window);
|
gboolean (* can_clip_redraws) (ClutterStageWindow *stage_window);
|
||||||
|
|
||||||
void (* set_scale_factor) (ClutterStageWindow *stage_window,
|
|
||||||
int factor);
|
|
||||||
int (* get_scale_factor) (ClutterStageWindow *stage_window);
|
|
||||||
GList *(* get_views) (ClutterStageWindow *stage_window);
|
GList *(* get_views) (ClutterStageWindow *stage_window);
|
||||||
int64_t (* get_frame_counter) (ClutterStageWindow *stage_window);
|
int64_t (* get_frame_counter) (ClutterStageWindow *stage_window);
|
||||||
void (* finish_frame) (ClutterStageWindow *stage_window);
|
void (* finish_frame) (ClutterStageWindow *stage_window);
|
||||||
@@ -128,6 +123,7 @@ gboolean _clutter_stage_window_has_redraw_clips (ClutterStageWin
|
|||||||
gboolean _clutter_stage_window_ignoring_redraw_clips (ClutterStageWindow *window);
|
gboolean _clutter_stage_window_ignoring_redraw_clips (ClutterStageWindow *window);
|
||||||
gboolean _clutter_stage_window_get_redraw_clip_bounds (ClutterStageWindow *window,
|
gboolean _clutter_stage_window_get_redraw_clip_bounds (ClutterStageWindow *window,
|
||||||
cairo_rectangle_int_t *clip);
|
cairo_rectangle_int_t *clip);
|
||||||
|
cairo_region_t * _clutter_stage_window_get_redraw_clip (ClutterStageWindow *window);
|
||||||
|
|
||||||
void _clutter_stage_window_set_accept_focus (ClutterStageWindow *window,
|
void _clutter_stage_window_set_accept_focus (ClutterStageWindow *window,
|
||||||
gboolean accept_focus);
|
gboolean accept_focus);
|
||||||
@@ -140,10 +136,6 @@ void _clutter_stage_window_get_dirty_pixel (ClutterStageWin
|
|||||||
|
|
||||||
gboolean _clutter_stage_window_can_clip_redraws (ClutterStageWindow *window);
|
gboolean _clutter_stage_window_can_clip_redraws (ClutterStageWindow *window);
|
||||||
|
|
||||||
void _clutter_stage_window_set_scale_factor (ClutterStageWindow *window,
|
|
||||||
int factor);
|
|
||||||
int _clutter_stage_window_get_scale_factor (ClutterStageWindow *window);
|
|
||||||
|
|
||||||
GList * _clutter_stage_window_get_views (ClutterStageWindow *window);
|
GList * _clutter_stage_window_get_views (ClutterStageWindow *window);
|
||||||
|
|
||||||
void _clutter_stage_window_finish_frame (ClutterStageWindow *window);
|
void _clutter_stage_window_finish_frame (ClutterStageWindow *window);
|
||||||
|
@@ -364,7 +364,6 @@ clutter_stage_allocate (ClutterActor *self,
|
|||||||
float new_width, new_height;
|
float new_width, new_height;
|
||||||
float width, height;
|
float width, height;
|
||||||
cairo_rectangle_int_t window_size;
|
cairo_rectangle_int_t window_size;
|
||||||
int scale_factor;
|
|
||||||
|
|
||||||
if (priv->impl == NULL)
|
if (priv->impl == NULL)
|
||||||
return;
|
return;
|
||||||
@@ -465,11 +464,6 @@ clutter_stage_allocate (ClutterActor *self,
|
|||||||
*/
|
*/
|
||||||
_clutter_stage_window_get_geometry (priv->impl, &window_size);
|
_clutter_stage_window_get_geometry (priv->impl, &window_size);
|
||||||
|
|
||||||
scale_factor = _clutter_stage_window_get_scale_factor (priv->impl);
|
|
||||||
|
|
||||||
window_size.width *= scale_factor;
|
|
||||||
window_size.height *= scale_factor;
|
|
||||||
|
|
||||||
cogl_onscreen_clutter_backend_set_size (window_size.width,
|
cogl_onscreen_clutter_backend_set_size (window_size.width,
|
||||||
window_size.height);
|
window_size.height);
|
||||||
|
|
||||||
@@ -630,15 +624,13 @@ clutter_stage_do_paint_view (ClutterStage *stage,
|
|||||||
float clip_poly[8];
|
float clip_poly[8];
|
||||||
float viewport[4];
|
float viewport[4];
|
||||||
cairo_rectangle_int_t geom;
|
cairo_rectangle_int_t geom;
|
||||||
int window_scale;
|
|
||||||
|
|
||||||
_clutter_stage_window_get_geometry (priv->impl, &geom);
|
_clutter_stage_window_get_geometry (priv->impl, &geom);
|
||||||
window_scale = _clutter_stage_window_get_scale_factor (priv->impl);
|
|
||||||
|
|
||||||
viewport[0] = priv->viewport[0] * window_scale;
|
viewport[0] = priv->viewport[0];
|
||||||
viewport[1] = priv->viewport[1] * window_scale;
|
viewport[1] = priv->viewport[1];
|
||||||
viewport[2] = priv->viewport[2] * window_scale;
|
viewport[2] = priv->viewport[2];
|
||||||
viewport[3] = priv->viewport[3] * window_scale;
|
viewport[3] = priv->viewport[3];
|
||||||
|
|
||||||
if (!clip)
|
if (!clip)
|
||||||
{
|
{
|
||||||
@@ -646,16 +638,14 @@ clutter_stage_do_paint_view (ClutterStage *stage,
|
|||||||
clip = &view_layout;
|
clip = &view_layout;
|
||||||
}
|
}
|
||||||
|
|
||||||
clip_poly[0] = MAX (clip->x * window_scale, 0);
|
clip_poly[0] = MAX (clip->x, 0);
|
||||||
clip_poly[1] = MAX (clip->y * window_scale, 0);
|
clip_poly[1] = MAX (clip->y, 0);
|
||||||
|
|
||||||
clip_poly[2] = MIN ((clip->x + clip->width) * window_scale,
|
clip_poly[2] = MIN (clip->x + clip->width, geom.width);
|
||||||
geom.width * window_scale);
|
|
||||||
clip_poly[3] = clip_poly[1];
|
clip_poly[3] = clip_poly[1];
|
||||||
|
|
||||||
clip_poly[4] = clip_poly[2];
|
clip_poly[4] = clip_poly[2];
|
||||||
clip_poly[5] = MIN ((clip->y + clip->height) * window_scale,
|
clip_poly[5] = MIN (clip->y + clip->height, geom.height);
|
||||||
geom.height * window_scale);
|
|
||||||
|
|
||||||
clip_poly[6] = clip_poly[0];
|
clip_poly[6] = clip_poly[0];
|
||||||
clip_poly[7] = clip_poly[5];
|
clip_poly[7] = clip_poly[5];
|
||||||
@@ -1209,45 +1199,44 @@ clutter_stage_real_queue_relayout (ClutterActor *self)
|
|||||||
parent_class->queue_relayout (self);
|
parent_class->queue_relayout (self);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static gboolean
|
||||||
clutter_stage_real_queue_redraw (ClutterActor *actor,
|
clutter_stage_real_queue_redraw (ClutterActor *actor,
|
||||||
ClutterActor *leaf)
|
ClutterActor *leaf,
|
||||||
|
ClutterPaintVolume *redraw_clip)
|
||||||
{
|
{
|
||||||
ClutterStage *stage = CLUTTER_STAGE (actor);
|
ClutterStage *stage = CLUTTER_STAGE (actor);
|
||||||
ClutterStageWindow *stage_window;
|
ClutterStageWindow *stage_window;
|
||||||
ClutterPaintVolume *redraw_clip;
|
|
||||||
ClutterActorBox bounding_box;
|
ClutterActorBox bounding_box;
|
||||||
ClutterActorBox intersection_box;
|
ClutterActorBox intersection_box;
|
||||||
cairo_rectangle_int_t geom, stage_clip;
|
cairo_rectangle_int_t geom, stage_clip;
|
||||||
|
|
||||||
if (CLUTTER_ACTOR_IN_DESTRUCTION (actor))
|
if (CLUTTER_ACTOR_IN_DESTRUCTION (actor))
|
||||||
return;
|
return TRUE;
|
||||||
|
|
||||||
/* If the backend can't do anything with redraw clips (e.g. it already knows
|
/* If the backend can't do anything with redraw clips (e.g. it already knows
|
||||||
* it needs to redraw everything anyway) then don't spend time transforming
|
* it needs to redraw everything anyway) then don't spend time transforming
|
||||||
* any clip volume into stage coordinates... */
|
* any clip volume into stage coordinates... */
|
||||||
stage_window = _clutter_stage_get_window (stage);
|
stage_window = _clutter_stage_get_window (stage);
|
||||||
if (stage_window == NULL)
|
if (stage_window == NULL)
|
||||||
return;
|
return TRUE;
|
||||||
|
|
||||||
if (_clutter_stage_window_ignoring_redraw_clips (stage_window))
|
if (_clutter_stage_window_ignoring_redraw_clips (stage_window))
|
||||||
{
|
{
|
||||||
_clutter_stage_window_add_redraw_clip (stage_window, NULL);
|
_clutter_stage_window_add_redraw_clip (stage_window, NULL);
|
||||||
return;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Convert the clip volume into stage coordinates and then into an
|
/* Convert the clip volume into stage coordinates and then into an
|
||||||
* axis aligned stage coordinates bounding box...
|
* axis aligned stage coordinates bounding box...
|
||||||
*/
|
*/
|
||||||
redraw_clip = _clutter_actor_get_queue_redraw_clip (leaf);
|
|
||||||
if (redraw_clip == NULL)
|
if (redraw_clip == NULL)
|
||||||
{
|
{
|
||||||
_clutter_stage_window_add_redraw_clip (stage_window, NULL);
|
_clutter_stage_window_add_redraw_clip (stage_window, NULL);
|
||||||
return;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (redraw_clip->is_empty)
|
if (redraw_clip->is_empty)
|
||||||
return;
|
return TRUE;
|
||||||
|
|
||||||
_clutter_paint_volume_get_stage_paint_box (redraw_clip,
|
_clutter_paint_volume_get_stage_paint_box (redraw_clip,
|
||||||
stage,
|
stage,
|
||||||
@@ -1263,7 +1252,7 @@ clutter_stage_real_queue_redraw (ClutterActor *actor,
|
|||||||
/* There is no need to track degenerate/empty redraw clips */
|
/* There is no need to track degenerate/empty redraw clips */
|
||||||
if (intersection_box.x2 <= intersection_box.x1 ||
|
if (intersection_box.x2 <= intersection_box.x1 ||
|
||||||
intersection_box.y2 <= intersection_box.y1)
|
intersection_box.y2 <= intersection_box.y1)
|
||||||
return;
|
return TRUE;
|
||||||
|
|
||||||
/* when converting to integer coordinates make sure we round the edges of the
|
/* when converting to integer coordinates make sure we round the edges of the
|
||||||
* clip rectangle outwards... */
|
* clip rectangle outwards... */
|
||||||
@@ -1273,6 +1262,7 @@ clutter_stage_real_queue_redraw (ClutterActor *actor,
|
|||||||
stage_clip.height = intersection_box.y2 - stage_clip.y;
|
stage_clip.height = intersection_box.y2 - stage_clip.y;
|
||||||
|
|
||||||
_clutter_stage_window_add_redraw_clip (stage_window, &stage_clip);
|
_clutter_stage_window_add_redraw_clip (stage_window, &stage_clip);
|
||||||
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
@@ -1325,6 +1315,31 @@ clutter_stage_get_redraw_clip_bounds (ClutterStage *stage,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cairo_region_t *
|
||||||
|
clutter_stage_get_redraw_clip (ClutterStage *stage)
|
||||||
|
{
|
||||||
|
ClutterStagePrivate *priv;
|
||||||
|
cairo_rectangle_int_t clip;
|
||||||
|
cairo_region_t *region;
|
||||||
|
|
||||||
|
g_return_val_if_fail (CLUTTER_IS_STAGE (stage), NULL);
|
||||||
|
|
||||||
|
priv = stage->priv;
|
||||||
|
|
||||||
|
region = _clutter_stage_window_get_redraw_clip (priv->impl);
|
||||||
|
if (region)
|
||||||
|
return region;
|
||||||
|
|
||||||
|
if (!region)
|
||||||
|
{
|
||||||
|
/* Set clip to the full extents of the stage */
|
||||||
|
_clutter_stage_window_get_geometry (priv->impl, &clip);
|
||||||
|
region = cairo_region_create_rectangle (&clip);
|
||||||
|
}
|
||||||
|
|
||||||
|
return region;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
read_pixels_to_file (char *filename_stem,
|
read_pixels_to_file (char *filename_stem,
|
||||||
int x,
|
int x,
|
||||||
@@ -1378,19 +1393,19 @@ _clutter_stage_do_pick_on_view (ClutterStage *stage,
|
|||||||
gint dirty_y;
|
gint dirty_y;
|
||||||
gint read_x;
|
gint read_x;
|
||||||
gint read_y;
|
gint read_y;
|
||||||
int window_scale;
|
|
||||||
float fb_width, fb_height;
|
float fb_width, fb_height;
|
||||||
|
int fb_scale;
|
||||||
int viewport_offset_x;
|
int viewport_offset_x;
|
||||||
int viewport_offset_y;
|
int viewport_offset_y;
|
||||||
|
|
||||||
priv = stage->priv;
|
priv = stage->priv;
|
||||||
|
|
||||||
context = _clutter_context_get_default ();
|
context = _clutter_context_get_default ();
|
||||||
window_scale = _clutter_stage_window_get_scale_factor (priv->impl);
|
fb_scale = clutter_stage_view_get_scale (view);
|
||||||
clutter_stage_view_get_layout (view, &view_layout);
|
clutter_stage_view_get_layout (view, &view_layout);
|
||||||
|
|
||||||
fb_width = view_layout.width;
|
fb_width = view_layout.width * fb_scale;
|
||||||
fb_height = view_layout.height;
|
fb_height = view_layout.height * fb_scale;
|
||||||
cogl_push_framebuffer (fb);
|
cogl_push_framebuffer (fb);
|
||||||
|
|
||||||
/* needed for when a context switch happens */
|
/* needed for when a context switch happens */
|
||||||
@@ -1400,38 +1415,38 @@ _clutter_stage_do_pick_on_view (ClutterStage *stage,
|
|||||||
* picking to not work at all, so setting it the whole framebuffer content
|
* picking to not work at all, so setting it the whole framebuffer content
|
||||||
* for now. */
|
* for now. */
|
||||||
cogl_framebuffer_push_scissor_clip (fb, 0, 0,
|
cogl_framebuffer_push_scissor_clip (fb, 0, 0,
|
||||||
view_layout.width,
|
view_layout.width * fb_scale,
|
||||||
view_layout.height);
|
view_layout.height * fb_scale);
|
||||||
|
|
||||||
_clutter_stage_window_get_dirty_pixel (priv->impl, view, &dirty_x, &dirty_y);
|
_clutter_stage_window_get_dirty_pixel (priv->impl, view, &dirty_x, &dirty_y);
|
||||||
|
|
||||||
if (G_LIKELY (!(clutter_pick_debug_flags & CLUTTER_DEBUG_DUMP_PICK_BUFFERS)))
|
if (G_LIKELY (!(clutter_pick_debug_flags & CLUTTER_DEBUG_DUMP_PICK_BUFFERS)))
|
||||||
{
|
{
|
||||||
CLUTTER_NOTE (PICK, "Pushing pick scissor clip x: %d, y: %d, 1x1",
|
CLUTTER_NOTE (PICK, "Pushing pick scissor clip x: %d, y: %d, 1x1",
|
||||||
dirty_x * window_scale,
|
dirty_x * fb_scale,
|
||||||
dirty_y * window_scale);
|
dirty_y * fb_scale);
|
||||||
cogl_framebuffer_push_scissor_clip (fb, dirty_x * window_scale, dirty_y * window_scale, 1, 1);
|
cogl_framebuffer_push_scissor_clip (fb, dirty_x * fb_scale, dirty_y * fb_scale, 1, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
viewport_offset_x = x * window_scale - dirty_x * window_scale;
|
viewport_offset_x = x * fb_scale - dirty_x * fb_scale;
|
||||||
viewport_offset_y = y * window_scale - dirty_y * window_scale;
|
viewport_offset_y = y * fb_scale - dirty_y * fb_scale;
|
||||||
CLUTTER_NOTE (PICK, "Setting viewport to %f, %f, %f, %f",
|
CLUTTER_NOTE (PICK, "Setting viewport to %f, %f, %f, %f",
|
||||||
priv->viewport[0] * window_scale - viewport_offset_x,
|
priv->viewport[0] * fb_scale - viewport_offset_x,
|
||||||
priv->viewport[1] * window_scale - viewport_offset_y,
|
priv->viewport[1] * fb_scale - viewport_offset_y,
|
||||||
priv->viewport[2] * window_scale,
|
priv->viewport[2] * fb_scale,
|
||||||
priv->viewport[3] * window_scale);
|
priv->viewport[3] * fb_scale);
|
||||||
cogl_set_viewport (priv->viewport[0] * window_scale - viewport_offset_x,
|
cogl_set_viewport (priv->viewport[0] * fb_scale - viewport_offset_x,
|
||||||
priv->viewport[1] * window_scale - viewport_offset_y,
|
priv->viewport[1] * fb_scale - viewport_offset_y,
|
||||||
priv->viewport[2] * window_scale,
|
priv->viewport[2] * fb_scale,
|
||||||
priv->viewport[3] * window_scale);
|
priv->viewport[3] * fb_scale);
|
||||||
|
|
||||||
read_x = dirty_x * window_scale;
|
read_x = dirty_x * fb_scale;
|
||||||
read_y = dirty_y * window_scale;
|
read_y = dirty_y * fb_scale;
|
||||||
|
|
||||||
CLUTTER_NOTE (PICK, "Performing pick at %i,%i on view %dx%d+%d+%d",
|
CLUTTER_NOTE (PICK, "Performing pick at %i,%i on view %dx%d+%d+%d s: %d",
|
||||||
x, y,
|
x, y,
|
||||||
view_layout.width, view_layout.height,
|
view_layout.width, view_layout.height,
|
||||||
view_layout.x, view_layout.y);
|
view_layout.x, view_layout.y, fb_scale);
|
||||||
|
|
||||||
cogl_color_init_from_4ub (&stage_pick_id, 255, 255, 255, 255);
|
cogl_color_init_from_4ub (&stage_pick_id, 255, 255, 255, 255);
|
||||||
cogl_clear (&stage_pick_id, COGL_BUFFER_BIT_COLOR | COGL_BUFFER_BIT_DEPTH);
|
cogl_clear (&stage_pick_id, COGL_BUFFER_BIT_COLOR | COGL_BUFFER_BIT_DEPTH);
|
||||||
@@ -2186,8 +2201,8 @@ clutter_stage_class_init (ClutterStageClass *klass)
|
|||||||
g_signal_new (I_("presented"),
|
g_signal_new (I_("presented"),
|
||||||
G_TYPE_FROM_CLASS (gobject_class),
|
G_TYPE_FROM_CLASS (gobject_class),
|
||||||
G_SIGNAL_RUN_LAST,
|
G_SIGNAL_RUN_LAST,
|
||||||
0,
|
0, NULL, NULL,
|
||||||
NULL, NULL, NULL,
|
_clutter_marshal_VOID__INT_POINTER,
|
||||||
G_TYPE_NONE, 2,
|
G_TYPE_NONE, 2,
|
||||||
G_TYPE_INT, G_TYPE_POINTER);
|
G_TYPE_INT, G_TYPE_POINTER);
|
||||||
|
|
||||||
@@ -2210,7 +2225,6 @@ clutter_stage_init (ClutterStage *self)
|
|||||||
ClutterStagePrivate *priv;
|
ClutterStagePrivate *priv;
|
||||||
ClutterStageWindow *impl;
|
ClutterStageWindow *impl;
|
||||||
ClutterBackend *backend;
|
ClutterBackend *backend;
|
||||||
int window_scale = 1;
|
|
||||||
GError *error;
|
GError *error;
|
||||||
|
|
||||||
/* a stage is a top-level object */
|
/* a stage is a top-level object */
|
||||||
@@ -2228,7 +2242,6 @@ clutter_stage_init (ClutterStage *self)
|
|||||||
{
|
{
|
||||||
_clutter_stage_set_window (self, impl);
|
_clutter_stage_set_window (self, impl);
|
||||||
_clutter_stage_window_get_geometry (priv->impl, &geom);
|
_clutter_stage_window_get_geometry (priv->impl, &geom);
|
||||||
window_scale = _clutter_stage_window_get_scale_factor (priv->impl);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -2282,8 +2295,8 @@ clutter_stage_init (ClutterStage *self)
|
|||||||
priv->perspective.aspect,
|
priv->perspective.aspect,
|
||||||
priv->perspective.z_near,
|
priv->perspective.z_near,
|
||||||
50, /* distance to 2d plane */
|
50, /* distance to 2d plane */
|
||||||
geom.width * window_scale,
|
geom.width,
|
||||||
geom.height * window_scale);
|
geom.height);
|
||||||
|
|
||||||
|
|
||||||
/* FIXME - remove for 2.0 */
|
/* FIXME - remove for 2.0 */
|
||||||
@@ -3412,16 +3425,6 @@ clutter_stage_ensure_viewport (ClutterStage *stage)
|
|||||||
clutter_actor_queue_redraw (CLUTTER_ACTOR (stage));
|
clutter_actor_queue_redraw (CLUTTER_ACTOR (stage));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
clutter_stage_apply_scale (ClutterStage *stage)
|
|
||||||
{
|
|
||||||
int factor;
|
|
||||||
|
|
||||||
factor = _clutter_stage_window_get_scale_factor (stage->priv->impl);
|
|
||||||
if (factor != 1)
|
|
||||||
cogl_matrix_scale (&stage->priv->view, factor, factor, 1.f);
|
|
||||||
}
|
|
||||||
|
|
||||||
# define _DEG_TO_RAD(d) ((d) * ((float) G_PI / 180.0f))
|
# define _DEG_TO_RAD(d) ((d) * ((float) G_PI / 180.0f))
|
||||||
|
|
||||||
/* This calculates a distance into the view frustum to position the
|
/* This calculates a distance into the view frustum to position the
|
||||||
@@ -3568,7 +3571,7 @@ _clutter_stage_maybe_setup_viewport (ClutterStage *stage,
|
|||||||
{
|
{
|
||||||
cairo_rectangle_int_t view_layout;
|
cairo_rectangle_int_t view_layout;
|
||||||
ClutterPerspective perspective;
|
ClutterPerspective perspective;
|
||||||
int window_scale;
|
int fb_scale;
|
||||||
int viewport_offset_x;
|
int viewport_offset_x;
|
||||||
int viewport_offset_y;
|
int viewport_offset_y;
|
||||||
float z_2d;
|
float z_2d;
|
||||||
@@ -3578,15 +3581,15 @@ _clutter_stage_maybe_setup_viewport (ClutterStage *stage,
|
|||||||
priv->viewport[2],
|
priv->viewport[2],
|
||||||
priv->viewport[3]);
|
priv->viewport[3]);
|
||||||
|
|
||||||
window_scale = _clutter_stage_window_get_scale_factor (priv->impl);
|
fb_scale = clutter_stage_view_get_scale (view);
|
||||||
clutter_stage_view_get_layout (view, &view_layout);
|
clutter_stage_view_get_layout (view, &view_layout);
|
||||||
|
|
||||||
viewport_offset_x = view_layout.x * window_scale;
|
viewport_offset_x = view_layout.x * fb_scale;
|
||||||
viewport_offset_y = view_layout.y * window_scale;
|
viewport_offset_y = view_layout.y * fb_scale;
|
||||||
cogl_set_viewport (priv->viewport[0] * window_scale - viewport_offset_x,
|
cogl_set_viewport (priv->viewport[0] * fb_scale - viewport_offset_x,
|
||||||
priv->viewport[1] * window_scale - viewport_offset_y,
|
priv->viewport[1] * fb_scale - viewport_offset_y,
|
||||||
priv->viewport[2] * window_scale,
|
priv->viewport[2] * fb_scale,
|
||||||
priv->viewport[3] * window_scale);
|
priv->viewport[3] * fb_scale);
|
||||||
|
|
||||||
perspective = priv->perspective;
|
perspective = priv->perspective;
|
||||||
|
|
||||||
@@ -3617,10 +3620,8 @@ _clutter_stage_maybe_setup_viewport (ClutterStage *stage,
|
|||||||
perspective.aspect,
|
perspective.aspect,
|
||||||
perspective.z_near,
|
perspective.z_near,
|
||||||
z_2d,
|
z_2d,
|
||||||
priv->viewport[2] * window_scale,
|
priv->viewport[2],
|
||||||
priv->viewport[3] * window_scale);
|
priv->viewport[3]);
|
||||||
|
|
||||||
clutter_stage_apply_scale (stage);
|
|
||||||
|
|
||||||
clutter_stage_view_set_dirty_viewport (view, FALSE);
|
clutter_stage_view_set_dirty_viewport (view, FALSE);
|
||||||
}
|
}
|
||||||
@@ -4635,23 +4636,6 @@ clutter_stage_skip_sync_delay (ClutterStage *stage)
|
|||||||
_clutter_stage_window_schedule_update (stage_window, -1);
|
_clutter_stage_window_schedule_update (stage_window, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
_clutter_stage_set_scale_factor (ClutterStage *stage,
|
|
||||||
int factor)
|
|
||||||
{
|
|
||||||
ClutterStagePrivate *priv = stage->priv;
|
|
||||||
|
|
||||||
if (CLUTTER_ACTOR_IN_DESTRUCTION (stage))
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (priv->impl == NULL)
|
|
||||||
return;
|
|
||||||
|
|
||||||
_clutter_stage_window_set_scale_factor (priv->impl, factor);
|
|
||||||
|
|
||||||
clutter_actor_queue_redraw (CLUTTER_ACTOR (stage));
|
|
||||||
}
|
|
||||||
|
|
||||||
int64_t
|
int64_t
|
||||||
clutter_stage_get_frame_counter (ClutterStage *stage)
|
clutter_stage_get_frame_counter (ClutterStage *stage)
|
||||||
{
|
{
|
||||||
@@ -4712,8 +4696,8 @@ capture_view (ClutterStage *stage,
|
|||||||
clutter_stage_view_get_layout (view, &view_layout);
|
clutter_stage_view_get_layout (view, &view_layout);
|
||||||
|
|
||||||
cogl_framebuffer_read_pixels_into_bitmap (framebuffer,
|
cogl_framebuffer_read_pixels_into_bitmap (framebuffer,
|
||||||
view_layout.x + rect->x,
|
rect->x - view_layout.x,
|
||||||
view_layout.y + rect->y,
|
rect->y - view_layout.y,
|
||||||
COGL_READ_PIXELS_COLOR_BUFFER,
|
COGL_READ_PIXELS_COLOR_BUFFER,
|
||||||
bitmap);
|
bitmap);
|
||||||
|
|
||||||
|
@@ -245,6 +245,9 @@ guchar * clutter_stage_read_pixels (ClutterStage
|
|||||||
CLUTTER_AVAILABLE_IN_ALL
|
CLUTTER_AVAILABLE_IN_ALL
|
||||||
void clutter_stage_get_redraw_clip_bounds (ClutterStage *stage,
|
void clutter_stage_get_redraw_clip_bounds (ClutterStage *stage,
|
||||||
cairo_rectangle_int_t *clip);
|
cairo_rectangle_int_t *clip);
|
||||||
|
CLUTTER_AVAILABLE_IN_MUTTER
|
||||||
|
cairo_region_t * clutter_stage_get_redraw_clip (ClutterStage *stage);
|
||||||
|
|
||||||
CLUTTER_AVAILABLE_IN_ALL
|
CLUTTER_AVAILABLE_IN_ALL
|
||||||
void clutter_stage_ensure_viewport (ClutterStage *stage);
|
void clutter_stage_ensure_viewport (ClutterStage *stage);
|
||||||
CLUTTER_AVAILABLE_IN_ALL
|
CLUTTER_AVAILABLE_IN_ALL
|
||||||
|
@@ -312,7 +312,7 @@ G_BEGIN_DECLS
|
|||||||
*
|
*
|
||||||
* Since: 1.2
|
* Since: 1.2
|
||||||
*/
|
*/
|
||||||
const guint clutter_major_version;
|
extern const guint clutter_major_version;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* clutter_minor_version:
|
* clutter_minor_version:
|
||||||
@@ -326,7 +326,7 @@ const guint clutter_major_version;
|
|||||||
*
|
*
|
||||||
* Since: 1.2
|
* Since: 1.2
|
||||||
*/
|
*/
|
||||||
const guint clutter_minor_version;
|
extern const guint clutter_minor_version;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* clutter_micro_version:
|
* clutter_micro_version:
|
||||||
@@ -340,7 +340,7 @@ const guint clutter_minor_version;
|
|||||||
*
|
*
|
||||||
* Since: 1.2
|
* Since: 1.2
|
||||||
*/
|
*/
|
||||||
const guint clutter_micro_version;
|
extern const guint clutter_micro_version;
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
|
@@ -54,7 +54,7 @@ typedef struct _ClutterStageViewCoglPrivate
|
|||||||
/* Stores a list of previous damaged areas in the stage coordinate space */
|
/* Stores a list of previous damaged areas in the stage coordinate space */
|
||||||
#define DAMAGE_HISTORY_MAX 16
|
#define DAMAGE_HISTORY_MAX 16
|
||||||
#define DAMAGE_HISTORY(x) ((x) & (DAMAGE_HISTORY_MAX - 1))
|
#define DAMAGE_HISTORY(x) ((x) & (DAMAGE_HISTORY_MAX - 1))
|
||||||
cairo_rectangle_int_t damage_history[DAMAGE_HISTORY_MAX];
|
cairo_region_t * damage_history[DAMAGE_HISTORY_MAX];
|
||||||
unsigned int damage_index;
|
unsigned int damage_index;
|
||||||
} ClutterStageViewCoglPrivate;
|
} ClutterStageViewCoglPrivate;
|
||||||
|
|
||||||
@@ -246,13 +246,10 @@ clutter_stage_cogl_has_redraw_clips (ClutterStageWindow *stage_window)
|
|||||||
/* NB: at the start of each new frame there is an implied clip that
|
/* NB: at the start of each new frame there is an implied clip that
|
||||||
* clips everything (i.e. nothing would be drawn) so we need to make
|
* clips everything (i.e. nothing would be drawn) so we need to make
|
||||||
* sure we return True in the un-initialized case here.
|
* sure we return True in the un-initialized case here.
|
||||||
*
|
|
||||||
* NB: a clip width of 0 means a full stage redraw has been queued
|
|
||||||
* so we effectively don't have any redraw clips in that case.
|
|
||||||
*/
|
*/
|
||||||
if (!stage_cogl->initialized_redraw_clip ||
|
if (!stage_cogl->initialized_redraw_clip ||
|
||||||
(stage_cogl->initialized_redraw_clip &&
|
(stage_cogl->initialized_redraw_clip &&
|
||||||
stage_cogl->bounding_redraw_clip.width != 0))
|
stage_cogl->redraw_clip))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
else
|
else
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@@ -263,9 +260,9 @@ clutter_stage_cogl_ignoring_redraw_clips (ClutterStageWindow *stage_window)
|
|||||||
{
|
{
|
||||||
ClutterStageCogl *stage_cogl = CLUTTER_STAGE_COGL (stage_window);
|
ClutterStageCogl *stage_cogl = CLUTTER_STAGE_COGL (stage_window);
|
||||||
|
|
||||||
/* NB: a clip width of 0 means a full stage redraw is required */
|
/* NB: a NULL clip means a full stage redraw is required */
|
||||||
if (stage_cogl->initialized_redraw_clip &&
|
if (stage_cogl->initialized_redraw_clip &&
|
||||||
stage_cogl->bounding_redraw_clip.width == 0)
|
!stage_cogl->redraw_clip)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
else
|
else
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@@ -296,11 +293,11 @@ clutter_stage_cogl_add_redraw_clip (ClutterStageWindow *stage_window,
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
/* A NULL stage clip means a full stage redraw has been queued and
|
/* A NULL stage clip means a full stage redraw has been queued and
|
||||||
* we keep track of this by setting a zero width
|
* we keep track of this by setting a NULL redraw_clip.
|
||||||
* stage_cogl->bounding_redraw_clip */
|
*/
|
||||||
if (stage_clip == NULL)
|
if (stage_clip == NULL)
|
||||||
{
|
{
|
||||||
stage_cogl->bounding_redraw_clip.width = 0;
|
g_clear_pointer (&stage_cogl->redraw_clip, cairo_region_destroy);
|
||||||
stage_cogl->initialized_redraw_clip = TRUE;
|
stage_cogl->initialized_redraw_clip = TRUE;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -309,34 +306,27 @@ clutter_stage_cogl_add_redraw_clip (ClutterStageWindow *stage_window,
|
|||||||
if (stage_clip->width == 0 || stage_clip->height == 0)
|
if (stage_clip->width == 0 || stage_clip->height == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!stage_cogl->initialized_redraw_clip)
|
if (!stage_cogl->redraw_clip)
|
||||||
{
|
{
|
||||||
stage_cogl->bounding_redraw_clip = *stage_clip;
|
stage_cogl->redraw_clip = cairo_region_create_rectangle (stage_clip);
|
||||||
}
|
}
|
||||||
else if (stage_cogl->bounding_redraw_clip.width > 0)
|
else
|
||||||
{
|
{
|
||||||
_clutter_util_rectangle_union (&stage_cogl->bounding_redraw_clip,
|
cairo_region_union_rectangle (stage_cogl->redraw_clip, stage_clip);
|
||||||
stage_clip,
|
|
||||||
&stage_cogl->bounding_redraw_clip);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
stage_cogl->initialized_redraw_clip = TRUE;
|
stage_cogl->initialized_redraw_clip = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static cairo_region_t *
|
||||||
clutter_stage_cogl_get_redraw_clip_bounds (ClutterStageWindow *stage_window,
|
clutter_stage_cogl_get_redraw_clip (ClutterStageWindow *stage_window)
|
||||||
cairo_rectangle_int_t *stage_clip)
|
|
||||||
{
|
{
|
||||||
ClutterStageCogl *stage_cogl = CLUTTER_STAGE_COGL (stage_window);
|
ClutterStageCogl *stage_cogl = CLUTTER_STAGE_COGL (stage_window);
|
||||||
|
|
||||||
if (stage_cogl->using_clipped_redraw)
|
if (stage_cogl->using_clipped_redraw && stage_cogl->redraw_clip)
|
||||||
{
|
return cairo_region_copy (stage_cogl->redraw_clip);
|
||||||
*stage_clip = stage_cogl->bounding_redraw_clip;
|
|
||||||
|
|
||||||
return TRUE;
|
return NULL;
|
||||||
}
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline gboolean
|
static inline gboolean
|
||||||
@@ -414,37 +404,51 @@ swap_framebuffer (ClutterStageWindow *stage_window,
|
|||||||
static void
|
static void
|
||||||
paint_stage (ClutterStageCogl *stage_cogl,
|
paint_stage (ClutterStageCogl *stage_cogl,
|
||||||
ClutterStageView *view,
|
ClutterStageView *view,
|
||||||
const cairo_rectangle_int_t *clip)
|
cairo_region_t *clip)
|
||||||
{
|
{
|
||||||
ClutterStage *stage = stage_cogl->wrapper;
|
ClutterStage *stage = stage_cogl->wrapper;
|
||||||
|
cairo_rectangle_int_t clip_rect;
|
||||||
|
|
||||||
|
cairo_region_get_extents (clip, &clip_rect);
|
||||||
|
|
||||||
_clutter_stage_maybe_setup_viewport (stage, view);
|
_clutter_stage_maybe_setup_viewport (stage, view);
|
||||||
_clutter_stage_paint_view (stage, view, clip);
|
_clutter_stage_paint_view (stage, view, &clip_rect);
|
||||||
|
|
||||||
if (clutter_stage_view_get_onscreen (view) !=
|
if (clutter_stage_view_get_onscreen (view) !=
|
||||||
clutter_stage_view_get_framebuffer (view))
|
clutter_stage_view_get_framebuffer (view))
|
||||||
{
|
{
|
||||||
clutter_stage_view_blit_offscreen (view, clip);
|
clutter_stage_view_blit_offscreen (view, &clip_rect);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
fill_current_damage_history_and_step (ClutterStageView *view)
|
fill_current_damage_history (ClutterStageView *view,
|
||||||
|
cairo_region_t *damage)
|
||||||
{
|
{
|
||||||
ClutterStageViewCogl *view_cogl = CLUTTER_STAGE_VIEW_COGL (view);
|
ClutterStageViewCogl *view_cogl = CLUTTER_STAGE_VIEW_COGL (view);
|
||||||
ClutterStageViewCoglPrivate *view_priv =
|
ClutterStageViewCoglPrivate *view_priv =
|
||||||
clutter_stage_view_cogl_get_instance_private (view_cogl);
|
clutter_stage_view_cogl_get_instance_private (view_cogl);
|
||||||
cairo_rectangle_int_t view_rect;
|
cairo_region_t **current_damage;
|
||||||
cairo_rectangle_int_t *current_damage;
|
|
||||||
|
|
||||||
current_damage =
|
current_damage =
|
||||||
&view_priv->damage_history[DAMAGE_HISTORY (view_priv->damage_index)];
|
&view_priv->damage_history[DAMAGE_HISTORY (view_priv->damage_index)];
|
||||||
clutter_stage_view_get_layout (view, &view_rect);
|
|
||||||
|
|
||||||
*current_damage = view_rect;
|
g_clear_pointer (current_damage, cairo_region_destroy);
|
||||||
|
*current_damage = cairo_region_copy (damage);
|
||||||
view_priv->damage_index++;
|
view_priv->damage_index++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
fill_current_damage_history_rectangle (ClutterStageView *view,
|
||||||
|
const cairo_rectangle_int_t *rect)
|
||||||
|
{
|
||||||
|
cairo_region_t *damage;
|
||||||
|
|
||||||
|
damage = cairo_region_create_rectangle (rect);
|
||||||
|
fill_current_damage_history (view, damage);
|
||||||
|
cairo_region_destroy (damage);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
transform_swap_region_to_onscreen (ClutterStageView *view,
|
transform_swap_region_to_onscreen (ClutterStageView *view,
|
||||||
cairo_rectangle_int_t *swap_region)
|
cairo_rectangle_int_t *swap_region)
|
||||||
@@ -499,11 +503,13 @@ clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
|
|||||||
gboolean do_swap_buffer;
|
gboolean do_swap_buffer;
|
||||||
gboolean swap_with_damage;
|
gboolean swap_with_damage;
|
||||||
ClutterActor *wrapper;
|
ClutterActor *wrapper;
|
||||||
cairo_rectangle_int_t redraw_clip;
|
cairo_region_t *redraw_clip;
|
||||||
|
cairo_region_t *clip_region;
|
||||||
cairo_rectangle_int_t swap_region;
|
cairo_rectangle_int_t swap_region;
|
||||||
cairo_rectangle_int_t clip_region;
|
cairo_rectangle_int_t clip_rect;
|
||||||
|
cairo_rectangle_int_t redraw_rect;
|
||||||
gboolean clip_region_empty;
|
gboolean clip_region_empty;
|
||||||
int window_scale;
|
int fb_scale;
|
||||||
|
|
||||||
wrapper = CLUTTER_ACTOR (stage_cogl->wrapper);
|
wrapper = CLUTTER_ACTOR (stage_cogl->wrapper);
|
||||||
|
|
||||||
@@ -517,20 +523,19 @@ clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
|
|||||||
cogl_is_onscreen (fb) &&
|
cogl_is_onscreen (fb) &&
|
||||||
cogl_clutter_winsys_has_feature (COGL_WINSYS_FEATURE_BUFFER_AGE);
|
cogl_clutter_winsys_has_feature (COGL_WINSYS_FEATURE_BUFFER_AGE);
|
||||||
|
|
||||||
/* NB: a zero width redraw clip == full stage redraw */
|
/* NB: a NULL redraw clip == full stage redraw */
|
||||||
if (stage_cogl->bounding_redraw_clip.width == 0)
|
if (!stage_cogl->redraw_clip)
|
||||||
have_clip = FALSE;
|
have_clip = FALSE;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
redraw_clip = stage_cogl->bounding_redraw_clip;
|
cairo_region_t *view_region;
|
||||||
_clutter_util_rectangle_intersection (&redraw_clip,
|
redraw_clip = cairo_region_copy (stage_cogl->redraw_clip);
|
||||||
&view_rect,
|
|
||||||
&redraw_clip);
|
|
||||||
|
|
||||||
have_clip = !(redraw_clip.x == view_rect.x &&
|
view_region = cairo_region_create_rectangle (&view_rect);
|
||||||
redraw_clip.y == view_rect.y &&
|
cairo_region_intersect (redraw_clip, view_region);
|
||||||
redraw_clip.width == view_rect.width &&
|
|
||||||
redraw_clip.height == view_rect.height);
|
have_clip = !cairo_region_equal (redraw_clip, view_region);
|
||||||
|
cairo_region_destroy (view_region);
|
||||||
}
|
}
|
||||||
|
|
||||||
may_use_clipped_redraw = FALSE;
|
may_use_clipped_redraw = FALSE;
|
||||||
@@ -542,11 +547,12 @@ clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
|
|||||||
cogl_onscreen_get_frame_counter (COGL_ONSCREEN (fb)) > 3)
|
cogl_onscreen_get_frame_counter (COGL_ONSCREEN (fb)) > 3)
|
||||||
{
|
{
|
||||||
may_use_clipped_redraw = TRUE;
|
may_use_clipped_redraw = TRUE;
|
||||||
clip_region = redraw_clip;
|
clip_region = cairo_region_reference (redraw_clip);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
clip_region = (cairo_rectangle_int_t){ 0 };
|
clip_region = cairo_region_create ();
|
||||||
|
redraw_clip = cairo_region_reference (clip_region);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (may_use_clipped_redraw &&
|
if (may_use_clipped_redraw &&
|
||||||
@@ -555,9 +561,9 @@ clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
|
|||||||
else
|
else
|
||||||
use_clipped_redraw = FALSE;
|
use_clipped_redraw = FALSE;
|
||||||
|
|
||||||
clip_region_empty = may_use_clipped_redraw && clip_region.width == 0;
|
clip_region_empty = may_use_clipped_redraw && cairo_region_is_empty (clip_region);
|
||||||
|
|
||||||
window_scale = _clutter_stage_window_get_scale_factor (stage_window);
|
fb_scale = clutter_stage_view_get_scale (view);
|
||||||
|
|
||||||
swap_with_damage = FALSE;
|
swap_with_damage = FALSE;
|
||||||
if (has_buffer_age)
|
if (has_buffer_age)
|
||||||
@@ -565,34 +571,26 @@ clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
|
|||||||
if (use_clipped_redraw && !clip_region_empty)
|
if (use_clipped_redraw && !clip_region_empty)
|
||||||
{
|
{
|
||||||
int age, i;
|
int age, i;
|
||||||
cairo_rectangle_int_t *current_damage =
|
|
||||||
&view_priv->damage_history[DAMAGE_HISTORY (view_priv->damage_index++)];
|
|
||||||
|
|
||||||
age = cogl_onscreen_get_buffer_age (COGL_ONSCREEN (fb));
|
age = cogl_onscreen_get_buffer_age (COGL_ONSCREEN (fb));
|
||||||
|
|
||||||
if (valid_buffer_age (view_cogl, age))
|
if (valid_buffer_age (view_cogl, age))
|
||||||
{
|
{
|
||||||
*current_damage = clip_region;
|
fill_current_damage_history (view, clip_region);
|
||||||
|
|
||||||
for (i = 1; i <= age; i++)
|
for (i = 1; i <= age; i++)
|
||||||
{
|
{
|
||||||
cairo_rectangle_int_t *damage =
|
cairo_region_t *damage =
|
||||||
&view_priv->damage_history[DAMAGE_HISTORY (view_priv->damage_index - i - 1)];
|
view_priv->damage_history[DAMAGE_HISTORY (view_priv->damage_index - i - 1)];
|
||||||
|
cairo_region_union (clip_region, damage);
|
||||||
_clutter_util_rectangle_union (&clip_region, damage, &clip_region);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Update the bounding redraw clip state with the extra damage. */
|
/* Update the redraw clip state with the extra damage. */
|
||||||
_clutter_util_rectangle_union (&stage_cogl->bounding_redraw_clip,
|
cairo_region_union (stage_cogl->redraw_clip, clip_region);
|
||||||
&clip_region,
|
|
||||||
&stage_cogl->bounding_redraw_clip);
|
|
||||||
|
|
||||||
CLUTTER_NOTE (CLIPPING, "Reusing back buffer(age=%d) - repairing region: x=%d, y=%d, width=%d, height=%d\n",
|
CLUTTER_NOTE (CLIPPING, "Reusing back buffer(age=%d) - repairing region: num rects: %d\n",
|
||||||
age,
|
age,
|
||||||
clip_region.x,
|
cairo_region_num_rectangles (clip_region));
|
||||||
clip_region.y,
|
|
||||||
clip_region.width,
|
|
||||||
clip_region.height);
|
|
||||||
|
|
||||||
swap_with_damage = TRUE;
|
swap_with_damage = TRUE;
|
||||||
}
|
}
|
||||||
@@ -600,15 +598,17 @@ clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
|
|||||||
{
|
{
|
||||||
CLUTTER_NOTE (CLIPPING, "Invalid back buffer(age=%d): forcing full redraw\n", age);
|
CLUTTER_NOTE (CLIPPING, "Invalid back buffer(age=%d): forcing full redraw\n", age);
|
||||||
use_clipped_redraw = FALSE;
|
use_clipped_redraw = FALSE;
|
||||||
*current_damage = view_rect;
|
fill_current_damage_history_rectangle (view, &view_rect);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (!use_clipped_redraw)
|
else if (!use_clipped_redraw)
|
||||||
{
|
{
|
||||||
fill_current_damage_history_and_step (view);
|
fill_current_damage_history_rectangle (view, &view_rect);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cairo_region_get_extents (clip_region, &clip_rect);
|
||||||
|
|
||||||
cogl_push_framebuffer (fb);
|
cogl_push_framebuffer (fb);
|
||||||
if (use_clipped_redraw && clip_region_empty)
|
if (use_clipped_redraw && clip_region_empty)
|
||||||
{
|
{
|
||||||
@@ -621,21 +621,21 @@ clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
|
|||||||
|
|
||||||
CLUTTER_NOTE (CLIPPING,
|
CLUTTER_NOTE (CLIPPING,
|
||||||
"Stage clip pushed: x=%d, y=%d, width=%d, height=%d\n",
|
"Stage clip pushed: x=%d, y=%d, width=%d, height=%d\n",
|
||||||
clip_region.x,
|
clip_rect.x,
|
||||||
clip_region.y,
|
clip_rect.y,
|
||||||
clip_region.width,
|
clip_rect.width,
|
||||||
clip_region.height);
|
clip_rect.height);
|
||||||
|
|
||||||
stage_cogl->using_clipped_redraw = TRUE;
|
stage_cogl->using_clipped_redraw = TRUE;
|
||||||
|
|
||||||
scissor_x = (clip_region.x - view_rect.x) * window_scale;
|
scissor_x = (clip_rect.x - view_rect.x) * fb_scale;
|
||||||
scissor_y = (clip_region.y - view_rect.y) * window_scale;
|
scissor_y = (clip_rect.y - view_rect.y) * fb_scale;
|
||||||
cogl_framebuffer_push_scissor_clip (fb,
|
cogl_framebuffer_push_scissor_clip (fb,
|
||||||
scissor_x,
|
scissor_x,
|
||||||
scissor_y,
|
scissor_y,
|
||||||
clip_region.width * window_scale,
|
clip_rect.width * fb_scale,
|
||||||
clip_region.height * window_scale);
|
clip_rect.height * fb_scale);
|
||||||
paint_stage (stage_cogl, view, &clip_region);
|
paint_stage (stage_cogl, view, clip_region);
|
||||||
cogl_framebuffer_pop_clip (fb);
|
cogl_framebuffer_pop_clip (fb);
|
||||||
|
|
||||||
stage_cogl->using_clipped_redraw = FALSE;
|
stage_cogl->using_clipped_redraw = FALSE;
|
||||||
@@ -645,7 +645,7 @@ clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
|
|||||||
CLUTTER_NOTE (CLIPPING, "Unclipped stage paint\n");
|
CLUTTER_NOTE (CLIPPING, "Unclipped stage paint\n");
|
||||||
|
|
||||||
/* If we are trying to debug redraw issues then we want to pass
|
/* If we are trying to debug redraw issues then we want to pass
|
||||||
* the bounding_redraw_clip so it can be visualized */
|
* the redraw_clip so it can be visualized */
|
||||||
if (G_UNLIKELY (clutter_paint_debug_flags & CLUTTER_DEBUG_DISABLE_CLIPPED_REDRAWS) &&
|
if (G_UNLIKELY (clutter_paint_debug_flags & CLUTTER_DEBUG_DISABLE_CLIPPED_REDRAWS) &&
|
||||||
may_use_clipped_redraw &&
|
may_use_clipped_redraw &&
|
||||||
!clip_region_empty)
|
!clip_region_empty)
|
||||||
@@ -653,31 +653,39 @@ clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
|
|||||||
int scissor_x;
|
int scissor_x;
|
||||||
int scissor_y;
|
int scissor_y;
|
||||||
|
|
||||||
scissor_x = (clip_region.x - view_rect.x) * window_scale;;
|
scissor_x = (clip_rect.x - view_rect.x) * fb_scale;;
|
||||||
scissor_y = (clip_region.y - view_rect.y) * window_scale;
|
scissor_y = (clip_rect.y - view_rect.y) * fb_scale;
|
||||||
cogl_framebuffer_push_scissor_clip (fb,
|
cogl_framebuffer_push_scissor_clip (fb,
|
||||||
scissor_x,
|
scissor_x,
|
||||||
scissor_y,
|
scissor_y,
|
||||||
clip_region.width * window_scale,
|
clip_rect.width * fb_scale,
|
||||||
clip_region.height * window_scale);
|
clip_rect.height * fb_scale);
|
||||||
paint_stage (stage_cogl, view, &clip_region);
|
paint_stage (stage_cogl, view, clip_region);
|
||||||
cogl_framebuffer_pop_clip (fb);
|
cogl_framebuffer_pop_clip (fb);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
paint_stage (stage_cogl, view, &view_rect);
|
{
|
||||||
|
cairo_region_t *view_region;
|
||||||
|
|
||||||
|
view_region = cairo_region_create_rectangle (&view_rect);
|
||||||
|
paint_stage (stage_cogl, view, view_region);
|
||||||
|
cairo_region_destroy (view_region);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
cogl_pop_framebuffer ();
|
cogl_pop_framebuffer ();
|
||||||
|
|
||||||
|
cairo_region_get_extents (redraw_clip, &redraw_rect);
|
||||||
|
|
||||||
if (may_use_clipped_redraw &&
|
if (may_use_clipped_redraw &&
|
||||||
G_UNLIKELY ((clutter_paint_debug_flags & CLUTTER_DEBUG_REDRAWS)))
|
G_UNLIKELY ((clutter_paint_debug_flags & CLUTTER_DEBUG_REDRAWS)))
|
||||||
{
|
{
|
||||||
CoglContext *ctx = cogl_framebuffer_get_context (fb);
|
CoglContext *ctx = cogl_framebuffer_get_context (fb);
|
||||||
static CoglPipeline *outline = NULL;
|
static CoglPipeline *outline = NULL;
|
||||||
ClutterActor *actor = CLUTTER_ACTOR (wrapper);
|
ClutterActor *actor = CLUTTER_ACTOR (wrapper);
|
||||||
float x_1 = redraw_clip.x;
|
float x_1 = redraw_rect.x;
|
||||||
float x_2 = redraw_clip.x + redraw_clip.width;
|
float x_2 = redraw_rect.x + redraw_rect.width;
|
||||||
float y_1 = redraw_clip.y;
|
float y_1 = redraw_rect.y;
|
||||||
float y_2 = redraw_clip.y + redraw_clip.height;
|
float y_2 = redraw_rect.y + redraw_rect.height;
|
||||||
CoglVertexP2 quad[4] = {
|
CoglVertexP2 quad[4] = {
|
||||||
{ x_1, y_1 },
|
{ x_1, y_1 },
|
||||||
{ x_2, y_1 },
|
{ x_2, y_1 },
|
||||||
@@ -724,10 +732,10 @@ clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
|
|||||||
else if (use_clipped_redraw)
|
else if (use_clipped_redraw)
|
||||||
{
|
{
|
||||||
swap_region = (cairo_rectangle_int_t) {
|
swap_region = (cairo_rectangle_int_t) {
|
||||||
.x = (clip_region.x - view_rect.x) * window_scale,
|
.x = (clip_rect.x - view_rect.x) * fb_scale,
|
||||||
.y = (clip_region.y - view_rect.y) * window_scale,
|
.y = (clip_rect.y - view_rect.y) * fb_scale,
|
||||||
.width = clip_region.width * window_scale,
|
.width = clip_rect.width * fb_scale,
|
||||||
.height = clip_region.height * window_scale,
|
.height = clip_rect.height * fb_scale,
|
||||||
};
|
};
|
||||||
g_assert (swap_region.width > 0);
|
g_assert (swap_region.width > 0);
|
||||||
do_swap_buffer = TRUE;
|
do_swap_buffer = TRUE;
|
||||||
@@ -737,8 +745,8 @@ clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
|
|||||||
swap_region = (cairo_rectangle_int_t) {
|
swap_region = (cairo_rectangle_int_t) {
|
||||||
.x = 0,
|
.x = 0,
|
||||||
.y = 0,
|
.y = 0,
|
||||||
.width = view_rect.width * window_scale,
|
.width = view_rect.width * fb_scale,
|
||||||
.height = view_rect.height * window_scale,
|
.height = view_rect.height * fb_scale,
|
||||||
};
|
};
|
||||||
do_swap_buffer = TRUE;
|
do_swap_buffer = TRUE;
|
||||||
}
|
}
|
||||||
@@ -749,6 +757,11 @@ clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
|
|||||||
do_swap_buffer = TRUE;
|
do_swap_buffer = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (redraw_clip)
|
||||||
|
cairo_region_destroy (redraw_clip);
|
||||||
|
if (clip_region)
|
||||||
|
cairo_region_destroy (clip_region);
|
||||||
|
|
||||||
if (do_swap_buffer)
|
if (do_swap_buffer)
|
||||||
{
|
{
|
||||||
if (clutter_stage_view_get_onscreen (view) !=
|
if (clutter_stage_view_get_onscreen (view) !=
|
||||||
@@ -796,6 +809,7 @@ clutter_stage_cogl_redraw (ClutterStageWindow *stage_window)
|
|||||||
|
|
||||||
/* reset the redraw clipping for the next paint... */
|
/* reset the redraw clipping for the next paint... */
|
||||||
stage_cogl->initialized_redraw_clip = FALSE;
|
stage_cogl->initialized_redraw_clip = FALSE;
|
||||||
|
g_clear_pointer (&stage_cogl->redraw_clip, cairo_region_destroy);
|
||||||
|
|
||||||
stage_cogl->frame_count++;
|
stage_cogl->frame_count++;
|
||||||
}
|
}
|
||||||
@@ -810,7 +824,7 @@ clutter_stage_cogl_get_dirty_pixel (ClutterStageWindow *stage_window,
|
|||||||
gboolean has_buffer_age =
|
gboolean has_buffer_age =
|
||||||
cogl_is_onscreen (framebuffer) &&
|
cogl_is_onscreen (framebuffer) &&
|
||||||
cogl_clutter_winsys_has_feature (COGL_WINSYS_FEATURE_BUFFER_AGE);
|
cogl_clutter_winsys_has_feature (COGL_WINSYS_FEATURE_BUFFER_AGE);
|
||||||
cairo_rectangle_int_t *rect;
|
cairo_rectangle_int_t rect;
|
||||||
|
|
||||||
if (!has_buffer_age)
|
if (!has_buffer_age)
|
||||||
{
|
{
|
||||||
@@ -823,12 +837,18 @@ clutter_stage_cogl_get_dirty_pixel (ClutterStageWindow *stage_window,
|
|||||||
ClutterStageViewCoglPrivate *view_priv =
|
ClutterStageViewCoglPrivate *view_priv =
|
||||||
clutter_stage_view_cogl_get_instance_private (view_cogl);
|
clutter_stage_view_cogl_get_instance_private (view_cogl);
|
||||||
cairo_rectangle_int_t view_layout;
|
cairo_rectangle_int_t view_layout;
|
||||||
|
cairo_region_t *damage;
|
||||||
|
|
||||||
clutter_stage_view_get_layout (view, &view_layout);
|
clutter_stage_view_get_layout (view, &view_layout);
|
||||||
|
|
||||||
rect = &view_priv->damage_history[DAMAGE_HISTORY (view_priv->damage_index - 1)];
|
damage = view_priv->damage_history[DAMAGE_HISTORY (view_priv->damage_index - 1)];
|
||||||
*x = rect->x - view_layout.x;
|
if (damage)
|
||||||
*y = rect->y - view_layout.y;
|
cairo_region_get_rectangle (damage, 0, &rect);
|
||||||
|
else
|
||||||
|
rect.x = rect.y = 0;
|
||||||
|
|
||||||
|
*x = rect.x - view_layout.x;
|
||||||
|
*y = rect.y - view_layout.y;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -847,7 +867,7 @@ clutter_stage_window_iface_init (ClutterStageWindowIface *iface)
|
|||||||
iface->add_redraw_clip = clutter_stage_cogl_add_redraw_clip;
|
iface->add_redraw_clip = clutter_stage_cogl_add_redraw_clip;
|
||||||
iface->has_redraw_clips = clutter_stage_cogl_has_redraw_clips;
|
iface->has_redraw_clips = clutter_stage_cogl_has_redraw_clips;
|
||||||
iface->ignoring_redraw_clips = clutter_stage_cogl_ignoring_redraw_clips;
|
iface->ignoring_redraw_clips = clutter_stage_cogl_ignoring_redraw_clips;
|
||||||
iface->get_redraw_clip_bounds = clutter_stage_cogl_get_redraw_clip_bounds;
|
iface->get_redraw_clip = clutter_stage_cogl_get_redraw_clip;
|
||||||
iface->redraw = clutter_stage_cogl_redraw;
|
iface->redraw = clutter_stage_cogl_redraw;
|
||||||
iface->get_dirty_pixel = clutter_stage_cogl_get_dirty_pixel;
|
iface->get_dirty_pixel = clutter_stage_cogl_get_dirty_pixel;
|
||||||
}
|
}
|
||||||
|
@@ -59,7 +59,7 @@ struct _ClutterStageCogl
|
|||||||
* junk frames to start with. */
|
* junk frames to start with. */
|
||||||
unsigned int frame_count;
|
unsigned int frame_count;
|
||||||
|
|
||||||
cairo_rectangle_int_t bounding_redraw_clip;
|
cairo_region_t *redraw_clip;
|
||||||
|
|
||||||
guint initialized_redraw_clip : 1;
|
guint initialized_redraw_clip : 1;
|
||||||
|
|
||||||
|
@@ -102,6 +102,9 @@ struct _ClutterDeviceManagerEvdevPrivate
|
|||||||
gpointer constrain_data;
|
gpointer constrain_data;
|
||||||
GDestroyNotify constrain_data_notify;
|
GDestroyNotify constrain_data_notify;
|
||||||
|
|
||||||
|
ClutterRelativeMotionFilter relative_motion_filter;
|
||||||
|
gpointer relative_motion_filter_user_data;
|
||||||
|
|
||||||
ClutterStageManager *stage_manager;
|
ClutterStageManager *stage_manager;
|
||||||
guint stage_added_handler;
|
guint stage_added_handler;
|
||||||
guint stage_removed_handler;
|
guint stage_removed_handler;
|
||||||
@@ -124,6 +127,7 @@ G_DEFINE_TYPE_WITH_CODE (ClutterDeviceManagerEvdev,
|
|||||||
static ClutterOpenDeviceCallback device_open_callback;
|
static ClutterOpenDeviceCallback device_open_callback;
|
||||||
static ClutterCloseDeviceCallback device_close_callback;
|
static ClutterCloseDeviceCallback device_close_callback;
|
||||||
static gpointer device_callback_data;
|
static gpointer device_callback_data;
|
||||||
|
static gchar * evdev_seat_id;
|
||||||
|
|
||||||
#ifdef CLUTTER_ENABLE_DEBUG
|
#ifdef CLUTTER_ENABLE_DEBUG
|
||||||
static const char *device_type_str[] = {
|
static const char *device_type_str[] = {
|
||||||
@@ -263,6 +267,22 @@ _clutter_device_manager_evdev_constrain_pointer (ClutterDeviceManagerEvdev *mana
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
_clutter_device_manager_evdev_filter_relative_motion (ClutterDeviceManagerEvdev *manager_evdev,
|
||||||
|
ClutterInputDevice *device,
|
||||||
|
float x,
|
||||||
|
float y,
|
||||||
|
float *dx,
|
||||||
|
float *dy)
|
||||||
|
{
|
||||||
|
ClutterDeviceManagerEvdevPrivate *priv = manager_evdev->priv;
|
||||||
|
|
||||||
|
if (!priv->relative_motion_filter)
|
||||||
|
return;
|
||||||
|
|
||||||
|
priv->relative_motion_filter (device, x, y, dx, dy,
|
||||||
|
priv->relative_motion_filter_user_data);
|
||||||
|
}
|
||||||
|
|
||||||
static ClutterEvent *
|
static ClutterEvent *
|
||||||
new_absolute_motion_event (ClutterInputDevice *input_device,
|
new_absolute_motion_event (ClutterInputDevice *input_device,
|
||||||
@@ -311,6 +331,9 @@ new_absolute_motion_event (ClutterInputDevice *input_device,
|
|||||||
_clutter_xkb_translate_state (event, seat->xkb, seat->button_state);
|
_clutter_xkb_translate_state (event, seat->xkb, seat->button_state);
|
||||||
event->motion.x = x;
|
event->motion.x = x;
|
||||||
event->motion.y = y;
|
event->motion.y = y;
|
||||||
|
clutter_input_device_evdev_translate_coordinates (input_device, stage,
|
||||||
|
&event->motion.x,
|
||||||
|
&event->motion.y);
|
||||||
event->motion.axes = axes;
|
event->motion.axes = axes;
|
||||||
clutter_event_set_source_device (event, input_device);
|
clutter_event_set_source_device (event, input_device);
|
||||||
|
|
||||||
@@ -354,11 +377,23 @@ notify_relative_tool_motion (ClutterInputDevice *input_device,
|
|||||||
gfloat dy,
|
gfloat dy,
|
||||||
gdouble *axes)
|
gdouble *axes)
|
||||||
{
|
{
|
||||||
|
ClutterInputDeviceEvdev *device_evdev;
|
||||||
ClutterEvent *event;
|
ClutterEvent *event;
|
||||||
|
ClutterSeatEvdev *seat;
|
||||||
gfloat x, y;
|
gfloat x, y;
|
||||||
|
|
||||||
|
device_evdev = CLUTTER_INPUT_DEVICE_EVDEV (input_device);
|
||||||
|
seat = _clutter_input_device_evdev_get_seat (device_evdev);
|
||||||
x = input_device->current_x + dx;
|
x = input_device->current_x + dx;
|
||||||
y = input_device->current_y + dy;
|
y = input_device->current_y + dy;
|
||||||
|
|
||||||
|
_clutter_device_manager_evdev_filter_relative_motion (seat->manager_evdev,
|
||||||
|
input_device,
|
||||||
|
seat->pointer_x,
|
||||||
|
seat->pointer_y,
|
||||||
|
&dx,
|
||||||
|
&dy);
|
||||||
|
|
||||||
event = new_absolute_motion_event (input_device, time_us, x, y, axes);
|
event = new_absolute_motion_event (input_device, time_us, x, y, axes);
|
||||||
_clutter_evdev_event_set_relative_motion (event, dx, dy, 0, 0);
|
_clutter_evdev_event_set_relative_motion (event, dx, dy, 0, 0);
|
||||||
|
|
||||||
@@ -509,6 +544,10 @@ notify_touch_event (ClutterInputDevice *input_device,
|
|||||||
event->touch.device = seat->core_pointer;
|
event->touch.device = seat->core_pointer;
|
||||||
event->touch.x = x;
|
event->touch.x = x;
|
||||||
event->touch.y = y;
|
event->touch.y = y;
|
||||||
|
clutter_input_device_evdev_translate_coordinates (input_device, stage,
|
||||||
|
&event->touch.x,
|
||||||
|
&event->touch.y);
|
||||||
|
|
||||||
/* "NULL" sequences are special cased in clutter */
|
/* "NULL" sequences are special cased in clutter */
|
||||||
event->touch.sequence = GINT_TO_POINTER (slot + 1);
|
event->touch.sequence = GINT_TO_POINTER (slot + 1);
|
||||||
_clutter_xkb_translate_state (event, seat->xkb, seat->button_state);
|
_clutter_xkb_translate_state (event, seat->xkb, seat->button_state);
|
||||||
@@ -530,7 +569,8 @@ notify_pinch_gesture_event (ClutterInputDevice *input_device,
|
|||||||
gdouble dx,
|
gdouble dx,
|
||||||
gdouble dy,
|
gdouble dy,
|
||||||
gdouble angle_delta,
|
gdouble angle_delta,
|
||||||
gdouble scale)
|
gdouble scale,
|
||||||
|
guint n_fingers)
|
||||||
{
|
{
|
||||||
ClutterInputDeviceEvdev *device_evdev;
|
ClutterInputDeviceEvdev *device_evdev;
|
||||||
ClutterSeatEvdev *seat;
|
ClutterSeatEvdev *seat;
|
||||||
@@ -561,6 +601,7 @@ notify_pinch_gesture_event (ClutterInputDevice *input_device,
|
|||||||
event->touchpad_pinch.dy = dy;
|
event->touchpad_pinch.dy = dy;
|
||||||
event->touchpad_pinch.angle_delta = angle_delta;
|
event->touchpad_pinch.angle_delta = angle_delta;
|
||||||
event->touchpad_pinch.scale = scale;
|
event->touchpad_pinch.scale = scale;
|
||||||
|
event->touchpad_pinch.n_fingers = n_fingers;
|
||||||
|
|
||||||
_clutter_xkb_translate_state (event, seat->xkb, seat->button_state);
|
_clutter_xkb_translate_state (event, seat->xkb, seat->button_state);
|
||||||
|
|
||||||
@@ -658,6 +699,7 @@ notify_pad_button (ClutterInputDevice *input_device,
|
|||||||
guint64 time_us,
|
guint64 time_us,
|
||||||
guint32 button,
|
guint32 button,
|
||||||
guint32 mode_group,
|
guint32 mode_group,
|
||||||
|
guint32 mode,
|
||||||
guint32 pressed)
|
guint32 pressed)
|
||||||
{
|
{
|
||||||
ClutterInputDeviceEvdev *device_evdev;
|
ClutterInputDeviceEvdev *device_evdev;
|
||||||
@@ -683,6 +725,7 @@ notify_pad_button (ClutterInputDevice *input_device,
|
|||||||
event->pad_button.stage = stage;
|
event->pad_button.stage = stage;
|
||||||
event->pad_button.button = button;
|
event->pad_button.button = button;
|
||||||
event->pad_button.group = mode_group;
|
event->pad_button.group = mode_group;
|
||||||
|
event->pad_button.mode = mode;
|
||||||
clutter_event_set_device (event, input_device);
|
clutter_event_set_device (event, input_device);
|
||||||
clutter_event_set_source_device (event, input_device);
|
clutter_event_set_source_device (event, input_device);
|
||||||
clutter_event_set_time (event, us2ms (time_us));
|
clutter_event_set_time (event, us2ms (time_us));
|
||||||
@@ -698,6 +741,7 @@ notify_pad_strip (ClutterInputDevice *input_device,
|
|||||||
guint32 strip_number,
|
guint32 strip_number,
|
||||||
guint32 strip_source,
|
guint32 strip_source,
|
||||||
guint32 mode_group,
|
guint32 mode_group,
|
||||||
|
guint32 mode,
|
||||||
gdouble value)
|
gdouble value)
|
||||||
{
|
{
|
||||||
ClutterInputDeviceEvdev *device_evdev;
|
ClutterInputDeviceEvdev *device_evdev;
|
||||||
@@ -727,6 +771,7 @@ notify_pad_strip (ClutterInputDevice *input_device,
|
|||||||
event->pad_strip.strip_number = strip_number;
|
event->pad_strip.strip_number = strip_number;
|
||||||
event->pad_strip.value = value;
|
event->pad_strip.value = value;
|
||||||
event->pad_strip.group = mode_group;
|
event->pad_strip.group = mode_group;
|
||||||
|
event->pad_strip.mode = mode;
|
||||||
clutter_event_set_device (event, input_device);
|
clutter_event_set_device (event, input_device);
|
||||||
clutter_event_set_source_device (event, input_device);
|
clutter_event_set_source_device (event, input_device);
|
||||||
clutter_event_set_time (event, us2ms (time_us));
|
clutter_event_set_time (event, us2ms (time_us));
|
||||||
@@ -742,6 +787,7 @@ notify_pad_ring (ClutterInputDevice *input_device,
|
|||||||
guint32 ring_number,
|
guint32 ring_number,
|
||||||
guint32 ring_source,
|
guint32 ring_source,
|
||||||
guint32 mode_group,
|
guint32 mode_group,
|
||||||
|
guint32 mode,
|
||||||
gdouble angle)
|
gdouble angle)
|
||||||
{
|
{
|
||||||
ClutterInputDeviceEvdev *device_evdev;
|
ClutterInputDeviceEvdev *device_evdev;
|
||||||
@@ -771,6 +817,7 @@ notify_pad_ring (ClutterInputDevice *input_device,
|
|||||||
event->pad_ring.ring_number = ring_number;
|
event->pad_ring.ring_number = ring_number;
|
||||||
event->pad_ring.angle = angle;
|
event->pad_ring.angle = angle;
|
||||||
event->pad_ring.group = mode_group;
|
event->pad_ring.group = mode_group;
|
||||||
|
event->pad_ring.mode = mode;
|
||||||
clutter_event_set_device (event, input_device);
|
clutter_event_set_device (event, input_device);
|
||||||
clutter_event_set_source_device (event, input_device);
|
clutter_event_set_source_device (event, input_device);
|
||||||
clutter_event_set_time (event, us2ms (time_us));
|
clutter_event_set_time (event, us2ms (time_us));
|
||||||
@@ -1208,11 +1255,17 @@ input_device_update_tool (ClutterInputDevice *input_device,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
evdev_device->last_tool = tool;
|
if (evdev_device->last_tool != tool)
|
||||||
|
{
|
||||||
|
evdev_device->last_tool = tool;
|
||||||
|
g_signal_emit_by_name (clutter_device_manager_get_default (),
|
||||||
|
"tool-changed", input_device, tool);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static gdouble *
|
static gdouble *
|
||||||
translate_tablet_axes (struct libinput_event_tablet_tool *tablet_event)
|
translate_tablet_axes (struct libinput_event_tablet_tool *tablet_event,
|
||||||
|
ClutterInputDeviceTool *tool)
|
||||||
{
|
{
|
||||||
GArray *axes = g_array_new (FALSE, FALSE, sizeof (gdouble));
|
GArray *axes = g_array_new (FALSE, FALSE, sizeof (gdouble));
|
||||||
struct libinput_tablet_tool *libinput_tool;
|
struct libinput_tablet_tool *libinput_tool;
|
||||||
@@ -1234,6 +1287,7 @@ translate_tablet_axes (struct libinput_event_tablet_tool *tablet_event)
|
|||||||
if (libinput_tablet_tool_has_pressure (libinput_tool))
|
if (libinput_tablet_tool_has_pressure (libinput_tool))
|
||||||
{
|
{
|
||||||
value = libinput_event_tablet_tool_get_pressure (tablet_event);
|
value = libinput_event_tablet_tool_get_pressure (tablet_event);
|
||||||
|
value = clutter_input_device_tool_evdev_translate_pressure (tool, value);
|
||||||
g_array_append_val (axes, value);
|
g_array_append_val (axes, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1617,6 +1671,7 @@ process_device_event (ClutterDeviceManagerEvdev *manager_evdev,
|
|||||||
struct libinput_event_gesture *gesture_event =
|
struct libinput_event_gesture *gesture_event =
|
||||||
libinput_event_get_gesture_event (event);
|
libinput_event_get_gesture_event (event);
|
||||||
ClutterTouchpadGesturePhase phase;
|
ClutterTouchpadGesturePhase phase;
|
||||||
|
guint n_fingers;
|
||||||
guint64 time_us;
|
guint64 time_us;
|
||||||
|
|
||||||
if (libinput_event_get_type (event) == LIBINPUT_EVENT_GESTURE_PINCH_BEGIN)
|
if (libinput_event_get_type (event) == LIBINPUT_EVENT_GESTURE_PINCH_BEGIN)
|
||||||
@@ -1625,9 +1680,10 @@ process_device_event (ClutterDeviceManagerEvdev *manager_evdev,
|
|||||||
phase = libinput_event_gesture_get_cancelled (gesture_event) ?
|
phase = libinput_event_gesture_get_cancelled (gesture_event) ?
|
||||||
CLUTTER_TOUCHPAD_GESTURE_PHASE_CANCEL : CLUTTER_TOUCHPAD_GESTURE_PHASE_END;
|
CLUTTER_TOUCHPAD_GESTURE_PHASE_CANCEL : CLUTTER_TOUCHPAD_GESTURE_PHASE_END;
|
||||||
|
|
||||||
|
n_fingers = libinput_event_gesture_get_finger_count (gesture_event);
|
||||||
device = libinput_device_get_user_data (libinput_device);
|
device = libinput_device_get_user_data (libinput_device);
|
||||||
time_us = libinput_event_gesture_get_time_usec (gesture_event);
|
time_us = libinput_event_gesture_get_time_usec (gesture_event);
|
||||||
notify_pinch_gesture_event (device, phase, time_us, 0, 0, 0, 0);
|
notify_pinch_gesture_event (device, phase, time_us, 0, 0, 0, 0, n_fingers);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case LIBINPUT_EVENT_GESTURE_PINCH_UPDATE:
|
case LIBINPUT_EVENT_GESTURE_PINCH_UPDATE:
|
||||||
@@ -1635,8 +1691,10 @@ process_device_event (ClutterDeviceManagerEvdev *manager_evdev,
|
|||||||
struct libinput_event_gesture *gesture_event =
|
struct libinput_event_gesture *gesture_event =
|
||||||
libinput_event_get_gesture_event (event);
|
libinput_event_get_gesture_event (event);
|
||||||
gdouble angle_delta, scale, dx, dy;
|
gdouble angle_delta, scale, dx, dy;
|
||||||
|
guint n_fingers;
|
||||||
guint64 time_us;
|
guint64 time_us;
|
||||||
|
|
||||||
|
n_fingers = libinput_event_gesture_get_finger_count (gesture_event);
|
||||||
device = libinput_device_get_user_data (libinput_device);
|
device = libinput_device_get_user_data (libinput_device);
|
||||||
time_us = libinput_event_gesture_get_time_usec (gesture_event);
|
time_us = libinput_event_gesture_get_time_usec (gesture_event);
|
||||||
angle_delta = libinput_event_gesture_get_angle_delta (gesture_event);
|
angle_delta = libinput_event_gesture_get_angle_delta (gesture_event);
|
||||||
@@ -1646,7 +1704,7 @@ process_device_event (ClutterDeviceManagerEvdev *manager_evdev,
|
|||||||
|
|
||||||
notify_pinch_gesture_event (device,
|
notify_pinch_gesture_event (device,
|
||||||
CLUTTER_TOUCHPAD_GESTURE_PHASE_UPDATE,
|
CLUTTER_TOUCHPAD_GESTURE_PHASE_UPDATE,
|
||||||
time_us, dx, dy, angle_delta, scale);
|
time_us, dx, dy, angle_delta, scale, n_fingers);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case LIBINPUT_EVENT_GESTURE_SWIPE_BEGIN:
|
case LIBINPUT_EVENT_GESTURE_SWIPE_BEGIN:
|
||||||
@@ -1707,7 +1765,8 @@ process_device_event (ClutterDeviceManagerEvdev *manager_evdev,
|
|||||||
if (!stage)
|
if (!stage)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
axes = translate_tablet_axes (tablet_event);
|
axes = translate_tablet_axes (tablet_event,
|
||||||
|
evdev_device->last_tool);
|
||||||
if (!axes)
|
if (!axes)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -1747,8 +1806,11 @@ process_device_event (ClutterDeviceManagerEvdev *manager_evdev,
|
|||||||
|
|
||||||
libinput_tool = libinput_event_tablet_tool_get_tool (tablet_event);
|
libinput_tool = libinput_event_tablet_tool_get_tool (tablet_event);
|
||||||
|
|
||||||
input_device_update_tool (device, libinput_tool);
|
if (state == LIBINPUT_TABLET_TOOL_PROXIMITY_STATE_IN)
|
||||||
|
input_device_update_tool (device, libinput_tool);
|
||||||
notify_proximity (device, time, state == LIBINPUT_TABLET_TOOL_PROXIMITY_STATE_IN);
|
notify_proximity (device, time, state == LIBINPUT_TABLET_TOOL_PROXIMITY_STATE_IN);
|
||||||
|
if (state == LIBINPUT_TABLET_TOOL_PROXIMITY_STATE_OUT)
|
||||||
|
input_device_update_tool (device, NULL);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case LIBINPUT_EVENT_TABLET_TOOL_BUTTON:
|
case LIBINPUT_EVENT_TABLET_TOOL_BUTTON:
|
||||||
@@ -1790,7 +1852,7 @@ process_device_event (ClutterDeviceManagerEvdev *manager_evdev,
|
|||||||
case LIBINPUT_EVENT_TABLET_PAD_BUTTON:
|
case LIBINPUT_EVENT_TABLET_PAD_BUTTON:
|
||||||
{
|
{
|
||||||
guint64 time;
|
guint64 time;
|
||||||
guint32 button_state, button, group;
|
guint32 button_state, button, group, mode;
|
||||||
struct libinput_tablet_pad_mode_group *mode_group;
|
struct libinput_tablet_pad_mode_group *mode_group;
|
||||||
struct libinput_event_tablet_pad *pad_event =
|
struct libinput_event_tablet_pad *pad_event =
|
||||||
libinput_event_get_tablet_pad_event (event);
|
libinput_event_get_tablet_pad_event (event);
|
||||||
@@ -1800,17 +1862,18 @@ process_device_event (ClutterDeviceManagerEvdev *manager_evdev,
|
|||||||
|
|
||||||
mode_group = libinput_event_tablet_pad_get_mode_group (pad_event);
|
mode_group = libinput_event_tablet_pad_get_mode_group (pad_event);
|
||||||
group = libinput_tablet_pad_mode_group_get_index (mode_group);
|
group = libinput_tablet_pad_mode_group_get_index (mode_group);
|
||||||
|
mode = libinput_event_tablet_pad_get_mode (pad_event);
|
||||||
|
|
||||||
button = libinput_event_tablet_pad_get_button_number (pad_event);
|
button = libinput_event_tablet_pad_get_button_number (pad_event);
|
||||||
button_state = libinput_event_tablet_pad_get_button_state (pad_event) ==
|
button_state = libinput_event_tablet_pad_get_button_state (pad_event) ==
|
||||||
LIBINPUT_BUTTON_STATE_PRESSED;
|
LIBINPUT_BUTTON_STATE_PRESSED;
|
||||||
notify_pad_button (device, time, button, group, button_state);
|
notify_pad_button (device, time, button, group, mode, button_state);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case LIBINPUT_EVENT_TABLET_PAD_STRIP:
|
case LIBINPUT_EVENT_TABLET_PAD_STRIP:
|
||||||
{
|
{
|
||||||
guint64 time;
|
guint64 time;
|
||||||
guint32 number, source, group;
|
guint32 number, source, group, mode;
|
||||||
struct libinput_tablet_pad_mode_group *mode_group;
|
struct libinput_tablet_pad_mode_group *mode_group;
|
||||||
struct libinput_event_tablet_pad *pad_event =
|
struct libinput_event_tablet_pad *pad_event =
|
||||||
libinput_event_get_tablet_pad_event (event);
|
libinput_event_get_tablet_pad_event (event);
|
||||||
@@ -1824,14 +1887,15 @@ process_device_event (ClutterDeviceManagerEvdev *manager_evdev,
|
|||||||
|
|
||||||
mode_group = libinput_event_tablet_pad_get_mode_group (pad_event);
|
mode_group = libinput_event_tablet_pad_get_mode_group (pad_event);
|
||||||
group = libinput_tablet_pad_mode_group_get_index (mode_group);
|
group = libinput_tablet_pad_mode_group_get_index (mode_group);
|
||||||
|
mode = libinput_event_tablet_pad_get_mode (pad_event);
|
||||||
|
|
||||||
notify_pad_strip (device, time, number, source, group, value);
|
notify_pad_strip (device, time, number, source, group, mode, value);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case LIBINPUT_EVENT_TABLET_PAD_RING:
|
case LIBINPUT_EVENT_TABLET_PAD_RING:
|
||||||
{
|
{
|
||||||
guint64 time;
|
guint64 time;
|
||||||
guint32 number, source, group;
|
guint32 number, source, group, mode;
|
||||||
struct libinput_tablet_pad_mode_group *mode_group;
|
struct libinput_tablet_pad_mode_group *mode_group;
|
||||||
struct libinput_event_tablet_pad *pad_event =
|
struct libinput_event_tablet_pad *pad_event =
|
||||||
libinput_event_get_tablet_pad_event (event);
|
libinput_event_get_tablet_pad_event (event);
|
||||||
@@ -1845,8 +1909,9 @@ process_device_event (ClutterDeviceManagerEvdev *manager_evdev,
|
|||||||
|
|
||||||
mode_group = libinput_event_tablet_pad_get_mode_group (pad_event);
|
mode_group = libinput_event_tablet_pad_get_mode_group (pad_event);
|
||||||
group = libinput_tablet_pad_mode_group_get_index (mode_group);
|
group = libinput_tablet_pad_mode_group_get_index (mode_group);
|
||||||
|
mode = libinput_event_tablet_pad_get_mode (pad_event);
|
||||||
|
|
||||||
notify_pad_ring (device, time, number, source, group, angle);
|
notify_pad_ring (device, time, number, source, group, mode, angle);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
@@ -2028,7 +2093,8 @@ clutter_device_manager_evdev_constructed (GObject *gobject)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (libinput_udev_assign_seat (priv->libinput, "seat0") == -1)
|
if (libinput_udev_assign_seat (priv->libinput,
|
||||||
|
evdev_seat_id ? evdev_seat_id : "seat0") == -1)
|
||||||
{
|
{
|
||||||
g_critical ("Failed to assign a seat to the libinput object.");
|
g_critical ("Failed to assign a seat to the libinput object.");
|
||||||
libinput_unref (priv->libinput);
|
libinput_unref (priv->libinput);
|
||||||
@@ -2261,6 +2327,12 @@ _clutter_device_manager_evdev_acquire_device_id (ClutterDeviceManagerEvdev *mana
|
|||||||
return next_id;
|
return next_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
_clutter_device_manager_evdev_dispatch (ClutterDeviceManagerEvdev *manager_evdev)
|
||||||
|
{
|
||||||
|
dispatch_libinput (manager_evdev);
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
compare_ids (gconstpointer a,
|
compare_ids (gconstpointer a,
|
||||||
gconstpointer b)
|
gconstpointer b)
|
||||||
@@ -2620,6 +2692,23 @@ clutter_evdev_set_pointer_constrain_callback (ClutterDeviceManager *e
|
|||||||
priv->constrain_data_notify = user_data_notify;
|
priv->constrain_data_notify = user_data_notify;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
clutter_evdev_set_relative_motion_filter (ClutterDeviceManager *evdev,
|
||||||
|
ClutterRelativeMotionFilter filter,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
ClutterDeviceManagerEvdev *manager_evdev;
|
||||||
|
ClutterDeviceManagerEvdevPrivate *priv;
|
||||||
|
|
||||||
|
g_return_if_fail (CLUTTER_IS_DEVICE_MANAGER_EVDEV (evdev));
|
||||||
|
|
||||||
|
manager_evdev = CLUTTER_DEVICE_MANAGER_EVDEV (evdev);
|
||||||
|
priv = manager_evdev->priv;
|
||||||
|
|
||||||
|
priv->relative_motion_filter = filter;
|
||||||
|
priv->relative_motion_filter_user_data = user_data;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* clutter_evdev_set_keyboard_repeat:
|
* clutter_evdev_set_keyboard_repeat:
|
||||||
* @evdev: the #ClutterDeviceManager created by the evdev backend
|
* @evdev: the #ClutterDeviceManager created by the evdev backend
|
||||||
@@ -2771,3 +2860,18 @@ clutter_evdev_warp_pointer (ClutterInputDevice *pointer_device,
|
|||||||
{
|
{
|
||||||
notify_absolute_motion (pointer_device, ms2us(time_), x, y, NULL);
|
notify_absolute_motion (pointer_device, ms2us(time_), x, y, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* clutter_evdev_set_seat_id:
|
||||||
|
* @seat_id: The seat ID
|
||||||
|
*
|
||||||
|
* Sets the seat to assign to the libinput context.
|
||||||
|
*
|
||||||
|
* For reliable effects, this function must be called before clutter_init().
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
clutter_evdev_set_seat_id (const gchar *seat_id)
|
||||||
|
{
|
||||||
|
g_free (evdev_seat_id);
|
||||||
|
evdev_seat_id = g_strdup (seat_id);
|
||||||
|
}
|
||||||
|
@@ -76,6 +76,15 @@ void _clutter_device_manager_evdev_constrain_pointer (ClutterDeviceManagerEvdev
|
|||||||
float *new_x,
|
float *new_x,
|
||||||
float *new_y);
|
float *new_y);
|
||||||
|
|
||||||
|
void _clutter_device_manager_evdev_filter_relative_motion (ClutterDeviceManagerEvdev *manager_evdev,
|
||||||
|
ClutterInputDevice *device,
|
||||||
|
float x,
|
||||||
|
float y,
|
||||||
|
float *dx,
|
||||||
|
float *dy);
|
||||||
|
|
||||||
|
void _clutter_device_manager_evdev_dispatch (ClutterDeviceManagerEvdev *manager_evdev);
|
||||||
|
|
||||||
static inline guint64
|
static inline guint64
|
||||||
us (guint64 us)
|
us (guint64 us)
|
||||||
{
|
{
|
||||||
|
@@ -57,6 +57,9 @@ void clutter_evdev_set_device_callbacks (ClutterOpenDeviceCallback open_callba
|
|||||||
ClutterCloseDeviceCallback close_callback,
|
ClutterCloseDeviceCallback close_callback,
|
||||||
gpointer user_data);
|
gpointer user_data);
|
||||||
|
|
||||||
|
CLUTTER_AVAILABLE_IN_ALL
|
||||||
|
void clutter_evdev_set_seat_id (const gchar *seat_id);
|
||||||
|
|
||||||
CLUTTER_AVAILABLE_IN_1_10
|
CLUTTER_AVAILABLE_IN_1_10
|
||||||
void clutter_evdev_release_devices (void);
|
void clutter_evdev_release_devices (void);
|
||||||
CLUTTER_AVAILABLE_IN_1_10
|
CLUTTER_AVAILABLE_IN_1_10
|
||||||
@@ -94,6 +97,18 @@ void clutter_evdev_set_pointer_constrain_callback (ClutterDeviceManager
|
|||||||
gpointer user_data,
|
gpointer user_data,
|
||||||
GDestroyNotify user_data_notify);
|
GDestroyNotify user_data_notify);
|
||||||
|
|
||||||
|
typedef void (*ClutterRelativeMotionFilter) (ClutterInputDevice *device,
|
||||||
|
float x,
|
||||||
|
float y,
|
||||||
|
float *dx,
|
||||||
|
float *dy,
|
||||||
|
gpointer user_data);
|
||||||
|
|
||||||
|
CLUTTER_AVAILABLE_IN_MUTTER
|
||||||
|
void clutter_evdev_set_relative_motion_filter (ClutterDeviceManager *evdev,
|
||||||
|
ClutterRelativeMotionFilter filter,
|
||||||
|
gpointer user_data);
|
||||||
|
|
||||||
CLUTTER_AVAILABLE_IN_1_16
|
CLUTTER_AVAILABLE_IN_1_16
|
||||||
void clutter_evdev_set_keyboard_map (ClutterDeviceManager *evdev,
|
void clutter_evdev_set_keyboard_map (ClutterDeviceManager *evdev,
|
||||||
struct xkb_keymap *keymap);
|
struct xkb_keymap *keymap);
|
||||||
@@ -150,6 +165,14 @@ gboolean clutter_evdev_event_get_relative_motion (const ClutterEvent *event,
|
|||||||
double *dx_unaccel,
|
double *dx_unaccel,
|
||||||
double *dy_unaccel);
|
double *dy_unaccel);
|
||||||
|
|
||||||
|
CLUTTER_AVAILABLE_IN_ALL
|
||||||
|
void clutter_evdev_input_device_tool_set_pressure_curve (ClutterInputDeviceTool *tool,
|
||||||
|
gdouble curve[4]);
|
||||||
|
CLUTTER_AVAILABLE_IN_ALL
|
||||||
|
void clutter_evdev_input_device_tool_set_button_code (ClutterInputDeviceTool *tool,
|
||||||
|
guint button,
|
||||||
|
guint evcode);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
#endif /* __CLUTTER_EVDEV_H__ */
|
#endif /* __CLUTTER_EVDEV_H__ */
|
||||||
|
@@ -35,6 +35,8 @@
|
|||||||
#include "clutter-input-device-evdev.h"
|
#include "clutter-input-device-evdev.h"
|
||||||
#include "clutter-device-manager-evdev.h"
|
#include "clutter-device-manager-evdev.h"
|
||||||
|
|
||||||
|
#include "cairo-gobject.h"
|
||||||
|
|
||||||
typedef struct _ClutterInputDeviceClass ClutterInputDeviceEvdevClass;
|
typedef struct _ClutterInputDeviceClass ClutterInputDeviceEvdevClass;
|
||||||
|
|
||||||
#define clutter_input_device_evdev_get_type _clutter_input_device_evdev_get_type
|
#define clutter_input_device_evdev_get_type _clutter_input_device_evdev_get_type
|
||||||
@@ -43,6 +45,15 @@ G_DEFINE_TYPE (ClutterInputDeviceEvdev,
|
|||||||
clutter_input_device_evdev,
|
clutter_input_device_evdev,
|
||||||
CLUTTER_TYPE_INPUT_DEVICE)
|
CLUTTER_TYPE_INPUT_DEVICE)
|
||||||
|
|
||||||
|
enum {
|
||||||
|
PROP_0,
|
||||||
|
PROP_DEVICE_MATRIX,
|
||||||
|
PROP_OUTPUT_ASPECT_RATIO,
|
||||||
|
N_PROPS
|
||||||
|
};
|
||||||
|
|
||||||
|
static GParamSpec *obj_props[N_PROPS] = { 0 };
|
||||||
|
|
||||||
static void
|
static void
|
||||||
clutter_input_device_evdev_finalize (GObject *object)
|
clutter_input_device_evdev_finalize (GObject *object)
|
||||||
{
|
{
|
||||||
@@ -59,6 +70,53 @@ clutter_input_device_evdev_finalize (GObject *object)
|
|||||||
G_OBJECT_CLASS (clutter_input_device_evdev_parent_class)->finalize (object);
|
G_OBJECT_CLASS (clutter_input_device_evdev_parent_class)->finalize (object);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
clutter_input_device_evdev_set_property (GObject *object,
|
||||||
|
guint prop_id,
|
||||||
|
const GValue *value,
|
||||||
|
GParamSpec *pspec)
|
||||||
|
{
|
||||||
|
ClutterInputDeviceEvdev *device = CLUTTER_INPUT_DEVICE_EVDEV (object);
|
||||||
|
|
||||||
|
switch (prop_id)
|
||||||
|
{
|
||||||
|
case PROP_DEVICE_MATRIX:
|
||||||
|
{
|
||||||
|
const cairo_matrix_t *matrix = g_value_get_boxed (value);
|
||||||
|
cairo_matrix_init_identity (&device->device_matrix);
|
||||||
|
cairo_matrix_multiply (&device->device_matrix,
|
||||||
|
&device->device_matrix, matrix);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case PROP_OUTPUT_ASPECT_RATIO:
|
||||||
|
device->output_ratio = g_value_get_double (value);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
clutter_input_device_evdev_get_property (GObject *object,
|
||||||
|
guint prop_id,
|
||||||
|
GValue *value,
|
||||||
|
GParamSpec *pspec)
|
||||||
|
{
|
||||||
|
ClutterInputDeviceEvdev *device = CLUTTER_INPUT_DEVICE_EVDEV (object);
|
||||||
|
|
||||||
|
switch (prop_id)
|
||||||
|
{
|
||||||
|
case PROP_DEVICE_MATRIX:
|
||||||
|
g_value_set_boxed (value, &device->device_matrix);
|
||||||
|
break;
|
||||||
|
case PROP_OUTPUT_ASPECT_RATIO:
|
||||||
|
g_value_set_double (value, device->output_ratio);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
clutter_input_device_evdev_keycode_to_evdev (ClutterInputDevice *device,
|
clutter_input_device_evdev_keycode_to_evdev (ClutterInputDevice *device,
|
||||||
guint hardware_keycode,
|
guint hardware_keycode,
|
||||||
@@ -108,19 +166,83 @@ clutter_input_device_evdev_update_from_tool (ClutterInputDevice *device,
|
|||||||
g_object_thaw_notify (G_OBJECT (device));
|
g_object_thaw_notify (G_OBJECT (device));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
clutter_input_device_evdev_is_mode_switch_button (ClutterInputDevice *device,
|
||||||
|
guint group,
|
||||||
|
guint button)
|
||||||
|
{
|
||||||
|
struct libinput_device *libinput_device;
|
||||||
|
struct libinput_tablet_pad_mode_group *mode_group;
|
||||||
|
|
||||||
|
libinput_device = clutter_evdev_input_device_get_libinput_device (device);
|
||||||
|
mode_group = libinput_device_tablet_pad_get_mode_group (libinput_device, group);
|
||||||
|
|
||||||
|
return libinput_tablet_pad_mode_group_button_is_toggle (mode_group, button) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gint
|
||||||
|
clutter_input_device_evdev_get_group_n_modes (ClutterInputDevice *device,
|
||||||
|
gint group)
|
||||||
|
{
|
||||||
|
struct libinput_device *libinput_device;
|
||||||
|
struct libinput_tablet_pad_mode_group *mode_group;
|
||||||
|
|
||||||
|
libinput_device = clutter_evdev_input_device_get_libinput_device (device);
|
||||||
|
mode_group = libinput_device_tablet_pad_get_mode_group (libinput_device, group);
|
||||||
|
|
||||||
|
return libinput_tablet_pad_mode_group_get_num_modes (mode_group);
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
clutter_input_device_evdev_is_grouped (ClutterInputDevice *device,
|
||||||
|
ClutterInputDevice *other_device)
|
||||||
|
{
|
||||||
|
struct libinput_device *libinput_device, *other_libinput_device;
|
||||||
|
|
||||||
|
libinput_device = clutter_evdev_input_device_get_libinput_device (device);
|
||||||
|
other_libinput_device = clutter_evdev_input_device_get_libinput_device (other_device);
|
||||||
|
|
||||||
|
return libinput_device_get_device_group (libinput_device) ==
|
||||||
|
libinput_device_get_device_group (other_libinput_device);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
clutter_input_device_evdev_class_init (ClutterInputDeviceEvdevClass *klass)
|
clutter_input_device_evdev_class_init (ClutterInputDeviceEvdevClass *klass)
|
||||||
{
|
{
|
||||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||||
|
|
||||||
object_class->finalize = clutter_input_device_evdev_finalize;
|
object_class->finalize = clutter_input_device_evdev_finalize;
|
||||||
|
object_class->set_property = clutter_input_device_evdev_set_property;
|
||||||
|
object_class->get_property = clutter_input_device_evdev_get_property;
|
||||||
|
|
||||||
klass->keycode_to_evdev = clutter_input_device_evdev_keycode_to_evdev;
|
klass->keycode_to_evdev = clutter_input_device_evdev_keycode_to_evdev;
|
||||||
klass->update_from_tool = clutter_input_device_evdev_update_from_tool;
|
klass->update_from_tool = clutter_input_device_evdev_update_from_tool;
|
||||||
|
klass->is_mode_switch_button = clutter_input_device_evdev_is_mode_switch_button;
|
||||||
|
klass->get_group_n_modes = clutter_input_device_evdev_get_group_n_modes;
|
||||||
|
klass->is_grouped = clutter_input_device_evdev_is_grouped;
|
||||||
|
|
||||||
|
obj_props[PROP_DEVICE_MATRIX] =
|
||||||
|
g_param_spec_boxed ("device-matrix",
|
||||||
|
P_("Device input matrix"),
|
||||||
|
P_("Device input matrix"),
|
||||||
|
CAIRO_GOBJECT_TYPE_MATRIX,
|
||||||
|
CLUTTER_PARAM_READWRITE);
|
||||||
|
obj_props[PROP_OUTPUT_ASPECT_RATIO] =
|
||||||
|
g_param_spec_double ("output-aspect-ratio",
|
||||||
|
P_("Output aspect ratio"),
|
||||||
|
P_("Output aspect ratio"),
|
||||||
|
0, G_MAXDOUBLE, 0,
|
||||||
|
CLUTTER_PARAM_READWRITE);
|
||||||
|
|
||||||
|
g_object_class_install_properties (object_class, N_PROPS, obj_props);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
clutter_input_device_evdev_init (ClutterInputDeviceEvdev *self)
|
clutter_input_device_evdev_init (ClutterInputDeviceEvdev *self)
|
||||||
{
|
{
|
||||||
|
cairo_matrix_init_identity (&self->device_matrix);
|
||||||
|
self->device_aspect_ratio = 0;
|
||||||
|
self->output_ratio = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -143,6 +265,7 @@ _clutter_input_device_evdev_new (ClutterDeviceManager *manager,
|
|||||||
gchar *vendor, *product;
|
gchar *vendor, *product;
|
||||||
gint device_id, n_rings = 0, n_strips = 0, n_groups = 1;
|
gint device_id, n_rings = 0, n_strips = 0, n_groups = 1;
|
||||||
gchar *node_path;
|
gchar *node_path;
|
||||||
|
gdouble width, height;
|
||||||
|
|
||||||
type = _clutter_input_device_evdev_determine_type (libinput_device);
|
type = _clutter_input_device_evdev_determine_type (libinput_device);
|
||||||
vendor = g_strdup_printf ("%.4x", libinput_device_get_id_vendor (libinput_device));
|
vendor = g_strdup_printf ("%.4x", libinput_device_get_id_vendor (libinput_device));
|
||||||
@@ -182,6 +305,9 @@ _clutter_input_device_evdev_new (ClutterDeviceManager *manager,
|
|||||||
g_free (vendor);
|
g_free (vendor);
|
||||||
g_free (product);
|
g_free (product);
|
||||||
|
|
||||||
|
if (libinput_device_get_size (libinput_device, &width, &height) == 0)
|
||||||
|
device->device_aspect_ratio = width / height;
|
||||||
|
|
||||||
return CLUTTER_INPUT_DEVICE (device);
|
return CLUTTER_INPUT_DEVICE (device);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -313,3 +439,39 @@ clutter_evdev_event_sequence_get_slot (const ClutterEventSequence *sequence)
|
|||||||
|
|
||||||
return GPOINTER_TO_INT (sequence) - 1;
|
return GPOINTER_TO_INT (sequence) - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
clutter_input_device_evdev_translate_coordinates (ClutterInputDevice *device,
|
||||||
|
ClutterStage *stage,
|
||||||
|
gfloat *x,
|
||||||
|
gfloat *y)
|
||||||
|
{
|
||||||
|
ClutterInputDeviceEvdev *device_evdev = CLUTTER_INPUT_DEVICE_EVDEV (device);
|
||||||
|
double min_x = 0, min_y = 0, max_x = 1, max_y = 1;
|
||||||
|
gdouble stage_width, stage_height;
|
||||||
|
double x_d, y_d;
|
||||||
|
|
||||||
|
stage_width = clutter_actor_get_width (CLUTTER_ACTOR (stage));
|
||||||
|
stage_height = clutter_actor_get_height (CLUTTER_ACTOR (stage));
|
||||||
|
x_d = *x / stage_width;
|
||||||
|
y_d = *y / stage_height;
|
||||||
|
|
||||||
|
/* Apply aspect ratio */
|
||||||
|
if (device_evdev->output_ratio > 0 &&
|
||||||
|
device_evdev->device_aspect_ratio > 0)
|
||||||
|
{
|
||||||
|
gdouble ratio = device_evdev->device_aspect_ratio / device_evdev->output_ratio;
|
||||||
|
|
||||||
|
if (ratio > 1)
|
||||||
|
x_d *= ratio;
|
||||||
|
else if (ratio < 1)
|
||||||
|
y_d *= 1 / ratio;
|
||||||
|
}
|
||||||
|
|
||||||
|
cairo_matrix_transform_point (&device_evdev->device_matrix, &min_x, &min_y);
|
||||||
|
cairo_matrix_transform_point (&device_evdev->device_matrix, &max_x, &max_y);
|
||||||
|
cairo_matrix_transform_point (&device_evdev->device_matrix, &x_d, &y_d);
|
||||||
|
|
||||||
|
*x = CLAMP (x_d, MIN (min_x, max_x), MAX (min_x, max_x)) * stage_width;
|
||||||
|
*y = CLAMP (y_d, MIN (min_y, max_y), MAX (min_y, max_y)) * stage_height;
|
||||||
|
}
|
||||||
|
@@ -66,6 +66,10 @@ struct _ClutterInputDeviceEvdev
|
|||||||
struct libinput_device *libinput_device;
|
struct libinput_device *libinput_device;
|
||||||
ClutterSeatEvdev *seat;
|
ClutterSeatEvdev *seat;
|
||||||
ClutterInputDeviceTool *last_tool;
|
ClutterInputDeviceTool *last_tool;
|
||||||
|
|
||||||
|
cairo_matrix_t device_matrix;
|
||||||
|
gdouble device_aspect_ratio; /* w:h */
|
||||||
|
gdouble output_ratio; /* w:h */
|
||||||
};
|
};
|
||||||
|
|
||||||
GType _clutter_input_device_evdev_get_type (void) G_GNUC_CONST;
|
GType _clutter_input_device_evdev_get_type (void) G_GNUC_CONST;
|
||||||
@@ -102,6 +106,11 @@ void _clutter_evdev_event_set_relative_motion (ClutterEvent *event,
|
|||||||
double dx_unaccel,
|
double dx_unaccel,
|
||||||
double dy_unaccel);
|
double dy_unaccel);
|
||||||
|
|
||||||
|
void clutter_input_device_evdev_translate_coordinates (ClutterInputDevice *device,
|
||||||
|
ClutterStage *stage,
|
||||||
|
gfloat *x,
|
||||||
|
gfloat *y);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
#endif /* __CLUTTER_INPUT_DEVICE_EVDEV_H__ */
|
#endif /* __CLUTTER_INPUT_DEVICE_EVDEV_H__ */
|
||||||
|
@@ -26,6 +26,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "clutter-input-device-tool-evdev.h"
|
#include "clutter-input-device-tool-evdev.h"
|
||||||
|
#include "clutter-evdev.h"
|
||||||
|
|
||||||
G_DEFINE_TYPE (ClutterInputDeviceToolEvdev, clutter_input_device_tool_evdev,
|
G_DEFINE_TYPE (ClutterInputDeviceToolEvdev, clutter_input_device_tool_evdev,
|
||||||
CLUTTER_TYPE_INPUT_DEVICE_TOOL)
|
CLUTTER_TYPE_INPUT_DEVICE_TOOL)
|
||||||
@@ -35,6 +36,7 @@ clutter_input_device_tool_evdev_finalize (GObject *object)
|
|||||||
{
|
{
|
||||||
ClutterInputDeviceToolEvdev *tool = CLUTTER_INPUT_DEVICE_TOOL_EVDEV (object);
|
ClutterInputDeviceToolEvdev *tool = CLUTTER_INPUT_DEVICE_TOOL_EVDEV (object);
|
||||||
|
|
||||||
|
g_hash_table_unref (tool->button_map);
|
||||||
libinput_tablet_tool_unref (tool->tool);
|
libinput_tablet_tool_unref (tool->tool);
|
||||||
|
|
||||||
G_OBJECT_CLASS (clutter_input_device_tool_evdev_parent_class)->finalize (object);
|
G_OBJECT_CLASS (clutter_input_device_tool_evdev_parent_class)->finalize (object);
|
||||||
@@ -51,6 +53,7 @@ clutter_input_device_tool_evdev_class_init (ClutterInputDeviceToolEvdevClass *kl
|
|||||||
static void
|
static void
|
||||||
clutter_input_device_tool_evdev_init (ClutterInputDeviceToolEvdev *tool)
|
clutter_input_device_tool_evdev_init (ClutterInputDeviceToolEvdev *tool)
|
||||||
{
|
{
|
||||||
|
tool->button_map = g_hash_table_new (NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
ClutterInputDeviceTool *
|
ClutterInputDeviceTool *
|
||||||
@@ -70,3 +73,96 @@ clutter_input_device_tool_evdev_new (struct libinput_tablet_tool *tool,
|
|||||||
|
|
||||||
return CLUTTER_INPUT_DEVICE_TOOL (evdev_tool);
|
return CLUTTER_INPUT_DEVICE_TOOL (evdev_tool);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
clutter_evdev_input_device_tool_set_pressure_curve (ClutterInputDeviceTool *tool,
|
||||||
|
gdouble curve[4])
|
||||||
|
{
|
||||||
|
ClutterInputDeviceToolEvdev *evdev_tool;
|
||||||
|
|
||||||
|
g_return_if_fail (CLUTTER_IS_INPUT_DEVICE_TOOL_EVDEV (tool));
|
||||||
|
g_return_if_fail (curve[0] >= 0 && curve[0] <= 1 &&
|
||||||
|
curve[1] >= 0 && curve[1] <= 1 &&
|
||||||
|
curve[2] >= 0 && curve[2] <= 1 &&
|
||||||
|
curve[3] >= 0 && curve[3] <= 1);
|
||||||
|
|
||||||
|
evdev_tool = CLUTTER_INPUT_DEVICE_TOOL_EVDEV (tool);
|
||||||
|
evdev_tool->pressure_curve[0] = curve[0];
|
||||||
|
evdev_tool->pressure_curve[1] = curve[1];
|
||||||
|
evdev_tool->pressure_curve[2] = curve[2];
|
||||||
|
evdev_tool->pressure_curve[3] = curve[3];
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
clutter_evdev_input_device_tool_set_button_code (ClutterInputDeviceTool *tool,
|
||||||
|
guint button,
|
||||||
|
guint evcode)
|
||||||
|
{
|
||||||
|
ClutterInputDeviceToolEvdev *evdev_tool;
|
||||||
|
|
||||||
|
g_return_if_fail (CLUTTER_IS_INPUT_DEVICE_TOOL_EVDEV (tool));
|
||||||
|
|
||||||
|
evdev_tool = CLUTTER_INPUT_DEVICE_TOOL_EVDEV (tool);
|
||||||
|
|
||||||
|
if (evcode == 0)
|
||||||
|
{
|
||||||
|
g_hash_table_remove (evdev_tool->button_map, GUINT_TO_POINTER (button));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
g_hash_table_insert (evdev_tool->button_map, GUINT_TO_POINTER (button),
|
||||||
|
GUINT_TO_POINTER (evcode));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static gdouble
|
||||||
|
calculate_bezier_position (gdouble pos,
|
||||||
|
gdouble x1,
|
||||||
|
gdouble y1,
|
||||||
|
gdouble x2,
|
||||||
|
gdouble y2)
|
||||||
|
{
|
||||||
|
gdouble int1_y, int2_y;
|
||||||
|
|
||||||
|
pos = CLAMP (pos, 0, 1);
|
||||||
|
|
||||||
|
/* Intersection between 0,0 and x1,y1 */
|
||||||
|
int1_y = pos * y1;
|
||||||
|
|
||||||
|
/* Intersection between x2,y2 and 1,1 */
|
||||||
|
int2_y = (pos * (1 - y2)) + y2;
|
||||||
|
|
||||||
|
/* Find the new position in the line traced by the previous points */
|
||||||
|
return (pos * (int2_y - int1_y)) + int1_y;
|
||||||
|
}
|
||||||
|
|
||||||
|
gdouble
|
||||||
|
clutter_input_device_tool_evdev_translate_pressure (ClutterInputDeviceTool *tool,
|
||||||
|
gdouble pressure)
|
||||||
|
{
|
||||||
|
ClutterInputDeviceToolEvdev *evdev_tool;
|
||||||
|
|
||||||
|
g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE_TOOL (tool), pressure);
|
||||||
|
|
||||||
|
evdev_tool = CLUTTER_INPUT_DEVICE_TOOL_EVDEV (tool);
|
||||||
|
|
||||||
|
return calculate_bezier_position (CLAMP (pressure, 0, 1),
|
||||||
|
evdev_tool->pressure_curve[0],
|
||||||
|
evdev_tool->pressure_curve[1],
|
||||||
|
evdev_tool->pressure_curve[2],
|
||||||
|
evdev_tool->pressure_curve[3]);
|
||||||
|
}
|
||||||
|
|
||||||
|
guint
|
||||||
|
clutter_input_device_tool_evdev_get_button_code (ClutterInputDeviceTool *tool,
|
||||||
|
guint button)
|
||||||
|
{
|
||||||
|
ClutterInputDeviceToolEvdev *evdev_tool;
|
||||||
|
|
||||||
|
g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE_TOOL (tool), 0);
|
||||||
|
|
||||||
|
evdev_tool = CLUTTER_INPUT_DEVICE_TOOL_EVDEV (tool);
|
||||||
|
|
||||||
|
return GPOINTER_TO_UINT (g_hash_table_lookup (evdev_tool->button_map,
|
||||||
|
GUINT_TO_POINTER (button)));
|
||||||
|
}
|
||||||
|
@@ -59,6 +59,8 @@ struct _ClutterInputDeviceToolEvdev
|
|||||||
{
|
{
|
||||||
ClutterInputDeviceTool parent_instance;
|
ClutterInputDeviceTool parent_instance;
|
||||||
struct libinput_tablet_tool *tool;
|
struct libinput_tablet_tool *tool;
|
||||||
|
GHashTable *button_map;
|
||||||
|
gdouble pressure_curve[4];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _ClutterInputDeviceToolEvdevClass
|
struct _ClutterInputDeviceToolEvdevClass
|
||||||
@@ -72,6 +74,11 @@ ClutterInputDeviceTool * clutter_input_device_tool_evdev_new (struct libinp
|
|||||||
guint64 serial,
|
guint64 serial,
|
||||||
ClutterInputDeviceToolType type);
|
ClutterInputDeviceToolType type);
|
||||||
|
|
||||||
|
gdouble clutter_input_device_tool_evdev_translate_pressure (ClutterInputDeviceTool *tool,
|
||||||
|
gdouble pressure);
|
||||||
|
guint clutter_input_device_tool_evdev_get_button_code (ClutterInputDeviceTool *tool,
|
||||||
|
guint button);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
#endif /* __CLUTTER_INPUT_DEVICE_EVDEV_TOOL_H__ */
|
#endif /* __CLUTTER_INPUT_DEVICE_EVDEV_TOOL_H__ */
|
||||||
|
@@ -32,6 +32,7 @@
|
|||||||
|
|
||||||
#include "clutter-event-private.h"
|
#include "clutter-event-private.h"
|
||||||
#include "clutter-input-device-evdev.h"
|
#include "clutter-input-device-evdev.h"
|
||||||
|
#include "clutter-input-device-tool-evdev.h"
|
||||||
#include "clutter-main.h"
|
#include "clutter-main.h"
|
||||||
|
|
||||||
/* Try to keep the pointer inside the stage. Hopefully no one is using
|
/* Try to keep the pointer inside the stage. Hopefully no one is using
|
||||||
@@ -185,15 +186,19 @@ keyboard_repeat (gpointer data)
|
|||||||
{
|
{
|
||||||
ClutterSeatEvdev *seat = data;
|
ClutterSeatEvdev *seat = data;
|
||||||
GSource *source;
|
GSource *source;
|
||||||
guint32 time_ms;
|
|
||||||
|
/* There might be events queued in libinput that could cancel the
|
||||||
|
repeat timer. */
|
||||||
|
_clutter_device_manager_evdev_dispatch (seat->manager_evdev);
|
||||||
|
if (!seat->repeat_timer)
|
||||||
|
return G_SOURCE_REMOVE;
|
||||||
|
|
||||||
g_return_val_if_fail (seat->repeat_device != NULL, G_SOURCE_REMOVE);
|
g_return_val_if_fail (seat->repeat_device != NULL, G_SOURCE_REMOVE);
|
||||||
source = g_main_context_find_source_by_id (NULL, seat->repeat_timer);
|
source = g_main_context_find_source_by_id (NULL, seat->repeat_timer);
|
||||||
time_ms = g_source_get_time (source) / 1000;
|
|
||||||
|
|
||||||
clutter_seat_evdev_notify_key (seat,
|
clutter_seat_evdev_notify_key (seat,
|
||||||
seat->repeat_device,
|
seat->repeat_device,
|
||||||
ms2us (time_ms),
|
g_source_get_time (source),
|
||||||
seat->repeat_key,
|
seat->repeat_key,
|
||||||
AUTOREPEAT_VALUE,
|
AUTOREPEAT_VALUE,
|
||||||
FALSE);
|
FALSE);
|
||||||
@@ -400,6 +405,13 @@ clutter_seat_evdev_notify_relative_motion (ClutterSeatEvdev *seat,
|
|||||||
if (!_clutter_input_device_get_stage (input_device))
|
if (!_clutter_input_device_get_stage (input_device))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
_clutter_device_manager_evdev_filter_relative_motion (seat->manager_evdev,
|
||||||
|
input_device,
|
||||||
|
seat->pointer_x,
|
||||||
|
seat->pointer_y,
|
||||||
|
&dx,
|
||||||
|
&dy);
|
||||||
|
|
||||||
new_x = seat->pointer_x + dx;
|
new_x = seat->pointer_x + dx;
|
||||||
new_y = seat->pointer_y + dy;
|
new_y = seat->pointer_y + dy;
|
||||||
event = new_absolute_motion_event (seat, input_device,
|
event = new_absolute_motion_event (seat, input_device,
|
||||||
@@ -433,6 +445,7 @@ clutter_seat_evdev_notify_button (ClutterSeatEvdev *seat,
|
|||||||
uint32_t button,
|
uint32_t button,
|
||||||
uint32_t state)
|
uint32_t state)
|
||||||
{
|
{
|
||||||
|
ClutterInputDeviceEvdev *device_evdev = (ClutterInputDeviceEvdev *) input_device;
|
||||||
ClutterStage *stage;
|
ClutterStage *stage;
|
||||||
ClutterEvent *event = NULL;
|
ClutterEvent *event = NULL;
|
||||||
gint button_nr;
|
gint button_nr;
|
||||||
@@ -528,13 +541,21 @@ clutter_seat_evdev_notify_button (ClutterSeatEvdev *seat,
|
|||||||
clutter_event_set_device (event, seat->core_pointer);
|
clutter_event_set_device (event, seat->core_pointer);
|
||||||
clutter_event_set_source_device (event, input_device);
|
clutter_event_set_source_device (event, input_device);
|
||||||
|
|
||||||
|
if (device_evdev->last_tool)
|
||||||
|
{
|
||||||
|
/* Apply the button event code as per the tool mapping */
|
||||||
|
guint mapped_button;
|
||||||
|
|
||||||
|
mapped_button = clutter_input_device_tool_evdev_get_button_code (device_evdev->last_tool,
|
||||||
|
button_nr);
|
||||||
|
if (mapped_button != 0)
|
||||||
|
button = mapped_button;
|
||||||
|
}
|
||||||
|
|
||||||
_clutter_evdev_event_set_event_code (event, button);
|
_clutter_evdev_event_set_event_code (event, button);
|
||||||
|
|
||||||
if (clutter_input_device_get_device_type (input_device) == CLUTTER_TABLET_DEVICE)
|
if (clutter_input_device_get_device_type (input_device) == CLUTTER_TABLET_DEVICE)
|
||||||
{
|
{
|
||||||
ClutterInputDeviceEvdev *device_evdev =
|
|
||||||
CLUTTER_INPUT_DEVICE_EVDEV (input_device);
|
|
||||||
|
|
||||||
clutter_event_set_device_tool (event, device_evdev->last_tool);
|
clutter_event_set_device_tool (event, device_evdev->last_tool);
|
||||||
clutter_event_set_device (event, input_device);
|
clutter_event_set_device (event, input_device);
|
||||||
}
|
}
|
||||||
|
@@ -3,8 +3,8 @@ exec_prefix=@exec_prefix@
|
|||||||
libdir=@libdir@/mutter
|
libdir=@libdir@/mutter
|
||||||
includedir=@includedir@/mutter
|
includedir=@includedir@/mutter
|
||||||
|
|
||||||
apiversion=@CLUTTER_API_VERSION@
|
apiversion=@LIBMUTTER_API_VERSION@
|
||||||
requires=@CLUTTER_REQUIRES@ mutter-cogl-1.0
|
requires=@CLUTTER_REQUIRES@ mutter-cogl-@LIBMUTTER_API_VERSION@
|
||||||
requires_private=@CLUTTER_REQUIRES_PRIVATE@
|
requires_private=@CLUTTER_REQUIRES_PRIVATE@
|
||||||
backends=@CLUTTER_BACKENDS@
|
backends=@CLUTTER_BACKENDS@
|
||||||
|
|
||||||
@@ -17,7 +17,7 @@ cogl_driver=deprecated
|
|||||||
|
|
||||||
Name: Mutter Clutter
|
Name: Mutter Clutter
|
||||||
Description: Mutter's Clutter Private Library
|
Description: Mutter's Clutter Private Library
|
||||||
Version: @VERSION@
|
Version: @MUTTER_VERSION@
|
||||||
Libs: -L${libdir} -lmutter-clutter-${apiversion}
|
Libs: -L${libdir} -lmutter-clutter-${apiversion}
|
||||||
Cflags: -I${includedir}/clutter-${apiversion}
|
Cflags: -I${includedir}/clutter-${apiversion}
|
||||||
Requires: ${requires}
|
Requires: ${requires}
|
||||||
|
@@ -136,7 +136,6 @@ clutter_device_manager_x11_translate_event (ClutterEventTranslator *translator,
|
|||||||
ClutterTranslateReturn res;
|
ClutterTranslateReturn res;
|
||||||
ClutterStage *stage;
|
ClutterStage *stage;
|
||||||
XEvent *xevent;
|
XEvent *xevent;
|
||||||
int window_scale;
|
|
||||||
|
|
||||||
manager_x11 = CLUTTER_DEVICE_MANAGER_X11 (translator);
|
manager_x11 = CLUTTER_DEVICE_MANAGER_X11 (translator);
|
||||||
backend_x11 = CLUTTER_BACKEND_X11 (clutter_get_default_backend ());
|
backend_x11 = CLUTTER_BACKEND_X11 (clutter_get_default_backend ());
|
||||||
@@ -152,8 +151,6 @@ clutter_device_manager_x11_translate_event (ClutterEventTranslator *translator,
|
|||||||
|
|
||||||
stage_x11 = CLUTTER_STAGE_X11 (_clutter_stage_get_window (stage));
|
stage_x11 = CLUTTER_STAGE_X11 (_clutter_stage_get_window (stage));
|
||||||
|
|
||||||
window_scale = stage_x11->scale_factor;
|
|
||||||
|
|
||||||
event->any.stage = stage;
|
event->any.stage = stage;
|
||||||
|
|
||||||
res = CLUTTER_TRANSLATE_CONTINUE;
|
res = CLUTTER_TRANSLATE_CONTINUE;
|
||||||
@@ -226,8 +223,8 @@ clutter_device_manager_x11_translate_event (ClutterEventTranslator *translator,
|
|||||||
event->scroll.direction = CLUTTER_SCROLL_RIGHT;
|
event->scroll.direction = CLUTTER_SCROLL_RIGHT;
|
||||||
|
|
||||||
event->scroll.time = xevent->xbutton.time;
|
event->scroll.time = xevent->xbutton.time;
|
||||||
event->scroll.x = xevent->xbutton.x / window_scale;
|
event->scroll.x = xevent->xbutton.x;
|
||||||
event->scroll.y = xevent->xbutton.y / window_scale;
|
event->scroll.y = xevent->xbutton.y;
|
||||||
event->scroll.modifier_state = xevent->xbutton.state;
|
event->scroll.modifier_state = xevent->xbutton.state;
|
||||||
event->scroll.axes = NULL;
|
event->scroll.axes = NULL;
|
||||||
break;
|
break;
|
||||||
@@ -235,8 +232,8 @@ clutter_device_manager_x11_translate_event (ClutterEventTranslator *translator,
|
|||||||
default:
|
default:
|
||||||
event->button.type = event->type = CLUTTER_BUTTON_PRESS;
|
event->button.type = event->type = CLUTTER_BUTTON_PRESS;
|
||||||
event->button.time = xevent->xbutton.time;
|
event->button.time = xevent->xbutton.time;
|
||||||
event->button.x = xevent->xbutton.x / window_scale;
|
event->button.x = xevent->xbutton.x;
|
||||||
event->button.y = xevent->xbutton.y / window_scale;
|
event->button.y = xevent->xbutton.y;
|
||||||
event->button.modifier_state = xevent->xbutton.state;
|
event->button.modifier_state = xevent->xbutton.state;
|
||||||
event->button.button = xevent->xbutton.button;
|
event->button.button = xevent->xbutton.button;
|
||||||
event->button.axes = NULL;
|
event->button.axes = NULL;
|
||||||
@@ -269,8 +266,8 @@ clutter_device_manager_x11_translate_event (ClutterEventTranslator *translator,
|
|||||||
|
|
||||||
event->button.type = event->type = CLUTTER_BUTTON_RELEASE;
|
event->button.type = event->type = CLUTTER_BUTTON_RELEASE;
|
||||||
event->button.time = xevent->xbutton.time;
|
event->button.time = xevent->xbutton.time;
|
||||||
event->button.x = xevent->xbutton.x / window_scale;
|
event->button.x = xevent->xbutton.x;
|
||||||
event->button.y = xevent->xbutton.y / window_scale;
|
event->button.y = xevent->xbutton.y;
|
||||||
event->button.modifier_state = xevent->xbutton.state;
|
event->button.modifier_state = xevent->xbutton.state;
|
||||||
event->button.button = xevent->xbutton.button;
|
event->button.button = xevent->xbutton.button;
|
||||||
event->button.axes = NULL;
|
event->button.axes = NULL;
|
||||||
@@ -287,8 +284,8 @@ clutter_device_manager_x11_translate_event (ClutterEventTranslator *translator,
|
|||||||
|
|
||||||
event->motion.type = event->type = CLUTTER_MOTION;
|
event->motion.type = event->type = CLUTTER_MOTION;
|
||||||
event->motion.time = xevent->xmotion.time;
|
event->motion.time = xevent->xmotion.time;
|
||||||
event->motion.x = xevent->xmotion.x / window_scale;
|
event->motion.x = xevent->xmotion.x;
|
||||||
event->motion.y = xevent->xmotion.y / window_scale;
|
event->motion.y = xevent->xmotion.y;
|
||||||
event->motion.modifier_state = xevent->xmotion.state;
|
event->motion.modifier_state = xevent->xmotion.state;
|
||||||
event->motion.axes = NULL;
|
event->motion.axes = NULL;
|
||||||
clutter_event_set_device (event, manager_x11->core_pointer);
|
clutter_event_set_device (event, manager_x11->core_pointer);
|
||||||
@@ -301,8 +298,8 @@ clutter_device_manager_x11_translate_event (ClutterEventTranslator *translator,
|
|||||||
|
|
||||||
event->crossing.type = CLUTTER_ENTER;
|
event->crossing.type = CLUTTER_ENTER;
|
||||||
event->crossing.time = xevent->xcrossing.time;
|
event->crossing.time = xevent->xcrossing.time;
|
||||||
event->crossing.x = xevent->xcrossing.x / window_scale;
|
event->crossing.x = xevent->xcrossing.x;
|
||||||
event->crossing.y = xevent->xcrossing.y / window_scale;
|
event->crossing.y = xevent->xcrossing.y;
|
||||||
event->crossing.source = CLUTTER_ACTOR (stage);
|
event->crossing.source = CLUTTER_ACTOR (stage);
|
||||||
event->crossing.related = NULL;
|
event->crossing.related = NULL;
|
||||||
clutter_event_set_device (event, manager_x11->core_pointer);
|
clutter_event_set_device (event, manager_x11->core_pointer);
|
||||||
@@ -327,8 +324,8 @@ clutter_device_manager_x11_translate_event (ClutterEventTranslator *translator,
|
|||||||
|
|
||||||
event->crossing.type = CLUTTER_LEAVE;
|
event->crossing.type = CLUTTER_LEAVE;
|
||||||
event->crossing.time = xevent->xcrossing.time;
|
event->crossing.time = xevent->xcrossing.time;
|
||||||
event->crossing.x = xevent->xcrossing.x / window_scale;
|
event->crossing.x = xevent->xcrossing.x;
|
||||||
event->crossing.y = xevent->xcrossing.y / window_scale;
|
event->crossing.y = xevent->xcrossing.y;
|
||||||
event->crossing.source = CLUTTER_ACTOR (stage);
|
event->crossing.source = CLUTTER_ACTOR (stage);
|
||||||
event->crossing.related = NULL;
|
event->crossing.related = NULL;
|
||||||
clutter_event_set_device (event, manager_x11->core_pointer);
|
clutter_event_set_device (event, manager_x11->core_pointer);
|
||||||
|
@@ -29,6 +29,8 @@
|
|||||||
|
|
||||||
#include "clutter-backend-x11.h"
|
#include "clutter-backend-x11.h"
|
||||||
#include "clutter-input-device-xi2.h"
|
#include "clutter-input-device-xi2.h"
|
||||||
|
#include "clutter-input-device-tool-xi2.h"
|
||||||
|
#include "clutter-virtual-input-device-x11.h"
|
||||||
#include "clutter-stage-x11.h"
|
#include "clutter-stage-x11.h"
|
||||||
|
|
||||||
#include "clutter-backend.h"
|
#include "clutter-backend.h"
|
||||||
@@ -394,6 +396,8 @@ create_device (ClutterDeviceManagerXI2 *manager_xi2,
|
|||||||
source = CLUTTER_ERASER_DEVICE;
|
source = CLUTTER_ERASER_DEVICE;
|
||||||
else if (strstr (name, "cursor") != NULL)
|
else if (strstr (name, "cursor") != NULL)
|
||||||
source = CLUTTER_CURSOR_DEVICE;
|
source = CLUTTER_CURSOR_DEVICE;
|
||||||
|
else if (strstr (name, " pad") != NULL)
|
||||||
|
source = CLUTTER_PAD_DEVICE;
|
||||||
else if (strstr (name, "wacom") != NULL || strstr (name, "pen") != NULL)
|
else if (strstr (name, "wacom") != NULL || strstr (name, "pen") != NULL)
|
||||||
source = CLUTTER_PEN_DEVICE;
|
source = CLUTTER_PEN_DEVICE;
|
||||||
else if (strstr (name, "touchpad") != NULL)
|
else if (strstr (name, "touchpad") != NULL)
|
||||||
@@ -460,6 +464,46 @@ create_device (ClutterDeviceManagerXI2 *manager_xi2,
|
|||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
pad_passive_button_grab (ClutterInputDevice *device)
|
||||||
|
{
|
||||||
|
XIGrabModifiers xi_grab_mods = { XIAnyModifier, };
|
||||||
|
XIEventMask xi_event_mask;
|
||||||
|
gint device_id, rc;
|
||||||
|
|
||||||
|
device_id = clutter_input_device_get_device_id (device);
|
||||||
|
|
||||||
|
xi_event_mask.deviceid = device_id;
|
||||||
|
xi_event_mask.mask_len = XIMaskLen (XI_LASTEVENT);
|
||||||
|
xi_event_mask.mask = g_new0 (unsigned char, xi_event_mask.mask_len);
|
||||||
|
|
||||||
|
XISetMask (xi_event_mask.mask, XI_Motion);
|
||||||
|
XISetMask (xi_event_mask.mask, XI_ButtonPress);
|
||||||
|
XISetMask (xi_event_mask.mask, XI_ButtonRelease);
|
||||||
|
|
||||||
|
clutter_x11_trap_x_errors ();
|
||||||
|
rc = XIGrabButton (clutter_x11_get_default_display (),
|
||||||
|
device_id, XIAnyButton,
|
||||||
|
clutter_x11_get_root_window (), None,
|
||||||
|
XIGrabModeSync, XIGrabModeSync,
|
||||||
|
True, &xi_event_mask, 1, &xi_grab_mods);
|
||||||
|
if (rc != 0)
|
||||||
|
{
|
||||||
|
g_warning ("Could not passively grab pad device: %s",
|
||||||
|
clutter_input_device_get_device_name (device));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
XIAllowEvents (clutter_x11_get_default_display (),
|
||||||
|
device_id, XIAsyncDevice,
|
||||||
|
CLUTTER_CURRENT_TIME);
|
||||||
|
}
|
||||||
|
|
||||||
|
clutter_x11_untrap_x_errors ();
|
||||||
|
|
||||||
|
g_free (xi_event_mask.mask);
|
||||||
|
}
|
||||||
|
|
||||||
static ClutterInputDevice *
|
static ClutterInputDevice *
|
||||||
add_device (ClutterDeviceManagerXI2 *manager_xi2,
|
add_device (ClutterDeviceManagerXI2 *manager_xi2,
|
||||||
ClutterBackendX11 *backend_x11,
|
ClutterBackendX11 *backend_x11,
|
||||||
@@ -494,6 +538,9 @@ add_device (ClutterDeviceManagerXI2 *manager_xi2,
|
|||||||
g_warning ("Unhandled device: %s",
|
g_warning ("Unhandled device: %s",
|
||||||
clutter_input_device_get_device_name (device));
|
clutter_input_device_get_device_name (device));
|
||||||
|
|
||||||
|
if (clutter_input_device_get_device_type (device) == CLUTTER_PAD_DEVICE)
|
||||||
|
pad_passive_button_grab (device);
|
||||||
|
|
||||||
/* relationships between devices and signal emissions are not
|
/* relationships between devices and signal emissions are not
|
||||||
* necessary while we're constructing the device manager instance
|
* necessary while we're constructing the device manager instance
|
||||||
*/
|
*/
|
||||||
@@ -814,8 +861,8 @@ translate_coords (ClutterStageX11 *stage_x11,
|
|||||||
|
|
||||||
clutter_actor_get_size (stage, &stage_width, &stage_height);
|
clutter_actor_get_size (stage, &stage_width, &stage_height);
|
||||||
|
|
||||||
*x_out = CLAMP (event_x / stage_x11->scale_factor, 0, stage_width);
|
*x_out = CLAMP (event_x, 0, stage_width);
|
||||||
*y_out = CLAMP (event_y / stage_x11->scale_factor, 0, stage_height);
|
*y_out = CLAMP (event_y, 0, stage_height);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gdouble
|
static gdouble
|
||||||
@@ -906,6 +953,78 @@ clutter_device_manager_xi2_select_stage_events (ClutterDeviceManager *manager,
|
|||||||
g_free (mask);
|
g_free (mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static guint
|
||||||
|
device_get_tool_serial (ClutterBackendX11 *backend_x11,
|
||||||
|
ClutterInputDevice *device)
|
||||||
|
{
|
||||||
|
gulong nitems, bytes_after;
|
||||||
|
guint32 *data = NULL;
|
||||||
|
guint serial_id = 0;
|
||||||
|
int rc, format;
|
||||||
|
Atom type;
|
||||||
|
Atom prop;
|
||||||
|
|
||||||
|
prop = XInternAtom (backend_x11->xdpy, "Wacom Serial IDs", True);
|
||||||
|
if (prop == None)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
clutter_x11_trap_x_errors ();
|
||||||
|
rc = XIGetProperty (backend_x11->xdpy,
|
||||||
|
clutter_input_device_get_device_id (device),
|
||||||
|
prop, 0, 4, FALSE, XA_INTEGER, &type, &format, &nitems, &bytes_after,
|
||||||
|
(guchar **) &data);
|
||||||
|
clutter_x11_untrap_x_errors ();
|
||||||
|
|
||||||
|
if (rc == Success && type == XA_INTEGER && format == 32 && nitems >= 4)
|
||||||
|
serial_id = data[3];
|
||||||
|
|
||||||
|
XFree (data);
|
||||||
|
|
||||||
|
return serial_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
handle_property_event (ClutterDeviceManagerXI2 *manager_xi2,
|
||||||
|
XIEvent *event)
|
||||||
|
{
|
||||||
|
XIPropertyEvent *xev = (XIPropertyEvent *) event;
|
||||||
|
ClutterBackendX11 *backend_x11 = CLUTTER_BACKEND_X11 (clutter_get_default_backend ());
|
||||||
|
Atom serial_ids_prop = XInternAtom (backend_x11->xdpy, "Wacom Serial IDs", True);
|
||||||
|
ClutterInputDevice *device;
|
||||||
|
|
||||||
|
device = g_hash_table_lookup (manager_xi2->devices_by_id,
|
||||||
|
GINT_TO_POINTER (xev->deviceid));
|
||||||
|
if (!device)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (xev->property == serial_ids_prop)
|
||||||
|
{
|
||||||
|
ClutterInputDeviceTool *tool = NULL;
|
||||||
|
ClutterInputDeviceToolType type;
|
||||||
|
guint serial_id;
|
||||||
|
|
||||||
|
serial_id = device_get_tool_serial (backend_x11, device);
|
||||||
|
|
||||||
|
if (serial_id != 0)
|
||||||
|
{
|
||||||
|
tool = g_hash_table_lookup (manager_xi2->tools_by_serial,
|
||||||
|
GUINT_TO_POINTER (serial_id));
|
||||||
|
if (!tool)
|
||||||
|
{
|
||||||
|
type = clutter_input_device_get_device_type (device) == CLUTTER_ERASER_DEVICE ?
|
||||||
|
CLUTTER_INPUT_DEVICE_TOOL_ERASER : CLUTTER_INPUT_DEVICE_TOOL_PEN;
|
||||||
|
tool = clutter_input_device_tool_xi2_new (serial_id, type);
|
||||||
|
g_hash_table_insert (manager_xi2->tools_by_serial,
|
||||||
|
GUINT_TO_POINTER (serial_id),
|
||||||
|
tool);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
clutter_input_device_xi2_update_tool (device, tool);
|
||||||
|
g_signal_emit_by_name (manager_xi2, "tool-changed", device, tool);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static ClutterTranslateReturn
|
static ClutterTranslateReturn
|
||||||
clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
|
clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
|
||||||
gpointer native,
|
gpointer native,
|
||||||
@@ -937,7 +1056,8 @@ clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
|
|||||||
return CLUTTER_TRANSLATE_REMOVE;
|
return CLUTTER_TRANSLATE_REMOVE;
|
||||||
|
|
||||||
if (!(xi_event->evtype == XI_HierarchyChanged ||
|
if (!(xi_event->evtype == XI_HierarchyChanged ||
|
||||||
xi_event->evtype == XI_DeviceChanged))
|
xi_event->evtype == XI_DeviceChanged ||
|
||||||
|
xi_event->evtype == XI_PropertyEvent))
|
||||||
{
|
{
|
||||||
stage = get_event_stage (translator, xi_event);
|
stage = get_event_stage (translator, xi_event);
|
||||||
if (stage == NULL || CLUTTER_ACTOR_IN_DESTRUCTION (stage))
|
if (stage == NULL || CLUTTER_ACTOR_IN_DESTRUCTION (stage))
|
||||||
@@ -1078,6 +1198,50 @@ clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
|
|||||||
stage != NULL)
|
stage != NULL)
|
||||||
_clutter_input_device_set_stage (device, stage);
|
_clutter_input_device_set_stage (device, stage);
|
||||||
|
|
||||||
|
if (clutter_input_device_get_device_type (source_device) == CLUTTER_PAD_DEVICE)
|
||||||
|
{
|
||||||
|
/* We got these events because of the passive button grab */
|
||||||
|
XIAllowEvents (clutter_x11_get_default_display (),
|
||||||
|
xev->sourceid,
|
||||||
|
XIAsyncDevice,
|
||||||
|
xev->time);
|
||||||
|
|
||||||
|
/* Ignore 4-7 buttons */
|
||||||
|
if (xev->detail >= 4 && xev->detail <= 7)
|
||||||
|
return CLUTTER_TRANSLATE_REMOVE;
|
||||||
|
|
||||||
|
event->pad_button.type =
|
||||||
|
(xi_event->evtype == XI_ButtonPress) ? CLUTTER_PAD_BUTTON_PRESS
|
||||||
|
: CLUTTER_PAD_BUTTON_RELEASE;
|
||||||
|
event->pad_button.time = xev->time;
|
||||||
|
event->pad_button.stage = stage;
|
||||||
|
|
||||||
|
/* The 4-7 button range is taken as non-existent on pad devices,
|
||||||
|
* let the buttons above that take over this range.
|
||||||
|
*/
|
||||||
|
if (xev->detail > 7)
|
||||||
|
xev->detail -= 4;
|
||||||
|
|
||||||
|
/* Pad buttons are 0-indexed */
|
||||||
|
event->pad_button.button = xev->detail - 1;
|
||||||
|
clutter_event_set_source_device (event, source_device);
|
||||||
|
|
||||||
|
CLUTTER_NOTE (EVENT,
|
||||||
|
"%s: win:0x%x, device:%d '%s', time:%d "
|
||||||
|
"(button:%d)",
|
||||||
|
event->any.type == CLUTTER_BUTTON_PRESS
|
||||||
|
? "pad button press "
|
||||||
|
: "pad button release",
|
||||||
|
(unsigned int) stage_x11->xwin,
|
||||||
|
device->id,
|
||||||
|
device->device_name,
|
||||||
|
event->any.time,
|
||||||
|
event->pad_button.button);
|
||||||
|
|
||||||
|
retval = CLUTTER_TRANSLATE_QUEUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
switch (xev->detail)
|
switch (xev->detail)
|
||||||
{
|
{
|
||||||
case 4:
|
case 4:
|
||||||
@@ -1157,6 +1321,8 @@ clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
|
|||||||
|
|
||||||
clutter_event_set_source_device (event, source_device);
|
clutter_event_set_source_device (event, source_device);
|
||||||
clutter_event_set_device (event, device);
|
clutter_event_set_device (event, device);
|
||||||
|
clutter_event_set_device_tool (event,
|
||||||
|
clutter_input_device_xi2_get_current_tool (source_device));
|
||||||
|
|
||||||
event->button.axes = translate_axes (event->button.device,
|
event->button.axes = translate_axes (event->button.device,
|
||||||
event->button.x,
|
event->button.x,
|
||||||
@@ -1265,6 +1431,8 @@ clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
|
|||||||
|
|
||||||
clutter_event_set_source_device (event, source_device);
|
clutter_event_set_source_device (event, source_device);
|
||||||
clutter_event_set_device (event, device);
|
clutter_event_set_device (event, device);
|
||||||
|
clutter_event_set_device_tool (event,
|
||||||
|
clutter_input_device_xi2_get_current_tool (source_device));
|
||||||
|
|
||||||
event->motion.axes = translate_axes (event->motion.device,
|
event->motion.axes = translate_axes (event->motion.device,
|
||||||
event->motion.x,
|
event->motion.x,
|
||||||
@@ -1466,6 +1634,10 @@ clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
|
|||||||
case XI_FocusOut:
|
case XI_FocusOut:
|
||||||
retval = CLUTTER_TRANSLATE_CONTINUE;
|
retval = CLUTTER_TRANSLATE_CONTINUE;
|
||||||
break;
|
break;
|
||||||
|
case XI_PropertyEvent:
|
||||||
|
handle_property_event (manager_xi2, xi_event);
|
||||||
|
retval = CLUTTER_TRANSLATE_CONTINUE;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return retval;
|
return retval;
|
||||||
@@ -1643,6 +1815,7 @@ clutter_device_manager_xi2_constructed (GObject *gobject)
|
|||||||
|
|
||||||
XISetMask (mask, XI_HierarchyChanged);
|
XISetMask (mask, XI_HierarchyChanged);
|
||||||
XISetMask (mask, XI_DeviceChanged);
|
XISetMask (mask, XI_DeviceChanged);
|
||||||
|
XISetMask (mask, XI_PropertyEvent);
|
||||||
|
|
||||||
event_mask.deviceid = XIAllDevices;
|
event_mask.deviceid = XIAllDevices;
|
||||||
event_mask.mask_len = sizeof (mask);
|
event_mask.mask_len = sizeof (mask);
|
||||||
@@ -1678,6 +1851,16 @@ clutter_device_manager_xi2_set_property (GObject *gobject,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static ClutterVirtualInputDevice *
|
||||||
|
clutter_device_manager_xi2_create_virtual_device (ClutterDeviceManager *manager,
|
||||||
|
ClutterInputDeviceType device_type)
|
||||||
|
{
|
||||||
|
return g_object_new (CLUTTER_TYPE_VIRTUAL_INPUT_DEVICE_X11,
|
||||||
|
"device-manager", manager,
|
||||||
|
"device-type", device_type,
|
||||||
|
NULL);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
clutter_device_manager_xi2_class_init (ClutterDeviceManagerXI2Class *klass)
|
clutter_device_manager_xi2_class_init (ClutterDeviceManagerXI2Class *klass)
|
||||||
{
|
{
|
||||||
@@ -1705,6 +1888,7 @@ clutter_device_manager_xi2_class_init (ClutterDeviceManagerXI2Class *klass)
|
|||||||
manager_class->get_core_device = clutter_device_manager_xi2_get_core_device;
|
manager_class->get_core_device = clutter_device_manager_xi2_get_core_device;
|
||||||
manager_class->get_device = clutter_device_manager_xi2_get_device;
|
manager_class->get_device = clutter_device_manager_xi2_get_device;
|
||||||
manager_class->select_stage_events = clutter_device_manager_xi2_select_stage_events;
|
manager_class->select_stage_events = clutter_device_manager_xi2_select_stage_events;
|
||||||
|
manager_class->create_virtual_device = clutter_device_manager_xi2_create_virtual_device;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -1713,4 +1897,6 @@ clutter_device_manager_xi2_init (ClutterDeviceManagerXI2 *self)
|
|||||||
self->devices_by_id = g_hash_table_new_full (NULL, NULL,
|
self->devices_by_id = g_hash_table_new_full (NULL, NULL,
|
||||||
NULL,
|
NULL,
|
||||||
(GDestroyNotify) g_object_unref);
|
(GDestroyNotify) g_object_unref);
|
||||||
|
self->tools_by_serial = g_hash_table_new_full (NULL, NULL, NULL,
|
||||||
|
(GDestroyNotify) g_object_unref);
|
||||||
}
|
}
|
||||||
|
@@ -43,6 +43,7 @@ struct _ClutterDeviceManagerXI2
|
|||||||
ClutterDeviceManager parent_instance;
|
ClutterDeviceManager parent_instance;
|
||||||
|
|
||||||
GHashTable *devices_by_id;
|
GHashTable *devices_by_id;
|
||||||
|
GHashTable *tools_by_serial;
|
||||||
|
|
||||||
GSList *all_devices;
|
GSList *all_devices;
|
||||||
|
|
||||||
|
51
clutter/clutter/x11/clutter-input-device-tool-xi2.c
Normal file
51
clutter/clutter/x11/clutter-input-device-tool-xi2.c
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
/*
|
||||||
|
* Clutter.
|
||||||
|
*
|
||||||
|
* An OpenGL based 'interactive canvas' library.
|
||||||
|
*
|
||||||
|
* Copyright © 2016 Red Hat
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Author: Carlos Garnacho <carlosg@gnome.org>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "clutter-build-config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "clutter-input-device-tool-xi2.h"
|
||||||
|
|
||||||
|
G_DEFINE_TYPE (ClutterInputDeviceToolXI2, clutter_input_device_tool_xi2,
|
||||||
|
CLUTTER_TYPE_INPUT_DEVICE_TOOL)
|
||||||
|
|
||||||
|
static void
|
||||||
|
clutter_input_device_tool_xi2_class_init (ClutterInputDeviceToolXI2Class *klass)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
clutter_input_device_tool_xi2_init (ClutterInputDeviceToolXI2 *tool)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
ClutterInputDeviceTool *
|
||||||
|
clutter_input_device_tool_xi2_new (guint serial,
|
||||||
|
ClutterInputDeviceToolType type)
|
||||||
|
{
|
||||||
|
return g_object_new (CLUTTER_TYPE_INPUT_DEVICE_TOOL_XI2,
|
||||||
|
"type", type,
|
||||||
|
"serial", serial,
|
||||||
|
NULL);
|
||||||
|
}
|
74
clutter/clutter/x11/clutter-input-device-tool-xi2.h
Normal file
74
clutter/clutter/x11/clutter-input-device-tool-xi2.h
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
/*
|
||||||
|
* Clutter.
|
||||||
|
*
|
||||||
|
* An OpenGL based 'interactive canvas' library.
|
||||||
|
*
|
||||||
|
* Copyright © 2016 Red Hat
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Author: Carlos Garnacho <carlosg@gnome.org>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __CLUTTER_INPUT_DEVICE_XI2_TOOL_H__
|
||||||
|
#define __CLUTTER_INPUT_DEVICE_XI2_TOOL_H__
|
||||||
|
|
||||||
|
#include <clutter/clutter-input-device-tool.h>
|
||||||
|
|
||||||
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
|
#define CLUTTER_TYPE_INPUT_DEVICE_TOOL_XI2 (clutter_input_device_tool_xi2_get_type ())
|
||||||
|
|
||||||
|
#define CLUTTER_INPUT_DEVICE_TOOL_XI2(o) \
|
||||||
|
(G_TYPE_CHECK_INSTANCE_CAST ((o), \
|
||||||
|
CLUTTER_TYPE_INPUT_DEVICE_TOOL_XI2, ClutterInputDeviceToolXI2))
|
||||||
|
|
||||||
|
#define CLUTTER_IS_INPUT_DEVICE_TOOL_XI2(o) \
|
||||||
|
(G_TYPE_CHECK_INSTANCE_TYPE ((o), \
|
||||||
|
CLUTTER_TYPE_INPUT_DEVICE_TOOL_XI2))
|
||||||
|
|
||||||
|
#define CLUTTER_INPUT_DEVICE_TOOL_XI2_CLASS(c) \
|
||||||
|
(G_TYPE_CHECK_CLASS_CAST ((c), \
|
||||||
|
CLUTTER_TYPE_INPUT_DEVICE_TOOL_XI2, ClutterInputDeviceToolXI2Class))
|
||||||
|
|
||||||
|
#define CLUTTER_IS_INPUT_DEVICE_TOOL_XI2_CLASS(c) \
|
||||||
|
(G_TYPE_CHECK_CLASS_TYPE ((c), \
|
||||||
|
CLUTTER_TYPE_INPUT_DEVICE_TOOL_XI2))
|
||||||
|
|
||||||
|
#define CLUTTER_INPUT_DEVICE_TOOL_XI2_GET_CLASS(o) \
|
||||||
|
(G_TYPE_INSTANCE_GET_CLASS ((o), \
|
||||||
|
CLUTTER_TYPE_INPUT_DEVICE_TOOL_XI2, ClutterInputDeviceToolXI2Class))
|
||||||
|
|
||||||
|
typedef struct _ClutterInputDeviceToolXI2 ClutterInputDeviceToolXI2;
|
||||||
|
typedef struct _ClutterInputDeviceToolXI2Class ClutterInputDeviceToolXI2Class;
|
||||||
|
|
||||||
|
struct _ClutterInputDeviceToolXI2
|
||||||
|
{
|
||||||
|
ClutterInputDeviceTool parent_instance;
|
||||||
|
struct libinput_tablet_tool *tool;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct _ClutterInputDeviceToolXI2Class
|
||||||
|
{
|
||||||
|
ClutterInputDeviceToolClass parent_class;
|
||||||
|
};
|
||||||
|
|
||||||
|
GType clutter_input_device_tool_xi2_get_type (void) G_GNUC_CONST;
|
||||||
|
|
||||||
|
ClutterInputDeviceTool * clutter_input_device_tool_xi2_new (guint serial,
|
||||||
|
ClutterInputDeviceToolType type);
|
||||||
|
|
||||||
|
G_END_DECLS
|
||||||
|
|
||||||
|
#endif /* __CLUTTER_INPUT_DEVICE_XI2_TOOL_H__ */
|
@@ -44,6 +44,7 @@ struct _ClutterInputDeviceXI2
|
|||||||
ClutterInputDevice device;
|
ClutterInputDevice device;
|
||||||
|
|
||||||
gint device_id;
|
gint device_id;
|
||||||
|
ClutterInputDeviceTool *current_tool;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define N_BUTTONS 5
|
#define N_BUTTONS 5
|
||||||
@@ -79,6 +80,13 @@ clutter_input_device_xi2_keycode_to_evdev (ClutterInputDevice *device,
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
clutter_input_device_xi2_is_grouped (ClutterInputDevice *device,
|
||||||
|
ClutterInputDevice *other_device)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
clutter_input_device_xi2_class_init (ClutterInputDeviceXI2Class *klass)
|
clutter_input_device_xi2_class_init (ClutterInputDeviceXI2Class *klass)
|
||||||
{
|
{
|
||||||
@@ -88,6 +96,7 @@ clutter_input_device_xi2_class_init (ClutterInputDeviceXI2Class *klass)
|
|||||||
gobject_class->constructed = clutter_input_device_xi2_constructed;
|
gobject_class->constructed = clutter_input_device_xi2_constructed;
|
||||||
|
|
||||||
device_class->keycode_to_evdev = clutter_input_device_xi2_keycode_to_evdev;
|
device_class->keycode_to_evdev = clutter_input_device_xi2_keycode_to_evdev;
|
||||||
|
device_class->is_grouped = clutter_input_device_xi2_is_grouped;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -172,3 +181,18 @@ _clutter_input_device_xi2_translate_state (ClutterEvent *event,
|
|||||||
|
|
||||||
_clutter_event_set_state_full (event, button, base, latched, locked, effective);
|
_clutter_event_set_state_full (event, button, base, latched, locked, effective);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
clutter_input_device_xi2_update_tool (ClutterInputDevice *device,
|
||||||
|
ClutterInputDeviceTool *tool)
|
||||||
|
{
|
||||||
|
ClutterInputDeviceXI2 *device_xi2 = CLUTTER_INPUT_DEVICE_XI2 (device);
|
||||||
|
g_set_object (&device_xi2->current_tool, tool);
|
||||||
|
}
|
||||||
|
|
||||||
|
ClutterInputDeviceTool *
|
||||||
|
clutter_input_device_xi2_get_current_tool (ClutterInputDevice *device)
|
||||||
|
{
|
||||||
|
ClutterInputDeviceXI2 *device_xi2 = CLUTTER_INPUT_DEVICE_XI2 (device);
|
||||||
|
return device_xi2->current_tool;
|
||||||
|
}
|
||||||
|
@@ -41,6 +41,9 @@ void _clutter_input_device_xi2_translate_state (ClutterEvent *event,
|
|||||||
XIModifierState *modifiers_state,
|
XIModifierState *modifiers_state,
|
||||||
XIButtonState *buttons_state,
|
XIButtonState *buttons_state,
|
||||||
XIGroupState *group_state);
|
XIGroupState *group_state);
|
||||||
|
void clutter_input_device_xi2_update_tool (ClutterInputDevice *device,
|
||||||
|
ClutterInputDeviceTool *tool);
|
||||||
|
ClutterInputDeviceTool * clutter_input_device_xi2_get_current_tool (ClutterInputDevice *device);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
|
@@ -6,7 +6,6 @@ static const struct {
|
|||||||
const char *xsetting_name;
|
const char *xsetting_name;
|
||||||
const char *settings_property;
|
const char *settings_property;
|
||||||
} _clutter_settings_map[] = {
|
} _clutter_settings_map[] = {
|
||||||
{ "Net/DoubleClickTime", "double-click-time" },
|
|
||||||
{ "Net/DoubleClickDistance", "double-click-distance" },
|
{ "Net/DoubleClickDistance", "double-click-distance" },
|
||||||
{ "Net/DndDragThreshold", "dnd-drag-threshold" },
|
{ "Net/DndDragThreshold", "dnd-drag-threshold" },
|
||||||
{ "Gtk/FontName", "font-name" },
|
{ "Gtk/FontName", "font-name" },
|
||||||
@@ -16,7 +15,6 @@ static const struct {
|
|||||||
{ "Xft/HintStyle", "font-hint-style" },
|
{ "Xft/HintStyle", "font-hint-style" },
|
||||||
{ "Xft/RGBA", "font-subpixel-order" },
|
{ "Xft/RGBA", "font-subpixel-order" },
|
||||||
{ "Fontconfig/Timestamp", "fontconfig-timestamp" },
|
{ "Fontconfig/Timestamp", "fontconfig-timestamp" },
|
||||||
{ "Gdk/WindowScalingFactor", "window-scaling-factor" },
|
|
||||||
{ "Gdk/UnscaledDPI", "unscaled-font-dpi" },
|
{ "Gdk/UnscaledDPI", "unscaled-font-dpi" },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -162,10 +162,10 @@ clutter_stage_x11_fix_window_size (ClutterStageX11 *stage_x11,
|
|||||||
&min_height);
|
&min_height);
|
||||||
|
|
||||||
if (new_width <= 0)
|
if (new_width <= 0)
|
||||||
new_width = min_width * stage_x11->scale_factor;
|
new_width = min_width;
|
||||||
|
|
||||||
if (new_height <= 0)
|
if (new_height <= 0)
|
||||||
new_height = min_height * stage_x11->scale_factor;
|
new_height = min_height;
|
||||||
|
|
||||||
size_hints->flags = 0;
|
size_hints->flags = 0;
|
||||||
|
|
||||||
@@ -175,8 +175,8 @@ clutter_stage_x11_fix_window_size (ClutterStageX11 *stage_x11,
|
|||||||
{
|
{
|
||||||
if (resize)
|
if (resize)
|
||||||
{
|
{
|
||||||
size_hints->min_width = min_width * stage_x11->scale_factor;
|
size_hints->min_width = min_width;
|
||||||
size_hints->min_height = min_height * stage_x11->scale_factor;
|
size_hints->min_height = min_height;
|
||||||
size_hints->flags = PMinSize;
|
size_hints->flags = PMinSize;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -236,8 +236,8 @@ clutter_stage_x11_get_geometry (ClutterStageWindow *stage_window,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
geometry->width = stage_x11->xwin_width / stage_x11->scale_factor;
|
geometry->width = stage_x11->xwin_width;
|
||||||
geometry->height = stage_x11->xwin_height / stage_x11->scale_factor;
|
geometry->height = stage_x11->xwin_height;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -255,8 +255,8 @@ clutter_stage_x11_resize (ClutterStageWindow *stage_window,
|
|||||||
* so we need to manually set the size and queue a relayout on the
|
* so we need to manually set the size and queue a relayout on the
|
||||||
* stage here (as is normally done in response to ConfigureNotify).
|
* stage here (as is normally done in response to ConfigureNotify).
|
||||||
*/
|
*/
|
||||||
stage_x11->xwin_width = width * stage_x11->scale_factor;
|
stage_x11->xwin_width = width;
|
||||||
stage_x11->xwin_height = height * stage_x11->scale_factor;
|
stage_x11->xwin_height = height;
|
||||||
clutter_actor_queue_relayout (CLUTTER_ACTOR (stage_cogl->wrapper));
|
clutter_actor_queue_relayout (CLUTTER_ACTOR (stage_cogl->wrapper));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -277,9 +277,6 @@ clutter_stage_x11_resize (ClutterStageWindow *stage_window,
|
|||||||
|
|
||||||
CLUTTER_NOTE (BACKEND, "New size received: (%d, %d)", width, height);
|
CLUTTER_NOTE (BACKEND, "New size received: (%d, %d)", width, height);
|
||||||
|
|
||||||
width *= stage_x11->scale_factor;
|
|
||||||
height *= stage_x11->scale_factor;
|
|
||||||
|
|
||||||
if (stage_x11->xwin != None)
|
if (stage_x11->xwin != None)
|
||||||
{
|
{
|
||||||
clutter_stage_x11_fix_window_size (stage_x11, width, height);
|
clutter_stage_x11_fix_window_size (stage_x11, width, height);
|
||||||
@@ -400,20 +397,6 @@ set_cursor_visible (ClutterStageX11 *stage_x11)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
on_window_scaling_factor_notify (GObject *settings,
|
|
||||||
GParamSpec *pspec,
|
|
||||||
ClutterStageX11 *stage_x11)
|
|
||||||
{
|
|
||||||
g_object_get (settings,
|
|
||||||
"window-scaling-factor", &stage_x11->scale_factor,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
clutter_stage_x11_resize (CLUTTER_STAGE_WINDOW (stage_x11),
|
|
||||||
stage_x11->xwin_width,
|
|
||||||
stage_x11->xwin_height);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
clutter_stage_x11_unrealize (ClutterStageWindow *stage_window)
|
clutter_stage_x11_unrealize (ClutterStageWindow *stage_window)
|
||||||
{
|
{
|
||||||
@@ -643,12 +626,8 @@ clutter_stage_x11_realize (ClutterStageWindow *stage_window)
|
|||||||
|
|
||||||
CLUTTER_NOTE (BACKEND, "Wrapper size: %.2f x %.2f", width, height);
|
CLUTTER_NOTE (BACKEND, "Wrapper size: %.2f x %.2f", width, height);
|
||||||
|
|
||||||
width = width * (float) stage_x11->scale_factor;
|
CLUTTER_NOTE (BACKEND, "Creating a new Cogl onscreen surface: %.2f x %.2f",
|
||||||
height = height * (float) stage_x11->scale_factor;
|
width, height);
|
||||||
|
|
||||||
CLUTTER_NOTE (BACKEND, "Creating a new Cogl onscreen surface: %.2f x %.2f (factor: %d)",
|
|
||||||
width, height,
|
|
||||||
stage_x11->scale_factor);
|
|
||||||
|
|
||||||
stage_x11->onscreen = cogl_onscreen_new (backend->cogl_context, width, height);
|
stage_x11->onscreen = cogl_onscreen_new (backend->cogl_context, width, height);
|
||||||
|
|
||||||
@@ -909,28 +888,6 @@ clutter_stage_x11_can_clip_redraws (ClutterStageWindow *stage_window)
|
|||||||
return stage_x11->clipped_redraws_cool_off == 0;
|
return stage_x11->clipped_redraws_cool_off == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
clutter_stage_x11_set_scale_factor (ClutterStageWindow *stage_window,
|
|
||||||
int factor)
|
|
||||||
{
|
|
||||||
ClutterStageX11 *stage_x11 = CLUTTER_STAGE_X11 (stage_window);
|
|
||||||
|
|
||||||
if (stage_x11->scale_factor == factor)
|
|
||||||
return;
|
|
||||||
|
|
||||||
stage_x11->scale_factor = factor;
|
|
||||||
|
|
||||||
clutter_stage_x11_resize (stage_window, stage_x11->xwin_width, stage_x11->xwin_height);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
clutter_stage_x11_get_scale_factor (ClutterStageWindow *stage_window)
|
|
||||||
{
|
|
||||||
ClutterStageX11 *stage_x11 = CLUTTER_STAGE_X11 (stage_window);
|
|
||||||
|
|
||||||
return stage_x11->scale_factor;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ensure_legacy_view (ClutterStageWindow *stage_window)
|
ensure_legacy_view (ClutterStageWindow *stage_window)
|
||||||
{
|
{
|
||||||
@@ -1002,8 +959,6 @@ clutter_stage_x11_class_init (ClutterStageX11Class *klass)
|
|||||||
static void
|
static void
|
||||||
clutter_stage_x11_init (ClutterStageX11 *stage)
|
clutter_stage_x11_init (ClutterStageX11 *stage)
|
||||||
{
|
{
|
||||||
ClutterSettings *settings;
|
|
||||||
|
|
||||||
stage->xwin = None;
|
stage->xwin = None;
|
||||||
stage->xwin_width = 640;
|
stage->xwin_width = 640;
|
||||||
stage->xwin_height = 480;
|
stage->xwin_height = 480;
|
||||||
@@ -1016,12 +971,6 @@ clutter_stage_x11_init (ClutterStageX11 *stage)
|
|||||||
stage->accept_focus = TRUE;
|
stage->accept_focus = TRUE;
|
||||||
|
|
||||||
stage->title = NULL;
|
stage->title = NULL;
|
||||||
|
|
||||||
settings = clutter_settings_get_default ();
|
|
||||||
g_signal_connect (settings, "notify::window-scaling-factor",
|
|
||||||
G_CALLBACK (on_window_scaling_factor_notify),
|
|
||||||
stage);
|
|
||||||
on_window_scaling_factor_notify (G_OBJECT (settings), NULL, stage);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -1041,8 +990,6 @@ clutter_stage_window_iface_init (ClutterStageWindowIface *iface)
|
|||||||
iface->realize = clutter_stage_x11_realize;
|
iface->realize = clutter_stage_x11_realize;
|
||||||
iface->unrealize = clutter_stage_x11_unrealize;
|
iface->unrealize = clutter_stage_x11_unrealize;
|
||||||
iface->can_clip_redraws = clutter_stage_x11_can_clip_redraws;
|
iface->can_clip_redraws = clutter_stage_x11_can_clip_redraws;
|
||||||
iface->set_scale_factor = clutter_stage_x11_set_scale_factor;
|
|
||||||
iface->get_scale_factor = clutter_stage_x11_get_scale_factor;
|
|
||||||
iface->get_views = clutter_stage_x11_get_views;
|
iface->get_views = clutter_stage_x11_get_views;
|
||||||
iface->get_frame_counter = clutter_stage_x11_get_frame_counter;
|
iface->get_frame_counter = clutter_stage_x11_get_frame_counter;
|
||||||
}
|
}
|
||||||
@@ -1167,8 +1114,8 @@ clutter_stage_x11_translate_event (ClutterEventTranslator *translator,
|
|||||||
stage_x11->xwin_height = xevent->xconfigure.height;
|
stage_x11->xwin_height = xevent->xconfigure.height;
|
||||||
}
|
}
|
||||||
|
|
||||||
stage_width = xevent->xconfigure.width / stage_x11->scale_factor;
|
stage_width = xevent->xconfigure.width;
|
||||||
stage_height = xevent->xconfigure.height / stage_x11->scale_factor;
|
stage_height = xevent->xconfigure.height;
|
||||||
clutter_actor_set_size (CLUTTER_ACTOR (stage), stage_width, stage_height);
|
clutter_actor_set_size (CLUTTER_ACTOR (stage), stage_width, stage_height);
|
||||||
|
|
||||||
if (size_changed)
|
if (size_changed)
|
||||||
@@ -1335,10 +1282,10 @@ clutter_stage_x11_translate_event (ClutterEventTranslator *translator,
|
|||||||
expose->width,
|
expose->width,
|
||||||
expose->height);
|
expose->height);
|
||||||
|
|
||||||
clip.x = expose->x / stage_x11->scale_factor;
|
clip.x = expose->x;
|
||||||
clip.y = expose->y / stage_x11->scale_factor;
|
clip.y = expose->y;
|
||||||
clip.width = expose->width / stage_x11->scale_factor;
|
clip.width = expose->width;
|
||||||
clip.height = expose->height / stage_x11->scale_factor;
|
clip.height = expose->height;
|
||||||
clutter_actor_queue_redraw_with_clip (CLUTTER_ACTOR (stage), &clip);
|
clutter_actor_queue_redraw_with_clip (CLUTTER_ACTOR (stage), &clip);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -1504,8 +1451,8 @@ set_foreign_window_callback (ClutterActor *actor,
|
|||||||
fwd->stage_x11->xwin = fwd->xwindow;
|
fwd->stage_x11->xwin = fwd->xwindow;
|
||||||
fwd->stage_x11->is_foreign_xwin = TRUE;
|
fwd->stage_x11->is_foreign_xwin = TRUE;
|
||||||
|
|
||||||
fwd->stage_x11->xwin_width = fwd->geom.width * fwd->stage_x11->scale_factor;
|
fwd->stage_x11->xwin_width = fwd->geom.width;
|
||||||
fwd->stage_x11->xwin_height = fwd->geom.height * fwd->stage_x11->scale_factor;
|
fwd->stage_x11->xwin_height = fwd->geom.height;
|
||||||
|
|
||||||
clutter_actor_set_size (actor, fwd->geom.width, fwd->geom.height);
|
clutter_actor_set_size (actor, fwd->geom.width, fwd->geom.height);
|
||||||
|
|
||||||
@@ -1599,8 +1546,8 @@ clutter_x11_set_stage_foreign (ClutterStage *stage,
|
|||||||
|
|
||||||
fwd.geom.x = x;
|
fwd.geom.x = x;
|
||||||
fwd.geom.y = y;
|
fwd.geom.y = y;
|
||||||
fwd.geom.width = width / stage_x11->scale_factor;
|
fwd.geom.width = width;
|
||||||
fwd.geom.height = height / stage_x11->scale_factor;
|
fwd.geom.height = height;
|
||||||
|
|
||||||
actor = CLUTTER_ACTOR (stage);
|
actor = CLUTTER_ACTOR (stage);
|
||||||
|
|
||||||
|
@@ -69,8 +69,6 @@ struct _ClutterStageX11
|
|||||||
|
|
||||||
ClutterStageX11State wm_state;
|
ClutterStageX11State wm_state;
|
||||||
|
|
||||||
int scale_factor;
|
|
||||||
|
|
||||||
guint is_foreign_xwin : 1;
|
guint is_foreign_xwin : 1;
|
||||||
guint fullscreening : 1;
|
guint fullscreening : 1;
|
||||||
guint is_cursor_visible : 1;
|
guint is_cursor_visible : 1;
|
||||||
|
@@ -27,6 +27,9 @@
|
|||||||
|
|
||||||
#include <glib-object.h>
|
#include <glib-object.h>
|
||||||
|
|
||||||
|
#include "clutter-x11.h"
|
||||||
|
#include "X11/extensions/XTest.h"
|
||||||
|
|
||||||
#include "clutter-virtual-input-device.h"
|
#include "clutter-virtual-input-device.h"
|
||||||
#include "x11/clutter-virtual-input-device-x11.h"
|
#include "x11/clutter-virtual-input-device-x11.h"
|
||||||
|
|
||||||
@@ -61,6 +64,8 @@ clutter_virtual_input_device_x11_notify_button (ClutterVirtualInputDevice *virtu
|
|||||||
uint32_t button,
|
uint32_t button,
|
||||||
ClutterButtonState button_state)
|
ClutterButtonState button_state)
|
||||||
{
|
{
|
||||||
|
XTestFakeButtonEvent (clutter_x11_get_default_display (),
|
||||||
|
button, button_state == CLUTTER_BUTTON_STATE_PRESSED, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -69,6 +74,21 @@ clutter_virtual_input_device_x11_notify_key (ClutterVirtualInputDevice *virtual_
|
|||||||
uint32_t key,
|
uint32_t key,
|
||||||
ClutterKeyState key_state)
|
ClutterKeyState key_state)
|
||||||
{
|
{
|
||||||
|
XTestFakeKeyEvent (clutter_x11_get_default_display (),
|
||||||
|
key, key_state == CLUTTER_KEY_STATE_PRESSED, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
clutter_virtual_input_device_x11_notify_keyval (ClutterVirtualInputDevice *virtual_device,
|
||||||
|
uint64_t time_us,
|
||||||
|
uint32_t keyval,
|
||||||
|
ClutterKeyState key_state)
|
||||||
|
{
|
||||||
|
KeyCode keycode;
|
||||||
|
|
||||||
|
keycode = XKeysymToKeycode (clutter_x11_get_default_display (), keyval);
|
||||||
|
XTestFakeKeyEvent (clutter_x11_get_default_display (),
|
||||||
|
keycode, key_state == CLUTTER_KEY_STATE_PRESSED, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -86,4 +106,5 @@ clutter_virtual_input_device_x11_class_init (ClutterVirtualInputDeviceX11Class *
|
|||||||
virtual_input_device_class->notify_absolute_motion = clutter_virtual_input_device_x11_notify_absolute_motion;
|
virtual_input_device_class->notify_absolute_motion = clutter_virtual_input_device_x11_notify_absolute_motion;
|
||||||
virtual_input_device_class->notify_button = clutter_virtual_input_device_x11_notify_button;
|
virtual_input_device_class->notify_button = clutter_virtual_input_device_x11_notify_button;
|
||||||
virtual_input_device_class->notify_key = clutter_virtual_input_device_x11_notify_key;
|
virtual_input_device_class->notify_key = clutter_virtual_input_device_x11_notify_key;
|
||||||
|
virtual_input_device_class->notify_keyval = clutter_virtual_input_device_x11_notify_keyval;
|
||||||
}
|
}
|
||||||
|
@@ -42,9 +42,6 @@ m4_define([clutter_release_status],
|
|||||||
|
|
||||||
m4_define([clutter_version], [clutter_major_version.clutter_minor_version.clutter_micro_version])
|
m4_define([clutter_version], [clutter_major_version.clutter_minor_version.clutter_micro_version])
|
||||||
|
|
||||||
# change this only when breaking the API
|
|
||||||
m4_define([clutter_api_version], [1.0])
|
|
||||||
|
|
||||||
AC_PREREQ([2.63])
|
AC_PREREQ([2.63])
|
||||||
|
|
||||||
AC_INIT([clutter],
|
AC_INIT([clutter],
|
||||||
@@ -61,12 +58,18 @@ AC_CONFIG_MACRO_DIR([build/autotools])
|
|||||||
AM_INIT_AUTOMAKE([1.11 foreign -Wno-portability no-define no-dist-gzip dist-xz tar-ustar])
|
AM_INIT_AUTOMAKE([1.11 foreign -Wno-portability no-define no-dist-gzip dist-xz tar-ustar])
|
||||||
AM_SILENT_RULES([yes])
|
AM_SILENT_RULES([yes])
|
||||||
|
|
||||||
|
dnl = Check that we are configured by mutter ==============================
|
||||||
|
|
||||||
|
AC_ARG_VAR([MUTTER_VERSION])
|
||||||
|
AC_ARG_VAR([LIBMUTTER_API_VERSION])
|
||||||
|
|
||||||
|
AS_IF([test "x$MUTTER_VERSION" = "x"],
|
||||||
|
[AC_MSG_ERROR([Clutter can only be configured by mutter])],)
|
||||||
|
|
||||||
AC_SUBST([CLUTTER_MAJOR_VERSION], [clutter_major_version])
|
AC_SUBST([CLUTTER_MAJOR_VERSION], [clutter_major_version])
|
||||||
AC_SUBST([CLUTTER_MINOR_VERSION], [clutter_minor_version])
|
AC_SUBST([CLUTTER_MINOR_VERSION], [clutter_minor_version])
|
||||||
AC_SUBST([CLUTTER_MICRO_VERSION], [clutter_micro_version])
|
AC_SUBST([CLUTTER_MICRO_VERSION], [clutter_micro_version])
|
||||||
AC_SUBST([CLUTTER_VERSION], [clutter_version])
|
AC_SUBST([CLUTTER_VERSION], [clutter_version])
|
||||||
AC_SUBST([CLUTTER_API_VERSION], [clutter_api_version])
|
|
||||||
AC_SUBST([CLUTTER_API_VERSION_AM], [$CLUTTER_MAJOR_VERSION\_0])
|
|
||||||
AC_SUBST([CLUTTER_RELEASE_STATUS], [clutter_release_status])
|
AC_SUBST([CLUTTER_RELEASE_STATUS], [clutter_release_status])
|
||||||
|
|
||||||
m4_define([lt_current], [m4_eval(100 * clutter_minor_version + clutter_micro_version - clutter_interface_age)])
|
m4_define([lt_current], [m4_eval(100 * clutter_minor_version + clutter_micro_version - clutter_interface_age)])
|
||||||
@@ -382,6 +385,22 @@ AS_IF([test "x$SUPPORT_X11" = "x1"],
|
|||||||
[AC_MSG_ERROR([not found])]
|
[AC_MSG_ERROR([not found])]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# XTEST (required)
|
||||||
|
AC_MSG_CHECKING([for XTest extension])
|
||||||
|
PKG_CHECK_EXISTS([xtst], [have_xtest=yes], [have_xtest=no])
|
||||||
|
AS_IF([test "x$have_xtest" = "xyes"],
|
||||||
|
[
|
||||||
|
AC_DEFINE(HAVE_XTEST, [1], [Define to 1 if we have the XTest X extension])
|
||||||
|
|
||||||
|
X11_LIBS="$X11_LIBS -lXtst"
|
||||||
|
X11_PC_FILES="$X11_PC_FILES xtst"
|
||||||
|
X11_EXTS="$X11_EXTS xtst"
|
||||||
|
|
||||||
|
AC_MSG_RESULT([found])
|
||||||
|
],
|
||||||
|
[AC_MSG_ERROR([Not found])]
|
||||||
|
)
|
||||||
|
|
||||||
# X Generic Extensions (optional)
|
# X Generic Extensions (optional)
|
||||||
clutter_save_CPPFLAGS="$CPPFLAGS"
|
clutter_save_CPPFLAGS="$CPPFLAGS"
|
||||||
CPPFLAGS="$CPPFLAGS $X11_CFLAGS"
|
CPPFLAGS="$CPPFLAGS $X11_CFLAGS"
|
||||||
@@ -765,7 +784,7 @@ AC_CONFIG_FILES([
|
|||||||
clutter/Makefile
|
clutter/Makefile
|
||||||
clutter/clutter-config.h
|
clutter/clutter-config.h
|
||||||
clutter/clutter-version.h
|
clutter/clutter-version.h
|
||||||
clutter/mutter-clutter-$CLUTTER_API_VERSION.pc:clutter/mutter-clutter.pc.in
|
clutter/mutter-clutter-$LIBMUTTER_API_VERSION.pc:clutter/mutter-clutter.pc.in
|
||||||
|
|
||||||
tests/Makefile
|
tests/Makefile
|
||||||
tests/accessibility/Makefile
|
tests/accessibility/Makefile
|
||||||
|
@@ -21,7 +21,7 @@ all_examples += \
|
|||||||
image-content
|
image-content
|
||||||
endif
|
endif
|
||||||
|
|
||||||
LDADD = $(top_builddir)/clutter/libmutter-clutter-@CLUTTER_API_VERSION@.la $(CLUTTER_LIBS) $(GDK_PIXBUF_LIBS) $(LIBM)
|
LDADD = $(top_builddir)/clutter/libmutter-clutter-@LIBMUTTER_API_VERSION@.la $(CLUTTER_LIBS) $(GDK_PIXBUF_LIBS) $(LIBM)
|
||||||
AM_CFLAGS = $(CLUTTER_CFLAGS) $(GDK_PIXBUF_CFLAGS) $(MAINTAINER_CFLAGS)
|
AM_CFLAGS = $(CLUTTER_CFLAGS) $(GDK_PIXBUF_CFLAGS) $(MAINTAINER_CFLAGS)
|
||||||
AM_CPPFLAGS = \
|
AM_CPPFLAGS = \
|
||||||
-DG_DISABLE_SINGLE_INCLUDES \
|
-DG_DISABLE_SINGLE_INCLUDES \
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
common_ldadd = \
|
common_ldadd = \
|
||||||
$(top_builddir)/clutter/libmutter-clutter-@CLUTTER_API_VERSION@.la
|
$(top_builddir)/clutter/libmutter-clutter-@LIBMUTTER_API_VERSION@.la
|
||||||
|
|
||||||
common_sources = \
|
common_sources = \
|
||||||
cally-examples-util.c \
|
cally-examples-util.c \
|
||||||
@@ -11,6 +11,7 @@ AM_CPPFLAGS = \
|
|||||||
-DGLIB_DISABLE_DEPRECATION_WARNINGS \
|
-DGLIB_DISABLE_DEPRECATION_WARNINGS \
|
||||||
-I$(top_srcdir)/../cogl \
|
-I$(top_srcdir)/../cogl \
|
||||||
-I$(top_builddir)/../cogl \
|
-I$(top_builddir)/../cogl \
|
||||||
|
-I$(top_builddir)/../cogl/cogl \
|
||||||
-I$(top_srcdir) \
|
-I$(top_srcdir) \
|
||||||
-I$(top_builddir) \
|
-I$(top_builddir) \
|
||||||
-I$(top_srcdir)/clutter \
|
-I$(top_srcdir)/clutter \
|
||||||
|
@@ -3,12 +3,13 @@ installed_testdir = $(libexecdir)/installed-tests/mutter-clutter
|
|||||||
include $(top_srcdir)/build/autotools/glib-tap.mk
|
include $(top_srcdir)/build/autotools/glib-tap.mk
|
||||||
|
|
||||||
AM_CFLAGS = -g $(CLUTTER_CFLAGS) $(MAINTAINER_CFLAGS)
|
AM_CFLAGS = -g $(CLUTTER_CFLAGS) $(MAINTAINER_CFLAGS)
|
||||||
LDADD = $(top_builddir)/../cogl/cogl/libmutter-cogl.la $(top_builddir)/clutter/libmutter-clutter-1.0.la $(CLUTTER_LIBS) $(LIBM)
|
LDADD = $(top_builddir)/../cogl/cogl/libmutter-cogl-@LIBMUTTER_API_VERSION@.la $(top_builddir)/clutter/libmutter-clutter-@LIBMUTTER_API_VERSION@.la $(CLUTTER_LIBS) $(LIBM)
|
||||||
AM_LDFLAGS = -export-dynamic
|
AM_LDFLAGS = -export-dynamic
|
||||||
AM_CPPFLAGS = \
|
AM_CPPFLAGS = \
|
||||||
-DG_LOG_DOMAIN=\"Clutter-Conform\" \
|
-DG_LOG_DOMAIN=\"Clutter-Conform\" \
|
||||||
-I$(top_srcdir)/../cogl \
|
-I$(top_srcdir)/../cogl \
|
||||||
-I$(top_builddir)/../cogl \
|
-I$(top_builddir)/../cogl \
|
||||||
|
-I$(top_builddir)/../cogl/cogl \
|
||||||
-I$(top_srcdir) \
|
-I$(top_srcdir) \
|
||||||
-I$(top_builddir) \
|
-I$(top_builddir) \
|
||||||
-DCOGL_DISABLE_DEPRECATION_WARNINGS \
|
-DCOGL_DISABLE_DEPRECATION_WARNINGS \
|
||||||
@@ -78,7 +79,7 @@ script_tests = \
|
|||||||
test-script-timeline-markers.json \
|
test-script-timeline-markers.json \
|
||||||
test-state-1.json
|
test-state-1.json
|
||||||
|
|
||||||
TESTS_ENVIRONMENT += G_ENABLE_DIAGNOSTIC=0 CLUTTER_ENABLE_DIAGNOSTIC=0
|
TESTS_ENVIRONMENT += G_ENABLE_DIAGNOSTIC=0 CLUTTER_ENABLE_DIAGNOSTIC=0 CLUTTER_SCALE=1
|
||||||
|
|
||||||
# simple rules for generating a Git ignore file for the conformance test suite
|
# simple rules for generating a Git ignore file for the conformance test suite
|
||||||
$(srcdir)/.gitignore: Makefile
|
$(srcdir)/.gitignore: Makefile
|
||||||
|
@@ -350,7 +350,8 @@ actor_replace_child (void)
|
|||||||
g_assert_cmpstr (clutter_actor_get_name (iter), ==, "qux");
|
g_assert_cmpstr (clutter_actor_get_name (iter), ==, "qux");
|
||||||
|
|
||||||
clutter_actor_add_child (actor, g_object_new (CLUTTER_TYPE_ACTOR,
|
clutter_actor_add_child (actor, g_object_new (CLUTTER_TYPE_ACTOR,
|
||||||
"name", "foo"));
|
"name", "foo",
|
||||||
|
NULL));
|
||||||
|
|
||||||
clutter_actor_replace_child (actor, iter,
|
clutter_actor_replace_child (actor, iter,
|
||||||
g_object_new (CLUTTER_TYPE_ACTOR,
|
g_object_new (CLUTTER_TYPE_ACTOR,
|
||||||
|
@@ -110,8 +110,8 @@ clean-wrappers:
|
|||||||
.PHONY: wrappers clean-wrappers
|
.PHONY: wrappers clean-wrappers
|
||||||
|
|
||||||
common_ldadd = \
|
common_ldadd = \
|
||||||
$(top_builddir)/clutter/libmutter-clutter-@CLUTTER_API_VERSION@.la \
|
$(top_builddir)/clutter/libmutter-clutter-@LIBMUTTER_API_VERSION@.la \
|
||||||
$(top_builddir)/../cogl/cogl/libmutter-cogl.la
|
$(top_builddir)/../cogl/cogl/libmutter-cogl-@LIBMUTTER_API_VERSION@.la
|
||||||
|
|
||||||
check_PROGRAMS = test-interactive
|
check_PROGRAMS = test-interactive
|
||||||
check_SCRIPTS = wrappers
|
check_SCRIPTS = wrappers
|
||||||
@@ -127,6 +127,7 @@ test_interactive_CPPFLAGS = \
|
|||||||
-DCLUTTER_DISABLE_DEPRECATION_WARNINGS \
|
-DCLUTTER_DISABLE_DEPRECATION_WARNINGS \
|
||||||
-I$(top_srcdir)/../cogl \
|
-I$(top_srcdir)/../cogl \
|
||||||
-I$(top_builddir)/../cogl \
|
-I$(top_builddir)/../cogl \
|
||||||
|
-I$(top_builddir)/../cogl/cogl \
|
||||||
-I$(top_srcdir) \
|
-I$(top_srcdir) \
|
||||||
-I$(top_builddir) \
|
-I$(top_builddir) \
|
||||||
-I$(top_srcdir)/clutter \
|
-I$(top_srcdir)/clutter \
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
common_ldadd = \
|
common_ldadd = \
|
||||||
$(top_builddir)/clutter/libmutter-clutter-@CLUTTER_API_VERSION@.la \
|
$(top_builddir)/clutter/libmutter-clutter-@LIBMUTTER_API_VERSION@.la \
|
||||||
$(top_builddir)/../cogl/cogl/libmutter-cogl.la
|
$(top_builddir)/../cogl/cogl/libmutter-cogl-@LIBMUTTER_API_VERSION@.la
|
||||||
|
|
||||||
|
|
||||||
check_PROGRAMS = \
|
check_PROGRAMS = \
|
||||||
@@ -20,6 +20,7 @@ AM_CPPFLAGS = \
|
|||||||
-DTESTS_DATA_DIR=\""$(top_srcdir)/tests/data/"\" \
|
-DTESTS_DATA_DIR=\""$(top_srcdir)/tests/data/"\" \
|
||||||
-I$(top_srcdir)/../cogl \
|
-I$(top_srcdir)/../cogl \
|
||||||
-I$(top_builddir)/../cogl \
|
-I$(top_builddir)/../cogl \
|
||||||
|
-I$(top_builddir)/../cogl/cogl \
|
||||||
-I$(top_srcdir) \
|
-I$(top_srcdir) \
|
||||||
-I$(top_builddir) \
|
-I$(top_builddir) \
|
||||||
-I$(top_srcdir)/clutter \
|
-I$(top_srcdir)/clutter \
|
||||||
|
@@ -7,7 +7,7 @@ check_PROGRAMS = \
|
|||||||
test-state-mini \
|
test-state-mini \
|
||||||
test-state-pick
|
test-state-pick
|
||||||
|
|
||||||
common_ldadd = $(top_builddir)/clutter/libmutter-clutter-@CLUTTER_API_VERSION@.la
|
common_ldadd = $(top_builddir)/clutter/libmutter-clutter-@LIBMUTTER_API_VERSION@.la
|
||||||
|
|
||||||
LDADD = $(common_ldadd) $(CLUTTER_LIBS) $(LIBM)
|
LDADD = $(common_ldadd) $(CLUTTER_LIBS) $(LIBM)
|
||||||
|
|
||||||
@@ -21,6 +21,7 @@ AM_CPPFLAGS = \
|
|||||||
-DTESTS_DATA_DIR=\""$(top_srcdir)/tests/data/"\" \
|
-DTESTS_DATA_DIR=\""$(top_srcdir)/tests/data/"\" \
|
||||||
-I$(top_srcdir)/../cogl \
|
-I$(top_srcdir)/../cogl \
|
||||||
-I$(top_builddir)/../cogl \
|
-I$(top_builddir)/../cogl \
|
||||||
|
-I$(top_builddir)/../cogl/cogl \
|
||||||
-I$(top_srcdir) \
|
-I$(top_srcdir) \
|
||||||
-I$(top_builddir) \
|
-I$(top_builddir) \
|
||||||
-I$(top_srcdir)/clutter \
|
-I$(top_srcdir)/clutter \
|
||||||
|
@@ -2,8 +2,10 @@
|
|||||||
|
|
||||||
NULL =
|
NULL =
|
||||||
|
|
||||||
|
DISTCLEANFILES =
|
||||||
|
|
||||||
mutterlibdir = $(libdir)/mutter
|
mutterlibdir = $(libdir)/mutter
|
||||||
mutterlib_LTLIBRARIES = libmutter-cogl-gles2.la
|
mutterlib_LTLIBRARIES = libmutter-cogl-gles2-@LIBMUTTER_API_VERSION@.la
|
||||||
|
|
||||||
AM_CPPFLAGS = \
|
AM_CPPFLAGS = \
|
||||||
-I$(top_srcdir) \
|
-I$(top_srcdir) \
|
||||||
@@ -11,8 +13,8 @@ AM_CPPFLAGS = \
|
|||||||
|
|
||||||
AM_CFLAGS = $(COGL_DEP_CFLAGS) $(COGL_EXTRA_CFLAGS) $(MAINTAINER_CFLAGS)
|
AM_CFLAGS = $(COGL_DEP_CFLAGS) $(COGL_EXTRA_CFLAGS) $(MAINTAINER_CFLAGS)
|
||||||
|
|
||||||
libmutter_cogl_gles2_la_SOURCES = cogl-gles2-api.c
|
libmutter_cogl_gles2_@LIBMUTTER_API_VERSION@_la_SOURCES = cogl-gles2-api.c
|
||||||
libmutter_cogl_gles2_la_LDFLAGS = \
|
libmutter_cogl_gles2_@LIBMUTTER_API_VERSION@_la_LDFLAGS = \
|
||||||
-no-undefined \
|
-no-undefined \
|
||||||
-rpath $(mutterlibdir) \
|
-rpath $(mutterlibdir) \
|
||||||
-avoid-version \
|
-avoid-version \
|
||||||
@@ -25,7 +27,9 @@ coglgles2include_HEADERS = \
|
|||||||
GLES2/gl2ext.h \
|
GLES2/gl2ext.h \
|
||||||
GLES2/gl2platform.h
|
GLES2/gl2platform.h
|
||||||
|
|
||||||
pc_files = mutter-cogl-gles2-1.0.pc
|
pc_files = mutter-cogl-gles2-$(LIBMUTTER_API_VERSION).pc
|
||||||
|
|
||||||
pkgconfigdir = $(libdir)/pkgconfig
|
pkgconfigdir = $(libdir)/pkgconfig
|
||||||
pkgconfig_DATA = $(pc_files)
|
pkgconfig_DATA = $(pc_files)
|
||||||
|
|
||||||
|
DISTCLEANFILES += $(pc_files)
|
||||||
|
@@ -2,12 +2,12 @@ prefix=@prefix@
|
|||||||
exec_prefix=@exec_prefix@
|
exec_prefix=@exec_prefix@
|
||||||
libdir=@libdir@/mutter
|
libdir=@libdir@/mutter
|
||||||
includedir=@includedir@/mutter
|
includedir=@includedir@/mutter
|
||||||
apiversion=1.0
|
apiversion=@LIBMUTTER_API_VERSION@
|
||||||
requires=@COGL_PKG_REQUIRES@ mutter-cogl-1.0
|
requires=@COGL_PKG_REQUIRES@ mutter-cogl-@LIBMUTTER_API_VERSION@
|
||||||
|
|
||||||
Name: Cogl
|
Name: Cogl
|
||||||
Description: An object oriented GL/GLES Abstraction/Utility Layer
|
Description: An object oriented GL/GLES Abstraction/Utility Layer
|
||||||
Version: @COGL_1_VERSION@
|
Version: @MUTTER_VERSION@
|
||||||
Libs: -L${libdir} -lmutter-cogl-gles2
|
Libs: -L${libdir} -lmutter-cogl-gles2-@LIBMUTTER_API_VERSION@
|
||||||
Cflags: -I${includedir}/cogl
|
Cflags: -I${includedir}/cogl
|
||||||
Requires: ${requires}
|
Requires: ${requires}
|
@@ -23,13 +23,13 @@ source_h_priv = \
|
|||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
mutterlibdir = $(libdir)/mutter
|
mutterlibdir = $(libdir)/mutter
|
||||||
mutterlib_LTLIBRARIES = libmutter-cogl-pango.la
|
mutterlib_LTLIBRARIES = libmutter-cogl-pango-@LIBMUTTER_API_VERSION@.la
|
||||||
|
|
||||||
libmutter_cogl_pango_la_SOURCES = $(source_c) $(source_h) $(source_h_priv)
|
libmutter_cogl_pango_@LIBMUTTER_API_VERSION@_la_SOURCES = $(source_c) $(source_h) $(source_h_priv)
|
||||||
libmutter_cogl_pango_la_CFLAGS = $(COGL_DEP_CFLAGS) $(COGL_PANGO_DEP_CFLAGS) $(COGL_EXTRA_CFLAGS) $(MAINTAINER_CFLAGS)
|
libmutter_cogl_pango_@LIBMUTTER_API_VERSION@_la_CFLAGS = $(COGL_DEP_CFLAGS) $(COGL_PANGO_DEP_CFLAGS) $(COGL_EXTRA_CFLAGS) $(MAINTAINER_CFLAGS)
|
||||||
libmutter_cogl_pango_la_LIBADD = $(top_builddir)/cogl/libmutter-cogl.la
|
libmutter_cogl_pango_@LIBMUTTER_API_VERSION@_la_LIBADD = $(top_builddir)/cogl/libmutter-cogl-$(LIBMUTTER_API_VERSION).la
|
||||||
libmutter_cogl_pango_la_LIBADD += $(COGL_DEP_LIBS) $(COGL_PANGO_DEP_LIBS) $(COGL_EXTRA_LDFLAGS)
|
libmutter_cogl_pango_@LIBMUTTER_API_VERSION@_la_LIBADD += $(COGL_DEP_LIBS) $(COGL_PANGO_DEP_LIBS) $(COGL_EXTRA_LDFLAGS)
|
||||||
libmutter_cogl_pango_la_LDFLAGS = \
|
libmutter_cogl_pango_@LIBMUTTER_API_VERSION@_la_LDFLAGS = \
|
||||||
-export-dynamic \
|
-export-dynamic \
|
||||||
-rpath $(mutterlibdir) \
|
-rpath $(mutterlibdir) \
|
||||||
-export-symbols-regex "^cogl_pango_.*" \
|
-export-symbols-regex "^cogl_pango_.*" \
|
||||||
@@ -49,7 +49,7 @@ cogl_base_includedir = $(includedir)/mutter
|
|||||||
cogl_pangoheadersdir = $(cogl_base_includedir)/cogl/cogl-pango
|
cogl_pangoheadersdir = $(cogl_base_includedir)/cogl/cogl-pango
|
||||||
cogl_pangoheaders_HEADERS = $(source_h)
|
cogl_pangoheaders_HEADERS = $(source_h)
|
||||||
|
|
||||||
pc_files = mutter-cogl-pango-1.0.pc
|
pc_files = mutter-cogl-pango-$(LIBMUTTER_API_VERSION).pc
|
||||||
|
|
||||||
pkgconfigdir = $(libdir)/pkgconfig
|
pkgconfigdir = $(libdir)/pkgconfig
|
||||||
pkgconfig_DATA = $(pc_files)
|
pkgconfig_DATA = $(pc_files)
|
||||||
@@ -65,23 +65,23 @@ INTROSPECTION_GIRS =
|
|||||||
if HAVE_INTROSPECTION
|
if HAVE_INTROSPECTION
|
||||||
INTROSPECTION_COMPILER_ARGS=--includedir=$(top_builddir)/cogl
|
INTROSPECTION_COMPILER_ARGS=--includedir=$(top_builddir)/cogl
|
||||||
|
|
||||||
CoglPango-1.0.gir: libmutter-cogl-pango.la Makefile
|
CoglPango-@LIBMUTTER_API_VERSION@.gir: libmutter-cogl-pango-$(LIBMUTTER_API_VERSION).la Makefile
|
||||||
|
|
||||||
CoglPango_1_0_gir_NAMESPACE = CoglPango
|
CoglPango_@LIBMUTTER_API_VERSION@_gir_NAMESPACE = CoglPango
|
||||||
CoglPango_1_0_gir_VERSION = 1.0
|
CoglPango_@LIBMUTTER_API_VERSION@_gir_VERSION = @LIBMUTTER_API_VERSION@
|
||||||
CoglPango_1_0_gir_LIBS = $(top_builddir)/cogl/libmutter-cogl.la libmutter-cogl-pango.la
|
CoglPango_@LIBMUTTER_API_VERSION@_gir_LIBS = $(top_builddir)/cogl/libmutter-cogl-$(LIBMUTTER_API_VERSION).la libmutter-cogl-pango-$(LIBMUTTER_API_VERSION).la
|
||||||
CoglPango_1_0_gir_FILES = $(source_h) $(source_c)
|
CoglPango_@LIBMUTTER_API_VERSION@_gir_FILES = $(source_h) $(source_c)
|
||||||
CoglPango_1_0_gir_CFLAGS = $(AM_CPPFLAGS) $(COGL_DEP_CFLAGS) $(COGL_PANGO_DEP_CFLAGS)
|
CoglPango_@LIBMUTTER_API_VERSION@_gir_CFLAGS = $(AM_CPPFLAGS) $(COGL_DEP_CFLAGS) $(COGL_PANGO_DEP_CFLAGS)
|
||||||
CoglPango_1_0_gir_INCLUDES = Pango-1.0 PangoCairo-1.0
|
CoglPango_@LIBMUTTER_API_VERSION@_gir_INCLUDES = Pango-1.0 PangoCairo-1.0
|
||||||
CoglPango_1_0_gir_EXPORT_PACKAGES = mutter-cogl-pango-1.0
|
CoglPango_@LIBMUTTER_API_VERSION@_gir_EXPORT_PACKAGES = mutter-cogl-pango-@LIBMUTTER_API_VERSION@
|
||||||
CoglPango_1_0_gir_SCANNERFLAGS = \
|
CoglPango_@LIBMUTTER_API_VERSION@_gir_SCANNERFLAGS = \
|
||||||
--warn-all \
|
--warn-all \
|
||||||
--identifier-prefix=CoglPango \
|
--identifier-prefix=CoglPango \
|
||||||
--symbol-prefix=cogl_pango \
|
--symbol-prefix=cogl_pango \
|
||||||
--c-include='cogl-pango/cogl-pango.h' \
|
--c-include='cogl-pango/cogl-pango.h' \
|
||||||
--include-uninstalled=$(top_builddir)/cogl/Cogl-1.0.gir
|
--include-uninstalled=$(top_builddir)/cogl/Cogl-@LIBMUTTER_API_VERSION@.gir
|
||||||
|
|
||||||
INTROSPECTION_GIRS += CoglPango-1.0.gir
|
INTROSPECTION_GIRS += CoglPango-@LIBMUTTER_API_VERSION@.gir
|
||||||
|
|
||||||
girdir = $(mutterlibdir)
|
girdir = $(mutterlibdir)
|
||||||
gir_DATA = $(INTROSPECTION_GIRS)
|
gir_DATA = $(INTROSPECTION_GIRS)
|
||||||
|
@@ -2,12 +2,12 @@ prefix=@prefix@
|
|||||||
exec_prefix=@exec_prefix@
|
exec_prefix=@exec_prefix@
|
||||||
libdir=@libdir@/mutter
|
libdir=@libdir@/mutter
|
||||||
includedir=@includedir@/mutter
|
includedir=@includedir@/mutter
|
||||||
apiversion=1.0
|
apiversion=@LIBMUTTER_API_VERSION@
|
||||||
requires=@COGL_PKG_REQUIRES@ mutter-cogl-1.0
|
requires=@COGL_PKG_REQUIRES@ mutter-cogl-@LIBMUTTER_API_VERSION@
|
||||||
|
|
||||||
Name: Cogl
|
Name: Cogl
|
||||||
Description: An object oriented GL/GLES Abstraction/Utility Layer
|
Description: An object oriented GL/GLES Abstraction/Utility Layer
|
||||||
Version: @COGL_1_VERSION@
|
Version: @MUTTER_VERSION@
|
||||||
Libs: -L${libdir} -lmutter-cogl-pango
|
Libs: -L${libdir} -lmutter-cogl-pango-@LIBMUTTER_API_VERSION@
|
||||||
Cflags: -I${includedir}/cogl
|
Cflags: -I${includedir}/cogl
|
||||||
Requires: ${requires}
|
Requires: ${requires}
|
@@ -65,14 +65,14 @@ glib_enum_headers = $(source_1_x_h)
|
|||||||
include $(top_srcdir)/build/autotools/Makefile.am.enums
|
include $(top_srcdir)/build/autotools/Makefile.am.enums
|
||||||
|
|
||||||
mutterlibdir = $(libdir)/mutter
|
mutterlibdir = $(libdir)/mutter
|
||||||
mutterlib_LTLIBRARIES = libmutter-cogl-path.la
|
mutterlib_LTLIBRARIES = libmutter-cogl-path-@LIBMUTTER_API_VERSION@.la
|
||||||
|
|
||||||
libmutter_cogl_path_la_SOURCES = $(source_c) $(source_h)
|
libmutter_cogl_path_@LIBMUTTER_API_VERSION@_la_SOURCES = $(source_c) $(source_h)
|
||||||
nodist_libmutter_cogl_path_la_SOURCES = $(BUILT_SOURCES)
|
nodist_libmutter_cogl_path_@LIBMUTTER_API_VERSION@_la_SOURCES = $(BUILT_SOURCES)
|
||||||
libmutter_cogl_path_la_CFLAGS = $(COGL_DEP_CFLAGS) $(COGL_EXTRA_CFLAGS) $(MAINTAINER_CFLAGS)
|
libmutter_cogl_path_@LIBMUTTER_API_VERSION@_la_CFLAGS = $(COGL_DEP_CFLAGS) $(COGL_EXTRA_CFLAGS) $(MAINTAINER_CFLAGS)
|
||||||
libmutter_cogl_path_la_LIBADD = $(top_builddir)/cogl/libmutter-cogl.la
|
libmutter_cogl_path_@LIBMUTTER_API_VERSION@_la_LIBADD = $(top_builddir)/cogl/libmutter-cogl-$(LIBMUTTER_API_VERSION).la
|
||||||
libmutter_cogl_path_la_LIBADD += $(COGL_DEP_LIBS) $(COGL_EXTRA_LDFLAGS)
|
libmutter_cogl_path_@LIBMUTTER_API_VERSION@_la_LIBADD += $(COGL_DEP_LIBS) $(COGL_EXTRA_LDFLAGS)
|
||||||
libmutter_cogl_path_la_LDFLAGS = \
|
libmutter_cogl_path_@LIBMUTTER_API_VERSION@_la_LDFLAGS = \
|
||||||
-export-dynamic \
|
-export-dynamic \
|
||||||
-export-symbols-regex "^(cogl|cogl2)_(framebuffer|path|is|clip|[sg]et)_.*" \
|
-export-symbols-regex "^(cogl|cogl2)_(framebuffer|path|is|clip|[sg]et)_.*" \
|
||||||
-no-undefined \
|
-no-undefined \
|
||||||
@@ -94,7 +94,7 @@ cogl_pathheadersdir = $(cogl_base_includedir)/cogl/cogl-path
|
|||||||
cogl_pathheaders_HEADERS = $(source_h)
|
cogl_pathheaders_HEADERS = $(source_h)
|
||||||
nodist_cogl_pathheaders_HEADERS = cogl-path-enum-types.h
|
nodist_cogl_pathheaders_HEADERS = cogl-path-enum-types.h
|
||||||
|
|
||||||
pc_files = mutter-cogl-path-1.0.pc
|
pc_files = mutter-cogl-path-$(LIBMUTTER_API_VERSION).pc
|
||||||
|
|
||||||
pkgconfigdir = $(libdir)/pkgconfig
|
pkgconfigdir = $(libdir)/pkgconfig
|
||||||
pkgconfig_DATA = $(pc_files)
|
pkgconfig_DATA = $(pc_files)
|
||||||
|
@@ -2,12 +2,12 @@ prefix=@prefix@
|
|||||||
exec_prefix=@exec_prefix@
|
exec_prefix=@exec_prefix@
|
||||||
libdir=@libdir@/mutter
|
libdir=@libdir@/mutter
|
||||||
includedir=@includedir@/mutter
|
includedir=@includedir@/mutter
|
||||||
apiversion=1.0
|
apiversion=@LIBMUTTER_API_VERSION@
|
||||||
requires=@COGL_PKG_REQUIRES@ mutter-cogl-1.0
|
requires=@COGL_PKG_REQUIRES@ mutter-cogl-@LIBMUTTER_API_VERSION@
|
||||||
|
|
||||||
Name: Cogl
|
Name: Cogl
|
||||||
Description: A 2D path drawing library for Cogl
|
Description: A 2D path drawing library for Cogl
|
||||||
Version: @COGL_1_VERSION@
|
Version: @MUTTER_VERSION@
|
||||||
Libs: -L${libdir} -lmutter-cogl-path
|
Libs: -L${libdir} -lmutter-cogl-path-@LIBMUTTER_API_VERSION@
|
||||||
Cflags: -I${includedir}/cogl
|
Cflags: -I${includedir}/cogl
|
||||||
Requires: ${requires}
|
Requires: ${requires}
|
@@ -41,7 +41,7 @@ BUILT_SOURCES += cogl-defines.h cogl-egl-defines.h cogl-gl-header.h
|
|||||||
DISTCLEANFILES += cogl-defines.h cogl-egl-defines.h cogl-gl-header.h
|
DISTCLEANFILES += cogl-defines.h cogl-egl-defines.h cogl-gl-header.h
|
||||||
EXTRA_DIST += cogl-defines.h.in cogl-egl-defines.h.in cogl-gl-header.h.in
|
EXTRA_DIST += cogl-defines.h.in cogl-egl-defines.h.in cogl-gl-header.h.in
|
||||||
|
|
||||||
pc_files = mutter-cogl-1.0.pc
|
pc_files = mutter-cogl-$(LIBMUTTER_API_VERSION).pc
|
||||||
|
|
||||||
pkgconfigdir = $(libdir)/pkgconfig
|
pkgconfigdir = $(libdir)/pkgconfig
|
||||||
pkgconfig_DATA = $(pc_files)
|
pkgconfig_DATA = $(pc_files)
|
||||||
@@ -439,23 +439,23 @@ cogl_sources_c += \
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
mutterlibdir = $(libdir)/mutter
|
mutterlibdir = $(libdir)/mutter
|
||||||
mutterlib_LTLIBRARIES = libmutter-cogl.la
|
mutterlib_LTLIBRARIES = libmutter-cogl-@LIBMUTTER_API_VERSION@.la
|
||||||
|
|
||||||
libmutter_cogl_la_LIBADD = $(LIBM) $(COGL_DEP_LIBS) $(COGL_EXTRA_LDFLAGS)
|
libmutter_cogl_@LIBMUTTER_API_VERSION@_la_LIBADD = $(LIBM) $(COGL_DEP_LIBS) $(COGL_EXTRA_LDFLAGS)
|
||||||
if UNIT_TESTS
|
if UNIT_TESTS
|
||||||
libmutter_cogl_la_LIBADD += $(top_builddir)/test-fixtures/libtest-fixtures.la
|
libmutter_cogl_@LIBMUTTER_API_VERSION@_la_LIBADD += $(top_builddir)/test-fixtures/libtest-fixtures.la
|
||||||
endif
|
endif
|
||||||
# XXX: The aim is to eventually get rid of all private API exports
|
# XXX: The aim is to eventually get rid of all private API exports
|
||||||
# for cogl-pango.
|
# for cogl-pango.
|
||||||
libmutter_cogl_la_LDFLAGS = \
|
libmutter_cogl_@LIBMUTTER_API_VERSION@_la_LDFLAGS = \
|
||||||
-no-undefined \
|
-no-undefined \
|
||||||
-avoid-version \
|
-avoid-version \
|
||||||
-export-dynamic \
|
-export-dynamic \
|
||||||
-rpath $(mutterlibdir) \
|
-rpath $(mutterlibdir) \
|
||||||
-export-symbols-regex "^(cogl|_cogl_debug_flags|_cogl_atlas_new|_cogl_atlas_add_reorganize_callback|_cogl_atlas_reserve_space|_cogl_callback|_cogl_util_get_eye_planes_for_screen_poly|_cogl_atlas_texture_remove_reorganize_callback|_cogl_atlas_texture_add_reorganize_callback|_cogl_texture_get_format|_cogl_texture_foreach_sub_texture_in_region|_cogl_profile_trace_message|_cogl_context_get_default|_cogl_framebuffer_get_stencil_bits|_cogl_clip_stack_push_rectangle|_cogl_framebuffer_get_modelview_stack|_cogl_object_default_unref|_cogl_pipeline_foreach_layer_internal|_cogl_clip_stack_push_primitive|_cogl_buffer_unmap_for_fill_or_fallback|_cogl_framebuffer_draw_primitive|_cogl_debug_instances|_cogl_framebuffer_get_projection_stack|_cogl_pipeline_layer_get_texture|_cogl_buffer_map_for_fill_or_fallback|_cogl_texture_can_hardware_repeat|_cogl_pipeline_prune_to_n_layers|_cogl_primitive_draw|test_|unit_test_|_cogl_winsys_glx_get_vtable|_cogl_winsys_egl_xlib_get_vtable|_cogl_winsys_egl_get_vtable|_cogl_closure_disconnect|_cogl_onscreen_notify_complete|_cogl_onscreen_notify_frame_sync|_cogl_winsys_egl_renderer_connect_common|_cogl_winsys_error_quark|_cogl_set_error|_cogl_poll_renderer_add_fd|_cogl_poll_renderer_add_idle|_cogl_framebuffer_winsys_update_size|_cogl_winsys_egl_make_current).*"
|
-export-symbols-regex "^(cogl|_cogl_debug_flags|_cogl_atlas_new|_cogl_atlas_add_reorganize_callback|_cogl_atlas_reserve_space|_cogl_callback|_cogl_util_get_eye_planes_for_screen_poly|_cogl_atlas_texture_remove_reorganize_callback|_cogl_atlas_texture_add_reorganize_callback|_cogl_texture_get_format|_cogl_texture_foreach_sub_texture_in_region|_cogl_texture_set_region|_cogl_profile_trace_message|_cogl_context_get_default|_cogl_framebuffer_get_stencil_bits|_cogl_clip_stack_push_rectangle|_cogl_framebuffer_get_modelview_stack|_cogl_object_default_unref|_cogl_pipeline_foreach_layer_internal|_cogl_clip_stack_push_primitive|_cogl_buffer_unmap_for_fill_or_fallback|_cogl_framebuffer_draw_primitive|_cogl_debug_instances|_cogl_framebuffer_get_projection_stack|_cogl_pipeline_layer_get_texture|_cogl_buffer_map_for_fill_or_fallback|_cogl_texture_can_hardware_repeat|_cogl_pipeline_prune_to_n_layers|_cogl_primitive_draw|test_|unit_test_|_cogl_winsys_glx_get_vtable|_cogl_winsys_egl_xlib_get_vtable|_cogl_winsys_egl_get_vtable|_cogl_closure_disconnect|_cogl_onscreen_notify_complete|_cogl_onscreen_notify_frame_sync|_cogl_winsys_egl_renderer_connect_common|_cogl_winsys_error_quark|_cogl_set_error|_cogl_poll_renderer_add_fd|_cogl_poll_renderer_add_idle|_cogl_framebuffer_winsys_update_size|_cogl_winsys_egl_make_current|_cogl_pixel_format_get_bytes_per_pixel).*"
|
||||||
|
|
||||||
libmutter_cogl_la_SOURCES = $(cogl_sources_c)
|
libmutter_cogl_@LIBMUTTER_API_VERSION@_la_SOURCES = $(cogl_sources_c)
|
||||||
nodist_libmutter_cogl_la_SOURCES = $(BUILT_SOURCES)
|
nodist_libmutter_cogl_@LIBMUTTER_API_VERSION@_la_SOURCES = $(BUILT_SOURCES)
|
||||||
|
|
||||||
# Cogl installed headers
|
# Cogl installed headers
|
||||||
cogl_headers = \
|
cogl_headers = \
|
||||||
@@ -483,22 +483,22 @@ EXTRA_DIST += \
|
|||||||
INTROSPECTION_GIRS =
|
INTROSPECTION_GIRS =
|
||||||
|
|
||||||
if HAVE_INTROSPECTION
|
if HAVE_INTROSPECTION
|
||||||
Cogl-1.0.gir: libmutter-cogl.la Makefile
|
Cogl-@LIBMUTTER_API_VERSION@.gir: libmutter-cogl-$(LIBMUTTER_API_VERSION).la Makefile
|
||||||
|
|
||||||
Cogl_1_0_gir_NAMESPACE = Cogl
|
Cogl_@LIBMUTTER_API_VERSION@_gir_NAMESPACE = Cogl
|
||||||
Cogl_1_0_gir_VERSION = 1.0
|
Cogl_@LIBMUTTER_API_VERSION@_gir_VERSION = $(LIBMUTTER_API_VERSION)
|
||||||
Cogl_1_0_gir_LIBS = libmutter-cogl.la
|
Cogl_@LIBMUTTER_API_VERSION@_gir_LIBS = libmutter-cogl-$(LIBMUTTER_API_VERSION).la
|
||||||
if UNIT_TESTS
|
if UNIT_TESTS
|
||||||
Cogl_1_0_gir_LIBS += $(top_builddir)/test-fixtures/libtest-fixtures.la
|
Cogl_@LIBMUTTER_API_VERSION@_gir_LIBS += $(top_builddir)/test-fixtures/libtest-fixtures.la
|
||||||
endif
|
endif
|
||||||
Cogl_1_0_gir_FILES = $(cogl_1_public_h)
|
Cogl_@LIBMUTTER_API_VERSION@_gir_FILES = $(cogl_1_public_h)
|
||||||
|
|
||||||
Cogl_1_0_gir_CFLAGS = $(AM_CPPFLAGS) $(COGL_DEP_CFLAGS) -UCOGL_COMPILATION -D__COGL_H_INSIDE__ -D__COGL_XLIB_H_INSIDE__ -D__COGL_EGL_H_INSIDE__ -D__COGL_GLX_H_INSIDE__ -DCOGL_GIR_SCANNING
|
Cogl_@LIBMUTTER_API_VERSION@_gir_CFLAGS = $(AM_CPPFLAGS) $(COGL_DEP_CFLAGS) -UCOGL_COMPILATION -D__COGL_H_INSIDE__ -D__COGL_XLIB_H_INSIDE__ -D__COGL_EGL_H_INSIDE__ -D__COGL_GLX_H_INSIDE__ -DCOGL_GIR_SCANNING
|
||||||
Cogl_1_0_gir_INCLUDES = GL-1.0 GObject-2.0
|
Cogl_@LIBMUTTER_API_VERSION@_gir_INCLUDES = GL-1.0 GObject-2.0
|
||||||
Cogl_1_0_gir_EXPORT_PACKAGES = mutter-cogl-1.0
|
Cogl_@LIBMUTTER_API_VERSION@_gir_EXPORT_PACKAGES = mutter-cogl-@LIBMUTTER_API_VERSION@
|
||||||
Cogl_1_0_gir_SCANNERFLAGS = --warn-all --c-include='cogl/cogl.h'
|
Cogl_@LIBMUTTER_API_VERSION@_gir_SCANNERFLAGS = --warn-all --c-include='cogl/cogl.h'
|
||||||
|
|
||||||
INTROSPECTION_GIRS += Cogl-1.0.gir
|
INTROSPECTION_GIRS += Cogl-@LIBMUTTER_API_VERSION@.gir
|
||||||
|
|
||||||
girdir = $(mutterlibdir)
|
girdir = $(mutterlibdir)
|
||||||
gir_DATA = $(INTROSPECTION_GIRS)
|
gir_DATA = $(INTROSPECTION_GIRS)
|
||||||
|
@@ -81,6 +81,19 @@
|
|||||||
#define GL_PURGED_CONTEXT_RESET_NV 0x92BB
|
#define GL_PURGED_CONTEXT_RESET_NV 0x92BB
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* These aren't defined in the GLES2 headers */
|
||||||
|
#ifndef GL_GUILTY_CONTEXT_RESET_ARB
|
||||||
|
#define GL_GUILTY_CONTEXT_RESET_ARB 0x8253
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef GL_INNOCENT_CONTEXT_RESET_ARB
|
||||||
|
#define GL_INNOCENT_CONTEXT_RESET_ARB 0x8254
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef GL_UNKNOWN_CONTEXT_RESET_ARB
|
||||||
|
#define GL_UNKNOWN_CONTEXT_RESET_ARB 0x8255
|
||||||
|
#endif
|
||||||
|
|
||||||
static void _cogl_context_free (CoglContext *context);
|
static void _cogl_context_free (CoglContext *context);
|
||||||
|
|
||||||
COGL_OBJECT_DEFINE (Context, context);
|
COGL_OBJECT_DEFINE (Context, context);
|
||||||
|
@@ -262,6 +262,7 @@ typedef enum _CoglFeatureID
|
|||||||
COGL_FEATURE_ID_PER_VERTEX_POINT_SIZE,
|
COGL_FEATURE_ID_PER_VERTEX_POINT_SIZE,
|
||||||
COGL_FEATURE_ID_TEXTURE_RG,
|
COGL_FEATURE_ID_TEXTURE_RG,
|
||||||
COGL_FEATURE_ID_BUFFER_AGE,
|
COGL_FEATURE_ID_BUFFER_AGE,
|
||||||
|
COGL_FEATURE_ID_TEXTURE_EGL_IMAGE_EXTERNAL,
|
||||||
|
|
||||||
/*< private >*/
|
/*< private >*/
|
||||||
_COGL_N_FEATURE_IDS /*< skip >*/
|
_COGL_N_FEATURE_IDS /*< skip >*/
|
||||||
|
@@ -55,6 +55,13 @@ struct _CoglDriverVtable
|
|||||||
GLenum *out_glintformat,
|
GLenum *out_glintformat,
|
||||||
GLenum *out_glformat,
|
GLenum *out_glformat,
|
||||||
GLenum *out_gltype);
|
GLenum *out_gltype);
|
||||||
|
CoglPixelFormat
|
||||||
|
(* pixel_format_to_gl_with_target) (CoglContext *context,
|
||||||
|
CoglPixelFormat format,
|
||||||
|
CoglPixelFormat target_format,
|
||||||
|
GLenum *out_glintformat,
|
||||||
|
GLenum *out_glformat,
|
||||||
|
GLenum *out_gltype);
|
||||||
|
|
||||||
CoglBool
|
CoglBool
|
||||||
(* update_features) (CoglContext *context,
|
(* update_features) (CoglContext *context,
|
||||||
|
@@ -193,6 +193,11 @@ struct _CoglFramebuffer
|
|||||||
CoglFramebufferBits bits;
|
CoglFramebufferBits bits;
|
||||||
|
|
||||||
int samples_per_pixel;
|
int samples_per_pixel;
|
||||||
|
|
||||||
|
/* Whether the depth buffer was enabled for this framebuffer,
|
||||||
|
* usually means it needs to be cleared before being reused next.
|
||||||
|
*/
|
||||||
|
CoglBool depth_buffer_clear_needed;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
@@ -117,6 +117,7 @@ _cogl_framebuffer_init (CoglFramebuffer *framebuffer,
|
|||||||
framebuffer->viewport_age_for_scissor_workaround = -1;
|
framebuffer->viewport_age_for_scissor_workaround = -1;
|
||||||
framebuffer->dither_enabled = TRUE;
|
framebuffer->dither_enabled = TRUE;
|
||||||
framebuffer->depth_writing_enabled = TRUE;
|
framebuffer->depth_writing_enabled = TRUE;
|
||||||
|
framebuffer->depth_buffer_clear_needed = TRUE;
|
||||||
|
|
||||||
framebuffer->modelview_stack = cogl_matrix_stack_new (ctx);
|
framebuffer->modelview_stack = cogl_matrix_stack_new (ctx);
|
||||||
framebuffer->projection_stack = cogl_matrix_stack_new (ctx);
|
framebuffer->projection_stack = cogl_matrix_stack_new (ctx);
|
||||||
@@ -268,6 +269,13 @@ cogl_framebuffer_clear4f (CoglFramebuffer *framebuffer,
|
|||||||
int scissor_y1;
|
int scissor_y1;
|
||||||
CoglBool saved_viewport_scissor_workaround;
|
CoglBool saved_viewport_scissor_workaround;
|
||||||
|
|
||||||
|
if (!framebuffer->depth_buffer_clear_needed &&
|
||||||
|
(buffers & COGL_BUFFER_BIT_DEPTH))
|
||||||
|
buffers &= ~(COGL_BUFFER_BIT_DEPTH);
|
||||||
|
|
||||||
|
if (buffers == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
_cogl_clip_stack_get_bounds (clip_stack,
|
_cogl_clip_stack_get_bounds (clip_stack,
|
||||||
&scissor_x0, &scissor_y0,
|
&scissor_x0, &scissor_y0,
|
||||||
&scissor_x1, &scissor_y1);
|
&scissor_x1, &scissor_y1);
|
||||||
@@ -415,6 +423,9 @@ cleared:
|
|||||||
_cogl_framebuffer_mark_mid_scene (framebuffer);
|
_cogl_framebuffer_mark_mid_scene (framebuffer);
|
||||||
_cogl_framebuffer_mark_clear_clip_dirty (framebuffer);
|
_cogl_framebuffer_mark_clear_clip_dirty (framebuffer);
|
||||||
|
|
||||||
|
if (buffers & COGL_BUFFER_BIT_DEPTH)
|
||||||
|
framebuffer->depth_buffer_clear_needed = FALSE;
|
||||||
|
|
||||||
if (buffers & COGL_BUFFER_BIT_COLOR && buffers & COGL_BUFFER_BIT_DEPTH)
|
if (buffers & COGL_BUFFER_BIT_COLOR && buffers & COGL_BUFFER_BIT_DEPTH)
|
||||||
{
|
{
|
||||||
/* For our fast-path for reading back a single pixel of simple
|
/* For our fast-path for reading back a single pixel of simple
|
||||||
|
@@ -152,6 +152,7 @@ typedef long GLsizeiptr;
|
|||||||
#define GL_POLYGON_OFFSET_FILL 0x8037
|
#define GL_POLYGON_OFFSET_FILL 0x8037
|
||||||
#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E
|
#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E
|
||||||
#define GL_SAMPLE_COVERAGE 0x80A0
|
#define GL_SAMPLE_COVERAGE 0x80A0
|
||||||
|
#define GL_TEXTURE_EXTERNAL_OES 0x8D65
|
||||||
|
|
||||||
/* ErrorCode */
|
/* ErrorCode */
|
||||||
#define GL_NO_ERROR 0
|
#define GL_NO_ERROR 0
|
||||||
|
@@ -111,6 +111,14 @@ _cogl_glsl_shader_set_source_with_boilerplate (CoglContext *ctx,
|
|||||||
lengths[count++] = sizeof (texture_3d_extension) - 1;
|
lengths[count++] = sizeof (texture_3d_extension) - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (cogl_has_feature (ctx, COGL_FEATURE_ID_TEXTURE_EGL_IMAGE_EXTERNAL))
|
||||||
|
{
|
||||||
|
static const char texture_3d_extension[] =
|
||||||
|
"#extension GL_OES_EGL_image_external : require\n";
|
||||||
|
strings[count] = texture_3d_extension;
|
||||||
|
lengths[count++] = sizeof (texture_3d_extension) - 1;
|
||||||
|
}
|
||||||
|
|
||||||
if (shader_gl_type == GL_VERTEX_SHADER)
|
if (shader_gl_type == GL_VERTEX_SHADER)
|
||||||
{
|
{
|
||||||
strings[count] = vertex_boilerplate;
|
strings[count] = vertex_boilerplate;
|
||||||
|
@@ -51,6 +51,9 @@ typedef struct _CoglGLXDisplay
|
|||||||
|
|
||||||
CoglBool found_fbconfig;
|
CoglBool found_fbconfig;
|
||||||
CoglBool fbconfig_has_rgba_visual;
|
CoglBool fbconfig_has_rgba_visual;
|
||||||
|
CoglBool is_direct;
|
||||||
|
CoglBool have_vblank_counter;
|
||||||
|
CoglBool can_vblank_wait;
|
||||||
GLXFBConfig fbconfig;
|
GLXFBConfig fbconfig;
|
||||||
|
|
||||||
/* Single context for all wins */
|
/* Single context for all wins */
|
||||||
|
@@ -43,8 +43,6 @@ typedef struct _CoglGLXRenderer
|
|||||||
int glx_error_base;
|
int glx_error_base;
|
||||||
int glx_event_base;
|
int glx_event_base;
|
||||||
|
|
||||||
CoglBool is_direct;
|
|
||||||
|
|
||||||
/* Vblank stuff */
|
/* Vblank stuff */
|
||||||
int dri_fd;
|
int dri_fd;
|
||||||
|
|
||||||
|
@@ -169,7 +169,8 @@ check_qualcomm_vendor (const CoglGpuInfoStrings *strings)
|
|||||||
static CoglBool
|
static CoglBool
|
||||||
check_nvidia_vendor (const CoglGpuInfoStrings *strings)
|
check_nvidia_vendor (const CoglGpuInfoStrings *strings)
|
||||||
{
|
{
|
||||||
if (strcmp (strings->vendor_string, "NVIDIA") != 0)
|
if (strcmp (strings->vendor_string, "NVIDIA") != 0 &&
|
||||||
|
strcmp (strings->vendor_string, "NVIDIA Corporation") != 0)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@@ -1102,7 +1102,7 @@ upload_vertices (CoglJournal *journal,
|
|||||||
|
|
||||||
attribute_buffer = create_attribute_buffer (journal, needed_vbo_len * 4);
|
attribute_buffer = create_attribute_buffer (journal, needed_vbo_len * 4);
|
||||||
buffer = COGL_BUFFER (attribute_buffer);
|
buffer = COGL_BUFFER (attribute_buffer);
|
||||||
cogl_buffer_set_update_hint (buffer, COGL_BUFFER_UPDATE_HINT_STATIC);
|
cogl_buffer_set_update_hint (buffer, COGL_BUFFER_UPDATE_HINT_DYNAMIC);
|
||||||
|
|
||||||
vout = _cogl_buffer_map_range_for_fill_or_fallback (buffer,
|
vout = _cogl_buffer_map_range_for_fill_or_fallback (buffer,
|
||||||
0, /* offset */
|
0, /* offset */
|
||||||
|
@@ -42,7 +42,7 @@
|
|||||||
#include <cogl/winsys/cogl-winsys-egl-private.h>
|
#include <cogl/winsys/cogl-winsys-egl-private.h>
|
||||||
#include <cogl/winsys/cogl-winsys-private.h>
|
#include <cogl/winsys/cogl-winsys-private.h>
|
||||||
|
|
||||||
void cogl_renderer_set_custom_winsys (CoglRenderer *renderer,
|
void cogl_renderer_set_custom_winsys (CoglRenderer *renderer,
|
||||||
CoglWinsysVtableGetter winsys_vtable_getter);
|
CoglCustomWinsysVtableGetter winsys_vtable_getter);
|
||||||
|
|
||||||
#endif /* __COGL_MUTTER_H___ */
|
#endif /* __COGL_MUTTER_H___ */
|
||||||
|
@@ -44,7 +44,7 @@ typedef struct _CoglObject CoglObject;
|
|||||||
/**
|
/**
|
||||||
* CoglObject: (ref-func cogl_object_ref) (unref-func cogl_object_unref)
|
* CoglObject: (ref-func cogl_object_ref) (unref-func cogl_object_unref)
|
||||||
* (set-value-func cogl_object_value_set_object)
|
* (set-value-func cogl_object_value_set_object)
|
||||||
* (get-value-func cogl_object_get_object)
|
* (get-value-func cogl_object_value_get_object)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -62,7 +62,7 @@ COGL_BEGIN_DECLS
|
|||||||
/**
|
/**
|
||||||
* CoglPrimitive: (ref-func cogl_object_ref) (unref-func cogl_object_unref)
|
* CoglPrimitive: (ref-func cogl_object_ref) (unref-func cogl_object_unref)
|
||||||
* (set-value-func cogl_object_value_set_object)
|
* (set-value-func cogl_object_value_set_object)
|
||||||
* (get-value-func cogl_object_get_object)
|
* (get-value-func cogl_object_value_get_object)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -77,6 +77,9 @@ typedef enum
|
|||||||
COGL_PRIVATE_FEATURE_GL_PROGRAMMABLE,
|
COGL_PRIVATE_FEATURE_GL_PROGRAMMABLE,
|
||||||
COGL_PRIVATE_FEATURE_GL_EMBEDDED,
|
COGL_PRIVATE_FEATURE_GL_EMBEDDED,
|
||||||
COGL_PRIVATE_FEATURE_GL_WEB,
|
COGL_PRIVATE_FEATURE_GL_WEB,
|
||||||
|
/* This is currently only implemented for GLX, but isn't actually
|
||||||
|
* that winsys dependent */
|
||||||
|
COGL_PRIVATE_FEATURE_THREADED_SWAP_WAIT,
|
||||||
|
|
||||||
COGL_N_PRIVATE_FEATURES
|
COGL_N_PRIVATE_FEATURES
|
||||||
} CoglPrivateFeature;
|
} CoglPrivateFeature;
|
||||||
|
@@ -39,12 +39,13 @@
|
|||||||
#include "cogl-texture-driver.h"
|
#include "cogl-texture-driver.h"
|
||||||
#include "cogl-context.h"
|
#include "cogl-context.h"
|
||||||
#include "cogl-closure-list-private.h"
|
#include "cogl-closure-list-private.h"
|
||||||
#include "cogl-mutter.h"
|
|
||||||
|
|
||||||
#ifdef COGL_HAS_XLIB_SUPPORT
|
#ifdef COGL_HAS_XLIB_SUPPORT
|
||||||
#include <X11/Xlib.h>
|
#include <X11/Xlib.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
typedef const CoglWinsysVtable *(*CoglCustomWinsysVtableGetter) (CoglRenderer *renderer);
|
||||||
|
|
||||||
struct _CoglRenderer
|
struct _CoglRenderer
|
||||||
{
|
{
|
||||||
CoglObject _parent;
|
CoglObject _parent;
|
||||||
@@ -53,7 +54,7 @@ struct _CoglRenderer
|
|||||||
const CoglDriverVtable *driver_vtable;
|
const CoglDriverVtable *driver_vtable;
|
||||||
const CoglTextureDriver *texture_driver;
|
const CoglTextureDriver *texture_driver;
|
||||||
const CoglWinsysVtable *winsys_vtable;
|
const CoglWinsysVtable *winsys_vtable;
|
||||||
CoglWinsysVtableGetter custom_winsys_vtable_getter;
|
CoglCustomWinsysVtableGetter custom_winsys_vtable_getter;
|
||||||
CoglWinsysID winsys_id_override;
|
CoglWinsysID winsys_id_override;
|
||||||
GList *constraints;
|
GList *constraints;
|
||||||
|
|
||||||
@@ -69,6 +70,7 @@ struct _CoglRenderer
|
|||||||
Display *foreign_xdpy;
|
Display *foreign_xdpy;
|
||||||
CoglBool xlib_enable_event_retrieval;
|
CoglBool xlib_enable_event_retrieval;
|
||||||
CoglBool xlib_want_reset_on_video_memory_purge;
|
CoglBool xlib_want_reset_on_video_memory_purge;
|
||||||
|
CoglBool xlib_enable_threaded_swap_wait;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
CoglDriver driver;
|
CoglDriver driver;
|
||||||
|
@@ -285,6 +285,17 @@ cogl_xlib_renderer_request_reset_on_video_memory_purge (CoglRenderer *renderer,
|
|||||||
|
|
||||||
renderer->xlib_want_reset_on_video_memory_purge = enable;
|
renderer->xlib_want_reset_on_video_memory_purge = enable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
cogl_xlib_renderer_set_threaded_swap_wait_enabled (CoglRenderer *renderer,
|
||||||
|
CoglBool enable)
|
||||||
|
{
|
||||||
|
_COGL_RETURN_IF_FAIL (cogl_is_renderer (renderer));
|
||||||
|
/* NB: Renderers are considered immutable once connected */
|
||||||
|
_COGL_RETURN_IF_FAIL (!renderer->connected);
|
||||||
|
|
||||||
|
renderer->xlib_enable_threaded_swap_wait = enable;
|
||||||
|
}
|
||||||
#endif /* COGL_HAS_XLIB_SUPPORT */
|
#endif /* COGL_HAS_XLIB_SUPPORT */
|
||||||
|
|
||||||
CoglBool
|
CoglBool
|
||||||
@@ -554,8 +565,8 @@ _cogl_renderer_choose_driver (CoglRenderer *renderer,
|
|||||||
/* Final connection API */
|
/* Final connection API */
|
||||||
|
|
||||||
void
|
void
|
||||||
cogl_renderer_set_custom_winsys (CoglRenderer *renderer,
|
cogl_renderer_set_custom_winsys (CoglRenderer *renderer,
|
||||||
CoglWinsysVtableGetter winsys_vtable_getter)
|
CoglCustomWinsysVtableGetter winsys_vtable_getter)
|
||||||
{
|
{
|
||||||
renderer->custom_winsys_vtable_getter = winsys_vtable_getter;
|
renderer->custom_winsys_vtable_getter = winsys_vtable_getter;
|
||||||
}
|
}
|
||||||
@@ -564,10 +575,11 @@ static CoglBool
|
|||||||
connect_custom_winsys (CoglRenderer *renderer,
|
connect_custom_winsys (CoglRenderer *renderer,
|
||||||
CoglError **error)
|
CoglError **error)
|
||||||
{
|
{
|
||||||
const CoglWinsysVtable *winsys = renderer->custom_winsys_vtable_getter();
|
const CoglWinsysVtable *winsys;
|
||||||
CoglError *tmp_error = NULL;
|
CoglError *tmp_error = NULL;
|
||||||
GString *error_message;
|
GString *error_message;
|
||||||
|
|
||||||
|
winsys = renderer->custom_winsys_vtable_getter (renderer);
|
||||||
renderer->winsys_vtable = winsys;
|
renderer->winsys_vtable = winsys;
|
||||||
|
|
||||||
error_message = g_string_new ("");
|
error_message = g_string_new ("");
|
||||||
|
@@ -36,10 +36,6 @@
|
|||||||
#include "cogl-texture-private.h"
|
#include "cogl-texture-private.h"
|
||||||
#include "cogl-texture-2d.h"
|
#include "cogl-texture-2d.h"
|
||||||
|
|
||||||
#ifdef COGL_HAS_EGL_SUPPORT
|
|
||||||
#include "cogl-egl-defines.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct _CoglTexture2D
|
struct _CoglTexture2D
|
||||||
{
|
{
|
||||||
CoglTexture _parent;
|
CoglTexture _parent;
|
||||||
@@ -59,30 +55,23 @@ struct _CoglTexture2D
|
|||||||
GLenum gl_internal_format;
|
GLenum gl_internal_format;
|
||||||
/* The texture object number */
|
/* The texture object number */
|
||||||
GLuint gl_texture;
|
GLuint gl_texture;
|
||||||
|
GLenum gl_target;
|
||||||
GLenum gl_legacy_texobj_min_filter;
|
GLenum gl_legacy_texobj_min_filter;
|
||||||
GLenum gl_legacy_texobj_mag_filter;
|
GLenum gl_legacy_texobj_mag_filter;
|
||||||
GLint gl_legacy_texobj_wrap_mode_s;
|
GLint gl_legacy_texobj_wrap_mode_s;
|
||||||
GLint gl_legacy_texobj_wrap_mode_t;
|
GLint gl_legacy_texobj_wrap_mode_t;
|
||||||
CoglTexturePixel first_pixel;
|
CoglTexturePixel first_pixel;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
void *user_data;
|
||||||
|
GDestroyNotify destroy;
|
||||||
|
} egl_image_external;
|
||||||
};
|
};
|
||||||
|
|
||||||
CoglTexture2D *
|
CoglTexture2D *
|
||||||
_cogl_texture_2d_new_from_bitmap (CoglBitmap *bmp,
|
_cogl_texture_2d_new_from_bitmap (CoglBitmap *bmp,
|
||||||
CoglBool can_convert_in_place);
|
CoglBool can_convert_in_place);
|
||||||
|
|
||||||
#if defined (COGL_HAS_EGL_SUPPORT) && defined (EGL_KHR_image_base)
|
|
||||||
/* NB: The reason we require the width, height and format to be passed
|
|
||||||
* even though they may seem redundant is because GLES 1/2 don't
|
|
||||||
* provide a way to query these properties. */
|
|
||||||
CoglTexture2D *
|
|
||||||
_cogl_egl_texture_2d_new_from_image (CoglContext *ctx,
|
|
||||||
int width,
|
|
||||||
int height,
|
|
||||||
CoglPixelFormat format,
|
|
||||||
EGLImageKHR image,
|
|
||||||
CoglError **error);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
CoglTexture2D *
|
CoglTexture2D *
|
||||||
_cogl_texture_2d_create_base (CoglContext *ctx,
|
_cogl_texture_2d_create_base (CoglContext *ctx,
|
||||||
int width,
|
int width,
|
||||||
|
@@ -110,6 +110,8 @@ _cogl_texture_2d_create_base (CoglContext *ctx,
|
|||||||
tex_2d->mipmaps_dirty = TRUE;
|
tex_2d->mipmaps_dirty = TRUE;
|
||||||
tex_2d->auto_mipmap = TRUE;
|
tex_2d->auto_mipmap = TRUE;
|
||||||
|
|
||||||
|
tex_2d->gl_target = GL_TEXTURE_2D;
|
||||||
|
|
||||||
tex_2d->is_foreign = FALSE;
|
tex_2d->is_foreign = FALSE;
|
||||||
|
|
||||||
ctx->driver_vtable->texture_2d_init (tex_2d);
|
ctx->driver_vtable->texture_2d_init (tex_2d);
|
||||||
@@ -236,12 +238,12 @@ cogl_texture_2d_new_from_data (CoglContext *ctx,
|
|||||||
* even though they may seem redundant is because GLES 1/2 don't
|
* even though they may seem redundant is because GLES 1/2 don't
|
||||||
* provide a way to query these properties. */
|
* provide a way to query these properties. */
|
||||||
CoglTexture2D *
|
CoglTexture2D *
|
||||||
_cogl_egl_texture_2d_new_from_image (CoglContext *ctx,
|
cogl_egl_texture_2d_new_from_image (CoglContext *ctx,
|
||||||
int width,
|
int width,
|
||||||
int height,
|
int height,
|
||||||
CoglPixelFormat format,
|
CoglPixelFormat format,
|
||||||
EGLImageKHR image,
|
EGLImageKHR image,
|
||||||
CoglError **error)
|
CoglError **error)
|
||||||
{
|
{
|
||||||
CoglTextureLoader *loader;
|
CoglTextureLoader *loader;
|
||||||
CoglTexture2D *tex;
|
CoglTexture2D *tex;
|
||||||
@@ -430,11 +432,11 @@ cogl_wayland_texture_2d_new_from_buffer (CoglContext *ctx,
|
|||||||
EGL_WAYLAND_BUFFER_WL,
|
EGL_WAYLAND_BUFFER_WL,
|
||||||
buffer,
|
buffer,
|
||||||
NULL);
|
NULL);
|
||||||
tex = _cogl_egl_texture_2d_new_from_image (ctx,
|
tex = cogl_egl_texture_2d_new_from_image (ctx,
|
||||||
width, height,
|
width, height,
|
||||||
internal_format,
|
internal_format,
|
||||||
image,
|
image,
|
||||||
error);
|
error);
|
||||||
_cogl_egl_destroy_image (ctx, image);
|
_cogl_egl_destroy_image (ctx, image);
|
||||||
return tex;
|
return tex;
|
||||||
}
|
}
|
||||||
@@ -557,7 +559,7 @@ _cogl_texture_2d_get_gl_texture (CoglTexture *tex,
|
|||||||
GLuint handle;
|
GLuint handle;
|
||||||
|
|
||||||
if (out_gl_target)
|
if (out_gl_target)
|
||||||
*out_gl_target = GL_TEXTURE_2D;
|
*out_gl_target = tex_2d->gl_target;
|
||||||
|
|
||||||
handle = ctx->driver_vtable->texture_2d_get_gl_handle (tex_2d);
|
handle = ctx->driver_vtable->texture_2d_get_gl_handle (tex_2d);
|
||||||
|
|
||||||
|
@@ -40,6 +40,10 @@
|
|||||||
#include "cogl-context.h"
|
#include "cogl-context.h"
|
||||||
#include "cogl-bitmap.h"
|
#include "cogl-bitmap.h"
|
||||||
|
|
||||||
|
#ifdef COGL_HAS_EGL_SUPPORT
|
||||||
|
#include "cogl-egl-defines.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
COGL_BEGIN_DECLS
|
COGL_BEGIN_DECLS
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -227,6 +231,40 @@ cogl_texture_2d_new_from_data (CoglContext *ctx,
|
|||||||
CoglTexture2D *
|
CoglTexture2D *
|
||||||
cogl_texture_2d_new_from_bitmap (CoglBitmap *bitmap);
|
cogl_texture_2d_new_from_bitmap (CoglBitmap *bitmap);
|
||||||
|
|
||||||
|
#if defined (COGL_HAS_EGL_SUPPORT) && defined (EGL_KHR_image_base)
|
||||||
|
/* NB: The reason we require the width, height and format to be passed
|
||||||
|
* even though they may seem redundant is because GLES 1/2 don't
|
||||||
|
* provide a way to query these properties. */
|
||||||
|
CoglTexture2D *
|
||||||
|
cogl_egl_texture_2d_new_from_image (CoglContext *ctx,
|
||||||
|
int width,
|
||||||
|
int height,
|
||||||
|
CoglPixelFormat format,
|
||||||
|
EGLImageKHR image,
|
||||||
|
CoglError **error);
|
||||||
|
|
||||||
|
typedef gboolean (*CoglTexture2DEGLImageExternalAlloc) (CoglTexture2D *tex_2d,
|
||||||
|
gpointer user_data,
|
||||||
|
GError **error);
|
||||||
|
|
||||||
|
CoglTexture2D *
|
||||||
|
cogl_texture_2d_new_from_egl_image_external (CoglContext *ctx,
|
||||||
|
int width,
|
||||||
|
int height,
|
||||||
|
CoglTexture2DEGLImageExternalAlloc alloc,
|
||||||
|
gpointer user_data,
|
||||||
|
GDestroyNotify destroy,
|
||||||
|
CoglError **error);
|
||||||
|
|
||||||
|
void
|
||||||
|
cogl_texture_2d_egl_image_external_bind (CoglTexture2D *tex_2d);
|
||||||
|
|
||||||
|
void
|
||||||
|
cogl_texture_2d_egl_image_external_alloc_finish (CoglTexture2D *tex_2d,
|
||||||
|
void *user_data,
|
||||||
|
GDestroyNotify destroy);
|
||||||
|
#endif
|
||||||
|
|
||||||
COGL_END_DECLS
|
COGL_END_DECLS
|
||||||
|
|
||||||
#endif /* __COGL_TEXTURE_2D_H */
|
#endif /* __COGL_TEXTURE_2D_H */
|
||||||
|
@@ -198,6 +198,7 @@ struct _CoglTextureDriver
|
|||||||
CoglPixelFormat
|
CoglPixelFormat
|
||||||
(* find_best_gl_get_data_format) (CoglContext *context,
|
(* find_best_gl_get_data_format) (CoglContext *context,
|
||||||
CoglPixelFormat format,
|
CoglPixelFormat format,
|
||||||
|
CoglPixelFormat target_format,
|
||||||
GLenum *closest_gl_format,
|
GLenum *closest_gl_format,
|
||||||
GLenum *closest_gl_type);
|
GLenum *closest_gl_type);
|
||||||
};
|
};
|
||||||
|
@@ -37,6 +37,7 @@
|
|||||||
#include "cogl-spans.h"
|
#include "cogl-spans.h"
|
||||||
#include "cogl-meta-texture.h"
|
#include "cogl-meta-texture.h"
|
||||||
#include "cogl-framebuffer.h"
|
#include "cogl-framebuffer.h"
|
||||||
|
#include "cogl-texture-2d.h"
|
||||||
|
|
||||||
#ifdef COGL_HAS_EGL_SUPPORT
|
#ifdef COGL_HAS_EGL_SUPPORT
|
||||||
#include "cogl-egl-defines.h"
|
#include "cogl-egl-defines.h"
|
||||||
@@ -154,7 +155,8 @@ typedef enum _CoglTextureSoureType {
|
|||||||
COGL_TEXTURE_SOURCE_TYPE_SIZED = 1,
|
COGL_TEXTURE_SOURCE_TYPE_SIZED = 1,
|
||||||
COGL_TEXTURE_SOURCE_TYPE_BITMAP,
|
COGL_TEXTURE_SOURCE_TYPE_BITMAP,
|
||||||
COGL_TEXTURE_SOURCE_TYPE_EGL_IMAGE,
|
COGL_TEXTURE_SOURCE_TYPE_EGL_IMAGE,
|
||||||
COGL_TEXTURE_SOURCE_TYPE_GL_FOREIGN
|
COGL_TEXTURE_SOURCE_TYPE_GL_FOREIGN,
|
||||||
|
COGL_TEXTURE_SOURCE_TYPE_EGL_IMAGE_EXTERNAL
|
||||||
} CoglTextureSourceType;
|
} CoglTextureSourceType;
|
||||||
|
|
||||||
typedef struct _CoglTextureLoader
|
typedef struct _CoglTextureLoader
|
||||||
@@ -179,6 +181,14 @@ typedef struct _CoglTextureLoader
|
|||||||
int height;
|
int height;
|
||||||
CoglPixelFormat format;
|
CoglPixelFormat format;
|
||||||
} egl_image;
|
} egl_image;
|
||||||
|
#endif
|
||||||
|
#if defined (COGL_HAS_EGL_SUPPORT)
|
||||||
|
struct {
|
||||||
|
int width;
|
||||||
|
int height;
|
||||||
|
CoglTexture2DEGLImageExternalAlloc alloc;
|
||||||
|
CoglPixelFormat format;
|
||||||
|
} egl_image_external;
|
||||||
#endif
|
#endif
|
||||||
struct {
|
struct {
|
||||||
int width;
|
int width;
|
||||||
|
@@ -160,6 +160,7 @@ _cogl_texture_free_loader (CoglTexture *texture)
|
|||||||
case COGL_TEXTURE_SOURCE_TYPE_SIZED:
|
case COGL_TEXTURE_SOURCE_TYPE_SIZED:
|
||||||
case COGL_TEXTURE_SOURCE_TYPE_EGL_IMAGE:
|
case COGL_TEXTURE_SOURCE_TYPE_EGL_IMAGE:
|
||||||
case COGL_TEXTURE_SOURCE_TYPE_GL_FOREIGN:
|
case COGL_TEXTURE_SOURCE_TYPE_GL_FOREIGN:
|
||||||
|
case COGL_TEXTURE_SOURCE_TYPE_EGL_IMAGE_EXTERNAL:
|
||||||
break;
|
break;
|
||||||
case COGL_TEXTURE_SOURCE_TYPE_BITMAP:
|
case COGL_TEXTURE_SOURCE_TYPE_BITMAP:
|
||||||
cogl_object_unref (loader->src.bitmap.bitmap);
|
cogl_object_unref (loader->src.bitmap.bitmap);
|
||||||
@@ -1058,6 +1059,7 @@ cogl_texture_get_data (CoglTexture *texture,
|
|||||||
|
|
||||||
closest_format =
|
closest_format =
|
||||||
ctx->texture_driver->find_best_gl_get_data_format (ctx,
|
ctx->texture_driver->find_best_gl_get_data_format (ctx,
|
||||||
|
texture_format,
|
||||||
format,
|
format,
|
||||||
&closest_gl_format,
|
&closest_gl_format,
|
||||||
&closest_gl_type);
|
&closest_gl_type);
|
||||||
|
@@ -167,6 +167,36 @@ void
|
|||||||
cogl_xlib_renderer_set_event_retrieval_enabled (CoglRenderer *renderer,
|
cogl_xlib_renderer_set_event_retrieval_enabled (CoglRenderer *renderer,
|
||||||
CoglBool enable);
|
CoglBool enable);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* cogl_xlib_renderer_set_threaded_swap_wait_enabled:
|
||||||
|
* @renderer: a #CoglRenderer
|
||||||
|
* @enable: The new value
|
||||||
|
*
|
||||||
|
* Sets whether Cogl is allowed to use a separate threaded to wait for the
|
||||||
|
* completion of glXSwapBuffers() and call the frame callback for the
|
||||||
|
* corresponding #CoglOnscreen. This is a way of emulating the
|
||||||
|
* INTEL_swap_event extension, and will only ever be used if
|
||||||
|
* INTEL_swap_event is not present; it will also only be used for
|
||||||
|
* specific white-listed drivers that are known to work correctly with
|
||||||
|
* multiple contexts sharing state between threads.
|
||||||
|
*
|
||||||
|
* The advantage of enabling this is that it will allow your main loop
|
||||||
|
* to do other work while waiting for the system to be ready to draw
|
||||||
|
* the next frame, instead of blocking in glXSwapBuffers(). A disadvantage
|
||||||
|
* is that the driver will be prevented from buffering up multiple frames
|
||||||
|
* even if it thinks that it would be advantageous. In general, this
|
||||||
|
* will work best for something like a system compositor that is doing
|
||||||
|
* simple drawing but handling lots of other complex tasks.
|
||||||
|
*
|
||||||
|
* If you enable this, you must call XInitThreads() before any other
|
||||||
|
* X11 calls in your program. (See the documentation for XInitThreads())
|
||||||
|
*
|
||||||
|
* Stability: unstable
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
cogl_xlib_renderer_set_threaded_swap_wait_enabled (CoglRenderer *renderer,
|
||||||
|
CoglBool enable);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* cogl_xlib_renderer_get_display: (skip)
|
* cogl_xlib_renderer_get_display: (skip)
|
||||||
*/
|
*/
|
||||||
|
@@ -1418,6 +1418,15 @@ _cogl_framebuffer_gl_read_pixels_into_bitmap (CoglFramebuffer *framebuffer,
|
|||||||
&gl_format,
|
&gl_format,
|
||||||
&gl_type);
|
&gl_type);
|
||||||
|
|
||||||
|
/* As we are reading pixels, we want to consider the bitmap according to
|
||||||
|
* its real pixel format, not the swizzled channels we pretend face to the
|
||||||
|
* pipeline.
|
||||||
|
*/
|
||||||
|
if ((format == COGL_PIXEL_FORMAT_BGRA_8888 ||
|
||||||
|
format == COGL_PIXEL_FORMAT_BGRA_8888_PRE) &&
|
||||||
|
_cogl_has_private_feature (ctx, COGL_PRIVATE_FEATURE_TEXTURE_SWIZZLE))
|
||||||
|
gl_format = GL_BGRA;
|
||||||
|
|
||||||
/* NB: All offscreen rendering is done upside down so there is no need
|
/* NB: All offscreen rendering is done upside down so there is no need
|
||||||
* to flip in this case... */
|
* to flip in this case... */
|
||||||
if (_cogl_has_private_feature (ctx, COGL_PRIVATE_FEATURE_MESA_PACK_INVERT) &&
|
if (_cogl_has_private_feature (ctx, COGL_PRIVATE_FEATURE_MESA_PACK_INVERT) &&
|
||||||
|
@@ -418,7 +418,11 @@ flush_depth_state (CoglContext *ctx,
|
|||||||
if (ctx->depth_test_enabled_cache != depth_state->test_enabled)
|
if (ctx->depth_test_enabled_cache != depth_state->test_enabled)
|
||||||
{
|
{
|
||||||
if (depth_state->test_enabled == TRUE)
|
if (depth_state->test_enabled == TRUE)
|
||||||
GE (ctx, glEnable (GL_DEPTH_TEST));
|
{
|
||||||
|
GE (ctx, glEnable (GL_DEPTH_TEST));
|
||||||
|
if (ctx->current_draw_buffer)
|
||||||
|
ctx->current_draw_buffer->depth_buffer_clear_needed = TRUE;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
GE (ctx, glDisable (GL_DEPTH_TEST));
|
GE (ctx, glDisable (GL_DEPTH_TEST));
|
||||||
ctx->depth_test_enabled_cache = depth_state->test_enabled;
|
ctx->depth_test_enabled_cache = depth_state->test_enabled;
|
||||||
|
@@ -46,11 +46,31 @@
|
|||||||
#include "cogl-error-private.h"
|
#include "cogl-error-private.h"
|
||||||
#include "cogl-util-gl-private.h"
|
#include "cogl-util-gl-private.h"
|
||||||
|
|
||||||
|
#if defined (COGL_HAS_EGL_SUPPORT)
|
||||||
|
|
||||||
|
/* We need this define from GLES2, but can't include the header
|
||||||
|
as its type definitions may conflict with the GL ones
|
||||||
|
*/
|
||||||
|
#ifndef GL_OES_EGL_image_external
|
||||||
|
#define GL_OES_EGL_image_external 1
|
||||||
|
#define GL_TEXTURE_EXTERNAL_OES 0x8D65
|
||||||
|
#define GL_TEXTURE_BINDING_EXTERNAL_OES 0x8D67
|
||||||
|
#define GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES 0x8D68
|
||||||
|
#define GL_SAMPLER_EXTERNAL_OES 0x8D66
|
||||||
|
#endif /* GL_OES_EGL_image_external */
|
||||||
|
|
||||||
|
#endif /* defined (COGL_HAS_EGL_SUPPORT) */
|
||||||
|
|
||||||
void
|
void
|
||||||
_cogl_texture_2d_gl_free (CoglTexture2D *tex_2d)
|
_cogl_texture_2d_gl_free (CoglTexture2D *tex_2d)
|
||||||
{
|
{
|
||||||
if (!tex_2d->is_foreign && tex_2d->gl_texture)
|
if (!tex_2d->is_foreign && tex_2d->gl_texture)
|
||||||
_cogl_delete_gl_texture (tex_2d->gl_texture);
|
_cogl_delete_gl_texture (tex_2d->gl_texture);
|
||||||
|
|
||||||
|
#if defined (COGL_HAS_EGL_SUPPORT)
|
||||||
|
g_clear_pointer (&tex_2d->egl_image_external.user_data,
|
||||||
|
tex_2d->egl_image_external.destroy);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
CoglBool
|
CoglBool
|
||||||
@@ -101,6 +121,9 @@ _cogl_texture_2d_gl_init (CoglTexture2D *tex_2d)
|
|||||||
/* Wrap mode not yet set */
|
/* Wrap mode not yet set */
|
||||||
tex_2d->gl_legacy_texobj_wrap_mode_s = GL_FALSE;
|
tex_2d->gl_legacy_texobj_wrap_mode_s = GL_FALSE;
|
||||||
tex_2d->gl_legacy_texobj_wrap_mode_t = GL_FALSE;
|
tex_2d->gl_legacy_texobj_wrap_mode_t = GL_FALSE;
|
||||||
|
|
||||||
|
tex_2d->egl_image_external.user_data = NULL;
|
||||||
|
tex_2d->egl_image_external.destroy = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static CoglBool
|
static CoglBool
|
||||||
@@ -439,6 +462,96 @@ allocate_from_gl_foreign (CoglTexture2D *tex_2d,
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined (COGL_HAS_EGL_SUPPORT)
|
||||||
|
static CoglBool
|
||||||
|
allocate_custom_egl_image_external (CoglTexture2D *tex_2d,
|
||||||
|
CoglTextureLoader *loader,
|
||||||
|
CoglError **error)
|
||||||
|
{
|
||||||
|
CoglTexture *tex = COGL_TEXTURE (tex_2d);
|
||||||
|
CoglContext *ctx = tex->context;
|
||||||
|
CoglPixelFormat internal_format = loader->src.egl_image_external.format;
|
||||||
|
|
||||||
|
_cogl_gl_util_clear_gl_errors (ctx);
|
||||||
|
|
||||||
|
GE (ctx, glActiveTexture (GL_TEXTURE0));
|
||||||
|
GE (ctx, glGenTextures (1, &tex_2d->gl_texture));
|
||||||
|
|
||||||
|
GE (ctx, glBindTexture (GL_TEXTURE_EXTERNAL_OES,
|
||||||
|
tex_2d->gl_texture));
|
||||||
|
|
||||||
|
if (_cogl_gl_util_get_error (ctx) != GL_NO_ERROR)
|
||||||
|
{
|
||||||
|
_cogl_set_error (error,
|
||||||
|
COGL_TEXTURE_ERROR,
|
||||||
|
COGL_TEXTURE_ERROR_BAD_PARAMETER,
|
||||||
|
"Could not create a CoglTexture2D from a given "
|
||||||
|
"EGLImage");
|
||||||
|
GE( ctx, glDeleteTextures (1, &tex_2d->gl_texture) );
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
GE (ctx, glTexParameteri(GL_TEXTURE_EXTERNAL_OES,
|
||||||
|
GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE));
|
||||||
|
GE (ctx, glTexParameteri(GL_TEXTURE_EXTERNAL_OES,
|
||||||
|
GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE));
|
||||||
|
|
||||||
|
if (!loader->src.egl_image_external.alloc (tex_2d,
|
||||||
|
tex_2d->egl_image_external.user_data,
|
||||||
|
error))
|
||||||
|
{
|
||||||
|
GE (ctx, glBindTexture (GL_TEXTURE_EXTERNAL_OES, 0));
|
||||||
|
GE (ctx, glDeleteTextures (1, &tex_2d->gl_texture));
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
GE (ctx, glBindTexture (GL_TEXTURE_EXTERNAL_OES, 0));
|
||||||
|
|
||||||
|
tex_2d->internal_format = internal_format;
|
||||||
|
tex_2d->gl_target = GL_TEXTURE_EXTERNAL_OES;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
CoglTexture2D *
|
||||||
|
cogl_texture_2d_new_from_egl_image_external (CoglContext *ctx,
|
||||||
|
int width,
|
||||||
|
int height,
|
||||||
|
CoglTexture2DEGLImageExternalAlloc alloc,
|
||||||
|
gpointer user_data,
|
||||||
|
GDestroyNotify destroy,
|
||||||
|
CoglError **error)
|
||||||
|
{
|
||||||
|
CoglTextureLoader *loader;
|
||||||
|
CoglTexture2D *tex_2d;
|
||||||
|
CoglPixelFormat internal_format = COGL_PIXEL_FORMAT_ANY;
|
||||||
|
|
||||||
|
_COGL_RETURN_VAL_IF_FAIL (_cogl_context_get_winsys (ctx)->constraints &
|
||||||
|
COGL_RENDERER_CONSTRAINT_USES_EGL,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
_COGL_RETURN_VAL_IF_FAIL (cogl_has_feature (ctx,
|
||||||
|
COGL_FEATURE_ID_TEXTURE_EGL_IMAGE_EXTERNAL),
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
loader = _cogl_texture_create_loader ();
|
||||||
|
loader->src_type = COGL_TEXTURE_SOURCE_TYPE_EGL_IMAGE_EXTERNAL;
|
||||||
|
loader->src.egl_image_external.width = width;
|
||||||
|
loader->src.egl_image_external.height = height;
|
||||||
|
loader->src.egl_image_external.alloc = alloc;
|
||||||
|
loader->src.egl_image_external.format = internal_format;
|
||||||
|
|
||||||
|
tex_2d = _cogl_texture_2d_create_base (ctx, width, height,
|
||||||
|
internal_format, loader);
|
||||||
|
|
||||||
|
|
||||||
|
tex_2d->egl_image_external.user_data = user_data;
|
||||||
|
tex_2d->egl_image_external.destroy = destroy;
|
||||||
|
|
||||||
|
return tex_2d;
|
||||||
|
}
|
||||||
|
#endif /* defined (COGL_HAS_EGL_SUPPORT) */
|
||||||
|
|
||||||
CoglBool
|
CoglBool
|
||||||
_cogl_texture_2d_gl_allocate (CoglTexture *tex,
|
_cogl_texture_2d_gl_allocate (CoglTexture *tex,
|
||||||
CoglError **error)
|
CoglError **error)
|
||||||
@@ -462,6 +575,8 @@ _cogl_texture_2d_gl_allocate (CoglTexture *tex,
|
|||||||
#endif
|
#endif
|
||||||
case COGL_TEXTURE_SOURCE_TYPE_GL_FOREIGN:
|
case COGL_TEXTURE_SOURCE_TYPE_GL_FOREIGN:
|
||||||
return allocate_from_gl_foreign (tex_2d, loader, error);
|
return allocate_from_gl_foreign (tex_2d, loader, error);
|
||||||
|
case COGL_TEXTURE_SOURCE_TYPE_EGL_IMAGE_EXTERNAL:
|
||||||
|
return allocate_custom_egl_image_external (tex_2d, loader, error);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_return_val_if_reached (FALSE);
|
g_return_val_if_reached (FALSE);
|
||||||
@@ -657,11 +772,12 @@ _cogl_texture_2d_gl_copy_from_bitmap (CoglTexture2D *tex_2d,
|
|||||||
|
|
||||||
upload_format = cogl_bitmap_get_format (upload_bmp);
|
upload_format = cogl_bitmap_get_format (upload_bmp);
|
||||||
|
|
||||||
ctx->driver_vtable->pixel_format_to_gl (ctx,
|
ctx->driver_vtable->pixel_format_to_gl_with_target (ctx,
|
||||||
upload_format,
|
upload_format,
|
||||||
NULL, /* internal format */
|
_cogl_texture_get_format (tex),
|
||||||
&gl_format,
|
NULL, /* internal gl format */
|
||||||
&gl_type);
|
&gl_format,
|
||||||
|
&gl_type);
|
||||||
|
|
||||||
/* If this touches the first pixel then we'll update our copy */
|
/* If this touches the first pixel then we'll update our copy */
|
||||||
if (dst_x == 0 && dst_y == 0 &&
|
if (dst_x == 0 && dst_y == 0 &&
|
||||||
|
@@ -37,6 +37,11 @@
|
|||||||
#include "cogl-gl-header.h"
|
#include "cogl-gl-header.h"
|
||||||
#include "cogl-texture.h"
|
#include "cogl-texture.h"
|
||||||
|
|
||||||
|
/* In OpenGL ES context, GL_CONTEXT_LOST has a _KHR prefix */
|
||||||
|
#ifndef GL_CONTEXT_LOST
|
||||||
|
#define GL_CONTEXT_LOST GL_CONTEXT_LOST_KHR
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef COGL_GL_DEBUG
|
#ifdef COGL_GL_DEBUG
|
||||||
|
|
||||||
const char *
|
const char *
|
||||||
|
@@ -96,11 +96,12 @@ _cogl_driver_pixel_format_from_gl_internal (CoglContext *context,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static CoglPixelFormat
|
static CoglPixelFormat
|
||||||
_cogl_driver_pixel_format_to_gl (CoglContext *context,
|
_cogl_driver_pixel_format_to_gl_with_target (CoglContext *context,
|
||||||
CoglPixelFormat format,
|
CoglPixelFormat format,
|
||||||
GLenum *out_glintformat,
|
CoglPixelFormat target_format,
|
||||||
GLenum *out_glformat,
|
GLenum *out_glintformat,
|
||||||
GLenum *out_gltype)
|
GLenum *out_glformat,
|
||||||
|
GLenum *out_gltype)
|
||||||
{
|
{
|
||||||
CoglPixelFormat required_format;
|
CoglPixelFormat required_format;
|
||||||
GLenum glintformat = 0;
|
GLenum glintformat = 0;
|
||||||
@@ -174,7 +175,16 @@ _cogl_driver_pixel_format_to_gl (CoglContext *context,
|
|||||||
case COGL_PIXEL_FORMAT_BGRA_8888:
|
case COGL_PIXEL_FORMAT_BGRA_8888:
|
||||||
case COGL_PIXEL_FORMAT_BGRA_8888_PRE:
|
case COGL_PIXEL_FORMAT_BGRA_8888_PRE:
|
||||||
glintformat = GL_RGBA;
|
glintformat = GL_RGBA;
|
||||||
glformat = GL_BGRA;
|
/* If the driver has texture_swizzle, pretend internal
|
||||||
|
* and buffer format are the same here, the pixels
|
||||||
|
* will be flipped through this extension.
|
||||||
|
*/
|
||||||
|
if (target_format == format &&
|
||||||
|
_cogl_has_private_feature
|
||||||
|
(context, COGL_PRIVATE_FEATURE_TEXTURE_SWIZZLE))
|
||||||
|
glformat = GL_RGBA;
|
||||||
|
else
|
||||||
|
glformat = GL_BGRA;
|
||||||
gltype = GL_UNSIGNED_BYTE;
|
gltype = GL_UNSIGNED_BYTE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -289,6 +299,20 @@ _cogl_driver_pixel_format_to_gl (CoglContext *context,
|
|||||||
return required_format;
|
return required_format;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static CoglPixelFormat
|
||||||
|
_cogl_driver_pixel_format_to_gl (CoglContext *context,
|
||||||
|
CoglPixelFormat format,
|
||||||
|
GLenum *out_glintformat,
|
||||||
|
GLenum *out_glformat,
|
||||||
|
GLenum *out_gltype)
|
||||||
|
{
|
||||||
|
return _cogl_driver_pixel_format_to_gl_with_target (context,
|
||||||
|
format, format,
|
||||||
|
out_glintformat,
|
||||||
|
out_glformat,
|
||||||
|
out_gltype);
|
||||||
|
}
|
||||||
|
|
||||||
static CoglBool
|
static CoglBool
|
||||||
_cogl_get_gl_version (CoglContext *ctx,
|
_cogl_get_gl_version (CoglContext *ctx,
|
||||||
int *major_out,
|
int *major_out,
|
||||||
@@ -669,6 +693,7 @@ _cogl_driver_gl =
|
|||||||
{
|
{
|
||||||
_cogl_driver_pixel_format_from_gl_internal,
|
_cogl_driver_pixel_format_from_gl_internal,
|
||||||
_cogl_driver_pixel_format_to_gl,
|
_cogl_driver_pixel_format_to_gl,
|
||||||
|
_cogl_driver_pixel_format_to_gl_with_target,
|
||||||
_cogl_driver_update_features,
|
_cogl_driver_update_features,
|
||||||
_cogl_offscreen_gl_allocate,
|
_cogl_offscreen_gl_allocate,
|
||||||
_cogl_offscreen_gl_free,
|
_cogl_offscreen_gl_free,
|
||||||
|
@@ -114,6 +114,18 @@ _cogl_texture_driver_gen (CoglContext *ctx,
|
|||||||
red_swizzle) );
|
red_swizzle) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* If swizzle extension is available, prefer it to flip bgra buffers to rgba */
|
||||||
|
if ((internal_format == COGL_PIXEL_FORMAT_BGRA_8888 ||
|
||||||
|
internal_format == COGL_PIXEL_FORMAT_BGRA_8888_PRE) &&
|
||||||
|
_cogl_has_private_feature (ctx, COGL_PRIVATE_FEATURE_TEXTURE_SWIZZLE))
|
||||||
|
{
|
||||||
|
static const GLint bgra_swizzle[] = { GL_BLUE, GL_GREEN, GL_RED, GL_ALPHA };
|
||||||
|
|
||||||
|
GE( ctx, glTexParameteriv (gl_target,
|
||||||
|
GL_TEXTURE_SWIZZLE_RGBA,
|
||||||
|
bgra_swizzle) );
|
||||||
|
}
|
||||||
|
|
||||||
return tex;
|
return tex;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -521,14 +533,16 @@ static CoglPixelFormat
|
|||||||
_cogl_texture_driver_find_best_gl_get_data_format
|
_cogl_texture_driver_find_best_gl_get_data_format
|
||||||
(CoglContext *context,
|
(CoglContext *context,
|
||||||
CoglPixelFormat format,
|
CoglPixelFormat format,
|
||||||
|
CoglPixelFormat target_format,
|
||||||
GLenum *closest_gl_format,
|
GLenum *closest_gl_format,
|
||||||
GLenum *closest_gl_type)
|
GLenum *closest_gl_type)
|
||||||
{
|
{
|
||||||
return context->driver_vtable->pixel_format_to_gl (context,
|
return context->driver_vtable->pixel_format_to_gl_with_target (context,
|
||||||
format,
|
format,
|
||||||
NULL, /* don't need */
|
target_format,
|
||||||
closest_gl_format,
|
NULL, /* don't need */
|
||||||
closest_gl_type);
|
closest_gl_format,
|
||||||
|
closest_gl_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
const CoglTextureDriver
|
const CoglTextureDriver
|
||||||
|
@@ -67,11 +67,12 @@ _cogl_driver_pixel_format_from_gl_internal (CoglContext *context,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static CoglPixelFormat
|
static CoglPixelFormat
|
||||||
_cogl_driver_pixel_format_to_gl (CoglContext *context,
|
_cogl_driver_pixel_format_to_gl_with_target (CoglContext *context,
|
||||||
CoglPixelFormat format,
|
CoglPixelFormat format,
|
||||||
GLenum *out_glintformat,
|
CoglPixelFormat target_format,
|
||||||
GLenum *out_glformat,
|
GLenum *out_glintformat,
|
||||||
GLenum *out_gltype)
|
GLenum *out_glformat,
|
||||||
|
GLenum *out_gltype)
|
||||||
{
|
{
|
||||||
CoglPixelFormat required_format;
|
CoglPixelFormat required_format;
|
||||||
GLenum glintformat;
|
GLenum glintformat;
|
||||||
@@ -219,6 +220,20 @@ _cogl_driver_pixel_format_to_gl (CoglContext *context,
|
|||||||
return required_format;
|
return required_format;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static CoglPixelFormat
|
||||||
|
_cogl_driver_pixel_format_to_gl (CoglContext *context,
|
||||||
|
CoglPixelFormat format,
|
||||||
|
GLenum *out_glintformat,
|
||||||
|
GLenum *out_glformat,
|
||||||
|
GLenum *out_gltype)
|
||||||
|
{
|
||||||
|
return _cogl_driver_pixel_format_to_gl_with_target (context,
|
||||||
|
format, format,
|
||||||
|
out_glintformat,
|
||||||
|
out_glformat,
|
||||||
|
out_gltype);
|
||||||
|
}
|
||||||
|
|
||||||
static CoglBool
|
static CoglBool
|
||||||
_cogl_get_gl_version (CoglContext *ctx,
|
_cogl_get_gl_version (CoglContext *ctx,
|
||||||
int *major_out,
|
int *major_out,
|
||||||
@@ -457,6 +472,7 @@ _cogl_driver_gles =
|
|||||||
{
|
{
|
||||||
_cogl_driver_pixel_format_from_gl_internal,
|
_cogl_driver_pixel_format_from_gl_internal,
|
||||||
_cogl_driver_pixel_format_to_gl,
|
_cogl_driver_pixel_format_to_gl,
|
||||||
|
_cogl_driver_pixel_format_to_gl_with_target,
|
||||||
_cogl_driver_update_features,
|
_cogl_driver_update_features,
|
||||||
_cogl_offscreen_gl_allocate,
|
_cogl_offscreen_gl_allocate,
|
||||||
_cogl_offscreen_gl_free,
|
_cogl_offscreen_gl_free,
|
||||||
|
@@ -615,6 +615,7 @@ static CoglPixelFormat
|
|||||||
_cogl_texture_driver_find_best_gl_get_data_format
|
_cogl_texture_driver_find_best_gl_get_data_format
|
||||||
(CoglContext *context,
|
(CoglContext *context,
|
||||||
CoglPixelFormat format,
|
CoglPixelFormat format,
|
||||||
|
CoglPixelFormat target_format,
|
||||||
GLenum *closest_gl_format,
|
GLenum *closest_gl_format,
|
||||||
GLenum *closest_gl_type)
|
GLenum *closest_gl_type)
|
||||||
{
|
{
|
||||||
|
@@ -61,6 +61,7 @@ _cogl_driver_nop =
|
|||||||
{
|
{
|
||||||
NULL, /* pixel_format_from_gl_internal */
|
NULL, /* pixel_format_from_gl_internal */
|
||||||
NULL, /* pixel_format_to_gl */
|
NULL, /* pixel_format_to_gl */
|
||||||
|
NULL, /* pixel_format_to_gl_with_target */
|
||||||
_cogl_driver_update_features,
|
_cogl_driver_update_features,
|
||||||
_cogl_offscreen_nop_allocate,
|
_cogl_offscreen_nop_allocate,
|
||||||
_cogl_offscreen_nop_free,
|
_cogl_offscreen_nop_free,
|
||||||
|
@@ -2,12 +2,12 @@ prefix=@prefix@
|
|||||||
exec_prefix=@exec_prefix@
|
exec_prefix=@exec_prefix@
|
||||||
libdir=@libdir@/mutter
|
libdir=@libdir@/mutter
|
||||||
includedir=@includedir@/mutter
|
includedir=@includedir@/mutter
|
||||||
apiversion=1.0
|
apiversion=@LIBMUTTER_API_VERSION@
|
||||||
requires=@COGL_PKG_REQUIRES@
|
requires=@COGL_PKG_REQUIRES@
|
||||||
|
|
||||||
Name: Cogl
|
Name: Cogl
|
||||||
Description: An object oriented GL/GLES Abstraction/Utility Layer
|
Description: An object oriented GL/GLES Abstraction/Utility Layer
|
||||||
Version: @COGL_1_VERSION@
|
Version: @MUTTER_VERSION@
|
||||||
Libs: -L${libdir} -lmutter-cogl
|
Libs: -L${libdir} -lmutter-cogl-@LIBMUTTER_API_VERSION@
|
||||||
Cflags: -I${includedir}/cogl
|
Cflags: -I${includedir}/cogl
|
||||||
Requires: ${requires}
|
Requires: ${requires}
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user