Compare commits
1248 Commits
wip/ui-on-
...
wip/dnd-su
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7947bcb0b0 | ||
|
|
308cccc72c | ||
|
|
074946ac0b | ||
|
|
9688a0d7bc | ||
|
|
604d2155ba | ||
|
|
e7727d698f | ||
|
|
a3f75f401c | ||
|
|
d342f7c429 | ||
|
|
bb2b26ca44 | ||
|
|
2f9840a51c | ||
|
|
09aefdba43 | ||
|
|
4c8a408afc | ||
|
|
4c08d9a53b | ||
|
|
b091cbf361 | ||
|
|
a6fcda69ac | ||
|
|
9063e4568c | ||
|
|
3d37b5d696 | ||
|
|
3a8bad1e6f | ||
|
|
e822e51752 | ||
|
|
f9818f890b | ||
|
|
6526118d9f | ||
|
|
c15b3b4a09 | ||
|
|
e1acb69cf1 | ||
|
|
8f757c7b80 | ||
|
|
01a47c7d6d | ||
|
|
3ee09c6251 | ||
|
|
bb54f91dd1 | ||
|
|
41a79530e9 | ||
|
|
31f5a916f4 | ||
|
|
5657a671c1 | ||
|
|
ecc254c659 | ||
|
|
9cb1c95e49 | ||
|
|
e73c46ce03 | ||
|
|
952e9c52bc | ||
|
|
b879af46b3 | ||
|
|
9feb9d6bca | ||
|
|
dc0437a5b5 | ||
|
|
55331a0678 | ||
|
|
f5580f61f9 | ||
|
|
30953cf2d7 | ||
|
|
c7fa446ee7 | ||
|
|
9ecbac365b | ||
|
|
80f6fb6329 | ||
|
|
1b596a114d | ||
|
|
265c00235b | ||
|
|
fae37222a7 | ||
|
|
d41449b578 | ||
|
|
34979c3fe8 | ||
|
|
711f0c0c50 | ||
|
|
933d05a565 | ||
|
|
8a0da1cb07 | ||
|
|
1445903a34 | ||
|
|
5d9386df0c | ||
|
|
6fd1de226b | ||
|
|
ac099343da | ||
|
|
bce5f3f108 | ||
|
|
35e0982e35 | ||
|
|
767455e8d8 | ||
|
|
6b8dda0d00 | ||
|
|
277df44cfb | ||
|
|
2dded1e510 | ||
|
|
a7b1b1da80 | ||
|
|
de69678085 | ||
|
|
5f7b81eb95 | ||
|
|
f4f70afe31 | ||
|
|
116957b339 | ||
|
|
1af0033368 | ||
|
|
3645c63c08 | ||
|
|
04ddfe0a6f | ||
|
|
ec3dc4a607 | ||
|
|
0b98fbab0a | ||
|
|
5b8dc37c31 | ||
|
|
f42258327b | ||
|
|
7d1ef3f447 | ||
|
|
652fe57cdd | ||
|
|
20a6243c85 | ||
|
|
679edac9c3 | ||
|
|
bb59b8c249 | ||
|
|
c5c6b2257f | ||
|
|
6acf7b06f4 | ||
|
|
d0c004c93c | ||
|
|
53876d2b62 | ||
|
|
2b63b17327 | ||
|
|
226a09b38c | ||
|
|
527c53a2a0 | ||
|
|
19795c1681 | ||
|
|
1999fcaa8f | ||
|
|
6b5ff8fd74 | ||
|
|
821d946a72 | ||
|
|
5f7c901727 | ||
|
|
7b8ee4ee1e | ||
|
|
32cf4afb04 | ||
|
|
e0c92befd5 | ||
|
|
827e0341ab | ||
|
|
8627b65f8d | ||
|
|
9c62a907c5 | ||
|
|
a119ea96a3 | ||
|
|
06d55bf019 | ||
|
|
320f38de47 | ||
|
|
7adfaceccf | ||
|
|
67be4e2bf3 | ||
|
|
c3e87ee896 | ||
|
|
f2283ec634 | ||
|
|
d06e4beb7f | ||
|
|
e24863d175 | ||
|
|
2de2241690 | ||
|
|
977de8c5d4 | ||
|
|
fb6438cdd4 | ||
|
|
517e8f6fbd | ||
|
|
0e758a9e65 | ||
|
|
64a915a68d | ||
|
|
d233238c64 | ||
|
|
71a4fe746e | ||
|
|
f28c7835a1 | ||
|
|
cecf7f4bf0 | ||
|
|
c687cf9db6 | ||
|
|
54d2218ac2 | ||
|
|
471e6b9e13 | ||
|
|
f8dcea3975 | ||
|
|
d931af33c4 | ||
|
|
a0e3c05428 | ||
|
|
b8c13cc426 | ||
|
|
38253a9f73 | ||
|
|
cbc92b847f | ||
|
|
a5f993f269 | ||
|
|
31361e464a | ||
|
|
bb977c00ca | ||
|
|
39f65f9f86 | ||
|
|
bda2d6d1ac | ||
|
|
1e225ecdaf | ||
|
|
cfb85d9a9a | ||
|
|
f88c20f335 | ||
|
|
c98824bc9e | ||
|
|
69a35bb85f | ||
|
|
a3bb6c12e5 | ||
|
|
586f118279 | ||
|
|
31081e5dac | ||
|
|
ef363e9d2e | ||
|
|
9fa77acb8c | ||
|
|
1e30db64d1 | ||
|
|
e830b66604 | ||
|
|
5f0fab2156 | ||
|
|
467465c99c | ||
|
|
e935b52e51 | ||
|
|
879407c10c | ||
|
|
e76be14dbb | ||
|
|
7fa15c74b4 | ||
|
|
c3950699bf | ||
|
|
e6b950e31b | ||
|
|
9440bdb1aa | ||
|
|
e320b06aaa | ||
|
|
b284126d3b | ||
|
|
6858cb261f | ||
|
|
2d6954186e | ||
|
|
d72bf0cd5d | ||
|
|
584460deec | ||
|
|
e3d5969282 | ||
|
|
249468bbea | ||
|
|
f0f4c31d96 | ||
|
|
27f012ffad | ||
|
|
7d54631ebf | ||
|
|
513628e4ad | ||
|
|
101b215d6b | ||
|
|
6af48de0b8 | ||
|
|
e5c4fedd55 | ||
|
|
2ce23072d3 | ||
|
|
97f4eb6b75 | ||
|
|
75cbf3d730 | ||
|
|
bf9fdf448d | ||
|
|
63c627ec18 | ||
|
|
dadbd793be | ||
|
|
75b6e917ad | ||
|
|
ab53c0e943 | ||
|
|
c2fe6a18ad | ||
|
|
b7119c55a6 | ||
|
|
d0f2c6be6d | ||
|
|
3a535b6722 | ||
|
|
f9a77aec3f | ||
|
|
bee6d2b240 | ||
|
|
9a6a189e36 | ||
|
|
505eabb78c | ||
|
|
b0ba325f0e | ||
|
|
6fbd21001b | ||
|
|
626e4965b1 | ||
|
|
a15042b7e5 | ||
|
|
e56f963574 | ||
|
|
65a8f9100c | ||
|
|
6954d23444 | ||
|
|
6c624e1c26 | ||
|
|
cc839029b9 | ||
|
|
25f8eaf1ac | ||
|
|
8fdd226b8b | ||
|
|
6c5595fa9c | ||
|
|
e6558f838e | ||
|
|
57037a45b8 | ||
|
|
c844611052 | ||
|
|
b60e02956d | ||
|
|
4fe66ce0a9 | ||
|
|
4b5a503cee | ||
|
|
817995d97f | ||
|
|
0e7221c361 | ||
|
|
938fb8e6c8 | ||
|
|
fd8c49ff0a | ||
|
|
cd84317346 | ||
|
|
4f55e16fe9 | ||
|
|
c30ef668de | ||
|
|
62e0c42803 | ||
|
|
70aee2d95e | ||
|
|
63c7591698 | ||
|
|
930361b988 | ||
|
|
baadb75a5e | ||
|
|
f28f5dc0b6 | ||
|
|
41fdc4ac2e | ||
|
|
177ec27cca | ||
|
|
37652ca2cf | ||
|
|
6c22759d29 | ||
|
|
25b6a40ad4 | ||
|
|
fbea59b326 | ||
|
|
38e4906f72 | ||
|
|
029d69919b | ||
|
|
5e395fb676 | ||
|
|
ac448bd42b | ||
|
|
f55737ec06 | ||
|
|
80de15face | ||
|
|
32565e096d | ||
|
|
1d8e4bdd6d | ||
|
|
1677a068ce | ||
|
|
a02b8441b1 | ||
|
|
dfe1c106f2 | ||
|
|
e49bbe2ed8 | ||
|
|
6ee5a1437c | ||
|
|
93a3383e60 | ||
|
|
c9a2a561f8 | ||
|
|
ac0b2fdc6f | ||
|
|
46b9984414 | ||
|
|
f9743e2174 | ||
|
|
a3c55c2692 | ||
|
|
692eb4d957 | ||
|
|
826751429b | ||
|
|
5621d3c0c7 | ||
|
|
b5f46c9171 | ||
|
|
166b8c042c | ||
|
|
d34ece6f1a | ||
|
|
679844f791 | ||
|
|
9316256e10 | ||
|
|
90d7737fc1 | ||
|
|
567ca15610 | ||
|
|
558b323485 | ||
|
|
1a05da8296 | ||
|
|
5df59f75cd | ||
|
|
029673d0ee | ||
|
|
3a57f843d5 | ||
|
|
182a267f69 | ||
|
|
3de40434fa | ||
|
|
bc8328d7c2 | ||
|
|
12c1a06e60 | ||
|
|
b11405570a | ||
|
|
3b85e4b2b9 | ||
|
|
c5abf5ddbb | ||
|
|
2a3d4b62a7 | ||
|
|
8ff81bcc37 | ||
|
|
7159d3bc35 | ||
|
|
941d202938 | ||
|
|
5ea0cf8bab | ||
|
|
df9a5f867f | ||
|
|
06e4778072 | ||
|
|
92388892b3 | ||
|
|
5d124ac00a | ||
|
|
a57c3ae105 | ||
|
|
55354f5c38 | ||
|
|
379bb0a77d | ||
|
|
39357fc242 | ||
|
|
799de4f0f4 | ||
|
|
c34b5c1cf0 | ||
|
|
46361c3e28 | ||
|
|
f9d33b2efc | ||
|
|
2185904fcb | ||
|
|
eb952819c2 | ||
|
|
d7d8c92a9a | ||
|
|
88a7790d44 | ||
|
|
806dabe2d7 | ||
|
|
740e7ddd69 | ||
|
|
bee97ab6a7 | ||
|
|
59fc17c355 | ||
|
|
5f25ca0c3a | ||
|
|
41b4a079c7 | ||
|
|
e4235376d8 | ||
|
|
043a201f90 | ||
|
|
d1a588a94f | ||
|
|
01b6d9bfe2 | ||
|
|
9711d95996 | ||
|
|
b87db00fdb | ||
|
|
6190b65056 | ||
|
|
10fe91d704 | ||
|
|
36bb05b10e | ||
|
|
a7b7213017 | ||
|
|
031154a400 | ||
|
|
463b50e746 | ||
|
|
1749a85e96 | ||
|
|
1af9e92e91 | ||
|
|
12d0c98fb5 | ||
|
|
817c6986a0 | ||
|
|
7c68aaea4c | ||
|
|
6fea46e0cf | ||
|
|
59fa74fed1 | ||
|
|
581335fbea | ||
|
|
9b5d6cc008 | ||
|
|
d0f98ec1ba | ||
|
|
a977fcf3d0 | ||
|
|
664f6ef420 | ||
|
|
06a31992e3 | ||
|
|
4e2092d593 | ||
|
|
9755f308e5 | ||
|
|
09610daea1 | ||
|
|
13b7fa4eba | ||
|
|
909a46087f | ||
|
|
c10c8649f5 | ||
|
|
82dce6758a | ||
|
|
024652bfb4 | ||
|
|
789608b637 | ||
|
|
d05b750b8d | ||
|
|
704cae1de3 | ||
|
|
23b074481a | ||
|
|
5dc8fa6690 | ||
|
|
a9ba98686f | ||
|
|
59382bace2 | ||
|
|
2edf822bc6 | ||
|
|
355621b0ab | ||
|
|
a307e13a63 | ||
|
|
f807207b65 | ||
|
|
30b54aae34 | ||
|
|
79e682bcd0 | ||
|
|
a05ae8654c | ||
|
|
0db172edbf | ||
|
|
7b0930f798 | ||
|
|
0919b37c34 | ||
|
|
faf55c4627 | ||
|
|
f351c5d304 | ||
|
|
63bca17ab6 | ||
|
|
c2abe43ee7 | ||
|
|
1de2fd7122 | ||
|
|
e377e82cfd | ||
|
|
fa8174a200 | ||
|
|
d22448731c | ||
|
|
ef95133b1c | ||
|
|
c068c2122d | ||
|
|
d8c47b0abd | ||
|
|
66eb4bc34c | ||
|
|
bce812ecbc | ||
|
|
02220ed6c7 | ||
|
|
8d08851f28 | ||
|
|
af135c0b0b | ||
|
|
42c972735e | ||
|
|
110c79d10e | ||
|
|
b9d867cb86 | ||
|
|
ea3b961e43 | ||
|
|
bc510378b3 | ||
|
|
0a47d135ac | ||
|
|
ec8ed1dbb0 | ||
|
|
203e5335ab | ||
|
|
f1d8428650 | ||
|
|
8d29d22e99 | ||
|
|
9c6e527d4b | ||
|
|
077606c057 | ||
|
|
a615f93060 | ||
|
|
c562657f1e | ||
|
|
7b3922f8e9 | ||
|
|
c14382181f | ||
|
|
b2183dfda7 | ||
|
|
bb92054c86 | ||
|
|
4e4a6eb5d7 | ||
|
|
692acbd986 | ||
|
|
901901825c | ||
|
|
97f2de37e1 | ||
|
|
967b6c33df | ||
|
|
00c7a27732 | ||
|
|
048ba353c4 | ||
|
|
555e2f6de2 | ||
|
|
ff8d5281f0 | ||
|
|
4f9b994e73 | ||
|
|
b8b0dc5c78 | ||
|
|
d0cafab836 | ||
|
|
24d7c5ebe3 | ||
|
|
dc6decefb5 | ||
|
|
25d7e48077 | ||
|
|
b0b8f37240 | ||
|
|
188e4e1b92 | ||
|
|
9d5273bb15 | ||
|
|
3c0fae74f1 | ||
|
|
86dae6d4c7 | ||
|
|
d06600aeb0 | ||
|
|
895a3d1f39 | ||
|
|
381ef5c683 | ||
|
|
62097897be | ||
|
|
2d2c47ba49 | ||
|
|
89cdfc9194 | ||
|
|
ad60ea9e0e | ||
|
|
a7350475e8 | ||
|
|
f3d7c9cff9 | ||
|
|
906cbeed61 | ||
|
|
0fccb0fc86 | ||
|
|
8100cefd4c | ||
|
|
d7e99a3f86 | ||
|
|
6af944fe2c | ||
|
|
12fc394b92 | ||
|
|
53814fefc1 | ||
|
|
e87a01c80b | ||
|
|
21d7c1a850 | ||
|
|
e33c58297d | ||
|
|
5350120db4 | ||
|
|
0997cf7fee | ||
|
|
af3aae7295 | ||
|
|
98e219da4b | ||
|
|
fba022cc06 | ||
|
|
3f6c6f1dd9 | ||
|
|
ebc2e7221b | ||
|
|
7cb30ced23 | ||
|
|
7b449ac56c | ||
|
|
724953101d | ||
|
|
8734477d52 | ||
|
|
ec8ba4b5f9 | ||
|
|
2250865eb6 | ||
|
|
847a3bbee3 | ||
|
|
410a002ddd | ||
|
|
8766db2593 | ||
|
|
e362227514 | ||
|
|
da311f266d | ||
|
|
f5a4e996a8 | ||
|
|
a7f083897f | ||
|
|
e2105dc721 | ||
|
|
b64548ee1f | ||
|
|
53425fa721 | ||
|
|
048f035d30 | ||
|
|
b32c837df9 | ||
|
|
dd03a76d51 | ||
|
|
806a666950 | ||
|
|
b240a5e819 | ||
|
|
fe823b3553 | ||
|
|
d380d30ef4 | ||
|
|
1fe5b3e7d5 | ||
|
|
a8df208a5c | ||
|
|
f3f3c94831 | ||
|
|
6e06648f7a | ||
|
|
afb41f715b | ||
|
|
19d26dde92 | ||
|
|
4acb902423 | ||
|
|
626516d12e | ||
|
|
1c94df2553 | ||
|
|
43762da9d3 | ||
|
|
266166a2d6 | ||
|
|
3a0af0faae | ||
|
|
0890eaa3fe | ||
|
|
d4058d947b | ||
|
|
b704659899 | ||
|
|
0a9187a6e9 | ||
|
|
31db32e826 | ||
|
|
c2ea650b3c | ||
|
|
969131f00e | ||
|
|
c98090c061 | ||
|
|
3168d3b5e6 | ||
|
|
efcd7d86e7 | ||
|
|
04449923bd | ||
|
|
47b3336ffa | ||
|
|
0f37c1b58e | ||
|
|
a3747725ed | ||
|
|
c448650a60 | ||
|
|
c45f616fdc | ||
|
|
9402691aaa | ||
|
|
cbffbb0be0 | ||
|
|
9df5b17940 | ||
|
|
feae23506b | ||
|
|
6408e59c7c | ||
|
|
47d72680ff | ||
|
|
6513cbb470 | ||
|
|
50b81fe4b9 | ||
|
|
f38c1f6ab4 | ||
|
|
f159611fab | ||
|
|
f1a7231ac2 | ||
|
|
21991a7edb | ||
|
|
3f1b6ddc8f | ||
|
|
aa84813400 | ||
|
|
dd243813e1 | ||
|
|
d8c2933c58 | ||
|
|
2b798511de | ||
|
|
6c37f6e601 | ||
|
|
92e9f3d467 | ||
|
|
05419b8450 | ||
|
|
e215c07439 | ||
|
|
5b7dff7a57 | ||
|
|
1a3aa75385 | ||
|
|
41880778b5 | ||
|
|
ecb4e09ec5 | ||
|
|
d02505852d | ||
|
|
3941dc7537 | ||
|
|
e790c45303 | ||
|
|
ae4e553ddb | ||
|
|
809568280b | ||
|
|
4053c92abf | ||
|
|
56906a29e0 | ||
|
|
2c0ad5bef7 | ||
|
|
4a7939268c | ||
|
|
80266d3071 | ||
|
|
8e5cfccf49 | ||
|
|
dcf64ca167 | ||
|
|
f93fc1506b | ||
|
|
4ee8fb8154 | ||
|
|
446b75907e | ||
|
|
550f1989ff | ||
|
|
91a6f42345 | ||
|
|
e97cae0eb3 | ||
|
|
8640982e68 | ||
|
|
480a853263 | ||
|
|
b05953d960 | ||
|
|
3a0de6a4f1 | ||
|
|
fb9f22c02f | ||
|
|
10ac1000f7 | ||
|
|
c81a0dede2 | ||
|
|
fc8a2b8a42 | ||
|
|
2ae0a72dad | ||
|
|
5b17c72047 | ||
|
|
8d9653dece | ||
|
|
e2b7b26f28 | ||
|
|
ff2eb77fcd | ||
|
|
0588399ac7 | ||
|
|
71544fbf4e | ||
|
|
c8f3820956 | ||
|
|
f57b0726a0 | ||
|
|
da175bca52 | ||
|
|
33cb7f4a2c | ||
|
|
7732447abc | ||
|
|
c49c37999c | ||
|
|
91f35d6a01 | ||
|
|
549df04ed8 | ||
|
|
4334135c52 | ||
|
|
03c4de5590 | ||
|
|
7a109a18af | ||
|
|
d9b72b0f43 | ||
|
|
a7ea54bd7d | ||
|
|
df642b96e2 | ||
|
|
f56cc1f733 | ||
|
|
f5bff4b7f3 | ||
|
|
bbfdf5dd2a | ||
|
|
9b95eda42a | ||
|
|
2d225a3386 | ||
|
|
7b3cdc8f96 | ||
|
|
b6f9500ccc | ||
|
|
ea354e96cb | ||
|
|
098c8908ed | ||
|
|
ab632e36a5 | ||
|
|
1427d20922 | ||
|
|
aed671810c | ||
|
|
324d7d720d | ||
|
|
413e39ecbb | ||
|
|
2ca2c18c2a | ||
|
|
01cd4b2ba0 | ||
|
|
bca210db45 | ||
|
|
66d6f73af2 | ||
|
|
bc8799d7d7 | ||
|
|
fd5c14550a | ||
|
|
a5cca5296c | ||
|
|
f4ef4b79f9 | ||
|
|
6c7a51378f | ||
|
|
9c4908b44a | ||
|
|
afaab8aef2 | ||
|
|
845fdda22c | ||
|
|
fa29a1a99e | ||
|
|
f9bffae9fd | ||
|
|
31c925c602 | ||
|
|
5d310e06ba | ||
|
|
25a16c3379 | ||
|
|
730ed6f75f | ||
|
|
a6601e92aa | ||
|
|
f3a2bb7779 | ||
|
|
73e2d7049a | ||
|
|
a6353944f6 | ||
|
|
43d6088ebb | ||
|
|
e3001794f2 | ||
|
|
e97ca325e6 | ||
|
|
c9c6645284 | ||
|
|
57bb297450 | ||
|
|
06ca99c3a3 | ||
|
|
4b5593c67f | ||
|
|
acb3dc6754 | ||
|
|
4c21a46452 | ||
|
|
900ae2c1fa | ||
|
|
01b6445708 | ||
|
|
292d502205 | ||
|
|
adf2e44a82 | ||
|
|
b075d576a0 | ||
|
|
a7665a3e05 | ||
|
|
d2e40273ae | ||
|
|
d456e68375 | ||
|
|
03efa3ccbc | ||
|
|
2101c8357b | ||
|
|
575963bee7 | ||
|
|
7726001d43 | ||
|
|
e382a4b560 | ||
|
|
70713cc7db | ||
|
|
417090f3fa | ||
|
|
9fcc57cdec | ||
|
|
7bf0c77193 | ||
|
|
f2328f1105 | ||
|
|
d9a2443e53 | ||
|
|
b773898a60 | ||
|
|
8461b2c910 | ||
|
|
9b760dbbab | ||
|
|
8b0747786a | ||
|
|
41235fcb86 | ||
|
|
1d5b4e5b2f | ||
|
|
6e8d1d79d1 | ||
|
|
7cefe91c3c | ||
|
|
1ef6a5542a | ||
|
|
bc0f7def47 | ||
|
|
f0175d1234 | ||
|
|
eb0c4db46d | ||
|
|
19e97ec567 | ||
|
|
ce5c029509 | ||
|
|
647743aa5f | ||
|
|
e94f169d4e | ||
|
|
e6b0525c70 | ||
|
|
23ae11043f | ||
|
|
78657dafca | ||
|
|
0f47eae33a | ||
|
|
2209eac2bf | ||
|
|
aed6d4fbb7 | ||
|
|
270c7abd3c | ||
|
|
e2bd15541b | ||
|
|
9607513e62 | ||
|
|
18730f2a5e | ||
|
|
4e584c2cf0 | ||
|
|
d1619e4f53 | ||
|
|
c8d0a66921 | ||
|
|
dd4d6af185 | ||
|
|
1016e2555a | ||
|
|
657318d4d3 | ||
|
|
f051e05b0a | ||
|
|
ca75513880 | ||
|
|
63f1a10e33 | ||
|
|
14f839c53c | ||
|
|
ebb6847bd1 | ||
|
|
c5d4f4a245 | ||
|
|
a027937ccc | ||
|
|
925075ddaf | ||
|
|
41de208f31 | ||
|
|
c8e3b52160 | ||
|
|
2c53919462 | ||
|
|
a6f3534ff0 | ||
|
|
490f1a6249 | ||
|
|
5b83bfb1db | ||
|
|
1ef06207a4 | ||
|
|
0a6fa202a8 | ||
|
|
18d609ad6d | ||
|
|
c95c501a5b | ||
|
|
8c5da24401 | ||
|
|
01a773ed5a | ||
|
|
2435d132ac | ||
|
|
72c65cbff0 | ||
|
|
97074ccdad | ||
|
|
6111bb9dec | ||
|
|
eed03d38b0 | ||
|
|
e9eb3c32a9 | ||
|
|
61b714c666 | ||
|
|
e9263d25b9 | ||
|
|
d590626017 | ||
|
|
fdd43fc2d9 | ||
|
|
4cbf420b4b | ||
|
|
fd373948d2 | ||
|
|
1dc8a7eca3 | ||
|
|
861cfc23df | ||
|
|
86368e7e07 | ||
|
|
f42184ded8 | ||
|
|
af515732b0 | ||
|
|
98a1573bee | ||
|
|
1762436775 | ||
|
|
4fd017d23d | ||
|
|
2f6ce4783b | ||
|
|
c6296aa17f | ||
|
|
b501ca5a24 | ||
|
|
10ac86b950 | ||
|
|
def097359c | ||
|
|
6c743dad88 | ||
|
|
274047c3f8 | ||
|
|
e04e9aac39 | ||
|
|
59fc9d832b | ||
|
|
0bf5c831d5 | ||
|
|
777a6d4570 | ||
|
|
003ff3d255 | ||
|
|
88040d6b8a | ||
|
|
eaf85ddec9 | ||
|
|
fa2e1e4eda | ||
|
|
5752079cbb | ||
|
|
7014dc5368 | ||
|
|
fdaeb0cf9c | ||
|
|
59415bf49f | ||
|
|
3c3b94921f | ||
|
|
0d9fa24be4 | ||
|
|
9a98ec81d7 | ||
|
|
d0142d6ab6 | ||
|
|
dd440e64da | ||
|
|
a1ba480c8a | ||
|
|
93600d6166 | ||
|
|
33f3ca7fba | ||
|
|
d27e267382 | ||
|
|
91784d87b6 | ||
|
|
2769683521 | ||
|
|
6072e981a8 | ||
|
|
e21677c782 | ||
|
|
168ede9374 | ||
|
|
a0d608e083 | ||
|
|
326740e00f | ||
|
|
eac6e9ed41 | ||
|
|
4ea9a28eee | ||
|
|
ca11b88fcd | ||
|
|
20a0eb9809 | ||
|
|
d8dfe4e4ad | ||
|
|
28666da6a1 | ||
|
|
bb4896f1af | ||
|
|
a17b86dfbe | ||
|
|
d9450c46b9 | ||
|
|
e80c37f857 | ||
|
|
ef44cc5a53 | ||
|
|
7c0d75e34f | ||
|
|
ee812e3fe0 | ||
|
|
52cf9104d9 | ||
|
|
3d091e514d | ||
|
|
3c0ca1f2af | ||
|
|
9a6f5e115d | ||
|
|
731e1ed74f | ||
|
|
eba5648c27 | ||
|
|
d1a31952de | ||
|
|
13a444482a | ||
|
|
9d780bca7a | ||
|
|
b6a80934d6 | ||
|
|
75b5d15598 | ||
|
|
c44b1d730d | ||
|
|
48dc544bef | ||
|
|
31d744195d | ||
|
|
00ea9bf14b | ||
|
|
f3ee9be4cb | ||
|
|
2d6bcf3885 | ||
|
|
d189ddcc86 | ||
|
|
18770aaa63 | ||
|
|
adf0d08585 | ||
|
|
813206393a | ||
|
|
7c0a3dfeb8 | ||
|
|
cd4e6fcdee | ||
|
|
2f9c601ae4 | ||
|
|
bec3db3068 | ||
|
|
cef2745bc0 | ||
|
|
064ef09c99 | ||
|
|
9ca0349c2b | ||
|
|
f9305be450 | ||
|
|
6c9aa15814 | ||
|
|
d09116ebce | ||
|
|
beca90a689 | ||
|
|
e55dd4e3f4 | ||
|
|
02c31ac069 | ||
|
|
3f375c9426 | ||
|
|
258112d6a7 | ||
|
|
ceb0f1005d | ||
|
|
a378faf495 | ||
|
|
c9e99ebbbf | ||
|
|
020f209c45 | ||
|
|
45df3e41c5 | ||
|
|
1a723954fc | ||
|
|
3e554efc70 | ||
|
|
d68da0b8cf | ||
|
|
de7a644656 | ||
|
|
16bcbd1a34 | ||
|
|
29439f8de2 | ||
|
|
97a69cee5a | ||
|
|
2e2dd247ce | ||
|
|
de6054d557 | ||
|
|
db56a7cecb | ||
|
|
f92c1af24a | ||
|
|
4ab71ec942 | ||
|
|
2748661f63 | ||
|
|
aee074b11d | ||
|
|
5f29b8c206 | ||
|
|
92340fd8da | ||
|
|
7c6c4d63c5 | ||
|
|
5d43e33032 | ||
|
|
45a8a3f490 | ||
|
|
bdf55bc674 | ||
|
|
e15c260e56 | ||
|
|
65ed8a817d | ||
|
|
a8d2dfd14f | ||
|
|
e02bf13206 | ||
|
|
4b7d77864a | ||
|
|
72e4d42267 | ||
|
|
1abdd7be10 | ||
|
|
f3d88ca1d1 | ||
|
|
15d89d451f | ||
|
|
4510b82361 | ||
|
|
ae0853ed86 | ||
|
|
76544ff6e1 | ||
|
|
dde96951a7 | ||
|
|
24eb737858 | ||
|
|
ddc7938961 | ||
|
|
4f2dc77ec3 | ||
|
|
678fa52ae1 | ||
|
|
1be97f3d59 | ||
|
|
30ecd7c770 | ||
|
|
0dd27edb91 | ||
|
|
6a44f04b51 | ||
|
|
745134e066 | ||
|
|
72b1a2837d | ||
|
|
e5ab4f13f1 | ||
|
|
14deeef8a7 | ||
|
|
57cc68096b | ||
|
|
7af429150e | ||
|
|
d7ee5cf33d | ||
|
|
a2fb2c05ae | ||
|
|
abd0ac2cc3 | ||
|
|
8c0ef829c9 | ||
|
|
eb1c9175f9 | ||
|
|
f25243e121 | ||
|
|
c1f4352683 | ||
|
|
0797206cc2 | ||
|
|
260b6d02f2 | ||
|
|
0440765cb7 | ||
|
|
40214b72bf | ||
|
|
339a78718d | ||
|
|
f1034d0459 | ||
|
|
edfaf3de49 | ||
|
|
bbec66c2d8 | ||
|
|
339b856d84 | ||
|
|
7560aaee73 | ||
|
|
2bcd4ab159 | ||
|
|
86100936d9 | ||
|
|
37de96ce86 | ||
|
|
e81433f58d | ||
|
|
6219ae782a | ||
|
|
1169e104cb | ||
|
|
87bec99a0a | ||
|
|
5defe574d7 | ||
|
|
59541dfa14 | ||
|
|
becce7afa0 | ||
|
|
862d57d459 | ||
|
|
c9d2a5bee2 | ||
|
|
bb62f49c98 | ||
|
|
b4293d46a6 | ||
|
|
30d534f17e | ||
|
|
d004f3f990 | ||
|
|
62e5faeb0c | ||
|
|
03cfe602d9 | ||
|
|
e1b0c9c756 | ||
|
|
dbe4fc0e45 | ||
|
|
f0bf9c7fc3 | ||
|
|
d0f0be8b03 | ||
|
|
f5e77d7f63 | ||
|
|
277879c11b | ||
|
|
1a4c16659f | ||
|
|
239195c1d1 | ||
|
|
7c4f4c6f36 | ||
|
|
e8447ad9bb | ||
|
|
c55f64fdf2 | ||
|
|
d53e04f4c8 | ||
|
|
b37223b9bb | ||
|
|
d1173ce860 | ||
|
|
df733c9cee | ||
|
|
6054a3ce76 | ||
|
|
3ba8532bdc | ||
|
|
912cf8ee5f | ||
|
|
85eab49b53 | ||
|
|
954677dcbd | ||
|
|
d7c4f57aae | ||
|
|
333d78f338 | ||
|
|
814b2dbda9 | ||
|
|
ebbdfabed6 | ||
|
|
4396ac809b | ||
|
|
c2b9155979 | ||
|
|
f68d65a5ae | ||
|
|
42f267bb50 | ||
|
|
e215f3f5eb | ||
|
|
7ac66faa72 | ||
|
|
d0b870d3a9 | ||
|
|
99ad5c00a7 | ||
|
|
797c46ba7d | ||
|
|
ab0bd59f5e | ||
|
|
0c0973bbd8 | ||
|
|
feca0fb512 | ||
|
|
2f229c3928 | ||
|
|
a730361d6c | ||
|
|
db058d4a81 | ||
|
|
15cf804dbc | ||
|
|
b38b037092 | ||
|
|
42bcad6549 | ||
|
|
b0ea0afd2f | ||
|
|
1d08d75108 | ||
|
|
4daf20483d | ||
|
|
96b6dcec01 | ||
|
|
9fe5a3b407 | ||
|
|
a967d479c5 | ||
|
|
a7d4713393 | ||
|
|
4d4ecae2a1 | ||
|
|
545c3b6678 | ||
|
|
e70f336a09 | ||
|
|
806f1742ac | ||
|
|
0dc63f395d | ||
|
|
616f1a09b1 | ||
|
|
50e69109b6 | ||
|
|
242784d3e4 | ||
|
|
0466fe9301 | ||
|
|
dbf5d8f9bc | ||
|
|
b9e9595e8b | ||
|
|
75de29f5f7 | ||
|
|
e2b24092d6 | ||
|
|
0e6570b09b | ||
|
|
840378ae68 | ||
|
|
9707c1061d | ||
|
|
29cb77ce70 | ||
|
|
f93fa1d705 | ||
|
|
a742b17805 | ||
|
|
c4b65e0e6e | ||
|
|
9ec8232417 | ||
|
|
768e830f11 | ||
|
|
4a4a624b77 | ||
|
|
b13b7ea72e | ||
|
|
9a89cc1198 | ||
|
|
b8eb7b883f | ||
|
|
4f9872c037 | ||
|
|
24e12053ea | ||
|
|
991c85f6a0 | ||
|
|
4880ee9bb6 | ||
|
|
2f77b71933 | ||
|
|
47273eaab6 | ||
|
|
202e6bd654 | ||
|
|
fd41ab93da | ||
|
|
a07fe23d7a | ||
|
|
ef0763fd04 | ||
|
|
b5ef6703fc | ||
|
|
dde25e831f | ||
|
|
8358b5dd24 | ||
|
|
34a9c95b7f | ||
|
|
dd76c92f30 | ||
|
|
70e3ef02a6 | ||
|
|
b159d6a5e1 | ||
|
|
4c2e39bf2c | ||
|
|
4a8f7aa884 | ||
|
|
c8f466cb85 | ||
|
|
2edec1bfa8 | ||
|
|
73acbdd30c | ||
|
|
c07004aefe | ||
|
|
7e8833a215 | ||
|
|
266ac00e56 | ||
|
|
2b3fc741fb | ||
|
|
91389c89a1 | ||
|
|
abb060b272 | ||
|
|
41e6cd8aa9 | ||
|
|
bb5631793c | ||
|
|
f77fc447e0 | ||
|
|
c63d7cb692 | ||
|
|
ac28b91bf6 | ||
|
|
334e7373cd | ||
|
|
b9b6eb99c3 | ||
|
|
463318ac4c | ||
|
|
3ee63d5a99 | ||
|
|
eb01163656 | ||
|
|
2bf844d585 | ||
|
|
585fdd781c | ||
|
|
54f8b5d69a | ||
|
|
fc24552e0e | ||
|
|
be352c2bf1 | ||
|
|
36009cbae1 | ||
|
|
21f9bf530d | ||
|
|
64a82c8d77 | ||
|
|
29edefdfc5 | ||
|
|
7253a5d274 | ||
|
|
ad43cbd70b | ||
|
|
682d6f9ee2 | ||
|
|
1e01a55cdc | ||
|
|
1acb1bb7e6 | ||
|
|
487602c409 | ||
|
|
a7fa90b750 | ||
|
|
0054e637cc | ||
|
|
8c69f1b33c | ||
|
|
870c6382ed | ||
|
|
91770d0477 | ||
|
|
6b81a05341 | ||
|
|
5298a834ef | ||
|
|
6ceddd626a | ||
|
|
a538f36524 | ||
|
|
e3a93db712 | ||
|
|
7cdf55871e | ||
|
|
c78089437d | ||
|
|
ad1e23ce7d | ||
|
|
52d411bd85 | ||
|
|
3aac2bf934 | ||
|
|
e053f7f2f4 | ||
|
|
fb6a7cda70 | ||
|
|
9c20de1adb | ||
|
|
9935b4fd66 | ||
|
|
45ff615b46 | ||
|
|
79e96a6a1a | ||
|
|
497541730f | ||
|
|
101a13c86d | ||
|
|
18cfcc0221 | ||
|
|
8daefd92df | ||
|
|
b580ccfe56 | ||
|
|
d3c2607e53 | ||
|
|
f64cea3fc3 | ||
|
|
7a33fa6817 | ||
|
|
67560db7b8 | ||
|
|
6b7f7c66ec | ||
|
|
79a3b23cec | ||
|
|
ce99362094 | ||
|
|
099fd2b3fb | ||
|
|
abebb4775b | ||
|
|
4752d427e4 | ||
|
|
16a8e6ffe0 | ||
|
|
b8aa9bddf9 | ||
|
|
8e0bc053d4 | ||
|
|
757674a9d6 | ||
|
|
254afc5022 | ||
|
|
56f8d32ca9 | ||
|
|
1f6158ace7 | ||
|
|
4cc842296e | ||
|
|
f6e58be4b0 | ||
|
|
a285bbbd14 | ||
|
|
52c24c5c71 | ||
|
|
64e09b37ac | ||
|
|
f3908bb0b8 | ||
|
|
aab354b72b | ||
|
|
1f1aa85d68 | ||
|
|
2bc0e35f7d | ||
|
|
be501479da | ||
|
|
707d728722 | ||
|
|
ae05059cef | ||
|
|
c1f5741ac0 | ||
|
|
f5bb6e407f | ||
|
|
3548e6da73 | ||
|
|
d2a1db8834 | ||
|
|
0b003bb895 | ||
|
|
ebcd60d0b3 | ||
|
|
a9a31b206b | ||
|
|
a56df823f1 | ||
|
|
fbec4718f8 | ||
|
|
911cca9c99 | ||
|
|
abb021e51e | ||
|
|
03ee7e05d5 | ||
|
|
02426c50cb | ||
|
|
477acddf64 | ||
|
|
1d04ea62ba | ||
|
|
10c1903c72 | ||
|
|
69dfd07a7f | ||
|
|
bc9b923d5c | ||
|
|
fef32fb0d4 | ||
|
|
0e9491a415 | ||
|
|
c7725ddf2a | ||
|
|
5c7ea17abd | ||
|
|
c6a6d057a8 | ||
|
|
ed4fb0695e | ||
|
|
addac8825d | ||
|
|
8e74880b55 | ||
|
|
6891ce95dc | ||
|
|
b7e62d3ca5 | ||
|
|
27a0b8f87a | ||
|
|
21e94ed109 | ||
|
|
0fe5c4f957 | ||
|
|
75f5d59d53 | ||
|
|
1db95bc32b | ||
|
|
93a8933282 | ||
|
|
5a63aaa5ac | ||
|
|
a3eb5e562a | ||
|
|
8a76383eca | ||
|
|
734deeb17c | ||
|
|
f8b4c28278 | ||
|
|
3e179c07bc | ||
|
|
56aae17b46 | ||
|
|
78741846a4 | ||
|
|
55180f5bb3 | ||
|
|
62b884dd42 | ||
|
|
3283018bfb | ||
|
|
55226ada8a | ||
|
|
ff790f7b39 | ||
|
|
899570d213 | ||
|
|
3b2506851c | ||
|
|
9b88059e55 | ||
|
|
59168b2c64 | ||
|
|
47144253e4 | ||
|
|
d8c66077f0 | ||
|
|
59a01137e1 | ||
|
|
ce3804ee04 | ||
|
|
f0bc53ce5a | ||
|
|
b8938e9d4d | ||
|
|
7116d9cedb | ||
|
|
66fb86fd0c | ||
|
|
59cfbb07c8 | ||
|
|
dc5bc3fea8 | ||
|
|
fbbc32422e | ||
|
|
fe8829f324 | ||
|
|
b4036e061a | ||
|
|
4ee9f3563b | ||
|
|
c652a54f59 | ||
|
|
61881477ac | ||
|
|
4373916d9d | ||
|
|
660d7df5ab | ||
|
|
b7e3f627f1 | ||
|
|
ca5d115715 | ||
|
|
21c46852cd | ||
|
|
10036832dd | ||
|
|
25b5ea8b4f | ||
|
|
20beaf7fe1 | ||
|
|
e72af50420 | ||
|
|
ef4417b717 | ||
|
|
cf943627e2 | ||
|
|
96543cb009 | ||
|
|
fbb2207f8c | ||
|
|
cce8a4341b | ||
|
|
b82784ee46 | ||
|
|
6b8959916c | ||
|
|
ecc1830296 | ||
|
|
497916aad7 | ||
|
|
e171a31ac5 | ||
|
|
a9a10aaa20 | ||
|
|
656d079ffc | ||
|
|
d801f699af | ||
|
|
89d01d2c17 | ||
|
|
ec284bc56a | ||
|
|
db2e00d41c | ||
|
|
0a616c9fcb | ||
|
|
fed3cd9e82 | ||
|
|
d0d8a3d4ea | ||
|
|
bdf5f88349 | ||
|
|
809dbe16d6 | ||
|
|
badebfae6b | ||
|
|
6693420005 | ||
|
|
0e3aab8691 | ||
|
|
55840c626c | ||
|
|
f0e5656717 | ||
|
|
8af0e10aa4 | ||
|
|
71f574bc52 | ||
|
|
2518d6138f | ||
|
|
36be084655 | ||
|
|
d863182810 | ||
|
|
85c2bc29e6 | ||
|
|
4eeeb1557a | ||
|
|
dd64f62b2f | ||
|
|
7b84590c71 | ||
|
|
2601b30c7e | ||
|
|
d38f89636a | ||
|
|
caf6c650a6 | ||
|
|
e285628cd7 | ||
|
|
d253580d14 | ||
|
|
4edfafb61f | ||
|
|
c07957d6ec | ||
|
|
423bd70238 | ||
|
|
2fc9e1af58 | ||
|
|
baa6d808c2 | ||
|
|
1e1c26c91a | ||
|
|
eba27a7e05 | ||
|
|
4009267c2b | ||
|
|
8a370c0094 | ||
|
|
abe0701ce7 | ||
|
|
eef6570962 | ||
|
|
a2c7c8f26a | ||
|
|
91ce46f6f3 | ||
|
|
c5ebe75424 | ||
|
|
08161078f4 | ||
|
|
9def55914c | ||
|
|
f044eda079 | ||
|
|
4883b96e0d | ||
|
|
ca6a1aac2b | ||
|
|
cc3f6c5ca9 | ||
|
|
cacdaa0067 | ||
|
|
016e2aec8e | ||
|
|
9c5416d598 | ||
|
|
5f50bc6380 | ||
|
|
e44aef6d5a | ||
|
|
2ff904915e | ||
|
|
565c04b989 | ||
|
|
7dfc8fd446 | ||
|
|
f96dc97c4f | ||
|
|
40163c737c | ||
|
|
6327b8d15a | ||
|
|
3053cc0de4 | ||
|
|
0b89e34439 | ||
|
|
c5bf60eab4 | ||
|
|
bdbb852163 | ||
|
|
4a11f126cd | ||
|
|
03f736607b | ||
|
|
5aa3a288dc | ||
|
|
ddf566a3c4 | ||
|
|
d50ea010ef | ||
|
|
9678a412e2 | ||
|
|
46f4ea7ed7 | ||
|
|
e3b1c2dea0 | ||
|
|
5cbac5bf23 | ||
|
|
7050b97d94 | ||
|
|
23e9947f7a | ||
|
|
fc605d2561 | ||
|
|
ab4c929a07 | ||
|
|
c251ab5092 | ||
|
|
57258dc1d4 | ||
|
|
f1df49ad17 | ||
|
|
9d8e7371fb | ||
|
|
84a1b394a1 | ||
|
|
4ea8b91e0b | ||
|
|
8e1e0fc344 | ||
|
|
7186d0ce55 | ||
|
|
6393789345 | ||
|
|
2a5c2aa404 | ||
|
|
d0210c1a97 | ||
|
|
691c107ce9 | ||
|
|
5b4924c76e | ||
|
|
a292d21b6c | ||
|
|
576cd87a5b | ||
|
|
e74ed92993 | ||
|
|
eeed3d605b | ||
|
|
a3037a6dd1 | ||
|
|
207fdd4a34 | ||
|
|
cb242318d4 | ||
|
|
29cd09a6ca | ||
|
|
54fc2daa46 | ||
|
|
a4cc394c22 | ||
|
|
0a0bcf65ad | ||
|
|
d36f544069 | ||
|
|
d99c0ad384 | ||
|
|
387b53977d | ||
|
|
c63e5f755f | ||
|
|
7476419940 | ||
|
|
25ad3486a4 | ||
|
|
9198de7d45 | ||
|
|
88b2b6cb83 | ||
|
|
8a0b1ceb4c | ||
|
|
54d18c0196 | ||
|
|
e24f0a77c4 | ||
|
|
7fc9a807a0 | ||
|
|
fdfde62a33 | ||
|
|
4366687b95 | ||
|
|
f28fed51da | ||
|
|
2b940f6aba | ||
|
|
f42682711b | ||
|
|
ad159d3ebd | ||
|
|
faa3e2d04d | ||
|
|
604a79ad98 | ||
|
|
ce0c6b8d9f | ||
|
|
9552ec89fb | ||
|
|
3a7c1e7b6c | ||
|
|
6980256a42 | ||
|
|
3f2dcf1698 | ||
|
|
44097c1b37 | ||
|
|
551b188c01 | ||
|
|
3a786542c4 | ||
|
|
bb2df9b2c6 | ||
|
|
7d1e149905 | ||
|
|
1dcd52838b |
35
.cvsignore
35
.cvsignore
@@ -1,35 +0,0 @@
|
|||||||
Makefile
|
|
||||||
Makefile.in
|
|
||||||
aclocal.m4
|
|
||||||
confdefs.h
|
|
||||||
config.cache
|
|
||||||
config.guess
|
|
||||||
config.h
|
|
||||||
config.log
|
|
||||||
config.status
|
|
||||||
config.sub
|
|
||||||
configure
|
|
||||||
configure.scan
|
|
||||||
libtool
|
|
||||||
ltconfig
|
|
||||||
ltmain.sh
|
|
||||||
stamp-h
|
|
||||||
stamp-h.in
|
|
||||||
stamp-h1
|
|
||||||
stamp.h
|
|
||||||
version.h
|
|
||||||
config.h.in
|
|
||||||
install-sh
|
|
||||||
missing
|
|
||||||
mkinstalldirs
|
|
||||||
INSTALL
|
|
||||||
intl
|
|
||||||
ABOUT-NLS
|
|
||||||
COPYING
|
|
||||||
intltool-*
|
|
||||||
metacity.spec
|
|
||||||
autom4te.cache
|
|
||||||
compile
|
|
||||||
depcomp
|
|
||||||
omf.make
|
|
||||||
xmldocs.make
|
|
||||||
40
.gitignore
vendored
40
.gitignore
vendored
@@ -3,6 +3,7 @@ Makefile.in
|
|||||||
Makefile.in.in
|
Makefile.in.in
|
||||||
aclocal.m4
|
aclocal.m4
|
||||||
autom4te.cache
|
autom4te.cache
|
||||||
|
build-aux
|
||||||
compile
|
compile
|
||||||
config.guess
|
config.guess
|
||||||
config.h
|
config.h
|
||||||
@@ -19,11 +20,11 @@ libtool
|
|||||||
ltmain.sh
|
ltmain.sh
|
||||||
missing
|
missing
|
||||||
.deps
|
.deps
|
||||||
src/50-mutter-navigation.xml
|
50-mutter-navigation.xml
|
||||||
src/50-mutter-system.xml
|
50-mutter-system.xml
|
||||||
src/50-mutter-windows.xml
|
50-mutter-windows.xml
|
||||||
src/mutter-wm.desktop
|
mutter.desktop
|
||||||
src/mutter-wayland.desktop
|
mutter-wayland.desktop
|
||||||
*.o
|
*.o
|
||||||
*.a
|
*.a
|
||||||
*.lo
|
*.lo
|
||||||
@@ -32,10 +33,6 @@ src/mutter-wayland.desktop
|
|||||||
*.swp
|
*.swp
|
||||||
*.gir
|
*.gir
|
||||||
*.typelib
|
*.typelib
|
||||||
tidy-enum-types.[ch]
|
|
||||||
tidy-marshal.[ch]
|
|
||||||
stamp-tidy-enum-types.h
|
|
||||||
stamp-tidy-marshal.h
|
|
||||||
stamp-h1
|
stamp-h1
|
||||||
*.gmo
|
*.gmo
|
||||||
*.make
|
*.make
|
||||||
@@ -44,11 +41,9 @@ stamp-it
|
|||||||
.intltool-merge-cache
|
.intltool-merge-cache
|
||||||
POTFILES
|
POTFILES
|
||||||
po/*.pot
|
po/*.pot
|
||||||
50-metacity-desktop-key.xml
|
libmutter.pc
|
||||||
50-metacity-key.xml
|
mutter
|
||||||
libmutter-wayland.pc
|
mutter-restart-helper
|
||||||
mutter-wayland
|
|
||||||
mutter-launch
|
|
||||||
org.gnome.mutter.gschema.valid
|
org.gnome.mutter.gschema.valid
|
||||||
org.gnome.mutter.gschema.xml
|
org.gnome.mutter.gschema.xml
|
||||||
org.gnome.mutter.wayland.gschema.valid
|
org.gnome.mutter.wayland.gschema.valid
|
||||||
@@ -56,19 +51,7 @@ org.gnome.mutter.wayland.gschema.xml
|
|||||||
testasyncgetprop
|
testasyncgetprop
|
||||||
testboxes
|
testboxes
|
||||||
testgradient
|
testgradient
|
||||||
mutter-grayscale
|
m4/*
|
||||||
mutter-mag
|
|
||||||
mutter-message
|
|
||||||
mutter-window-demo
|
|
||||||
focus-window
|
|
||||||
test-attached
|
|
||||||
test-focus
|
|
||||||
test-gravity
|
|
||||||
test-resizing
|
|
||||||
test-size-hints
|
|
||||||
# We can't say just "wm-tester" here or it will ignore the directory
|
|
||||||
# rather than the binary
|
|
||||||
src/wm-tester/wm-tester
|
|
||||||
INSTALL
|
INSTALL
|
||||||
mkinstalldirs
|
mkinstalldirs
|
||||||
src/mutter-enum-types.[ch]
|
src/mutter-enum-types.[ch]
|
||||||
@@ -77,13 +60,14 @@ src/mutter-marshal.[ch]
|
|||||||
src/stamp-mutter-marshal.h
|
src/stamp-mutter-marshal.h
|
||||||
src/meta-dbus-display-config.[ch]
|
src/meta-dbus-display-config.[ch]
|
||||||
src/meta-dbus-idle-monitor.[ch]
|
src/meta-dbus-idle-monitor.[ch]
|
||||||
src/mutter-plugins.pc
|
src/meta-dbus-login1.[ch]
|
||||||
src/gtk-shell-protocol.c
|
src/gtk-shell-protocol.c
|
||||||
src/gtk-shell-server-protocol.h
|
src/gtk-shell-server-protocol.h
|
||||||
src/xdg-shell-protocol.c
|
src/xdg-shell-protocol.c
|
||||||
src/xdg-shell-server-protocol.h
|
src/xdg-shell-server-protocol.h
|
||||||
src/xserver-protocol.c
|
src/xserver-protocol.c
|
||||||
src/xserver-server-protocol.h
|
src/xserver-server-protocol.h
|
||||||
|
src/meta/meta-version.h
|
||||||
doc/reference/*.args
|
doc/reference/*.args
|
||||||
doc/reference/*.bak
|
doc/reference/*.bak
|
||||||
doc/reference/*.hierarchy
|
doc/reference/*.hierarchy
|
||||||
|
|||||||
15
Makefile.am
15
Makefile.am
@@ -1,8 +1,13 @@
|
|||||||
|
|
||||||
SUBDIRS=src po doc
|
SUBDIRS = data src po doc
|
||||||
|
|
||||||
DISTCLEANFILES = intltool-extract intltool-merge intltool-update po/stamp-it po/.intltool-merge-cache
|
|
||||||
|
|
||||||
DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc
|
|
||||||
|
|
||||||
ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS}
|
ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS}
|
||||||
|
|
||||||
|
DISTCLEANFILES = \
|
||||||
|
intltool-extract \
|
||||||
|
intltool-merge \
|
||||||
|
intltool-update \
|
||||||
|
po/stamp-it \
|
||||||
|
po/.intltool-merge-cache
|
||||||
|
|
||||||
|
DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc
|
||||||
|
|||||||
107
NEWS
107
NEWS
@@ -1,3 +1,110 @@
|
|||||||
|
3.13.90
|
||||||
|
=======
|
||||||
|
* Only call XSync() once per frame [Rui; #728464]
|
||||||
|
* Update capabilities on device list changes [Carlos; #733563]
|
||||||
|
* Make use of GLSL optional [Adel; #733623]
|
||||||
|
* Handle gestures and touch events on wayland [Carlos; #733631]
|
||||||
|
* Add support for unminimize compositor effects [Cosimo; #733789]
|
||||||
|
* Always set the frame background to None [Giovanni; #734054]
|
||||||
|
* Add backend methods to handle keymaps [Rui; #734301]
|
||||||
|
* Actually mark revalidated MetaTextureTower levels as valid [Owen; #734400]
|
||||||
|
* Rely on explicit -backward switcher keybindings instead of <shift>-magic
|
||||||
|
[Christophe; #732295, #732385]
|
||||||
|
* Misc. bug fixes and cleanups [Rui, Adel, Christophe; #727178, #734852,
|
||||||
|
#734960]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Emmanuele Bassi, Giovanni Campagna, Cosimo Cecchi, Piotr Drąg,
|
||||||
|
Christophe Fergeau, Adel Gadllah, Carlos Garnacho, Rui Matos,
|
||||||
|
Florian Müllner, Jasper St. Pierre, Rico Tzschichholz, Olav Vitters,
|
||||||
|
Owen W. Taylor
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Kjartan Maraas [nb], Inaki Larranaga Murgoitio [eu], Lasse Liehu [fi],
|
||||||
|
ngoswami [as], Daniel Mustieles [es]
|
||||||
|
|
||||||
|
3.13.4
|
||||||
|
======
|
||||||
|
* Fix move/resize operations for wayland clients [Marek; #731237]
|
||||||
|
* Add ::first-frame signal to MetaWindowActor [Owen; #732343]
|
||||||
|
* Handle keysyms without the XF86 prefix [Owen; #727993]
|
||||||
|
* Add touch gesture support [Carlos]
|
||||||
|
* Fix a deadlock when exiting [Owen; #733068]
|
||||||
|
* Add framework for restarting the compositor with nice visuals
|
||||||
|
[Owen; #733026]
|
||||||
|
* Toggle seat capabilities on VT switch [Carlos; #733563]
|
||||||
|
* Misc bug fixes [Florian, Owen; #732695, #732350]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Tom Beckmann, Giovanni Campagna, Marek Chalupa, Adel Gadllah,
|
||||||
|
Carlos Garnacho, Florian Müllner, Jasper St. Pierre, Rico Tzschichholz,
|
||||||
|
Owen W. Taylor
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Yuri Myasoedov [ru], Fran Diéguez [gl], Aurimas Černius [lt], MarMav [el],
|
||||||
|
Enrico Nicoletto [pt_BR]
|
||||||
|
|
||||||
|
3.13.3
|
||||||
|
======
|
||||||
|
* Improve behavior of window buttons with compositor menus [Florian; #731058]
|
||||||
|
* Implement touch support on wayland [Carlos; #724442]
|
||||||
|
* Update window shadows [Nikita; #731866]
|
||||||
|
* Keep windows on the preferred output [Florian; #731760]
|
||||||
|
* Misc bug fixes [Jonas, Florian, Jasper; #729601, #730681, #731353, #731332,
|
||||||
|
#730527, #662962]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Jonas Ådahl, Nikita Churaev, Carlos Garnacho, Florian Müllner,
|
||||||
|
Jasper St. Pierre, Rico Tzschichholz
|
||||||
|
|
||||||
|
3.13.2
|
||||||
|
======
|
||||||
|
* Add basic HiDPI support on wayland [Adel; #728902]
|
||||||
|
* Fix crash when monitors change during suspend [Giovanni; #725637]
|
||||||
|
* Replace mutter-launch with logind integration [Jasper; #724604]
|
||||||
|
* Move window menu into the compositor [Jasper; #726352]
|
||||||
|
* Fix delayed focus-follows-mouse support [Florian; #730541]
|
||||||
|
* Support fallback app menu in window decorations [Florian; #730752]
|
||||||
|
* Misc. bug fixes and cleanups [Giovanni, Jonas, Jasper; #729732, #729602,
|
||||||
|
#726714]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Jonas Ådahl, Giovanni Campagna, Adel Gadllah, Florian Müllner,
|
||||||
|
Jasper St. Pierre, Rico Tzschichholz
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Pau Iranzo [ca], Daniel Mustieles [es]
|
||||||
|
|
||||||
|
3.13.1
|
||||||
|
======
|
||||||
|
* Fix opacity values from _NET_WM_WINDOW_OPACITY [Nirbheek; #727874]
|
||||||
|
* Merge wayland branch [Jasper, Giovanni, Robert B., Neil, Adel, Rui, Jonas,
|
||||||
|
Lionel, Tim, Owen, Florian, Colin W., Cosimo, Ray, Kalev, Pavel, Robert A.,
|
||||||
|
Magdalen, Marek, Matthias, Alban, Seán, Daniel, Stefano, Carlos, Colin G.,
|
||||||
|
Andreas, Alexander, Ryan, Marc-André, Asad, Alberto, Bastien, Hans,
|
||||||
|
Debarshi, Sindhu, Andika, Rico, Olav]
|
||||||
|
* Don't prevent workspace switches for present_with_time() [Florian; #728018]
|
||||||
|
* Add shortcuts for switching to the last workspace [Elad; #659288]
|
||||||
|
* Make move/resize menu items behave like the keybindings [Jasper; #728617]
|
||||||
|
* Misc. bug fixes and cleanups [Jasper, Bastien, Florian, Adel; #720631,
|
||||||
|
#727979, #728423, #728395, #729044]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Jonas Ådahl, Elad Alfassa, Robert Ancell, Magdalen Berns, Robert Bragg,
|
||||||
|
Giovanni Campagna, Cosimo Cecchi, Marek Chalupa, Nirbheek Chauhan,
|
||||||
|
Matthias Clasen, Alban Crequy, Seán de Búrca, Daniel Drake, Jason Ekstrand,
|
||||||
|
Stefano Facchini, Adel Gadllah, Carlos Garnacho, Colin Guthrie,
|
||||||
|
Andreas Heider, Lionel Landwerlin, Alexander Larsson, Kalev Lember,
|
||||||
|
Ryan Lortie, Tim Lunn, Marc-André Lureau, Rui Matos, Asad Mehmood,
|
||||||
|
Alberto Milone, Florian Müllner, Bastien Nocera, Hans Petter Jansson,
|
||||||
|
Debarshi Ray, Neil Roberts, Sindhu S, Jasper St. Pierre, Ray Strode,
|
||||||
|
Andika Triwidada, Rico Tzschichholz, Pavel Vasin, Olav Vitters,
|
||||||
|
Colin Walters, A. Walton, Owen W. Taylor
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Inaki Larranaga Murgoitio [eu], marablack3 [el], Daniel Mustieles [es],
|
||||||
|
Fran Diéguez [gl], Yosef Or Boczko [he], Dirgita [id]
|
||||||
|
|
||||||
3.12.0
|
3.12.0
|
||||||
======
|
======
|
||||||
* Fix grab issue with SSD xwayland windows [Rui; #726123]
|
* Fix grab issue with SSD xwayland windows [Rui; #726123]
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ srcdir=`dirname $0`
|
|||||||
test -z "$srcdir" && srcdir=.
|
test -z "$srcdir" && srcdir=.
|
||||||
|
|
||||||
PKG_NAME="mutter"
|
PKG_NAME="mutter"
|
||||||
REQUIRED_AUTOMAKE_VERSION=1.10
|
REQUIRED_AUTOMAKE_VERSION=1.11
|
||||||
|
|
||||||
(test -f $srcdir/configure.ac \
|
(test -f $srcdir/configure.ac \
|
||||||
&& test -d $srcdir/src) || {
|
&& test -d $srcdir/src) || {
|
||||||
|
|||||||
176
configure.ac
176
configure.ac
@@ -1,9 +1,8 @@
|
|||||||
AC_PREREQ(2.50)
|
AC_PREREQ(2.62)
|
||||||
AC_CONFIG_MACRO_DIR([m4])
|
|
||||||
|
|
||||||
m4_define([mutter_major_version], [3])
|
m4_define([mutter_major_version], [3])
|
||||||
m4_define([mutter_minor_version], [12])
|
m4_define([mutter_minor_version], [13])
|
||||||
m4_define([mutter_micro_version], [0])
|
m4_define([mutter_micro_version], [90])
|
||||||
|
|
||||||
m4_define([mutter_version],
|
m4_define([mutter_version],
|
||||||
[mutter_major_version.mutter_minor_version.mutter_micro_version])
|
[mutter_major_version.mutter_minor_version.mutter_micro_version])
|
||||||
@@ -13,6 +12,8 @@ m4_define([mutter_plugin_api_version], [3])
|
|||||||
AC_INIT([mutter], [mutter_version],
|
AC_INIT([mutter], [mutter_version],
|
||||||
[http://bugzilla.gnome.org/enter_bug.cgi?product=mutter])
|
[http://bugzilla.gnome.org/enter_bug.cgi?product=mutter])
|
||||||
|
|
||||||
|
AC_CONFIG_MACRO_DIR([m4])
|
||||||
|
AC_CONFIG_AUX_DIR([build-aux])
|
||||||
AC_CONFIG_SRCDIR(src/core/display.c)
|
AC_CONFIG_SRCDIR(src/core/display.c)
|
||||||
AC_CONFIG_HEADERS(config.h)
|
AC_CONFIG_HEADERS(config.h)
|
||||||
|
|
||||||
@@ -20,10 +21,6 @@ AM_INIT_AUTOMAKE([1.11 foreign no-dist-gzip dist-xz tar-ustar subdir-objects])
|
|||||||
m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])],)
|
m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])],)
|
||||||
AM_MAINTAINER_MODE([enable])
|
AM_MAINTAINER_MODE([enable])
|
||||||
|
|
||||||
# Change pkglibdir and pkgdatadir to mutter-wayland instead of mutter
|
|
||||||
PACKAGE="mutter-wayland"
|
|
||||||
AC_SUBST([PACKAGE], [$PACKAGE])
|
|
||||||
|
|
||||||
MUTTER_MAJOR_VERSION=mutter_major_version
|
MUTTER_MAJOR_VERSION=mutter_major_version
|
||||||
MUTTER_MINOR_VERSION=mutter_minor_version
|
MUTTER_MINOR_VERSION=mutter_minor_version
|
||||||
MUTTER_MICRO_VERSION=mutter_micro_version
|
MUTTER_MICRO_VERSION=mutter_micro_version
|
||||||
@@ -39,16 +36,18 @@ AC_SUBST(MUTTER_PLUGIN_DIR)
|
|||||||
# Honor aclocal flags
|
# Honor aclocal flags
|
||||||
AC_SUBST(ACLOCAL_AMFLAGS, "\${ACLOCAL_FLAGS}")
|
AC_SUBST(ACLOCAL_AMFLAGS, "\${ACLOCAL_FLAGS}")
|
||||||
|
|
||||||
GETTEXT_PACKAGE=mutter-wayland
|
GETTEXT_PACKAGE=mutter
|
||||||
AC_SUBST(GETTEXT_PACKAGE)
|
AC_SUBST(GETTEXT_PACKAGE)
|
||||||
AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE",[Name of default gettext domain])
|
AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE",[Name of default gettext domain])
|
||||||
|
|
||||||
IT_PROG_INTLTOOL([0.34.90])
|
LT_PREREQ([2.2.6])
|
||||||
|
LT_INIT([disable-static])
|
||||||
|
IT_PROG_INTLTOOL([0.41])
|
||||||
AC_PROG_CC
|
AC_PROG_CC
|
||||||
AC_ISC_POSIX
|
AC_PROG_CC_C_O
|
||||||
|
AC_PROG_INSTALL
|
||||||
AC_HEADER_STDC
|
AC_HEADER_STDC
|
||||||
AC_LIBTOOL_WIN32_DLL
|
PKG_PROG_PKG_CONFIG([0.21])
|
||||||
AM_PROG_LIBTOOL
|
|
||||||
|
|
||||||
# Sets GLIB_GENMARSHAL and GLIB_MKENUMS
|
# Sets GLIB_GENMARSHAL and GLIB_MKENUMS
|
||||||
AM_PATH_GLIB_2_0()
|
AM_PATH_GLIB_2_0()
|
||||||
@@ -72,16 +71,29 @@ CANBERRA_GTK_VERSION=0.26
|
|||||||
CLUTTER_PACKAGE=clutter-1.0
|
CLUTTER_PACKAGE=clutter-1.0
|
||||||
|
|
||||||
MUTTER_PC_MODULES="
|
MUTTER_PC_MODULES="
|
||||||
gtk+-3.0 >= 3.3.7
|
gtk+-3.0 >= 3.9.11
|
||||||
gio-2.0 >= 2.25.10
|
gio-unix-2.0 >= 2.25.10
|
||||||
pango >= 1.2.0
|
pango >= 1.2.0
|
||||||
cairo >= 1.10.0
|
cairo >= 1.10.0
|
||||||
gsettings-desktop-schemas >= 3.7.3
|
gsettings-desktop-schemas >= 3.7.3
|
||||||
xcomposite >= 0.2 xfixes xrender xdamage xi >= 1.6.0
|
$CLUTTER_PACKAGE >= 1.19.5
|
||||||
$CLUTTER_PACKAGE >= 1.17.5
|
clutter-egl-1.0
|
||||||
cogl-1.0 >= 1.17.1
|
cogl-1.0 >= 1.17.1
|
||||||
|
gbm
|
||||||
upower-glib >= 0.99.0
|
upower-glib >= 0.99.0
|
||||||
gnome-desktop-3.0
|
gnome-desktop-3.0
|
||||||
|
xcomposite >= 0.2
|
||||||
|
xcursor
|
||||||
|
xdamage
|
||||||
|
xext
|
||||||
|
xfixes
|
||||||
|
xi >= 1.6.0
|
||||||
|
xkbfile
|
||||||
|
xkeyboard-config
|
||||||
|
xkbcommon >= 0.4.3
|
||||||
|
xkbcommon-x11
|
||||||
|
x11-xcb
|
||||||
|
xcb-randr
|
||||||
"
|
"
|
||||||
|
|
||||||
GLIB_GSETTINGS
|
GLIB_GSETTINGS
|
||||||
@@ -110,37 +122,12 @@ AC_ARG_WITH(libcanberra,
|
|||||||
[disable the use of libcanberra for playing sounds]),,
|
[disable the use of libcanberra for playing sounds]),,
|
||||||
with_libcanberra=auto)
|
with_libcanberra=auto)
|
||||||
|
|
||||||
AC_ARG_ENABLE(xsync,
|
|
||||||
AC_HELP_STRING([--disable-xsync],
|
|
||||||
[disable mutter's use of the XSync extension]),,
|
|
||||||
enable_xsync=auto)
|
|
||||||
|
|
||||||
AC_ARG_ENABLE(shape,
|
|
||||||
AC_HELP_STRING([--disable-shape],
|
|
||||||
[disable mutter's use of the shaped window extension]),,
|
|
||||||
enable_shape=auto)
|
|
||||||
|
|
||||||
## Wayland support requires the xserver.xml protocol extension found in the weston
|
|
||||||
## repository but since there aren't currently established conventions for
|
|
||||||
## installing and discovering these we simply require a location to be given
|
|
||||||
## explicitly...
|
|
||||||
AC_ARG_WITH([wayland-protocols],
|
|
||||||
[AS_HELP_STRING([--with-wayland-protocols], [Location for wayland extension protocol specs])],
|
|
||||||
[
|
|
||||||
],
|
|
||||||
[])
|
|
||||||
|
|
||||||
AC_ARG_WITH([xwayland-path],
|
AC_ARG_WITH([xwayland-path],
|
||||||
[AS_HELP_STRING([--with-xwayland-path], [Absolute path for an X Wayland server])],
|
[AS_HELP_STRING([--with-xwayland-path], [Absolute path for an X Wayland server])],
|
||||||
[XWAYLAND_PATH="$withval"],
|
[XWAYLAND_PATH="$withval"],
|
||||||
[XWAYLAND_PATH="$bindir/Xwayland"])
|
[XWAYLAND_PATH="$bindir/Xwayland"])
|
||||||
|
|
||||||
AM_GLIB_GNU_GETTEXT
|
|
||||||
|
|
||||||
## here we get the flags we'll actually use
|
## here we get the flags we'll actually use
|
||||||
# GRegex requires Glib-2.14.0
|
|
||||||
PKG_CHECK_MODULES(ALL, glib-2.0 >= 2.14.0)
|
|
||||||
PKG_CHECK_MODULES(MUTTER_LAUNCH, libdrm libsystemd-login)
|
|
||||||
|
|
||||||
# Unconditionally use this dir to avoid a circular dep with gnomecc
|
# Unconditionally use this dir to avoid a circular dep with gnomecc
|
||||||
GNOME_KEYBINDINGS_KEYSDIR="${datadir}/gnome-control-center/keybindings"
|
GNOME_KEYBINDINGS_KEYSDIR="${datadir}/gnome-control-center/keybindings"
|
||||||
@@ -205,17 +192,27 @@ if test x$found_introspection != xno; then
|
|||||||
AC_SUBST(META_GIR)
|
AC_SUBST(META_GIR)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
MUTTER_PC_MODULES="$MUTTER_PC_MODULES xcursor"
|
|
||||||
|
|
||||||
AC_PATH_PROG([WAYLAND_SCANNER],[wayland-scanner],[no])
|
|
||||||
AS_IF([test "x$WAYLAND_SCANNER" = "xno"],
|
|
||||||
AC_MSG_ERROR([Could not find wayland-scanner in your PATH, required for parsing wayland extension protocols]))
|
|
||||||
AC_SUBST([WAYLAND_SCANNER])
|
|
||||||
AC_SUBST(XWAYLAND_PATH)
|
AC_SUBST(XWAYLAND_PATH)
|
||||||
|
|
||||||
MUTTER_PC_MODULES="$MUTTER_PC_MODULES clutter-wayland-1.0 clutter-wayland-compositor-1.0 clutter-egl-1.0 wayland-server libdrm"
|
|
||||||
PKG_CHECK_MODULES(MUTTER, $MUTTER_PC_MODULES)
|
PKG_CHECK_MODULES(MUTTER, $MUTTER_PC_MODULES)
|
||||||
|
|
||||||
|
PKG_CHECK_MODULES(MUTTER_NATIVE_BACKEND, [libdrm libsystemd libinput], [have_native_backend=yes], [have_native_backend=no])
|
||||||
|
if test $have_native_backend = yes; then
|
||||||
|
AC_DEFINE([HAVE_NATIVE_BACKEND],[1],[Define if you want to enable the native (KMS) backend based on systemd])
|
||||||
|
fi
|
||||||
|
AM_CONDITIONAL([HAVE_NATIVE_BACKEND],[test $have_native_backend = yes])
|
||||||
|
|
||||||
|
PKG_CHECK_MODULES(MUTTER_WAYLAND, [clutter-wayland-1.0 clutter-wayland-compositor-1.0 wayland-server >= 1.5.90], [have_wayland=yes], [have_wayland=no])
|
||||||
|
if test $have_wayland = yes; then
|
||||||
|
AC_PATH_PROG([WAYLAND_SCANNER],[wayland-scanner],[no])
|
||||||
|
AS_IF([test $WAYLAND_SCANNER = "no"],
|
||||||
|
AC_MSG_ERROR([Could not find wayland-scanner in your PATH, required for parsing wayland extension protocols]))
|
||||||
|
AC_SUBST([WAYLAND_SCANNER])
|
||||||
|
|
||||||
|
AC_DEFINE([HAVE_WAYLAND],[1],[Define if you want to enable Wayland support])
|
||||||
|
fi
|
||||||
|
AM_CONDITIONAL([HAVE_WAYLAND],[test $have_wayland = yes])
|
||||||
|
|
||||||
PKG_CHECK_EXISTS([xi >= 1.6.99.1],
|
PKG_CHECK_EXISTS([xi >= 1.6.99.1],
|
||||||
AC_DEFINE([HAVE_XI23],[1],[Define if you have support for XInput 2.3 or greater]))
|
AC_DEFINE([HAVE_XI23],[1],[Define if you have support for XInput 2.3 or greater]))
|
||||||
|
|
||||||
@@ -252,38 +249,8 @@ if test x$have_xinerama = xno; then
|
|||||||
AC_MSG_ERROR([Xinerama extension was not found])
|
AC_MSG_ERROR([Xinerama extension was not found])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
SHAPE_LIBS=
|
AC_DEFINE_UNQUOTED([XKB_BASE], ["`$PKG_CONFIG --variable xkb_base xkeyboard-config`"],
|
||||||
found_shape=no
|
[XKB base dir])
|
||||||
AC_CHECK_LIB(Xext, XShapeQueryExtension,
|
|
||||||
[AC_CHECK_HEADER(X11/extensions/shape.h,
|
|
||||||
SHAPE_LIBS=-lXext found_shape=yes)],
|
|
||||||
, $ALL_X_LIBS)
|
|
||||||
|
|
||||||
if test x$enable_shape = xno; then
|
|
||||||
found_shape=no
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test x$enable_shape = xyes; then
|
|
||||||
if test "$found_shape" = "no"; then
|
|
||||||
AC_MSG_ERROR([--enable-shape forced and Shape not found])
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "x$found_shape" = "xyes"; then
|
|
||||||
AC_DEFINE(HAVE_SHAPE, , [Have the shape extension library])
|
|
||||||
fi
|
|
||||||
|
|
||||||
found_xkb=no
|
|
||||||
AC_CHECK_LIB(X11, XkbQueryExtension,
|
|
||||||
[AC_CHECK_HEADER(X11/XKBlib.h,
|
|
||||||
found_xkb=yes)],
|
|
||||||
, $ALL_X_LIBS)
|
|
||||||
|
|
||||||
if test "x$found_xkb" = "xyes"; then
|
|
||||||
AC_DEFINE(HAVE_XKB, , [Have keyboard extension library])
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
RANDR_LIBS=
|
RANDR_LIBS=
|
||||||
found_randr=no
|
found_randr=no
|
||||||
@@ -291,37 +258,13 @@ AC_CHECK_LIB(Xrandr, XRRUpdateConfiguration,
|
|||||||
[AC_CHECK_HEADER(X11/extensions/Xrandr.h,
|
[AC_CHECK_HEADER(X11/extensions/Xrandr.h,
|
||||||
RANDR_LIBS=-lXrandr found_randr=yes,,
|
RANDR_LIBS=-lXrandr found_randr=yes,,
|
||||||
[#include <X11/Xlib.h>])],
|
[#include <X11/Xlib.h>])],
|
||||||
, -lXrender -lXext $ALL_X_LIBS)
|
, -lXext $ALL_X_LIBS)
|
||||||
|
|
||||||
if test "x$found_randr" = "xyes"; then
|
if test "x$found_randr" = "xyes"; then
|
||||||
AC_DEFINE(HAVE_RANDR, , [Have the Xrandr extension library])
|
AC_DEFINE(HAVE_RANDR, , [Have the Xrandr extension library])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
XSYNC_LIBS=
|
MUTTER_LIBS="$MUTTER_LIBS $RANDR_LIBS $X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS -lm"
|
||||||
found_xsync=no
|
|
||||||
AC_CHECK_LIB(Xext, XSyncQueryExtension,
|
|
||||||
[AC_CHECK_HEADER(X11/extensions/sync.h,
|
|
||||||
found_xsync=yes,,
|
|
||||||
[#include <X11/Xlib.h>])],
|
|
||||||
, $ALL_X_LIBS)
|
|
||||||
|
|
||||||
if test x$enable_xsync = xno; then
|
|
||||||
found_xsync=no
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test x$enable_xsync = xyes; then
|
|
||||||
if test "$found_xsync" = "no"; then
|
|
||||||
AC_MSG_ERROR([--enable-xsync forced and XSync not found])
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "x$found_xsync" = "xyes"; then
|
|
||||||
XSYNC_LIBS=-lXext
|
|
||||||
AC_DEFINE(HAVE_XSYNC, , [Have the Xsync extension library])
|
|
||||||
fi
|
|
||||||
|
|
||||||
MUTTER_LIBS="$MUTTER_LIBS $XSYNC_LIBS $RANDR_LIBS $SHAPE_LIBS $X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS -lm"
|
|
||||||
|
|
||||||
found_sm=no
|
found_sm=no
|
||||||
case "$MUTTER_LIBS" in
|
case "$MUTTER_LIBS" in
|
||||||
@@ -353,17 +296,6 @@ fi
|
|||||||
|
|
||||||
AM_CONDITIONAL(HAVE_SM, test "$found_sm" = "yes")
|
AM_CONDITIONAL(HAVE_SM, test "$found_sm" = "yes")
|
||||||
|
|
||||||
HOST_ALIAS=$host_alias
|
|
||||||
AC_SUBST(HOST_ALIAS)
|
|
||||||
|
|
||||||
AC_PATH_PROG(GDK_PIXBUF_CSOURCE, gdk-pixbuf-csource, no)
|
|
||||||
|
|
||||||
if test x"$GDK_PIXBUF_CSOURCE" = xno; then
|
|
||||||
AC_MSG_ERROR([gdk-pixbuf-csource executable not found in your path - should be installed with GTK])
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_SUBST(GDK_PIXBUF_CSOURCE)
|
|
||||||
|
|
||||||
AC_PATH_PROG(ZENITY, zenity, no)
|
AC_PATH_PROG(ZENITY, zenity, no)
|
||||||
if test x"$ZENITY" = xno; then
|
if test x"$ZENITY" = xno; then
|
||||||
AC_MSG_ERROR([zenity not found in your path - needed for dialogs])
|
AC_MSG_ERROR([zenity not found in your path - needed for dialogs])
|
||||||
@@ -446,13 +378,15 @@ changequote([,])dnl
|
|||||||
|
|
||||||
AC_CONFIG_FILES([
|
AC_CONFIG_FILES([
|
||||||
Makefile
|
Makefile
|
||||||
|
data/Makefile
|
||||||
doc/Makefile
|
doc/Makefile
|
||||||
doc/man/Makefile
|
doc/man/Makefile
|
||||||
doc/reference/Makefile
|
doc/reference/Makefile
|
||||||
doc/reference/meta-docs.sgml
|
doc/reference/meta-docs.sgml
|
||||||
src/Makefile
|
src/Makefile
|
||||||
src/libmutter-wayland.pc
|
src/libmutter.pc
|
||||||
src/compositor/plugins/Makefile
|
src/compositor/plugins/Makefile
|
||||||
|
src/meta/meta-version.h
|
||||||
po/Makefile.in
|
po/Makefile.in
|
||||||
])
|
])
|
||||||
|
|
||||||
@@ -468,7 +402,7 @@ fi
|
|||||||
|
|
||||||
dnl ==========================================================================
|
dnl ==========================================================================
|
||||||
echo "
|
echo "
|
||||||
mutter-wayland-$VERSION
|
mutter-$VERSION
|
||||||
|
|
||||||
prefix: ${prefix}
|
prefix: ${prefix}
|
||||||
source code location: ${srcdir}
|
source code location: ${srcdir}
|
||||||
@@ -478,8 +412,6 @@ mutter-wayland-$VERSION
|
|||||||
libcanberra: ${have_libcanberra}
|
libcanberra: ${have_libcanberra}
|
||||||
Introspection: ${found_introspection}
|
Introspection: ${found_introspection}
|
||||||
Session management: ${found_sm}
|
Session management: ${found_sm}
|
||||||
Shape extension: ${found_shape}
|
|
||||||
Xsync: ${found_xsync}
|
|
||||||
"
|
"
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -17,6 +17,9 @@
|
|||||||
<KeyListEntry name="move-to-workspace-4"
|
<KeyListEntry name="move-to-workspace-4"
|
||||||
_description="Move window to workspace 4" />
|
_description="Move window to workspace 4" />
|
||||||
|
|
||||||
|
<KeyListEntry name="move-to-workspace-last"
|
||||||
|
_description="Move window to last workspace" />
|
||||||
|
|
||||||
<KeyListEntry name="move-to-workspace-left"
|
<KeyListEntry name="move-to-workspace-left"
|
||||||
_description="Move window one workspace to the left" />
|
_description="Move window one workspace to the left" />
|
||||||
|
|
||||||
@@ -42,26 +45,68 @@
|
|||||||
_description="Move window one monitor down" />
|
_description="Move window one monitor down" />
|
||||||
|
|
||||||
<KeyListEntry name="switch-applications"
|
<KeyListEntry name="switch-applications"
|
||||||
|
reverse-entry="switch-applications-backward"
|
||||||
_description="Switch applications"/>
|
_description="Switch applications"/>
|
||||||
|
|
||||||
|
<KeyListEntry name="switch-applications-backward"
|
||||||
|
reverse-entry="switch-applications"
|
||||||
|
hidden="true"
|
||||||
|
_description="Switch to previous application"/>
|
||||||
|
|
||||||
<KeyListEntry name="switch-windows"
|
<KeyListEntry name="switch-windows"
|
||||||
|
reverse-entry="switch-windows-backward"
|
||||||
_description="Switch windows"/>
|
_description="Switch windows"/>
|
||||||
|
|
||||||
|
<KeyListEntry name="switch-windows-backward"
|
||||||
|
reverse-entry="switch-windows"
|
||||||
|
hidden="true"
|
||||||
|
_description="Switch to previous window"/>
|
||||||
|
|
||||||
<KeyListEntry name="switch-group"
|
<KeyListEntry name="switch-group"
|
||||||
|
reverse-entry="switch-group-backward"
|
||||||
_description="Switch windows of an application"/>
|
_description="Switch windows of an application"/>
|
||||||
|
|
||||||
|
<KeyListEntry name="switch-group-backward"
|
||||||
|
reverse-entry="switch-group"
|
||||||
|
hidden="true"
|
||||||
|
_description="Switch to previous window of an application"/>
|
||||||
|
|
||||||
<KeyListEntry name="switch-panels"
|
<KeyListEntry name="switch-panels"
|
||||||
|
reverse-entry="switch-panels-backward"
|
||||||
_description="Switch system controls"/>
|
_description="Switch system controls"/>
|
||||||
|
|
||||||
|
<KeyListEntry name="switch-panels-backward"
|
||||||
|
reverse-entry="switch-panels"
|
||||||
|
hidden="true"
|
||||||
|
_description="Switch to previous system control"/>
|
||||||
|
|
||||||
<KeyListEntry name="cycle-windows"
|
<KeyListEntry name="cycle-windows"
|
||||||
|
reverse-entry="cycle-windows-backward"
|
||||||
_description="Switch windows directly"/>
|
_description="Switch windows directly"/>
|
||||||
|
|
||||||
|
<KeyListEntry name="cycle-windows-backward"
|
||||||
|
reverse-entry="cycle-windows"
|
||||||
|
hidden="true"
|
||||||
|
_description="Switch directly to previous window"/>
|
||||||
|
|
||||||
<KeyListEntry name="cycle-group"
|
<KeyListEntry name="cycle-group"
|
||||||
|
reverse-entry="cycle-group-backward"
|
||||||
_description="Switch windows of an app directly"/>
|
_description="Switch windows of an app directly"/>
|
||||||
|
|
||||||
|
<KeyListEntry name="cycle-group-backward"
|
||||||
|
reverse-entry="cycle-group"
|
||||||
|
hidden="true"
|
||||||
|
_description="Switch directly to previous window of an app"/>
|
||||||
|
|
||||||
<KeyListEntry name="cycle-panels"
|
<KeyListEntry name="cycle-panels"
|
||||||
|
reverse-entry="cycle-panels-backward"
|
||||||
_description="Switch system controls directly"/>
|
_description="Switch system controls directly"/>
|
||||||
|
|
||||||
|
<KeyListEntry name="cycle-panels-backward"
|
||||||
|
reverse-entry="cycle-panels"
|
||||||
|
hidden="true"
|
||||||
|
_description="Switch directly to previous system control"/>
|
||||||
|
|
||||||
<KeyListEntry name="show-desktop"
|
<KeyListEntry name="show-desktop"
|
||||||
_description="Hide all normal windows"/>
|
_description="Hide all normal windows"/>
|
||||||
|
|
||||||
@@ -77,6 +122,9 @@
|
|||||||
<KeyListEntry name="switch-to-workspace-4"
|
<KeyListEntry name="switch-to-workspace-4"
|
||||||
_description="Switch to workspace 4" />
|
_description="Switch to workspace 4" />
|
||||||
|
|
||||||
|
<KeyListEntry name="switch-to-workspace-last"
|
||||||
|
_description="Switch to last workspace" />
|
||||||
|
|
||||||
<KeyListEntry name="switch-to-workspace-left"
|
<KeyListEntry name="switch-to-workspace-left"
|
||||||
_description="Move to workspace left" />
|
_description="Move to workspace left" />
|
||||||
|
|
||||||
36
data/Makefile.am
Normal file
36
data/Makefile.am
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
desktopfiles_in_files = \
|
||||||
|
mutter.desktop.in \
|
||||||
|
mutter-wayland.desktop.in
|
||||||
|
desktopfilesdir = $(datadir)/applications
|
||||||
|
desktopfiles_DATA = $(desktopfiles_in_files:.desktop.in=.desktop)
|
||||||
|
|
||||||
|
@INTLTOOL_DESKTOP_RULE@
|
||||||
|
|
||||||
|
xml_in_files = \
|
||||||
|
50-mutter-navigation.xml.in \
|
||||||
|
50-mutter-system.xml.in \
|
||||||
|
50-mutter-windows.xml.in
|
||||||
|
xmldir = $(GNOME_KEYBINDINGS_KEYSDIR)
|
||||||
|
xml_DATA = $(xml_in_files:.xml.in=.xml)
|
||||||
|
|
||||||
|
gschema_in_files = \
|
||||||
|
org.gnome.mutter.gschema.xml.in \
|
||||||
|
org.gnome.mutter.wayland.gschema.xml.in
|
||||||
|
gsettings_SCHEMAS = $(gschema_in_files:.xml.in=.xml)
|
||||||
|
|
||||||
|
@INTLTOOL_XML_NOMERGE_RULE@
|
||||||
|
@GSETTINGS_RULES@
|
||||||
|
|
||||||
|
convertdir = $(datadir)/GConf/gsettings
|
||||||
|
convert_DATA = mutter-schemas.convert
|
||||||
|
|
||||||
|
CLEANFILES = \
|
||||||
|
$(desktopfiles_DATA) \
|
||||||
|
$(gsettings_SCHEMAS) \
|
||||||
|
$(xml_DATA)
|
||||||
|
|
||||||
|
EXTRA_DIST = \
|
||||||
|
$(convert_DATA) \
|
||||||
|
$(desktopfiles_in_files) \
|
||||||
|
$(gschema_in_files) \
|
||||||
|
$(xml_in_files)
|
||||||
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
@@ -1,7 +1,7 @@
|
|||||||
[Desktop Entry]
|
[Desktop Entry]
|
||||||
Type=Application
|
Type=Application
|
||||||
_Name=Mutter (wayland compositor)
|
_Name=Mutter (wayland compositor)
|
||||||
Exec=mutter-launch -- mutter --wayland --display-server
|
Exec=mutter --wayland --display-server
|
||||||
NoDisplay=true
|
NoDisplay=true
|
||||||
# name of loadable control center module
|
# name of loadable control center module
|
||||||
X-GNOME-WMSettingsModule=metacity
|
X-GNOME-WMSettingsModule=metacity
|
||||||
@@ -12,5 +12,6 @@ X-GnomeWMSettingsLibrary=metacity
|
|||||||
X-GNOME-Bugzilla-Bugzilla=GNOME
|
X-GNOME-Bugzilla-Bugzilla=GNOME
|
||||||
X-GNOME-Bugzilla-Product=mutter
|
X-GNOME-Bugzilla-Product=mutter
|
||||||
X-GNOME-Bugzilla-Component=general
|
X-GNOME-Bugzilla-Component=general
|
||||||
X-GNOME-Autostart-Phase=DisplayServer
|
X-GNOME-Autostart-Phase=WindowManager
|
||||||
|
X-GNOME-Provides=windowmanager
|
||||||
X-GNOME-Autostart-Notify=true
|
X-GNOME-Autostart-Notify=true
|
||||||
17
data/mutter.desktop.in
Normal file
17
data/mutter.desktop.in
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
[Desktop Entry]
|
||||||
|
Type=Application
|
||||||
|
_Name=Mutter
|
||||||
|
Exec=mutter
|
||||||
|
NoDisplay=true
|
||||||
|
# name of loadable control center module
|
||||||
|
X-GNOME-WMSettingsModule=metacity
|
||||||
|
# name we put on the WM spec check window
|
||||||
|
X-GNOME-WMName=Mutter
|
||||||
|
# back compat only
|
||||||
|
X-GnomeWMSettingsLibrary=metacity
|
||||||
|
X-GNOME-Bugzilla-Bugzilla=GNOME
|
||||||
|
X-GNOME-Bugzilla-Product=mutter
|
||||||
|
X-GNOME-Bugzilla-Component=general
|
||||||
|
X-GNOME-Autostart-Phase=WindowManager
|
||||||
|
X-GNOME-Provides=windowmanager
|
||||||
|
X-GNOME-Autostart-Notify=true
|
||||||
@@ -93,6 +93,15 @@
|
|||||||
</_description>
|
</_description>
|
||||||
</key>
|
</key>
|
||||||
|
|
||||||
|
<key name="center-new-windows" type="b">
|
||||||
|
<default>false</default>
|
||||||
|
<_summary>Place new windows in the center</_summary>
|
||||||
|
<_description>
|
||||||
|
When true, the new windows will always be put in the center of the
|
||||||
|
active screen of the monitor.
|
||||||
|
</_description>
|
||||||
|
</key>
|
||||||
|
|
||||||
<child name="keybindings" schema="org.gnome.mutter.keybindings"/>
|
<child name="keybindings" schema="org.gnome.mutter.keybindings"/>
|
||||||
|
|
||||||
</schema>
|
</schema>
|
||||||
@@ -79,8 +79,6 @@ IGNORE_HFILES= \
|
|||||||
iconcache.h \
|
iconcache.h \
|
||||||
inlinepixbufs.h \
|
inlinepixbufs.h \
|
||||||
keybindings-private.h \
|
keybindings-private.h \
|
||||||
menu.h \
|
|
||||||
metaaccellabel.h \
|
|
||||||
meta-background-actor-private.h \
|
meta-background-actor-private.h \
|
||||||
meta-background-group-private.h \
|
meta-background-group-private.h \
|
||||||
meta-module.h \
|
meta-module.h \
|
||||||
@@ -140,7 +138,7 @@ expand_content_files= \
|
|||||||
# e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS)
|
# e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS)
|
||||||
# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib)
|
# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib)
|
||||||
GTKDOC_CFLAGS=$(MUTTER_CFLAGS)
|
GTKDOC_CFLAGS=$(MUTTER_CFLAGS)
|
||||||
GTKDOC_LIBS=$(MUTTER_LIBS) $(top_builddir)/src/libmutter-wayland.la
|
GTKDOC_LIBS=$(MUTTER_LIBS) $(top_builddir)/src/libmutter.la
|
||||||
|
|
||||||
# This includes the standard gtk-doc make rules, copied by gtkdocize.
|
# This includes the standard gtk-doc make rules, copied by gtkdocize.
|
||||||
include $(top_srcdir)/gtk-doc.make
|
include $(top_srcdir)/gtk-doc.make
|
||||||
|
|||||||
@@ -300,6 +300,7 @@ MetaPluginVersion
|
|||||||
META_PLUGIN_DECLARE
|
META_PLUGIN_DECLARE
|
||||||
meta_plugin_switch_workspace_completed
|
meta_plugin_switch_workspace_completed
|
||||||
meta_plugin_minimize_completed
|
meta_plugin_minimize_completed
|
||||||
|
meta_plugin_unminimize_completed
|
||||||
meta_plugin_maximize_completed
|
meta_plugin_maximize_completed
|
||||||
meta_plugin_unmaximize_completed
|
meta_plugin_unmaximize_completed
|
||||||
meta_plugin_map_completed
|
meta_plugin_map_completed
|
||||||
@@ -555,7 +556,7 @@ meta_window_is_monitor_sized
|
|||||||
meta_window_is_override_redirect
|
meta_window_is_override_redirect
|
||||||
meta_window_is_skip_taskbar
|
meta_window_is_skip_taskbar
|
||||||
meta_window_get_rect
|
meta_window_get_rect
|
||||||
meta_window_get_input_rect
|
meta_window_get_buffer_rect
|
||||||
meta_window_get_frame_rect
|
meta_window_get_frame_rect
|
||||||
meta_window_get_outer_rect
|
meta_window_get_outer_rect
|
||||||
meta_window_client_rect_to_frame_rect
|
meta_window_client_rect_to_frame_rect
|
||||||
|
|||||||
@@ -21,10 +21,10 @@ environment.</description>
|
|||||||
-->
|
-->
|
||||||
<mailing-list rdf:resource="http://mail.gnome.org/mailman/listinfo/gnome-shell-list" />
|
<mailing-list rdf:resource="http://mail.gnome.org/mailman/listinfo/gnome-shell-list" />
|
||||||
<download-page rdf:resource="http://download.gnome.org/sources/mutter/" />
|
<download-page rdf:resource="http://download.gnome.org/sources/mutter/" />
|
||||||
<download-page rdf:resource="http://download.gnome.org/sources/mutter-wayland/" />
|
|
||||||
<bug-database rdf:resource="http://bugzilla.gnome.org/browse.cgi?product=mutter" />
|
<bug-database rdf:resource="http://bugzilla.gnome.org/browse.cgi?product=mutter" />
|
||||||
|
|
||||||
<category rdf:resource="http://api.gnome.org/doap-extensions#desktop" />
|
<category rdf:resource="http://api.gnome.org/doap-extensions#core" />
|
||||||
|
<programming-language>C</programming-language>
|
||||||
|
|
||||||
<maintainer>
|
<maintainer>
|
||||||
<foaf:Person>
|
<foaf:Person>
|
||||||
|
|||||||
@@ -1,8 +1,12 @@
|
|||||||
# List of source files containing translatable strings.
|
# List of source files containing translatable strings.
|
||||||
# Please keep this file sorted alphabetically.
|
# Please keep this file sorted alphabetically.
|
||||||
src/50-mutter-navigation.xml.in
|
data/50-mutter-navigation.xml.in
|
||||||
src/50-mutter-system.xml.in
|
data/50-mutter-system.xml.in
|
||||||
src/50-mutter-windows.xml.in
|
data/50-mutter-windows.xml.in
|
||||||
|
data/mutter.desktop.in
|
||||||
|
data/org.gnome.mutter.gschema.xml.in
|
||||||
|
data/org.gnome.mutter.wayland.gschema.xml.in
|
||||||
|
src/backends/meta-monitor-manager.c
|
||||||
src/compositor/compositor.c
|
src/compositor/compositor.c
|
||||||
src/compositor/meta-background.c
|
src/compositor/meta-background.c
|
||||||
src/core/bell.c
|
src/core/bell.c
|
||||||
@@ -12,21 +16,15 @@ src/core/display.c
|
|||||||
src/core/errors.c
|
src/core/errors.c
|
||||||
src/core/keybindings.c
|
src/core/keybindings.c
|
||||||
src/core/main.c
|
src/core/main.c
|
||||||
src/core/monitor.c
|
|
||||||
src/core/mutter.c
|
src/core/mutter.c
|
||||||
src/core/prefs.c
|
src/core/prefs.c
|
||||||
src/core/screen.c
|
src/core/screen.c
|
||||||
src/x11/session.c
|
|
||||||
src/core/util.c
|
src/core/util.c
|
||||||
src/core/window.c
|
src/core/window.c
|
||||||
src/x11/window-props.c
|
|
||||||
src/x11/xprops.c
|
|
||||||
src/mutter-wayland.desktop.in
|
|
||||||
src/org.gnome.mutter.gschema.xml.in
|
|
||||||
src/org.gnome.mutter.wayland.gschema.xml.in
|
|
||||||
src/ui/frames.c
|
src/ui/frames.c
|
||||||
src/ui/menu.c
|
|
||||||
src/ui/metaaccellabel.c
|
|
||||||
src/ui/resizepopup.c
|
src/ui/resizepopup.c
|
||||||
src/ui/theme.c
|
src/ui/theme.c
|
||||||
src/ui/theme-parser.c
|
src/ui/theme-parser.c
|
||||||
|
src/x11/session.c
|
||||||
|
src/x11/window-props.c
|
||||||
|
src/x11/xprops.c
|
||||||
|
|||||||
@@ -1,2 +1 @@
|
|||||||
src/metacity.schemas.in
|
data/mutter-wayland.desktop.in
|
||||||
|
|
||||||
|
|||||||
2834
po/ca@valencia.po
2834
po/ca@valencia.po
File diff suppressed because it is too large
Load Diff
1847
po/pt_BR.po
1847
po/pt_BR.po
File diff suppressed because it is too large
Load Diff
417
po/sk.po
417
po/sk.po
@@ -13,9 +13,9 @@ msgstr ""
|
|||||||
"Project-Id-Version: mutter\n"
|
"Project-Id-Version: mutter\n"
|
||||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
|
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
|
||||||
"product=mutter&keywords=I18N+L10N&component=general\n"
|
"product=mutter&keywords=I18N+L10N&component=general\n"
|
||||||
"POT-Creation-Date: 2013-05-24 21:44+0000\n"
|
"POT-Creation-Date: 2013-08-21 17:41+0000\n"
|
||||||
"PO-Revision-Date: 2013-05-18 16:53+0100\n"
|
"PO-Revision-Date: 2013-08-02 14:46+0200\n"
|
||||||
"Last-Translator: Jan Kyselica <kyselica.jan@gmail.com>\n"
|
"Last-Translator: Ján Kyselica <kyselica.jan@gmail.com>\n"
|
||||||
"Language-Team: Slovak <gnome-sk-list@gnome.org>\n"
|
"Language-Team: Slovak <gnome-sk-list@gnome.org>\n"
|
||||||
"Language: sk\n"
|
"Language: sk\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
@@ -87,9 +87,8 @@ msgstr "Prepnúť okná aplikácie"
|
|||||||
# PK: zisti co to robi
|
# PK: zisti co to robi
|
||||||
# description
|
# description
|
||||||
#: ../src/50-mutter-navigation.xml.in.h:13
|
#: ../src/50-mutter-navigation.xml.in.h:13
|
||||||
#, fuzzy
|
|
||||||
msgid "Switch system controls"
|
msgid "Switch system controls"
|
||||||
msgstr "Prepnúť medzi systémovými ovládacími prvkami"
|
msgstr "Prepnúť medzi ovládacími prvkami systému"
|
||||||
|
|
||||||
# description
|
# description
|
||||||
#: ../src/50-mutter-navigation.xml.in.h:14
|
#: ../src/50-mutter-navigation.xml.in.h:14
|
||||||
@@ -104,9 +103,8 @@ msgstr "Prepnúť okná aplikácie priamo"
|
|||||||
# MČ: podobne ako vyššie: „cycle-panels“
|
# MČ: podobne ako vyššie: „cycle-panels“
|
||||||
# description
|
# description
|
||||||
#: ../src/50-mutter-navigation.xml.in.h:16
|
#: ../src/50-mutter-navigation.xml.in.h:16
|
||||||
#, fuzzy
|
|
||||||
msgid "Switch system controls directly"
|
msgid "Switch system controls directly"
|
||||||
msgstr "Prepnúť medzi systémovými ovládacími prvkami priamo"
|
msgstr "Prepnúť medzi ovládacími prvkami systému priamo"
|
||||||
|
|
||||||
# description
|
# description
|
||||||
#: ../src/50-mutter-navigation.xml.in.h:17
|
#: ../src/50-mutter-navigation.xml.in.h:17
|
||||||
@@ -267,13 +265,13 @@ msgstr "Zobraziť rozdelenie napravo"
|
|||||||
# PK: je %i cislo obrazovky? ak ano tak "č. %i"
|
# PK: je %i cislo obrazovky? ak ano tak "č. %i"
|
||||||
#. This probably means that a non-WM compositor like xcompmgr is running;
|
#. This probably means that a non-WM compositor like xcompmgr is running;
|
||||||
#. * we have no way to get it to exit
|
#. * we have no way to get it to exit
|
||||||
#: ../src/compositor/compositor.c:571
|
#: ../src/compositor/compositor.c:596
|
||||||
#, fuzzy, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Another compositing manager is already running on screen %i on display \"%s"
|
"Another compositing manager is already running on screen %i on display \"%s"
|
||||||
"\"."
|
"\"."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Pre obrazovku %i na displeji „%s“ je spustený už iný správca rozloženia."
|
"Pre obrazovku č. %i na displeji „%s“ je spustený už iný správca rozloženia."
|
||||||
|
|
||||||
#: ../src/compositor/meta-background.c:1076
|
#: ../src/compositor/meta-background.c:1076
|
||||||
msgid "background texture could not be created from file"
|
msgid "background texture could not be created from file"
|
||||||
@@ -313,18 +311,18 @@ msgstr "_Počkať"
|
|||||||
msgid "_Force Quit"
|
msgid "_Force Quit"
|
||||||
msgstr "_Vynútiť ukončenie"
|
msgstr "_Vynútiť ukončenie"
|
||||||
|
|
||||||
#: ../src/core/display.c:401
|
#: ../src/core/display.c:421
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Missing %s extension required for compositing"
|
msgid "Missing %s extension required for compositing"
|
||||||
msgstr "Rozšírenie %s, potrebné pre kompozitné prostredie, chýba"
|
msgstr "Rozšírenie %s, potrebné pre kompozitné prostredie, chýba"
|
||||||
|
|
||||||
# X window system preloz, napr. system na spravu okien X
|
# X window system preloz, napr. system na spravu okien X
|
||||||
#: ../src/core/display.c:493
|
#: ../src/core/display.c:513
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to open X Window System display '%s'\n"
|
msgid "Failed to open X Window System display '%s'\n"
|
||||||
msgstr "Zlyhalo otvorenie displeja systému na správu okien X „%s“\n"
|
msgstr "Zlyhalo otvorenie displeja systému na správu okien X „%s“\n"
|
||||||
|
|
||||||
#: ../src/core/keybindings.c:970
|
#: ../src/core/keybindings.c:1136
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Some other program is already using the key %s with modifiers %x as a "
|
"Some other program is already using the key %s with modifiers %x as a "
|
||||||
@@ -332,7 +330,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Iný program už používa kláves %s s modifikátormi %x ako klávesovú skratku\n"
|
"Iný program už používa kláves %s s modifikátormi %x ako klávesovú skratku\n"
|
||||||
|
|
||||||
#: ../src/core/keybindings.c:1151
|
#: ../src/core/keybindings.c:1333
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "\"%s\" is not a valid accelerator\n"
|
msgid "\"%s\" is not a valid accelerator\n"
|
||||||
msgstr "„%s“ nie je platný akcelerátor\n"
|
msgstr "„%s“ nie je platný akcelerátor\n"
|
||||||
@@ -378,6 +376,20 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Nepodarilo sa nájsť tému! Overte, že %s existuje a obsahuje obvyklé témy.\n"
|
"Nepodarilo sa nájsť tému! Overte, že %s existuje a obsahuje obvyklé témy.\n"
|
||||||
|
|
||||||
|
#: ../src/core/monitor.c:702
|
||||||
|
msgid "Built-in display"
|
||||||
|
msgstr "Vstavaný displej"
|
||||||
|
|
||||||
|
#. TRANSLATORS: this is a monitor name (in case we don't know
|
||||||
|
#. the vendor), it's Unknown followed by a size in inches,
|
||||||
|
#. like 'Unknown 15"'
|
||||||
|
#.
|
||||||
|
#: ../src/core/monitor.c:730
|
||||||
|
#, c-format
|
||||||
|
#| msgid "Unknown element %s"
|
||||||
|
msgid "Unknown %s"
|
||||||
|
msgstr "Neznámy %s"
|
||||||
|
|
||||||
#: ../src/core/mutter.c:40
|
#: ../src/core/mutter.c:40
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -403,7 +415,7 @@ msgstr "Zobrazí verziu"
|
|||||||
msgid "Mutter plugin to use"
|
msgid "Mutter plugin to use"
|
||||||
msgstr "Použije zásuvný modul Mutter"
|
msgstr "Použije zásuvný modul Mutter"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:1193
|
#: ../src/core/prefs.c:1202
|
||||||
msgid ""
|
msgid ""
|
||||||
"Workarounds for broken applications disabled. Some applications may not "
|
"Workarounds for broken applications disabled. Some applications may not "
|
||||||
"behave properly.\n"
|
"behave properly.\n"
|
||||||
@@ -411,12 +423,12 @@ msgstr ""
|
|||||||
"Náhradné riešenia pre chybné aplikácie nie sú povolené. Niektoré aplikácie "
|
"Náhradné riešenia pre chybné aplikácie nie sú povolené. Niektoré aplikácie "
|
||||||
"sa nemusia správať správne.\n"
|
"sa nemusia správať správne.\n"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:1268
|
#: ../src/core/prefs.c:1277
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Could not parse font description \"%s\" from GSettings key %s\n"
|
msgid "Could not parse font description \"%s\" from GSettings key %s\n"
|
||||||
msgstr "Nepodarilo sa spracovať popis písma „%s“ z kľúča GSettings %s\n"
|
msgstr "Nepodarilo sa spracovať popis písma „%s“ z kľúča GSettings %s\n"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:1334
|
#: ../src/core/prefs.c:1343
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"\"%s\" found in configuration database is not a valid value for mouse button "
|
"\"%s\" found in configuration database is not a valid value for mouse button "
|
||||||
@@ -425,7 +437,7 @@ msgstr ""
|
|||||||
"V konfiguračnej databáze sa našlo „%s“, čo nie je platná hodnota pre "
|
"V konfiguračnej databáze sa našlo „%s“, čo nie je platná hodnota pre "
|
||||||
"modifikátor tlačidla myši\n"
|
"modifikátor tlačidla myši\n"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:1881
|
#: ../src/core/prefs.c:1909
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"\"%s\" found in configuration database is not a valid value for keybinding "
|
"\"%s\" found in configuration database is not a valid value for keybinding "
|
||||||
@@ -434,17 +446,17 @@ msgstr ""
|
|||||||
"V konfiguračnej databáze sa našlo „%s“, čo nie je platná hodnota pre "
|
"V konfiguračnej databáze sa našlo „%s“, čo nie je platná hodnota pre "
|
||||||
"klávesovú skratku „%s“\n"
|
"klávesovú skratku „%s“\n"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:1945
|
#: ../src/core/prefs.c:1999
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Workspace %d"
|
msgid "Workspace %d"
|
||||||
msgstr "Pracovný priestor č. %d"
|
msgstr "Pracovný priestor č. %d"
|
||||||
|
|
||||||
#: ../src/core/screen.c:691
|
#: ../src/core/screen.c:537
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Screen %d on display '%s' is invalid\n"
|
msgid "Screen %d on display '%s' is invalid\n"
|
||||||
msgstr "Obrazovka č. %d na displeji „%s“ nie je platná\n"
|
msgstr "Obrazovka č. %d na displeji „%s“ nie je platná\n"
|
||||||
|
|
||||||
#: ../src/core/screen.c:707
|
#: ../src/core/screen.c:553
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Screen %d on display \"%s\" already has a window manager; try using the --"
|
"Screen %d on display \"%s\" already has a window manager; try using the --"
|
||||||
@@ -453,7 +465,7 @@ msgstr ""
|
|||||||
"Obrazovka č. %d na displeji „%s“ už má správcu okien. Skúste použiť prepínač "
|
"Obrazovka č. %d na displeji „%s“ už má správcu okien. Skúste použiť prepínač "
|
||||||
"--replace, aby sa aktuálny správca nahradil.\n"
|
"--replace, aby sa aktuálny správca nahradil.\n"
|
||||||
|
|
||||||
#: ../src/core/screen.c:734
|
#: ../src/core/screen.c:580
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Could not acquire window manager selection on screen %d display \"%s\"\n"
|
"Could not acquire window manager selection on screen %d display \"%s\"\n"
|
||||||
@@ -461,12 +473,12 @@ msgstr ""
|
|||||||
"Nepodarilo sa získať výber správcu okien pre obrazovku č. %d na displeji "
|
"Nepodarilo sa získať výber správcu okien pre obrazovku č. %d na displeji "
|
||||||
"„%s“\n"
|
"„%s“\n"
|
||||||
|
|
||||||
#: ../src/core/screen.c:812
|
#: ../src/core/screen.c:658
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Screen %d on display \"%s\" already has a window manager\n"
|
msgid "Screen %d on display \"%s\" already has a window manager\n"
|
||||||
msgstr "Obrazovka č. %d na displeji „%s“ už má správcu okien\n"
|
msgstr "Obrazovka č. %d na displeji „%s“ už má správcu okien\n"
|
||||||
|
|
||||||
#: ../src/core/screen.c:998
|
#: ../src/core/screen.c:850
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Could not release screen %d on display \"%s\"\n"
|
msgid "Could not release screen %d on display \"%s\"\n"
|
||||||
msgstr "Nepodarilo sa uvoľniť obrazovku č. %d na displeji „%s“\n"
|
msgstr "Nepodarilo sa uvoľniť obrazovku č. %d na displeji „%s“\n"
|
||||||
@@ -542,8 +554,7 @@ msgstr "Zlyhalo otvorenie súboru so záznamom pomocou fdopen() %s: %s\n"
|
|||||||
msgid "Opened log file %s\n"
|
msgid "Opened log file %s\n"
|
||||||
msgstr "Otvorený súbor so záznamom %s\n"
|
msgstr "Otvorený súbor so záznamom %s\n"
|
||||||
|
|
||||||
#: ../src/core/util.c:119 ../src/tools/mutter-message.c:149
|
#: ../src/core/util.c:119
|
||||||
#, c-format
|
|
||||||
msgid "Mutter was compiled without support for verbose mode\n"
|
msgid "Mutter was compiled without support for verbose mode\n"
|
||||||
msgstr "Mutter bol skompilovaný bez výpisu podrobností pri behu\n"
|
msgstr "Mutter bol skompilovaný bez výpisu podrobností pri behu\n"
|
||||||
|
|
||||||
@@ -551,20 +562,20 @@ msgstr "Mutter bol skompilovaný bez výpisu podrobností pri behu\n"
|
|||||||
msgid "Window manager: "
|
msgid "Window manager: "
|
||||||
msgstr "Správca okien: "
|
msgstr "Správca okien: "
|
||||||
|
|
||||||
#: ../src/core/util.c:412
|
#: ../src/core/util.c:414
|
||||||
msgid "Bug in window manager: "
|
msgid "Bug in window manager: "
|
||||||
msgstr "Chyba v správcovi okien: "
|
msgstr "Chyba v správcovi okien: "
|
||||||
|
|
||||||
#: ../src/core/util.c:443
|
#: ../src/core/util.c:445
|
||||||
msgid "Window manager warning: "
|
msgid "Window manager warning: "
|
||||||
msgstr "Varovanie správcu okien: "
|
msgstr "Varovanie správcu okien: "
|
||||||
|
|
||||||
#: ../src/core/util.c:471
|
#: ../src/core/util.c:473
|
||||||
msgid "Window manager error: "
|
msgid "Window manager error: "
|
||||||
msgstr "Chyba správcu okien: "
|
msgstr "Chyba správcu okien: "
|
||||||
|
|
||||||
#. first time through
|
#. first time through
|
||||||
#: ../src/core/window.c:7505
|
#: ../src/core/window.c:7533
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER "
|
"Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER "
|
||||||
@@ -580,7 +591,7 @@ msgstr ""
|
|||||||
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
|
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
|
||||||
#. * about these apps but make them work.
|
#. * about these apps but make them work.
|
||||||
#.
|
#.
|
||||||
#: ../src/core/window.c:8229
|
#: ../src/core/window.c:8257
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Window %s sets an MWM hint indicating it isn't resizable, but sets min size "
|
"Window %s sets an MWM hint indicating it isn't resizable, but sets min size "
|
||||||
@@ -590,7 +601,7 @@ msgstr ""
|
|||||||
"nastavuje minimálnu veľkosť %d x %d a maximálnu veľkosť %d x %d. To nedáva "
|
"nastavuje minimálnu veľkosť %d x %d a maximálnu veľkosť %d x %d. To nedáva "
|
||||||
"zmysel.\n"
|
"zmysel.\n"
|
||||||
|
|
||||||
#: ../src/core/window-props.c:318
|
#: ../src/core/window-props.c:347
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Application set a bogus _NET_WM_PID %lu\n"
|
msgid "Application set a bogus _NET_WM_PID %lu\n"
|
||||||
msgstr "Aplikácia nastavila neplatné _NET_WM_PID %lu\n"
|
msgstr "Aplikácia nastavila neplatné _NET_WM_PID %lu\n"
|
||||||
@@ -598,18 +609,18 @@ msgstr "Aplikácia nastavila neplatné _NET_WM_PID %lu\n"
|
|||||||
# PK: co je toto?
|
# PK: co je toto?
|
||||||
# JK: nedokazem zistit
|
# JK: nedokazem zistit
|
||||||
# PM: vyžiadaj komentár od vývojárov, pomožeme aj ostatným prekladateľom
|
# PM: vyžiadaj komentár od vývojárov, pomožeme aj ostatným prekladateľom
|
||||||
#: ../src/core/window-props.c:434
|
#: ../src/core/window-props.c:463
|
||||||
#, fuzzy, c-format
|
#, fuzzy, c-format
|
||||||
msgid "%s (on %s)"
|
msgid "%s (on %s)"
|
||||||
msgstr "%s (na %s)"
|
msgstr "%s (na %s)"
|
||||||
|
|
||||||
#: ../src/core/window-props.c:1517
|
#: ../src/core/window-props.c:1546
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
|
msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
|
||||||
msgstr "Neplatné WM_TRANSIENT_FOR okno 0x%lx nastavené pre %s.\n"
|
msgstr "Neplatné WM_TRANSIENT_FOR okno 0x%lx nastavené pre %s.\n"
|
||||||
|
|
||||||
# MČ: zacykliť sa, alebo vytvoriť slučku.
|
# MČ: zacykliť sa, alebo vytvoriť slučku.
|
||||||
#: ../src/core/window-props.c:1528
|
#: ../src/core/window-props.c:1557
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "WM_TRANSIENT_FOR window 0x%lx for %s would create loop.\n"
|
msgid "WM_TRANSIENT_FOR window 0x%lx for %s would create loop.\n"
|
||||||
msgstr "WM_TRANSIENT_FOR okno 0x%lx pre %s môže vytvoriť slučku.\n"
|
msgstr "WM_TRANSIENT_FOR okno 0x%lx pre %s môže vytvoriť slučku.\n"
|
||||||
@@ -697,9 +708,9 @@ msgid ""
|
|||||||
"vertically and resizes them horizontally to cover half of the available "
|
"vertically and resizes them horizontally to cover half of the available "
|
||||||
"area. Dropping windows on the top screen edge maximizes them completely."
|
"area. Dropping windows on the top screen edge maximizes them completely."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Ak je povolené, upustenie okien pri zvislých okrajoch obrazovky ich "
|
"Ak je povolené, upustenie okien pri zvislých okrajoch obrazovky ich zvislo "
|
||||||
"zvislo maximalizuje a vodorovná veľkosť sa zmení na polovicu dostupnej "
|
"maximalizuje a vodorovná veľkosť sa zmení na polovicu dostupnej plochy. "
|
||||||
"plochy. Upustenie okien pri vrchnom okraji obrazovky ich maximalizuje úplne."
|
"Upustenie okien pri vrchnom okraji obrazovky ich maximalizuje úplne."
|
||||||
|
|
||||||
# summary
|
# summary
|
||||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:7
|
#: ../src/org.gnome.mutter.gschema.xml.in.h:7
|
||||||
@@ -735,9 +746,8 @@ msgstr ""
|
|||||||
# PM: ja by som dal Bez vyvovlávania tabulátorom
|
# PM: ja by som dal Bez vyvovlávania tabulátorom
|
||||||
# summary
|
# summary
|
||||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:11
|
#: ../src/org.gnome.mutter.gschema.xml.in.h:11
|
||||||
#, fuzzy
|
|
||||||
msgid "No tab popup"
|
msgid "No tab popup"
|
||||||
msgstr "Nepoužívať prekryvnú ponuku tabulátora"
|
msgstr "Bez vyvolávania tabulátorom"
|
||||||
|
|
||||||
# MČ: Neviem, čo to presne má robiť, ale popis som pochopil inak. „…či sa má používať rozbaľovacia ponuka a zvýraznenie rámikom sa má vypnúť…“
|
# MČ: Neviem, čo to presne má robiť, ale popis som pochopil inak. „…či sa má používať rozbaľovacia ponuka a zvýraznenie rámikom sa má vypnúť…“
|
||||||
# description
|
# description
|
||||||
@@ -806,109 +816,104 @@ msgstr "Vybrať okno z rozbaľovacej ponuky tabulátoru"
|
|||||||
msgid "Cancel tab popup"
|
msgid "Cancel tab popup"
|
||||||
msgstr "Zrušit rozbaľovaciu ponuku tabulátoru"
|
msgstr "Zrušit rozbaľovaciu ponuku tabulátoru"
|
||||||
|
|
||||||
#: ../src/tools/mutter-message.c:123
|
|
||||||
#, c-format
|
|
||||||
msgid "Usage: %s\n"
|
|
||||||
msgstr "Použitie: %s\n"
|
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:69
|
#: ../src/ui/menu.c:67
|
||||||
msgid "Mi_nimize"
|
msgid "Mi_nimize"
|
||||||
msgstr "Mi_nimalizovať"
|
msgstr "Mi_nimalizovať"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:71
|
#: ../src/ui/menu.c:69
|
||||||
msgid "Ma_ximize"
|
msgid "Ma_ximize"
|
||||||
msgstr "Ma_ximalizovať"
|
msgstr "Ma_ximalizovať"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:73
|
#: ../src/ui/menu.c:71
|
||||||
msgid "Unma_ximize"
|
msgid "Unma_ximize"
|
||||||
msgstr "Zrušiť ma_ximalizáciu"
|
msgstr "Zrušiť ma_ximalizáciu"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:75
|
#: ../src/ui/menu.c:73
|
||||||
msgid "Roll _Up"
|
msgid "Roll _Up"
|
||||||
msgstr "_Zabaliť"
|
msgstr "_Zabaliť"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:77
|
#: ../src/ui/menu.c:75
|
||||||
msgid "_Unroll"
|
msgid "_Unroll"
|
||||||
msgstr "_Rozbaliť"
|
msgstr "_Rozbaliť"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:79
|
#: ../src/ui/menu.c:77
|
||||||
msgid "_Move"
|
msgid "_Move"
|
||||||
msgstr "Pre_miestniť"
|
msgstr "Pre_miestniť"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:81
|
#: ../src/ui/menu.c:79
|
||||||
msgid "_Resize"
|
msgid "_Resize"
|
||||||
msgstr "Zmeniť veľko_sť"
|
msgstr "Zmeniť veľko_sť"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:83
|
#: ../src/ui/menu.c:81
|
||||||
msgid "Move Titlebar On_screen"
|
msgid "Move Titlebar On_screen"
|
||||||
msgstr "Presunúť titulok na _obrazovku"
|
msgstr "Presunúť titulok na _obrazovku"
|
||||||
|
|
||||||
#. separator
|
#. separator
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:86 ../src/ui/menu.c:88
|
#: ../src/ui/menu.c:84 ../src/ui/menu.c:86
|
||||||
msgid "Always on _Top"
|
msgid "Always on _Top"
|
||||||
msgstr "Vždy na_vrchu"
|
msgstr "Vždy na_vrchu"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:90
|
#: ../src/ui/menu.c:88
|
||||||
msgid "_Always on Visible Workspace"
|
msgid "_Always on Visible Workspace"
|
||||||
msgstr "Vž_dy na viditeľnom pracovnom priestore"
|
msgstr "Vž_dy na viditeľnom pracovnom priestore"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:92
|
#: ../src/ui/menu.c:90
|
||||||
msgid "_Only on This Workspace"
|
msgid "_Only on This Workspace"
|
||||||
msgstr "_Len na tomto pracovnom priestore"
|
msgstr "_Len na tomto pracovnom priestore"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:94
|
#: ../src/ui/menu.c:92
|
||||||
msgid "Move to Workspace _Left"
|
msgid "Move to Workspace _Left"
|
||||||
msgstr "Presunúť na pracovný priestor vľav_o"
|
msgstr "Presunúť na pracovný priestor vľav_o"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:96
|
#: ../src/ui/menu.c:94
|
||||||
msgid "Move to Workspace R_ight"
|
msgid "Move to Workspace R_ight"
|
||||||
msgstr "Presunúť na pracovný priestor v_pravo"
|
msgstr "Presunúť na pracovný priestor v_pravo"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:98
|
#: ../src/ui/menu.c:96
|
||||||
msgid "Move to Workspace _Up"
|
msgid "Move to Workspace _Up"
|
||||||
msgstr "Presunúť na pracovný priestor _hore"
|
msgstr "Presunúť na pracovný priestor _hore"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:100
|
#: ../src/ui/menu.c:98
|
||||||
msgid "Move to Workspace _Down"
|
msgid "Move to Workspace _Down"
|
||||||
msgstr "Presunúť na pracovný priestor _dole"
|
msgstr "Presunúť na pracovný priestor _dole"
|
||||||
|
|
||||||
#. separator
|
#. separator
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:104
|
#: ../src/ui/menu.c:102
|
||||||
msgid "_Close"
|
msgid "_Close"
|
||||||
msgstr "_Zavrieť"
|
msgstr "_Zavrieť"
|
||||||
|
|
||||||
#: ../src/ui/menu.c:204
|
#: ../src/ui/menu.c:202
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Workspace %d%n"
|
msgid "Workspace %d%n"
|
||||||
msgstr "Pracovná priestor %d%n"
|
msgstr "Pracovná priestor %d%n"
|
||||||
|
|
||||||
#: ../src/ui/menu.c:214
|
#: ../src/ui/menu.c:212
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Workspace 1_0"
|
msgid "Workspace 1_0"
|
||||||
msgstr "Pracovný priestor 1_0"
|
msgstr "Pracovný priestor 1_0"
|
||||||
|
|
||||||
#: ../src/ui/menu.c:216
|
#: ../src/ui/menu.c:214
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Workspace %s%d"
|
msgid "Workspace %s%d"
|
||||||
msgstr "Pracovný priestor %s%d"
|
msgstr "Pracovný priestor %s%d"
|
||||||
|
|
||||||
#: ../src/ui/menu.c:397
|
#: ../src/ui/menu.c:384
|
||||||
msgid "Move to Another _Workspace"
|
msgid "Move to Another _Workspace"
|
||||||
msgstr "P_resunúť na iný pracovný priestor"
|
msgstr "P_resunúť na iný pracovný priestor"
|
||||||
|
|
||||||
@@ -1066,21 +1071,21 @@ msgstr ""
|
|||||||
# MČ: Preformuloval by som koniec: „platné sú len znaky A-Za-z0-9-_“
|
# MČ: Preformuloval by som koniec: „platné sú len znaky A-Za-z0-9-_“
|
||||||
# PK: color_name je asi nejaky atribut, to sa nepreklada, ked tak do zatvorky
|
# PK: color_name je asi nejaky atribut, to sa nepreklada, ked tak do zatvorky
|
||||||
#: ../src/ui/theme.c:1219
|
#: ../src/ui/theme.c:1219
|
||||||
#, fuzzy, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Invalid character '%c' in color_name parameter of gtk:custom, only A-Za-z0-9-"
|
"Invalid character '%c' in color_name parameter of gtk:custom, only A-Za-z0-9-"
|
||||||
"_ are valid"
|
"_ are valid"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"V parametri názov_farby pre gtk:custom je neplatný znak „%c“, platné sú len "
|
"V parametri color_name (názov farby) pre gtk:custom je neplatný znak „%c“, platné sú len "
|
||||||
"znaky A-Za-z0-9-_"
|
"znaky A-Za-z0-9-_"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1233
|
#: ../src/ui/theme.c:1233
|
||||||
#, fuzzy, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Gtk:custom format is \"gtk:custom(color_name,fallback)\", \"%s\" does not "
|
"Gtk:custom format is \"gtk:custom(color_name,fallback)\", \"%s\" does not "
|
||||||
"fit the format"
|
"fit the format"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Formát Gtk:custom je „gtk:custom(názov_farby,fallback)“, „%s“ tomu "
|
"Formát Gtk:custom je „gtk:custom(color_name,fallback)“, „%s“ tomu "
|
||||||
"nezodpovedá"
|
"nezodpovedá"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1278
|
#: ../src/ui/theme.c:1278
|
||||||
@@ -1266,20 +1271,20 @@ msgid ""
|
|||||||
"Missing <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/>"
|
"Missing <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/>"
|
||||||
msgstr "Chýbajúce <frame state=„%s“ resize=„%s“ focus=„%s“ style=„whatever“/>"
|
msgstr "Chýbajúce <frame state=„%s“ resize=„%s“ focus=„%s“ style=„whatever“/>"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5084
|
#: ../src/ui/theme.c:5082
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to load theme \"%s\": %s\n"
|
msgid "Failed to load theme \"%s\": %s\n"
|
||||||
msgstr "Zlyhalo načítanie témy „%s“: %s\n"
|
msgstr "Zlyhalo načítanie témy „%s“: %s\n"
|
||||||
|
|
||||||
# PK: prvok?
|
# PK: prvok?
|
||||||
# JK: XML značka (XML tag)
|
# JK: XML značka (XML tag)
|
||||||
#: ../src/ui/theme.c:5220 ../src/ui/theme.c:5227 ../src/ui/theme.c:5234
|
#: ../src/ui/theme.c:5218 ../src/ui/theme.c:5225 ../src/ui/theme.c:5232
|
||||||
#: ../src/ui/theme.c:5241 ../src/ui/theme.c:5248
|
#: ../src/ui/theme.c:5239 ../src/ui/theme.c:5246
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "No <%s> set for theme \"%s\""
|
msgid "No <%s> set for theme \"%s\""
|
||||||
msgstr "Pre tému „%s“ nie je nastavená <%s>"
|
msgstr "Pre tému „%s“ nie je nastavená <%s>"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5256
|
#: ../src/ui/theme.c:5254
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"No frame style set for window type \"%s\" in theme \"%s\", add a <window "
|
"No frame style set for window type \"%s\" in theme \"%s\", add a <window "
|
||||||
@@ -1288,13 +1293,13 @@ msgstr ""
|
|||||||
"Pre typ okna „%s“ nie je sada štýlov v téme „%s“, pridajte prvok <window "
|
"Pre typ okna „%s“ nie je sada štýlov v téme „%s“, pridajte prvok <window "
|
||||||
"type=„%s“ style_set=„whatever“/>"
|
"type=„%s“ style_set=„whatever“/>"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5663 ../src/ui/theme.c:5725 ../src/ui/theme.c:5788
|
#: ../src/ui/theme.c:5661 ../src/ui/theme.c:5723 ../src/ui/theme.c:5786
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"User-defined constants must begin with a capital letter; \"%s\" does not"
|
"User-defined constants must begin with a capital letter; \"%s\" does not"
|
||||||
msgstr "Používateľské konštanty musia začínať veľkým písmenom, „%s“ nezačína"
|
msgstr "Používateľské konštanty musia začínať veľkým písmenom, „%s“ nezačína"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5671 ../src/ui/theme.c:5733 ../src/ui/theme.c:5796
|
#: ../src/ui/theme.c:5669 ../src/ui/theme.c:5731 ../src/ui/theme.c:5794
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Constant \"%s\" has already been defined"
|
msgid "Constant \"%s\" has already been defined"
|
||||||
msgstr "Konštanta „%s“ už je definovaná"
|
msgstr "Konštanta „%s“ už je definovaná"
|
||||||
@@ -1397,7 +1402,7 @@ msgstr "<%s> musí uvádzať buď geometriu alebo rodiča, ktorý má geometriu"
|
|||||||
msgid "You must specify a background for an alpha value to be meaningful"
|
msgid "You must specify a background for an alpha value to be meaningful"
|
||||||
msgstr "Ak má byť hodnota alpha zmysluplná, tak musíte vybrať nejaké pozadie"
|
msgstr "Ak má byť hodnota alpha zmysluplná, tak musíte vybrať nejaké pozadie"
|
||||||
|
|
||||||
# PM: asi atribút type
|
# PM: asi atribút type
|
||||||
# JK: https://bugzilla.gnome.org/show_bug.cgi?id=698123
|
# JK: https://bugzilla.gnome.org/show_bug.cgi?id=698123
|
||||||
#: ../src/ui/theme-parser.c:1264
|
#: ../src/ui/theme-parser.c:1264
|
||||||
#, fuzzy, c-format
|
#, fuzzy, c-format
|
||||||
@@ -1559,6 +1564,7 @@ msgid "\"%s\" is not a valid value for resize attribute"
|
|||||||
msgstr "„%s“ nie je platná hodnota pre atribút zmeny veľkosti"
|
msgstr "„%s“ nie je platná hodnota pre atribút zmeny veľkosti"
|
||||||
|
|
||||||
# PK: shaded states? to zatvorky daj popis co je resize
|
# PK: shaded states? to zatvorky daj popis co je resize
|
||||||
|
# PM: skôr "pre stavy maximized (maximalizovaný)/shaded (zatienený)"
|
||||||
#: ../src/ui/theme-parser.c:3147
|
#: ../src/ui/theme-parser.c:3147
|
||||||
#, fuzzy, c-format
|
#, fuzzy, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -1700,221 +1706,172 @@ msgstr "<%s> uvedený dvakrát pre túto tému"
|
|||||||
msgid "Failed to find a valid file for theme %s\n"
|
msgid "Failed to find a valid file for theme %s\n"
|
||||||
msgstr "Zlyhalo nájdenie platného súboru pre tému%s\n"
|
msgstr "Zlyhalo nájdenie platného súboru pre tému%s\n"
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:99
|
#~ msgid "Usage: %s\n"
|
||||||
msgid "_Windows"
|
#~ msgstr "Použitie: %s\n"
|
||||||
msgstr "_Okná"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:100
|
#~ msgid "_Windows"
|
||||||
msgid "_Dialog"
|
#~ msgstr "_Okná"
|
||||||
msgstr "_Dialógové okno"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:101
|
#~ msgid "_Dialog"
|
||||||
msgid "_Modal dialog"
|
#~ msgstr "_Dialógové okno"
|
||||||
msgstr "_Modálne dialógové okno"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:102
|
#~ msgid "_Modal dialog"
|
||||||
msgid "_Utility"
|
#~ msgstr "_Modálne dialógové okno"
|
||||||
msgstr "_Nástroje"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:103
|
#~ msgid "_Utility"
|
||||||
msgid "_Splashscreen"
|
#~ msgstr "_Nástroje"
|
||||||
msgstr "Ú_vodná obrazovka"
|
|
||||||
|
#~ msgid "_Splashscreen"
|
||||||
|
#~ msgstr "Ú_vodná obrazovka"
|
||||||
|
|
||||||
# MČ: nie som si istý prekladom „dok“, nemal by to byť „panel“?
|
# MČ: nie som si istý prekladom „dok“, nemal by to byť „panel“?
|
||||||
#: ../src/ui/theme-viewer.c:104
|
#~ msgid "_Top dock"
|
||||||
msgid "_Top dock"
|
#~ msgstr "_Horný panel"
|
||||||
msgstr "_Horný panel"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:105
|
#~ msgid "_Bottom dock"
|
||||||
msgid "_Bottom dock"
|
#~ msgstr "_Spodný panel"
|
||||||
msgstr "_Spodný panel"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:106
|
#~ msgid "_Left dock"
|
||||||
msgid "_Left dock"
|
#~ msgstr "Ľ_avý panel"
|
||||||
msgstr "Ľ_avý panel"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:107
|
#~ msgid "_Right dock"
|
||||||
msgid "_Right dock"
|
#~ msgstr "_Pravý panel"
|
||||||
msgstr "_Pravý panel"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:108
|
#~ msgid "_All docks"
|
||||||
msgid "_All docks"
|
#~ msgstr "_Všetky panely"
|
||||||
msgstr "_Všetky panely"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:109
|
#~ msgid "Des_ktop"
|
||||||
msgid "Des_ktop"
|
#~ msgstr "P_racovná plocha"
|
||||||
msgstr "P_racovná plocha"
|
|
||||||
|
|
||||||
# tooltip
|
# tooltip
|
||||||
#: ../src/ui/theme-viewer.c:115
|
#~ msgid "Open another one of these windows"
|
||||||
msgid "Open another one of these windows"
|
#~ msgstr "Otvorí ďalšie z týchto okien"
|
||||||
msgstr "Otvorí ďalšie z týchto okien"
|
|
||||||
|
|
||||||
# PK: prekladat to v uvodzovkach? nahlas bug
|
# PK: prekladat to v uvodzovkach? nahlas bug
|
||||||
# tooltip
|
# tooltip
|
||||||
# JK: https://bugzilla.gnome.org/show_bug.cgi?id=698123
|
# JK: https://bugzilla.gnome.org/show_bug.cgi?id=698123
|
||||||
#: ../src/ui/theme-viewer.c:117
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid "This is a demo button with an 'open' icon"
|
#~ msgid "This is a demo button with an 'open' icon"
|
||||||
msgstr "Toto je ukážkové tlačidlo s ikonou „open“"
|
#~ msgstr "Toto je ukážkové tlačidlo s ikonou „open“"
|
||||||
|
|
||||||
# tooltip
|
# tooltip
|
||||||
# JK: https://bugzilla.gnome.org/show_bug.cgi?id=698123
|
# JK: https://bugzilla.gnome.org/show_bug.cgi?id=698123
|
||||||
#: ../src/ui/theme-viewer.c:119
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid "This is a demo button with a 'quit' icon"
|
#~ msgid "This is a demo button with a 'quit' icon"
|
||||||
msgstr "Toto je ukážkové tlačidlo s ikonou „quit“"
|
#~ msgstr "Toto je ukážkové tlačidlo s ikonou „quit“"
|
||||||
|
|
||||||
# label
|
# label
|
||||||
#: ../src/ui/theme-viewer.c:248
|
#~ msgid "This is a sample message in a sample dialog"
|
||||||
msgid "This is a sample message in a sample dialog"
|
#~ msgstr "Toto je ukážková správa v ukážkovom dialógovom okne"
|
||||||
msgstr "Toto je ukážková správa v ukážkovom dialógovom okne"
|
|
||||||
|
|
||||||
# PK: falosna
|
# PK: falosna
|
||||||
#: ../src/ui/theme-viewer.c:328
|
#~ msgid "Fake menu item %d\n"
|
||||||
#, c-format
|
#~ msgstr "Falošná položka ponuky č. %d\n"
|
||||||
msgid "Fake menu item %d\n"
|
|
||||||
msgstr "Falošná položka ponuky č. %d\n"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:363
|
#~ msgid "Border-only window"
|
||||||
msgid "Border-only window"
|
#~ msgstr "Okno len s okrajom"
|
||||||
msgstr "Okno len s okrajom"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:365
|
#~ msgid "Bar"
|
||||||
msgid "Bar"
|
#~ msgstr "Lišta"
|
||||||
msgstr "Lišta"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:382
|
#~ msgid "Normal Application Window"
|
||||||
msgid "Normal Application Window"
|
#~ msgstr "Normálne aplikačné okno"
|
||||||
msgstr "Normálne aplikačné okno"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:386
|
#~ msgid "Dialog Box"
|
||||||
msgid "Dialog Box"
|
#~ msgstr "Dialógové okno"
|
||||||
msgstr "Dialógové okno"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:390
|
#~ msgid "Modal Dialog Box"
|
||||||
msgid "Modal Dialog Box"
|
#~ msgstr "Modálne dialógové okno"
|
||||||
msgstr "Modálne dialógové okno"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:394
|
#~ msgid "Utility Palette"
|
||||||
msgid "Utility Palette"
|
#~ msgstr "Paleta nástrojov"
|
||||||
msgstr "Paleta nástrojov"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:398
|
#~ msgid "Torn-off Menu"
|
||||||
msgid "Torn-off Menu"
|
#~ msgstr "Vypnúť ponuku"
|
||||||
msgstr "Vypnúť ponuku"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:402
|
#~ msgid "Border"
|
||||||
msgid "Border"
|
#~ msgstr "Okraj"
|
||||||
msgstr "Okraj"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:406
|
#~ msgid "Attached Modal Dialog"
|
||||||
msgid "Attached Modal Dialog"
|
#~ msgstr "Pričlenené modálne okno"
|
||||||
msgstr "Pričlenené modálne okno"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:737
|
#~ msgid "Button layout test %d"
|
||||||
#, c-format
|
#~ msgstr "Test rozloženia tlačidiel č. %d"
|
||||||
msgid "Button layout test %d"
|
|
||||||
msgstr "Test rozloženia tlačidiel č. %d"
|
|
||||||
|
|
||||||
# PK: plural forms
|
# PK: plural forms
|
||||||
# JK: https://bugzilla.gnome.org/show_bug.cgi?id=697987
|
# JK: https://bugzilla.gnome.org/show_bug.cgi?id=697987
|
||||||
#: ../src/ui/theme-viewer.c:766
|
#, fuzzy
|
||||||
#, fuzzy, c-format
|
#~ msgid "%g milliseconds to draw one window frame"
|
||||||
msgid "%g milliseconds to draw one window frame"
|
#~ msgstr "%g milisekúnd pre vykreslenie jedného rámca okna"
|
||||||
msgstr "%g milisekúnd pre vykreslenie jedného rámca okna"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:811
|
#~ msgid "Usage: metacity-theme-viewer [THEMENAME]\n"
|
||||||
#, c-format
|
#~ msgstr "Použitie: metacity-theme-viewer [NÁZOVTÉMY]\n"
|
||||||
msgid "Usage: metacity-theme-viewer [THEMENAME]\n"
|
|
||||||
msgstr "Použitie: metacity-theme-viewer [NÁZOVTÉMY]\n"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:818
|
#~ msgid "Error loading theme: %s\n"
|
||||||
#, c-format
|
#~ msgstr "Chyba pri načítavaní témy: %s\n"
|
||||||
msgid "Error loading theme: %s\n"
|
|
||||||
msgstr "Chyba pri načítavaní témy: %s\n"
|
|
||||||
|
|
||||||
# PK: plural forms
|
# PK: plural forms
|
||||||
# JK: https://bugzilla.gnome.org/show_bug.cgi?id=697987
|
# JK: https://bugzilla.gnome.org/show_bug.cgi?id=697987
|
||||||
#: ../src/ui/theme-viewer.c:824
|
#, fuzzy
|
||||||
#, fuzzy, c-format
|
#~ msgid "Loaded theme \"%s\" in %g seconds\n"
|
||||||
msgid "Loaded theme \"%s\" in %g seconds\n"
|
#~ msgstr "Téma „%s“ načítaná za %g sekúnd\n"
|
||||||
msgstr "Téma „%s“ načítaná za %g sekúnd\n"
|
|
||||||
|
|
||||||
# PK: inde titulku, aky je rozdiel
|
# PK: inde titulku, aky je rozdiel
|
||||||
#: ../src/ui/theme-viewer.c:869
|
#~ msgid "Normal Title Font"
|
||||||
msgid "Normal Title Font"
|
#~ msgstr "Obyčajné písmo titulku"
|
||||||
msgstr "Obyčajné písmo titulku"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:875
|
#~ msgid "Small Title Font"
|
||||||
msgid "Small Title Font"
|
#~ msgstr "Malé písmo titulku"
|
||||||
msgstr "Malé písmo titulku"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:881
|
#~ msgid "Large Title Font"
|
||||||
msgid "Large Title Font"
|
#~ msgstr "Veľké písmo titulku"
|
||||||
msgstr "Veľké písmo titulku"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:886
|
#~ msgid "Button Layouts"
|
||||||
msgid "Button Layouts"
|
#~ msgstr "Rozloženia tlačidiel"
|
||||||
msgstr "Rozloženia tlačidiel"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:891
|
#~ msgid "Benchmark"
|
||||||
msgid "Benchmark"
|
#~ msgstr "Test rýchlosti"
|
||||||
msgstr "Test rýchlosti"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:947
|
#~ msgid "Window Title Goes Here"
|
||||||
msgid "Window Title Goes Here"
|
#~ msgstr "Sem príde názov okna"
|
||||||
msgstr "Sem príde názov okna"
|
|
||||||
|
|
||||||
# PK: plural forms
|
# PK: plural forms
|
||||||
# JK: https://bugzilla.gnome.org/show_bug.cgi?id=697987
|
# JK: https://bugzilla.gnome.org/show_bug.cgi?id=697987
|
||||||
#: ../src/ui/theme-viewer.c:1053
|
#, fuzzy
|
||||||
#, fuzzy, c-format
|
#~ msgid ""
|
||||||
msgid ""
|
#~ "Drew %d frames in %g client-side seconds (%g milliseconds per frame) and "
|
||||||
"Drew %d frames in %g client-side seconds (%g milliseconds per frame) and %g "
|
#~ "%g seconds wall clock time including X server resources (%g milliseconds "
|
||||||
"seconds wall clock time including X server resources (%g milliseconds per "
|
#~ "per frame)\n"
|
||||||
"frame)\n"
|
#~ msgstr ""
|
||||||
msgstr ""
|
#~ "Vykreslených %d rámcov za %g sekúnd na strane klienta (%g milisekúnd na "
|
||||||
"Vykreslených %d rámcov za %g sekúnd na strane klienta (%g milisekúnd na "
|
#~ "rámec) a %g sekúnd celkového času vrátane zdrojov servera X (%g "
|
||||||
"rámec) a %g sekúnd celkového času vrátane zdrojov servera X (%g milisekúnd "
|
#~ "milisekúnd na rámec)\n"
|
||||||
"na rámec)\n"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:1273
|
#~ msgid "position expression test returned TRUE but set error"
|
||||||
msgid "position expression test returned TRUE but set error"
|
#~ msgstr "test výrazu polohy vrátil TRUE, ale nastavil chybu"
|
||||||
msgstr "test výrazu polohy vrátil TRUE, ale nastavil chybu"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:1275
|
#~ msgid "position expression test returned FALSE but didn't set error"
|
||||||
msgid "position expression test returned FALSE but didn't set error"
|
#~ msgstr "test výrazu polohy vrátil FALSE, ale nenastavil chybu"
|
||||||
msgstr "test výrazu polohy vrátil FALSE, ale nenastavil chybu"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:1279
|
#~ msgid "Error was expected but none given"
|
||||||
msgid "Error was expected but none given"
|
#~ msgstr "Bola očakávaná chyba, ale žiadna nenastala"
|
||||||
msgstr "Bola očakávaná chyba, ale žiadna nenastala"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:1281
|
#~ msgid "Error %d was expected but %d given"
|
||||||
#, c-format
|
#~ msgstr "Bola očakávaná chyba %d, ale nastala %d"
|
||||||
msgid "Error %d was expected but %d given"
|
|
||||||
msgstr "Bola očakávaná chyba %d, ale nastala %d"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:1287
|
#~ msgid "Error not expected but one was returned: %s"
|
||||||
#, c-format
|
#~ msgstr "Chyba nebola očakávaná, ale bola vrátená: %s"
|
||||||
msgid "Error not expected but one was returned: %s"
|
|
||||||
msgstr "Chyba nebola očakávaná, ale bola vrátená: %s"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:1291
|
#~ msgid "x value was %d, %d was expected"
|
||||||
#, c-format
|
#~ msgstr "hodnota x bola %d, očakávaná bola %d"
|
||||||
msgid "x value was %d, %d was expected"
|
|
||||||
msgstr "hodnota x bola %d, očakávaná bola %d"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:1294
|
#~ msgid "y value was %d, %d was expected"
|
||||||
#, c-format
|
#~ msgstr "hodnota y bola %d, očakávaná bola %d"
|
||||||
msgid "y value was %d, %d was expected"
|
|
||||||
msgstr "hodnota y bola %d, očakávaná bola %d"
|
|
||||||
|
|
||||||
# PK: plural forms
|
# PK: plural forms
|
||||||
# JK: https://bugzilla.gnome.org/show_bug.cgi?id=697987
|
# JK: https://bugzilla.gnome.org/show_bug.cgi?id=697987
|
||||||
#: ../src/ui/theme-viewer.c:1359
|
#, fuzzy
|
||||||
#, fuzzy, c-format
|
#~ msgid ""
|
||||||
msgid "%d coordinate expressions parsed in %g seconds (%g seconds average)\n"
|
#~ "%d coordinate expressions parsed in %g seconds (%g seconds average)\n"
|
||||||
msgstr ""
|
#~ msgstr ""
|
||||||
"%d výrazov pre súradnice analyzovaných za %g sekúnd (priemer %g sekúnd)\n"
|
#~ "%d výrazov pre súradnice analyzovaných za %g sekúnd (priemer %g sekúnd)\n"
|
||||||
|
|||||||
762
po/sr@latin.po
762
po/sr@latin.po
File diff suppressed because it is too large
Load Diff
1288
po/zh_CN.po
1288
po/zh_CN.po
File diff suppressed because it is too large
Load Diff
1397
po/zh_HK.po
1397
po/zh_HK.po
File diff suppressed because it is too large
Load Diff
1425
po/zh_TW.po
1425
po/zh_TW.po
File diff suppressed because it is too large
Load Diff
209
src/Makefile.am
209
src/Makefile.am
@@ -1,60 +1,67 @@
|
|||||||
# Flag build for parallelism; see https://savannah.gnu.org/patch/?6905
|
# Flag build for parallelism; see https://savannah.gnu.org/patch/?6905
|
||||||
.AUTOPARALLEL:
|
.AUTOPARALLEL:
|
||||||
|
|
||||||
lib_LTLIBRARIES = libmutter-wayland.la
|
lib_LTLIBRARIES = libmutter.la
|
||||||
|
|
||||||
SUBDIRS=compositor/plugins
|
SUBDIRS=compositor/plugins
|
||||||
|
|
||||||
INCLUDES= \
|
AM_CPPFLAGS = \
|
||||||
-DCLUTTER_ENABLE_COMPOSITOR_API \
|
-DCLUTTER_ENABLE_COMPOSITOR_API \
|
||||||
-DCLUTTER_ENABLE_EXPERIMENTAL_API \
|
-DCLUTTER_ENABLE_EXPERIMENTAL_API \
|
||||||
-DCOGL_ENABLE_EXPERIMENTAL_API \
|
-DCOGL_ENABLE_EXPERIMENTAL_API \
|
||||||
-DCOGL_ENABLE_EXPERIMENTAL_2_0_API \
|
-DCOGL_ENABLE_EXPERIMENTAL_2_0_API \
|
||||||
|
-DCLUTTER_DISABLE_DEPRECATION_WARNINGS \
|
||||||
|
-DCOGL_DISABLE_DEPRECATION_WARNINGS \
|
||||||
$(MUTTER_CFLAGS) \
|
$(MUTTER_CFLAGS) \
|
||||||
-I$(top_builddir) \
|
$(MUTTER_NATIVE_BACKEND_CFLAGS) \
|
||||||
|
-I$(builddir) \
|
||||||
-I$(srcdir) \
|
-I$(srcdir) \
|
||||||
-I$(srcdir)/backends \
|
-I$(srcdir)/backends \
|
||||||
-I$(srcdir)/core \
|
-I$(srcdir)/core \
|
||||||
-I$(srcdir)/ui \
|
-I$(srcdir)/ui \
|
||||||
-I$(srcdir)/compositor \
|
-I$(srcdir)/compositor \
|
||||||
-DMUTTER_LIBEXECDIR=\"$(libexecdir)\" \
|
-DMUTTER_LIBEXECDIR=\"$(libexecdir)\" \
|
||||||
-DHOST_ALIAS=\"@HOST_ALIAS@\" \
|
-DMUTTER_LOCALEDIR=\"$(localedir)\" \
|
||||||
-DMUTTER_LOCALEDIR=\"$(prefix)/@DATADIRNAME@/locale\" \
|
|
||||||
-DMUTTER_PKGDATADIR=\"$(pkgdatadir)\" \
|
-DMUTTER_PKGDATADIR=\"$(pkgdatadir)\" \
|
||||||
-DMUTTER_DATADIR=\"$(datadir)\" \
|
-DMUTTER_DATADIR=\"$(datadir)\" \
|
||||||
-DG_LOG_DOMAIN=\"mutter\" \
|
-DG_LOG_DOMAIN=\"mutter\" \
|
||||||
-DSN_API_NOT_YET_FROZEN=1 \
|
-DSN_API_NOT_YET_FROZEN=1 \
|
||||||
-DMUTTER_MAJOR_VERSION=$(MUTTER_MAJOR_VERSION) \
|
|
||||||
-DMUTTER_MINOR_VERSION=$(MUTTER_MINOR_VERSION) \
|
|
||||||
-DMUTTER_MICRO_VERSION=$(MUTTER_MICRO_VERSION) \
|
|
||||||
-DMUTTER_PLUGIN_API_VERSION=$(MUTTER_PLUGIN_API_VERSION) \
|
|
||||||
-DMUTTER_PKGLIBDIR=\"$(pkglibdir)\" \
|
-DMUTTER_PKGLIBDIR=\"$(pkglibdir)\" \
|
||||||
-DMUTTER_PLUGIN_DIR=\"@MUTTER_PLUGIN_DIR@\" \
|
-DMUTTER_PLUGIN_DIR=\"$(MUTTER_PLUGIN_DIR)\" \
|
||||||
-DGETTEXT_PACKAGE=\"$(GETTEXT_PACKAGE)\" \
|
-DGETTEXT_PACKAGE=\"$(GETTEXT_PACKAGE)\" \
|
||||||
-DXWAYLAND_PATH='"@XWAYLAND_PATH@"'
|
-DXWAYLAND_PATH=\"$(XWAYLAND_PATH)\"
|
||||||
|
|
||||||
mutter_built_sources = \
|
mutter_built_sources = \
|
||||||
$(dbus_idle_built_sources) \
|
$(dbus_idle_built_sources) \
|
||||||
$(dbus_display_config_built_sources) \
|
$(dbus_display_config_built_sources) \
|
||||||
|
$(dbus_login1_built_sources) \
|
||||||
mutter-enum-types.h \
|
mutter-enum-types.h \
|
||||||
mutter-enum-types.c \
|
mutter-enum-types.c
|
||||||
|
|
||||||
|
if HAVE_WAYLAND
|
||||||
|
mutter_built_sources += \
|
||||||
gtk-shell-protocol.c \
|
gtk-shell-protocol.c \
|
||||||
gtk-shell-server-protocol.h \
|
gtk-shell-server-protocol.h \
|
||||||
xdg-shell-protocol.c \
|
xdg-shell-protocol.c \
|
||||||
xdg-shell-server-protocol.h
|
xdg-shell-server-protocol.h
|
||||||
|
endif
|
||||||
|
|
||||||
wayland_protocols = \
|
wayland_protocols = \
|
||||||
wayland/protocol/gtk-shell.xml \
|
wayland/protocol/gtk-shell.xml \
|
||||||
wayland/protocol/xdg-shell.xml
|
wayland/protocol/xdg-shell.xml
|
||||||
|
|
||||||
libmutter_wayland_la_SOURCES = \
|
libmutter_la_SOURCES = \
|
||||||
backends/meta-backend.c \
|
backends/meta-backend.c \
|
||||||
backends/meta-backend.h \
|
meta/meta-backend.h \
|
||||||
|
backends/meta-backend-private.h \
|
||||||
backends/meta-cursor.c \
|
backends/meta-cursor.c \
|
||||||
backends/meta-cursor.h \
|
backends/meta-cursor.h \
|
||||||
backends/meta-cursor-private.h \
|
backends/meta-cursor-private.h \
|
||||||
backends/meta-cursor-tracker.c \
|
backends/meta-cursor-tracker.c \
|
||||||
backends/meta-cursor-tracker-private.h \
|
backends/meta-cursor-tracker-private.h \
|
||||||
|
backends/meta-cursor-renderer.c \
|
||||||
|
backends/meta-cursor-renderer.h \
|
||||||
|
backends/meta-display-config-shared.h \
|
||||||
backends/meta-idle-monitor.c \
|
backends/meta-idle-monitor.c \
|
||||||
backends/meta-idle-monitor-private.h \
|
backends/meta-idle-monitor-private.h \
|
||||||
backends/meta-idle-monitor-dbus.c \
|
backends/meta-idle-monitor-dbus.c \
|
||||||
@@ -65,20 +72,20 @@ libmutter_wayland_la_SOURCES = \
|
|||||||
backends/meta-monitor-manager.h \
|
backends/meta-monitor-manager.h \
|
||||||
backends/meta-monitor-manager-dummy.c \
|
backends/meta-monitor-manager-dummy.c \
|
||||||
backends/meta-monitor-manager-dummy.h \
|
backends/meta-monitor-manager-dummy.h \
|
||||||
|
backends/meta-stage.h \
|
||||||
|
backends/meta-stage.c \
|
||||||
backends/edid-parse.c \
|
backends/edid-parse.c \
|
||||||
backends/edid.h \
|
backends/edid.h \
|
||||||
backends/native/meta-idle-monitor-native.c \
|
backends/x11/meta-backend-x11.c \
|
||||||
backends/native/meta-idle-monitor-native.h \
|
backends/x11/meta-backend-x11.h \
|
||||||
backends/native/meta-monitor-manager-kms.c \
|
backends/x11/meta-cursor-renderer-x11.c \
|
||||||
backends/native/meta-monitor-manager-kms.h \
|
backends/x11/meta-cursor-renderer-x11.h \
|
||||||
backends/native/meta-weston-launch.c \
|
|
||||||
backends/native/meta-weston-launch.h \
|
|
||||||
backends/x11/meta-idle-monitor-xsync.c \
|
backends/x11/meta-idle-monitor-xsync.c \
|
||||||
backends/x11/meta-idle-monitor-xsync.h \
|
backends/x11/meta-idle-monitor-xsync.h \
|
||||||
backends/x11/meta-monitor-manager-xrandr.c \
|
backends/x11/meta-monitor-manager-xrandr.c \
|
||||||
backends/x11/meta-monitor-manager-xrandr.h \
|
backends/x11/meta-monitor-manager-xrandr.h \
|
||||||
backends/x11/meta-xrandr-shared.h \
|
core/meta-accel-parse.c \
|
||||||
core/above-tab-keycode.c \
|
core/meta-accel-parse.h \
|
||||||
core/barrier.c \
|
core/barrier.c \
|
||||||
meta/barrier.h \
|
meta/barrier.h \
|
||||||
core/bell.c \
|
core/bell.c \
|
||||||
@@ -111,8 +118,6 @@ libmutter_wayland_la_SOURCES = \
|
|||||||
compositor/meta-surface-actor.h \
|
compositor/meta-surface-actor.h \
|
||||||
compositor/meta-surface-actor-x11.c \
|
compositor/meta-surface-actor-x11.c \
|
||||||
compositor/meta-surface-actor-x11.h \
|
compositor/meta-surface-actor-x11.h \
|
||||||
compositor/meta-surface-actor-wayland.c \
|
|
||||||
compositor/meta-surface-actor-wayland.h \
|
|
||||||
compositor/meta-texture-rectangle.c \
|
compositor/meta-texture-rectangle.c \
|
||||||
compositor/meta-texture-rectangle.h \
|
compositor/meta-texture-rectangle.h \
|
||||||
compositor/meta-texture-tower.c \
|
compositor/meta-texture-tower.c \
|
||||||
@@ -150,6 +155,8 @@ libmutter_wayland_la_SOURCES = \
|
|||||||
core/frame.h \
|
core/frame.h \
|
||||||
ui/gradient.c \
|
ui/gradient.c \
|
||||||
meta/gradient.h \
|
meta/gradient.h \
|
||||||
|
core/meta-gesture-tracker.c \
|
||||||
|
core/meta-gesture-tracker-private.h \
|
||||||
core/keybindings.c \
|
core/keybindings.c \
|
||||||
core/keybindings-private.h \
|
core/keybindings-private.h \
|
||||||
core/main.c \
|
core/main.c \
|
||||||
@@ -161,6 +168,7 @@ libmutter_wayland_la_SOURCES = \
|
|||||||
core/screen-private.h \
|
core/screen-private.h \
|
||||||
meta/screen.h \
|
meta/screen.h \
|
||||||
meta/types.h \
|
meta/types.h \
|
||||||
|
core/restart.c \
|
||||||
core/stack.c \
|
core/stack.c \
|
||||||
core/stack.h \
|
core/stack.h \
|
||||||
core/stack-tracker.c \
|
core/stack-tracker.c \
|
||||||
@@ -178,10 +186,6 @@ libmutter_wayland_la_SOURCES = \
|
|||||||
ui/ui.h \
|
ui/ui.h \
|
||||||
ui/frames.c \
|
ui/frames.c \
|
||||||
ui/frames.h \
|
ui/frames.h \
|
||||||
ui/menu.c \
|
|
||||||
ui/menu.h \
|
|
||||||
ui/metaaccellabel.c \
|
|
||||||
ui/metaaccellabel.h \
|
|
||||||
ui/resizepopup.c \
|
ui/resizepopup.c \
|
||||||
ui/resizepopup.h \
|
ui/resizepopup.h \
|
||||||
ui/theme-parser.c \
|
ui/theme-parser.c \
|
||||||
@@ -193,6 +197,8 @@ libmutter_wayland_la_SOURCES = \
|
|||||||
x11/iconcache.h \
|
x11/iconcache.h \
|
||||||
x11/async-getprop.c \
|
x11/async-getprop.c \
|
||||||
x11/async-getprop.h \
|
x11/async-getprop.h \
|
||||||
|
x11/events.c \
|
||||||
|
x11/events.h \
|
||||||
x11/group-private.h \
|
x11/group-private.h \
|
||||||
x11/group-props.c \
|
x11/group-props.c \
|
||||||
x11/group-props.h \
|
x11/group-props.h \
|
||||||
@@ -207,7 +213,12 @@ libmutter_wayland_la_SOURCES = \
|
|||||||
x11/window-x11-private.h \
|
x11/window-x11-private.h \
|
||||||
x11/xprops.c \
|
x11/xprops.c \
|
||||||
x11/xprops.h \
|
x11/xprops.h \
|
||||||
x11/mutter-Xatomtype.h \
|
x11/mutter-Xatomtype.h
|
||||||
|
|
||||||
|
if HAVE_WAYLAND
|
||||||
|
libmutter_la_SOURCES += \
|
||||||
|
compositor/meta-surface-actor-wayland.c \
|
||||||
|
compositor/meta-surface-actor-wayland.h \
|
||||||
wayland/meta-wayland.c \
|
wayland/meta-wayland.c \
|
||||||
wayland/meta-wayland.h \
|
wayland/meta-wayland.h \
|
||||||
wayland/meta-wayland-private.h \
|
wayland/meta-wayland-private.h \
|
||||||
@@ -222,24 +233,43 @@ libmutter_wayland_la_SOURCES = \
|
|||||||
wayland/meta-wayland-pointer.h \
|
wayland/meta-wayland-pointer.h \
|
||||||
wayland/meta-wayland-seat.c \
|
wayland/meta-wayland-seat.c \
|
||||||
wayland/meta-wayland-seat.h \
|
wayland/meta-wayland-seat.h \
|
||||||
wayland/meta-wayland-stage.h \
|
wayland/meta-wayland-touch.c \
|
||||||
wayland/meta-wayland-stage.c \
|
wayland/meta-wayland-touch.h \
|
||||||
wayland/meta-wayland-surface.c \
|
wayland/meta-wayland-surface.c \
|
||||||
wayland/meta-wayland-surface.h \
|
wayland/meta-wayland-surface.h \
|
||||||
wayland/meta-wayland-types.h \
|
wayland/meta-wayland-types.h \
|
||||||
wayland/meta-wayland-versions.h \
|
wayland/meta-wayland-versions.h \
|
||||||
|
wayland/meta-wayland-outputs.c \
|
||||||
|
wayland/meta-wayland-outputs.h \
|
||||||
wayland/window-wayland.c \
|
wayland/window-wayland.c \
|
||||||
wayland/window-wayland.h
|
wayland/window-wayland.h
|
||||||
|
endif
|
||||||
|
|
||||||
nodist_libmutter_wayland_la_SOURCES = \
|
if HAVE_NATIVE_BACKEND
|
||||||
|
libmutter_la_SOURCES += \
|
||||||
|
backends/native/meta-backend-native.c \
|
||||||
|
backends/native/meta-backend-native.h \
|
||||||
|
backends/native/meta-cursor-renderer-native.c \
|
||||||
|
backends/native/meta-cursor-renderer-native.h \
|
||||||
|
backends/native/meta-idle-monitor-native.c \
|
||||||
|
backends/native/meta-idle-monitor-native.h \
|
||||||
|
backends/native/meta-monitor-manager-kms.c \
|
||||||
|
backends/native/meta-monitor-manager-kms.h \
|
||||||
|
backends/native/meta-launcher.c \
|
||||||
|
backends/native/meta-launcher.h \
|
||||||
|
backends/native/dbus-utils.c \
|
||||||
|
backends/native/dbus-utils.h
|
||||||
|
endif
|
||||||
|
|
||||||
|
nodist_libmutter_la_SOURCES = \
|
||||||
$(mutter_built_sources)
|
$(mutter_built_sources)
|
||||||
|
|
||||||
libmutter_wayland_la_LDFLAGS = -no-undefined
|
libmutter_la_LDFLAGS = -no-undefined
|
||||||
libmutter_wayland_la_LIBADD = $(MUTTER_LIBS)
|
libmutter_la_LIBADD = $(MUTTER_LIBS) $(MUTTER_NATIVE_BACKEND_LIBS)
|
||||||
|
|
||||||
# Headers installed for plugins; introspected information will
|
# Headers installed for plugins; introspected information will
|
||||||
# be extracted into Mutter-<version>.gir
|
# be extracted into Mutter-<version>.gir
|
||||||
libmutterinclude_base_headers = \
|
libmutterinclude_headers = \
|
||||||
meta/barrier.h \
|
meta/barrier.h \
|
||||||
meta/boxes.h \
|
meta/boxes.h \
|
||||||
meta/common.h \
|
meta/common.h \
|
||||||
@@ -251,6 +281,7 @@ libmutterinclude_base_headers = \
|
|||||||
meta/group.h \
|
meta/group.h \
|
||||||
meta/keybindings.h \
|
meta/keybindings.h \
|
||||||
meta/main.h \
|
meta/main.h \
|
||||||
|
meta/meta-backend.h \
|
||||||
meta/meta-background-actor.h \
|
meta/meta-background-actor.h \
|
||||||
meta/meta-background-group.h \
|
meta/meta-background-group.h \
|
||||||
meta/meta-background.h \
|
meta/meta-background.h \
|
||||||
@@ -268,34 +299,35 @@ libmutterinclude_base_headers = \
|
|||||||
meta/window.h \
|
meta/window.h \
|
||||||
meta/workspace.h
|
meta/workspace.h
|
||||||
|
|
||||||
|
libmutterinclude_built_headers = \
|
||||||
|
meta/meta-version.h
|
||||||
|
|
||||||
|
libmutterinclude_base_headers = \
|
||||||
|
$(libmutterinclude_headers) \
|
||||||
|
$(libmutterinclude_built_headers)
|
||||||
|
|
||||||
# Excluded from scanning for introspection but installed
|
# Excluded from scanning for introspection but installed
|
||||||
# atomnames.h: macros cause problems for scanning process
|
# atomnames.h: macros cause problems for scanning process
|
||||||
libmutterinclude_extra_headers = \
|
libmutterinclude_extra_headers = \
|
||||||
meta/atomnames.h
|
meta/atomnames.h
|
||||||
|
|
||||||
libmutterincludedir = $(includedir)/mutter-wayland/meta
|
libmutterincludedir = $(includedir)/mutter/meta
|
||||||
|
|
||||||
libmutterinclude_HEADERS = \
|
libmutterinclude_HEADERS = \
|
||||||
$(libmutterinclude_base_headers) \
|
$(libmutterinclude_headers) \
|
||||||
$(libmutterinclude_extra_headers)
|
$(libmutterinclude_extra_headers)
|
||||||
|
|
||||||
bin_PROGRAMS=mutter-wayland
|
nodist_libmutterinclude_HEADERS = \
|
||||||
|
$(libmutterinclude_built_headers)
|
||||||
|
|
||||||
mutter_wayland_SOURCES = core/mutter.c
|
bin_PROGRAMS=mutter
|
||||||
mutter_wayland_LDADD = $(MUTTER_LIBS) libmutter-wayland.la
|
|
||||||
|
|
||||||
bin_PROGRAMS+=mutter-launch
|
mutter_SOURCES = core/mutter.c
|
||||||
|
mutter_LDADD = $(MUTTER_LIBS) libmutter.la
|
||||||
|
|
||||||
mutter_launch_SOURCES = \
|
libexec_PROGRAMS = mutter-restart-helper
|
||||||
backends/native/weston-launch.c \
|
mutter_restart_helper_SOURCES = core/restart-helper.c
|
||||||
backends/native/weston-launch.h
|
mutter_restart_helper_LDADD = $(MUTTER_LIBS)
|
||||||
|
|
||||||
mutter_launch_CFLAGS = $(MUTTER_LAUNCH_CFLAGS) -DLIBDIR=\"$(libdir)\"
|
|
||||||
mutter_launch_LDFLAGS = $(MUTTER_LAUNCH_LIBS) -lpam
|
|
||||||
|
|
||||||
install-exec-hook:
|
|
||||||
-chown root $(DESTDIR)$(bindir)/mutter-launch
|
|
||||||
-chmod u+s $(DESTDIR)$(bindir)/mutter-launch
|
|
||||||
|
|
||||||
if HAVE_INTROSPECTION
|
if HAVE_INTROSPECTION
|
||||||
include $(INTROSPECTION_MAKEFILE)
|
include $(INTROSPECTION_MAKEFILE)
|
||||||
@@ -317,15 +349,15 @@ typelib_DATA = Meta-$(api_version).typelib
|
|||||||
|
|
||||||
INTROSPECTION_GIRS = Meta-$(api_version).gir
|
INTROSPECTION_GIRS = Meta-$(api_version).gir
|
||||||
|
|
||||||
Meta-$(api_version).gir: libmutter-wayland.la
|
Meta-$(api_version).gir: libmutter.la
|
||||||
@META_GIR@_INCLUDES = GObject-2.0 GDesktopEnums-3.0 Gdk-3.0 Gtk-3.0 Clutter-1.0 xlib-2.0 xfixes-4.0 Cogl-1.0
|
@META_GIR@_INCLUDES = GObject-2.0 GDesktopEnums-3.0 Gdk-3.0 Gtk-3.0 Clutter-1.0 xlib-2.0 xfixes-4.0 Cogl-1.0
|
||||||
@META_GIR@_EXPORT_PACKAGES = libmutter-wayland
|
@META_GIR@_EXPORT_PACKAGES = libmutter
|
||||||
@META_GIR@_CFLAGS = $(INCLUDES)
|
@META_GIR@_CFLAGS = $(AM_CPPFLAGS)
|
||||||
@META_GIR@_LIBS = libmutter-wayland.la
|
@META_GIR@_LIBS = libmutter.la
|
||||||
@META_GIR@_FILES = \
|
@META_GIR@_FILES = \
|
||||||
mutter-enum-types.h \
|
mutter-enum-types.h \
|
||||||
$(libmutterinclude_base_headers) \
|
$(libmutterinclude_base_headers) \
|
||||||
$(filter %.c,$(libmutter_wayland_la_SOURCES) $(nodist_libmutter_wayland_la_SOURCES))
|
$(filter %.c,$(libmutter_la_SOURCES) $(nodist_libmutter_la_SOURCES))
|
||||||
@META_GIR@_SCANNERFLAGS = --warn-all --warn-error
|
@META_GIR@_SCANNERFLAGS = --warn-all --warn-error
|
||||||
|
|
||||||
endif
|
endif
|
||||||
@@ -336,64 +368,36 @@ testasyncgetprop_SOURCES = x11/testasyncgetprop.c
|
|||||||
|
|
||||||
noinst_PROGRAMS=testboxes testgradient testasyncgetprop
|
noinst_PROGRAMS=testboxes testgradient testasyncgetprop
|
||||||
|
|
||||||
testboxes_LDADD = $(MUTTER_LIBS) libmutter-wayland.la
|
testboxes_LDADD = $(MUTTER_LIBS) libmutter.la
|
||||||
testgradient_LDADD = $(MUTTER_LIBS) libmutter-wayland.la
|
testgradient_LDADD = $(MUTTER_LIBS) libmutter.la
|
||||||
testasyncgetprop_LDADD = $(MUTTER_LIBS) libmutter-wayland.la
|
testasyncgetprop_LDADD = $(MUTTER_LIBS) libmutter.la
|
||||||
|
|
||||||
@INTLTOOL_DESKTOP_RULE@
|
|
||||||
|
|
||||||
desktopfilesdir=$(datadir)/applications
|
|
||||||
desktopfiles_in_files=mutter-wayland.desktop.in
|
|
||||||
desktopfiles_files=$(desktopfiles_in_files:.desktop.in=.desktop)
|
|
||||||
desktopfiles_DATA = $(desktopfiles_files)
|
|
||||||
|
|
||||||
xmldir = @GNOME_KEYBINDINGS_KEYSDIR@
|
|
||||||
xml_in_files = \
|
|
||||||
50-mutter-navigation.xml.in \
|
|
||||||
50-mutter-system.xml.in \
|
|
||||||
50-mutter-windows.xml.in
|
|
||||||
xml_DATA = $(xml_in_files:.xml.in=.xml)
|
|
||||||
|
|
||||||
dbus_idle_built_sources = meta-dbus-idle-monitor.c meta-dbus-idle-monitor.h
|
dbus_idle_built_sources = meta-dbus-idle-monitor.c meta-dbus-idle-monitor.h
|
||||||
|
|
||||||
gsettings_SCHEMAS = org.gnome.mutter.gschema.xml org.gnome.mutter.wayland.gschema.xml
|
|
||||||
@INTLTOOL_XML_NOMERGE_RULE@
|
|
||||||
@GSETTINGS_RULES@
|
|
||||||
|
|
||||||
convertdir = $(datadir)/GConf/gsettings
|
|
||||||
convert_DATA = mutter-schemas.convert
|
|
||||||
|
|
||||||
CLEANFILES = \
|
CLEANFILES = \
|
||||||
mutter-wayland.desktop \
|
|
||||||
mutter-wm.desktop \
|
|
||||||
org.gnome.mutter.gschema.xml \
|
|
||||||
org.gnome.mutter.wayland.gschema.xml \
|
|
||||||
$(xml_DATA) \
|
|
||||||
$(mutter_built_sources) \
|
$(mutter_built_sources) \
|
||||||
$(typelib_DATA) \
|
$(typelib_DATA) \
|
||||||
$(gir_DATA)
|
$(gir_DATA)
|
||||||
|
|
||||||
|
DISTCLEANFILES = \
|
||||||
|
$(libmutterinclude_built_headers)
|
||||||
|
|
||||||
pkgconfigdir = $(libdir)/pkgconfig
|
pkgconfigdir = $(libdir)/pkgconfig
|
||||||
|
pkgconfig_DATA = libmutter.pc
|
||||||
|
|
||||||
pkgconfig_DATA = libmutter-wayland.pc
|
EXTRA_DIST = \
|
||||||
|
|
||||||
EXTRA_DIST=$(desktopfiles_files) \
|
|
||||||
$(wmproperties_files) \
|
|
||||||
$(IMAGES) \
|
|
||||||
$(desktopfiles_in_files) \
|
|
||||||
$(wmproperties_in_files) \
|
|
||||||
$(xml_in_files) \
|
|
||||||
$(wayland_protocols) \
|
$(wayland_protocols) \
|
||||||
org.gnome.mutter.gschema.xml.in \
|
libmutter.pc.in \
|
||||||
org.gnome.mutter.wayland.gschema.xml.in \
|
|
||||||
mutter-schemas.convert \
|
|
||||||
libmutter-wayland.pc.in \
|
|
||||||
mutter-enum-types.h.in \
|
mutter-enum-types.h.in \
|
||||||
mutter-enum-types.c.in \
|
mutter-enum-types.c.in \
|
||||||
|
org.freedesktop.login1.xml \
|
||||||
org.gnome.Mutter.DisplayConfig.xml \
|
org.gnome.Mutter.DisplayConfig.xml \
|
||||||
org.gnome.Mutter.IdleMonitor.xml
|
org.gnome.Mutter.IdleMonitor.xml
|
||||||
|
|
||||||
BUILT_SOURCES = $(mutter_built_sources)
|
BUILT_SOURCES = \
|
||||||
|
$(mutter_built_sources) \
|
||||||
|
$(libmutterinclude_built_headers)
|
||||||
|
|
||||||
MUTTER_STAMP_FILES = stamp-mutter-enum-types.h
|
MUTTER_STAMP_FILES = stamp-mutter-enum-types.h
|
||||||
CLEANFILES += $(MUTTER_STAMP_FILES)
|
CLEANFILES += $(MUTTER_STAMP_FILES)
|
||||||
|
|
||||||
@@ -433,6 +437,15 @@ $(dbus_idle_built_sources) : Makefile.am org.gnome.Mutter.IdleMonitor.xml
|
|||||||
--c-generate-object-manager \
|
--c-generate-object-manager \
|
||||||
$(srcdir)/org.gnome.Mutter.IdleMonitor.xml
|
$(srcdir)/org.gnome.Mutter.IdleMonitor.xml
|
||||||
|
|
||||||
|
dbus_login1_built_sources = meta-dbus-login1.c meta-dbus-login1.h
|
||||||
|
|
||||||
|
$(dbus_login1_built_sources) : Makefile.am org.freedesktop.login1.xml
|
||||||
|
$(AM_V_GEN)gdbus-codegen \
|
||||||
|
--interface-prefix org.freedesktop.login1 \
|
||||||
|
--c-namespace Login1 \
|
||||||
|
--generate-c-code meta-dbus-login1 \
|
||||||
|
$(srcdir)/org.freedesktop.login1.xml
|
||||||
|
|
||||||
%-protocol.c : $(srcdir)/wayland/protocol/%.xml
|
%-protocol.c : $(srcdir)/wayland/protocol/%.xml
|
||||||
$(AM_V_GEN)$(WAYLAND_SCANNER) code < $< > $@
|
$(AM_V_GEN)$(WAYLAND_SCANNER) code < $< > $@
|
||||||
%-server-protocol.h : $(srcdir)/wayland/protocol/%.xml
|
%-server-protocol.h : $(srcdir)/wayland/protocol/%.xml
|
||||||
|
|||||||
@@ -179,7 +179,7 @@ decode_display_parameters (const uchar *edid, MonitorInfo *info)
|
|||||||
else if (edid[0x16] == 0)
|
else if (edid[0x16] == 0)
|
||||||
{
|
{
|
||||||
info->width_mm = -1;
|
info->width_mm = -1;
|
||||||
info->height_mm = -1;
|
info->height_mm = -1;
|
||||||
info->aspect_ratio = 100.0 / (edid[0x15] + 99);
|
info->aspect_ratio = 100.0 / (edid[0x15] + 99);
|
||||||
}
|
}
|
||||||
else if (edid[0x15] == 0)
|
else if (edid[0x15] == 0)
|
||||||
@@ -267,7 +267,7 @@ decode_color_characteristics (const uchar *edid, MonitorInfo *info)
|
|||||||
static int
|
static int
|
||||||
decode_established_timings (const uchar *edid, MonitorInfo *info)
|
decode_established_timings (const uchar *edid, MonitorInfo *info)
|
||||||
{
|
{
|
||||||
static const Timing established[][8] =
|
static const Timing established[][8] =
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
{ 800, 600, 60 },
|
{ 800, 600, 60 },
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
/* edid.h
|
/* edid.h
|
||||||
*
|
*
|
||||||
* Copyright 2007, 2008, Red Hat, Inc.
|
* Copyright 2007, 2008, Red Hat, Inc.
|
||||||
*
|
*
|
||||||
* This file is part of the Gnome Library.
|
* This file is part of the Gnome Library.
|
||||||
*
|
*
|
||||||
* The Gnome Library is free software; you can redistribute it and/or
|
* The Gnome Library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Library General Public License as
|
* modify it under the terms of the GNU Library General Public License as
|
||||||
* published by the Free Software Foundation; either version 2 of the
|
* published by the Free Software Foundation; either version 2 of the
|
||||||
@@ -13,12 +13,12 @@
|
|||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
* Library General Public License for more details.
|
* Library General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU Library General Public
|
* You should have received a copy of the GNU Library General Public
|
||||||
* License along with the Gnome Library; see the file COPYING.LIB. If not,
|
* License along with the Gnome Library; see the file COPYING.LIB. If not,
|
||||||
* write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
* write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||||
* Boston, MA 02110-1301, USA.
|
* Boston, MA 02110-1301, USA.
|
||||||
*
|
*
|
||||||
* Author: Soren Sandmann <sandmann@redhat.com>
|
* Author: Soren Sandmann <sandmann@redhat.com>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -177,7 +177,7 @@ struct MonitorInfo
|
|||||||
DetailedTiming detailed_timings[4]; /* If monitor has a preferred
|
DetailedTiming detailed_timings[4]; /* If monitor has a preferred
|
||||||
* mode, it is the first one
|
* mode, it is the first one
|
||||||
* (whether it has, is
|
* (whether it has, is
|
||||||
* determined by the
|
* determined by the
|
||||||
* preferred_timing_includes
|
* preferred_timing_includes
|
||||||
* bit.
|
* bit.
|
||||||
*/
|
*/
|
||||||
|
|||||||
110
src/backends/meta-backend-private.h
Normal file
110
src/backends/meta-backend-private.h
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2014 Red Hat
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
|
*
|
||||||
|
* Written by:
|
||||||
|
* Jasper St. Pierre <jstpierre@mecheye.net>
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef META_BACKEND_PRIVATE_H
|
||||||
|
#define META_BACKEND_PRIVATE_H
|
||||||
|
|
||||||
|
#include <glib-object.h>
|
||||||
|
|
||||||
|
#include <xkbcommon/xkbcommon.h>
|
||||||
|
|
||||||
|
#include <meta/meta-backend.h>
|
||||||
|
#include <meta/meta-idle-monitor.h>
|
||||||
|
#include "meta-cursor-renderer.h"
|
||||||
|
#include "meta-monitor-manager.h"
|
||||||
|
|
||||||
|
#define DEFAULT_XKB_RULES_FILE "evdev"
|
||||||
|
#define DEFAULT_XKB_MODEL "pc105+inet"
|
||||||
|
|
||||||
|
#define META_TYPE_BACKEND (meta_backend_get_type ())
|
||||||
|
#define META_BACKEND(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_BACKEND, MetaBackend))
|
||||||
|
#define META_BACKEND_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_BACKEND, MetaBackendClass))
|
||||||
|
#define META_IS_BACKEND(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_BACKEND))
|
||||||
|
#define META_IS_BACKEND_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_BACKEND))
|
||||||
|
#define META_BACKEND_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), META_TYPE_BACKEND, MetaBackendClass))
|
||||||
|
|
||||||
|
struct _MetaBackend
|
||||||
|
{
|
||||||
|
GObject parent;
|
||||||
|
|
||||||
|
MetaIdleMonitor *device_monitors[256];
|
||||||
|
int device_id_max;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct _MetaBackendClass
|
||||||
|
{
|
||||||
|
GObjectClass parent_class;
|
||||||
|
|
||||||
|
void (* post_init) (MetaBackend *backend);
|
||||||
|
|
||||||
|
MetaIdleMonitor * (* create_idle_monitor) (MetaBackend *backend,
|
||||||
|
int device_id);
|
||||||
|
MetaMonitorManager * (* create_monitor_manager) (MetaBackend *backend);
|
||||||
|
MetaCursorRenderer * (* create_cursor_renderer) (MetaBackend *backend);
|
||||||
|
|
||||||
|
gboolean (* grab_device) (MetaBackend *backend,
|
||||||
|
int device_id,
|
||||||
|
uint32_t timestamp);
|
||||||
|
gboolean (* ungrab_device) (MetaBackend *backend,
|
||||||
|
int device_id,
|
||||||
|
uint32_t timestamp);
|
||||||
|
|
||||||
|
void (* warp_pointer) (MetaBackend *backend,
|
||||||
|
int x,
|
||||||
|
int y);
|
||||||
|
|
||||||
|
void (* set_keymap) (MetaBackend *backend,
|
||||||
|
const char *layouts,
|
||||||
|
const char *variants,
|
||||||
|
const char *options);
|
||||||
|
|
||||||
|
struct xkb_keymap * (* get_keymap) (MetaBackend *backend);
|
||||||
|
|
||||||
|
void (* lock_layout_group) (MetaBackend *backend,
|
||||||
|
guint idx);
|
||||||
|
|
||||||
|
void (* update_screen_size) (MetaBackend *backend, int width, int height);
|
||||||
|
void (* select_stage_events) (MetaBackend *backend);
|
||||||
|
};
|
||||||
|
|
||||||
|
MetaIdleMonitor * meta_backend_get_idle_monitor (MetaBackend *backend,
|
||||||
|
int device_id);
|
||||||
|
MetaMonitorManager * meta_backend_get_monitor_manager (MetaBackend *backend);
|
||||||
|
MetaCursorRenderer * meta_backend_get_cursor_renderer (MetaBackend *backend);
|
||||||
|
|
||||||
|
gboolean meta_backend_grab_device (MetaBackend *backend,
|
||||||
|
int device_id,
|
||||||
|
uint32_t timestamp);
|
||||||
|
gboolean meta_backend_ungrab_device (MetaBackend *backend,
|
||||||
|
int device_id,
|
||||||
|
uint32_t timestamp);
|
||||||
|
|
||||||
|
void meta_backend_warp_pointer (MetaBackend *backend,
|
||||||
|
int x,
|
||||||
|
int y);
|
||||||
|
|
||||||
|
struct xkb_keymap * meta_backend_get_keymap (MetaBackend *backend);
|
||||||
|
|
||||||
|
#endif /* META_BACKEND_PRIVATE_H */
|
||||||
@@ -24,15 +24,324 @@
|
|||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
#include "meta-backend.h"
|
#include <meta/meta-backend.h>
|
||||||
#include <meta/main.h>
|
#include "meta-backend-private.h"
|
||||||
|
|
||||||
#include <gdk/gdkx.h>
|
#include "backends/x11/meta-backend-x11.h"
|
||||||
#include <clutter/clutter.h>
|
#include "meta-stage.h"
|
||||||
#include <clutter/x11/clutter-x11.h>
|
|
||||||
|
|
||||||
#include "backends/native/meta-weston-launch.h"
|
#ifdef HAVE_NATIVE_BACKEND
|
||||||
#include <meta/util.h>
|
#include "backends/native/meta-backend-native.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static MetaBackend *_backend;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* meta_get_backend:
|
||||||
|
*
|
||||||
|
* Accessor for the singleton MetaBackend.
|
||||||
|
*
|
||||||
|
* Returns: (transfer none): The only #MetaBackend there is.
|
||||||
|
*/
|
||||||
|
MetaBackend *
|
||||||
|
meta_get_backend (void)
|
||||||
|
{
|
||||||
|
return _backend;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct _MetaBackendPrivate
|
||||||
|
{
|
||||||
|
MetaMonitorManager *monitor_manager;
|
||||||
|
MetaCursorRenderer *cursor_renderer;
|
||||||
|
|
||||||
|
ClutterActor *stage;
|
||||||
|
};
|
||||||
|
typedef struct _MetaBackendPrivate MetaBackendPrivate;
|
||||||
|
|
||||||
|
G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (MetaBackend, meta_backend, G_TYPE_OBJECT);
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_backend_finalize (GObject *object)
|
||||||
|
{
|
||||||
|
MetaBackend *backend = META_BACKEND (object);
|
||||||
|
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
|
||||||
|
int i;
|
||||||
|
|
||||||
|
g_clear_object (&priv->monitor_manager);
|
||||||
|
|
||||||
|
for (i = 0; i <= backend->device_id_max; i++)
|
||||||
|
{
|
||||||
|
if (backend->device_monitors[i])
|
||||||
|
g_object_unref (backend->device_monitors[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
G_OBJECT_CLASS (meta_backend_parent_class)->finalize (object);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_backend_sync_screen_size (MetaBackend *backend)
|
||||||
|
{
|
||||||
|
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
|
||||||
|
int width, height;
|
||||||
|
|
||||||
|
meta_monitor_manager_get_screen_size (priv->monitor_manager, &width, &height);
|
||||||
|
|
||||||
|
META_BACKEND_GET_CLASS (backend)->update_screen_size (backend, width, height);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
on_monitors_changed (MetaMonitorManager *monitors,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
MetaBackend *backend = META_BACKEND (user_data);
|
||||||
|
meta_backend_sync_screen_size (backend);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_backend_real_post_init (MetaBackend *backend)
|
||||||
|
{
|
||||||
|
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
|
||||||
|
|
||||||
|
priv->stage = meta_stage_new ();
|
||||||
|
clutter_actor_realize (priv->stage);
|
||||||
|
META_BACKEND_GET_CLASS (backend)->select_stage_events (backend);
|
||||||
|
|
||||||
|
priv->monitor_manager = META_BACKEND_GET_CLASS (backend)->create_monitor_manager (backend);
|
||||||
|
|
||||||
|
g_signal_connect (priv->monitor_manager, "monitors-changed",
|
||||||
|
G_CALLBACK (on_monitors_changed), backend);
|
||||||
|
meta_backend_sync_screen_size (backend);
|
||||||
|
|
||||||
|
priv->cursor_renderer = META_BACKEND_GET_CLASS (backend)->create_cursor_renderer (backend);
|
||||||
|
}
|
||||||
|
|
||||||
|
static MetaCursorRenderer *
|
||||||
|
meta_backend_real_create_cursor_renderer (MetaBackend *backend)
|
||||||
|
{
|
||||||
|
return meta_cursor_renderer_new ();
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
meta_backend_real_grab_device (MetaBackend *backend,
|
||||||
|
int device_id,
|
||||||
|
uint32_t timestamp)
|
||||||
|
{
|
||||||
|
/* Do nothing */
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
meta_backend_real_ungrab_device (MetaBackend *backend,
|
||||||
|
int device_id,
|
||||||
|
uint32_t timestamp)
|
||||||
|
{
|
||||||
|
/* Do nothing */
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_backend_real_update_screen_size (MetaBackend *backend,
|
||||||
|
int width, int height)
|
||||||
|
{
|
||||||
|
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
|
||||||
|
|
||||||
|
clutter_actor_set_size (priv->stage, width, height);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_backend_real_select_stage_events (MetaBackend *backend)
|
||||||
|
{
|
||||||
|
/* Do nothing */
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_backend_class_init (MetaBackendClass *klass)
|
||||||
|
{
|
||||||
|
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||||
|
|
||||||
|
object_class->finalize = meta_backend_finalize;
|
||||||
|
|
||||||
|
klass->post_init = meta_backend_real_post_init;
|
||||||
|
klass->create_cursor_renderer = meta_backend_real_create_cursor_renderer;
|
||||||
|
klass->grab_device = meta_backend_real_grab_device;
|
||||||
|
klass->ungrab_device = meta_backend_real_ungrab_device;
|
||||||
|
klass->update_screen_size = meta_backend_real_update_screen_size;
|
||||||
|
klass->select_stage_events = meta_backend_real_select_stage_events;
|
||||||
|
|
||||||
|
g_signal_new ("keymap-changed",
|
||||||
|
G_TYPE_FROM_CLASS (object_class),
|
||||||
|
G_SIGNAL_RUN_LAST,
|
||||||
|
0,
|
||||||
|
NULL, NULL, NULL,
|
||||||
|
G_TYPE_NONE, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_backend_init (MetaBackend *backend)
|
||||||
|
{
|
||||||
|
_backend = backend;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* FIXME -- destroy device monitors at some point */
|
||||||
|
G_GNUC_UNUSED static void
|
||||||
|
destroy_device_monitor (MetaBackend *backend,
|
||||||
|
int device_id)
|
||||||
|
{
|
||||||
|
g_clear_object (&backend->device_monitors[device_id]);
|
||||||
|
if (device_id == backend->device_id_max)
|
||||||
|
backend->device_id_max--;
|
||||||
|
}
|
||||||
|
|
||||||
|
static MetaIdleMonitor *
|
||||||
|
meta_backend_create_idle_monitor (MetaBackend *backend,
|
||||||
|
int device_id)
|
||||||
|
{
|
||||||
|
return META_BACKEND_GET_CLASS (backend)->create_idle_monitor (backend, device_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_backend_post_init (MetaBackend *backend)
|
||||||
|
{
|
||||||
|
META_BACKEND_GET_CLASS (backend)->post_init (backend);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* meta_backend_get_idle_monitor: (skip)
|
||||||
|
*/
|
||||||
|
MetaIdleMonitor *
|
||||||
|
meta_backend_get_idle_monitor (MetaBackend *backend,
|
||||||
|
int device_id)
|
||||||
|
{
|
||||||
|
g_return_val_if_fail (device_id >= 0 && device_id < 256, NULL);
|
||||||
|
|
||||||
|
if (!backend->device_monitors[device_id])
|
||||||
|
{
|
||||||
|
backend->device_monitors[device_id] = meta_backend_create_idle_monitor (backend, device_id);
|
||||||
|
backend->device_id_max = MAX (backend->device_id_max, device_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
return backend->device_monitors[device_id];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* meta_backend_get_monitor_manager: (skip)
|
||||||
|
*/
|
||||||
|
MetaMonitorManager *
|
||||||
|
meta_backend_get_monitor_manager (MetaBackend *backend)
|
||||||
|
{
|
||||||
|
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
|
||||||
|
|
||||||
|
return priv->monitor_manager;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* meta_backend_get_cursor_renderer: (skip)
|
||||||
|
*/
|
||||||
|
MetaCursorRenderer *
|
||||||
|
meta_backend_get_cursor_renderer (MetaBackend *backend)
|
||||||
|
{
|
||||||
|
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
|
||||||
|
|
||||||
|
return priv->cursor_renderer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* meta_backend_grab_device: (skip)
|
||||||
|
*/
|
||||||
|
gboolean
|
||||||
|
meta_backend_grab_device (MetaBackend *backend,
|
||||||
|
int device_id,
|
||||||
|
uint32_t timestamp)
|
||||||
|
{
|
||||||
|
return META_BACKEND_GET_CLASS (backend)->grab_device (backend, device_id, timestamp);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* meta_backend_ungrab_device: (skip)
|
||||||
|
*/
|
||||||
|
gboolean
|
||||||
|
meta_backend_ungrab_device (MetaBackend *backend,
|
||||||
|
int device_id,
|
||||||
|
uint32_t timestamp)
|
||||||
|
{
|
||||||
|
return META_BACKEND_GET_CLASS (backend)->ungrab_device (backend, device_id, timestamp);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* meta_backend_warp_pointer: (skip)
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
meta_backend_warp_pointer (MetaBackend *backend,
|
||||||
|
int x,
|
||||||
|
int y)
|
||||||
|
{
|
||||||
|
META_BACKEND_GET_CLASS (backend)->warp_pointer (backend, x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_backend_set_keymap (MetaBackend *backend,
|
||||||
|
const char *layouts,
|
||||||
|
const char *variants,
|
||||||
|
const char *options)
|
||||||
|
{
|
||||||
|
META_BACKEND_GET_CLASS (backend)->set_keymap (backend, layouts, variants, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* meta_backend_get_keymap: (skip)
|
||||||
|
*/
|
||||||
|
struct xkb_keymap *
|
||||||
|
meta_backend_get_keymap (MetaBackend *backend)
|
||||||
|
|
||||||
|
{
|
||||||
|
return META_BACKEND_GET_CLASS (backend)->get_keymap (backend);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_backend_lock_layout_group (MetaBackend *backend,
|
||||||
|
guint idx)
|
||||||
|
{
|
||||||
|
META_BACKEND_GET_CLASS (backend)->lock_layout_group (backend, idx);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* meta_backend_get_stage:
|
||||||
|
* @backend: A #MetaBackend
|
||||||
|
*
|
||||||
|
* Gets the global #ClutterStage that's managed by this backend.
|
||||||
|
*
|
||||||
|
* Returns: (transfer none): the #ClutterStage
|
||||||
|
*/
|
||||||
|
ClutterActor *
|
||||||
|
meta_backend_get_stage (MetaBackend *backend)
|
||||||
|
{
|
||||||
|
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
|
||||||
|
return priv->stage;
|
||||||
|
}
|
||||||
|
|
||||||
|
static GType
|
||||||
|
get_backend_type (void)
|
||||||
|
{
|
||||||
|
#if defined(CLUTTER_WINDOWING_X11)
|
||||||
|
if (clutter_check_windowing_backend (CLUTTER_WINDOWING_X11))
|
||||||
|
return META_TYPE_BACKEND_X11;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CLUTTER_WINDOWING_EGL) && defined(HAVE_NATIVE_BACKEND)
|
||||||
|
if (clutter_check_windowing_backend (CLUTTER_WINDOWING_EGL))
|
||||||
|
return META_TYPE_BACKEND_NATIVE;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
g_assert_not_reached ();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_create_backend (void)
|
||||||
|
{
|
||||||
|
/* meta_backend_init() above install the backend globally so
|
||||||
|
* so meta_get_backend() works even during initialization. */
|
||||||
|
g_object_new (get_backend_type (), NULL);
|
||||||
|
}
|
||||||
|
|
||||||
/* Mutter is responsible for pulling events off the X queue, so Clutter
|
/* Mutter is responsible for pulling events off the X queue, so Clutter
|
||||||
* doesn't need (and shouldn't) run its normal event source which polls
|
* doesn't need (and shouldn't) run its normal event source which polls
|
||||||
@@ -82,37 +391,15 @@ static GSourceFuncs event_funcs = {
|
|||||||
event_dispatch
|
event_dispatch
|
||||||
};
|
};
|
||||||
|
|
||||||
static MetaLauncher *launcher;
|
/**
|
||||||
|
* meta_clutter_init: (skip)
|
||||||
|
*/
|
||||||
void
|
void
|
||||||
meta_clutter_init (void)
|
meta_clutter_init (void)
|
||||||
{
|
{
|
||||||
GSource *source;
|
GSource *source;
|
||||||
|
|
||||||
/* When running as an X11 compositor, we install our own event filter and
|
meta_create_backend ();
|
||||||
* pass events to Clutter explicitly, so we need to prevent Clutter from
|
|
||||||
* handling our events.
|
|
||||||
*
|
|
||||||
* However, when running as a Wayland compostior under X11 nested, Clutter
|
|
||||||
* Clutter needs to see events related to its own window. We need to
|
|
||||||
* eventually replace this with a proper frontend / backend split: Clutter
|
|
||||||
* under nested is connecting to the "host X server" to get its events it
|
|
||||||
* needs to put up a window, and GTK+ is connecting to the "inner X server".
|
|
||||||
* The two would the same in the X11 compositor case, but not when running
|
|
||||||
* XWayland as a Wayland compositor.
|
|
||||||
*/
|
|
||||||
if (!meta_is_wayland_compositor ())
|
|
||||||
{
|
|
||||||
clutter_x11_set_display (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()));
|
|
||||||
clutter_x11_disable_event_retrieval ();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If we're running on bare metal, we're a display server,
|
|
||||||
* so start talking to weston-launch. */
|
|
||||||
#if defined(CLUTTER_WINDOWING_EGL)
|
|
||||||
if (clutter_check_windowing_backend (CLUTTER_WINDOWING_EGL))
|
|
||||||
launcher = meta_launcher_new ();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (clutter_init (NULL, NULL) != CLUTTER_INIT_SUCCESS)
|
if (clutter_init (NULL, NULL) != CLUTTER_INIT_SUCCESS)
|
||||||
g_error ("Unable to initialize Clutter.\n");
|
g_error ("Unable to initialize Clutter.\n");
|
||||||
@@ -120,38 +407,6 @@ meta_clutter_init (void)
|
|||||||
source = g_source_new (&event_funcs, sizeof (GSource));
|
source = g_source_new (&event_funcs, sizeof (GSource));
|
||||||
g_source_attach (source, NULL);
|
g_source_attach (source, NULL);
|
||||||
g_source_unref (source);
|
g_source_unref (source);
|
||||||
}
|
|
||||||
|
meta_backend_post_init (_backend);
|
||||||
gboolean
|
|
||||||
meta_activate_vt (int vt, GError **error)
|
|
||||||
{
|
|
||||||
if (launcher)
|
|
||||||
return meta_launcher_activate_vt (launcher, vt, error);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
g_debug ("Ignoring VT switch keybinding, not running as display server");
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* meta_activate_session:
|
|
||||||
*
|
|
||||||
* Tells mutter to activate the session. When mutter is a
|
|
||||||
* Wayland compositor, this tells logind to switch over to
|
|
||||||
* the new session.
|
|
||||||
*/
|
|
||||||
gboolean
|
|
||||||
meta_activate_session (void)
|
|
||||||
{
|
|
||||||
GError *error = NULL;
|
|
||||||
|
|
||||||
if (!meta_launcher_activate_vt (launcher, -1, &error))
|
|
||||||
{
|
|
||||||
g_warning ("Could not activate session: %s\n", error->message);
|
|
||||||
g_error_free (error);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,21 +30,22 @@
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
CoglTexture2D *texture;
|
CoglTexture2D *texture;
|
||||||
struct gbm_bo *bo;
|
struct gbm_bo *bo;
|
||||||
int hot_x, hot_y;
|
int offset_x, offset_y;
|
||||||
} MetaCursorImage;
|
} MetaCursorImage;
|
||||||
|
|
||||||
struct _MetaCursorReference {
|
struct _MetaCursorReference {
|
||||||
int ref_count;
|
int ref_count;
|
||||||
|
|
||||||
|
MetaCursor cursor;
|
||||||
MetaCursorImage image;
|
MetaCursorImage image;
|
||||||
};
|
};
|
||||||
|
|
||||||
CoglTexture *meta_cursor_reference_get_cogl_texture (MetaCursorReference *cursor,
|
CoglTexture *meta_cursor_reference_get_cogl_texture (MetaCursorReference *cursor,
|
||||||
int *hot_x,
|
int *offset_x,
|
||||||
int *hot_y);
|
int *offset_y);
|
||||||
|
|
||||||
struct gbm_bo *meta_cursor_reference_get_gbm_bo (MetaCursorReference *cursor,
|
struct gbm_bo *meta_cursor_reference_get_gbm_bo (MetaCursorReference *cursor,
|
||||||
int *hot_x,
|
int *offset_x,
|
||||||
int *hot_y);
|
int *offset_y);
|
||||||
|
|
||||||
#endif /* META_CURSOR_PRIVATE_H */
|
#endif /* META_CURSOR_PRIVATE_H */
|
||||||
|
|||||||
225
src/backends/meta-cursor-renderer.c
Normal file
225
src/backends/meta-cursor-renderer.c
Normal file
@@ -0,0 +1,225 @@
|
|||||||
|
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2014 Red Hat
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
|
*
|
||||||
|
* Written by:
|
||||||
|
* Jasper St. Pierre <jstpierre@mecheye.net>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#include "meta-cursor-renderer.h"
|
||||||
|
#include "meta-cursor-private.h"
|
||||||
|
|
||||||
|
#include <meta/meta-backend.h>
|
||||||
|
#include <meta/util.h>
|
||||||
|
|
||||||
|
#include <cogl/cogl.h>
|
||||||
|
#include <clutter/clutter.h>
|
||||||
|
|
||||||
|
#include "meta-stage.h"
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
CoglTexture *texture;
|
||||||
|
MetaRectangle current_rect;
|
||||||
|
gboolean handled_by_backend;
|
||||||
|
} MetaCursorLayer;
|
||||||
|
|
||||||
|
struct _MetaCursorRendererPrivate
|
||||||
|
{
|
||||||
|
int current_x, current_y;
|
||||||
|
|
||||||
|
MetaCursorLayer core_layer;
|
||||||
|
MetaCursorLayer dnd_layer;
|
||||||
|
|
||||||
|
MetaCursorReference *displayed_cursor;
|
||||||
|
};
|
||||||
|
typedef struct _MetaCursorRendererPrivate MetaCursorRendererPrivate;
|
||||||
|
|
||||||
|
G_DEFINE_TYPE_WITH_PRIVATE (MetaCursorRenderer, meta_cursor_renderer, G_TYPE_OBJECT);
|
||||||
|
|
||||||
|
static void
|
||||||
|
queue_redraw (MetaCursorRenderer *renderer)
|
||||||
|
{
|
||||||
|
MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer);
|
||||||
|
MetaBackend *backend = meta_get_backend ();
|
||||||
|
ClutterActor *stage = meta_backend_get_stage (backend);
|
||||||
|
|
||||||
|
/* During early initialization, we can have no stage */
|
||||||
|
if (!stage)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (priv->core_layer.texture && !priv->core_layer.handled_by_backend)
|
||||||
|
meta_stage_set_cursor (META_STAGE (stage), layer->texture, &priv->current_rect);
|
||||||
|
meta_stage_set_dnd_surface (META_STAGE (stage),
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
meta_cursor_renderer_real_update_cursor (MetaCursorRenderer *renderer)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_cursor_renderer_class_init (MetaCursorRendererClass *klass)
|
||||||
|
{
|
||||||
|
klass->update_cursor = meta_cursor_renderer_real_update_cursor;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_cursor_renderer_init (MetaCursorRenderer *renderer)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
update_layer (MetaCursorRenderer *renderer,
|
||||||
|
MetaCursorLayer *layer,
|
||||||
|
CoglTexture *texture,
|
||||||
|
int offset_x,
|
||||||
|
int offset_y)
|
||||||
|
{
|
||||||
|
MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer);
|
||||||
|
|
||||||
|
layer->texture = texture;
|
||||||
|
|
||||||
|
if (layer->texture)
|
||||||
|
{
|
||||||
|
layer->current_rect.x = priv->current_x + offset_x;
|
||||||
|
layer->current_rect.y = priv->current_y + offset_y;
|
||||||
|
layer->current_rect.width = cogl_texture_get_width (layer->texture);
|
||||||
|
layer->current_rect.height = cogl_texture_get_height (layer->texture);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
layer->current_rect.x = 0;
|
||||||
|
layer->current_rect.y = 0;
|
||||||
|
layer->current_rect.width = 0;
|
||||||
|
layer->current_rect.height = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
update_cursor (MetaCursorRenderer *renderer)
|
||||||
|
{
|
||||||
|
MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer);
|
||||||
|
gboolean handled_by_backend;
|
||||||
|
gboolean should_redraw = FALSE;
|
||||||
|
CoglTexture *texture;
|
||||||
|
int hot_x, hot_y;
|
||||||
|
|
||||||
|
if (priv->displayed_cursor)
|
||||||
|
{
|
||||||
|
<<<<<<< HEAD
|
||||||
|
CoglTexture *texture;
|
||||||
|
int offset_x, offset_y;
|
||||||
|
|
||||||
|
texture = meta_cursor_reference_get_cogl_texture (priv->displayed_cursor, &offset_x, &offset_y);
|
||||||
|
|
||||||
|
priv->current_rect.x = priv->current_x + offset_x;
|
||||||
|
priv->current_rect.y = priv->current_y + offset_y;
|
||||||
|
priv->current_rect.width = cogl_texture_get_width (COGL_TEXTURE (texture));
|
||||||
|
priv->current_rect.height = cogl_texture_get_height (COGL_TEXTURE (texture));
|
||||||
|
=======
|
||||||
|
texture = meta_cursor_reference_get_cogl_texture (priv->displayed_cursor, &hot_x, &hot_y);
|
||||||
|
>>>>>>> 75e7834... dnd 2
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
texture = NULL;
|
||||||
|
hot_x = 0;
|
||||||
|
hot_y = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
update_layer (renderer, &priv->core_layer, texture, hot_x, hot_y);
|
||||||
|
update_layer (renderer, &priv->
|
||||||
|
|
||||||
|
handled_by_backend = META_CURSOR_RENDERER_GET_CLASS (renderer)->update_cursor (renderer);
|
||||||
|
if (handled_by_backend != priv->handled_by_backend)
|
||||||
|
{
|
||||||
|
priv->handled_by_backend = handled_by_backend;
|
||||||
|
should_redraw = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!handled_by_backend)
|
||||||
|
should_redraw = TRUE;
|
||||||
|
|
||||||
|
if (should_redraw)
|
||||||
|
queue_redraw (renderer);
|
||||||
|
}
|
||||||
|
|
||||||
|
MetaCursorRenderer *
|
||||||
|
meta_cursor_renderer_new (void)
|
||||||
|
{
|
||||||
|
return g_object_new (META_TYPE_CURSOR_RENDERER, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_cursor_renderer_set_cursor (MetaCursorRenderer *renderer,
|
||||||
|
MetaCursorReference *cursor)
|
||||||
|
{
|
||||||
|
MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer);
|
||||||
|
|
||||||
|
if (priv->displayed_cursor == cursor)
|
||||||
|
return;
|
||||||
|
|
||||||
|
priv->displayed_cursor = cursor;
|
||||||
|
update_cursor (renderer);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_cursor_renderer_set_dnd_surface (MetaCursorRenderer *renderer,
|
||||||
|
CoglTexture *texture,
|
||||||
|
int offset_x,
|
||||||
|
int offset_y)
|
||||||
|
{
|
||||||
|
MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer);
|
||||||
|
|
||||||
|
update_layer (renderer, &priv->dnd_layer,
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_cursor_renderer_set_position (MetaCursorRenderer *renderer,
|
||||||
|
int x, int y)
|
||||||
|
{
|
||||||
|
MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer);
|
||||||
|
|
||||||
|
g_assert (meta_is_wayland_compositor ());
|
||||||
|
|
||||||
|
priv->current_x = x;
|
||||||
|
priv->current_y = y;
|
||||||
|
|
||||||
|
update_cursor (renderer);
|
||||||
|
}
|
||||||
|
|
||||||
|
MetaCursorReference *
|
||||||
|
meta_cursor_renderer_get_cursor (MetaCursorRenderer *renderer)
|
||||||
|
{
|
||||||
|
MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer);
|
||||||
|
|
||||||
|
return priv->displayed_cursor;
|
||||||
|
}
|
||||||
|
|
||||||
|
const MetaRectangle *
|
||||||
|
meta_cursor_renderer_get_rect (MetaCursorRenderer *renderer)
|
||||||
|
{
|
||||||
|
MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer);
|
||||||
|
|
||||||
|
return &priv->core_layer.current_rect;
|
||||||
|
}
|
||||||
70
src/backends/meta-cursor-renderer.h
Normal file
70
src/backends/meta-cursor-renderer.h
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2014 Red Hat
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
|
*
|
||||||
|
* Written by:
|
||||||
|
* Jasper St. Pierre <jstpierre@mecheye.net>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef META_CURSOR_RENDERER_H
|
||||||
|
#define META_CURSOR_RENDERER_H
|
||||||
|
|
||||||
|
#include <glib-object.h>
|
||||||
|
|
||||||
|
#include <meta/screen.h>
|
||||||
|
#include "meta-cursor.h"
|
||||||
|
|
||||||
|
#include <gbm.h>
|
||||||
|
|
||||||
|
#define META_TYPE_CURSOR_RENDERER (meta_cursor_renderer_get_type ())
|
||||||
|
#define META_CURSOR_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_CURSOR_RENDERER, MetaCursorRenderer))
|
||||||
|
#define META_CURSOR_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_CURSOR_RENDERER, MetaCursorRendererClass))
|
||||||
|
#define META_IS_CURSOR_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_CURSOR_RENDERER))
|
||||||
|
#define META_IS_CURSOR_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_CURSOR_RENDERER))
|
||||||
|
#define META_CURSOR_RENDERER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), META_TYPE_CURSOR_RENDERER, MetaCursorRendererClass))
|
||||||
|
|
||||||
|
typedef struct _MetaCursorRenderer MetaCursorRenderer;
|
||||||
|
typedef struct _MetaCursorRendererClass MetaCursorRendererClass;
|
||||||
|
|
||||||
|
struct _MetaCursorRenderer
|
||||||
|
{
|
||||||
|
GObject parent;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct _MetaCursorRendererClass
|
||||||
|
{
|
||||||
|
GObjectClass parent_class;
|
||||||
|
|
||||||
|
gboolean (* update_cursor) (MetaCursorRenderer *renderer);
|
||||||
|
};
|
||||||
|
|
||||||
|
GType meta_cursor_renderer_get_type (void) G_GNUC_CONST;
|
||||||
|
|
||||||
|
MetaCursorRenderer * meta_cursor_renderer_new (void);
|
||||||
|
|
||||||
|
void meta_cursor_renderer_set_cursor (MetaCursorRenderer *renderer,
|
||||||
|
MetaCursorReference *cursor);
|
||||||
|
|
||||||
|
void meta_cursor_renderer_set_position (MetaCursorRenderer *renderer,
|
||||||
|
int x, int y);
|
||||||
|
|
||||||
|
MetaCursorReference * meta_cursor_renderer_get_cursor (MetaCursorRenderer *renderer);
|
||||||
|
const MetaRectangle * meta_cursor_renderer_get_rect (MetaCursorRenderer *renderer);
|
||||||
|
|
||||||
|
#endif /* META_CURSOR_RENDERER_H */
|
||||||
@@ -23,35 +23,20 @@
|
|||||||
#define META_CURSOR_TRACKER_PRIVATE_H
|
#define META_CURSOR_TRACKER_PRIVATE_H
|
||||||
|
|
||||||
#include <meta/meta-cursor-tracker.h>
|
#include <meta/meta-cursor-tracker.h>
|
||||||
#include <wayland-server.h>
|
|
||||||
|
|
||||||
#include "meta-cursor.h"
|
#include "meta-cursor.h"
|
||||||
|
#include "meta-cursor-renderer.h"
|
||||||
|
|
||||||
struct _MetaCursorTracker {
|
struct _MetaCursorTracker {
|
||||||
GObject parent_instance;
|
GObject parent_instance;
|
||||||
|
|
||||||
MetaScreen *screen;
|
MetaCursorRenderer *renderer;
|
||||||
|
|
||||||
gboolean is_showing;
|
gboolean is_showing;
|
||||||
gboolean has_hw_cursor;
|
|
||||||
|
|
||||||
/* The cursor tracker stores the cursor for the current grab
|
|
||||||
* operation, the cursor for the window with pointer focus, and
|
|
||||||
* the cursor for the root window, which contains either the
|
|
||||||
* default arrow cursor or the 'busy' hourglass if we're launching
|
|
||||||
* an app.
|
|
||||||
*
|
|
||||||
* We choose the first one available -- if there's a grab cursor,
|
|
||||||
* we choose that cursor, if there's window cursor, we choose that,
|
|
||||||
* otherwise we choose the root cursor.
|
|
||||||
*
|
|
||||||
* The displayed_cursor contains the chosen cursor.
|
|
||||||
*/
|
|
||||||
MetaCursorReference *displayed_cursor;
|
MetaCursorReference *displayed_cursor;
|
||||||
|
|
||||||
MetaCursorReference *grab_cursor;
|
/* Wayland clients can set a NULL buffer as their cursor
|
||||||
|
|
||||||
/* Wayland clients can set a NULL buffer as their cursor
|
|
||||||
* explicitly, which means that we shouldn't display anything.
|
* explicitly, which means that we shouldn't display anything.
|
||||||
* So, we can't simply store a NULL in window_cursor to
|
* So, we can't simply store a NULL in window_cursor to
|
||||||
* determine an unset window cursor; we need an extra boolean.
|
* determine an unset window cursor; we need an extra boolean.
|
||||||
@@ -61,16 +46,8 @@ struct _MetaCursorTracker {
|
|||||||
|
|
||||||
MetaCursorReference *root_cursor;
|
MetaCursorReference *root_cursor;
|
||||||
|
|
||||||
MetaCursorReference *theme_cursors[META_CURSOR_LAST];
|
/* The cursor from the X11 server. */
|
||||||
|
MetaCursorReference *xfixes_cursor;
|
||||||
int current_x, current_y;
|
|
||||||
MetaRectangle current_rect;
|
|
||||||
MetaRectangle previous_rect;
|
|
||||||
gboolean previous_is_valid;
|
|
||||||
|
|
||||||
CoglPipeline *pipeline;
|
|
||||||
int drm_fd;
|
|
||||||
struct gbm_device *gbm;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _MetaCursorTrackerClass {
|
struct _MetaCursorTrackerClass {
|
||||||
@@ -80,8 +57,6 @@ struct _MetaCursorTrackerClass {
|
|||||||
gboolean meta_cursor_tracker_handle_xevent (MetaCursorTracker *tracker,
|
gboolean meta_cursor_tracker_handle_xevent (MetaCursorTracker *tracker,
|
||||||
XEvent *xevent);
|
XEvent *xevent);
|
||||||
|
|
||||||
void meta_cursor_tracker_set_grab_cursor (MetaCursorTracker *tracker,
|
|
||||||
MetaCursorReference *cursor);
|
|
||||||
void meta_cursor_tracker_set_window_cursor (MetaCursorTracker *tracker,
|
void meta_cursor_tracker_set_window_cursor (MetaCursorTracker *tracker,
|
||||||
MetaCursorReference *cursor);
|
MetaCursorReference *cursor);
|
||||||
void meta_cursor_tracker_unset_window_cursor (MetaCursorTracker *tracker);
|
void meta_cursor_tracker_unset_window_cursor (MetaCursorTracker *tracker);
|
||||||
@@ -91,8 +66,7 @@ void meta_cursor_tracker_set_root_cursor (MetaCursorTracker *tracker,
|
|||||||
void meta_cursor_tracker_update_position (MetaCursorTracker *tracker,
|
void meta_cursor_tracker_update_position (MetaCursorTracker *tracker,
|
||||||
int new_x,
|
int new_x,
|
||||||
int new_y);
|
int new_y);
|
||||||
void meta_cursor_tracker_paint (MetaCursorTracker *tracker);
|
|
||||||
|
|
||||||
void meta_cursor_tracker_force_update (MetaCursorTracker *tracker);
|
MetaCursorReference * meta_cursor_tracker_get_displayed_cursor (MetaCursorTracker *tracker);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright 2013 Red Hat, Inc.
|
* Copyright 2013 Red Hat, Inc.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License as
|
* modify it under the terms of the GNU General Public License as
|
||||||
* published by the Free Software Foundation; either version 2 of the
|
* published by the Free Software Foundation; either version 2 of the
|
||||||
@@ -12,7 +12,7 @@
|
|||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
@@ -34,42 +34,70 @@
|
|||||||
#include <meta/errors.h>
|
#include <meta/errors.h>
|
||||||
|
|
||||||
#include <cogl/cogl.h>
|
#include <cogl/cogl.h>
|
||||||
#include <cogl/cogl-wayland-server.h>
|
|
||||||
#include <clutter/clutter.h>
|
#include <clutter/clutter.h>
|
||||||
#include <gbm.h>
|
|
||||||
|
|
||||||
#include <gdk/gdk.h>
|
#include <gdk/gdk.h>
|
||||||
#include <gdk/gdkx.h>
|
#include <gdk/gdkx.h>
|
||||||
|
|
||||||
|
#include "meta-backend-private.h"
|
||||||
|
|
||||||
#include "meta-cursor-private.h"
|
#include "meta-cursor-private.h"
|
||||||
#include "meta-cursor-tracker-private.h"
|
#include "meta-cursor-tracker-private.h"
|
||||||
#include "screen-private.h"
|
|
||||||
#include "meta-monitor-manager.h"
|
|
||||||
|
|
||||||
#include "wayland/meta-wayland-private.h"
|
|
||||||
|
|
||||||
G_DEFINE_TYPE (MetaCursorTracker, meta_cursor_tracker, G_TYPE_OBJECT);
|
G_DEFINE_TYPE (MetaCursorTracker, meta_cursor_tracker, G_TYPE_OBJECT);
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
CURSOR_CHANGED,
|
CURSOR_CHANGED,
|
||||||
LAST_SIGNAL
|
LAST_SIGNAL
|
||||||
};
|
};
|
||||||
|
|
||||||
static guint signals[LAST_SIGNAL];
|
static guint signals[LAST_SIGNAL];
|
||||||
|
|
||||||
static void meta_cursor_tracker_set_crtc_has_hw_cursor (MetaCursorTracker *tracker,
|
static MetaCursorReference *
|
||||||
MetaCRTC *crtc,
|
get_displayed_cursor (MetaCursorTracker *tracker)
|
||||||
gboolean has_hw_cursor);
|
{
|
||||||
static void sync_cursor (MetaCursorTracker *tracker);
|
MetaDisplay *display = meta_get_display ();
|
||||||
|
|
||||||
|
if (!tracker->is_showing)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (meta_display_windows_are_interactable (display))
|
||||||
|
{
|
||||||
|
if (tracker->has_window_cursor)
|
||||||
|
return tracker->window_cursor;
|
||||||
|
}
|
||||||
|
|
||||||
|
return tracker->root_cursor;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
update_displayed_cursor (MetaCursorTracker *tracker)
|
||||||
|
{
|
||||||
|
meta_cursor_renderer_set_cursor (tracker->renderer, tracker->displayed_cursor);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
sync_cursor (MetaCursorTracker *tracker)
|
||||||
|
{
|
||||||
|
MetaCursorReference *displayed_cursor = get_displayed_cursor (tracker);
|
||||||
|
|
||||||
|
if (tracker->displayed_cursor == displayed_cursor)
|
||||||
|
return;
|
||||||
|
|
||||||
|
g_clear_pointer (&tracker->displayed_cursor, meta_cursor_reference_unref);
|
||||||
|
if (displayed_cursor)
|
||||||
|
tracker->displayed_cursor = meta_cursor_reference_ref (displayed_cursor);
|
||||||
|
|
||||||
|
update_displayed_cursor (tracker);
|
||||||
|
g_signal_emit (tracker, signals[CURSOR_CHANGED], 0);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_cursor_tracker_init (MetaCursorTracker *self)
|
meta_cursor_tracker_init (MetaCursorTracker *self)
|
||||||
{
|
{
|
||||||
/* (JS) Best (?) that can be assumed since XFixes doesn't provide a way of
|
MetaBackend *backend = meta_get_backend ();
|
||||||
detecting if the system mouse cursor is showing or not.
|
|
||||||
|
|
||||||
On wayland we start with the cursor showing
|
self->renderer = meta_backend_get_cursor_renderer (backend);
|
||||||
*/
|
|
||||||
self->is_showing = TRUE;
|
self->is_showing = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -77,22 +105,12 @@ static void
|
|||||||
meta_cursor_tracker_finalize (GObject *object)
|
meta_cursor_tracker_finalize (GObject *object)
|
||||||
{
|
{
|
||||||
MetaCursorTracker *self = META_CURSOR_TRACKER (object);
|
MetaCursorTracker *self = META_CURSOR_TRACKER (object);
|
||||||
int i;
|
|
||||||
|
|
||||||
if (self->displayed_cursor)
|
if (self->displayed_cursor)
|
||||||
meta_cursor_reference_unref (self->displayed_cursor);
|
meta_cursor_reference_unref (self->displayed_cursor);
|
||||||
if (self->root_cursor)
|
if (self->root_cursor)
|
||||||
meta_cursor_reference_unref (self->root_cursor);
|
meta_cursor_reference_unref (self->root_cursor);
|
||||||
|
|
||||||
for (i = 0; i < META_CURSOR_LAST; i++)
|
|
||||||
if (self->theme_cursors[i])
|
|
||||||
meta_cursor_reference_unref (self->theme_cursors[i]);
|
|
||||||
|
|
||||||
if (self->pipeline)
|
|
||||||
cogl_object_unref (self->pipeline);
|
|
||||||
if (self->gbm)
|
|
||||||
gbm_device_destroy (self->gbm);
|
|
||||||
|
|
||||||
G_OBJECT_CLASS (meta_cursor_tracker_parent_class)->finalize (object);
|
G_OBJECT_CLASS (meta_cursor_tracker_parent_class)->finalize (object);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -111,80 +129,13 @@ meta_cursor_tracker_class_init (MetaCursorTrackerClass *klass)
|
|||||||
G_TYPE_NONE, 0);
|
G_TYPE_NONE, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
on_monitors_changed (MetaMonitorManager *monitors,
|
|
||||||
MetaCursorTracker *tracker)
|
|
||||||
{
|
|
||||||
MetaCRTC *crtcs;
|
|
||||||
unsigned int i, n_crtcs;
|
|
||||||
|
|
||||||
if (!tracker->has_hw_cursor)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* Go through the new list of monitors, find out where the cursor is */
|
|
||||||
meta_monitor_manager_get_resources (monitors, NULL, NULL, &crtcs, &n_crtcs, NULL, NULL);
|
|
||||||
|
|
||||||
for (i = 0; i < n_crtcs; i++)
|
|
||||||
{
|
|
||||||
MetaRectangle *rect = &crtcs[i].rect;
|
|
||||||
gboolean has;
|
|
||||||
|
|
||||||
has = meta_rectangle_overlap (&tracker->current_rect, rect);
|
|
||||||
|
|
||||||
/* Need to do it unconditionally here, our tracking is
|
|
||||||
wrong because we reloaded the CRTCs */
|
|
||||||
meta_cursor_tracker_set_crtc_has_hw_cursor (tracker, &crtcs[i], has);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static MetaCursorTracker *
|
static MetaCursorTracker *
|
||||||
make_wayland_cursor_tracker (MetaScreen *screen)
|
meta_cursor_tracker_new (void)
|
||||||
{
|
{
|
||||||
MetaWaylandCompositor *compositor;
|
return g_object_new (META_TYPE_CURSOR_TRACKER, NULL);
|
||||||
CoglContext *ctx;
|
|
||||||
MetaMonitorManager *monitors;
|
|
||||||
MetaCursorTracker *self;
|
|
||||||
|
|
||||||
self = g_object_new (META_TYPE_CURSOR_TRACKER, NULL);
|
|
||||||
self->screen = screen;
|
|
||||||
|
|
||||||
ctx = clutter_backend_get_cogl_context (clutter_get_default_backend ());
|
|
||||||
self->pipeline = cogl_pipeline_new (ctx);
|
|
||||||
|
|
||||||
compositor = meta_wayland_compositor_get_default ();
|
|
||||||
compositor->seat->cursor_tracker = self;
|
|
||||||
meta_cursor_tracker_update_position (self,
|
|
||||||
wl_fixed_to_int (compositor->seat->pointer.x),
|
|
||||||
wl_fixed_to_int (compositor->seat->pointer.y));
|
|
||||||
|
|
||||||
#if defined(CLUTTER_WINDOWING_EGL)
|
|
||||||
if (clutter_check_windowing_backend (CLUTTER_WINDOWING_EGL))
|
|
||||||
{
|
|
||||||
CoglRenderer *cogl_renderer = cogl_display_get_renderer (cogl_context_get_display (ctx));
|
|
||||||
self->drm_fd = cogl_kms_renderer_get_kms_fd (cogl_renderer);
|
|
||||||
self->gbm = gbm_create_device (self->drm_fd);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
monitors = meta_monitor_manager_get ();
|
|
||||||
g_signal_connect_object (monitors, "monitors-changed",
|
|
||||||
G_CALLBACK (on_monitors_changed), self, 0);
|
|
||||||
|
|
||||||
return self;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static MetaCursorTracker *
|
static MetaCursorTracker *_cursor_tracker;
|
||||||
make_x11_cursor_tracker (MetaScreen *screen)
|
|
||||||
{
|
|
||||||
MetaCursorTracker *self = g_object_new (META_TYPE_CURSOR_TRACKER, NULL);
|
|
||||||
self->screen = screen;
|
|
||||||
|
|
||||||
XFixesSelectCursorInput (screen->display->xdisplay,
|
|
||||||
screen->xroot,
|
|
||||||
XFixesDisplayCursorNotifyMask);
|
|
||||||
|
|
||||||
return self;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* meta_cursor_tracker_get_for_screen:
|
* meta_cursor_tracker_get_for_screen:
|
||||||
@@ -197,18 +148,10 @@ make_x11_cursor_tracker (MetaScreen *screen)
|
|||||||
MetaCursorTracker *
|
MetaCursorTracker *
|
||||||
meta_cursor_tracker_get_for_screen (MetaScreen *screen)
|
meta_cursor_tracker_get_for_screen (MetaScreen *screen)
|
||||||
{
|
{
|
||||||
MetaCursorTracker *self;
|
if (!_cursor_tracker)
|
||||||
|
_cursor_tracker = meta_cursor_tracker_new ();
|
||||||
|
|
||||||
if (screen->cursor_tracker)
|
return _cursor_tracker;
|
||||||
return screen->cursor_tracker;
|
|
||||||
|
|
||||||
if (meta_is_wayland_compositor ())
|
|
||||||
self = make_wayland_cursor_tracker (screen);
|
|
||||||
else
|
|
||||||
self = make_x11_cursor_tracker (screen);
|
|
||||||
|
|
||||||
screen->cursor_tracker = self;
|
|
||||||
return self;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -227,19 +170,20 @@ gboolean
|
|||||||
meta_cursor_tracker_handle_xevent (MetaCursorTracker *tracker,
|
meta_cursor_tracker_handle_xevent (MetaCursorTracker *tracker,
|
||||||
XEvent *xevent)
|
XEvent *xevent)
|
||||||
{
|
{
|
||||||
|
MetaDisplay *display = meta_get_display ();
|
||||||
XFixesCursorNotifyEvent *notify_event;
|
XFixesCursorNotifyEvent *notify_event;
|
||||||
|
|
||||||
if (meta_is_wayland_compositor ())
|
if (meta_is_wayland_compositor ())
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
if (xevent->xany.type != tracker->screen->display->xfixes_event_base + XFixesCursorNotify)
|
if (xevent->xany.type != display->xfixes_event_base + XFixesCursorNotify)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
notify_event = (XFixesCursorNotifyEvent *)xevent;
|
notify_event = (XFixesCursorNotifyEvent *)xevent;
|
||||||
if (notify_event->subtype != XFixesDisplayCursorNotify)
|
if (notify_event->subtype != XFixesDisplayCursorNotify)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
set_window_cursor (tracker, FALSE, NULL);
|
g_clear_pointer (&tracker->xfixes_cursor, meta_cursor_reference_unref);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@@ -263,16 +207,17 @@ meta_cursor_reference_take_texture (CoglTexture2D *texture,
|
|||||||
static void
|
static void
|
||||||
ensure_xfixes_cursor (MetaCursorTracker *tracker)
|
ensure_xfixes_cursor (MetaCursorTracker *tracker)
|
||||||
{
|
{
|
||||||
|
MetaDisplay *display = meta_get_display ();
|
||||||
XFixesCursorImage *cursor_image;
|
XFixesCursorImage *cursor_image;
|
||||||
CoglTexture2D *sprite;
|
CoglTexture2D *sprite;
|
||||||
guint8 *cursor_data;
|
guint8 *cursor_data;
|
||||||
gboolean free_cursor_data;
|
gboolean free_cursor_data;
|
||||||
CoglContext *ctx;
|
CoglContext *ctx;
|
||||||
|
|
||||||
if (tracker->has_window_cursor)
|
if (tracker->xfixes_cursor)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
cursor_image = XFixesGetCursorImage (tracker->screen->display->xdisplay);
|
cursor_image = XFixesGetCursorImage (display->xdisplay);
|
||||||
if (!cursor_image)
|
if (!cursor_image)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -319,7 +264,7 @@ ensure_xfixes_cursor (MetaCursorTracker *tracker)
|
|||||||
MetaCursorReference *cursor = meta_cursor_reference_take_texture (sprite,
|
MetaCursorReference *cursor = meta_cursor_reference_take_texture (sprite,
|
||||||
cursor_image->xhot,
|
cursor_image->xhot,
|
||||||
cursor_image->yhot);
|
cursor_image->yhot);
|
||||||
set_window_cursor (tracker, TRUE, cursor);
|
tracker->xfixes_cursor = cursor;
|
||||||
}
|
}
|
||||||
XFree (cursor_image);
|
XFree (cursor_image);
|
||||||
}
|
}
|
||||||
@@ -332,13 +277,22 @@ ensure_xfixes_cursor (MetaCursorTracker *tracker)
|
|||||||
CoglTexture *
|
CoglTexture *
|
||||||
meta_cursor_tracker_get_sprite (MetaCursorTracker *tracker)
|
meta_cursor_tracker_get_sprite (MetaCursorTracker *tracker)
|
||||||
{
|
{
|
||||||
|
MetaCursorReference *cursor;
|
||||||
|
|
||||||
g_return_val_if_fail (META_IS_CURSOR_TRACKER (tracker), NULL);
|
g_return_val_if_fail (META_IS_CURSOR_TRACKER (tracker), NULL);
|
||||||
|
|
||||||
if (!meta_is_wayland_compositor ())
|
if (meta_is_wayland_compositor ())
|
||||||
ensure_xfixes_cursor (tracker);
|
{
|
||||||
|
cursor = tracker->displayed_cursor;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ensure_xfixes_cursor (tracker);
|
||||||
|
cursor = tracker->xfixes_cursor;
|
||||||
|
}
|
||||||
|
|
||||||
if (tracker->displayed_cursor)
|
if (cursor)
|
||||||
return meta_cursor_reference_get_cogl_texture (tracker->displayed_cursor, NULL, NULL);
|
return meta_cursor_reference_get_cogl_texture (cursor, NULL, NULL);
|
||||||
else
|
else
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -355,31 +309,35 @@ meta_cursor_tracker_get_hot (MetaCursorTracker *tracker,
|
|||||||
int *x,
|
int *x,
|
||||||
int *y)
|
int *y)
|
||||||
{
|
{
|
||||||
|
MetaCursorReference *cursor;
|
||||||
|
int offset_x, offset_y;
|
||||||
|
|
||||||
g_return_if_fail (META_IS_CURSOR_TRACKER (tracker));
|
g_return_if_fail (META_IS_CURSOR_TRACKER (tracker));
|
||||||
|
|
||||||
if (!meta_is_wayland_compositor ())
|
if (meta_is_wayland_compositor ())
|
||||||
ensure_xfixes_cursor (tracker);
|
{
|
||||||
|
cursor = tracker->displayed_cursor;
|
||||||
if (tracker->displayed_cursor)
|
}
|
||||||
meta_cursor_reference_get_cogl_texture (tracker->displayed_cursor, x, y);
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (x)
|
ensure_xfixes_cursor (tracker);
|
||||||
*x = 0;
|
cursor = tracker->xfixes_cursor;
|
||||||
if (y)
|
|
||||||
*y = 0;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
meta_cursor_tracker_set_grab_cursor (MetaCursorTracker *tracker,
|
|
||||||
MetaCursorReference *cursor)
|
|
||||||
{
|
|
||||||
g_clear_pointer (&tracker->grab_cursor, meta_cursor_reference_unref);
|
|
||||||
if (cursor)
|
if (cursor)
|
||||||
tracker->grab_cursor = meta_cursor_reference_ref (cursor);
|
{
|
||||||
|
meta_cursor_reference_get_cogl_texture (cursor, &offset_x, &offset_y);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
offset_x = 0;
|
||||||
|
offset_y = 0;
|
||||||
|
}
|
||||||
|
|
||||||
sync_cursor (tracker);
|
if (x)
|
||||||
|
*x = -offset_x;
|
||||||
|
if (y)
|
||||||
|
*y = -offset_y;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -406,184 +364,6 @@ meta_cursor_tracker_set_root_cursor (MetaCursorTracker *tracker,
|
|||||||
sync_cursor (tracker);
|
sync_cursor (tracker);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
|
||||||
should_have_hw_cursor (MetaCursorTracker *tracker)
|
|
||||||
{
|
|
||||||
if (tracker->displayed_cursor)
|
|
||||||
return (meta_cursor_reference_get_gbm_bo (tracker->displayed_cursor, NULL, NULL) != NULL);
|
|
||||||
else
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
update_hw_cursor (MetaCursorTracker *tracker)
|
|
||||||
{
|
|
||||||
MetaMonitorManager *monitors;
|
|
||||||
MetaCRTC *crtcs;
|
|
||||||
unsigned int i, n_crtcs;
|
|
||||||
gboolean enabled;
|
|
||||||
|
|
||||||
enabled = should_have_hw_cursor (tracker);
|
|
||||||
tracker->has_hw_cursor = enabled;
|
|
||||||
|
|
||||||
monitors = meta_monitor_manager_get ();
|
|
||||||
meta_monitor_manager_get_resources (monitors, NULL, NULL, &crtcs, &n_crtcs, NULL, NULL);
|
|
||||||
|
|
||||||
for (i = 0; i < n_crtcs; i++)
|
|
||||||
{
|
|
||||||
MetaRectangle *rect = &crtcs[i].rect;
|
|
||||||
gboolean has;
|
|
||||||
|
|
||||||
has = enabled && meta_rectangle_overlap (&tracker->current_rect, rect);
|
|
||||||
|
|
||||||
if (has || crtcs[i].has_hw_cursor)
|
|
||||||
meta_cursor_tracker_set_crtc_has_hw_cursor (tracker, &crtcs[i], has);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
move_hw_cursor (MetaCursorTracker *tracker)
|
|
||||||
{
|
|
||||||
MetaMonitorManager *monitors;
|
|
||||||
MetaCRTC *crtcs;
|
|
||||||
unsigned int i, n_crtcs;
|
|
||||||
|
|
||||||
monitors = meta_monitor_manager_get ();
|
|
||||||
meta_monitor_manager_get_resources (monitors, NULL, NULL, &crtcs, &n_crtcs, NULL, NULL);
|
|
||||||
|
|
||||||
g_assert (tracker->has_hw_cursor);
|
|
||||||
|
|
||||||
for (i = 0; i < n_crtcs; i++)
|
|
||||||
{
|
|
||||||
MetaRectangle *rect = &crtcs[i].rect;
|
|
||||||
gboolean has;
|
|
||||||
|
|
||||||
has = meta_rectangle_overlap (&tracker->current_rect, rect);
|
|
||||||
|
|
||||||
if (has != crtcs[i].has_hw_cursor)
|
|
||||||
meta_cursor_tracker_set_crtc_has_hw_cursor (tracker, &crtcs[i], has);
|
|
||||||
if (has)
|
|
||||||
drmModeMoveCursor (tracker->drm_fd, crtcs[i].crtc_id,
|
|
||||||
tracker->current_rect.x - rect->x,
|
|
||||||
tracker->current_rect.y - rect->y);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static MetaCursorReference *
|
|
||||||
get_displayed_cursor (MetaCursorTracker *tracker)
|
|
||||||
{
|
|
||||||
if (!tracker->is_showing)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
if (tracker->grab_cursor)
|
|
||||||
return tracker->grab_cursor;
|
|
||||||
|
|
||||||
if (tracker->has_window_cursor)
|
|
||||||
return tracker->window_cursor;
|
|
||||||
|
|
||||||
return tracker->root_cursor;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
update_displayed_cursor (MetaCursorTracker *tracker)
|
|
||||||
{
|
|
||||||
if (meta_is_wayland_compositor ())
|
|
||||||
{
|
|
||||||
if (tracker->displayed_cursor)
|
|
||||||
{
|
|
||||||
CoglTexture *texture = meta_cursor_reference_get_cogl_texture (tracker->displayed_cursor, NULL, NULL);
|
|
||||||
cogl_pipeline_set_layer_texture (tracker->pipeline, 0, texture);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
cogl_pipeline_set_layer_texture (tracker->pipeline, 0, NULL);
|
|
||||||
|
|
||||||
update_hw_cursor (tracker);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
sync_displayed_cursor (MetaCursorTracker *tracker)
|
|
||||||
{
|
|
||||||
MetaCursorReference *displayed_cursor = get_displayed_cursor (tracker);
|
|
||||||
|
|
||||||
if (tracker->displayed_cursor == displayed_cursor)
|
|
||||||
return;
|
|
||||||
|
|
||||||
g_clear_pointer (&tracker->displayed_cursor, meta_cursor_reference_unref);
|
|
||||||
if (displayed_cursor)
|
|
||||||
tracker->displayed_cursor = meta_cursor_reference_ref (displayed_cursor);
|
|
||||||
|
|
||||||
update_displayed_cursor (tracker);
|
|
||||||
g_signal_emit (tracker, signals[CURSOR_CHANGED], 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_cursor_tracker_queue_redraw (MetaCursorTracker *tracker)
|
|
||||||
{
|
|
||||||
MetaWaylandCompositor *compositor = meta_wayland_compositor_get_default ();
|
|
||||||
ClutterActor *stage = compositor->stage;
|
|
||||||
cairo_rectangle_int_t clip;
|
|
||||||
|
|
||||||
g_assert (meta_is_wayland_compositor ());
|
|
||||||
|
|
||||||
/* Clear the location the cursor was at before, if we need to. */
|
|
||||||
if (tracker->previous_is_valid)
|
|
||||||
{
|
|
||||||
clip.x = tracker->previous_rect.x;
|
|
||||||
clip.y = tracker->previous_rect.y;
|
|
||||||
clip.width = tracker->previous_rect.width;
|
|
||||||
clip.height = tracker->previous_rect.height;
|
|
||||||
clutter_actor_queue_redraw_with_clip (stage, &clip);
|
|
||||||
tracker->previous_is_valid = FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tracker->has_hw_cursor || !tracker->displayed_cursor)
|
|
||||||
return;
|
|
||||||
|
|
||||||
clip.x = tracker->current_rect.x;
|
|
||||||
clip.y = tracker->current_rect.y;
|
|
||||||
clip.width = tracker->current_rect.width;
|
|
||||||
clip.height = tracker->current_rect.height;
|
|
||||||
clutter_actor_queue_redraw_with_clip (stage, &clip);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
sync_cursor (MetaCursorTracker *tracker)
|
|
||||||
{
|
|
||||||
MetaCursorReference *displayed_cursor;
|
|
||||||
|
|
||||||
sync_displayed_cursor (tracker);
|
|
||||||
displayed_cursor = tracker->displayed_cursor;
|
|
||||||
|
|
||||||
if (displayed_cursor)
|
|
||||||
{
|
|
||||||
CoglTexture *texture;
|
|
||||||
int hot_x, hot_y;
|
|
||||||
|
|
||||||
texture = meta_cursor_reference_get_cogl_texture (displayed_cursor, &hot_x, &hot_y);
|
|
||||||
|
|
||||||
tracker->current_rect.x = tracker->current_x - hot_x;
|
|
||||||
tracker->current_rect.y = tracker->current_y - hot_y;
|
|
||||||
tracker->current_rect.width = cogl_texture_get_width (COGL_TEXTURE (texture));
|
|
||||||
tracker->current_rect.height = cogl_texture_get_height (COGL_TEXTURE (texture));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
tracker->current_rect.x = 0;
|
|
||||||
tracker->current_rect.y = 0;
|
|
||||||
tracker->current_rect.width = 0;
|
|
||||||
tracker->current_rect.height = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (meta_is_wayland_compositor ())
|
|
||||||
{
|
|
||||||
if (tracker->has_hw_cursor)
|
|
||||||
move_hw_cursor (tracker);
|
|
||||||
else
|
|
||||||
meta_cursor_tracker_queue_redraw (tracker);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_cursor_tracker_update_position (MetaCursorTracker *tracker,
|
meta_cursor_tracker_update_position (MetaCursorTracker *tracker,
|
||||||
int new_x,
|
int new_x,
|
||||||
@@ -591,61 +371,7 @@ meta_cursor_tracker_update_position (MetaCursorTracker *tracker,
|
|||||||
{
|
{
|
||||||
g_assert (meta_is_wayland_compositor ());
|
g_assert (meta_is_wayland_compositor ());
|
||||||
|
|
||||||
tracker->current_x = new_x;
|
meta_cursor_renderer_set_position (tracker->renderer, new_x, new_y);
|
||||||
tracker->current_y = new_y;
|
|
||||||
|
|
||||||
sync_cursor (tracker);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
meta_cursor_tracker_paint (MetaCursorTracker *tracker)
|
|
||||||
{
|
|
||||||
g_assert (meta_is_wayland_compositor ());
|
|
||||||
|
|
||||||
if (tracker->has_hw_cursor || !tracker->displayed_cursor)
|
|
||||||
return;
|
|
||||||
|
|
||||||
cogl_framebuffer_draw_rectangle (cogl_get_draw_framebuffer (),
|
|
||||||
tracker->pipeline,
|
|
||||||
tracker->current_rect.x,
|
|
||||||
tracker->current_rect.y,
|
|
||||||
tracker->current_rect.x +
|
|
||||||
tracker->current_rect.width,
|
|
||||||
tracker->current_rect.y +
|
|
||||||
tracker->current_rect.height);
|
|
||||||
|
|
||||||
tracker->previous_rect = tracker->current_rect;
|
|
||||||
tracker->previous_is_valid = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_cursor_tracker_set_crtc_has_hw_cursor (MetaCursorTracker *tracker,
|
|
||||||
MetaCRTC *crtc,
|
|
||||||
gboolean has)
|
|
||||||
{
|
|
||||||
if (has)
|
|
||||||
{
|
|
||||||
MetaCursorReference *displayed_cursor = tracker->displayed_cursor;
|
|
||||||
struct gbm_bo *bo;
|
|
||||||
union gbm_bo_handle handle;
|
|
||||||
int width, height;
|
|
||||||
int hot_x, hot_y;
|
|
||||||
|
|
||||||
bo = meta_cursor_reference_get_gbm_bo (displayed_cursor, &hot_x, &hot_y);
|
|
||||||
|
|
||||||
handle = gbm_bo_get_handle (bo);
|
|
||||||
width = gbm_bo_get_width (bo);
|
|
||||||
height = gbm_bo_get_height (bo);
|
|
||||||
|
|
||||||
drmModeSetCursor2 (tracker->drm_fd, crtc->crtc_id, handle.u32,
|
|
||||||
width, height, hot_x, hot_y);
|
|
||||||
crtc->has_hw_cursor = TRUE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
drmModeSetCursor2 (tracker->drm_fd, crtc->crtc_id, 0, 0, 0, 0, 0);
|
|
||||||
crtc->has_hw_cursor = FALSE;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -713,26 +439,11 @@ meta_cursor_tracker_set_pointer_visible (MetaCursorTracker *tracker,
|
|||||||
return;
|
return;
|
||||||
tracker->is_showing = visible;
|
tracker->is_showing = visible;
|
||||||
|
|
||||||
if (meta_is_wayland_compositor ())
|
|
||||||
{
|
|
||||||
sync_cursor (tracker);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (visible)
|
|
||||||
XFixesShowCursor (tracker->screen->display->xdisplay,
|
|
||||||
tracker->screen->xroot);
|
|
||||||
else
|
|
||||||
XFixesHideCursor (tracker->screen->display->xdisplay,
|
|
||||||
tracker->screen->xroot);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
meta_cursor_tracker_force_update (MetaCursorTracker *tracker)
|
|
||||||
{
|
|
||||||
g_assert (meta_is_wayland_compositor ());
|
|
||||||
|
|
||||||
update_hw_cursor (tracker);
|
|
||||||
sync_cursor (tracker);
|
sync_cursor (tracker);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MetaCursorReference *
|
||||||
|
meta_cursor_tracker_get_displayed_cursor (MetaCursorTracker *tracker)
|
||||||
|
{
|
||||||
|
return tracker->displayed_cursor;
|
||||||
|
}
|
||||||
|
|||||||
@@ -27,7 +27,11 @@
|
|||||||
|
|
||||||
#include "display-private.h"
|
#include "display-private.h"
|
||||||
#include "screen-private.h"
|
#include "screen-private.h"
|
||||||
#include "meta-cursor-tracker-private.h" /* for tracker->gbm */
|
#include "meta-backend-private.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_NATIVE_BACKEND
|
||||||
|
#include "backends/native/meta-cursor-renderer-native.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
@@ -35,7 +39,9 @@
|
|||||||
#include <X11/extensions/Xfixes.h>
|
#include <X11/extensions/Xfixes.h>
|
||||||
#include <X11/Xcursor/Xcursor.h>
|
#include <X11/Xcursor/Xcursor.h>
|
||||||
|
|
||||||
|
#ifdef HAVE_WAYLAND
|
||||||
#include <cogl/cogl-wayland-server.h>
|
#include <cogl/cogl-wayland-server.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
MetaCursorReference *
|
MetaCursorReference *
|
||||||
meta_cursor_reference_ref (MetaCursorReference *self)
|
meta_cursor_reference_ref (MetaCursorReference *self)
|
||||||
@@ -70,124 +76,67 @@ meta_cursor_reference_unref (MetaCursorReference *self)
|
|||||||
meta_cursor_reference_free (self);
|
meta_cursor_reference_free (self);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static const char *
|
||||||
translate_meta_cursor (MetaCursor cursor,
|
translate_meta_cursor (MetaCursor cursor)
|
||||||
guint *glyph_out,
|
|
||||||
const char **name_out)
|
|
||||||
{
|
{
|
||||||
guint glyph = XC_num_glyphs;
|
|
||||||
const char *name = NULL;
|
|
||||||
|
|
||||||
switch (cursor)
|
switch (cursor)
|
||||||
{
|
{
|
||||||
case META_CURSOR_DEFAULT:
|
case META_CURSOR_DEFAULT:
|
||||||
glyph = XC_left_ptr;
|
return "left_ptr";
|
||||||
break;
|
|
||||||
case META_CURSOR_NORTH_RESIZE:
|
case META_CURSOR_NORTH_RESIZE:
|
||||||
glyph = XC_top_side;
|
return "top_side";
|
||||||
break;
|
|
||||||
case META_CURSOR_SOUTH_RESIZE:
|
case META_CURSOR_SOUTH_RESIZE:
|
||||||
glyph = XC_bottom_side;
|
return "bottom_side";
|
||||||
break;
|
|
||||||
case META_CURSOR_WEST_RESIZE:
|
case META_CURSOR_WEST_RESIZE:
|
||||||
glyph = XC_left_side;
|
return "left_side";
|
||||||
break;
|
|
||||||
case META_CURSOR_EAST_RESIZE:
|
case META_CURSOR_EAST_RESIZE:
|
||||||
glyph = XC_right_side;
|
return "right_side";
|
||||||
break;
|
|
||||||
case META_CURSOR_SE_RESIZE:
|
case META_CURSOR_SE_RESIZE:
|
||||||
glyph = XC_bottom_right_corner;
|
return "bottom_right_corner";
|
||||||
break;
|
|
||||||
case META_CURSOR_SW_RESIZE:
|
case META_CURSOR_SW_RESIZE:
|
||||||
glyph = XC_bottom_left_corner;
|
return "bottom_left_corner";
|
||||||
break;
|
|
||||||
case META_CURSOR_NE_RESIZE:
|
case META_CURSOR_NE_RESIZE:
|
||||||
glyph = XC_top_right_corner;
|
return "top_right_corner";
|
||||||
break;
|
|
||||||
case META_CURSOR_NW_RESIZE:
|
case META_CURSOR_NW_RESIZE:
|
||||||
glyph = XC_top_left_corner;
|
return "top_left_corner";
|
||||||
break;
|
|
||||||
case META_CURSOR_MOVE_OR_RESIZE_WINDOW:
|
case META_CURSOR_MOVE_OR_RESIZE_WINDOW:
|
||||||
glyph = XC_fleur;
|
return "fleur";
|
||||||
break;
|
|
||||||
case META_CURSOR_BUSY:
|
case META_CURSOR_BUSY:
|
||||||
glyph = XC_watch;
|
return "watch";
|
||||||
break;
|
|
||||||
case META_CURSOR_DND_IN_DRAG:
|
case META_CURSOR_DND_IN_DRAG:
|
||||||
name = "dnd-none";
|
return "dnd-none";
|
||||||
break;
|
|
||||||
case META_CURSOR_DND_MOVE:
|
case META_CURSOR_DND_MOVE:
|
||||||
name = "dnd-move";
|
return "dnd-move";
|
||||||
break;
|
|
||||||
case META_CURSOR_DND_COPY:
|
case META_CURSOR_DND_COPY:
|
||||||
name = "dnd-copy";
|
return "dnd-copy";
|
||||||
break;
|
|
||||||
case META_CURSOR_DND_UNSUPPORTED_TARGET:
|
case META_CURSOR_DND_UNSUPPORTED_TARGET:
|
||||||
name = "dnd-none";
|
return "dnd-none";
|
||||||
break;
|
|
||||||
case META_CURSOR_POINTING_HAND:
|
case META_CURSOR_POINTING_HAND:
|
||||||
glyph = XC_hand2;
|
return "hand2";
|
||||||
break;
|
|
||||||
case META_CURSOR_CROSSHAIR:
|
case META_CURSOR_CROSSHAIR:
|
||||||
glyph = XC_crosshair;
|
return "crosshair";
|
||||||
break;
|
|
||||||
case META_CURSOR_IBEAM:
|
case META_CURSOR_IBEAM:
|
||||||
glyph = XC_xterm;
|
return "xterm";
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
g_assert_not_reached ();
|
|
||||||
glyph = 0; /* silence compiler */
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
*glyph_out = glyph;
|
g_assert_not_reached ();
|
||||||
*name_out = name;
|
|
||||||
}
|
|
||||||
|
|
||||||
static Cursor
|
|
||||||
load_cursor_on_server (MetaDisplay *display,
|
|
||||||
MetaCursor cursor)
|
|
||||||
{
|
|
||||||
Cursor xcursor;
|
|
||||||
guint glyph;
|
|
||||||
const char *name;
|
|
||||||
|
|
||||||
translate_meta_cursor (cursor, &glyph, &name);
|
|
||||||
|
|
||||||
if (name != NULL)
|
|
||||||
xcursor = XcursorLibraryLoadCursor (display->xdisplay, name);
|
|
||||||
else
|
|
||||||
xcursor = XCreateFontCursor (display->xdisplay, glyph);
|
|
||||||
|
|
||||||
return xcursor;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Cursor
|
Cursor
|
||||||
meta_display_create_x_cursor (MetaDisplay *display,
|
meta_cursor_create_x_cursor (Display *xdisplay,
|
||||||
MetaCursor cursor)
|
MetaCursor cursor)
|
||||||
{
|
{
|
||||||
return load_cursor_on_server (display, cursor);
|
return XcursorLibraryLoadCursor (xdisplay, translate_meta_cursor (cursor));
|
||||||
}
|
}
|
||||||
|
|
||||||
static XcursorImage *
|
static XcursorImage *
|
||||||
load_cursor_on_client (MetaDisplay *display,
|
load_cursor_on_client (MetaCursor cursor)
|
||||||
MetaCursor cursor)
|
|
||||||
{
|
{
|
||||||
XcursorImage *image;
|
return XcursorLibraryLoadImage (translate_meta_cursor (cursor),
|
||||||
guint glyph;
|
meta_prefs_get_cursor_theme (),
|
||||||
const char *name;
|
meta_prefs_get_cursor_size ());
|
||||||
const char *theme = XcursorGetTheme (display->xdisplay);
|
|
||||||
int size = XcursorGetDefaultSize (display->xdisplay);
|
|
||||||
|
|
||||||
translate_meta_cursor (cursor, &glyph, &name);
|
|
||||||
|
|
||||||
if (name != NULL)
|
|
||||||
image = XcursorLibraryLoadImage (name, theme, size);
|
|
||||||
else
|
|
||||||
image = XcursorShapeLoadImage (glyph, theme, size);
|
|
||||||
|
|
||||||
return image;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -224,9 +173,22 @@ meta_cursor_image_load_gbm_buffer (struct gbm_device *gbm,
|
|||||||
meta_warning ("HW cursor for format %d not supported\n", gbm_format);
|
meta_warning ("HW cursor for format %d not supported\n", gbm_format);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct gbm_device *
|
||||||
|
get_gbm_device (void)
|
||||||
|
{
|
||||||
|
#ifdef HAVE_NATIVE_BACKEND
|
||||||
|
MetaBackend *meta_backend = meta_get_backend ();
|
||||||
|
MetaCursorRenderer *renderer = meta_backend_get_cursor_renderer (meta_backend);
|
||||||
|
|
||||||
|
if (META_IS_CURSOR_RENDERER_NATIVE (renderer))
|
||||||
|
return meta_cursor_renderer_native_get_gbm_device (META_CURSOR_RENDERER_NATIVE (renderer));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_cursor_image_load_from_xcursor_image (MetaCursorTracker *tracker,
|
meta_cursor_image_load_from_xcursor_image (MetaCursorImage *image,
|
||||||
MetaCursorImage *image,
|
|
||||||
XcursorImage *xc_image)
|
XcursorImage *xc_image)
|
||||||
{
|
{
|
||||||
int width, height, rowstride;
|
int width, height, rowstride;
|
||||||
@@ -234,6 +196,7 @@ meta_cursor_image_load_from_xcursor_image (MetaCursorTracker *tracker,
|
|||||||
uint32_t gbm_format;
|
uint32_t gbm_format;
|
||||||
ClutterBackend *clutter_backend;
|
ClutterBackend *clutter_backend;
|
||||||
CoglContext *cogl_context;
|
CoglContext *cogl_context;
|
||||||
|
struct gbm_device *gbm;
|
||||||
|
|
||||||
width = xc_image->width;
|
width = xc_image->width;
|
||||||
height = xc_image->height;
|
height = xc_image->height;
|
||||||
@@ -258,8 +221,9 @@ meta_cursor_image_load_from_xcursor_image (MetaCursorTracker *tracker,
|
|||||||
(uint8_t *) xc_image->pixels,
|
(uint8_t *) xc_image->pixels,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
if (tracker->gbm)
|
gbm = get_gbm_device ();
|
||||||
meta_cursor_image_load_gbm_buffer (tracker->gbm,
|
if (gbm)
|
||||||
|
meta_cursor_image_load_gbm_buffer (gbm,
|
||||||
image,
|
image,
|
||||||
(uint8_t *) xc_image->pixels,
|
(uint8_t *) xc_image->pixels,
|
||||||
width, height, rowstride,
|
width, height, rowstride,
|
||||||
@@ -267,34 +231,33 @@ meta_cursor_image_load_from_xcursor_image (MetaCursorTracker *tracker,
|
|||||||
}
|
}
|
||||||
|
|
||||||
MetaCursorReference *
|
MetaCursorReference *
|
||||||
meta_cursor_reference_from_theme (MetaCursorTracker *tracker,
|
meta_cursor_reference_from_theme (MetaCursor cursor)
|
||||||
MetaCursor cursor)
|
|
||||||
{
|
{
|
||||||
MetaCursorReference *self;
|
MetaCursorReference *self;
|
||||||
XcursorImage *image;
|
XcursorImage *image;
|
||||||
|
|
||||||
if (tracker->theme_cursors[cursor])
|
image = load_cursor_on_client (cursor);
|
||||||
return meta_cursor_reference_ref (tracker->theme_cursors[cursor]);
|
|
||||||
|
|
||||||
image = load_cursor_on_client (tracker->screen->display, cursor);
|
|
||||||
if (!image)
|
if (!image)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
self = g_slice_new0 (MetaCursorReference);
|
self = g_slice_new0 (MetaCursorReference);
|
||||||
self->ref_count = 1;
|
self->ref_count = 1;
|
||||||
meta_cursor_image_load_from_xcursor_image (tracker, &self->image, image);
|
self->cursor = cursor;
|
||||||
|
meta_cursor_image_load_from_xcursor_image (&self->image, image);
|
||||||
|
|
||||||
XcursorImageDestroy (image);
|
XcursorImageDestroy (image);
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_WAYLAND
|
||||||
static void
|
static void
|
||||||
meta_cursor_image_load_from_buffer (MetaCursorTracker *tracker,
|
meta_cursor_image_load_from_buffer (MetaCursorImage *image,
|
||||||
MetaCursorImage *image,
|
|
||||||
struct wl_resource *buffer,
|
struct wl_resource *buffer,
|
||||||
int hot_x,
|
int hot_x,
|
||||||
int hot_y)
|
int hot_y)
|
||||||
{
|
{
|
||||||
|
struct gbm_device *gbm = get_gbm_device ();
|
||||||
|
|
||||||
ClutterBackend *backend;
|
ClutterBackend *backend;
|
||||||
CoglContext *cogl_context;
|
CoglContext *cogl_context;
|
||||||
struct wl_shm_buffer *shm_buffer;
|
struct wl_shm_buffer *shm_buffer;
|
||||||
@@ -315,7 +278,7 @@ meta_cursor_image_load_from_buffer (MetaCursorTracker *tracker,
|
|||||||
shm_buffer = wl_shm_buffer_get (buffer);
|
shm_buffer = wl_shm_buffer_get (buffer);
|
||||||
if (shm_buffer)
|
if (shm_buffer)
|
||||||
{
|
{
|
||||||
if (tracker->gbm)
|
if (gbm)
|
||||||
{
|
{
|
||||||
int rowstride = wl_shm_buffer_get_stride (shm_buffer);
|
int rowstride = wl_shm_buffer_get_stride (shm_buffer);
|
||||||
|
|
||||||
@@ -341,7 +304,7 @@ meta_cursor_image_load_from_buffer (MetaCursorTracker *tracker,
|
|||||||
gbm_format = GBM_FORMAT_ARGB8888;
|
gbm_format = GBM_FORMAT_ARGB8888;
|
||||||
}
|
}
|
||||||
|
|
||||||
meta_cursor_image_load_gbm_buffer (tracker->gbm,
|
meta_cursor_image_load_gbm_buffer (gbm,
|
||||||
image,
|
image,
|
||||||
(uint8_t *) wl_shm_buffer_get_data (shm_buffer),
|
(uint8_t *) wl_shm_buffer_get_data (shm_buffer),
|
||||||
width, height, rowstride,
|
width, height, rowstride,
|
||||||
@@ -362,9 +325,9 @@ meta_cursor_image_load_from_buffer (MetaCursorTracker *tracker,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tracker->gbm)
|
if (gbm)
|
||||||
{
|
{
|
||||||
image->bo = gbm_bo_import (tracker->gbm, GBM_BO_IMPORT_WL_BUFFER,
|
image->bo = gbm_bo_import (gbm, GBM_BO_IMPORT_WL_BUFFER,
|
||||||
buffer, GBM_BO_USE_CURSOR_64X64);
|
buffer, GBM_BO_USE_CURSOR_64X64);
|
||||||
if (!image->bo)
|
if (!image->bo)
|
||||||
meta_warning ("Importing HW cursor from wl_buffer failed\n");
|
meta_warning ("Importing HW cursor from wl_buffer failed\n");
|
||||||
@@ -373,8 +336,7 @@ meta_cursor_image_load_from_buffer (MetaCursorTracker *tracker,
|
|||||||
}
|
}
|
||||||
|
|
||||||
MetaCursorReference *
|
MetaCursorReference *
|
||||||
meta_cursor_reference_from_buffer (MetaCursorTracker *tracker,
|
meta_cursor_reference_from_buffer (struct wl_resource *buffer,
|
||||||
struct wl_resource *buffer,
|
|
||||||
int hot_x,
|
int hot_x,
|
||||||
int hot_y)
|
int hot_y)
|
||||||
{
|
{
|
||||||
@@ -382,31 +344,38 @@ meta_cursor_reference_from_buffer (MetaCursorTracker *tracker,
|
|||||||
|
|
||||||
self = g_slice_new0 (MetaCursorReference);
|
self = g_slice_new0 (MetaCursorReference);
|
||||||
self->ref_count = 1;
|
self->ref_count = 1;
|
||||||
meta_cursor_image_load_from_buffer (tracker, &self->image, buffer, hot_x, hot_y);
|
meta_cursor_image_load_from_buffer (&self->image, buffer, hot_x, hot_y);
|
||||||
|
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
CoglTexture *
|
CoglTexture *
|
||||||
meta_cursor_reference_get_cogl_texture (MetaCursorReference *cursor,
|
meta_cursor_reference_get_cogl_texture (MetaCursorReference *cursor,
|
||||||
int *hot_x,
|
int *offset_x,
|
||||||
int *hot_y)
|
int *offset_y)
|
||||||
{
|
{
|
||||||
if (hot_x)
|
if (offset_x)
|
||||||
*hot_x = cursor->image.hot_x;
|
*offset_x = cursor->image.offset_x;
|
||||||
if (hot_y)
|
if (offset_y)
|
||||||
*hot_y = cursor->image.hot_y;
|
*offset_y = cursor->image.offset_y;
|
||||||
return COGL_TEXTURE (cursor->image.texture);
|
return COGL_TEXTURE (cursor->image.texture);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct gbm_bo *
|
struct gbm_bo *
|
||||||
meta_cursor_reference_get_gbm_bo (MetaCursorReference *cursor,
|
meta_cursor_reference_get_gbm_bo (MetaCursorReference *cursor,
|
||||||
int *hot_x,
|
int *offset_x,
|
||||||
int *hot_y)
|
int *offset_y)
|
||||||
{
|
{
|
||||||
if (hot_x)
|
if (offset_x)
|
||||||
*hot_x = cursor->image.hot_x;
|
*offset_x = cursor->image.offset_x;
|
||||||
if (hot_y)
|
if (offset_y)
|
||||||
*hot_y = cursor->image.hot_y;
|
*offset_y = cursor->image.offset_y;
|
||||||
return cursor->image.bo;
|
return cursor->image.bo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MetaCursor
|
||||||
|
meta_cursor_reference_get_meta_cursor (MetaCursorReference *cursor)
|
||||||
|
{
|
||||||
|
return cursor->cursor;
|
||||||
|
}
|
||||||
|
|||||||
@@ -27,16 +27,19 @@ typedef struct _MetaCursorReference MetaCursorReference;
|
|||||||
MetaCursorReference * meta_cursor_reference_ref (MetaCursorReference *cursor);
|
MetaCursorReference * meta_cursor_reference_ref (MetaCursorReference *cursor);
|
||||||
void meta_cursor_reference_unref (MetaCursorReference *cursor);
|
void meta_cursor_reference_unref (MetaCursorReference *cursor);
|
||||||
|
|
||||||
#include <meta/meta-cursor-tracker.h>
|
|
||||||
#include <meta/common.h>
|
#include <meta/common.h>
|
||||||
|
|
||||||
|
MetaCursorReference * meta_cursor_reference_from_theme (MetaCursor cursor);
|
||||||
|
|
||||||
|
#ifdef HAVE_WAYLAND
|
||||||
#include <wayland-server.h>
|
#include <wayland-server.h>
|
||||||
|
MetaCursorReference * meta_cursor_reference_from_buffer (struct wl_resource *buffer,
|
||||||
|
int offset_x, int offset_y);
|
||||||
|
#endif
|
||||||
|
|
||||||
MetaCursorReference * meta_cursor_reference_from_theme (MetaCursorTracker *tracker,
|
MetaCursor meta_cursor_reference_get_meta_cursor (MetaCursorReference *cursor);
|
||||||
MetaCursor cursor);
|
|
||||||
|
|
||||||
MetaCursorReference * meta_cursor_reference_from_buffer (MetaCursorTracker *tracker,
|
Cursor meta_cursor_create_x_cursor (Display *xdisplay,
|
||||||
struct wl_resource *buffer,
|
MetaCursor cursor);
|
||||||
int hot_x,
|
|
||||||
int hot_y);
|
|
||||||
|
|
||||||
#endif /* META_CURSOR_H */
|
#endif /* META_CURSOR_H */
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2013 Red Hat Inc.
|
* Copyright (C) 2013 Red Hat Inc.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License as
|
* modify it under the terms of the GNU General Public License as
|
||||||
* published by the Free Software Foundation; either version 2 of the
|
* published by the Free Software Foundation; either version 2 of the
|
||||||
@@ -11,7 +11,7 @@
|
|||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -180,6 +180,9 @@ create_monitor_skeleton (GDBusObjectManagerServer *manager,
|
|||||||
meta_dbus_object_skeleton_set_idle_monitor (object, skeleton);
|
meta_dbus_object_skeleton_set_idle_monitor (object, skeleton);
|
||||||
|
|
||||||
g_dbus_object_manager_server_export (manager, G_DBUS_OBJECT_SKELETON (object));
|
g_dbus_object_manager_server_export (manager, G_DBUS_OBJECT_SKELETON (object));
|
||||||
|
|
||||||
|
g_object_unref (skeleton);
|
||||||
|
g_object_unref (object);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright 2013 Red Hat, Inc.
|
* Copyright 2013 Red Hat, Inc.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License as
|
* modify it under the terms of the GNU General Public License as
|
||||||
* published by the Free Software Foundation; either version 2 of the
|
* published by the Free Software Foundation; either version 2 of the
|
||||||
@@ -12,7 +12,7 @@
|
|||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright 2013 Red Hat, Inc.
|
* Copyright 2013 Red Hat, Inc.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License as
|
* modify it under the terms of the GNU General Public License as
|
||||||
* published by the Free Software Foundation; either version 2 of the
|
* published by the Free Software Foundation; either version 2 of the
|
||||||
@@ -12,7 +12,7 @@
|
|||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
@@ -38,8 +38,7 @@
|
|||||||
#include <meta/meta-idle-monitor.h>
|
#include <meta/meta-idle-monitor.h>
|
||||||
#include "meta-idle-monitor-private.h"
|
#include "meta-idle-monitor-private.h"
|
||||||
#include "meta-idle-monitor-dbus.h"
|
#include "meta-idle-monitor-dbus.h"
|
||||||
#include "backends/x11/meta-idle-monitor-xsync.h"
|
#include "meta-backend-private.h"
|
||||||
#include "backends/native/meta-idle-monitor-native.h"
|
|
||||||
|
|
||||||
G_STATIC_ASSERT(sizeof(unsigned long) == sizeof(gpointer));
|
G_STATIC_ASSERT(sizeof(unsigned long) == sizeof(gpointer));
|
||||||
|
|
||||||
@@ -54,9 +53,6 @@ static GParamSpec *obj_props[PROP_LAST];
|
|||||||
|
|
||||||
G_DEFINE_TYPE (MetaIdleMonitor, meta_idle_monitor, G_TYPE_OBJECT)
|
G_DEFINE_TYPE (MetaIdleMonitor, meta_idle_monitor, G_TYPE_OBJECT)
|
||||||
|
|
||||||
static MetaIdleMonitor *device_monitors[256];
|
|
||||||
static int device_id_max;
|
|
||||||
|
|
||||||
void
|
void
|
||||||
_meta_idle_monitor_watch_fire (MetaIdleMonitorWatch *watch)
|
_meta_idle_monitor_watch_fire (MetaIdleMonitorWatch *watch)
|
||||||
{
|
{
|
||||||
@@ -160,36 +156,6 @@ meta_idle_monitor_init (MetaIdleMonitor *monitor)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
static GType
|
|
||||||
get_idle_monitor_type (void)
|
|
||||||
{
|
|
||||||
if (meta_is_wayland_compositor ())
|
|
||||||
return META_TYPE_IDLE_MONITOR_NATIVE;
|
|
||||||
else
|
|
||||||
return META_TYPE_IDLE_MONITOR_XSYNC;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
ensure_device_monitor (int device_id)
|
|
||||||
{
|
|
||||||
if (device_monitors[device_id])
|
|
||||||
return;
|
|
||||||
|
|
||||||
device_monitors[device_id] = g_object_new (get_idle_monitor_type (),
|
|
||||||
"device-id", device_id,
|
|
||||||
NULL);
|
|
||||||
device_id_max = MAX (device_id_max, device_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* FIXME -- destroy device monitors at some point */
|
|
||||||
G_GNUC_UNUSED static void
|
|
||||||
destroy_device_monitor (int device_id)
|
|
||||||
{
|
|
||||||
g_clear_object (&device_monitors[device_id]);
|
|
||||||
if (device_id == device_id_max)
|
|
||||||
device_id_max--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* meta_idle_monitor_get_core:
|
* meta_idle_monitor_get_core:
|
||||||
*
|
*
|
||||||
@@ -200,8 +166,8 @@ destroy_device_monitor (int device_id)
|
|||||||
MetaIdleMonitor *
|
MetaIdleMonitor *
|
||||||
meta_idle_monitor_get_core (void)
|
meta_idle_monitor_get_core (void)
|
||||||
{
|
{
|
||||||
ensure_device_monitor (0);
|
MetaBackend *backend = meta_get_backend ();
|
||||||
return device_monitors[0];
|
return meta_backend_get_idle_monitor (backend, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -215,10 +181,8 @@ meta_idle_monitor_get_core (void)
|
|||||||
MetaIdleMonitor *
|
MetaIdleMonitor *
|
||||||
meta_idle_monitor_get_for_device (int device_id)
|
meta_idle_monitor_get_for_device (int device_id)
|
||||||
{
|
{
|
||||||
g_return_val_if_fail (device_id > 0 && device_id < 256, NULL);
|
MetaBackend *backend = meta_get_backend ();
|
||||||
|
return meta_backend_get_idle_monitor (backend, device_id);
|
||||||
ensure_device_monitor (device_id);
|
|
||||||
return device_monitors[device_id];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static MetaIdleMonitorWatch *
|
static MetaIdleMonitorWatch *
|
||||||
@@ -246,9 +210,9 @@ make_watch (MetaIdleMonitor *monitor,
|
|||||||
* meta_idle_monitor_add_idle_watch:
|
* meta_idle_monitor_add_idle_watch:
|
||||||
* @monitor: A #MetaIdleMonitor
|
* @monitor: A #MetaIdleMonitor
|
||||||
* @interval_msec: The idletime interval, in milliseconds
|
* @interval_msec: The idletime interval, in milliseconds
|
||||||
* @callback: (allow-none): The callback to call when the user has
|
* @callback: (nullable): The callback to call when the user has
|
||||||
* accumulated @interval_msec milliseconds of idle time.
|
* accumulated @interval_msec milliseconds of idle time.
|
||||||
* @user_data: (allow-none): The user data to pass to the callback
|
* @user_data: (nullable): The user data to pass to the callback
|
||||||
* @notify: A #GDestroyNotify
|
* @notify: A #GDestroyNotify
|
||||||
*
|
*
|
||||||
* Returns: a watch id
|
* Returns: a watch id
|
||||||
@@ -288,9 +252,9 @@ meta_idle_monitor_add_idle_watch (MetaIdleMonitor *monitor,
|
|||||||
/**
|
/**
|
||||||
* meta_idle_monitor_add_user_active_watch:
|
* meta_idle_monitor_add_user_active_watch:
|
||||||
* @monitor: A #MetaIdleMonitor
|
* @monitor: A #MetaIdleMonitor
|
||||||
* @callback: (allow-none): The callback to call when the user is
|
* @callback: (nullable): The callback to call when the user is
|
||||||
* active again.
|
* active again.
|
||||||
* @user_data: (allow-none): The user data to pass to the callback
|
* @user_data: (nullable): The user data to pass to the callback
|
||||||
* @notify: A #GDestroyNotify
|
* @notify: A #GDestroyNotify
|
||||||
*
|
*
|
||||||
* Returns: a watch id
|
* Returns: a watch id
|
||||||
@@ -352,16 +316,3 @@ meta_idle_monitor_get_idletime (MetaIdleMonitor *monitor)
|
|||||||
{
|
{
|
||||||
return META_IDLE_MONITOR_GET_CLASS (monitor)->get_idletime (monitor);
|
return META_IDLE_MONITOR_GET_CLASS (monitor)->get_idletime (monitor);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
meta_idle_monitor_xsync_handle_xevent_all (XEvent *xevent)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if (meta_is_wayland_compositor ())
|
|
||||||
return;
|
|
||||||
|
|
||||||
for (i = 0; i <= device_id_max; i++)
|
|
||||||
if (device_monitors[i])
|
|
||||||
meta_idle_monitor_xsync_handle_xevent (device_monitors[i], (XSyncAlarmNotifyEvent*)xevent);
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2001, 2002 Havoc Pennington
|
* Copyright (C) 2001, 2002 Havoc Pennington
|
||||||
* Copyright (C) 2002, 2003 Red Hat Inc.
|
* Copyright (C) 2002, 2003 Red Hat Inc.
|
||||||
* Some ICCCM manager selection code derived from fvwm2,
|
* Some ICCCM manager selection code derived from fvwm2,
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
* Copyright (C) 2003 Rob Adams
|
* Copyright (C) 2003 Rob Adams
|
||||||
* Copyright (C) 2004-2006 Elijah Newren
|
* Copyright (C) 2004-2006 Elijah Newren
|
||||||
* Copyright (C) 2013 Red Hat Inc.
|
* Copyright (C) 2013 Red Hat Inc.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License as
|
* modify it under the terms of the GNU General Public License as
|
||||||
* published by the Free Software Foundation; either version 2 of the
|
* published by the Free Software Foundation; either version 2 of the
|
||||||
@@ -18,7 +18,7 @@
|
|||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
@@ -60,7 +60,7 @@ typedef struct {
|
|||||||
gboolean enabled;
|
gboolean enabled;
|
||||||
MetaRectangle rect;
|
MetaRectangle rect;
|
||||||
float refresh_rate;
|
float refresh_rate;
|
||||||
enum wl_output_transform transform;
|
MetaMonitorTransform transform;
|
||||||
|
|
||||||
gboolean is_primary;
|
gboolean is_primary;
|
||||||
gboolean is_presentation;
|
gboolean is_presentation;
|
||||||
@@ -78,6 +78,7 @@ struct _MetaMonitorConfig {
|
|||||||
GHashTable *configs;
|
GHashTable *configs;
|
||||||
MetaConfiguration *current;
|
MetaConfiguration *current;
|
||||||
gboolean current_is_stored;
|
gboolean current_is_stored;
|
||||||
|
gboolean current_is_for_laptop_lid;
|
||||||
MetaConfiguration *previous;
|
MetaConfiguration *previous;
|
||||||
|
|
||||||
GFile *file;
|
GFile *file;
|
||||||
@@ -570,7 +571,7 @@ is_all_whitespace (const char *text,
|
|||||||
gsize text_len)
|
gsize text_len)
|
||||||
{
|
{
|
||||||
gsize i;
|
gsize i;
|
||||||
|
|
||||||
for (i = 0; i < text_len; i++)
|
for (i = 0; i < text_len; i++)
|
||||||
if (!g_ascii_isspace (text[i]))
|
if (!g_ascii_isspace (text[i]))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@@ -655,20 +656,20 @@ handle_text (GMarkupParseContext *context,
|
|||||||
else if (strcmp (parser->output_field, "rotation") == 0)
|
else if (strcmp (parser->output_field, "rotation") == 0)
|
||||||
{
|
{
|
||||||
if (strncmp (text, "normal", text_len) == 0)
|
if (strncmp (text, "normal", text_len) == 0)
|
||||||
parser->output.transform = WL_OUTPUT_TRANSFORM_NORMAL;
|
parser->output.transform = META_MONITOR_TRANSFORM_NORMAL;
|
||||||
else if (strncmp (text, "left", text_len) == 0)
|
else if (strncmp (text, "left", text_len) == 0)
|
||||||
parser->output.transform = WL_OUTPUT_TRANSFORM_90;
|
parser->output.transform = META_MONITOR_TRANSFORM_90;
|
||||||
else if (strncmp (text, "upside_down", text_len) == 0)
|
else if (strncmp (text, "upside_down", text_len) == 0)
|
||||||
parser->output.transform = WL_OUTPUT_TRANSFORM_180;
|
parser->output.transform = META_MONITOR_TRANSFORM_180;
|
||||||
else if (strncmp (text, "right", text_len) == 0)
|
else if (strncmp (text, "right", text_len) == 0)
|
||||||
parser->output.transform = WL_OUTPUT_TRANSFORM_270;
|
parser->output.transform = META_MONITOR_TRANSFORM_270;
|
||||||
else
|
else
|
||||||
g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT,
|
g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT,
|
||||||
"Invalid rotation type %.*s", (int)text_len, text);
|
"Invalid rotation type %.*s", (int)text_len, text);
|
||||||
}
|
}
|
||||||
else if (strcmp (parser->output_field, "reflect_x") == 0)
|
else if (strcmp (parser->output_field, "reflect_x") == 0)
|
||||||
parser->output.transform += read_bool (text, text_len, error) ?
|
parser->output.transform += read_bool (text, text_len, error) ?
|
||||||
WL_OUTPUT_TRANSFORM_FLIPPED : 0;
|
META_MONITOR_TRANSFORM_FLIPPED : 0;
|
||||||
else if (strcmp (parser->output_field, "reflect_y") == 0)
|
else if (strcmp (parser->output_field, "reflect_y") == 0)
|
||||||
{
|
{
|
||||||
/* FIXME (look at the rotation map in monitor.c) */
|
/* FIXME (look at the rotation map in monitor.c) */
|
||||||
@@ -840,6 +841,9 @@ meta_monitor_config_get_stored (MetaMonitorConfig *self,
|
|||||||
MetaConfiguration key;
|
MetaConfiguration key;
|
||||||
MetaConfiguration *stored;
|
MetaConfiguration *stored;
|
||||||
|
|
||||||
|
if (n_outputs == 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
make_config_key (&key, outputs, n_outputs, -1);
|
make_config_key (&key, outputs, n_outputs, -1);
|
||||||
stored = g_hash_table_lookup (self->configs, &key);
|
stored = g_hash_table_lookup (self->configs, &key);
|
||||||
|
|
||||||
@@ -874,7 +878,8 @@ apply_configuration (MetaMonitorConfig *self,
|
|||||||
|
|
||||||
/* Stored (persistent) configurations override the previous one always.
|
/* Stored (persistent) configurations override the previous one always.
|
||||||
Also, we clear the previous configuration if the current one (which is
|
Also, we clear the previous configuration if the current one (which is
|
||||||
about to become previous) is stored.
|
about to become previous) is stored, or if the current one has
|
||||||
|
different outputs.
|
||||||
*/
|
*/
|
||||||
if (stored ||
|
if (stored ||
|
||||||
(self->current && self->current_is_stored))
|
(self->current && self->current_is_stored))
|
||||||
@@ -885,11 +890,27 @@ apply_configuration (MetaMonitorConfig *self,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
self->previous = self->current;
|
/* Despite the name, config_equal() only checks the set of outputs,
|
||||||
|
not their modes
|
||||||
|
*/
|
||||||
|
if (self->current && config_equal (self->current, config))
|
||||||
|
{
|
||||||
|
self->previous = self->current;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (self->current)
|
||||||
|
config_free (self->current);
|
||||||
|
self->previous = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
self->current = config;
|
self->current = config;
|
||||||
self->current_is_stored = stored;
|
self->current_is_stored = stored;
|
||||||
|
/* If true, we'll be overridden at the end of this call
|
||||||
|
inside turn_off_laptop_display()
|
||||||
|
*/
|
||||||
|
self->current_is_for_laptop_lid = FALSE;
|
||||||
|
|
||||||
if (self->current == self->previous)
|
if (self->current == self->previous)
|
||||||
self->previous = NULL;
|
self->previous = NULL;
|
||||||
@@ -1006,8 +1027,16 @@ meta_monitor_config_apply_stored (MetaMonitorConfig *self,
|
|||||||
if (self->lid_is_closed &&
|
if (self->lid_is_closed &&
|
||||||
stored->n_outputs > 1 &&
|
stored->n_outputs > 1 &&
|
||||||
laptop_display_is_on (stored))
|
laptop_display_is_on (stored))
|
||||||
return apply_configuration (self, make_laptop_lid_config (stored),
|
{
|
||||||
manager, FALSE);
|
if (apply_configuration (self, make_laptop_lid_config (stored),
|
||||||
|
manager, FALSE))
|
||||||
|
{
|
||||||
|
self->current_is_for_laptop_lid = TRUE;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
return apply_configuration (self, stored, manager, TRUE);
|
return apply_configuration (self, stored, manager, TRUE);
|
||||||
}
|
}
|
||||||
@@ -1086,7 +1115,7 @@ make_default_config (MetaMonitorConfig *self,
|
|||||||
ret->outputs[0].rect.width = outputs[0].preferred_mode->width;
|
ret->outputs[0].rect.width = outputs[0].preferred_mode->width;
|
||||||
ret->outputs[0].rect.height = outputs[0].preferred_mode->height;
|
ret->outputs[0].rect.height = outputs[0].preferred_mode->height;
|
||||||
ret->outputs[0].refresh_rate = outputs[0].preferred_mode->refresh_rate;
|
ret->outputs[0].refresh_rate = outputs[0].preferred_mode->refresh_rate;
|
||||||
ret->outputs[0].transform = WL_OUTPUT_TRANSFORM_NORMAL;
|
ret->outputs[0].transform = META_MONITOR_TRANSFORM_NORMAL;
|
||||||
ret->outputs[0].is_primary = TRUE;
|
ret->outputs[0].is_primary = TRUE;
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@@ -1138,7 +1167,7 @@ make_default_config (MetaMonitorConfig *self,
|
|||||||
ret->outputs[j].rect.width = outputs[0].preferred_mode->width;
|
ret->outputs[j].rect.width = outputs[0].preferred_mode->width;
|
||||||
ret->outputs[j].rect.height = outputs[0].preferred_mode->height;
|
ret->outputs[j].rect.height = outputs[0].preferred_mode->height;
|
||||||
ret->outputs[j].refresh_rate = outputs[0].preferred_mode->refresh_rate;
|
ret->outputs[j].refresh_rate = outputs[0].preferred_mode->refresh_rate;
|
||||||
ret->outputs[j].transform = WL_OUTPUT_TRANSFORM_NORMAL;
|
ret->outputs[j].transform = META_MONITOR_TRANSFORM_NORMAL;
|
||||||
ret->outputs[j].is_primary = FALSE;
|
ret->outputs[j].is_primary = FALSE;
|
||||||
ret->outputs[j].is_presentation = FALSE;
|
ret->outputs[j].is_presentation = FALSE;
|
||||||
}
|
}
|
||||||
@@ -1173,7 +1202,7 @@ make_default_config (MetaMonitorConfig *self,
|
|||||||
ret->outputs[i].rect.width = output->preferred_mode->width;
|
ret->outputs[i].rect.width = output->preferred_mode->width;
|
||||||
ret->outputs[i].rect.height = output->preferred_mode->height;
|
ret->outputs[i].rect.height = output->preferred_mode->height;
|
||||||
ret->outputs[i].refresh_rate = output->preferred_mode->refresh_rate;
|
ret->outputs[i].refresh_rate = output->preferred_mode->refresh_rate;
|
||||||
ret->outputs[i].transform = WL_OUTPUT_TRANSFORM_NORMAL;
|
ret->outputs[i].transform = META_MONITOR_TRANSFORM_NORMAL;
|
||||||
ret->outputs[i].is_primary = (output == primary);
|
ret->outputs[i].is_primary = (output == primary);
|
||||||
|
|
||||||
/* Disable outputs that would go beyond framebuffer limits */
|
/* Disable outputs that would go beyond framebuffer limits */
|
||||||
@@ -1221,7 +1250,7 @@ ensure_at_least_one_output (MetaMonitorConfig *self,
|
|||||||
ret->outputs[i].rect.width = output->preferred_mode->width;
|
ret->outputs[i].rect.width = output->preferred_mode->width;
|
||||||
ret->outputs[i].rect.height = output->preferred_mode->height;
|
ret->outputs[i].rect.height = output->preferred_mode->height;
|
||||||
ret->outputs[i].refresh_rate = output->preferred_mode->refresh_rate;
|
ret->outputs[i].refresh_rate = output->preferred_mode->refresh_rate;
|
||||||
ret->outputs[i].transform = WL_OUTPUT_TRANSFORM_NORMAL;
|
ret->outputs[i].transform = META_MONITOR_TRANSFORM_NORMAL;
|
||||||
ret->outputs[i].is_primary = TRUE;
|
ret->outputs[i].is_primary = TRUE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -1247,6 +1276,12 @@ meta_monitor_config_make_default (MetaMonitorConfig *self,
|
|||||||
outputs = meta_monitor_manager_get_outputs (manager, &n_outputs);
|
outputs = meta_monitor_manager_get_outputs (manager, &n_outputs);
|
||||||
meta_monitor_manager_get_screen_limits (manager, &max_width, &max_height);
|
meta_monitor_manager_get_screen_limits (manager, &max_width, &max_height);
|
||||||
|
|
||||||
|
if (n_outputs == 0)
|
||||||
|
{
|
||||||
|
meta_verbose ("No output connected, not applying configuration\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
default_config = make_default_config (self, outputs, n_outputs, max_width, max_height);
|
default_config = make_default_config (self, outputs, n_outputs, max_width, max_height);
|
||||||
|
|
||||||
if (default_config != NULL)
|
if (default_config != NULL)
|
||||||
@@ -1348,6 +1383,7 @@ turn_off_laptop_display (MetaMonitorConfig *self,
|
|||||||
|
|
||||||
new = make_laptop_lid_config (self->current);
|
new = make_laptop_lid_config (self->current);
|
||||||
apply_configuration (self, new, manager, FALSE);
|
apply_configuration (self, new, manager, FALSE);
|
||||||
|
self->current_is_for_laptop_lid = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -1367,7 +1403,7 @@ power_client_changed_cb (UpClient *client,
|
|||||||
|
|
||||||
if (is_closed)
|
if (is_closed)
|
||||||
turn_off_laptop_display (self, manager);
|
turn_off_laptop_display (self, manager);
|
||||||
else
|
else if (self->current_is_for_laptop_lid)
|
||||||
meta_monitor_config_restore_previous (self, manager);
|
meta_monitor_config_restore_previous (self, manager);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1476,7 +1512,7 @@ meta_monitor_config_save (MetaMonitorConfig *self)
|
|||||||
output->rect.x,
|
output->rect.x,
|
||||||
output->rect.y,
|
output->rect.y,
|
||||||
rotation_map[output->transform & 0x3],
|
rotation_map[output->transform & 0x3],
|
||||||
output->transform >= WL_OUTPUT_TRANSFORM_FLIPPED ? "yes" : "no",
|
output->transform >= META_MONITOR_TRANSFORM_FLIPPED ? "yes" : "no",
|
||||||
output->is_primary ? "yes" : "no",
|
output->is_primary ? "yes" : "no",
|
||||||
output->is_presentation ? "yes" : "no");
|
output->is_presentation ? "yes" : "no");
|
||||||
}
|
}
|
||||||
@@ -1585,13 +1621,13 @@ output_supports_mode (MetaOutput *output,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
crtc_assignment_assign (CrtcAssignment *assign,
|
crtc_assignment_assign (CrtcAssignment *assign,
|
||||||
MetaCRTC *crtc,
|
MetaCRTC *crtc,
|
||||||
MetaMonitorMode *mode,
|
MetaMonitorMode *mode,
|
||||||
int x,
|
int x,
|
||||||
int y,
|
int y,
|
||||||
enum wl_output_transform transform,
|
MetaMonitorTransform transform,
|
||||||
MetaOutput *output)
|
MetaOutput *output)
|
||||||
{
|
{
|
||||||
MetaCRTCInfo *info = g_hash_table_lookup (assign->info, crtc);
|
MetaCRTCInfo *info = g_hash_table_lookup (assign->info, crtc);
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@
|
|||||||
|
|
||||||
#include "meta-monitor-manager-dummy.h"
|
#include "meta-monitor-manager-dummy.h"
|
||||||
|
|
||||||
#define ALL_WL_TRANSFORMS ((1 << (WL_OUTPUT_TRANSFORM_FLIPPED_270 + 1)) - 1)
|
#define ALL_TRANSFORMS ((1 << (META_MONITOR_TRANSFORM_FLIPPED_270 + 1)) - 1)
|
||||||
|
|
||||||
struct _MetaMonitorManagerDummy
|
struct _MetaMonitorManagerDummy
|
||||||
{
|
{
|
||||||
@@ -66,8 +66,8 @@ meta_monitor_manager_dummy_read_current (MetaMonitorManager *manager)
|
|||||||
manager->crtcs[0].rect.width = manager->modes[0].width;
|
manager->crtcs[0].rect.width = manager->modes[0].width;
|
||||||
manager->crtcs[0].rect.height = manager->modes[0].height;
|
manager->crtcs[0].rect.height = manager->modes[0].height;
|
||||||
manager->crtcs[0].current_mode = &manager->modes[0];
|
manager->crtcs[0].current_mode = &manager->modes[0];
|
||||||
manager->crtcs[0].transform = WL_OUTPUT_TRANSFORM_NORMAL;
|
manager->crtcs[0].transform = META_MONITOR_TRANSFORM_NORMAL;
|
||||||
manager->crtcs[0].all_transforms = ALL_WL_TRANSFORMS;
|
manager->crtcs[0].all_transforms = ALL_TRANSFORMS;
|
||||||
manager->crtcs[0].is_dirty = FALSE;
|
manager->crtcs[0].is_dirty = FALSE;
|
||||||
manager->crtcs[0].logical_monitor = NULL;
|
manager->crtcs[0].logical_monitor = NULL;
|
||||||
|
|
||||||
@@ -75,7 +75,7 @@ meta_monitor_manager_dummy_read_current (MetaMonitorManager *manager)
|
|||||||
manager->n_outputs = 1;
|
manager->n_outputs = 1;
|
||||||
|
|
||||||
manager->outputs[0].crtc = &manager->crtcs[0];
|
manager->outputs[0].crtc = &manager->crtcs[0];
|
||||||
manager->outputs[0].output_id = 1;
|
manager->outputs[0].winsys_id = 1;
|
||||||
manager->outputs[0].name = g_strdup ("LVDS");
|
manager->outputs[0].name = g_strdup ("LVDS");
|
||||||
manager->outputs[0].vendor = g_strdup ("MetaProducts Inc.");
|
manager->outputs[0].vendor = g_strdup ("MetaProducts Inc.");
|
||||||
manager->outputs[0].product = g_strdup ("unknown");
|
manager->outputs[0].product = g_strdup ("unknown");
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2001, 2002 Havoc Pennington
|
* Copyright (C) 2001, 2002 Havoc Pennington
|
||||||
* Copyright (C) 2002, 2003 Red Hat Inc.
|
* Copyright (C) 2002, 2003 Red Hat Inc.
|
||||||
* Some ICCCM manager selection code derived from fvwm2,
|
* Some ICCCM manager selection code derived from fvwm2,
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
* Copyright (C) 2003 Rob Adams
|
* Copyright (C) 2003 Rob Adams
|
||||||
* Copyright (C) 2004-2006 Elijah Newren
|
* Copyright (C) 2004-2006 Elijah Newren
|
||||||
* Copyright (C) 2013 Red Hat Inc.
|
* Copyright (C) 2013 Red Hat Inc.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License as
|
* modify it under the terms of the GNU General Public License as
|
||||||
* published by the Free Software Foundation; either version 2 of the
|
* published by the Free Software Foundation; either version 2 of the
|
||||||
@@ -18,7 +18,7 @@
|
|||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
@@ -36,9 +36,8 @@
|
|||||||
#include "util-private.h"
|
#include "util-private.h"
|
||||||
#include <meta/errors.h>
|
#include <meta/errors.h>
|
||||||
#include "meta-monitor-config.h"
|
#include "meta-monitor-config.h"
|
||||||
#include "backends/native/meta-monitor-manager-kms.h"
|
|
||||||
#include "backends/x11/meta-monitor-manager-xrandr.h"
|
#include "backends/x11/meta-monitor-manager-xrandr.h"
|
||||||
#include "meta-monitor-manager-dummy.h"
|
#include "meta-backend-private.h"
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
CONFIRM_DISPLAY_CHANGE,
|
CONFIRM_DISPLAY_CHANGE,
|
||||||
@@ -126,7 +125,7 @@ make_logical_config (MetaMonitorManager *manager)
|
|||||||
*/
|
*/
|
||||||
info.is_presentation = TRUE;
|
info.is_presentation = TRUE;
|
||||||
info.in_fullscreen = -1;
|
info.in_fullscreen = -1;
|
||||||
info.output_id = 0;
|
info.winsys_id = 0;
|
||||||
|
|
||||||
g_array_append_val (monitor_infos, info);
|
g_array_append_val (monitor_infos, info);
|
||||||
|
|
||||||
@@ -157,8 +156,8 @@ make_logical_config (MetaMonitorManager *manager)
|
|||||||
info->is_primary = info->is_primary || output->is_primary;
|
info->is_primary = info->is_primary || output->is_primary;
|
||||||
info->is_presentation = info->is_presentation && output->is_presentation;
|
info->is_presentation = info->is_presentation && output->is_presentation;
|
||||||
|
|
||||||
if (output->is_primary || info->output_id == 0)
|
if (output->is_primary || info->winsys_id == 0)
|
||||||
info->output_id = output->output_id;
|
info->winsys_id = output->winsys_id;
|
||||||
|
|
||||||
if (info->is_primary)
|
if (info->is_primary)
|
||||||
manager->primary_monitor_index = info->number;
|
manager->primary_monitor_index = info->number;
|
||||||
@@ -168,58 +167,6 @@ make_logical_config (MetaMonitorManager *manager)
|
|||||||
manager->monitor_infos = (void*)g_array_free (monitor_infos, FALSE);
|
manager->monitor_infos = (void*)g_array_free (monitor_infos, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static GType
|
|
||||||
get_default_backend (void)
|
|
||||||
{
|
|
||||||
#if defined(CLUTTER_WINDOWING_EGL)
|
|
||||||
if (clutter_check_windowing_backend (CLUTTER_WINDOWING_EGL))
|
|
||||||
return META_TYPE_MONITOR_MANAGER_KMS;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(CLUTTER_WINDOWING_X11)
|
|
||||||
if (clutter_check_windowing_backend (CLUTTER_WINDOWING_X11))
|
|
||||||
{
|
|
||||||
/* If we're a Wayland compositor using the X11 backend,
|
|
||||||
* we're a nested configuration, so return the dummy
|
|
||||||
* monitor setup. */
|
|
||||||
if (meta_is_wayland_compositor ())
|
|
||||||
return META_TYPE_MONITOR_MANAGER_DUMMY;
|
|
||||||
else
|
|
||||||
return META_TYPE_MONITOR_MANAGER_XRANDR;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(CLUTTER_WINDOWING_WAYLAND)
|
|
||||||
if (clutter_check_windowing_backend (CLUTTER_WINDOWING_WAYLAND))
|
|
||||||
{
|
|
||||||
/* Use the dummy implementation on Wayland for now.
|
|
||||||
* In the future, we should support wl_fullscreen_output
|
|
||||||
* which will have CRTC management in the protocol. */
|
|
||||||
return META_TYPE_MONITOR_MANAGER_DUMMY;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
g_assert_not_reached ();
|
|
||||||
}
|
|
||||||
|
|
||||||
static MetaMonitorManager *
|
|
||||||
meta_monitor_manager_new (void)
|
|
||||||
{
|
|
||||||
const char *env;
|
|
||||||
GType type;
|
|
||||||
|
|
||||||
env = g_getenv ("META_DEBUG_MULTIMONITOR");
|
|
||||||
|
|
||||||
if (env == NULL)
|
|
||||||
type = get_default_backend ();
|
|
||||||
else if (strcmp (env, "xrandr") == 0)
|
|
||||||
type = META_TYPE_MONITOR_MANAGER_XRANDR;
|
|
||||||
else
|
|
||||||
type = META_TYPE_MONITOR_MANAGER;
|
|
||||||
|
|
||||||
return g_object_new (type, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_monitor_manager_constructed (GObject *object)
|
meta_monitor_manager_constructed (GObject *object)
|
||||||
{
|
{
|
||||||
@@ -530,19 +477,19 @@ meta_monitor_manager_handle_get_resources (MetaDBusDisplayConfig *skeleton,
|
|||||||
GVariantBuilder transforms;
|
GVariantBuilder transforms;
|
||||||
|
|
||||||
g_variant_builder_init (&transforms, G_VARIANT_TYPE ("au"));
|
g_variant_builder_init (&transforms, G_VARIANT_TYPE ("au"));
|
||||||
for (j = 0; j <= WL_OUTPUT_TRANSFORM_FLIPPED_270; j++)
|
for (j = 0; j <= META_MONITOR_TRANSFORM_FLIPPED_270; j++)
|
||||||
if (crtc->all_transforms & (1 << j))
|
if (crtc->all_transforms & (1 << j))
|
||||||
g_variant_builder_add (&transforms, "u", j);
|
g_variant_builder_add (&transforms, "u", j);
|
||||||
|
|
||||||
g_variant_builder_add (&crtc_builder, "(uxiiiiiuaua{sv})",
|
g_variant_builder_add (&crtc_builder, "(uxiiiiiuaua{sv})",
|
||||||
i, /* ID */
|
i, /* ID */
|
||||||
crtc->crtc_id,
|
(gint64)crtc->crtc_id,
|
||||||
(int)crtc->rect.x,
|
(int)crtc->rect.x,
|
||||||
(int)crtc->rect.y,
|
(int)crtc->rect.y,
|
||||||
(int)crtc->rect.width,
|
(int)crtc->rect.width,
|
||||||
(int)crtc->rect.height,
|
(int)crtc->rect.height,
|
||||||
(int)(crtc->current_mode ? crtc->current_mode - manager->modes : -1),
|
(int)(crtc->current_mode ? crtc->current_mode - manager->modes : -1),
|
||||||
crtc->transform,
|
(guint32)crtc->transform,
|
||||||
&transforms,
|
&transforms,
|
||||||
NULL /* properties */);
|
NULL /* properties */);
|
||||||
}
|
}
|
||||||
@@ -613,7 +560,7 @@ meta_monitor_manager_handle_get_resources (MetaDBusDisplayConfig *skeleton,
|
|||||||
|
|
||||||
g_variant_builder_add (&output_builder, "(uxiausauaua{sv})",
|
g_variant_builder_add (&output_builder, "(uxiausauaua{sv})",
|
||||||
i, /* ID */
|
i, /* ID */
|
||||||
output->output_id,
|
(gint64)output->winsys_id,
|
||||||
(int)(output->crtc ? output->crtc - manager->crtcs : -1),
|
(int)(output->crtc ? output->crtc - manager->crtcs : -1),
|
||||||
&crtcs,
|
&crtcs,
|
||||||
output->name,
|
output->name,
|
||||||
@@ -628,9 +575,9 @@ meta_monitor_manager_handle_get_resources (MetaDBusDisplayConfig *skeleton,
|
|||||||
|
|
||||||
g_variant_builder_add (&mode_builder, "(uxuud)",
|
g_variant_builder_add (&mode_builder, "(uxuud)",
|
||||||
i, /* ID */
|
i, /* ID */
|
||||||
mode->mode_id,
|
(gint64)mode->mode_id,
|
||||||
mode->width,
|
(guint32)mode->width,
|
||||||
mode->height,
|
(guint32)mode->height,
|
||||||
(double)mode->refresh_rate);
|
(double)mode->refresh_rate);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -720,7 +667,7 @@ meta_monitor_manager_handle_apply_configuration (MetaDBusDisplayConfig *skeleto
|
|||||||
int new_mode, x, y;
|
int new_mode, x, y;
|
||||||
int new_screen_width, new_screen_height;
|
int new_screen_width, new_screen_height;
|
||||||
guint transform;
|
guint transform;
|
||||||
guint output_id;
|
guint output_index;
|
||||||
GPtrArray *crtc_infos, *output_infos;
|
GPtrArray *crtc_infos, *output_infos;
|
||||||
|
|
||||||
if (serial != manager->serial)
|
if (serial != manager->serial)
|
||||||
@@ -747,7 +694,6 @@ meta_monitor_manager_handle_apply_configuration (MetaDBusDisplayConfig *skeleto
|
|||||||
MetaOutput *first_output;
|
MetaOutput *first_output;
|
||||||
MetaCRTC *crtc;
|
MetaCRTC *crtc;
|
||||||
MetaMonitorMode *mode;
|
MetaMonitorMode *mode;
|
||||||
guint output_id;
|
|
||||||
|
|
||||||
crtc_info = g_slice_new (MetaCRTCInfo);
|
crtc_info = g_slice_new (MetaCRTCInfo);
|
||||||
crtc_info->outputs = g_ptr_array_new ();
|
crtc_info->outputs = g_ptr_array_new ();
|
||||||
@@ -809,8 +755,8 @@ meta_monitor_manager_handle_apply_configuration (MetaDBusDisplayConfig *skeleto
|
|||||||
crtc_info->y = 0;
|
crtc_info->y = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (transform < WL_OUTPUT_TRANSFORM_NORMAL ||
|
if (transform < META_MONITOR_TRANSFORM_NORMAL ||
|
||||||
transform > WL_OUTPUT_TRANSFORM_FLIPPED_270 ||
|
transform > META_MONITOR_TRANSFORM_FLIPPED_270 ||
|
||||||
((crtc->all_transforms & (1 << transform)) == 0))
|
((crtc->all_transforms & (1 << transform)) == 0))
|
||||||
{
|
{
|
||||||
g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR,
|
g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR,
|
||||||
@@ -821,18 +767,18 @@ meta_monitor_manager_handle_apply_configuration (MetaDBusDisplayConfig *skeleto
|
|||||||
crtc_info->transform = transform;
|
crtc_info->transform = transform;
|
||||||
|
|
||||||
first_output = NULL;
|
first_output = NULL;
|
||||||
while (g_variant_iter_loop (nested_outputs, "u", &output_id))
|
while (g_variant_iter_loop (nested_outputs, "u", &output_index))
|
||||||
{
|
{
|
||||||
MetaOutput *output;
|
MetaOutput *output;
|
||||||
|
|
||||||
if (output_id >= manager->n_outputs)
|
if (output_index >= manager->n_outputs)
|
||||||
{
|
{
|
||||||
g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR,
|
g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR,
|
||||||
G_DBUS_ERROR_INVALID_ARGS,
|
G_DBUS_ERROR_INVALID_ARGS,
|
||||||
"Invalid output id");
|
"Invalid output id");
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
output = &manager->outputs[output_id];
|
output = &manager->outputs[output_index];
|
||||||
|
|
||||||
if (!output_can_config (output, crtc, mode))
|
if (!output_can_config (output, crtc, mode))
|
||||||
{
|
{
|
||||||
@@ -877,12 +823,12 @@ meta_monitor_manager_handle_apply_configuration (MetaDBusDisplayConfig *skeleto
|
|||||||
}
|
}
|
||||||
|
|
||||||
g_variant_iter_init (&output_iter, outputs);
|
g_variant_iter_init (&output_iter, outputs);
|
||||||
while (g_variant_iter_loop (&output_iter, "(u@a{sv})", &output_id, &properties))
|
while (g_variant_iter_loop (&output_iter, "(u@a{sv})", &output_index, &properties))
|
||||||
{
|
{
|
||||||
MetaOutputInfo *output_info;
|
MetaOutputInfo *output_info;
|
||||||
gboolean primary, presentation;
|
gboolean primary, presentation;
|
||||||
|
|
||||||
if (output_id >= manager->n_outputs)
|
if (output_index >= manager->n_outputs)
|
||||||
{
|
{
|
||||||
g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR,
|
g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR,
|
||||||
G_DBUS_ERROR_INVALID_ARGS,
|
G_DBUS_ERROR_INVALID_ARGS,
|
||||||
@@ -891,7 +837,7 @@ meta_monitor_manager_handle_apply_configuration (MetaDBusDisplayConfig *skeleto
|
|||||||
}
|
}
|
||||||
|
|
||||||
output_info = g_slice_new0 (MetaOutputInfo);
|
output_info = g_slice_new0 (MetaOutputInfo);
|
||||||
output_info->output = &manager->outputs[output_id];
|
output_info->output = &manager->outputs[output_index];
|
||||||
|
|
||||||
if (g_variant_lookup (properties, "primary", "b", &primary))
|
if (g_variant_lookup (properties, "primary", "b", &primary))
|
||||||
output_info->is_primary = primary;
|
output_info->is_primary = primary;
|
||||||
@@ -905,7 +851,7 @@ meta_monitor_manager_handle_apply_configuration (MetaDBusDisplayConfig *skeleto
|
|||||||
/* If we were in progress of making a persistent change and we see a
|
/* If we were in progress of making a persistent change and we see a
|
||||||
new request, it's likely that the old one failed in some way, so
|
new request, it's likely that the old one failed in some way, so
|
||||||
don't save it, but also don't queue for restoring it.
|
don't save it, but also don't queue for restoring it.
|
||||||
*/
|
*/
|
||||||
if (manager->persistent_timeout_id && persistent)
|
if (manager->persistent_timeout_id && persistent)
|
||||||
{
|
{
|
||||||
g_source_remove (manager->persistent_timeout_id);
|
g_source_remove (manager->persistent_timeout_id);
|
||||||
@@ -931,6 +877,7 @@ meta_monitor_manager_handle_apply_configuration (MetaDBusDisplayConfig *skeleto
|
|||||||
if (persistent)
|
if (persistent)
|
||||||
{
|
{
|
||||||
manager->persistent_timeout_id = g_timeout_add_seconds (20, save_config_timeout, manager);
|
manager->persistent_timeout_id = g_timeout_add_seconds (20, save_config_timeout, manager);
|
||||||
|
g_source_set_name_by_id (manager->persistent_timeout_id, "[mutter] save_config_timeout");
|
||||||
g_signal_emit (manager, signals[CONFIRM_DISPLAY_CHANGE], 0);
|
g_signal_emit (manager, signals[CONFIRM_DISPLAY_CHANGE], 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -961,7 +908,7 @@ static gboolean
|
|||||||
meta_monitor_manager_handle_change_backlight (MetaDBusDisplayConfig *skeleton,
|
meta_monitor_manager_handle_change_backlight (MetaDBusDisplayConfig *skeleton,
|
||||||
GDBusMethodInvocation *invocation,
|
GDBusMethodInvocation *invocation,
|
||||||
guint serial,
|
guint serial,
|
||||||
guint output_id,
|
guint output_index,
|
||||||
gint value)
|
gint value)
|
||||||
{
|
{
|
||||||
MetaMonitorManager *manager = META_MONITOR_MANAGER (skeleton);
|
MetaMonitorManager *manager = META_MONITOR_MANAGER (skeleton);
|
||||||
@@ -975,14 +922,14 @@ meta_monitor_manager_handle_change_backlight (MetaDBusDisplayConfig *skeleton,
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (output_id >= manager->n_outputs)
|
if (output_index >= manager->n_outputs)
|
||||||
{
|
{
|
||||||
g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR,
|
g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR,
|
||||||
G_DBUS_ERROR_INVALID_ARGS,
|
G_DBUS_ERROR_INVALID_ARGS,
|
||||||
"Invalid output id");
|
"Invalid output id");
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
output = &manager->outputs[output_id];
|
output = &manager->outputs[output_index];
|
||||||
|
|
||||||
if (value < 0 || value > 100)
|
if (value < 0 || value > 100)
|
||||||
{
|
{
|
||||||
@@ -1178,20 +1125,12 @@ initialize_dbus_interface (MetaMonitorManager *manager)
|
|||||||
g_object_unref);
|
g_object_unref);
|
||||||
}
|
}
|
||||||
|
|
||||||
static MetaMonitorManager *global_monitor_manager;
|
|
||||||
|
|
||||||
void
|
|
||||||
meta_monitor_manager_initialize (void)
|
|
||||||
{
|
|
||||||
global_monitor_manager = meta_monitor_manager_new ();
|
|
||||||
}
|
|
||||||
|
|
||||||
MetaMonitorManager *
|
MetaMonitorManager *
|
||||||
meta_monitor_manager_get (void)
|
meta_monitor_manager_get (void)
|
||||||
{
|
{
|
||||||
g_assert (global_monitor_manager != NULL);
|
MetaBackend *backend = meta_get_backend ();
|
||||||
|
|
||||||
return global_monitor_manager;
|
return meta_backend_get_monitor_manager (backend);
|
||||||
}
|
}
|
||||||
|
|
||||||
MetaMonitorInfo *
|
MetaMonitorInfo *
|
||||||
@@ -1277,16 +1216,3 @@ meta_monitor_manager_rebuild_derived (MetaMonitorManager *manager)
|
|||||||
g_free (old_monitor_infos);
|
g_free (old_monitor_infos);
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
|
||||||
meta_monitor_manager_handle_xevent (MetaMonitorManager *manager,
|
|
||||||
XEvent *event)
|
|
||||||
{
|
|
||||||
MetaMonitorManagerClass *klass;
|
|
||||||
|
|
||||||
klass = META_MONITOR_MANAGER_GET_CLASS (manager);
|
|
||||||
if (klass->handle_xevent)
|
|
||||||
return klass->handle_xevent (manager, event);
|
|
||||||
else
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|||||||
@@ -12,12 +12,12 @@
|
|||||||
* at MetaScreen instead.
|
* at MetaScreen instead.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2001 Havoc Pennington
|
* Copyright (C) 2001 Havoc Pennington
|
||||||
* Copyright (C) 2003 Rob Adams
|
* Copyright (C) 2003 Rob Adams
|
||||||
* Copyright (C) 2004-2006 Elijah Newren
|
* Copyright (C) 2004-2006 Elijah Newren
|
||||||
* Copyright (C) 2013 Red Hat Inc.
|
* Copyright (C) 2013 Red Hat Inc.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License as
|
* modify it under the terms of the GNU General Public License as
|
||||||
* published by the Free Software Foundation; either version 2 of the
|
* published by the Free Software Foundation; either version 2 of the
|
||||||
@@ -27,7 +27,7 @@
|
|||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
@@ -41,11 +41,10 @@
|
|||||||
#include "display-private.h"
|
#include "display-private.h"
|
||||||
#include <meta/screen.h>
|
#include <meta/screen.h>
|
||||||
#include "stack-tracker.h"
|
#include "stack-tracker.h"
|
||||||
#include "ui.h"
|
|
||||||
#include <wayland-server.h>
|
|
||||||
|
|
||||||
#include "meta-display-config-shared.h"
|
#include "meta-display-config-shared.h"
|
||||||
#include "meta-dbus-display-config.h"
|
#include "meta-dbus-display-config.h"
|
||||||
|
#include "meta-cursor.h"
|
||||||
|
|
||||||
typedef struct _MetaMonitorManagerClass MetaMonitorManagerClass;
|
typedef struct _MetaMonitorManagerClass MetaMonitorManagerClass;
|
||||||
typedef struct _MetaMonitorManager MetaMonitorManager;
|
typedef struct _MetaMonitorManager MetaMonitorManager;
|
||||||
@@ -59,12 +58,23 @@ typedef struct _MetaMonitorInfo MetaMonitorInfo;
|
|||||||
typedef struct _MetaCRTCInfo MetaCRTCInfo;
|
typedef struct _MetaCRTCInfo MetaCRTCInfo;
|
||||||
typedef struct _MetaOutputInfo MetaOutputInfo;
|
typedef struct _MetaOutputInfo MetaOutputInfo;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
META_MONITOR_TRANSFORM_NORMAL,
|
||||||
|
META_MONITOR_TRANSFORM_90,
|
||||||
|
META_MONITOR_TRANSFORM_180,
|
||||||
|
META_MONITOR_TRANSFORM_270,
|
||||||
|
META_MONITOR_TRANSFORM_FLIPPED,
|
||||||
|
META_MONITOR_TRANSFORM_FLIPPED_90,
|
||||||
|
META_MONITOR_TRANSFORM_FLIPPED_180,
|
||||||
|
META_MONITOR_TRANSFORM_FLIPPED_270,
|
||||||
|
} MetaMonitorTransform;
|
||||||
|
|
||||||
struct _MetaOutput
|
struct _MetaOutput
|
||||||
{
|
{
|
||||||
/* The CRTC driving this output, NULL if the output is not enabled */
|
/* The CRTC driving this output, NULL if the output is not enabled */
|
||||||
MetaCRTC *crtc;
|
MetaCRTC *crtc;
|
||||||
/* The low-level ID of this output, used to apply back configuration */
|
/* The low-level ID of this output, used to apply back configuration */
|
||||||
glong output_id;
|
glong winsys_id;
|
||||||
char *name;
|
char *name;
|
||||||
char *vendor;
|
char *vendor;
|
||||||
char *product;
|
char *product;
|
||||||
@@ -72,6 +82,7 @@ struct _MetaOutput
|
|||||||
int width_mm;
|
int width_mm;
|
||||||
int height_mm;
|
int height_mm;
|
||||||
CoglSubpixelOrder subpixel_order;
|
CoglSubpixelOrder subpixel_order;
|
||||||
|
int scale;
|
||||||
|
|
||||||
MetaMonitorMode *preferred_mode;
|
MetaMonitorMode *preferred_mode;
|
||||||
MetaMonitorMode **modes;
|
MetaMonitorMode **modes;
|
||||||
@@ -112,7 +123,7 @@ struct _MetaCRTC
|
|||||||
glong crtc_id;
|
glong crtc_id;
|
||||||
MetaRectangle rect;
|
MetaRectangle rect;
|
||||||
MetaMonitorMode *current_mode;
|
MetaMonitorMode *current_mode;
|
||||||
enum wl_output_transform transform;
|
MetaMonitorTransform transform;
|
||||||
unsigned int all_transforms;
|
unsigned int all_transforms;
|
||||||
|
|
||||||
/* Only used to build the logical configuration
|
/* Only used to build the logical configuration
|
||||||
@@ -123,8 +134,7 @@ struct _MetaCRTC
|
|||||||
/* Used when changing configuration */
|
/* Used when changing configuration */
|
||||||
gboolean is_dirty;
|
gboolean is_dirty;
|
||||||
|
|
||||||
/* Updated by MetaCursorTracker */
|
MetaCursorReference *cursor;
|
||||||
gboolean has_hw_cursor;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _MetaMonitorMode
|
struct _MetaMonitorMode
|
||||||
@@ -161,14 +171,14 @@ struct _MetaMonitorInfo
|
|||||||
gboolean in_fullscreen;
|
gboolean in_fullscreen;
|
||||||
|
|
||||||
/* The primary or first output for this monitor, 0 if we can't figure out.
|
/* The primary or first output for this monitor, 0 if we can't figure out.
|
||||||
It can be matched to an output_id of a MetaOutput.
|
It can be matched to a winsys_id of a MetaOutput.
|
||||||
|
|
||||||
This is used as an opaque token on reconfiguration when switching from
|
This is used as an opaque token on reconfiguration when switching from
|
||||||
clone to extened, to decide on what output the windows should go next
|
clone to extened, to decide on what output the windows should go next
|
||||||
(it's an attempt to keep windows on the same monitor, and preferably on
|
(it's an attempt to keep windows on the same monitor, and preferably on
|
||||||
the primary one).
|
the primary one).
|
||||||
*/
|
*/
|
||||||
glong output_id;
|
glong winsys_id;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -184,7 +194,7 @@ struct _MetaCRTCInfo {
|
|||||||
MetaMonitorMode *mode;
|
MetaMonitorMode *mode;
|
||||||
int x;
|
int x;
|
||||||
int y;
|
int y;
|
||||||
enum wl_output_transform transform;
|
MetaMonitorTransform transform;
|
||||||
GPtrArray *outputs;
|
GPtrArray *outputs;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -285,14 +295,10 @@ struct _MetaMonitorManagerClass
|
|||||||
unsigned short *,
|
unsigned short *,
|
||||||
unsigned short *,
|
unsigned short *,
|
||||||
unsigned short *);
|
unsigned short *);
|
||||||
|
|
||||||
gboolean (*handle_xevent) (MetaMonitorManager *,
|
|
||||||
XEvent *);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
GType meta_monitor_manager_get_type (void);
|
GType meta_monitor_manager_get_type (void);
|
||||||
|
|
||||||
void meta_monitor_manager_initialize (void);
|
|
||||||
MetaMonitorManager *meta_monitor_manager_get (void);
|
MetaMonitorManager *meta_monitor_manager_get (void);
|
||||||
|
|
||||||
void meta_monitor_manager_rebuild_derived (MetaMonitorManager *manager);
|
void meta_monitor_manager_rebuild_derived (MetaMonitorManager *manager);
|
||||||
@@ -313,9 +319,6 @@ void meta_monitor_manager_get_resources (MetaMonitorManager
|
|||||||
|
|
||||||
int meta_monitor_manager_get_primary_index (MetaMonitorManager *manager);
|
int meta_monitor_manager_get_primary_index (MetaMonitorManager *manager);
|
||||||
|
|
||||||
gboolean meta_monitor_manager_handle_xevent (MetaMonitorManager *manager,
|
|
||||||
XEvent *event);
|
|
||||||
|
|
||||||
void meta_monitor_manager_get_screen_size (MetaMonitorManager *manager,
|
void meta_monitor_manager_get_screen_size (MetaMonitorManager *manager,
|
||||||
int *width,
|
int *width,
|
||||||
int *height);
|
int *height);
|
||||||
@@ -345,7 +348,7 @@ gboolean meta_monitor_manager_has_hotplug_mode_update (MetaMonitorMana
|
|||||||
/* Returns true if transform causes width and height to be inverted
|
/* Returns true if transform causes width and height to be inverted
|
||||||
This is true for the odd transforms in the enum */
|
This is true for the odd transforms in the enum */
|
||||||
static inline gboolean
|
static inline gboolean
|
||||||
meta_monitor_transform_is_rotated (enum wl_output_transform transform)
|
meta_monitor_transform_is_rotated (MetaMonitorTransform transform)
|
||||||
{
|
{
|
||||||
return (transform % 2);
|
return (transform % 2);
|
||||||
}
|
}
|
||||||
|
|||||||
214
src/backends/meta-stage.c
Normal file
214
src/backends/meta-stage.c
Normal file
@@ -0,0 +1,214 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2014 Red Hat
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
|
*
|
||||||
|
* Written by:
|
||||||
|
* Jasper St. Pierre <jstpierre@mecheye.net>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include "meta-stage.h"
|
||||||
|
|
||||||
|
#include "meta-cursor-private.h"
|
||||||
|
#include <meta/meta-backend.h>
|
||||||
|
#include <meta/util.h>
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
gboolean enabled;
|
||||||
|
|
||||||
|
CoglPipeline *pipeline;
|
||||||
|
CoglTexture *texture;
|
||||||
|
|
||||||
|
MetaRectangle current_rect;
|
||||||
|
MetaRectangle previous_rect;
|
||||||
|
gboolean previous_is_valid;
|
||||||
|
} MetaOverlay;
|
||||||
|
|
||||||
|
struct _MetaStagePrivate {
|
||||||
|
MetaOverlay dnd_overlay;
|
||||||
|
MetaOverlay cursor_overlay;
|
||||||
|
};
|
||||||
|
typedef struct _MetaStagePrivate MetaStagePrivate;
|
||||||
|
|
||||||
|
G_DEFINE_TYPE_WITH_PRIVATE (MetaStage, meta_stage, CLUTTER_TYPE_STAGE);
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_overlay_init (MetaOverlay *overlay)
|
||||||
|
{
|
||||||
|
CoglContext *ctx = clutter_backend_get_cogl_context (clutter_get_default_backend ());
|
||||||
|
|
||||||
|
overlay->pipeline = cogl_pipeline_new (ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_overlay_free (MetaOverlay *overlay)
|
||||||
|
{
|
||||||
|
if (overlay->pipeline)
|
||||||
|
cogl_object_unref (overlay->pipeline);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_overlay_set (MetaOverlay *overlay,
|
||||||
|
CoglTexture *texture,
|
||||||
|
MetaRectangle *rect)
|
||||||
|
{
|
||||||
|
if (overlay->texture != texture)
|
||||||
|
{
|
||||||
|
overlay->texture = texture;
|
||||||
|
|
||||||
|
if (texture)
|
||||||
|
{
|
||||||
|
cogl_pipeline_set_layer_texture (overlay->pipeline, 0, texture);
|
||||||
|
overlay->enabled = TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cogl_pipeline_set_layer_texture (overlay->pipeline, 0, NULL);
|
||||||
|
overlay->enabled = FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
overlay->current_rect = *rect;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_overlay_paint (MetaOverlay *overlay)
|
||||||
|
{
|
||||||
|
if (!overlay->enabled)
|
||||||
|
return;
|
||||||
|
|
||||||
|
g_assert (meta_is_wayland_compositor ());
|
||||||
|
|
||||||
|
cogl_framebuffer_draw_rectangle (cogl_get_draw_framebuffer (),
|
||||||
|
overlay->pipeline,
|
||||||
|
overlay->current_rect.x,
|
||||||
|
overlay->current_rect.y,
|
||||||
|
overlay->current_rect.x +
|
||||||
|
overlay->current_rect.width,
|
||||||
|
overlay->current_rect.y +
|
||||||
|
overlay->current_rect.height);
|
||||||
|
|
||||||
|
overlay->previous_rect = overlay->current_rect;
|
||||||
|
overlay->previous_is_valid = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_stage_finalize (GObject *object)
|
||||||
|
{
|
||||||
|
MetaStage *stage = META_STAGE (object);
|
||||||
|
MetaStagePrivate *priv = meta_stage_get_instance_private (stage);
|
||||||
|
|
||||||
|
meta_overlay_free (&priv->dnd_overlay);
|
||||||
|
meta_overlay_free (&priv->cursor_overlay);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_stage_paint (ClutterActor *actor)
|
||||||
|
{
|
||||||
|
MetaStage *stage = META_STAGE (actor);
|
||||||
|
MetaStagePrivate *priv = meta_stage_get_instance_private (stage);
|
||||||
|
|
||||||
|
CLUTTER_ACTOR_CLASS (meta_stage_parent_class)->paint (actor);
|
||||||
|
|
||||||
|
meta_overlay_paint (&priv->dnd_overlay);
|
||||||
|
meta_overlay_paint (&priv->cursor_overlay);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_stage_class_init (MetaStageClass *klass)
|
||||||
|
{
|
||||||
|
ClutterActorClass *actor_class = (ClutterActorClass *) klass;
|
||||||
|
GObjectClass *object_class = (GObjectClass *) klass;
|
||||||
|
|
||||||
|
object_class->finalize = meta_stage_finalize;
|
||||||
|
|
||||||
|
actor_class->paint = meta_stage_paint;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_stage_init (MetaStage *stage)
|
||||||
|
{
|
||||||
|
MetaStagePrivate *priv = meta_stage_get_instance_private (stage);
|
||||||
|
|
||||||
|
meta_overlay_init (&priv->dnd_overlay);
|
||||||
|
meta_overlay_init (&priv->cursor_overlay);
|
||||||
|
|
||||||
|
clutter_stage_set_user_resizable (CLUTTER_STAGE (stage), FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
ClutterActor *
|
||||||
|
meta_stage_new (void)
|
||||||
|
{
|
||||||
|
return g_object_new (META_TYPE_STAGE,
|
||||||
|
"cursor-visible", FALSE,
|
||||||
|
NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
queue_redraw_for_overlay (MetaStage *stage,
|
||||||
|
MetaOverlay *overlay)
|
||||||
|
{
|
||||||
|
cairo_rectangle_int_t clip;
|
||||||
|
|
||||||
|
/* Clear the location the overlay was at before, if we need to. */
|
||||||
|
if (overlay->previous_is_valid)
|
||||||
|
{
|
||||||
|
clip.x = overlay->previous_rect.x;
|
||||||
|
clip.y = overlay->previous_rect.y;
|
||||||
|
clip.width = overlay->previous_rect.width;
|
||||||
|
clip.height = overlay->previous_rect.height;
|
||||||
|
clutter_actor_queue_redraw_with_clip (CLUTTER_ACTOR (stage), &clip);
|
||||||
|
overlay->previous_is_valid = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Draw the overlay at the new position */
|
||||||
|
if (overlay->enabled)
|
||||||
|
{
|
||||||
|
clip.x = overlay->current_rect.x;
|
||||||
|
clip.y = overlay->current_rect.y;
|
||||||
|
clip.width = overlay->current_rect.width;
|
||||||
|
clip.height = overlay->current_rect.height;
|
||||||
|
clutter_actor_queue_redraw_with_clip (CLUTTER_ACTOR (stage), &clip);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_stage_set_dnd_surface (MetaStage *stage,
|
||||||
|
CoglTexture *texture,
|
||||||
|
MetaRectangle *rect)
|
||||||
|
{
|
||||||
|
MetaStagePrivate *priv = meta_stage_get_instance_private (stage);
|
||||||
|
|
||||||
|
g_assert (meta_is_wayland_compositor ());
|
||||||
|
|
||||||
|
meta_overlay_set (&priv->dnd_overlay, texture, rect);
|
||||||
|
queue_redraw_for_overlay (stage, &priv->dnd_overlay);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_stage_set_cursor (MetaStage *stage,
|
||||||
|
CoglTexture *texture,
|
||||||
|
MetaRectangle *rect)
|
||||||
|
{
|
||||||
|
MetaStagePrivate *priv = meta_stage_get_instance_private (stage);
|
||||||
|
|
||||||
|
g_assert (meta_is_wayland_compositor () || texture == NULL);
|
||||||
|
|
||||||
|
meta_overlay_set (&priv->cursor_overlay, texture, rect);
|
||||||
|
queue_redraw_for_overlay (stage, &priv->cursor_overlay);
|
||||||
|
}
|
||||||
64
src/backends/meta-stage.h
Normal file
64
src/backends/meta-stage.h
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012 Intel Corporation
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef META_STAGE_H
|
||||||
|
#define META_STAGE_H
|
||||||
|
|
||||||
|
#include <clutter/clutter.h>
|
||||||
|
|
||||||
|
#include "meta-cursor.h"
|
||||||
|
#include <meta/boxes.h>
|
||||||
|
|
||||||
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
|
#define META_TYPE_STAGE (meta_stage_get_type ())
|
||||||
|
#define META_STAGE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_STAGE, MetaStage))
|
||||||
|
#define META_STAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_STAGE, MetaStageClass))
|
||||||
|
#define META_IS_STAGE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_STAGE))
|
||||||
|
#define META_IS_STAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_STAGE))
|
||||||
|
#define META_STAGE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), META_TYPE_STAGE, MetaStageClass))
|
||||||
|
|
||||||
|
typedef struct _MetaStage MetaStage;
|
||||||
|
typedef struct _MetaStageClass MetaStageClass;
|
||||||
|
|
||||||
|
struct _MetaStageClass
|
||||||
|
{
|
||||||
|
ClutterStageClass parent_class;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct _MetaStage
|
||||||
|
{
|
||||||
|
ClutterStage parent;
|
||||||
|
};
|
||||||
|
|
||||||
|
GType meta_stage_get_type (void) G_GNUC_CONST;
|
||||||
|
|
||||||
|
ClutterActor *meta_stage_new (void);
|
||||||
|
|
||||||
|
void meta_stage_set_dnd_surface (MetaStage *stage,
|
||||||
|
CoglTexture *texture,
|
||||||
|
MetaRectangle *rect);
|
||||||
|
|
||||||
|
void meta_stage_set_cursor (MetaStage *stage,
|
||||||
|
CoglTexture *texture,
|
||||||
|
MetaRectangle *rect);
|
||||||
|
|
||||||
|
G_END_DECLS
|
||||||
|
|
||||||
|
#endif /* META_STAGE_H */
|
||||||
107
src/backends/native/dbus-utils.c
Normal file
107
src/backends/native/dbus-utils.c
Normal file
@@ -0,0 +1,107 @@
|
|||||||
|
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2014 Red Hat
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
|
*
|
||||||
|
* Written by:
|
||||||
|
* Jasper St. Pierre <jstpierre@mecheye.net>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#include "dbus-utils.h"
|
||||||
|
|
||||||
|
#include <glib.h>
|
||||||
|
|
||||||
|
/* Stolen from tp_escape_as_identifier, from tp-glib,
|
||||||
|
* which follows the same escaping convention as systemd.
|
||||||
|
*/
|
||||||
|
static inline gboolean
|
||||||
|
_esc_ident_bad (gchar c, gboolean is_first)
|
||||||
|
{
|
||||||
|
return ((c < 'a' || c > 'z') &&
|
||||||
|
(c < 'A' || c > 'Z') &&
|
||||||
|
(c < '0' || c > '9' || is_first));
|
||||||
|
}
|
||||||
|
|
||||||
|
static gchar *
|
||||||
|
escape_dbus_component (const gchar *name)
|
||||||
|
{
|
||||||
|
gboolean bad = FALSE;
|
||||||
|
size_t len = 0;
|
||||||
|
GString *op;
|
||||||
|
const gchar *ptr, *first_ok;
|
||||||
|
|
||||||
|
g_return_val_if_fail (name != NULL, NULL);
|
||||||
|
|
||||||
|
/* fast path for empty name */
|
||||||
|
if (name[0] == '\0')
|
||||||
|
return g_strdup ("_");
|
||||||
|
|
||||||
|
for (ptr = name; *ptr; ptr++)
|
||||||
|
{
|
||||||
|
if (_esc_ident_bad (*ptr, ptr == name))
|
||||||
|
{
|
||||||
|
bad = TRUE;
|
||||||
|
len += 3;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
len++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* fast path if it's clean */
|
||||||
|
if (!bad)
|
||||||
|
return g_strdup (name);
|
||||||
|
|
||||||
|
/* If strictly less than ptr, first_ok is the first uncopied safe character.
|
||||||
|
*/
|
||||||
|
first_ok = name;
|
||||||
|
op = g_string_sized_new (len);
|
||||||
|
for (ptr = name; *ptr; ptr++)
|
||||||
|
{
|
||||||
|
if (_esc_ident_bad (*ptr, ptr == name))
|
||||||
|
{
|
||||||
|
/* copy preceding safe characters if any */
|
||||||
|
if (first_ok < ptr)
|
||||||
|
{
|
||||||
|
g_string_append_len (op, first_ok, ptr - first_ok);
|
||||||
|
}
|
||||||
|
/* escape the unsafe character */
|
||||||
|
g_string_append_printf (op, "_%02x", (unsigned char)(*ptr));
|
||||||
|
/* restart after it */
|
||||||
|
first_ok = ptr + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* copy trailing safe characters if any */
|
||||||
|
if (first_ok < ptr)
|
||||||
|
{
|
||||||
|
g_string_append_len (op, first_ok, ptr - first_ok);
|
||||||
|
}
|
||||||
|
return g_string_free (op, FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
get_escaped_dbus_path (const char *prefix,
|
||||||
|
const char *component)
|
||||||
|
{
|
||||||
|
char *escaped_component = escape_dbus_component (component);
|
||||||
|
char *path = g_strconcat (prefix, "/", escaped_component, NULL);
|
||||||
|
|
||||||
|
g_free (escaped_component);
|
||||||
|
return path;
|
||||||
|
}
|
||||||
@@ -22,13 +22,11 @@
|
|||||||
* Jasper St. Pierre <jstpierre@mecheye.net>
|
* Jasper St. Pierre <jstpierre@mecheye.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef META_BACKEND_H
|
#ifndef DBUS_UTILS_H
|
||||||
#define META_BACKEND_H
|
#define DBUS_UTILS_H
|
||||||
|
|
||||||
#include <glib-object.h>
|
char *
|
||||||
|
get_escaped_dbus_path (const char *prefix,
|
||||||
|
const char *component);
|
||||||
|
|
||||||
void meta_clutter_init (void);
|
#endif /* DBUS_UTILS_H */
|
||||||
|
|
||||||
gboolean meta_activate_vt (int vt, GError **error);
|
|
||||||
|
|
||||||
#endif /* META_BACKEND_H */
|
|
||||||
297
src/backends/native/meta-backend-native.c
Normal file
297
src/backends/native/meta-backend-native.c
Normal file
@@ -0,0 +1,297 @@
|
|||||||
|
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2014 Red Hat
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
|
*
|
||||||
|
* Written by:
|
||||||
|
* Jasper St. Pierre <jstpierre@mecheye.net>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#include <meta/main.h>
|
||||||
|
#include <clutter/evdev/clutter-evdev.h>
|
||||||
|
#include "meta-backend-native.h"
|
||||||
|
|
||||||
|
#include "meta-idle-monitor-native.h"
|
||||||
|
#include "meta-monitor-manager-kms.h"
|
||||||
|
#include "meta-cursor-renderer-native.h"
|
||||||
|
#include "meta-launcher.h"
|
||||||
|
|
||||||
|
struct _MetaBackendNativePrivate
|
||||||
|
{
|
||||||
|
MetaLauncher *launcher;
|
||||||
|
};
|
||||||
|
typedef struct _MetaBackendNativePrivate MetaBackendNativePrivate;
|
||||||
|
|
||||||
|
G_DEFINE_TYPE_WITH_PRIVATE (MetaBackendNative, meta_backend_native, META_TYPE_BACKEND);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The pointer constrain code is mostly a rip-off of the XRandR code from Xorg.
|
||||||
|
* (from xserver/randr/rrcrtc.c, RRConstrainCursorHarder)
|
||||||
|
*
|
||||||
|
* Copyright © 2006 Keith Packard
|
||||||
|
* Copyright 2010 Red Hat, Inc
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
check_all_screen_monitors(MetaMonitorInfo *monitors,
|
||||||
|
unsigned n_monitors,
|
||||||
|
float x,
|
||||||
|
float y)
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
for (i = 0; i < n_monitors; i++)
|
||||||
|
{
|
||||||
|
MetaMonitorInfo *monitor = &monitors[i];
|
||||||
|
int left, right, top, bottom;
|
||||||
|
|
||||||
|
left = monitor->rect.x;
|
||||||
|
right = left + monitor->rect.width;
|
||||||
|
top = monitor->rect.y;
|
||||||
|
bottom = left + monitor->rect.height;
|
||||||
|
|
||||||
|
if ((x >= left) && (x < right) && (y >= top) && (y < bottom))
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
constrain_all_screen_monitors (ClutterInputDevice *device,
|
||||||
|
MetaMonitorInfo *monitors,
|
||||||
|
unsigned n_monitors,
|
||||||
|
float *x,
|
||||||
|
float *y)
|
||||||
|
{
|
||||||
|
ClutterPoint current;
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
clutter_input_device_get_coords (device, NULL, ¤t);
|
||||||
|
|
||||||
|
/* if we're trying to escape, clamp to the CRTC we're coming from */
|
||||||
|
for (i = 0; i < n_monitors; i++)
|
||||||
|
{
|
||||||
|
MetaMonitorInfo *monitor = &monitors[i];
|
||||||
|
int left, right, top, bottom;
|
||||||
|
float nx, ny;
|
||||||
|
|
||||||
|
left = monitor->rect.x;
|
||||||
|
right = left + monitor->rect.width;
|
||||||
|
top = monitor->rect.y;
|
||||||
|
bottom = left + monitor->rect.height;
|
||||||
|
|
||||||
|
nx = current.x;
|
||||||
|
ny = current.y;
|
||||||
|
|
||||||
|
if ((nx >= left) && (nx < right) && (ny >= top) && (ny < bottom))
|
||||||
|
{
|
||||||
|
if (*x < left)
|
||||||
|
*x = left;
|
||||||
|
if (*x >= right)
|
||||||
|
*x = right - 1;
|
||||||
|
if (*y < top)
|
||||||
|
*y = top;
|
||||||
|
if (*y >= bottom)
|
||||||
|
*y = bottom - 1;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
pointer_constrain_callback (ClutterInputDevice *device,
|
||||||
|
guint32 time,
|
||||||
|
float *new_x,
|
||||||
|
float *new_y,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
MetaMonitorManager *monitor_manager;
|
||||||
|
MetaMonitorInfo *monitors;
|
||||||
|
unsigned int n_monitors;
|
||||||
|
gboolean ret;
|
||||||
|
|
||||||
|
monitor_manager = meta_monitor_manager_get ();
|
||||||
|
monitors = meta_monitor_manager_get_monitor_infos (monitor_manager, &n_monitors);
|
||||||
|
|
||||||
|
/* if we're moving inside a monitor, we're fine */
|
||||||
|
ret = check_all_screen_monitors(monitors, n_monitors, *new_x, *new_y);
|
||||||
|
if (ret == TRUE)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* if we're trying to escape, clamp to the CRTC we're coming from */
|
||||||
|
constrain_all_screen_monitors(device, monitors, n_monitors, new_x, new_y);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_backend_native_post_init (MetaBackend *backend)
|
||||||
|
{
|
||||||
|
ClutterDeviceManager *manager = clutter_device_manager_get_default ();
|
||||||
|
|
||||||
|
META_BACKEND_CLASS (meta_backend_native_parent_class)->post_init (backend);
|
||||||
|
|
||||||
|
clutter_evdev_set_pointer_constrain_callback (manager, pointer_constrain_callback,
|
||||||
|
NULL, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static MetaIdleMonitor *
|
||||||
|
meta_backend_native_create_idle_monitor (MetaBackend *backend,
|
||||||
|
int device_id)
|
||||||
|
{
|
||||||
|
return g_object_new (META_TYPE_IDLE_MONITOR_NATIVE,
|
||||||
|
"device-id", device_id,
|
||||||
|
NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static MetaMonitorManager *
|
||||||
|
meta_backend_native_create_monitor_manager (MetaBackend *backend)
|
||||||
|
{
|
||||||
|
return g_object_new (META_TYPE_MONITOR_MANAGER_KMS, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static MetaCursorRenderer *
|
||||||
|
meta_backend_native_create_cursor_renderer (MetaBackend *backend)
|
||||||
|
{
|
||||||
|
return g_object_new (META_TYPE_CURSOR_RENDERER_NATIVE, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_backend_native_warp_pointer (MetaBackend *backend,
|
||||||
|
int x,
|
||||||
|
int y)
|
||||||
|
{
|
||||||
|
ClutterDeviceManager *manager = clutter_device_manager_get_default ();
|
||||||
|
ClutterInputDevice *device = clutter_device_manager_get_core_device (manager, CLUTTER_POINTER_DEVICE);
|
||||||
|
|
||||||
|
/* XXX */
|
||||||
|
guint32 time_ = 0;
|
||||||
|
|
||||||
|
clutter_evdev_warp_pointer (device, time_, x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_backend_native_set_keymap (MetaBackend *backend,
|
||||||
|
const char *layouts,
|
||||||
|
const char *variants,
|
||||||
|
const char *options)
|
||||||
|
{
|
||||||
|
ClutterDeviceManager *manager = clutter_device_manager_get_default ();
|
||||||
|
struct xkb_rule_names names;
|
||||||
|
struct xkb_keymap *keymap;
|
||||||
|
struct xkb_context *context;
|
||||||
|
|
||||||
|
names.rules = DEFAULT_XKB_RULES_FILE;
|
||||||
|
names.model = DEFAULT_XKB_MODEL;
|
||||||
|
names.layout = layouts;
|
||||||
|
names.variant = variants;
|
||||||
|
names.options = options;
|
||||||
|
|
||||||
|
context = xkb_context_new (XKB_CONTEXT_NO_FLAGS);
|
||||||
|
keymap = xkb_keymap_new_from_names (context, &names, XKB_KEYMAP_COMPILE_NO_FLAGS);
|
||||||
|
xkb_context_unref (context);
|
||||||
|
|
||||||
|
clutter_evdev_set_keyboard_map (manager, keymap);
|
||||||
|
|
||||||
|
g_signal_emit_by_name (backend, "keymap-changed", 0);
|
||||||
|
|
||||||
|
xkb_keymap_unref (keymap);
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct xkb_keymap *
|
||||||
|
meta_backend_native_get_keymap (MetaBackend *backend)
|
||||||
|
{
|
||||||
|
ClutterDeviceManager *manager = clutter_device_manager_get_default ();
|
||||||
|
return clutter_evdev_get_keyboard_map (manager);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_backend_native_lock_layout_group (MetaBackend *backend,
|
||||||
|
guint idx)
|
||||||
|
{
|
||||||
|
ClutterDeviceManager *manager = clutter_device_manager_get_default ();
|
||||||
|
clutter_evdev_set_keyboard_layout_index (manager, idx);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_backend_native_class_init (MetaBackendNativeClass *klass)
|
||||||
|
{
|
||||||
|
MetaBackendClass *backend_class = META_BACKEND_CLASS (klass);
|
||||||
|
|
||||||
|
backend_class->post_init = meta_backend_native_post_init;
|
||||||
|
backend_class->create_idle_monitor = meta_backend_native_create_idle_monitor;
|
||||||
|
backend_class->create_monitor_manager = meta_backend_native_create_monitor_manager;
|
||||||
|
backend_class->create_cursor_renderer = meta_backend_native_create_cursor_renderer;
|
||||||
|
|
||||||
|
backend_class->warp_pointer = meta_backend_native_warp_pointer;
|
||||||
|
backend_class->set_keymap = meta_backend_native_set_keymap;
|
||||||
|
backend_class->get_keymap = meta_backend_native_get_keymap;
|
||||||
|
backend_class->lock_layout_group = meta_backend_native_lock_layout_group;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_backend_native_init (MetaBackendNative *native)
|
||||||
|
{
|
||||||
|
MetaBackendNativePrivate *priv = meta_backend_native_get_instance_private (native);
|
||||||
|
|
||||||
|
/* We're a display server, so start talking to weston-launch. */
|
||||||
|
priv->launcher = meta_launcher_new ();
|
||||||
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
meta_activate_vt (int vt, GError **error)
|
||||||
|
{
|
||||||
|
MetaBackend *backend = meta_get_backend ();
|
||||||
|
MetaBackendNative *native = META_BACKEND_NATIVE (backend);
|
||||||
|
MetaBackendNativePrivate *priv = meta_backend_native_get_instance_private (native);
|
||||||
|
|
||||||
|
return meta_launcher_activate_vt (priv->launcher, vt, error);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* meta_activate_session:
|
||||||
|
*
|
||||||
|
* Tells mutter to activate the session. When mutter is a
|
||||||
|
* Wayland compositor, this tells logind to switch over to
|
||||||
|
* the new session.
|
||||||
|
*/
|
||||||
|
gboolean
|
||||||
|
meta_activate_session (void)
|
||||||
|
{
|
||||||
|
GError *error = NULL;
|
||||||
|
MetaBackend *backend = meta_get_backend ();
|
||||||
|
|
||||||
|
/* Do nothing. */
|
||||||
|
if (!META_IS_BACKEND_NATIVE (backend))
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
MetaBackendNative *native = META_BACKEND_NATIVE (backend);
|
||||||
|
MetaBackendNativePrivate *priv = meta_backend_native_get_instance_private (native);
|
||||||
|
|
||||||
|
if (!meta_launcher_activate_session (priv->launcher, &error))
|
||||||
|
{
|
||||||
|
g_warning ("Could not activate session: %s\n", error->message);
|
||||||
|
g_error_free (error);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
54
src/backends/native/meta-backend-native.h
Normal file
54
src/backends/native/meta-backend-native.h
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2014 Red Hat
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
|
*
|
||||||
|
* Written by:
|
||||||
|
* Jasper St. Pierre <jstpierre@mecheye.net>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef META_BACKEND_NATIVE_H
|
||||||
|
#define META_BACKEND_NATIVE_H
|
||||||
|
|
||||||
|
#include "backends/meta-backend-private.h"
|
||||||
|
|
||||||
|
#define META_TYPE_BACKEND_NATIVE (meta_backend_native_get_type ())
|
||||||
|
#define META_BACKEND_NATIVE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_BACKEND_NATIVE, MetaBackendNative))
|
||||||
|
#define META_BACKEND_NATIVE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_BACKEND_NATIVE, MetaBackendNativeClass))
|
||||||
|
#define META_IS_BACKEND_NATIVE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_BACKEND_NATIVE))
|
||||||
|
#define META_IS_BACKEND_NATIVE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_BACKEND_NATIVE))
|
||||||
|
#define META_BACKEND_NATIVE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), META_TYPE_BACKEND_NATIVE, MetaBackendNativeClass))
|
||||||
|
|
||||||
|
typedef struct _MetaBackendNative MetaBackendNative;
|
||||||
|
typedef struct _MetaBackendNativeClass MetaBackendNativeClass;
|
||||||
|
|
||||||
|
struct _MetaBackendNative
|
||||||
|
{
|
||||||
|
MetaBackend parent;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct _MetaBackendNativeClass
|
||||||
|
{
|
||||||
|
MetaBackendClass parent_class;
|
||||||
|
};
|
||||||
|
|
||||||
|
GType meta_backend_native_get_type (void) G_GNUC_CONST;
|
||||||
|
|
||||||
|
gboolean meta_activate_vt (int vt, GError **error);
|
||||||
|
|
||||||
|
#endif /* META_BACKEND_NATIVE_H */
|
||||||
205
src/backends/native/meta-cursor-renderer-native.c
Normal file
205
src/backends/native/meta-cursor-renderer-native.c
Normal file
@@ -0,0 +1,205 @@
|
|||||||
|
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2014 Red Hat
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
|
*
|
||||||
|
* Written by:
|
||||||
|
* Jasper St. Pierre <jstpierre@mecheye.net>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#include "meta-cursor-renderer-native.h"
|
||||||
|
|
||||||
|
#include <gbm.h>
|
||||||
|
|
||||||
|
#include "meta-cursor-private.h"
|
||||||
|
#include "meta-monitor-manager.h"
|
||||||
|
|
||||||
|
struct _MetaCursorRendererNativePrivate
|
||||||
|
{
|
||||||
|
gboolean has_hw_cursor;
|
||||||
|
|
||||||
|
int drm_fd;
|
||||||
|
struct gbm_device *gbm;
|
||||||
|
};
|
||||||
|
typedef struct _MetaCursorRendererNativePrivate MetaCursorRendererNativePrivate;
|
||||||
|
|
||||||
|
G_DEFINE_TYPE_WITH_PRIVATE (MetaCursorRendererNative, meta_cursor_renderer_native, META_TYPE_CURSOR_RENDERER);
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_cursor_renderer_native_finalize (GObject *object)
|
||||||
|
{
|
||||||
|
MetaCursorRendererNative *renderer = META_CURSOR_RENDERER_NATIVE (object);
|
||||||
|
MetaCursorRendererNativePrivate *priv = meta_cursor_renderer_native_get_instance_private (renderer);
|
||||||
|
|
||||||
|
if (priv->gbm)
|
||||||
|
gbm_device_destroy (priv->gbm);
|
||||||
|
|
||||||
|
G_OBJECT_CLASS (meta_cursor_renderer_native_parent_class)->finalize (object);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_crtc_cursor (MetaCursorRendererNative *native,
|
||||||
|
MetaCRTC *crtc,
|
||||||
|
MetaCursorReference *cursor,
|
||||||
|
gboolean force)
|
||||||
|
{
|
||||||
|
MetaCursorRendererNativePrivate *priv = meta_cursor_renderer_native_get_instance_private (native);
|
||||||
|
|
||||||
|
if (crtc->cursor == cursor && !force)
|
||||||
|
return;
|
||||||
|
|
||||||
|
crtc->cursor = cursor;
|
||||||
|
|
||||||
|
if (cursor)
|
||||||
|
{
|
||||||
|
struct gbm_bo *bo;
|
||||||
|
union gbm_bo_handle handle;
|
||||||
|
int width, height;
|
||||||
|
int offset_x, offset_y;
|
||||||
|
|
||||||
|
bo = meta_cursor_reference_get_gbm_bo (cursor, &offset_x, &offset_y);
|
||||||
|
|
||||||
|
handle = gbm_bo_get_handle (bo);
|
||||||
|
width = gbm_bo_get_width (bo);
|
||||||
|
height = gbm_bo_get_height (bo);
|
||||||
|
|
||||||
|
drmModeSetCursor2 (priv->drm_fd, crtc->crtc_id, handle.u32,
|
||||||
|
width, height, -offset_x, -offset_y);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
drmModeSetCursor2 (priv->drm_fd, crtc->crtc_id, 0, 0, 0, 0, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
update_hw_cursor (MetaCursorRendererNative *native,
|
||||||
|
gboolean force)
|
||||||
|
{
|
||||||
|
MetaCursorRendererNativePrivate *priv = meta_cursor_renderer_native_get_instance_private (native);
|
||||||
|
MetaCursorRenderer *renderer = META_CURSOR_RENDERER (native);
|
||||||
|
const MetaRectangle *cursor_rect = meta_cursor_renderer_get_rect (renderer);
|
||||||
|
MetaCursorReference *cursor = meta_cursor_renderer_get_cursor (renderer);
|
||||||
|
MetaMonitorManager *monitors;
|
||||||
|
MetaCRTC *crtcs;
|
||||||
|
unsigned int i, n_crtcs;
|
||||||
|
|
||||||
|
monitors = meta_monitor_manager_get ();
|
||||||
|
meta_monitor_manager_get_resources (monitors, NULL, NULL, &crtcs, &n_crtcs, NULL, NULL);
|
||||||
|
|
||||||
|
for (i = 0; i < n_crtcs; i++)
|
||||||
|
{
|
||||||
|
gboolean crtc_should_have_cursor;
|
||||||
|
MetaCursorReference *crtc_cursor;
|
||||||
|
MetaRectangle *crtc_rect;
|
||||||
|
|
||||||
|
crtc_rect = &crtcs[i].rect;
|
||||||
|
|
||||||
|
crtc_should_have_cursor = (priv->has_hw_cursor && meta_rectangle_overlap (cursor_rect, crtc_rect));
|
||||||
|
if (crtc_should_have_cursor)
|
||||||
|
crtc_cursor = cursor;
|
||||||
|
else
|
||||||
|
crtc_cursor = NULL;
|
||||||
|
|
||||||
|
set_crtc_cursor (native, &crtcs[i], crtc_cursor, force);
|
||||||
|
|
||||||
|
if (crtc_cursor)
|
||||||
|
{
|
||||||
|
drmModeMoveCursor (priv->drm_fd, crtcs[i].crtc_id,
|
||||||
|
cursor_rect->x - crtc_rect->x,
|
||||||
|
cursor_rect->y - crtc_rect->y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
should_have_hw_cursor (MetaCursorRenderer *renderer)
|
||||||
|
{
|
||||||
|
MetaCursorReference *cursor = meta_cursor_renderer_get_cursor (renderer);
|
||||||
|
|
||||||
|
if (cursor)
|
||||||
|
return (meta_cursor_reference_get_gbm_bo (cursor, NULL, NULL) != NULL);
|
||||||
|
else
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
meta_cursor_renderer_native_update_cursor (MetaCursorRenderer *renderer)
|
||||||
|
{
|
||||||
|
MetaCursorRendererNative *native = META_CURSOR_RENDERER_NATIVE (renderer);
|
||||||
|
MetaCursorRendererNativePrivate *priv = meta_cursor_renderer_native_get_instance_private (native);
|
||||||
|
|
||||||
|
priv->has_hw_cursor = should_have_hw_cursor (renderer);
|
||||||
|
update_hw_cursor (native, FALSE);
|
||||||
|
return priv->has_hw_cursor;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_cursor_renderer_native_class_init (MetaCursorRendererNativeClass *klass)
|
||||||
|
{
|
||||||
|
MetaCursorRendererClass *renderer_class = META_CURSOR_RENDERER_CLASS (klass);
|
||||||
|
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||||
|
|
||||||
|
object_class->finalize = meta_cursor_renderer_native_finalize;
|
||||||
|
renderer_class->update_cursor = meta_cursor_renderer_native_update_cursor;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
on_monitors_changed (MetaMonitorManager *monitors,
|
||||||
|
MetaCursorRendererNative *native)
|
||||||
|
{
|
||||||
|
/* Our tracking is all messed up, so force an update. */
|
||||||
|
update_hw_cursor (native, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_cursor_renderer_native_init (MetaCursorRendererNative *native)
|
||||||
|
{
|
||||||
|
MetaCursorRendererNativePrivate *priv = meta_cursor_renderer_native_get_instance_private (native);
|
||||||
|
CoglContext *ctx = clutter_backend_get_cogl_context (clutter_get_default_backend ());
|
||||||
|
MetaMonitorManager *monitors;
|
||||||
|
|
||||||
|
monitors = meta_monitor_manager_get ();
|
||||||
|
g_signal_connect_object (monitors, "monitors-changed",
|
||||||
|
G_CALLBACK (on_monitors_changed), native, 0);
|
||||||
|
|
||||||
|
#if defined(CLUTTER_WINDOWING_EGL)
|
||||||
|
if (clutter_check_windowing_backend (CLUTTER_WINDOWING_EGL))
|
||||||
|
{
|
||||||
|
CoglRenderer *cogl_renderer = cogl_display_get_renderer (cogl_context_get_display (ctx));
|
||||||
|
priv->drm_fd = cogl_kms_renderer_get_kms_fd (cogl_renderer);
|
||||||
|
priv->gbm = gbm_create_device (priv->drm_fd);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
struct gbm_device *
|
||||||
|
meta_cursor_renderer_native_get_gbm_device (MetaCursorRendererNative *native)
|
||||||
|
{
|
||||||
|
MetaCursorRendererNativePrivate *priv = meta_cursor_renderer_native_get_instance_private (native);
|
||||||
|
|
||||||
|
return priv->gbm;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_cursor_renderer_native_force_update (MetaCursorRendererNative *native)
|
||||||
|
{
|
||||||
|
update_hw_cursor (native, TRUE);
|
||||||
|
}
|
||||||
55
src/backends/native/meta-cursor-renderer-native.h
Normal file
55
src/backends/native/meta-cursor-renderer-native.h
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2014 Red Hat
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
|
*
|
||||||
|
* Written by:
|
||||||
|
* Jasper St. Pierre <jstpierre@mecheye.net>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef META_CURSOR_RENDERER_NATIVE_H
|
||||||
|
#define META_CURSOR_RENDERER_NATIVE_H
|
||||||
|
|
||||||
|
#include "meta-cursor-renderer.h"
|
||||||
|
|
||||||
|
#define META_TYPE_CURSOR_RENDERER_NATIVE (meta_cursor_renderer_native_get_type ())
|
||||||
|
#define META_CURSOR_RENDERER_NATIVE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_CURSOR_RENDERER_NATIVE, MetaCursorRendererNative))
|
||||||
|
#define META_CURSOR_RENDERER_NATIVE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_CURSOR_RENDERER_NATIVE, MetaCursorRendererNativeClass))
|
||||||
|
#define META_IS_CURSOR_RENDERER_NATIVE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_CURSOR_RENDERER_NATIVE))
|
||||||
|
#define META_IS_CURSOR_RENDERER_NATIVE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_CURSOR_RENDERER_NATIVE))
|
||||||
|
#define META_CURSOR_RENDERER_NATIVE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), META_TYPE_CURSOR_RENDERER_NATIVE, MetaCursorRendererNativeClass))
|
||||||
|
|
||||||
|
typedef struct _MetaCursorRendererNative MetaCursorRendererNative;
|
||||||
|
typedef struct _MetaCursorRendererNativeClass MetaCursorRendererNativeClass;
|
||||||
|
|
||||||
|
struct _MetaCursorRendererNative
|
||||||
|
{
|
||||||
|
MetaCursorRenderer parent;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct _MetaCursorRendererNativeClass
|
||||||
|
{
|
||||||
|
MetaCursorRendererClass parent_class;
|
||||||
|
};
|
||||||
|
|
||||||
|
GType meta_cursor_renderer_native_get_type (void) G_GNUC_CONST;
|
||||||
|
|
||||||
|
struct gbm_device * meta_cursor_renderer_native_get_gbm_device (MetaCursorRendererNative *renderer);
|
||||||
|
void meta_cursor_renderer_native_force_update (MetaCursorRendererNative *renderer);
|
||||||
|
|
||||||
|
#endif /* META_CURSOR_RENDERER_NATIVE_H */
|
||||||
367
src/backends/native/meta-launcher.c
Normal file
367
src/backends/native/meta-launcher.c
Normal file
@@ -0,0 +1,367 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2013 Red Hat, Inc.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#include "meta-launcher.h"
|
||||||
|
|
||||||
|
#include <gio/gunixfdlist.h>
|
||||||
|
|
||||||
|
#include <clutter/clutter.h>
|
||||||
|
#include <clutter/egl/clutter-egl.h>
|
||||||
|
#include <clutter/evdev/clutter-evdev.h>
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <malloc.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include <systemd/sd-login.h>
|
||||||
|
|
||||||
|
#include "dbus-utils.h"
|
||||||
|
#include "meta-dbus-login1.h"
|
||||||
|
|
||||||
|
#include "backends/meta-backend-private.h"
|
||||||
|
#include "meta-cursor-renderer-native.h"
|
||||||
|
|
||||||
|
struct _MetaLauncher
|
||||||
|
{
|
||||||
|
Login1Session *session_proxy;
|
||||||
|
Login1Seat *seat_proxy;
|
||||||
|
|
||||||
|
gboolean session_active;
|
||||||
|
};
|
||||||
|
|
||||||
|
static Login1Session *
|
||||||
|
get_session_proxy (GCancellable *cancellable)
|
||||||
|
{
|
||||||
|
char *proxy_path;
|
||||||
|
char *session_id;
|
||||||
|
Login1Session *session_proxy;
|
||||||
|
|
||||||
|
if (sd_pid_get_session (getpid (), &session_id) < 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
proxy_path = get_escaped_dbus_path ("/org/freedesktop/login1/session", session_id);
|
||||||
|
|
||||||
|
session_proxy = login1_session_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
|
||||||
|
G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
|
||||||
|
"org.freedesktop.login1",
|
||||||
|
proxy_path,
|
||||||
|
cancellable, NULL);
|
||||||
|
free (proxy_path);
|
||||||
|
|
||||||
|
return session_proxy;
|
||||||
|
}
|
||||||
|
|
||||||
|
static Login1Seat *
|
||||||
|
get_seat_proxy (GCancellable *cancellable)
|
||||||
|
{
|
||||||
|
return login1_seat_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
|
||||||
|
G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
|
||||||
|
"org.freedesktop.login1",
|
||||||
|
"/org/freedesktop/login1/seat/self",
|
||||||
|
cancellable, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
session_unpause (void)
|
||||||
|
{
|
||||||
|
ClutterBackend *backend;
|
||||||
|
CoglContext *cogl_context;
|
||||||
|
CoglDisplay *cogl_display;
|
||||||
|
|
||||||
|
backend = clutter_get_default_backend ();
|
||||||
|
cogl_context = clutter_backend_get_cogl_context (backend);
|
||||||
|
cogl_display = cogl_context_get_display (cogl_context);
|
||||||
|
cogl_kms_display_queue_modes_reset (cogl_display);
|
||||||
|
|
||||||
|
clutter_evdev_reclaim_devices ();
|
||||||
|
clutter_egl_thaw_master_clock ();
|
||||||
|
|
||||||
|
{
|
||||||
|
MetaBackend *backend = meta_get_backend ();
|
||||||
|
MetaCursorRenderer *renderer = meta_backend_get_cursor_renderer (backend);
|
||||||
|
ClutterActor *stage = meta_backend_get_stage (backend);
|
||||||
|
|
||||||
|
/* When we mode-switch back, we need to immediately queue a redraw
|
||||||
|
* in case nothing else queued one for us, and force the cursor to
|
||||||
|
* update. */
|
||||||
|
|
||||||
|
clutter_actor_queue_redraw (stage);
|
||||||
|
meta_cursor_renderer_native_force_update (META_CURSOR_RENDERER_NATIVE (renderer));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
session_pause (void)
|
||||||
|
{
|
||||||
|
clutter_evdev_release_devices ();
|
||||||
|
clutter_egl_freeze_master_clock ();
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
take_device (Login1Session *session_proxy,
|
||||||
|
int dev_major,
|
||||||
|
int dev_minor,
|
||||||
|
int *out_fd,
|
||||||
|
GCancellable *cancellable,
|
||||||
|
GError **error)
|
||||||
|
{
|
||||||
|
gboolean ret = FALSE;
|
||||||
|
GVariant *fd_variant = NULL;
|
||||||
|
int fd = -1;
|
||||||
|
GUnixFDList *fd_list;
|
||||||
|
|
||||||
|
if (!login1_session_call_take_device_sync (session_proxy,
|
||||||
|
dev_major,
|
||||||
|
dev_minor,
|
||||||
|
NULL,
|
||||||
|
&fd_variant,
|
||||||
|
NULL, /* paused */
|
||||||
|
&fd_list,
|
||||||
|
cancellable,
|
||||||
|
error))
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
fd = g_unix_fd_list_get (fd_list, g_variant_get_handle (fd_variant), error);
|
||||||
|
if (fd == -1)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
*out_fd = fd;
|
||||||
|
ret = TRUE;
|
||||||
|
|
||||||
|
out:
|
||||||
|
if (fd_variant)
|
||||||
|
g_variant_unref (fd_variant);
|
||||||
|
if (fd_list)
|
||||||
|
g_object_unref (fd_list);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
get_device_info_from_path (const char *path,
|
||||||
|
int *out_major,
|
||||||
|
int *out_minor)
|
||||||
|
{
|
||||||
|
gboolean ret = FALSE;
|
||||||
|
int r;
|
||||||
|
struct stat st;
|
||||||
|
|
||||||
|
r = stat (path, &st);
|
||||||
|
if (r < 0)
|
||||||
|
goto out;
|
||||||
|
if (!S_ISCHR (st.st_mode))
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
*out_major = major (st.st_rdev);
|
||||||
|
*out_minor = minor (st.st_rdev);
|
||||||
|
ret = TRUE;
|
||||||
|
|
||||||
|
out:
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
get_device_info_from_fd (int fd,
|
||||||
|
int *out_major,
|
||||||
|
int *out_minor)
|
||||||
|
{
|
||||||
|
gboolean ret = FALSE;
|
||||||
|
int r;
|
||||||
|
struct stat st;
|
||||||
|
|
||||||
|
r = fstat (fd, &st);
|
||||||
|
if (r < 0)
|
||||||
|
goto out;
|
||||||
|
if (!S_ISCHR (st.st_mode))
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
*out_major = major (st.st_rdev);
|
||||||
|
*out_minor = minor (st.st_rdev);
|
||||||
|
ret = TRUE;
|
||||||
|
|
||||||
|
out:
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
on_evdev_device_open (const char *path,
|
||||||
|
int flags,
|
||||||
|
gpointer user_data,
|
||||||
|
GError **error)
|
||||||
|
{
|
||||||
|
MetaLauncher *self = user_data;
|
||||||
|
int fd;
|
||||||
|
int major, minor;
|
||||||
|
|
||||||
|
if (!get_device_info_from_path (path, &major, &minor))
|
||||||
|
{
|
||||||
|
g_set_error (error,
|
||||||
|
G_IO_ERROR,
|
||||||
|
G_IO_ERROR_NOT_FOUND,
|
||||||
|
"Could not get device info for path %s: %m", path);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!take_device (self->session_proxy, major, minor, &fd, NULL, error))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
return fd;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
on_evdev_device_close (int fd,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
MetaLauncher *self = user_data;
|
||||||
|
int major, minor;
|
||||||
|
GError *error = NULL;
|
||||||
|
|
||||||
|
if (!get_device_info_from_fd (fd, &major, &minor))
|
||||||
|
{
|
||||||
|
g_warning ("Could not get device info for fd %d: %m", fd);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!login1_session_call_release_device_sync (self->session_proxy,
|
||||||
|
major, minor,
|
||||||
|
NULL, &error))
|
||||||
|
{
|
||||||
|
g_warning ("Could not release device %d,%d: %s", major, minor, error->message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
sync_active (MetaLauncher *self)
|
||||||
|
{
|
||||||
|
gboolean active = login1_session_get_active (LOGIN1_SESSION (self->session_proxy));
|
||||||
|
|
||||||
|
if (active == self->session_active)
|
||||||
|
return;
|
||||||
|
|
||||||
|
self->session_active = active;
|
||||||
|
|
||||||
|
if (active)
|
||||||
|
session_unpause ();
|
||||||
|
else
|
||||||
|
session_pause ();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
on_active_changed (Login1Session *session,
|
||||||
|
GParamSpec *pspec,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
MetaLauncher *self = user_data;
|
||||||
|
sync_active (self);
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
get_kms_fd (Login1Session *session_proxy,
|
||||||
|
int *fd_out)
|
||||||
|
{
|
||||||
|
int major, minor;
|
||||||
|
int fd;
|
||||||
|
GError *error = NULL;
|
||||||
|
|
||||||
|
/* XXX -- use udev to find the DRM master device */
|
||||||
|
if (!get_device_info_from_path ("/dev/dri/card0", &major, &minor))
|
||||||
|
{
|
||||||
|
g_warning ("Could not stat /dev/dri/card0: %m");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!take_device (session_proxy, major, minor, &fd, NULL, &error))
|
||||||
|
{
|
||||||
|
g_warning ("Could not open DRM device: %s\n", error->message);
|
||||||
|
g_error_free (error);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
*fd_out = fd;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
MetaLauncher *
|
||||||
|
meta_launcher_new (void)
|
||||||
|
{
|
||||||
|
MetaLauncher *self;
|
||||||
|
Login1Session *session_proxy;
|
||||||
|
GError *error = NULL;
|
||||||
|
int kms_fd;
|
||||||
|
|
||||||
|
session_proxy = get_session_proxy (NULL);
|
||||||
|
if (!login1_session_call_take_control_sync (session_proxy, FALSE, NULL, &error))
|
||||||
|
{
|
||||||
|
g_warning ("Could not take control: %s", error->message);
|
||||||
|
g_error_free (error);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!get_kms_fd (session_proxy, &kms_fd))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
self = g_slice_new0 (MetaLauncher);
|
||||||
|
self->session_proxy = session_proxy;
|
||||||
|
self->seat_proxy = get_seat_proxy (NULL);
|
||||||
|
|
||||||
|
self->session_active = TRUE;
|
||||||
|
|
||||||
|
clutter_egl_set_kms_fd (kms_fd);
|
||||||
|
clutter_evdev_set_device_callbacks (on_evdev_device_open,
|
||||||
|
on_evdev_device_close,
|
||||||
|
self);
|
||||||
|
|
||||||
|
g_signal_connect (self->session_proxy, "notify::active", G_CALLBACK (on_active_changed), self);
|
||||||
|
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_launcher_free (MetaLauncher *self)
|
||||||
|
{
|
||||||
|
g_object_unref (self->seat_proxy);
|
||||||
|
g_object_unref (self->session_proxy);
|
||||||
|
g_slice_free (MetaLauncher, self);
|
||||||
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
meta_launcher_activate_session (MetaLauncher *launcher,
|
||||||
|
GError **error)
|
||||||
|
{
|
||||||
|
if (!login1_session_call_activate_sync (launcher->session_proxy, NULL, error))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
sync_active (launcher);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
meta_launcher_activate_vt (MetaLauncher *launcher,
|
||||||
|
signed char vt,
|
||||||
|
GError **error)
|
||||||
|
{
|
||||||
|
return login1_seat_call_switch_to_sync (launcher->seat_proxy, vt, NULL, error);
|
||||||
|
}
|
||||||
@@ -17,18 +17,21 @@
|
|||||||
* 02111-1307, USA.
|
* 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef META_WESTON_LAUNCH_H
|
#ifndef META_LAUNCHER_H
|
||||||
#define META_WESTON_LAUNCH_H
|
#define META_LAUNCHER_H
|
||||||
|
|
||||||
#include <glib-object.h>
|
#include <glib-object.h>
|
||||||
#include "weston-launch.h"
|
|
||||||
|
|
||||||
typedef struct _MetaLauncher MetaLauncher;
|
typedef struct _MetaLauncher MetaLauncher;
|
||||||
|
|
||||||
MetaLauncher *meta_launcher_new (void);
|
MetaLauncher *meta_launcher_new (void);
|
||||||
void meta_launcher_free (MetaLauncher *self);
|
void meta_launcher_free (MetaLauncher *self);
|
||||||
|
|
||||||
|
gboolean meta_launcher_activate_session (MetaLauncher *self,
|
||||||
|
GError **error);
|
||||||
|
|
||||||
gboolean meta_launcher_activate_vt (MetaLauncher *self,
|
gboolean meta_launcher_activate_vt (MetaLauncher *self,
|
||||||
signed char vt,
|
signed char vt,
|
||||||
GError **error);
|
GError **error);
|
||||||
#endif
|
|
||||||
|
#endif /* META_LAUNCHER_H */
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2013 Red Hat Inc.
|
* Copyright (C) 2013 Red Hat Inc.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License as
|
* modify it under the terms of the GNU General Public License as
|
||||||
* published by the Free Software Foundation; either version 2 of the
|
* published by the Free Software Foundation; either version 2 of the
|
||||||
@@ -12,7 +12,7 @@
|
|||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
@@ -40,8 +40,6 @@
|
|||||||
#include <meta/errors.h>
|
#include <meta/errors.h>
|
||||||
#include "edid.h"
|
#include "edid.h"
|
||||||
|
|
||||||
#define ALL_WL_TRANSFORMS ((1 << (WL_OUTPUT_TRANSFORM_FLIPPED_270 + 1)) - 1)
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
drmModeConnector *connector;
|
drmModeConnector *connector;
|
||||||
|
|
||||||
@@ -259,7 +257,7 @@ find_output_by_id (MetaOutput *outputs,
|
|||||||
unsigned i;
|
unsigned i;
|
||||||
|
|
||||||
for (i = 0; i < n_outputs; i++)
|
for (i = 0; i < n_outputs; i++)
|
||||||
if (outputs[i].output_id == id)
|
if (outputs[i].winsys_id == id)
|
||||||
return &outputs[i];
|
return &outputs[i];
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -363,9 +361,9 @@ meta_monitor_manager_kms_read_current (MetaMonitorManager *manager)
|
|||||||
meta_crtc->rect.width = crtc->width;
|
meta_crtc->rect.width = crtc->width;
|
||||||
meta_crtc->rect.height = crtc->height;
|
meta_crtc->rect.height = crtc->height;
|
||||||
meta_crtc->is_dirty = FALSE;
|
meta_crtc->is_dirty = FALSE;
|
||||||
meta_crtc->transform = WL_OUTPUT_TRANSFORM_NORMAL;
|
meta_crtc->transform = META_MONITOR_TRANSFORM_NORMAL;
|
||||||
/* FIXME: implement! */
|
/* FIXME: implement! */
|
||||||
meta_crtc->all_transforms = 1 << WL_OUTPUT_TRANSFORM_NORMAL;
|
meta_crtc->all_transforms = 1 << META_MONITOR_TRANSFORM_NORMAL;
|
||||||
|
|
||||||
if (crtc->mode_valid)
|
if (crtc->mode_valid)
|
||||||
{
|
{
|
||||||
@@ -408,7 +406,7 @@ meta_monitor_manager_kms_read_current (MetaMonitorManager *manager)
|
|||||||
meta_output->driver_private = output_kms = g_slice_new0 (MetaOutputKms);
|
meta_output->driver_private = output_kms = g_slice_new0 (MetaOutputKms);
|
||||||
meta_output->driver_notify = (GDestroyNotify)meta_output_destroy_notify;
|
meta_output->driver_notify = (GDestroyNotify)meta_output_destroy_notify;
|
||||||
|
|
||||||
meta_output->output_id = connector->connector_id;
|
meta_output->winsys_id = connector->connector_id;
|
||||||
meta_output->name = make_output_name (connector);
|
meta_output->name = make_output_name (connector);
|
||||||
meta_output->width_mm = connector->mmWidth;
|
meta_output->width_mm = connector->mmWidth;
|
||||||
meta_output->height_mm = connector->mmHeight;
|
meta_output->height_mm = connector->mmHeight;
|
||||||
@@ -491,7 +489,7 @@ meta_monitor_manager_kms_read_current (MetaMonitorManager *manager)
|
|||||||
meta_output->crtc = NULL;
|
meta_output->crtc = NULL;
|
||||||
|
|
||||||
old_output = find_output_by_id (old_outputs, n_old_outputs,
|
old_output = find_output_by_id (old_outputs, n_old_outputs,
|
||||||
meta_output->output_id);
|
meta_output->winsys_id);
|
||||||
if (old_output)
|
if (old_output)
|
||||||
{
|
{
|
||||||
meta_output->is_primary = old_output->is_primary;
|
meta_output->is_primary = old_output->is_primary;
|
||||||
@@ -667,7 +665,7 @@ meta_monitor_manager_kms_set_power_save_mode (MetaMonitorManager *manager,
|
|||||||
|
|
||||||
if (output_kms->dpms_prop_id != 0)
|
if (output_kms->dpms_prop_id != 0)
|
||||||
{
|
{
|
||||||
int ok = drmModeConnectorSetProperty(manager_kms->fd, meta_output->output_id,
|
int ok = drmModeConnectorSetProperty(manager_kms->fd, meta_output->winsys_id,
|
||||||
output_kms->dpms_prop_id, state);
|
output_kms->dpms_prop_id, state);
|
||||||
|
|
||||||
if (ok < 0)
|
if (ok < 0)
|
||||||
@@ -748,7 +746,7 @@ meta_monitor_manager_kms_apply_configuration (MetaMonitorManager *manager,
|
|||||||
{
|
{
|
||||||
MetaOutput *output = g_ptr_array_index (crtc_info->outputs, j);
|
MetaOutput *output = g_ptr_array_index (crtc_info->outputs, j);
|
||||||
|
|
||||||
connectors[j] = output->output_id;
|
connectors[j] = output->winsys_id;
|
||||||
|
|
||||||
output->is_dirty = TRUE;
|
output->is_dirty = TRUE;
|
||||||
output->crtc = crtc;
|
output->crtc = crtc;
|
||||||
|
|||||||
@@ -1,411 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2013 Red Hat, Inc.
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License as
|
|
||||||
* published by the Free Software Foundation; either version 2 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but
|
|
||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include <gio/gio.h>
|
|
||||||
#include <gio/gunixfdmessage.h>
|
|
||||||
|
|
||||||
#include <clutter/clutter.h>
|
|
||||||
#include <clutter/egl/clutter-egl.h>
|
|
||||||
#include <clutter/evdev/clutter-evdev.h>
|
|
||||||
|
|
||||||
#include <glib.h>
|
|
||||||
#include <sys/time.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <sys/un.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <sys/wait.h>
|
|
||||||
|
|
||||||
#include <drm.h>
|
|
||||||
#include <xf86drm.h>
|
|
||||||
#include <xf86drmMode.h>
|
|
||||||
|
|
||||||
#include "wayland/meta-wayland-private.h"
|
|
||||||
#include "meta-cursor-tracker-private.h"
|
|
||||||
#include "meta-weston-launch.h"
|
|
||||||
|
|
||||||
struct _MetaLauncher
|
|
||||||
{
|
|
||||||
GSocket *weston_launch;
|
|
||||||
|
|
||||||
gboolean vt_switched;
|
|
||||||
|
|
||||||
GMainContext *nested_context;
|
|
||||||
GMainLoop *nested_loop;
|
|
||||||
|
|
||||||
GSource *inner_source;
|
|
||||||
GSource *outer_source;
|
|
||||||
};
|
|
||||||
|
|
||||||
static void handle_request_vt_switch (MetaLauncher *self);
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
request_vt_switch_idle (gpointer user_data)
|
|
||||||
{
|
|
||||||
handle_request_vt_switch (user_data);
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
send_message_to_wl (MetaLauncher *self,
|
|
||||||
void *message,
|
|
||||||
gsize size,
|
|
||||||
GSocketControlMessage *out_cmsg,
|
|
||||||
GSocketControlMessage **in_cmsg,
|
|
||||||
GError **error)
|
|
||||||
{
|
|
||||||
struct weston_launcher_reply reply;
|
|
||||||
GInputVector in_iov = { &reply, sizeof (reply) };
|
|
||||||
GOutputVector out_iov = { message, size };
|
|
||||||
GSocketControlMessage *out_all_cmsg[2];
|
|
||||||
GSocketControlMessage **in_all_cmsg;
|
|
||||||
int flags = 0;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
out_all_cmsg[0] = out_cmsg;
|
|
||||||
out_all_cmsg[1] = NULL;
|
|
||||||
if (g_socket_send_message (self->weston_launch, NULL,
|
|
||||||
&out_iov, 1,
|
|
||||||
out_all_cmsg, -1,
|
|
||||||
flags, NULL, error) != (gssize)size)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
if (g_socket_receive_message (self->weston_launch, NULL,
|
|
||||||
&in_iov, 1,
|
|
||||||
&in_all_cmsg, NULL,
|
|
||||||
&flags, NULL, error) != sizeof (reply))
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
while (reply.header.opcode != ((struct weston_launcher_message*)message)->opcode)
|
|
||||||
{
|
|
||||||
/* There were events queued */
|
|
||||||
g_assert ((reply.header.opcode & WESTON_LAUNCHER_EVENT) == WESTON_LAUNCHER_EVENT);
|
|
||||||
|
|
||||||
/* This can never happen, because the only time mutter-launch can queue
|
|
||||||
this event is after confirming a VT switch, and we don't make requests
|
|
||||||
during that time.
|
|
||||||
|
|
||||||
Note that getting this event would be really bad, because we would be
|
|
||||||
in the wrong loop/context.
|
|
||||||
*/
|
|
||||||
g_assert (reply.header.opcode != WESTON_LAUNCHER_SERVER_VT_ENTER);
|
|
||||||
|
|
||||||
switch (reply.header.opcode)
|
|
||||||
{
|
|
||||||
case WESTON_LAUNCHER_SERVER_REQUEST_VT_SWITCH:
|
|
||||||
g_idle_add (request_vt_switch_idle, self);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
g_assert_not_reached ();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (g_socket_receive_message (self->weston_launch, NULL,
|
|
||||||
&in_iov, 1,
|
|
||||||
NULL, NULL,
|
|
||||||
&flags, NULL, error) != sizeof (reply))
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (reply.ret != 0)
|
|
||||||
{
|
|
||||||
if (reply.ret == -1)
|
|
||||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
|
||||||
"Got failure from weston-launch");
|
|
||||||
else
|
|
||||||
g_set_error (error, G_IO_ERROR, g_io_error_from_errno (-reply.ret),
|
|
||||||
"Got failure from weston-launch: %s", strerror (-reply.ret));
|
|
||||||
|
|
||||||
for (i = 0; in_all_cmsg && in_all_cmsg[i]; i++)
|
|
||||||
g_object_unref (in_all_cmsg[i]);
|
|
||||||
g_free (in_all_cmsg);
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (in_all_cmsg && in_all_cmsg[0])
|
|
||||||
{
|
|
||||||
for (i = 1; in_all_cmsg[i]; i++)
|
|
||||||
g_object_unref (in_all_cmsg[i]);
|
|
||||||
*in_cmsg = in_all_cmsg[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
g_free (in_all_cmsg);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
meta_launcher_open_device (MetaLauncher *self,
|
|
||||||
const char *name,
|
|
||||||
int flags,
|
|
||||||
GError **error)
|
|
||||||
{
|
|
||||||
struct weston_launcher_open *message;
|
|
||||||
GSocketControlMessage *cmsg;
|
|
||||||
gboolean ok;
|
|
||||||
gsize size;
|
|
||||||
int *fds, n_fd;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
size = sizeof (struct weston_launcher_open) + strlen (name) + 1;
|
|
||||||
message = g_malloc (size);
|
|
||||||
message->header.opcode = WESTON_LAUNCHER_OPEN;
|
|
||||||
message->flags = flags;
|
|
||||||
strcpy (message->path, name);
|
|
||||||
message->path[strlen(name)] = 0;
|
|
||||||
|
|
||||||
ok = send_message_to_wl (self, message, size, NULL, &cmsg, error);
|
|
||||||
|
|
||||||
if (ok)
|
|
||||||
{
|
|
||||||
g_assert (G_IS_UNIX_FD_MESSAGE (cmsg));
|
|
||||||
|
|
||||||
fds = g_unix_fd_message_steal_fds (G_UNIX_FD_MESSAGE (cmsg), &n_fd);
|
|
||||||
g_assert (n_fd == 1);
|
|
||||||
|
|
||||||
ret = fds[0];
|
|
||||||
g_free (fds);
|
|
||||||
g_object_unref (cmsg);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
ret = -1;
|
|
||||||
|
|
||||||
g_free (message);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_launcher_enter (MetaLauncher *launcher)
|
|
||||||
{
|
|
||||||
ClutterBackend *backend;
|
|
||||||
CoglContext *cogl_context;
|
|
||||||
CoglDisplay *cogl_display;
|
|
||||||
|
|
||||||
backend = clutter_get_default_backend ();
|
|
||||||
cogl_context = clutter_backend_get_cogl_context (backend);
|
|
||||||
cogl_display = cogl_context_get_display (cogl_context);
|
|
||||||
cogl_kms_display_queue_modes_reset (cogl_display);
|
|
||||||
|
|
||||||
clutter_evdev_reclaim_devices ();
|
|
||||||
|
|
||||||
{
|
|
||||||
MetaWaylandCompositor *compositor = meta_wayland_compositor_get_default ();
|
|
||||||
|
|
||||||
/* When we mode-switch back, we need to immediately queue a redraw
|
|
||||||
* in case nothing else queued one for us, and force the cursor to
|
|
||||||
* update. */
|
|
||||||
|
|
||||||
clutter_actor_queue_redraw (compositor->stage);
|
|
||||||
meta_cursor_tracker_force_update (compositor->seat->cursor_tracker);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_launcher_leave (MetaLauncher *launcher)
|
|
||||||
{
|
|
||||||
clutter_evdev_release_devices ();
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
on_evdev_device_open (const char *path,
|
|
||||||
int flags,
|
|
||||||
gpointer user_data,
|
|
||||||
GError **error)
|
|
||||||
{
|
|
||||||
MetaLauncher *launcher = user_data;
|
|
||||||
|
|
||||||
return meta_launcher_open_device (launcher, path, flags, error);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
on_evdev_device_close (int fd,
|
|
||||||
gpointer user_data)
|
|
||||||
{
|
|
||||||
close (fd);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
handle_vt_enter (MetaLauncher *launcher)
|
|
||||||
{
|
|
||||||
g_assert (launcher->vt_switched);
|
|
||||||
|
|
||||||
g_main_loop_quit (launcher->nested_loop);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
handle_request_vt_switch (MetaLauncher *launcher)
|
|
||||||
{
|
|
||||||
struct weston_launcher_message message;
|
|
||||||
GError *error;
|
|
||||||
gboolean ok;
|
|
||||||
|
|
||||||
meta_launcher_leave (launcher);
|
|
||||||
|
|
||||||
message.opcode = WESTON_LAUNCHER_CONFIRM_VT_SWITCH;
|
|
||||||
|
|
||||||
error = NULL;
|
|
||||||
ok = send_message_to_wl (launcher, &message, sizeof (message), NULL, NULL, &error);
|
|
||||||
if (!ok) {
|
|
||||||
g_warning ("Failed to acknowledge VT switch: %s", error->message);
|
|
||||||
g_error_free (error);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
g_assert (!launcher->vt_switched);
|
|
||||||
launcher->vt_switched = TRUE;
|
|
||||||
|
|
||||||
/* We can't do anything at this point, because we don't
|
|
||||||
have input devices and we don't have the DRM master,
|
|
||||||
so let's run a nested busy loop until the VT is reentered */
|
|
||||||
g_main_loop_run (launcher->nested_loop);
|
|
||||||
|
|
||||||
g_assert (launcher->vt_switched);
|
|
||||||
launcher->vt_switched = FALSE;
|
|
||||||
|
|
||||||
meta_launcher_enter (launcher);
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
on_socket_readable (GSocket *socket,
|
|
||||||
GIOCondition condition,
|
|
||||||
gpointer user_data)
|
|
||||||
{
|
|
||||||
MetaLauncher *launcher = user_data;
|
|
||||||
struct weston_launcher_event event;
|
|
||||||
gssize read;
|
|
||||||
GError *error;
|
|
||||||
|
|
||||||
if ((condition & G_IO_IN) == 0)
|
|
||||||
return TRUE;
|
|
||||||
|
|
||||||
error = NULL;
|
|
||||||
read = g_socket_receive (socket, (char*)&event, sizeof(event), NULL, &error);
|
|
||||||
if (read < (gssize)sizeof(event))
|
|
||||||
{
|
|
||||||
g_warning ("Error reading from weston-launcher socket: %s", error->message);
|
|
||||||
g_error_free (error);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (event.header.opcode)
|
|
||||||
{
|
|
||||||
case WESTON_LAUNCHER_SERVER_REQUEST_VT_SWITCH:
|
|
||||||
handle_request_vt_switch (launcher);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WESTON_LAUNCHER_SERVER_VT_ENTER:
|
|
||||||
handle_vt_enter (launcher);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
env_get_fd (const char *env)
|
|
||||||
{
|
|
||||||
const char *value;
|
|
||||||
|
|
||||||
value = g_getenv (env);
|
|
||||||
|
|
||||||
if (value == NULL)
|
|
||||||
return -1;
|
|
||||||
else
|
|
||||||
return g_ascii_strtoll (value, NULL, 10);
|
|
||||||
}
|
|
||||||
|
|
||||||
MetaLauncher *
|
|
||||||
meta_launcher_new (void)
|
|
||||||
{
|
|
||||||
MetaLauncher *self = g_slice_new0 (MetaLauncher);
|
|
||||||
int launch_fd;
|
|
||||||
|
|
||||||
launch_fd = env_get_fd ("WESTON_LAUNCHER_SOCK");
|
|
||||||
if (launch_fd < 0)
|
|
||||||
g_error ("Invalid mutter-launch socket");
|
|
||||||
|
|
||||||
self->weston_launch = g_socket_new_from_fd (launch_fd, NULL);
|
|
||||||
|
|
||||||
self->nested_context = g_main_context_new ();
|
|
||||||
self->nested_loop = g_main_loop_new (self->nested_context, FALSE);
|
|
||||||
|
|
||||||
self->outer_source = g_socket_create_source (self->weston_launch, G_IO_IN, NULL);
|
|
||||||
g_source_set_callback (self->outer_source, (GSourceFunc)on_socket_readable, self, NULL);
|
|
||||||
g_source_attach (self->outer_source, NULL);
|
|
||||||
g_source_unref (self->outer_source);
|
|
||||||
|
|
||||||
self->inner_source = g_socket_create_source (self->weston_launch, G_IO_IN, NULL);
|
|
||||||
g_source_set_callback (self->inner_source, (GSourceFunc)on_socket_readable, self, NULL);
|
|
||||||
g_source_attach (self->inner_source, self->nested_context);
|
|
||||||
g_source_unref (self->inner_source);
|
|
||||||
|
|
||||||
clutter_evdev_set_device_callbacks (on_evdev_device_open,
|
|
||||||
on_evdev_device_close,
|
|
||||||
self);
|
|
||||||
|
|
||||||
#if defined(CLUTTER_WINDOWING_EGL)
|
|
||||||
if (clutter_check_windowing_backend (CLUTTER_WINDOWING_EGL))
|
|
||||||
{
|
|
||||||
GError *error = NULL;
|
|
||||||
int fd = meta_launcher_open_device (self, "/dev/dri/card0", O_RDWR, &error);
|
|
||||||
if (error)
|
|
||||||
g_error ("Failed to open /dev/dri/card0: %s", error->message);
|
|
||||||
|
|
||||||
clutter_egl_set_kms_fd (fd);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return self;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
meta_launcher_free (MetaLauncher *launcher)
|
|
||||||
{
|
|
||||||
g_source_destroy (launcher->outer_source);
|
|
||||||
g_source_destroy (launcher->inner_source);
|
|
||||||
|
|
||||||
g_main_loop_unref (launcher->nested_loop);
|
|
||||||
g_main_context_unref (launcher->nested_context);
|
|
||||||
|
|
||||||
g_object_unref (launcher->weston_launch);
|
|
||||||
|
|
||||||
g_slice_free (MetaLauncher, launcher);
|
|
||||||
}
|
|
||||||
|
|
||||||
gboolean
|
|
||||||
meta_launcher_activate_vt (MetaLauncher *launcher,
|
|
||||||
signed char vt,
|
|
||||||
GError **error)
|
|
||||||
{
|
|
||||||
struct weston_launcher_activate_vt message;
|
|
||||||
|
|
||||||
message.header.opcode = WESTON_LAUNCHER_ACTIVATE_VT;
|
|
||||||
message.vt = vt;
|
|
||||||
|
|
||||||
return send_message_to_wl (launcher, &message, sizeof (message), NULL, NULL, error);
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,711 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright © 2012 Benjamin Franzke
|
|
||||||
*
|
|
||||||
* Permission to use, copy, modify, distribute, and sell this software and
|
|
||||||
* its documentation for any purpose is hereby granted without fee, provided
|
|
||||||
* that the above copyright notice appear in all copies and that both that
|
|
||||||
* copyright notice and this permission notice appear in supporting
|
|
||||||
* documentation, and that the name of the copyright holders not be used in
|
|
||||||
* advertising or publicity pertaining to distribution of the software
|
|
||||||
* without specific, written prior permission. The copyright holders make
|
|
||||||
* no representations about the suitability of this software for any
|
|
||||||
* purpose. It is provided "as is" without express or implied warranty.
|
|
||||||
*
|
|
||||||
* THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
|
|
||||||
* SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
||||||
* FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
||||||
* SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
|
|
||||||
* RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
|
|
||||||
* CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
|
||||||
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <assert.h>
|
|
||||||
#include <poll.h>
|
|
||||||
#include <errno.h>
|
|
||||||
|
|
||||||
#include <error.h>
|
|
||||||
#include <getopt.h>
|
|
||||||
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/ioctl.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <sys/wait.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <sys/signalfd.h>
|
|
||||||
#include <signal.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <limits.h>
|
|
||||||
|
|
||||||
#include <termios.h>
|
|
||||||
#include <linux/vt.h>
|
|
||||||
#include <linux/major.h>
|
|
||||||
#include <linux/kd.h>
|
|
||||||
|
|
||||||
#include <pwd.h>
|
|
||||||
#include <grp.h>
|
|
||||||
|
|
||||||
#include <xf86drm.h>
|
|
||||||
|
|
||||||
#include <systemd/sd-login.h>
|
|
||||||
|
|
||||||
#include "weston-launch.h"
|
|
||||||
|
|
||||||
#define MAX_ARGV_SIZE 256
|
|
||||||
#define DRM_MAJOR 226
|
|
||||||
|
|
||||||
enum vt_state {
|
|
||||||
VT_HAS_VT,
|
|
||||||
VT_PENDING_CONFIRM,
|
|
||||||
VT_NOT_HAVE_VT,
|
|
||||||
};
|
|
||||||
|
|
||||||
struct weston_launch {
|
|
||||||
int tty;
|
|
||||||
int ttynr;
|
|
||||||
int sock[2];
|
|
||||||
struct passwd *pw;
|
|
||||||
|
|
||||||
int signalfd;
|
|
||||||
|
|
||||||
pid_t child;
|
|
||||||
int verbose;
|
|
||||||
|
|
||||||
struct termios terminal_attributes;
|
|
||||||
int kb_mode;
|
|
||||||
enum vt_state vt_state;
|
|
||||||
unsigned vt;
|
|
||||||
|
|
||||||
int drm_fd;
|
|
||||||
};
|
|
||||||
|
|
||||||
union cmsg_data { unsigned char b[4]; int fd; };
|
|
||||||
|
|
||||||
static void quit (struct weston_launch *wl, int status);
|
|
||||||
|
|
||||||
static int
|
|
||||||
weston_launch_allowed(struct weston_launch *wl)
|
|
||||||
{
|
|
||||||
char *session, *seat;
|
|
||||||
int err;
|
|
||||||
|
|
||||||
if (getuid() == 0)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
err = sd_pid_get_session(getpid(), &session);
|
|
||||||
if (err == 0 && session) {
|
|
||||||
if (sd_session_is_active(session) &&
|
|
||||||
sd_session_get_seat(session, &seat) == 0) {
|
|
||||||
free(seat);
|
|
||||||
free(session);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
free(session);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
setup_launcher_socket(struct weston_launch *wl)
|
|
||||||
{
|
|
||||||
if (socketpair(AF_LOCAL, SOCK_DGRAM, 0, wl->sock) < 0)
|
|
||||||
error(1, errno, "socketpair failed");
|
|
||||||
|
|
||||||
fcntl(wl->sock[0], F_SETFD, O_CLOEXEC);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
setup_signals(struct weston_launch *wl)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
sigset_t mask;
|
|
||||||
struct sigaction sa;
|
|
||||||
|
|
||||||
memset(&sa, 0, sizeof sa);
|
|
||||||
sa.sa_handler = SIG_DFL;
|
|
||||||
sa.sa_flags = SA_NOCLDSTOP | SA_RESTART;
|
|
||||||
ret = sigaction(SIGCHLD, &sa, NULL);
|
|
||||||
assert(ret == 0);
|
|
||||||
|
|
||||||
sa.sa_handler = SIG_IGN;
|
|
||||||
sa.sa_flags = 0;
|
|
||||||
sigaction(SIGHUP, &sa, NULL);
|
|
||||||
|
|
||||||
ret = sigemptyset(&mask);
|
|
||||||
assert(ret == 0);
|
|
||||||
sigaddset(&mask, SIGCHLD);
|
|
||||||
sigaddset(&mask, SIGINT);
|
|
||||||
sigaddset(&mask, SIGTERM);
|
|
||||||
sigaddset(&mask, SIGUSR1);
|
|
||||||
ret = sigprocmask(SIG_BLOCK, &mask, NULL);
|
|
||||||
assert(ret == 0);
|
|
||||||
|
|
||||||
wl->signalfd = signalfd(-1, &mask, SFD_NONBLOCK | SFD_CLOEXEC);
|
|
||||||
if (wl->signalfd < 0)
|
|
||||||
return -errno;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
setenv_fd(const char *env, int fd)
|
|
||||||
{
|
|
||||||
char buf[32];
|
|
||||||
|
|
||||||
snprintf(buf, sizeof buf, "%d", fd);
|
|
||||||
setenv(env, buf, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
handle_confirm_vt_switch(struct weston_launch *wl, struct msghdr *msg, ssize_t len)
|
|
||||||
{
|
|
||||||
struct weston_launcher_reply reply;
|
|
||||||
|
|
||||||
reply.header.opcode = WESTON_LAUNCHER_CONFIRM_VT_SWITCH;
|
|
||||||
reply.ret = -1;
|
|
||||||
|
|
||||||
if (wl->vt_state != VT_PENDING_CONFIRM) {
|
|
||||||
error(0, 0, "unexpected CONFIRM_VT_SWITCH");
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (wl->drm_fd != -1) {
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
ret = drmDropMaster(wl->drm_fd);
|
|
||||||
if (ret < 0) {
|
|
||||||
fprintf(stderr, "failed to drop DRM master: %m\n");
|
|
||||||
} else if (wl->verbose) {
|
|
||||||
fprintf(stderr, "dropped DRM master for VT switch\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
wl->vt_state = VT_NOT_HAVE_VT;
|
|
||||||
ioctl(wl->tty, VT_RELDISP, 1);
|
|
||||||
|
|
||||||
if (wl->verbose)
|
|
||||||
fprintf(stderr, "mutter-launcher: confirmed VT switch\n");
|
|
||||||
|
|
||||||
reply.ret = 0;
|
|
||||||
|
|
||||||
out:
|
|
||||||
do {
|
|
||||||
len = send(wl->sock[0], &reply, sizeof reply, 0);
|
|
||||||
} while (len < 0 && errno == EINTR);
|
|
||||||
if (len < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
handle_activate_vt(struct weston_launch *wl, struct msghdr *msg, ssize_t len)
|
|
||||||
{
|
|
||||||
struct weston_launcher_reply reply;
|
|
||||||
struct weston_launcher_activate_vt *message;
|
|
||||||
unsigned vt;
|
|
||||||
|
|
||||||
reply.header.opcode = WESTON_LAUNCHER_ACTIVATE_VT;
|
|
||||||
reply.ret = -1;
|
|
||||||
|
|
||||||
if (len != sizeof(*message)) {
|
|
||||||
error(0, 0, "missing value in activate_vt request");
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
message = msg->msg_iov->iov_base;
|
|
||||||
|
|
||||||
/* Negative values mean that we're activating our own VT */
|
|
||||||
if (message->vt > 0)
|
|
||||||
vt = message->vt;
|
|
||||||
else
|
|
||||||
vt = wl->vt;
|
|
||||||
|
|
||||||
reply.ret = ioctl(wl->tty, VT_ACTIVATE, vt);
|
|
||||||
if (reply.ret < 0)
|
|
||||||
reply.ret = -errno;
|
|
||||||
|
|
||||||
if (wl->verbose)
|
|
||||||
fprintf(stderr, "mutter-launch: activate VT, ret: %d\n", reply.ret);
|
|
||||||
|
|
||||||
out:
|
|
||||||
do {
|
|
||||||
len = send(wl->sock[0], &reply, sizeof reply, 0);
|
|
||||||
} while (len < 0 && errno == EINTR);
|
|
||||||
if (len < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int
|
|
||||||
handle_open(struct weston_launch *wl, struct msghdr *msg, ssize_t len)
|
|
||||||
{
|
|
||||||
struct weston_launcher_reply reply;
|
|
||||||
int fd = -1;
|
|
||||||
char control[CMSG_SPACE(sizeof(fd))];
|
|
||||||
struct cmsghdr *cmsg;
|
|
||||||
struct stat s;
|
|
||||||
struct msghdr nmsg;
|
|
||||||
struct iovec iov;
|
|
||||||
struct weston_launcher_open *message;
|
|
||||||
union cmsg_data *data;
|
|
||||||
int dev_major;
|
|
||||||
|
|
||||||
reply.header.opcode = WESTON_LAUNCHER_OPEN;
|
|
||||||
reply.ret = -1;
|
|
||||||
|
|
||||||
message = msg->msg_iov->iov_base;
|
|
||||||
if ((size_t)len < sizeof(*message))
|
|
||||||
goto err0;
|
|
||||||
|
|
||||||
/* Ensure path is null-terminated */
|
|
||||||
((char *) message)[len-1] = '\0';
|
|
||||||
|
|
||||||
if (stat(message->path, &s) < 0) {
|
|
||||||
reply.ret = -errno;
|
|
||||||
goto err0;
|
|
||||||
}
|
|
||||||
|
|
||||||
dev_major = major(s.st_rdev);
|
|
||||||
|
|
||||||
if (dev_major != INPUT_MAJOR &&
|
|
||||||
dev_major != DRM_MAJOR) {
|
|
||||||
fprintf(stderr, "Device %s is not an input or DRM device\n",
|
|
||||||
message->path);
|
|
||||||
reply.ret = -EPERM;
|
|
||||||
goto err0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dev_major == DRM_MAJOR && wl->drm_fd != -1) {
|
|
||||||
fprintf(stderr, "Already have a DRM device open\n");
|
|
||||||
reply.ret = -EPERM;
|
|
||||||
goto err0;
|
|
||||||
}
|
|
||||||
|
|
||||||
fd = open(message->path, message->flags);
|
|
||||||
if (fd < 0) {
|
|
||||||
fprintf(stderr, "Error opening device %s: %m\n",
|
|
||||||
message->path);
|
|
||||||
reply.ret = -errno;
|
|
||||||
goto err0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dev_major == DRM_MAJOR) {
|
|
||||||
wl->drm_fd = fd;
|
|
||||||
}
|
|
||||||
|
|
||||||
err0:
|
|
||||||
memset(&nmsg, 0, sizeof nmsg);
|
|
||||||
nmsg.msg_iov = &iov;
|
|
||||||
nmsg.msg_iovlen = 1;
|
|
||||||
if (fd != -1) {
|
|
||||||
nmsg.msg_control = control;
|
|
||||||
nmsg.msg_controllen = sizeof control;
|
|
||||||
cmsg = CMSG_FIRSTHDR(&nmsg);
|
|
||||||
cmsg->cmsg_level = SOL_SOCKET;
|
|
||||||
cmsg->cmsg_type = SCM_RIGHTS;
|
|
||||||
cmsg->cmsg_len = CMSG_LEN(sizeof(fd));
|
|
||||||
data = (union cmsg_data *) CMSG_DATA(cmsg);
|
|
||||||
data->fd = fd;
|
|
||||||
nmsg.msg_controllen = cmsg->cmsg_len;
|
|
||||||
reply.ret = 0;
|
|
||||||
}
|
|
||||||
iov.iov_base = &reply;
|
|
||||||
iov.iov_len = sizeof reply;
|
|
||||||
|
|
||||||
if (wl->verbose)
|
|
||||||
fprintf(stderr, "mutter-launch: opened %s: ret: %d, fd: %d\n",
|
|
||||||
message->path, reply.ret, fd);
|
|
||||||
do {
|
|
||||||
len = sendmsg(wl->sock[0], &nmsg, 0);
|
|
||||||
} while (len < 0 && errno == EINTR);
|
|
||||||
|
|
||||||
close(fd);
|
|
||||||
|
|
||||||
if (len < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
handle_socket_msg(struct weston_launch *wl)
|
|
||||||
{
|
|
||||||
char control[CMSG_SPACE(sizeof(int))];
|
|
||||||
char buf[BUFSIZ];
|
|
||||||
struct msghdr msg;
|
|
||||||
struct iovec iov;
|
|
||||||
int ret = -1;
|
|
||||||
ssize_t len;
|
|
||||||
struct weston_launcher_message *message;
|
|
||||||
|
|
||||||
memset(&msg, 0, sizeof(msg));
|
|
||||||
iov.iov_base = buf;
|
|
||||||
iov.iov_len = sizeof buf;
|
|
||||||
msg.msg_iov = &iov;
|
|
||||||
msg.msg_iovlen = 1;
|
|
||||||
msg.msg_control = control;
|
|
||||||
msg.msg_controllen = sizeof control;
|
|
||||||
|
|
||||||
do {
|
|
||||||
len = recvmsg(wl->sock[0], &msg, 0);
|
|
||||||
} while (len < 0 && errno == EINTR);
|
|
||||||
|
|
||||||
if (len < 1)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
message = (void *) buf;
|
|
||||||
switch (message->opcode) {
|
|
||||||
case WESTON_LAUNCHER_OPEN:
|
|
||||||
ret = handle_open(wl, &msg, len);
|
|
||||||
break;
|
|
||||||
case WESTON_LAUNCHER_CONFIRM_VT_SWITCH:
|
|
||||||
ret = handle_confirm_vt_switch(wl, &msg, len);
|
|
||||||
break;
|
|
||||||
case WESTON_LAUNCHER_ACTIVATE_VT:
|
|
||||||
ret = handle_activate_vt(wl, &msg, len);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
tty_reset(struct weston_launch *wl)
|
|
||||||
{
|
|
||||||
struct vt_mode mode = { 0 };
|
|
||||||
|
|
||||||
if (ioctl(wl->tty, KDSKBMODE, wl->kb_mode))
|
|
||||||
fprintf(stderr, "failed to restore keyboard mode: %m\n");
|
|
||||||
|
|
||||||
if (ioctl(wl->tty, KDSETMODE, KD_TEXT))
|
|
||||||
fprintf(stderr, "failed to set KD_TEXT mode on tty: %m\n");
|
|
||||||
|
|
||||||
if (tcsetattr(wl->tty, TCSANOW, &wl->terminal_attributes) < 0)
|
|
||||||
fprintf(stderr, "could not restore terminal to canonical mode\n");
|
|
||||||
|
|
||||||
mode.mode = VT_AUTO;
|
|
||||||
if (ioctl(wl->tty, VT_SETMODE, &mode) < 0)
|
|
||||||
fprintf(stderr, "could not reset vt handling\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
quit(struct weston_launch *wl, int status)
|
|
||||||
{
|
|
||||||
if (wl->child > 0)
|
|
||||||
kill(wl->child, SIGKILL);
|
|
||||||
|
|
||||||
close(wl->signalfd);
|
|
||||||
close(wl->sock[0]);
|
|
||||||
|
|
||||||
if (wl->drm_fd > 0)
|
|
||||||
close(wl->drm_fd);
|
|
||||||
|
|
||||||
tty_reset(wl);
|
|
||||||
|
|
||||||
exit(status);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
handle_vt_switch(struct weston_launch *wl)
|
|
||||||
{
|
|
||||||
struct weston_launcher_event message;
|
|
||||||
ssize_t len;
|
|
||||||
|
|
||||||
if (wl->vt_state == VT_HAS_VT) {
|
|
||||||
wl->vt_state = VT_PENDING_CONFIRM;
|
|
||||||
message.header.opcode = WESTON_LAUNCHER_SERVER_REQUEST_VT_SWITCH;
|
|
||||||
} else if (wl->vt_state == VT_NOT_HAVE_VT) {
|
|
||||||
wl->vt_state = VT_HAS_VT;
|
|
||||||
ioctl(wl->tty, VT_RELDISP, VT_ACKACQ);
|
|
||||||
|
|
||||||
if (wl->drm_fd != -1) {
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
ret = drmSetMaster(wl->drm_fd);
|
|
||||||
if (ret < 0) {
|
|
||||||
fprintf(stderr, "failed to become DRM master: %m\n");
|
|
||||||
/* This is very, very bad, and the compositor will crash soon,
|
|
||||||
but oh well... */
|
|
||||||
} else if (wl->verbose) {
|
|
||||||
fprintf(stderr, "became DRM master after VT switch\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
message.header.opcode = WESTON_LAUNCHER_SERVER_VT_ENTER;
|
|
||||||
} else
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
message.detail = 0;
|
|
||||||
|
|
||||||
do {
|
|
||||||
len = send(wl->sock[0], &message, sizeof(message), 0);
|
|
||||||
} while (len < 0 && errno == EINTR);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int
|
|
||||||
handle_signal(struct weston_launch *wl)
|
|
||||||
{
|
|
||||||
struct signalfd_siginfo sig;
|
|
||||||
int pid, status, ret;
|
|
||||||
|
|
||||||
if (read(wl->signalfd, &sig, sizeof sig) != sizeof sig) {
|
|
||||||
error(0, errno, "reading signalfd failed");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (sig.ssi_signo) {
|
|
||||||
case SIGCHLD:
|
|
||||||
pid = waitpid(-1, &status, 0);
|
|
||||||
if (pid == wl->child) {
|
|
||||||
wl->child = 0;
|
|
||||||
if (WIFEXITED(status))
|
|
||||||
ret = WEXITSTATUS(status);
|
|
||||||
else if (WIFSIGNALED(status))
|
|
||||||
/*
|
|
||||||
* If weston dies because of signal N, we
|
|
||||||
* return 10+N. This is distinct from
|
|
||||||
* weston-launch dying because of a signal
|
|
||||||
* (128+N).
|
|
||||||
*/
|
|
||||||
ret = 10 + WTERMSIG(status);
|
|
||||||
else
|
|
||||||
ret = 0;
|
|
||||||
quit(wl, ret);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case SIGTERM:
|
|
||||||
case SIGINT:
|
|
||||||
if (wl->child)
|
|
||||||
kill(wl->child, sig.ssi_signo);
|
|
||||||
break;
|
|
||||||
case SIGUSR1:
|
|
||||||
return handle_vt_switch(wl);
|
|
||||||
default:
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
setup_tty(struct weston_launch *wl)
|
|
||||||
{
|
|
||||||
struct stat buf;
|
|
||||||
struct termios raw_attributes;
|
|
||||||
struct vt_mode mode = { 0 };
|
|
||||||
char *session;
|
|
||||||
char path[PATH_MAX];
|
|
||||||
int ok;
|
|
||||||
|
|
||||||
ok = sd_pid_get_session(getpid(), &session);
|
|
||||||
if (ok < 0)
|
|
||||||
error(1, -ok, "could not determine current session");
|
|
||||||
|
|
||||||
ok = sd_session_get_vt(session, &wl->vt);
|
|
||||||
if (ok < 0)
|
|
||||||
error(1, -ok, "could not determine current TTY");
|
|
||||||
|
|
||||||
snprintf(path, PATH_MAX, "/dev/tty%u", wl->vt);
|
|
||||||
wl->tty = open(path, O_RDWR | O_NOCTTY | O_CLOEXEC);
|
|
||||||
|
|
||||||
if (wl->tty < 0)
|
|
||||||
error(1, errno, "failed to open tty");
|
|
||||||
|
|
||||||
if (fstat(wl->tty, &buf) < 0)
|
|
||||||
error(1, errno, "stat %s failed", path);
|
|
||||||
|
|
||||||
if (major(buf.st_rdev) != TTY_MAJOR)
|
|
||||||
error(1, 0, "invalid tty device: %s", path);
|
|
||||||
|
|
||||||
wl->ttynr = minor(buf.st_rdev);
|
|
||||||
|
|
||||||
if (tcgetattr(wl->tty, &wl->terminal_attributes) < 0)
|
|
||||||
error(1, errno, "could not get terminal attributes");
|
|
||||||
|
|
||||||
/* Ignore control characters and disable echo */
|
|
||||||
raw_attributes = wl->terminal_attributes;
|
|
||||||
cfmakeraw(&raw_attributes);
|
|
||||||
|
|
||||||
/* Fix up line endings to be normal (cfmakeraw hoses them) */
|
|
||||||
raw_attributes.c_oflag |= OPOST | OCRNL;
|
|
||||||
/* Don't generate ttou signals */
|
|
||||||
raw_attributes.c_oflag &= ~TOSTOP;
|
|
||||||
|
|
||||||
if (tcsetattr(wl->tty, TCSANOW, &raw_attributes) < 0)
|
|
||||||
error(1, errno, "could not put terminal into raw mode");
|
|
||||||
|
|
||||||
ioctl(wl->tty, KDGKBMODE, &wl->kb_mode);
|
|
||||||
ok = ioctl(wl->tty, KDSKBMODE, K_OFF);
|
|
||||||
if (ok < 0) {
|
|
||||||
ok = ioctl(wl->tty, KDSKBMODE, K_RAW);
|
|
||||||
if (ok < 0)
|
|
||||||
error(1, errno, "failed to set keyboard mode on tty");
|
|
||||||
}
|
|
||||||
|
|
||||||
ok = ioctl(wl->tty, KDSETMODE, KD_GRAPHICS);
|
|
||||||
if (ok < 0)
|
|
||||||
error(1, errno, "failed to set KD_GRAPHICS mode on tty");
|
|
||||||
|
|
||||||
wl->vt_state = VT_HAS_VT;
|
|
||||||
mode.mode = VT_PROCESS;
|
|
||||||
mode.relsig = SIGUSR1;
|
|
||||||
mode.acqsig = SIGUSR1;
|
|
||||||
ok = ioctl(wl->tty, VT_SETMODE, &mode);
|
|
||||||
if (ok < 0)
|
|
||||||
error(1, errno, "failed to take control of vt handling");
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
drop_privileges(struct weston_launch *wl)
|
|
||||||
{
|
|
||||||
if (setgid(wl->pw->pw_gid) < 0 ||
|
|
||||||
#ifdef HAVE_INITGROUPS
|
|
||||||
initgroups(wl->pw->pw_name, wl->pw->pw_gid) < 0 ||
|
|
||||||
#endif
|
|
||||||
setuid(wl->pw->pw_uid) < 0)
|
|
||||||
error(1, errno, "dropping privileges failed");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
launch_compositor(struct weston_launch *wl, int argc, char *argv[])
|
|
||||||
{
|
|
||||||
char command[PATH_MAX];
|
|
||||||
char *child_argv[MAX_ARGV_SIZE];
|
|
||||||
sigset_t mask;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if (wl->verbose)
|
|
||||||
printf("weston-launch: spawned weston with pid: %d\n", getpid());
|
|
||||||
|
|
||||||
drop_privileges(wl);
|
|
||||||
|
|
||||||
setenv_fd("WESTON_LAUNCHER_SOCK", wl->sock[1]);
|
|
||||||
setenv("LD_LIBRARY_PATH", LIBDIR, 1);
|
|
||||||
unsetenv("DISPLAY");
|
|
||||||
|
|
||||||
/* Do not give our signal mask to the new process. */
|
|
||||||
sigemptyset(&mask);
|
|
||||||
sigaddset(&mask, SIGTERM);
|
|
||||||
sigaddset(&mask, SIGCHLD);
|
|
||||||
sigaddset(&mask, SIGINT);
|
|
||||||
sigaddset(&mask, SIGUSR1);
|
|
||||||
sigprocmask(SIG_UNBLOCK, &mask, NULL);
|
|
||||||
|
|
||||||
snprintf (command, PATH_MAX, "%s \"$@\"", argv[0]);
|
|
||||||
|
|
||||||
child_argv[0] = wl->pw->pw_shell;
|
|
||||||
child_argv[1] = "-l";
|
|
||||||
child_argv[2] = "-c";
|
|
||||||
child_argv[3] = command;
|
|
||||||
for (i = 0; i < argc; ++i)
|
|
||||||
child_argv[4 + i] = argv[i];
|
|
||||||
child_argv[4 + i] = NULL;
|
|
||||||
|
|
||||||
execv(child_argv[0], child_argv);
|
|
||||||
error(1, errno, "exec failed");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
help(const char *name)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "Usage: %s [args...] [-- [weston args..]]\n", name);
|
|
||||||
fprintf(stderr, " -u, --user Start session as specified username\n");
|
|
||||||
fprintf(stderr, " -v, --verbose Be verbose\n");
|
|
||||||
fprintf(stderr, " -h, --help Display this help message\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
main(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
struct weston_launch wl;
|
|
||||||
int i, c;
|
|
||||||
struct option opts[] = {
|
|
||||||
{ "verbose", no_argument, NULL, 'v' },
|
|
||||||
{ "help", no_argument, NULL, 'h' },
|
|
||||||
{ 0, 0, NULL, 0 }
|
|
||||||
};
|
|
||||||
|
|
||||||
memset(&wl, 0, sizeof wl);
|
|
||||||
wl.drm_fd = -1;
|
|
||||||
|
|
||||||
while ((c = getopt_long(argc, argv, "u:t::vh", opts, &i)) != -1) {
|
|
||||||
switch (c) {
|
|
||||||
case 'v':
|
|
||||||
wl.verbose = 1;
|
|
||||||
break;
|
|
||||||
case 'h':
|
|
||||||
help("mutter-launch");
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((argc - optind) > (MAX_ARGV_SIZE - 6))
|
|
||||||
error(1, E2BIG, "Too many arguments to pass to weston");
|
|
||||||
|
|
||||||
if (optind >= argc)
|
|
||||||
error(1, 0, "Expected program argument");
|
|
||||||
|
|
||||||
wl.pw = getpwuid(getuid());
|
|
||||||
if (wl.pw == NULL)
|
|
||||||
error(1, errno, "failed to get username");
|
|
||||||
|
|
||||||
if (!weston_launch_allowed(&wl))
|
|
||||||
error(1, 0, "Permission denied. You must run from an active and local (systemd) session.");
|
|
||||||
|
|
||||||
if (setup_tty(&wl) < 0)
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
|
|
||||||
if (setup_launcher_socket(&wl) < 0)
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
|
|
||||||
if (setup_signals(&wl) < 0)
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
|
|
||||||
wl.child = fork();
|
|
||||||
if (wl.child == -1) {
|
|
||||||
error(1, errno, "fork failed");
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (wl.child == 0)
|
|
||||||
launch_compositor(&wl, argc - optind, argv + optind);
|
|
||||||
|
|
||||||
close(wl.sock[1]);
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
struct pollfd fds[2];
|
|
||||||
int n;
|
|
||||||
|
|
||||||
fds[0].fd = wl.sock[0];
|
|
||||||
fds[0].events = POLLIN;
|
|
||||||
fds[1].fd = wl.signalfd;
|
|
||||||
fds[1].events = POLLIN;
|
|
||||||
|
|
||||||
n = poll(fds, 2, -1);
|
|
||||||
if (n < 0)
|
|
||||||
error(0, errno, "poll failed");
|
|
||||||
if (fds[0].revents & POLLIN)
|
|
||||||
handle_socket_msg(&wl);
|
|
||||||
if (fds[1].revents)
|
|
||||||
handle_signal(&wl);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
@@ -1,68 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright © 2012 Benjamin Franzke
|
|
||||||
* 2013 Red Hat, Inc.
|
|
||||||
*
|
|
||||||
* Permission to use, copy, modify, distribute, and sell this software and
|
|
||||||
* its documentation for any purpose is hereby granted without fee, provided
|
|
||||||
* that the above copyright notice appear in all copies and that both that
|
|
||||||
* copyright notice and this permission notice appear in supporting
|
|
||||||
* documentation, and that the name of the copyright holders not be used in
|
|
||||||
* advertising or publicity pertaining to distribution of the software
|
|
||||||
* without specific, written prior permission. The copyright holders make
|
|
||||||
* no representations about the suitability of this software for any
|
|
||||||
* purpose. It is provided "as is" without express or implied warranty.
|
|
||||||
*
|
|
||||||
* THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
|
|
||||||
* SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
||||||
* FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
||||||
* SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
|
|
||||||
* RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
|
|
||||||
* CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
|
||||||
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _WESTON_LAUNCH_H_
|
|
||||||
#define _WESTON_LAUNCH_H_
|
|
||||||
|
|
||||||
enum weston_launcher_message_type {
|
|
||||||
WESTON_LAUNCHER_REQUEST,
|
|
||||||
WESTON_LAUNCHER_EVENT,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum weston_launcher_opcode {
|
|
||||||
WESTON_LAUNCHER_OPEN = (1 << 1 | WESTON_LAUNCHER_REQUEST),
|
|
||||||
WESTON_LAUNCHER_ACTIVATE_VT = (2 << 1 | WESTON_LAUNCHER_REQUEST),
|
|
||||||
WESTON_LAUNCHER_CONFIRM_VT_SWITCH = (3 << 1 | WESTON_LAUNCHER_REQUEST),
|
|
||||||
};
|
|
||||||
|
|
||||||
enum weston_launcher_server_opcode {
|
|
||||||
WESTON_LAUNCHER_SERVER_REQUEST_VT_SWITCH = (1 << 1 | WESTON_LAUNCHER_EVENT),
|
|
||||||
WESTON_LAUNCHER_SERVER_VT_ENTER = (2 << 1 | WESTON_LAUNCHER_EVENT),
|
|
||||||
};
|
|
||||||
|
|
||||||
struct weston_launcher_message {
|
|
||||||
int opcode;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct weston_launcher_open {
|
|
||||||
struct weston_launcher_message header;
|
|
||||||
int flags;
|
|
||||||
char path[0];
|
|
||||||
};
|
|
||||||
|
|
||||||
struct weston_launcher_activate_vt {
|
|
||||||
struct weston_launcher_message header;
|
|
||||||
signed char vt;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct weston_launcher_reply {
|
|
||||||
struct weston_launcher_message header;
|
|
||||||
int ret;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct weston_launcher_event {
|
|
||||||
struct weston_launcher_message header;
|
|
||||||
int detail; /* unused, but makes sure replies and events are serialized the same */
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
703
src/backends/x11/meta-backend-x11.c
Normal file
703
src/backends/x11/meta-backend-x11.c
Normal file
@@ -0,0 +1,703 @@
|
|||||||
|
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2014 Red Hat
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
|
*
|
||||||
|
* Written by:
|
||||||
|
* Jasper St. Pierre <jstpierre@mecheye.net>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "meta-backend-x11.h"
|
||||||
|
|
||||||
|
#include <clutter/x11/clutter-x11.h>
|
||||||
|
|
||||||
|
#include <X11/extensions/sync.h>
|
||||||
|
#include <X11/XKBlib.h>
|
||||||
|
#include <X11/extensions/XKBrules.h>
|
||||||
|
#include <X11/Xlib-xcb.h>
|
||||||
|
#include <xkbcommon/xkbcommon-x11.h>
|
||||||
|
|
||||||
|
#include "meta-idle-monitor-xsync.h"
|
||||||
|
#include "meta-monitor-manager-xrandr.h"
|
||||||
|
#include "backends/meta-monitor-manager-dummy.h"
|
||||||
|
#include "meta-cursor-renderer-x11.h"
|
||||||
|
|
||||||
|
#include <meta/util.h>
|
||||||
|
#include "display-private.h"
|
||||||
|
#include "compositor/compositor-private.h"
|
||||||
|
|
||||||
|
struct _MetaBackendX11Private
|
||||||
|
{
|
||||||
|
/* The host X11 display */
|
||||||
|
Display *xdisplay;
|
||||||
|
xcb_connection_t *xcb;
|
||||||
|
GSource *source;
|
||||||
|
|
||||||
|
int xsync_event_base;
|
||||||
|
int xsync_error_base;
|
||||||
|
|
||||||
|
int xinput_opcode;
|
||||||
|
int xinput_event_base;
|
||||||
|
int xinput_error_base;
|
||||||
|
Time latest_evtime;
|
||||||
|
|
||||||
|
uint8_t xkb_event_base;
|
||||||
|
uint8_t xkb_error_base;
|
||||||
|
|
||||||
|
struct xkb_keymap *keymap;
|
||||||
|
};
|
||||||
|
typedef struct _MetaBackendX11Private MetaBackendX11Private;
|
||||||
|
|
||||||
|
G_DEFINE_TYPE_WITH_PRIVATE (MetaBackendX11, meta_backend_x11, META_TYPE_BACKEND);
|
||||||
|
|
||||||
|
static void
|
||||||
|
handle_alarm_notify (MetaBackend *backend,
|
||||||
|
XEvent *event)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i <= backend->device_id_max; i++)
|
||||||
|
if (backend->device_monitors[i])
|
||||||
|
meta_idle_monitor_xsync_handle_xevent (backend->device_monitors[i], (XSyncAlarmNotifyEvent*) event);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
translate_device_event (MetaBackendX11 *x11,
|
||||||
|
XIDeviceEvent *device_event)
|
||||||
|
{
|
||||||
|
MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
|
||||||
|
Window stage_window = meta_backend_x11_get_xwindow (x11);
|
||||||
|
|
||||||
|
if (device_event->event != stage_window)
|
||||||
|
{
|
||||||
|
/* This codepath should only ever trigger as an X11 compositor,
|
||||||
|
* and never under nested, as under nested all backend events
|
||||||
|
* should be reported with respect to the stage window. */
|
||||||
|
g_assert (!meta_is_wayland_compositor ());
|
||||||
|
|
||||||
|
device_event->event = stage_window;
|
||||||
|
|
||||||
|
/* As an X11 compositor, the stage window is always at 0,0, so
|
||||||
|
* using root coordinates will give us correct stage coordinates
|
||||||
|
* as well... */
|
||||||
|
device_event->event_x = device_event->root_x;
|
||||||
|
device_event->event_y = device_event->root_y;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!device_event->send_event && device_event->time != CurrentTime)
|
||||||
|
{
|
||||||
|
if (device_event->time < priv->latest_evtime)
|
||||||
|
{
|
||||||
|
/* Emulated pointer events received after XIRejectTouch is received
|
||||||
|
* on a passive touch grab will contain older timestamps, update those
|
||||||
|
* so we dont get InvalidTime at grabs.
|
||||||
|
*/
|
||||||
|
device_event->time = priv->latest_evtime;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Update the internal latest evtime, for any possible later use */
|
||||||
|
priv->latest_evtime = device_event->time;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Clutter makes the assumption that there is only one X window
|
||||||
|
* per stage, which is a valid assumption to make for a generic
|
||||||
|
* application toolkit. As such, it will ignore any events sent
|
||||||
|
* to the a stage that isn't its X window.
|
||||||
|
*
|
||||||
|
* When running as an X window manager, we need to respond to
|
||||||
|
* events from lots of windows. Trick Clutter into translating
|
||||||
|
* these events by pretending we got an event on the stage window.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
maybe_spoof_event_as_stage_event (MetaBackendX11 *x11,
|
||||||
|
XEvent *event)
|
||||||
|
{
|
||||||
|
MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
|
||||||
|
|
||||||
|
if (event->type == GenericEvent &&
|
||||||
|
event->xcookie.extension == priv->xinput_opcode)
|
||||||
|
{
|
||||||
|
XIEvent *input_event = (XIEvent *) event->xcookie.data;
|
||||||
|
|
||||||
|
switch (input_event->evtype)
|
||||||
|
{
|
||||||
|
case XI_Motion:
|
||||||
|
case XI_ButtonPress:
|
||||||
|
case XI_ButtonRelease:
|
||||||
|
case XI_KeyPress:
|
||||||
|
case XI_KeyRelease:
|
||||||
|
case XI_TouchBegin:
|
||||||
|
case XI_TouchUpdate:
|
||||||
|
case XI_TouchEnd:
|
||||||
|
translate_device_event (x11, (XIDeviceEvent *) input_event);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
keymap_changed (MetaBackend *backend)
|
||||||
|
{
|
||||||
|
MetaBackendX11 *x11 = META_BACKEND_X11 (backend);
|
||||||
|
MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
|
||||||
|
|
||||||
|
if (priv->keymap)
|
||||||
|
{
|
||||||
|
xkb_keymap_unref (priv->keymap);
|
||||||
|
priv->keymap = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_signal_emit_by_name (backend, "keymap-changed", 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
handle_host_xevent (MetaBackend *backend,
|
||||||
|
XEvent *event)
|
||||||
|
{
|
||||||
|
MetaBackendX11 *x11 = META_BACKEND_X11 (backend);
|
||||||
|
MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
|
||||||
|
gboolean bypass_clutter = FALSE;
|
||||||
|
|
||||||
|
XGetEventData (priv->xdisplay, &event->xcookie);
|
||||||
|
|
||||||
|
{
|
||||||
|
MetaDisplay *display = meta_get_display ();
|
||||||
|
|
||||||
|
if (display)
|
||||||
|
{
|
||||||
|
MetaCompositor *compositor = display->compositor;
|
||||||
|
if (meta_plugin_manager_xevent_filter (compositor->plugin_mgr, event))
|
||||||
|
bypass_clutter = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event->type == (priv->xsync_event_base + XSyncAlarmNotify))
|
||||||
|
handle_alarm_notify (backend, event);
|
||||||
|
|
||||||
|
if (event->type == priv->xkb_event_base)
|
||||||
|
{
|
||||||
|
XkbAnyEvent *xkb_ev = (XkbAnyEvent *) event;
|
||||||
|
|
||||||
|
if (xkb_ev->device == META_VIRTUAL_CORE_KEYBOARD_ID)
|
||||||
|
{
|
||||||
|
switch (xkb_ev->xkb_type)
|
||||||
|
{
|
||||||
|
case XkbNewKeyboardNotify:
|
||||||
|
case XkbMapNotify:
|
||||||
|
keymap_changed (backend);
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
MetaMonitorManager *manager = meta_backend_get_monitor_manager (backend);
|
||||||
|
if (META_IS_MONITOR_MANAGER_XRANDR (manager) &&
|
||||||
|
meta_monitor_manager_xrandr_handle_xevent (META_MONITOR_MANAGER_XRANDR (manager), event))
|
||||||
|
bypass_clutter = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!bypass_clutter)
|
||||||
|
{
|
||||||
|
maybe_spoof_event_as_stage_event (x11, event);
|
||||||
|
clutter_x11_handle_event (event);
|
||||||
|
}
|
||||||
|
|
||||||
|
XFreeEventData (priv->xdisplay, &event->xcookie);
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
GSource base;
|
||||||
|
GPollFD event_poll_fd;
|
||||||
|
MetaBackend *backend;
|
||||||
|
} XEventSource;
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
x_event_source_prepare (GSource *source,
|
||||||
|
int *timeout)
|
||||||
|
{
|
||||||
|
XEventSource *x_source = (XEventSource *) source;
|
||||||
|
MetaBackend *backend = x_source->backend;
|
||||||
|
MetaBackendX11 *x11 = META_BACKEND_X11 (backend);
|
||||||
|
MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
|
||||||
|
|
||||||
|
*timeout = -1;
|
||||||
|
|
||||||
|
return XPending (priv->xdisplay);
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
x_event_source_check (GSource *source)
|
||||||
|
{
|
||||||
|
XEventSource *x_source = (XEventSource *) source;
|
||||||
|
MetaBackend *backend = x_source->backend;
|
||||||
|
MetaBackendX11 *x11 = META_BACKEND_X11 (backend);
|
||||||
|
MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
|
||||||
|
|
||||||
|
return XPending (priv->xdisplay);
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
x_event_source_dispatch (GSource *source,
|
||||||
|
GSourceFunc callback,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
XEventSource *x_source = (XEventSource *) source;
|
||||||
|
MetaBackend *backend = x_source->backend;
|
||||||
|
MetaBackendX11 *x11 = META_BACKEND_X11 (backend);
|
||||||
|
MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
|
||||||
|
|
||||||
|
while (XPending (priv->xdisplay))
|
||||||
|
{
|
||||||
|
XEvent event;
|
||||||
|
|
||||||
|
XNextEvent (priv->xdisplay, &event);
|
||||||
|
|
||||||
|
handle_host_xevent (backend, &event);
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static GSourceFuncs x_event_funcs = {
|
||||||
|
x_event_source_prepare,
|
||||||
|
x_event_source_check,
|
||||||
|
x_event_source_dispatch,
|
||||||
|
};
|
||||||
|
|
||||||
|
static GSource *
|
||||||
|
x_event_source_new (MetaBackend *backend)
|
||||||
|
{
|
||||||
|
MetaBackendX11 *x11 = META_BACKEND_X11 (backend);
|
||||||
|
MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
|
||||||
|
GSource *source;
|
||||||
|
XEventSource *x_source;
|
||||||
|
|
||||||
|
source = g_source_new (&x_event_funcs, sizeof (XEventSource));
|
||||||
|
x_source = (XEventSource *) source;
|
||||||
|
x_source->backend = backend;
|
||||||
|
x_source->event_poll_fd.fd = ConnectionNumber (priv->xdisplay);
|
||||||
|
x_source->event_poll_fd.events = G_IO_IN;
|
||||||
|
g_source_add_poll (source, &x_source->event_poll_fd);
|
||||||
|
|
||||||
|
g_source_attach (source, NULL);
|
||||||
|
return source;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
take_touch_grab (MetaBackend *backend)
|
||||||
|
{
|
||||||
|
MetaBackendX11 *x11 = META_BACKEND_X11 (backend);
|
||||||
|
MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
|
||||||
|
unsigned char mask_bits[XIMaskLen (XI_LASTEVENT)] = { 0 };
|
||||||
|
XIEventMask mask = { META_VIRTUAL_CORE_POINTER_ID, sizeof (mask_bits), mask_bits };
|
||||||
|
XIGrabModifiers mods = { XIAnyModifier, 0 };
|
||||||
|
|
||||||
|
XISetMask (mask.mask, XI_TouchBegin);
|
||||||
|
XISetMask (mask.mask, XI_TouchUpdate);
|
||||||
|
XISetMask (mask.mask, XI_TouchEnd);
|
||||||
|
|
||||||
|
XIGrabTouchBegin (priv->xdisplay, META_VIRTUAL_CORE_POINTER_ID,
|
||||||
|
DefaultRootWindow (priv->xdisplay),
|
||||||
|
False, &mask, 1, &mods);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_backend_x11_post_init (MetaBackend *backend)
|
||||||
|
{
|
||||||
|
MetaBackendX11 *x11 = META_BACKEND_X11 (backend);
|
||||||
|
MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
|
||||||
|
int major, minor;
|
||||||
|
|
||||||
|
priv->xdisplay = clutter_x11_get_default_display ();
|
||||||
|
|
||||||
|
priv->source = x_event_source_new (backend);
|
||||||
|
|
||||||
|
if (!XSyncQueryExtension (priv->xdisplay, &priv->xsync_event_base, &priv->xsync_error_base) ||
|
||||||
|
!XSyncInitialize (priv->xdisplay, &major, &minor))
|
||||||
|
meta_fatal ("Could not initialize XSync");
|
||||||
|
|
||||||
|
{
|
||||||
|
int major = 2, minor = 3;
|
||||||
|
gboolean has_xi = FALSE;
|
||||||
|
|
||||||
|
if (XQueryExtension (priv->xdisplay,
|
||||||
|
"XInputExtension",
|
||||||
|
&priv->xinput_opcode,
|
||||||
|
&priv->xinput_error_base,
|
||||||
|
&priv->xinput_event_base))
|
||||||
|
{
|
||||||
|
if (XIQueryVersion (priv->xdisplay, &major, &minor) == Success)
|
||||||
|
{
|
||||||
|
int version = (major * 10) + minor;
|
||||||
|
if (version >= 22)
|
||||||
|
has_xi = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!has_xi)
|
||||||
|
meta_fatal ("X server doesn't have the XInput extension, version 2.2 or newer\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
take_touch_grab (backend);
|
||||||
|
|
||||||
|
priv->xcb = XGetXCBConnection (priv->xdisplay);
|
||||||
|
if (!xkb_x11_setup_xkb_extension (priv->xcb,
|
||||||
|
XKB_X11_MIN_MAJOR_XKB_VERSION,
|
||||||
|
XKB_X11_MIN_MINOR_XKB_VERSION,
|
||||||
|
XKB_X11_SETUP_XKB_EXTENSION_NO_FLAGS,
|
||||||
|
NULL, NULL,
|
||||||
|
&priv->xkb_event_base,
|
||||||
|
&priv->xkb_error_base))
|
||||||
|
meta_fatal ("X server doesn't have the XKB extension, version %d.%d or newer\n",
|
||||||
|
XKB_X11_MIN_MAJOR_XKB_VERSION, XKB_X11_MIN_MINOR_XKB_VERSION);
|
||||||
|
|
||||||
|
META_BACKEND_CLASS (meta_backend_x11_parent_class)->post_init (backend);
|
||||||
|
}
|
||||||
|
|
||||||
|
static MetaIdleMonitor *
|
||||||
|
meta_backend_x11_create_idle_monitor (MetaBackend *backend,
|
||||||
|
int device_id)
|
||||||
|
{
|
||||||
|
return g_object_new (META_TYPE_IDLE_MONITOR_XSYNC,
|
||||||
|
"device-id", device_id,
|
||||||
|
NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static MetaMonitorManager *
|
||||||
|
meta_backend_x11_create_monitor_manager (MetaBackend *backend)
|
||||||
|
{
|
||||||
|
/* If we're a Wayland compositor using the X11 backend,
|
||||||
|
* we're a nested configuration, so return the dummy
|
||||||
|
* monitor setup. */
|
||||||
|
if (meta_is_wayland_compositor ())
|
||||||
|
return g_object_new (META_TYPE_MONITOR_MANAGER_DUMMY, NULL);
|
||||||
|
|
||||||
|
return g_object_new (META_TYPE_MONITOR_MANAGER_XRANDR, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static MetaCursorRenderer *
|
||||||
|
meta_backend_x11_create_cursor_renderer (MetaBackend *backend)
|
||||||
|
{
|
||||||
|
return g_object_new (META_TYPE_CURSOR_RENDERER_X11, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
meta_backend_x11_grab_device (MetaBackend *backend,
|
||||||
|
int device_id,
|
||||||
|
uint32_t timestamp)
|
||||||
|
{
|
||||||
|
MetaBackendX11 *x11 = META_BACKEND_X11 (backend);
|
||||||
|
MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
|
||||||
|
unsigned char mask_bits[XIMaskLen (XI_LASTEVENT)] = { 0 };
|
||||||
|
XIEventMask mask = { XIAllMasterDevices, sizeof (mask_bits), mask_bits };
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (timestamp != CurrentTime)
|
||||||
|
timestamp = MAX (timestamp, priv->latest_evtime);
|
||||||
|
|
||||||
|
XISetMask (mask.mask, XI_ButtonPress);
|
||||||
|
XISetMask (mask.mask, XI_ButtonRelease);
|
||||||
|
XISetMask (mask.mask, XI_Enter);
|
||||||
|
XISetMask (mask.mask, XI_Leave);
|
||||||
|
XISetMask (mask.mask, XI_Motion);
|
||||||
|
XISetMask (mask.mask, XI_KeyPress);
|
||||||
|
XISetMask (mask.mask, XI_KeyRelease);
|
||||||
|
|
||||||
|
ret = XIGrabDevice (priv->xdisplay, device_id,
|
||||||
|
meta_backend_x11_get_xwindow (x11),
|
||||||
|
timestamp,
|
||||||
|
None,
|
||||||
|
XIGrabModeAsync, XIGrabModeAsync,
|
||||||
|
False, /* owner_events */
|
||||||
|
&mask);
|
||||||
|
|
||||||
|
return (ret == Success);
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
meta_backend_x11_ungrab_device (MetaBackend *backend,
|
||||||
|
int device_id,
|
||||||
|
uint32_t timestamp)
|
||||||
|
{
|
||||||
|
MetaBackendX11 *x11 = META_BACKEND_X11 (backend);
|
||||||
|
MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = XIUngrabDevice (priv->xdisplay, device_id, timestamp);
|
||||||
|
|
||||||
|
return (ret == Success);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_backend_x11_warp_pointer (MetaBackend *backend,
|
||||||
|
int x,
|
||||||
|
int y)
|
||||||
|
{
|
||||||
|
MetaBackendX11 *x11 = META_BACKEND_X11 (backend);
|
||||||
|
MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
|
||||||
|
|
||||||
|
XIWarpPointer (priv->xdisplay,
|
||||||
|
META_VIRTUAL_CORE_POINTER_ID,
|
||||||
|
None,
|
||||||
|
meta_backend_x11_get_xwindow (x11),
|
||||||
|
0, 0, 0, 0,
|
||||||
|
x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
get_xkbrf_var_defs (Display *xdisplay,
|
||||||
|
const char *layouts,
|
||||||
|
const char *variants,
|
||||||
|
const char *options,
|
||||||
|
char **rules_p,
|
||||||
|
XkbRF_VarDefsRec *var_defs)
|
||||||
|
{
|
||||||
|
char *rules = NULL;
|
||||||
|
|
||||||
|
/* Get it from the X property or fallback on defaults */
|
||||||
|
if (!XkbRF_GetNamesProp (xdisplay, &rules, var_defs) || !rules)
|
||||||
|
{
|
||||||
|
rules = strdup (DEFAULT_XKB_RULES_FILE);
|
||||||
|
var_defs->model = strdup (DEFAULT_XKB_MODEL);
|
||||||
|
var_defs->layout = NULL;
|
||||||
|
var_defs->variant = NULL;
|
||||||
|
var_defs->options = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Swap in our new options... */
|
||||||
|
free (var_defs->layout);
|
||||||
|
var_defs->layout = strdup (layouts);
|
||||||
|
free (var_defs->variant);
|
||||||
|
var_defs->variant = strdup (variants);
|
||||||
|
free (var_defs->options);
|
||||||
|
var_defs->options = strdup (options);
|
||||||
|
|
||||||
|
/* Sometimes, the property is a file path, and sometimes it's
|
||||||
|
not. Normalize it so it's always a file path. */
|
||||||
|
if (rules[0] == '/')
|
||||||
|
*rules_p = g_strdup (rules);
|
||||||
|
else
|
||||||
|
*rules_p = g_build_filename (XKB_BASE, "rules", rules, NULL);
|
||||||
|
|
||||||
|
free (rules);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
free_xkbrf_var_defs (XkbRF_VarDefsRec *var_defs)
|
||||||
|
{
|
||||||
|
free (var_defs->model);
|
||||||
|
free (var_defs->layout);
|
||||||
|
free (var_defs->variant);
|
||||||
|
free (var_defs->options);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
free_xkb_component_names (XkbComponentNamesRec *p)
|
||||||
|
{
|
||||||
|
free (p->keymap);
|
||||||
|
free (p->keycodes);
|
||||||
|
free (p->types);
|
||||||
|
free (p->compat);
|
||||||
|
free (p->symbols);
|
||||||
|
free (p->geometry);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
upload_xkb_description (Display *xdisplay,
|
||||||
|
const gchar *rules_file_path,
|
||||||
|
XkbRF_VarDefsRec *var_defs,
|
||||||
|
XkbComponentNamesRec *comp_names)
|
||||||
|
{
|
||||||
|
XkbDescRec *xkb_desc;
|
||||||
|
gchar *rules_file;
|
||||||
|
|
||||||
|
/* Upload it to the X server using the same method as setxkbmap */
|
||||||
|
xkb_desc = XkbGetKeyboardByName (xdisplay,
|
||||||
|
XkbUseCoreKbd,
|
||||||
|
comp_names,
|
||||||
|
XkbGBN_AllComponentsMask,
|
||||||
|
XkbGBN_AllComponentsMask &
|
||||||
|
(~XkbGBN_GeometryMask), True);
|
||||||
|
if (!xkb_desc)
|
||||||
|
{
|
||||||
|
g_warning ("Couldn't upload new XKB keyboard description");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
XkbFreeKeyboard (xkb_desc, 0, True);
|
||||||
|
|
||||||
|
rules_file = g_path_get_basename (rules_file_path);
|
||||||
|
|
||||||
|
if (!XkbRF_SetNamesProp (xdisplay, rules_file, var_defs))
|
||||||
|
g_warning ("Couldn't update the XKB root window property");
|
||||||
|
|
||||||
|
g_free (rules_file);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_backend_x11_set_keymap (MetaBackend *backend,
|
||||||
|
const char *layouts,
|
||||||
|
const char *variants,
|
||||||
|
const char *options)
|
||||||
|
{
|
||||||
|
MetaBackendX11 *x11 = META_BACKEND_X11 (backend);
|
||||||
|
MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
|
||||||
|
XkbRF_RulesRec *xkb_rules;
|
||||||
|
XkbRF_VarDefsRec xkb_var_defs = { 0 };
|
||||||
|
gchar *rules_file_path;
|
||||||
|
|
||||||
|
get_xkbrf_var_defs (priv->xdisplay,
|
||||||
|
layouts,
|
||||||
|
variants,
|
||||||
|
options,
|
||||||
|
&rules_file_path,
|
||||||
|
&xkb_var_defs);
|
||||||
|
|
||||||
|
xkb_rules = XkbRF_Load (rules_file_path, NULL, True, True);
|
||||||
|
if (xkb_rules)
|
||||||
|
{
|
||||||
|
XkbComponentNamesRec xkb_comp_names = { 0 };
|
||||||
|
|
||||||
|
XkbRF_GetComponents (xkb_rules, &xkb_var_defs, &xkb_comp_names);
|
||||||
|
upload_xkb_description (priv->xdisplay, rules_file_path, &xkb_var_defs, &xkb_comp_names);
|
||||||
|
|
||||||
|
free_xkb_component_names (&xkb_comp_names);
|
||||||
|
XkbRF_Free (xkb_rules, True);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
g_warning ("Couldn't load XKB rules");
|
||||||
|
}
|
||||||
|
|
||||||
|
free_xkbrf_var_defs (&xkb_var_defs);
|
||||||
|
g_free (rules_file_path);
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct xkb_keymap *
|
||||||
|
meta_backend_x11_get_keymap (MetaBackend *backend)
|
||||||
|
{
|
||||||
|
MetaBackendX11 *x11 = META_BACKEND_X11 (backend);
|
||||||
|
MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
|
||||||
|
|
||||||
|
if (priv->keymap == NULL)
|
||||||
|
{
|
||||||
|
struct xkb_context *context = xkb_context_new (XKB_CONTEXT_NO_FLAGS);
|
||||||
|
priv->keymap = xkb_x11_keymap_new_from_device (context,
|
||||||
|
priv->xcb,
|
||||||
|
xkb_x11_get_core_keyboard_device_id (priv->xcb),
|
||||||
|
XKB_KEYMAP_COMPILE_NO_FLAGS);
|
||||||
|
xkb_context_unref (context);
|
||||||
|
}
|
||||||
|
|
||||||
|
return priv->keymap;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_backend_x11_lock_layout_group (MetaBackend *backend,
|
||||||
|
guint idx)
|
||||||
|
{
|
||||||
|
MetaBackendX11 *x11 = META_BACKEND_X11 (backend);
|
||||||
|
MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
|
||||||
|
|
||||||
|
XkbLockGroup (priv->xdisplay, XkbUseCoreKbd, idx);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_backend_x11_update_screen_size (MetaBackend *backend,
|
||||||
|
int width, int height)
|
||||||
|
{
|
||||||
|
MetaBackendX11 *x11 = META_BACKEND_X11 (backend);
|
||||||
|
MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
|
||||||
|
Window xwin = meta_backend_x11_get_xwindow (x11);
|
||||||
|
XResizeWindow (priv->xdisplay, xwin, width, height);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_backend_x11_select_stage_events (MetaBackend *backend)
|
||||||
|
{
|
||||||
|
MetaBackendX11 *x11 = META_BACKEND_X11 (backend);
|
||||||
|
MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
|
||||||
|
Window xwin = meta_backend_x11_get_xwindow (x11);
|
||||||
|
unsigned char mask_bits[XIMaskLen (XI_LASTEVENT)] = { 0 };
|
||||||
|
XIEventMask mask = { XIAllMasterDevices, sizeof (mask_bits), mask_bits };
|
||||||
|
|
||||||
|
XISetMask (mask.mask, XI_KeyPress);
|
||||||
|
XISetMask (mask.mask, XI_KeyRelease);
|
||||||
|
XISetMask (mask.mask, XI_ButtonPress);
|
||||||
|
XISetMask (mask.mask, XI_ButtonRelease);
|
||||||
|
XISetMask (mask.mask, XI_Enter);
|
||||||
|
XISetMask (mask.mask, XI_Leave);
|
||||||
|
XISetMask (mask.mask, XI_FocusIn);
|
||||||
|
XISetMask (mask.mask, XI_FocusOut);
|
||||||
|
XISetMask (mask.mask, XI_Motion);
|
||||||
|
XIClearMask (mask.mask, XI_TouchBegin);
|
||||||
|
XIClearMask (mask.mask, XI_TouchEnd);
|
||||||
|
XIClearMask (mask.mask, XI_TouchUpdate);
|
||||||
|
XISelectEvents (priv->xdisplay, xwin, &mask, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_backend_x11_class_init (MetaBackendX11Class *klass)
|
||||||
|
{
|
||||||
|
MetaBackendClass *backend_class = META_BACKEND_CLASS (klass);
|
||||||
|
|
||||||
|
backend_class->post_init = meta_backend_x11_post_init;
|
||||||
|
backend_class->create_idle_monitor = meta_backend_x11_create_idle_monitor;
|
||||||
|
backend_class->create_monitor_manager = meta_backend_x11_create_monitor_manager;
|
||||||
|
backend_class->create_cursor_renderer = meta_backend_x11_create_cursor_renderer;
|
||||||
|
backend_class->grab_device = meta_backend_x11_grab_device;
|
||||||
|
backend_class->ungrab_device = meta_backend_x11_ungrab_device;
|
||||||
|
backend_class->warp_pointer = meta_backend_x11_warp_pointer;
|
||||||
|
backend_class->set_keymap = meta_backend_x11_set_keymap;
|
||||||
|
backend_class->get_keymap = meta_backend_x11_get_keymap;
|
||||||
|
backend_class->lock_layout_group = meta_backend_x11_lock_layout_group;
|
||||||
|
backend_class->update_screen_size = meta_backend_x11_update_screen_size;
|
||||||
|
backend_class->select_stage_events = meta_backend_x11_select_stage_events;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_backend_x11_init (MetaBackendX11 *x11)
|
||||||
|
{
|
||||||
|
/* We do X11 event retrieval ourselves */
|
||||||
|
clutter_x11_disable_event_retrieval ();
|
||||||
|
}
|
||||||
|
|
||||||
|
Display *
|
||||||
|
meta_backend_x11_get_xdisplay (MetaBackendX11 *x11)
|
||||||
|
{
|
||||||
|
MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
|
||||||
|
|
||||||
|
return priv->xdisplay;
|
||||||
|
}
|
||||||
|
|
||||||
|
Window
|
||||||
|
meta_backend_x11_get_xwindow (MetaBackendX11 *x11)
|
||||||
|
{
|
||||||
|
ClutterActor *stage = meta_backend_get_stage (META_BACKEND (x11));
|
||||||
|
return clutter_x11_get_stage_window (CLUTTER_STAGE (stage));
|
||||||
|
}
|
||||||
58
src/backends/x11/meta-backend-x11.h
Normal file
58
src/backends/x11/meta-backend-x11.h
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2014 Red Hat
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
|
*
|
||||||
|
* Written by:
|
||||||
|
* Jasper St. Pierre <jstpierre@mecheye.net>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef META_BACKEND_X11_H
|
||||||
|
#define META_BACKEND_X11_H
|
||||||
|
|
||||||
|
#include "backends/meta-backend-private.h"
|
||||||
|
|
||||||
|
#include <X11/Xlib.h>
|
||||||
|
|
||||||
|
#define META_TYPE_BACKEND_X11 (meta_backend_x11_get_type ())
|
||||||
|
#define META_BACKEND_X11(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_BACKEND_X11, MetaBackendX11))
|
||||||
|
#define META_BACKEND_X11_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_BACKEND_X11, MetaBackendX11Class))
|
||||||
|
#define META_IS_BACKEND_X11(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_BACKEND_X11))
|
||||||
|
#define META_IS_BACKEND_X11_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_BACKEND_X11))
|
||||||
|
#define META_BACKEND_X11_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), META_TYPE_BACKEND_X11, MetaBackendX11Class))
|
||||||
|
|
||||||
|
typedef struct _MetaBackendX11 MetaBackendX11;
|
||||||
|
typedef struct _MetaBackendX11Class MetaBackendX11Class;
|
||||||
|
|
||||||
|
struct _MetaBackendX11
|
||||||
|
{
|
||||||
|
MetaBackend parent;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct _MetaBackendX11Class
|
||||||
|
{
|
||||||
|
MetaBackendClass parent_class;
|
||||||
|
};
|
||||||
|
|
||||||
|
GType meta_backend_x11_get_type (void) G_GNUC_CONST;
|
||||||
|
|
||||||
|
Display * meta_backend_x11_get_xdisplay (MetaBackendX11 *backend);
|
||||||
|
|
||||||
|
Window meta_backend_x11_get_xwindow (MetaBackendX11 *backend);
|
||||||
|
|
||||||
|
#endif /* META_BACKEND_X11_H */
|
||||||
99
src/backends/x11/meta-cursor-renderer-x11.c
Normal file
99
src/backends/x11/meta-cursor-renderer-x11.c
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2014 Red Hat
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
|
*
|
||||||
|
* Written by:
|
||||||
|
* Jasper St. Pierre <jstpierre@mecheye.net>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#include "meta-cursor-renderer-x11.h"
|
||||||
|
|
||||||
|
#include "meta-backend-x11.h"
|
||||||
|
#include "meta-stage.h"
|
||||||
|
|
||||||
|
struct _MetaCursorRendererX11Private
|
||||||
|
{
|
||||||
|
gboolean server_cursor_visible;
|
||||||
|
};
|
||||||
|
typedef struct _MetaCursorRendererX11Private MetaCursorRendererX11Private;
|
||||||
|
|
||||||
|
G_DEFINE_TYPE_WITH_PRIVATE (MetaCursorRendererX11, meta_cursor_renderer_x11, META_TYPE_CURSOR_RENDERER);
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
meta_cursor_renderer_x11_update_cursor (MetaCursorRenderer *renderer)
|
||||||
|
{
|
||||||
|
MetaCursorRendererX11 *x11 = META_CURSOR_RENDERER_X11 (renderer);
|
||||||
|
MetaCursorRendererX11Private *priv = meta_cursor_renderer_x11_get_instance_private (x11);
|
||||||
|
|
||||||
|
MetaBackendX11 *backend = META_BACKEND_X11 (meta_get_backend ());
|
||||||
|
Window xwindow = meta_backend_x11_get_xwindow (backend);
|
||||||
|
|
||||||
|
if (xwindow == None)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
Display *xdisplay = meta_backend_x11_get_xdisplay (backend);
|
||||||
|
|
||||||
|
MetaCursorReference *cursor_ref = meta_cursor_renderer_get_cursor (renderer);
|
||||||
|
gboolean has_server_cursor = FALSE;
|
||||||
|
|
||||||
|
if (cursor_ref)
|
||||||
|
{
|
||||||
|
MetaCursor cursor = meta_cursor_reference_get_meta_cursor (cursor_ref);
|
||||||
|
if (cursor != META_CURSOR_NONE)
|
||||||
|
{
|
||||||
|
Cursor xcursor = meta_cursor_create_x_cursor (xdisplay, cursor);
|
||||||
|
XDefineCursor (xdisplay, xwindow, xcursor);
|
||||||
|
XFlush (xdisplay);
|
||||||
|
XFreeCursor (xdisplay, xcursor);
|
||||||
|
|
||||||
|
has_server_cursor = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (has_server_cursor != priv->server_cursor_visible)
|
||||||
|
{
|
||||||
|
if (has_server_cursor)
|
||||||
|
XFixesShowCursor (xdisplay, xwindow);
|
||||||
|
else
|
||||||
|
XFixesHideCursor (xdisplay, xwindow);
|
||||||
|
|
||||||
|
priv->server_cursor_visible = has_server_cursor;
|
||||||
|
}
|
||||||
|
|
||||||
|
return priv->server_cursor_visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_cursor_renderer_x11_class_init (MetaCursorRendererX11Class *klass)
|
||||||
|
{
|
||||||
|
MetaCursorRendererClass *renderer_class = META_CURSOR_RENDERER_CLASS (klass);
|
||||||
|
|
||||||
|
renderer_class->update_cursor = meta_cursor_renderer_x11_update_cursor;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_cursor_renderer_x11_init (MetaCursorRendererX11 *x11)
|
||||||
|
{
|
||||||
|
MetaCursorRendererX11Private *priv = meta_cursor_renderer_x11_get_instance_private (x11);
|
||||||
|
|
||||||
|
/* XFixes has no way to retrieve the current cursor visibility. */
|
||||||
|
priv->server_cursor_visible = TRUE;
|
||||||
|
}
|
||||||
52
src/backends/x11/meta-cursor-renderer-x11.h
Normal file
52
src/backends/x11/meta-cursor-renderer-x11.h
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2014 Red Hat
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
|
*
|
||||||
|
* Written by:
|
||||||
|
* Jasper St. Pierre <jstpierre@mecheye.net>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef META_CURSOR_RENDERER_X11_H
|
||||||
|
#define META_CURSOR_RENDERER_X11_H
|
||||||
|
|
||||||
|
#include "meta-cursor-renderer.h"
|
||||||
|
|
||||||
|
#define META_TYPE_CURSOR_RENDERER_X11 (meta_cursor_renderer_x11_get_type ())
|
||||||
|
#define META_CURSOR_RENDERER_X11(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_CURSOR_RENDERER_X11, MetaCursorRendererX11))
|
||||||
|
#define META_CURSOR_RENDERER_X11_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_CURSOR_RENDERER_X11, MetaCursorRendererX11Class))
|
||||||
|
#define META_IS_CURSOR_RENDERER_X11(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_CURSOR_RENDERER_X11))
|
||||||
|
#define META_IS_CURSOR_RENDERER_X11_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_CURSOR_RENDERER_X11))
|
||||||
|
#define META_CURSOR_RENDERER_X11_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), META_TYPE_CURSOR_RENDERER_X11, MetaCursorRendererX11Class))
|
||||||
|
|
||||||
|
typedef struct _MetaCursorRendererX11 MetaCursorRendererX11;
|
||||||
|
typedef struct _MetaCursorRendererX11Class MetaCursorRendererX11Class;
|
||||||
|
|
||||||
|
struct _MetaCursorRendererX11
|
||||||
|
{
|
||||||
|
MetaCursorRenderer parent;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct _MetaCursorRendererX11Class
|
||||||
|
{
|
||||||
|
MetaCursorRendererClass parent_class;
|
||||||
|
};
|
||||||
|
|
||||||
|
GType meta_cursor_renderer_x11_get_type (void) G_GNUC_CONST;
|
||||||
|
|
||||||
|
#endif /* META_CURSOR_RENDERER_X11_H */
|
||||||
@@ -25,8 +25,7 @@
|
|||||||
#include "meta-idle-monitor-xsync.h"
|
#include "meta-idle-monitor-xsync.h"
|
||||||
#include "meta-idle-monitor-private.h"
|
#include "meta-idle-monitor-private.h"
|
||||||
|
|
||||||
#include <meta/util.h>
|
#include "meta-backend-x11.h"
|
||||||
#include "display-private.h"
|
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
@@ -191,10 +190,9 @@ static void
|
|||||||
meta_idle_monitor_xsync_constructed (GObject *object)
|
meta_idle_monitor_xsync_constructed (GObject *object)
|
||||||
{
|
{
|
||||||
MetaIdleMonitorXSync *monitor_xsync = META_IDLE_MONITOR_XSYNC (object);
|
MetaIdleMonitorXSync *monitor_xsync = META_IDLE_MONITOR_XSYNC (object);
|
||||||
|
MetaBackendX11 *backend = META_BACKEND_X11 (meta_get_backend ());
|
||||||
|
|
||||||
g_assert (!meta_is_wayland_compositor ());
|
monitor_xsync->display = meta_backend_x11_get_xdisplay (backend);
|
||||||
|
|
||||||
monitor_xsync->display = meta_get_display ()->xdisplay;
|
|
||||||
init_xsync (monitor_xsync);
|
init_xsync (monitor_xsync);
|
||||||
|
|
||||||
G_OBJECT_CLASS (meta_idle_monitor_xsync_parent_class)->constructed (object);
|
G_OBJECT_CLASS (meta_idle_monitor_xsync_parent_class)->constructed (object);
|
||||||
@@ -291,7 +289,10 @@ meta_idle_monitor_xsync_make_watch (MetaIdleMonitor *monitor,
|
|||||||
g_hash_table_add (monitor_xsync->alarms, (gpointer) watch_xsync->xalarm);
|
g_hash_table_add (monitor_xsync->alarms, (gpointer) watch_xsync->xalarm);
|
||||||
|
|
||||||
if (meta_idle_monitor_get_idletime (monitor) > (gint64)timeout_msec)
|
if (meta_idle_monitor_get_idletime (monitor) > (gint64)timeout_msec)
|
||||||
watch->idle_source_id = g_idle_add (fire_watch_idle, watch);
|
{
|
||||||
|
watch->idle_source_id = g_idle_add (fire_watch_idle, watch);
|
||||||
|
g_source_set_name_by_id (watch->idle_source_id, "[mutter] fire_watch_idle");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -44,6 +44,4 @@ GType meta_idle_monitor_xsync_get_type (void);
|
|||||||
void meta_idle_monitor_xsync_handle_xevent (MetaIdleMonitor *monitor,
|
void meta_idle_monitor_xsync_handle_xevent (MetaIdleMonitor *monitor,
|
||||||
XSyncAlarmNotifyEvent *xevent);
|
XSyncAlarmNotifyEvent *xevent);
|
||||||
|
|
||||||
void meta_idle_monitor_xsync_handle_xevent_all (XEvent *xevent);
|
|
||||||
|
|
||||||
#endif /* META_IDLE_MONITOR_XSYNC_H */
|
#endif /* META_IDLE_MONITOR_XSYNC_H */
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2001, 2002 Havoc Pennington
|
* Copyright (C) 2001, 2002 Havoc Pennington
|
||||||
* Copyright (C) 2002, 2003 Red Hat Inc.
|
* Copyright (C) 2002, 2003 Red Hat Inc.
|
||||||
* Some ICCCM manager selection code derived from fvwm2,
|
* Some ICCCM manager selection code derived from fvwm2,
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
* Copyright (C) 2003 Rob Adams
|
* Copyright (C) 2003 Rob Adams
|
||||||
* Copyright (C) 2004-2006 Elijah Newren
|
* Copyright (C) 2004-2006 Elijah Newren
|
||||||
* Copyright (C) 2013 Red Hat Inc.
|
* Copyright (C) 2013 Red Hat Inc.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License as
|
* modify it under the terms of the GNU General Public License as
|
||||||
* published by the Free Software Foundation; either version 2 of the
|
* published by the Free Software Foundation; either version 2 of the
|
||||||
@@ -18,7 +18,7 @@
|
|||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
@@ -35,13 +35,16 @@
|
|||||||
#include <X11/Xatom.h>
|
#include <X11/Xatom.h>
|
||||||
#include <X11/extensions/Xrandr.h>
|
#include <X11/extensions/Xrandr.h>
|
||||||
#include <X11/extensions/dpms.h>
|
#include <X11/extensions/dpms.h>
|
||||||
|
#include <X11/Xlib-xcb.h>
|
||||||
|
#include <xcb/randr.h>
|
||||||
|
|
||||||
|
#include "meta-backend-x11.h"
|
||||||
#include <meta/main.h>
|
#include <meta/main.h>
|
||||||
#include <meta/errors.h>
|
#include <meta/errors.h>
|
||||||
#include "edid.h"
|
#include "edid.h"
|
||||||
#include "meta-monitor-config.h"
|
#include "meta-monitor-config.h"
|
||||||
|
|
||||||
#define ALL_WL_TRANSFORMS ((1 << (WL_OUTPUT_TRANSFORM_FLIPPED_270 + 1)) - 1)
|
#define ALL_TRANSFORMS ((1 << (META_MONITOR_TRANSFORM_FLIPPED_270 + 1)) - 1)
|
||||||
|
|
||||||
/* Look for DPI_FALLBACK in:
|
/* Look for DPI_FALLBACK in:
|
||||||
* http://git.gnome.org/browse/gnome-settings-daemon/tree/plugins/xsettings/gsd-xsettings-manager.c
|
* http://git.gnome.org/browse/gnome-settings-daemon/tree/plugins/xsettings/gsd-xsettings-manager.c
|
||||||
@@ -66,31 +69,31 @@ struct _MetaMonitorManagerXrandrClass
|
|||||||
|
|
||||||
G_DEFINE_TYPE (MetaMonitorManagerXrandr, meta_monitor_manager_xrandr, META_TYPE_MONITOR_MANAGER);
|
G_DEFINE_TYPE (MetaMonitorManagerXrandr, meta_monitor_manager_xrandr, META_TYPE_MONITOR_MANAGER);
|
||||||
|
|
||||||
static enum wl_output_transform
|
static MetaMonitorTransform
|
||||||
wl_transform_from_xrandr (Rotation rotation)
|
meta_monitor_transform_from_xrandr (Rotation rotation)
|
||||||
{
|
{
|
||||||
static const enum wl_output_transform y_reflected_map[4] = {
|
static const MetaMonitorTransform y_reflected_map[4] = {
|
||||||
WL_OUTPUT_TRANSFORM_FLIPPED_180,
|
META_MONITOR_TRANSFORM_FLIPPED_180,
|
||||||
WL_OUTPUT_TRANSFORM_FLIPPED_90,
|
META_MONITOR_TRANSFORM_FLIPPED_90,
|
||||||
WL_OUTPUT_TRANSFORM_FLIPPED,
|
META_MONITOR_TRANSFORM_FLIPPED,
|
||||||
WL_OUTPUT_TRANSFORM_FLIPPED_270
|
META_MONITOR_TRANSFORM_FLIPPED_270
|
||||||
};
|
};
|
||||||
enum wl_output_transform ret;
|
MetaMonitorTransform ret;
|
||||||
|
|
||||||
switch (rotation & 0x7F)
|
switch (rotation & 0x7F)
|
||||||
{
|
{
|
||||||
default:
|
default:
|
||||||
case RR_Rotate_0:
|
case RR_Rotate_0:
|
||||||
ret = WL_OUTPUT_TRANSFORM_NORMAL;
|
ret = META_MONITOR_TRANSFORM_NORMAL;
|
||||||
break;
|
break;
|
||||||
case RR_Rotate_90:
|
case RR_Rotate_90:
|
||||||
ret = WL_OUTPUT_TRANSFORM_90;
|
ret = META_MONITOR_TRANSFORM_90;
|
||||||
break;
|
break;
|
||||||
case RR_Rotate_180:
|
case RR_Rotate_180:
|
||||||
ret = WL_OUTPUT_TRANSFORM_180;
|
ret = META_MONITOR_TRANSFORM_180;
|
||||||
break;
|
break;
|
||||||
case RR_Rotate_270:
|
case RR_Rotate_270:
|
||||||
ret = WL_OUTPUT_TRANSFORM_270;
|
ret = META_MONITOR_TRANSFORM_270;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -104,53 +107,53 @@ wl_transform_from_xrandr (Rotation rotation)
|
|||||||
|
|
||||||
#define ALL_ROTATIONS (RR_Rotate_0 | RR_Rotate_90 | RR_Rotate_180 | RR_Rotate_270)
|
#define ALL_ROTATIONS (RR_Rotate_0 | RR_Rotate_90 | RR_Rotate_180 | RR_Rotate_270)
|
||||||
|
|
||||||
static unsigned int
|
static MetaMonitorTransform
|
||||||
wl_transform_from_xrandr_all (Rotation rotation)
|
meta_monitor_transform_from_xrandr_all (Rotation rotation)
|
||||||
{
|
{
|
||||||
unsigned ret;
|
unsigned ret;
|
||||||
|
|
||||||
/* Handle the common cases first (none or all) */
|
/* Handle the common cases first (none or all) */
|
||||||
if (rotation == 0 || rotation == RR_Rotate_0)
|
if (rotation == 0 || rotation == RR_Rotate_0)
|
||||||
return (1 << WL_OUTPUT_TRANSFORM_NORMAL);
|
return (1 << META_MONITOR_TRANSFORM_NORMAL);
|
||||||
|
|
||||||
/* All rotations and one reflection -> all of them by composition */
|
/* All rotations and one reflection -> all of them by composition */
|
||||||
if ((rotation & ALL_ROTATIONS) &&
|
if ((rotation & ALL_ROTATIONS) &&
|
||||||
((rotation & RR_Reflect_X) || (rotation & RR_Reflect_Y)))
|
((rotation & RR_Reflect_X) || (rotation & RR_Reflect_Y)))
|
||||||
return ALL_WL_TRANSFORMS;
|
return ALL_TRANSFORMS;
|
||||||
|
|
||||||
ret = 1 << WL_OUTPUT_TRANSFORM_NORMAL;
|
ret = 1 << META_MONITOR_TRANSFORM_NORMAL;
|
||||||
if (rotation & RR_Rotate_90)
|
if (rotation & RR_Rotate_90)
|
||||||
ret |= 1 << WL_OUTPUT_TRANSFORM_90;
|
ret |= 1 << META_MONITOR_TRANSFORM_90;
|
||||||
if (rotation & RR_Rotate_180)
|
if (rotation & RR_Rotate_180)
|
||||||
ret |= 1 << WL_OUTPUT_TRANSFORM_180;
|
ret |= 1 << META_MONITOR_TRANSFORM_180;
|
||||||
if (rotation & RR_Rotate_270)
|
if (rotation & RR_Rotate_270)
|
||||||
ret |= 1 << WL_OUTPUT_TRANSFORM_270;
|
ret |= 1 << META_MONITOR_TRANSFORM_270;
|
||||||
if (rotation & (RR_Rotate_0 | RR_Reflect_X))
|
if (rotation & (RR_Rotate_0 | RR_Reflect_X))
|
||||||
ret |= 1 << WL_OUTPUT_TRANSFORM_FLIPPED;
|
ret |= 1 << META_MONITOR_TRANSFORM_FLIPPED;
|
||||||
if (rotation & (RR_Rotate_90 | RR_Reflect_X))
|
if (rotation & (RR_Rotate_90 | RR_Reflect_X))
|
||||||
ret |= 1 << WL_OUTPUT_TRANSFORM_FLIPPED_90;
|
ret |= 1 << META_MONITOR_TRANSFORM_FLIPPED_90;
|
||||||
if (rotation & (RR_Rotate_180 | RR_Reflect_X))
|
if (rotation & (RR_Rotate_180 | RR_Reflect_X))
|
||||||
ret |= 1 << WL_OUTPUT_TRANSFORM_FLIPPED_180;
|
ret |= 1 << META_MONITOR_TRANSFORM_FLIPPED_180;
|
||||||
if (rotation & (RR_Rotate_270 | RR_Reflect_X))
|
if (rotation & (RR_Rotate_270 | RR_Reflect_X))
|
||||||
ret |= 1 << WL_OUTPUT_TRANSFORM_FLIPPED_270;
|
ret |= 1 << META_MONITOR_TRANSFORM_FLIPPED_270;
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
output_get_presentation_xrandr (MetaMonitorManagerXrandr *manager_xrandr,
|
output_get_boolean_property (MetaMonitorManagerXrandr *manager_xrandr,
|
||||||
MetaOutput *output)
|
MetaOutput *output, const char *propname)
|
||||||
{
|
{
|
||||||
MetaDisplay *display = meta_get_display ();
|
|
||||||
gboolean value;
|
gboolean value;
|
||||||
Atom actual_type;
|
Atom atom, actual_type;
|
||||||
int actual_format;
|
int actual_format;
|
||||||
unsigned long nitems, bytes_after;
|
unsigned long nitems, bytes_after;
|
||||||
unsigned char *buffer;
|
unsigned char *buffer;
|
||||||
|
|
||||||
|
atom = XInternAtom (manager_xrandr->xdisplay, propname, False);
|
||||||
XRRGetOutputProperty (manager_xrandr->xdisplay,
|
XRRGetOutputProperty (manager_xrandr->xdisplay,
|
||||||
(XID)output->output_id,
|
(XID)output->winsys_id,
|
||||||
display->atom__MUTTER_PRESENTATION_OUTPUT,
|
atom,
|
||||||
0, G_MAXLONG, False, False, XA_CARDINAL,
|
0, G_MAXLONG, False, False, XA_CARDINAL,
|
||||||
&actual_type, &actual_format,
|
&actual_type, &actual_format,
|
||||||
&nitems, &bytes_after, &buffer);
|
&nitems, &bytes_after, &buffer);
|
||||||
@@ -165,6 +168,13 @@ output_get_presentation_xrandr (MetaMonitorManagerXrandr *manager_xrandr,
|
|||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
output_get_presentation_xrandr (MetaMonitorManagerXrandr *manager_xrandr,
|
||||||
|
MetaOutput *output)
|
||||||
|
{
|
||||||
|
return output_get_boolean_property (manager_xrandr, output, "_MUTTER_PRESENTATION_OUTPUT");
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
normalize_backlight (MetaOutput *output,
|
normalize_backlight (MetaOutput *output,
|
||||||
int hw_value)
|
int hw_value)
|
||||||
@@ -177,16 +187,16 @@ static int
|
|||||||
output_get_backlight_xrandr (MetaMonitorManagerXrandr *manager_xrandr,
|
output_get_backlight_xrandr (MetaMonitorManagerXrandr *manager_xrandr,
|
||||||
MetaOutput *output)
|
MetaOutput *output)
|
||||||
{
|
{
|
||||||
MetaDisplay *display = meta_get_display ();
|
|
||||||
gboolean value;
|
gboolean value;
|
||||||
Atom actual_type;
|
Atom atom, actual_type;
|
||||||
int actual_format;
|
int actual_format;
|
||||||
unsigned long nitems, bytes_after;
|
unsigned long nitems, bytes_after;
|
||||||
unsigned char *buffer;
|
unsigned char *buffer;
|
||||||
|
|
||||||
|
atom = XInternAtom (manager_xrandr->xdisplay, "Backlight", False);
|
||||||
XRRGetOutputProperty (manager_xrandr->xdisplay,
|
XRRGetOutputProperty (manager_xrandr->xdisplay,
|
||||||
(XID)output->output_id,
|
(XID)output->winsys_id,
|
||||||
display->atom_BACKLIGHT,
|
atom,
|
||||||
0, G_MAXLONG, False, False, XA_INTEGER,
|
0, G_MAXLONG, False, False, XA_INTEGER,
|
||||||
&actual_type, &actual_format,
|
&actual_type, &actual_format,
|
||||||
&nitems, &bytes_after, &buffer);
|
&nitems, &bytes_after, &buffer);
|
||||||
@@ -205,32 +215,35 @@ static void
|
|||||||
output_get_backlight_limits_xrandr (MetaMonitorManagerXrandr *manager_xrandr,
|
output_get_backlight_limits_xrandr (MetaMonitorManagerXrandr *manager_xrandr,
|
||||||
MetaOutput *output)
|
MetaOutput *output)
|
||||||
{
|
{
|
||||||
MetaDisplay *display = meta_get_display ();
|
Atom atom;
|
||||||
XRRPropertyInfo *info;
|
xcb_connection_t *xcb_conn;
|
||||||
|
xcb_randr_query_output_property_reply_t *reply;
|
||||||
|
|
||||||
meta_error_trap_push (display);
|
atom = XInternAtom (manager_xrandr->xdisplay, "Backlight", False);
|
||||||
info = XRRQueryOutputProperty (manager_xrandr->xdisplay,
|
|
||||||
(XID)output->output_id,
|
|
||||||
display->atom_BACKLIGHT);
|
|
||||||
meta_error_trap_pop (display);
|
|
||||||
|
|
||||||
if (info == NULL)
|
xcb_conn = XGetXCBConnection (manager_xrandr->xdisplay);
|
||||||
{
|
reply = xcb_randr_query_output_property_reply (xcb_conn,
|
||||||
meta_verbose ("could not get output property for %s\n", output->name);
|
xcb_randr_query_output_property (xcb_conn,
|
||||||
return;
|
(xcb_randr_output_t) output->winsys_id,
|
||||||
}
|
(xcb_atom_t) atom),
|
||||||
|
NULL);
|
||||||
|
|
||||||
if (!info->range || info->num_values != 2)
|
/* This can happen on systems without backlights. */
|
||||||
|
if (reply == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!reply->range || reply->length != 2)
|
||||||
{
|
{
|
||||||
meta_verbose ("backlight %s was not range\n", output->name);
|
meta_verbose ("backlight %s was not range\n", output->name);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
output->backlight_min = info->values[0];
|
int32_t *values = xcb_randr_query_output_property_valid_values (reply);
|
||||||
output->backlight_max = info->values[1];
|
output->backlight_min = values[0];
|
||||||
|
output->backlight_max = values[1];
|
||||||
|
|
||||||
out:
|
out:
|
||||||
XFree (info);
|
free (reply);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
@@ -272,31 +285,31 @@ get_edid_property (Display *dpy,
|
|||||||
}
|
}
|
||||||
|
|
||||||
XFree (prop);
|
XFree (prop);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static GBytes *
|
static GBytes *
|
||||||
read_output_edid (MetaMonitorManagerXrandr *manager_xrandr,
|
read_output_edid (MetaMonitorManagerXrandr *manager_xrandr,
|
||||||
XID output_id)
|
XID winsys_id)
|
||||||
{
|
{
|
||||||
Atom edid_atom;
|
Atom edid_atom;
|
||||||
guint8 *result;
|
guint8 *result;
|
||||||
gsize len;
|
gsize len;
|
||||||
|
|
||||||
edid_atom = XInternAtom (manager_xrandr->xdisplay, "EDID", FALSE);
|
edid_atom = XInternAtom (manager_xrandr->xdisplay, "EDID", FALSE);
|
||||||
result = get_edid_property (manager_xrandr->xdisplay, output_id, edid_atom, &len);
|
result = get_edid_property (manager_xrandr->xdisplay, winsys_id, edid_atom, &len);
|
||||||
|
|
||||||
if (!result)
|
if (!result)
|
||||||
{
|
{
|
||||||
edid_atom = XInternAtom (manager_xrandr->xdisplay, "EDID_DATA", FALSE);
|
edid_atom = XInternAtom (manager_xrandr->xdisplay, "EDID_DATA", FALSE);
|
||||||
result = get_edid_property (manager_xrandr->xdisplay, output_id, edid_atom, &len);
|
result = get_edid_property (manager_xrandr->xdisplay, winsys_id, edid_atom, &len);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!result)
|
if (!result)
|
||||||
{
|
{
|
||||||
edid_atom = XInternAtom (manager_xrandr->xdisplay, "XFree86_DDC_EDID1_RAWDATA", FALSE);
|
edid_atom = XInternAtom (manager_xrandr->xdisplay, "XFree86_DDC_EDID1_RAWDATA", FALSE);
|
||||||
result = get_edid_property (manager_xrandr->xdisplay, output_id, edid_atom, &len);
|
result = get_edid_property (manager_xrandr->xdisplay, winsys_id, edid_atom, &len);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (result)
|
if (result)
|
||||||
@@ -312,26 +325,25 @@ read_output_edid (MetaMonitorManagerXrandr *manager_xrandr,
|
|||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
output_get_hotplug_mode_update (MetaMonitorManagerXrandr *manager_xrandr,
|
output_get_hotplug_mode_update (MetaMonitorManagerXrandr *manager_xrandr,
|
||||||
XID output_id)
|
MetaOutput *output)
|
||||||
{
|
{
|
||||||
MetaDisplay *display = meta_get_display ();
|
return output_get_boolean_property (manager_xrandr, output, "hotplug_mode_update");
|
||||||
XRRPropertyInfo *info;
|
|
||||||
gboolean result = FALSE;
|
|
||||||
|
|
||||||
meta_error_trap_push (display);
|
|
||||||
info = XRRQueryOutputProperty (manager_xrandr->xdisplay, output_id,
|
|
||||||
display->atom_hotplug_mode_update);
|
|
||||||
meta_error_trap_pop (display);
|
|
||||||
|
|
||||||
if (info)
|
|
||||||
{
|
|
||||||
result = TRUE;
|
|
||||||
XFree (info);
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char *
|
||||||
|
get_xmode_name (XRRModeInfo *xmode)
|
||||||
|
{
|
||||||
|
int width = xmode->width;
|
||||||
|
int height = xmode->height;
|
||||||
|
|
||||||
|
if (xmode->hSkew != 0)
|
||||||
|
{
|
||||||
|
width += 2 * (xmode->hSkew >> 8);
|
||||||
|
height += 2 * (xmode->hSkew & 0xff);
|
||||||
|
}
|
||||||
|
|
||||||
|
return g_strdup_printf ("%dx%d", width, height);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_monitor_manager_xrandr_read_current (MetaMonitorManager *manager)
|
meta_monitor_manager_xrandr_read_current (MetaMonitorManager *manager)
|
||||||
@@ -350,9 +362,7 @@ meta_monitor_manager_xrandr_read_current (MetaMonitorManager *manager)
|
|||||||
XRRFreeScreenResources (manager_xrandr->resources);
|
XRRFreeScreenResources (manager_xrandr->resources);
|
||||||
manager_xrandr->resources = NULL;
|
manager_xrandr->resources = NULL;
|
||||||
|
|
||||||
meta_error_trap_push (meta_get_display ());
|
|
||||||
dpms_capable = DPMSCapable (manager_xrandr->xdisplay);
|
dpms_capable = DPMSCapable (manager_xrandr->xdisplay);
|
||||||
meta_error_trap_pop (meta_get_display ());
|
|
||||||
|
|
||||||
if (dpms_capable &&
|
if (dpms_capable &&
|
||||||
DPMSInfo (manager_xrandr->xdisplay, &dpms_state, &dpms_enabled) &&
|
DPMSInfo (manager_xrandr->xdisplay, &dpms_state, &dpms_enabled) &&
|
||||||
@@ -420,6 +430,7 @@ meta_monitor_manager_xrandr_read_current (MetaMonitorManager *manager)
|
|||||||
mode->height = xmode->height;
|
mode->height = xmode->height;
|
||||||
mode->refresh_rate = (xmode->dotClock /
|
mode->refresh_rate = (xmode->dotClock /
|
||||||
((float)xmode->hTotal * xmode->vTotal));
|
((float)xmode->hTotal * xmode->vTotal));
|
||||||
|
mode->name = get_xmode_name (xmode);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < (unsigned)resources->ncrtc; i++)
|
for (i = 0; i < (unsigned)resources->ncrtc; i++)
|
||||||
@@ -437,8 +448,8 @@ meta_monitor_manager_xrandr_read_current (MetaMonitorManager *manager)
|
|||||||
meta_crtc->rect.width = crtc->width;
|
meta_crtc->rect.width = crtc->width;
|
||||||
meta_crtc->rect.height = crtc->height;
|
meta_crtc->rect.height = crtc->height;
|
||||||
meta_crtc->is_dirty = FALSE;
|
meta_crtc->is_dirty = FALSE;
|
||||||
meta_crtc->transform = wl_transform_from_xrandr (crtc->rotation);
|
meta_crtc->transform = meta_monitor_transform_from_xrandr (crtc->rotation);
|
||||||
meta_crtc->all_transforms = wl_transform_from_xrandr_all (crtc->rotations);
|
meta_crtc->all_transforms = meta_monitor_transform_from_xrandr_all (crtc->rotations);
|
||||||
|
|
||||||
for (j = 0; j < (unsigned)resources->nmode; j++)
|
for (j = 0; j < (unsigned)resources->nmode; j++)
|
||||||
{
|
{
|
||||||
@@ -452,10 +463,8 @@ meta_monitor_manager_xrandr_read_current (MetaMonitorManager *manager)
|
|||||||
XRRFreeCrtcInfo (crtc);
|
XRRFreeCrtcInfo (crtc);
|
||||||
}
|
}
|
||||||
|
|
||||||
meta_error_trap_push (meta_get_display ());
|
|
||||||
primary_output = XRRGetOutputPrimary (manager_xrandr->xdisplay,
|
primary_output = XRRGetOutputPrimary (manager_xrandr->xdisplay,
|
||||||
DefaultRootWindow (manager_xrandr->xdisplay));
|
DefaultRootWindow (manager_xrandr->xdisplay));
|
||||||
meta_error_trap_pop (meta_get_display ());
|
|
||||||
|
|
||||||
n_actual_outputs = 0;
|
n_actual_outputs = 0;
|
||||||
for (i = 0; i < (unsigned)resources->noutput; i++)
|
for (i = 0; i < (unsigned)resources->noutput; i++)
|
||||||
@@ -472,10 +481,10 @@ meta_monitor_manager_xrandr_read_current (MetaMonitorManager *manager)
|
|||||||
GBytes *edid;
|
GBytes *edid;
|
||||||
MonitorInfo *parsed_edid;
|
MonitorInfo *parsed_edid;
|
||||||
|
|
||||||
meta_output->output_id = resources->outputs[i];
|
meta_output->winsys_id = resources->outputs[i];
|
||||||
meta_output->name = g_strdup (output->name);
|
meta_output->name = g_strdup (output->name);
|
||||||
|
|
||||||
edid = read_output_edid (manager_xrandr, meta_output->output_id);
|
edid = read_output_edid (manager_xrandr, meta_output->winsys_id);
|
||||||
if (edid)
|
if (edid)
|
||||||
{
|
{
|
||||||
gsize len;
|
gsize len;
|
||||||
@@ -508,8 +517,7 @@ meta_monitor_manager_xrandr_read_current (MetaMonitorManager *manager)
|
|||||||
meta_output->width_mm = output->mm_width;
|
meta_output->width_mm = output->mm_width;
|
||||||
meta_output->height_mm = output->mm_height;
|
meta_output->height_mm = output->mm_height;
|
||||||
meta_output->subpixel_order = COGL_SUBPIXEL_ORDER_UNKNOWN;
|
meta_output->subpixel_order = COGL_SUBPIXEL_ORDER_UNKNOWN;
|
||||||
meta_output->hotplug_mode_update =
|
meta_output->hotplug_mode_update = output_get_hotplug_mode_update (manager_xrandr, meta_output);
|
||||||
output_get_hotplug_mode_update (manager_xrandr, meta_output->output_id);
|
|
||||||
|
|
||||||
meta_output->n_modes = output->nmode;
|
meta_output->n_modes = output->nmode;
|
||||||
meta_output->modes = g_new0 (MetaMonitorMode *, meta_output->n_modes);
|
meta_output->modes = g_new0 (MetaMonitorMode *, meta_output->n_modes);
|
||||||
@@ -561,7 +569,7 @@ meta_monitor_manager_xrandr_read_current (MetaMonitorManager *manager)
|
|||||||
meta_output->possible_clones[j] = GINT_TO_POINTER (output->clones[j]);
|
meta_output->possible_clones[j] = GINT_TO_POINTER (output->clones[j]);
|
||||||
}
|
}
|
||||||
|
|
||||||
meta_output->is_primary = ((XID)meta_output->output_id == primary_output);
|
meta_output->is_primary = ((XID)meta_output->winsys_id == primary_output);
|
||||||
meta_output->is_presentation = output_get_presentation_xrandr (manager_xrandr, meta_output);
|
meta_output->is_presentation = output_get_presentation_xrandr (manager_xrandr, meta_output);
|
||||||
output_get_backlight_limits_xrandr (manager_xrandr, meta_output);
|
output_get_backlight_limits_xrandr (manager_xrandr, meta_output);
|
||||||
|
|
||||||
@@ -594,7 +602,7 @@ meta_monitor_manager_xrandr_read_current (MetaMonitorManager *manager)
|
|||||||
|
|
||||||
for (k = 0; k < manager->n_outputs; k++)
|
for (k = 0; k < manager->n_outputs; k++)
|
||||||
{
|
{
|
||||||
if (clone == (XID)manager->outputs[k].output_id)
|
if (clone == (XID)manager->outputs[k].winsys_id)
|
||||||
{
|
{
|
||||||
meta_output->possible_clones[j] = &manager->outputs[k];
|
meta_output->possible_clones[j] = &manager->outputs[k];
|
||||||
break;
|
break;
|
||||||
@@ -610,7 +618,7 @@ meta_monitor_manager_xrandr_read_edid (MetaMonitorManager *manager,
|
|||||||
{
|
{
|
||||||
MetaMonitorManagerXrandr *manager_xrandr = META_MONITOR_MANAGER_XRANDR (manager);
|
MetaMonitorManagerXrandr *manager_xrandr = META_MONITOR_MANAGER_XRANDR (manager);
|
||||||
|
|
||||||
return read_output_edid (manager_xrandr, output->output_id);
|
return read_output_edid (manager_xrandr, output->winsys_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -637,32 +645,30 @@ meta_monitor_manager_xrandr_set_power_save_mode (MetaMonitorManager *manager,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
meta_error_trap_push (meta_get_display ());
|
|
||||||
DPMSForceLevel (manager_xrandr->xdisplay, state);
|
DPMSForceLevel (manager_xrandr->xdisplay, state);
|
||||||
DPMSSetTimeouts (manager_xrandr->xdisplay, 0, 0, 0);
|
DPMSSetTimeouts (manager_xrandr->xdisplay, 0, 0, 0);
|
||||||
meta_error_trap_pop (meta_get_display ());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static Rotation
|
static Rotation
|
||||||
wl_transform_to_xrandr (enum wl_output_transform transform)
|
meta_monitor_transform_to_xrandr (MetaMonitorTransform transform)
|
||||||
{
|
{
|
||||||
switch (transform)
|
switch (transform)
|
||||||
{
|
{
|
||||||
case WL_OUTPUT_TRANSFORM_NORMAL:
|
case META_MONITOR_TRANSFORM_NORMAL:
|
||||||
return RR_Rotate_0;
|
return RR_Rotate_0;
|
||||||
case WL_OUTPUT_TRANSFORM_90:
|
case META_MONITOR_TRANSFORM_90:
|
||||||
return RR_Rotate_90;
|
return RR_Rotate_90;
|
||||||
case WL_OUTPUT_TRANSFORM_180:
|
case META_MONITOR_TRANSFORM_180:
|
||||||
return RR_Rotate_180;
|
return RR_Rotate_180;
|
||||||
case WL_OUTPUT_TRANSFORM_270:
|
case META_MONITOR_TRANSFORM_270:
|
||||||
return RR_Rotate_270;
|
return RR_Rotate_270;
|
||||||
case WL_OUTPUT_TRANSFORM_FLIPPED:
|
case META_MONITOR_TRANSFORM_FLIPPED:
|
||||||
return RR_Reflect_X | RR_Rotate_0;
|
return RR_Reflect_X | RR_Rotate_0;
|
||||||
case WL_OUTPUT_TRANSFORM_FLIPPED_90:
|
case META_MONITOR_TRANSFORM_FLIPPED_90:
|
||||||
return RR_Reflect_X | RR_Rotate_90;
|
return RR_Reflect_X | RR_Rotate_90;
|
||||||
case WL_OUTPUT_TRANSFORM_FLIPPED_180:
|
case META_MONITOR_TRANSFORM_FLIPPED_180:
|
||||||
return RR_Reflect_X | RR_Rotate_180;
|
return RR_Reflect_X | RR_Rotate_180;
|
||||||
case WL_OUTPUT_TRANSFORM_FLIPPED_270:
|
case META_MONITOR_TRANSFORM_FLIPPED_270:
|
||||||
return RR_Reflect_X | RR_Rotate_270;
|
return RR_Reflect_X | RR_Rotate_270;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -674,12 +680,13 @@ output_set_presentation_xrandr (MetaMonitorManagerXrandr *manager_xrandr,
|
|||||||
MetaOutput *output,
|
MetaOutput *output,
|
||||||
gboolean presentation)
|
gboolean presentation)
|
||||||
{
|
{
|
||||||
MetaDisplay *display = meta_get_display ();
|
Atom atom;
|
||||||
int value = presentation;
|
int value = presentation;
|
||||||
|
|
||||||
|
atom = XInternAtom (manager_xrandr->xdisplay, "_MUTTER_PRESENTATION_OUTPUT", False);
|
||||||
XRRChangeOutputProperty (manager_xrandr->xdisplay,
|
XRRChangeOutputProperty (manager_xrandr->xdisplay,
|
||||||
(XID)output->output_id,
|
(XID)output->winsys_id,
|
||||||
display->atom__MUTTER_PRESENTATION_OUTPUT,
|
atom,
|
||||||
XA_CARDINAL, 32, PropModeReplace,
|
XA_CARDINAL, 32, PropModeReplace,
|
||||||
(unsigned char*) &value, 1);
|
(unsigned char*) &value, 1);
|
||||||
}
|
}
|
||||||
@@ -692,11 +699,10 @@ meta_monitor_manager_xrandr_apply_configuration (MetaMonitorManager *manager,
|
|||||||
unsigned int n_outputs)
|
unsigned int n_outputs)
|
||||||
{
|
{
|
||||||
MetaMonitorManagerXrandr *manager_xrandr = META_MONITOR_MANAGER_XRANDR (manager);
|
MetaMonitorManagerXrandr *manager_xrandr = META_MONITOR_MANAGER_XRANDR (manager);
|
||||||
MetaDisplay *display = meta_get_display ();
|
|
||||||
unsigned i;
|
unsigned i;
|
||||||
int width, height, width_mm, height_mm;
|
int width, height, width_mm, height_mm;
|
||||||
|
|
||||||
meta_display_grab (display);
|
XGrabServer (manager_xrandr->xdisplay);
|
||||||
|
|
||||||
/* First compute the new size of the screen (framebuffer) */
|
/* First compute the new size of the screen (framebuffer) */
|
||||||
width = 0; height = 0;
|
width = 0; height = 0;
|
||||||
@@ -790,10 +796,8 @@ meta_monitor_manager_xrandr_apply_configuration (MetaMonitorManager *manager,
|
|||||||
*/
|
*/
|
||||||
width_mm = (width / DPI_FALLBACK) * 25.4 + 0.5;
|
width_mm = (width / DPI_FALLBACK) * 25.4 + 0.5;
|
||||||
height_mm = (height / DPI_FALLBACK) * 25.4 + 0.5;
|
height_mm = (height / DPI_FALLBACK) * 25.4 + 0.5;
|
||||||
meta_error_trap_push (display);
|
|
||||||
XRRSetScreenSize (manager_xrandr->xdisplay, DefaultRootWindow (manager_xrandr->xdisplay),
|
XRRSetScreenSize (manager_xrandr->xdisplay, DefaultRootWindow (manager_xrandr->xdisplay),
|
||||||
width, height, width_mm, height_mm);
|
width, height, width_mm, height_mm);
|
||||||
meta_error_trap_pop (display);
|
|
||||||
|
|
||||||
for (i = 0; i < n_crtcs; i++)
|
for (i = 0; i < n_crtcs; i++)
|
||||||
{
|
{
|
||||||
@@ -837,7 +841,7 @@ meta_monitor_manager_xrandr_apply_configuration (MetaMonitorManager *manager,
|
|||||||
output->crtc = crtc;
|
output->crtc = crtc;
|
||||||
new_controlled_mask |= 1UL << j;
|
new_controlled_mask |= 1UL << j;
|
||||||
|
|
||||||
outputs[j] = output->output_id;
|
outputs[j] = output->winsys_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (crtc->current_mode == mode &&
|
if (crtc->current_mode == mode &&
|
||||||
@@ -850,16 +854,14 @@ meta_monitor_manager_xrandr_apply_configuration (MetaMonitorManager *manager,
|
|||||||
goto next;
|
goto next;
|
||||||
}
|
}
|
||||||
|
|
||||||
meta_error_trap_push (display);
|
|
||||||
ok = XRRSetCrtcConfig (manager_xrandr->xdisplay,
|
ok = XRRSetCrtcConfig (manager_xrandr->xdisplay,
|
||||||
manager_xrandr->resources,
|
manager_xrandr->resources,
|
||||||
(XID)crtc->crtc_id,
|
(XID)crtc->crtc_id,
|
||||||
manager_xrandr->time,
|
manager_xrandr->time,
|
||||||
crtc_info->x, crtc_info->y,
|
crtc_info->x, crtc_info->y,
|
||||||
(XID)mode->mode_id,
|
(XID)mode->mode_id,
|
||||||
wl_transform_to_xrandr (crtc_info->transform),
|
meta_monitor_transform_to_xrandr (crtc_info->transform),
|
||||||
outputs, n_outputs);
|
outputs, n_outputs);
|
||||||
meta_error_trap_pop (display);
|
|
||||||
|
|
||||||
if (ok != Success)
|
if (ok != Success)
|
||||||
{
|
{
|
||||||
@@ -900,11 +902,9 @@ meta_monitor_manager_xrandr_apply_configuration (MetaMonitorManager *manager,
|
|||||||
|
|
||||||
if (output_info->is_primary)
|
if (output_info->is_primary)
|
||||||
{
|
{
|
||||||
meta_error_trap_push (display);
|
|
||||||
XRRSetOutputPrimary (manager_xrandr->xdisplay,
|
XRRSetOutputPrimary (manager_xrandr->xdisplay,
|
||||||
DefaultRootWindow (manager_xrandr->xdisplay),
|
DefaultRootWindow (manager_xrandr->xdisplay),
|
||||||
(XID)output_info->output->output_id);
|
(XID)output_info->output->winsys_id);
|
||||||
meta_error_trap_pop (display);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
output_set_presentation_xrandr (manager_xrandr,
|
output_set_presentation_xrandr (manager_xrandr,
|
||||||
@@ -930,7 +930,8 @@ meta_monitor_manager_xrandr_apply_configuration (MetaMonitorManager *manager,
|
|||||||
output->is_primary = FALSE;
|
output->is_primary = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
meta_display_ungrab (display);
|
XUngrabServer (manager_xrandr->xdisplay);
|
||||||
|
XFlush (manager_xrandr->xdisplay);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -939,18 +940,17 @@ meta_monitor_manager_xrandr_change_backlight (MetaMonitorManager *manager,
|
|||||||
gint value)
|
gint value)
|
||||||
{
|
{
|
||||||
MetaMonitorManagerXrandr *manager_xrandr = META_MONITOR_MANAGER_XRANDR (manager);
|
MetaMonitorManagerXrandr *manager_xrandr = META_MONITOR_MANAGER_XRANDR (manager);
|
||||||
MetaDisplay *display = meta_get_display ();
|
Atom atom;
|
||||||
int hw_value;
|
int hw_value;
|
||||||
|
|
||||||
hw_value = round ((double)value / 100.0 * output->backlight_max + output->backlight_min);
|
hw_value = round ((double)value / 100.0 * output->backlight_max + output->backlight_min);
|
||||||
|
|
||||||
meta_error_trap_push (display);
|
atom = XInternAtom (manager_xrandr->xdisplay, "Backlight", False);
|
||||||
XRRChangeOutputProperty (manager_xrandr->xdisplay,
|
XRRChangeOutputProperty (manager_xrandr->xdisplay,
|
||||||
(XID)output->output_id,
|
(XID)output->winsys_id,
|
||||||
display->atom_BACKLIGHT,
|
atom,
|
||||||
XA_INTEGER, 32, PropModeReplace,
|
XA_INTEGER, 32, PropModeReplace,
|
||||||
(unsigned char *) &hw_value, 1);
|
(unsigned char *) &hw_value, 1);
|
||||||
meta_error_trap_pop (display);
|
|
||||||
|
|
||||||
/* We're not selecting for property notifies, so update the value immediately */
|
/* We're not selecting for property notifies, so update the value immediately */
|
||||||
output->backlight = normalize_backlight (output, hw_value);
|
output->backlight = normalize_backlight (output, hw_value);
|
||||||
@@ -1008,11 +1008,65 @@ meta_monitor_manager_xrandr_rebuild_derived (MetaMonitorManager *manager)
|
|||||||
meta_monitor_manager_rebuild_derived (manager);
|
meta_monitor_manager_rebuild_derived (manager);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static void
|
||||||
meta_monitor_manager_xrandr_handle_xevent (MetaMonitorManager *manager,
|
meta_monitor_manager_xrandr_init (MetaMonitorManagerXrandr *manager_xrandr)
|
||||||
XEvent *event)
|
|
||||||
{
|
{
|
||||||
MetaMonitorManagerXrandr *manager_xrandr = META_MONITOR_MANAGER_XRANDR (manager);
|
MetaBackendX11 *backend = META_BACKEND_X11 (meta_get_backend ());
|
||||||
|
|
||||||
|
manager_xrandr->xdisplay = meta_backend_x11_get_xdisplay (backend);
|
||||||
|
|
||||||
|
if (!XRRQueryExtension (manager_xrandr->xdisplay,
|
||||||
|
&manager_xrandr->rr_event_base,
|
||||||
|
&manager_xrandr->rr_error_base))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* We only use ScreenChangeNotify, but GDK uses the others,
|
||||||
|
and we don't want to step on its toes */
|
||||||
|
XRRSelectInput (manager_xrandr->xdisplay,
|
||||||
|
DefaultRootWindow (manager_xrandr->xdisplay),
|
||||||
|
RRScreenChangeNotifyMask
|
||||||
|
| RRCrtcChangeNotifyMask
|
||||||
|
| RROutputPropertyNotifyMask);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_monitor_manager_xrandr_finalize (GObject *object)
|
||||||
|
{
|
||||||
|
MetaMonitorManagerXrandr *manager_xrandr = META_MONITOR_MANAGER_XRANDR (object);
|
||||||
|
|
||||||
|
if (manager_xrandr->resources)
|
||||||
|
XRRFreeScreenResources (manager_xrandr->resources);
|
||||||
|
manager_xrandr->resources = NULL;
|
||||||
|
|
||||||
|
G_OBJECT_CLASS (meta_monitor_manager_xrandr_parent_class)->finalize (object);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_monitor_manager_xrandr_class_init (MetaMonitorManagerXrandrClass *klass)
|
||||||
|
{
|
||||||
|
MetaMonitorManagerClass *manager_class = META_MONITOR_MANAGER_CLASS (klass);
|
||||||
|
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||||
|
|
||||||
|
object_class->finalize = meta_monitor_manager_xrandr_finalize;
|
||||||
|
|
||||||
|
manager_class->read_current = meta_monitor_manager_xrandr_read_current;
|
||||||
|
manager_class->read_edid = meta_monitor_manager_xrandr_read_edid;
|
||||||
|
manager_class->apply_configuration = meta_monitor_manager_xrandr_apply_configuration;
|
||||||
|
manager_class->set_power_save_mode = meta_monitor_manager_xrandr_set_power_save_mode;
|
||||||
|
manager_class->change_backlight = meta_monitor_manager_xrandr_change_backlight;
|
||||||
|
manager_class->get_crtc_gamma = meta_monitor_manager_xrandr_get_crtc_gamma;
|
||||||
|
manager_class->set_crtc_gamma = meta_monitor_manager_xrandr_set_crtc_gamma;
|
||||||
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
meta_monitor_manager_xrandr_handle_xevent (MetaMonitorManagerXrandr *manager_xrandr,
|
||||||
|
XEvent *event)
|
||||||
|
{
|
||||||
|
MetaMonitorManager *manager = META_MONITOR_MANAGER (manager_xrandr);
|
||||||
MetaOutput *old_outputs;
|
MetaOutput *old_outputs;
|
||||||
MetaCRTC *old_crtcs;
|
MetaCRTC *old_crtcs;
|
||||||
MetaMonitorMode *old_modes;
|
MetaMonitorMode *old_modes;
|
||||||
@@ -1073,59 +1127,3 @@ meta_monitor_manager_xrandr_handle_xevent (MetaMonitorManager *manager,
|
|||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
meta_monitor_manager_xrandr_init (MetaMonitorManagerXrandr *manager_xrandr)
|
|
||||||
{
|
|
||||||
MetaDisplay *display = meta_get_display ();
|
|
||||||
|
|
||||||
manager_xrandr->xdisplay = display->xdisplay;
|
|
||||||
|
|
||||||
if (!XRRQueryExtension (manager_xrandr->xdisplay,
|
|
||||||
&manager_xrandr->rr_event_base,
|
|
||||||
&manager_xrandr->rr_error_base))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* We only use ScreenChangeNotify, but GDK uses the others,
|
|
||||||
and we don't want to step on its toes */
|
|
||||||
XRRSelectInput (manager_xrandr->xdisplay,
|
|
||||||
DefaultRootWindow (manager_xrandr->xdisplay),
|
|
||||||
RRScreenChangeNotifyMask
|
|
||||||
| RRCrtcChangeNotifyMask
|
|
||||||
| RROutputPropertyNotifyMask);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_monitor_manager_xrandr_finalize (GObject *object)
|
|
||||||
{
|
|
||||||
MetaMonitorManagerXrandr *manager_xrandr = META_MONITOR_MANAGER_XRANDR (object);
|
|
||||||
|
|
||||||
if (manager_xrandr->resources)
|
|
||||||
XRRFreeScreenResources (manager_xrandr->resources);
|
|
||||||
manager_xrandr->resources = NULL;
|
|
||||||
|
|
||||||
G_OBJECT_CLASS (meta_monitor_manager_xrandr_parent_class)->finalize (object);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_monitor_manager_xrandr_class_init (MetaMonitorManagerXrandrClass *klass)
|
|
||||||
{
|
|
||||||
MetaMonitorManagerClass *manager_class = META_MONITOR_MANAGER_CLASS (klass);
|
|
||||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
|
||||||
|
|
||||||
object_class->finalize = meta_monitor_manager_xrandr_finalize;
|
|
||||||
|
|
||||||
manager_class->read_current = meta_monitor_manager_xrandr_read_current;
|
|
||||||
manager_class->read_edid = meta_monitor_manager_xrandr_read_edid;
|
|
||||||
manager_class->apply_configuration = meta_monitor_manager_xrandr_apply_configuration;
|
|
||||||
manager_class->set_power_save_mode = meta_monitor_manager_xrandr_set_power_save_mode;
|
|
||||||
manager_class->change_backlight = meta_monitor_manager_xrandr_change_backlight;
|
|
||||||
manager_class->get_crtc_gamma = meta_monitor_manager_xrandr_get_crtc_gamma;
|
|
||||||
manager_class->set_crtc_gamma = meta_monitor_manager_xrandr_set_crtc_gamma;
|
|
||||||
manager_class->handle_xevent = meta_monitor_manager_xrandr_handle_xevent;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|||||||
@@ -37,4 +37,7 @@ typedef struct _MetaMonitorManagerXrandr MetaMonitorManagerXrandr;
|
|||||||
|
|
||||||
GType meta_monitor_manager_xrandr_get_type (void);
|
GType meta_monitor_manager_xrandr_get_type (void);
|
||||||
|
|
||||||
|
gboolean meta_monitor_manager_xrandr_handle_xevent (MetaMonitorManagerXrandr *manager,
|
||||||
|
XEvent *event);
|
||||||
|
|
||||||
#endif /* META_MONITOR_MANAGER_XRANDR_H */
|
#endif /* META_MONITOR_MANAGER_XRANDR_H */
|
||||||
|
|||||||
@@ -22,53 +22,11 @@
|
|||||||
#include <clutter/clutter.h>
|
#include <clutter/clutter.h>
|
||||||
#include "cogl-utils.h"
|
#include "cogl-utils.h"
|
||||||
|
|
||||||
/**
|
|
||||||
* meta_create_color_texture_4ub:
|
|
||||||
* @red: red component
|
|
||||||
* @green: green component
|
|
||||||
* @blue: blue component
|
|
||||||
* @alpha: alpha component
|
|
||||||
* @flags: Optional flags for the texture, or %COGL_TEXTURE_NONE;
|
|
||||||
* %COGL_TEXTURE_NO_SLICING is useful if the texture will be
|
|
||||||
* repeated to create a constant color fill, since hardware
|
|
||||||
* repeat can't be used for a sliced texture.
|
|
||||||
*
|
|
||||||
* Creates a texture that is a single pixel with the specified
|
|
||||||
* unpremultiplied color components.
|
|
||||||
*
|
|
||||||
* Return value: (transfer full): a newly created Cogl texture
|
|
||||||
*/
|
|
||||||
CoglTexture *
|
|
||||||
meta_create_color_texture_4ub (guint8 red,
|
|
||||||
guint8 green,
|
|
||||||
guint8 blue,
|
|
||||||
guint8 alpha,
|
|
||||||
CoglTextureFlags flags)
|
|
||||||
{
|
|
||||||
CoglColor color;
|
|
||||||
guint8 pixel[4];
|
|
||||||
|
|
||||||
cogl_color_init_from_4ub (&color, red, green, blue, alpha);
|
|
||||||
cogl_color_premultiply (&color);
|
|
||||||
|
|
||||||
pixel[0] = cogl_color_get_red_byte (&color);
|
|
||||||
pixel[1] = cogl_color_get_green_byte (&color);
|
|
||||||
pixel[2] = cogl_color_get_blue_byte (&color);
|
|
||||||
pixel[3] = cogl_color_get_alpha_byte (&color);
|
|
||||||
|
|
||||||
return cogl_texture_new_from_data (1, 1,
|
|
||||||
flags,
|
|
||||||
COGL_PIXEL_FORMAT_RGBA_8888_PRE,
|
|
||||||
COGL_PIXEL_FORMAT_ANY,
|
|
||||||
4, pixel);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Based on gnome-shell/src/st/st-private.c:_st_create_texture_material.c */
|
/* Based on gnome-shell/src/st/st-private.c:_st_create_texture_material.c */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* meta_create_texture_pipeline:
|
* meta_create_texture_pipeline:
|
||||||
* @src_texture: (allow-none): texture to use initially for the layer
|
* @src_texture: (nullable): texture to use initially for the layer
|
||||||
*
|
*
|
||||||
* Creates a pipeline with a single layer. Using a common template
|
* Creates a pipeline with a single layer. Using a common template
|
||||||
* makes it easier for Cogl to share a shader for different uses in
|
* makes it easier for Cogl to share a shader for different uses in
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user