Compare commits
499 Commits
3.15.4
...
wip/garnac
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9f35b5816a | ||
|
|
63c91f9d4f | ||
|
|
aaa02440be | ||
|
|
9611661154 | ||
|
|
a70a2c3744 | ||
|
|
bc47b19c3f | ||
|
|
bc1dd1cee4 | ||
|
|
495c89401a | ||
|
|
e2efc85b08 | ||
|
|
020ae58fe4 | ||
|
|
525644059d | ||
|
|
f0f638d2bd | ||
|
|
bc8ec2d90d | ||
|
|
5b0eabec51 | ||
|
|
50099c4c10 | ||
|
|
55eef2deb3 | ||
|
|
f9db65f47f | ||
|
|
a809055470 | ||
|
|
247909e161 | ||
|
|
e5ce6192f4 | ||
|
|
7adbb58736 | ||
|
|
0165cb6974 | ||
|
|
3cdcd3e9c1 | ||
|
|
6fc51e3723 | ||
|
|
af45a50cb1 | ||
|
|
72d6efc0d5 | ||
|
|
e0ffef06dd | ||
|
|
d5b69bcd54 | ||
|
|
ac8fe2d9b2 | ||
|
|
e7a88dc6b2 | ||
|
|
bcdda506e1 | ||
|
|
9b26694bbc | ||
|
|
f053c09083 | ||
|
|
ec9abaf1ef | ||
|
|
6b88420465 | ||
|
|
fc0a834abb | ||
|
|
e30010b9f0 | ||
|
|
935d76ba04 | ||
|
|
cc013e1daa | ||
|
|
a7a376ae1f | ||
|
|
5e57af6286 | ||
|
|
42b3a34f7b | ||
|
|
19d814c887 | ||
|
|
46eb682c83 | ||
|
|
3aea8d8ce6 | ||
|
|
40c3c69435 | ||
|
|
8071e5b149 | ||
|
|
8a481b3e10 | ||
|
|
50e3e3b929 | ||
|
|
2c7ef2269f | ||
|
|
8bded7d497 | ||
|
|
9ebe3419c3 | ||
|
|
9385c835b8 | ||
|
|
efef0c993b | ||
|
|
3a2cd3389a | ||
|
|
88acfb8e60 | ||
|
|
8e22dce5d7 | ||
|
|
e0906a77aa | ||
|
|
053f5088df | ||
|
|
75b992c7d0 | ||
|
|
213f0fa160 | ||
|
|
5054b2a99c | ||
|
|
d455de32a0 | ||
|
|
e7390cff83 | ||
|
|
49ea6486e2 | ||
|
|
996aeaef41 | ||
|
|
a27b2597b9 | ||
|
|
0e8ca1a042 | ||
|
|
f5f26c9cff | ||
|
|
91ac69382d | ||
|
|
8cc345fcf5 | ||
|
|
96b5042dda | ||
|
|
428c687b5a | ||
|
|
82bdd1e353 | ||
|
|
4bebc5e5fa | ||
|
|
be5643cee7 | ||
|
|
2ee1c5fa61 | ||
|
|
c625d2ee9d | ||
|
|
3078f70f90 | ||
|
|
7309b20c25 | ||
|
|
c16a5ec1cf | ||
|
|
f3e1964362 | ||
|
|
9b9083180f | ||
|
|
7606f79a1e | ||
|
|
99c0b82b15 | ||
|
|
ca7c1d5e02 | ||
|
|
4a770907c1 | ||
|
|
049f1556dc | ||
|
|
7b20d151ed | ||
|
|
8ec0c99ff4 | ||
|
|
cf3ee327a0 | ||
|
|
3ec3cc248d | ||
|
|
7fb3ecc12c | ||
|
|
4c9af7267d | ||
|
|
db4355ba1e | ||
|
|
33150569cd | ||
|
|
af2a13ded4 | ||
|
|
8b200de35a | ||
|
|
57ae203aab | ||
|
|
bff75b64be | ||
|
|
8899b9da01 | ||
|
|
76e816a14f | ||
|
|
2750db2a89 | ||
|
|
86a913d37a | ||
|
|
2857fdbdb8 | ||
|
|
69a7d5ff02 | ||
|
|
a4f763ac3b | ||
|
|
f2afa7aa6c | ||
|
|
a5d2555196 | ||
|
|
dd5a4ecdf9 | ||
|
|
43a1d43f2b | ||
|
|
d6d377a447 | ||
|
|
ffd95c2ad5 | ||
|
|
72be89dfb9 | ||
|
|
2feeb57dee | ||
|
|
9c81b718f9 | ||
|
|
3a63d58d9e | ||
|
|
a95ae4d178 | ||
|
|
a692fd3808 | ||
|
|
377ecdb864 | ||
|
|
d7f544f42e | ||
|
|
1ab8b854df | ||
|
|
ae7aabd5de | ||
|
|
b975676c5d | ||
|
|
86d8c3954f | ||
|
|
54557f062e | ||
|
|
130807a308 | ||
|
|
e84f694668 | ||
|
|
b18542f2b6 | ||
|
|
da0aac665f | ||
|
|
8b0b0cf028 | ||
|
|
6f64d6b0aa | ||
|
|
ebeca983c7 | ||
|
|
cf88675807 | ||
|
|
405f1ce3d0 | ||
|
|
6190ae3873 | ||
|
|
69c267b142 | ||
|
|
9abc071283 | ||
|
|
a9df4bb81a | ||
|
|
bc9e63d3db | ||
|
|
5b5ceede2b | ||
|
|
4e63c95c02 | ||
|
|
67d3a7a2d7 | ||
|
|
bc00f118f3 | ||
|
|
5801b5518f | ||
|
|
25a796afc6 | ||
|
|
27b37407d0 | ||
|
|
e23e697043 | ||
|
|
35729e8659 | ||
|
|
dc7e665de9 | ||
|
|
2e3bfd1a11 | ||
|
|
b7aca07844 | ||
|
|
dc780d2c44 | ||
|
|
c49b284643 | ||
|
|
0373b854c1 | ||
|
|
5d837a5c85 | ||
|
|
79c86ae890 | ||
|
|
7c7cf91c32 | ||
|
|
e407f5bbae | ||
|
|
8900bd2f5c | ||
|
|
83c17134f1 | ||
|
|
8e5fb03611 | ||
|
|
dece49b53d | ||
|
|
443d579d40 | ||
|
|
5066eaf691 | ||
|
|
6ea7fa9973 | ||
|
|
79f755bf0f | ||
|
|
1845bfe1b6 | ||
|
|
8e22bf5bc9 | ||
|
|
c13ddafdb8 | ||
|
|
94513726de | ||
|
|
0aa4c4d43e | ||
|
|
e3db4ab16a | ||
|
|
614d6bd0f8 | ||
|
|
1d56d50fcd | ||
|
|
0ffd4254d9 | ||
|
|
36eee04a21 | ||
|
|
d3fdaa3232 | ||
|
|
165050f8f9 | ||
|
|
68279e8a08 | ||
|
|
cd1ce2cb0a | ||
|
|
b01f95cfdd | ||
|
|
4b667d1e09 | ||
|
|
fe8454d13f | ||
|
|
53a6d16891 | ||
|
|
e76c3ecb00 | ||
|
|
637be80c86 | ||
|
|
975feb9202 | ||
|
|
a5417ebee1 | ||
|
|
b64b159109 | ||
|
|
804ab7894f | ||
|
|
299ed424d3 | ||
|
|
55692b4019 | ||
|
|
2fafa24305 | ||
|
|
51a2f28723 | ||
|
|
e11feb229b | ||
|
|
1ee387bb31 | ||
|
|
cba2ab445e | ||
|
|
038f828ab1 | ||
|
|
4dc5882777 | ||
|
|
b0b08d5010 | ||
|
|
070cd27786 | ||
|
|
9df6cda3e3 | ||
|
|
39763d4add | ||
|
|
352cac3850 | ||
|
|
9c745105f8 | ||
|
|
ab9dabe725 | ||
|
|
7ce06928e2 | ||
|
|
ac79988939 | ||
|
|
a43a2af18b | ||
|
|
07f533f617 | ||
|
|
10504b0fdc | ||
|
|
a84f714808 | ||
|
|
b41873dced | ||
|
|
0a9511b24b | ||
|
|
17438ced91 | ||
|
|
27c7512e4d | ||
|
|
124888764d | ||
|
|
7e1c6ff2a2 | ||
|
|
2fb8da0d5a | ||
|
|
ad51c52b69 | ||
|
|
1b22da0039 | ||
|
|
8329e97502 | ||
|
|
74ca936a00 | ||
|
|
141760057b | ||
|
|
e648f2c244 | ||
|
|
f01247d815 | ||
|
|
db6caa2c49 | ||
|
|
fbd237bc66 | ||
|
|
f6c9261bf6 | ||
|
|
14b0a83f64 | ||
|
|
441efd17ce | ||
|
|
208da2316d | ||
|
|
3b993131e8 | ||
|
|
117f57f74c | ||
|
|
b97ebc4124 | ||
|
|
5d10196919 | ||
|
|
f295349e26 | ||
|
|
eb023ff2c9 | ||
|
|
ba7c524a18 | ||
|
|
dc99af40f3 | ||
|
|
1576b7d5a6 | ||
|
|
6ec7fa2cbd | ||
|
|
bede9970de | ||
|
|
5f1bcc124f | ||
|
|
4d3419607a | ||
|
|
7dc0b0e602 | ||
|
|
1545d4e638 | ||
|
|
a191554cf6 | ||
|
|
b33a82eb7c | ||
|
|
2705c87f74 | ||
|
|
9fc1c919e8 | ||
|
|
9f04c58ffe | ||
|
|
7de1f3a7be | ||
|
|
fd443ecf2a | ||
|
|
8979e52a6c | ||
|
|
e8dd5601e7 | ||
|
|
ccca810daf | ||
|
|
693456b644 | ||
|
|
aacc3d5628 | ||
|
|
1ea8efdeda | ||
|
|
a3fbbaabe8 | ||
|
|
d5d95b2834 | ||
|
|
659b8ed471 | ||
|
|
94bce5a00f | ||
|
|
91b7dedf36 | ||
|
|
aa1c819941 | ||
|
|
be7e994abd | ||
|
|
6c05eb583e | ||
|
|
5547c98f97 | ||
|
|
ea4979e182 | ||
|
|
8da5761ffc | ||
|
|
aea71fbd01 | ||
|
|
b55f792302 | ||
|
|
dd060d78ce | ||
|
|
3fe281ada9 | ||
|
|
f041b35b9b | ||
|
|
afa58746ea | ||
|
|
6dbec6f81b | ||
|
|
2cbaa6660c | ||
|
|
d74b0d5be8 | ||
|
|
6b82f61dba | ||
|
|
4c6866741d | ||
|
|
84baf4e181 | ||
|
|
3962f1d982 | ||
|
|
414be07a69 | ||
|
|
7f3ada7831 | ||
|
|
12771a555a | ||
|
|
92d6a69153 | ||
|
|
734402e14d | ||
|
|
5d360a9bce | ||
|
|
f8cf5e373c | ||
|
|
8df3fa4e67 | ||
|
|
bbf2b4e60e | ||
|
|
bb4dcd62ec | ||
|
|
2345b9c6ad | ||
|
|
af7cc87bfa | ||
|
|
af3b599cbb | ||
|
|
0e73ceb4bd | ||
|
|
82a7060cdb | ||
|
|
09120132ef | ||
|
|
cdac4d0e92 | ||
|
|
6aead0c67c | ||
|
|
d593a61b39 | ||
|
|
9747277b7e | ||
|
|
989f9630a4 | ||
|
|
daa15d94fd | ||
|
|
999b99a077 | ||
|
|
fd0b366a96 | ||
|
|
320e2d452f | ||
|
|
4d5dd01b7d | ||
|
|
103c88bd72 | ||
|
|
64cf87cfe1 | ||
|
|
9f65edd4f5 | ||
|
|
ea2496c80a | ||
|
|
0c30ceddbe | ||
|
|
5c9846c53a | ||
|
|
2a8563ab23 | ||
|
|
6a77d9722a | ||
|
|
ef296031cb | ||
|
|
e2d6028924 | ||
|
|
4d80a4cc31 | ||
|
|
4a968c3b4e | ||
|
|
ccb7833e99 | ||
|
|
b449ba942a | ||
|
|
f53eea2c1c | ||
|
|
b62db404ee | ||
|
|
90a28e7b1c | ||
|
|
8d51a9db5b | ||
|
|
b39c00f344 | ||
|
|
83ce71c3bf | ||
|
|
f9d869a3dd | ||
|
|
0b0ce4193f | ||
|
|
719d8bd0c7 | ||
|
|
4fc1811c15 | ||
|
|
4b5f5abb4f | ||
|
|
95ad52ba58 | ||
|
|
dac30a222e | ||
|
|
7d1b593fbd | ||
|
|
d6a7559750 | ||
|
|
cff5ef0ec2 | ||
|
|
d478d8f143 | ||
|
|
7eca43cec9 | ||
|
|
9060190555 | ||
|
|
0de3869656 | ||
|
|
9f13033f15 | ||
|
|
48bf807430 | ||
|
|
c68e43a97f | ||
|
|
cc53d48fa8 | ||
|
|
ca6e799b97 | ||
|
|
0f8e387dc0 | ||
|
|
d62c595e51 | ||
|
|
dd3cf94744 | ||
|
|
eb56e0a3d7 | ||
|
|
8937c32cd5 | ||
|
|
a8a5da768a | ||
|
|
33bfcf56ce | ||
|
|
40cccb58a5 | ||
|
|
eb6c70137b | ||
|
|
df3b412a25 | ||
|
|
cfba0a5dfc | ||
|
|
3561b46fc6 | ||
|
|
8dfb88b669 | ||
|
|
2e3086e2aa | ||
|
|
f424056fea | ||
|
|
cfb7297cf1 | ||
|
|
8769b3d554 | ||
|
|
f8b82c376c | ||
|
|
868e1427a8 | ||
|
|
4aa74af694 | ||
|
|
f3fecd478d | ||
|
|
a5d1f67c34 | ||
|
|
102fa0e373 | ||
|
|
dbca3337b2 | ||
|
|
939f7ce781 | ||
|
|
c6e6ed87c5 | ||
|
|
8188cddcf7 | ||
|
|
9f17c05a15 | ||
|
|
c3455b01af | ||
|
|
d4e8d97e58 | ||
|
|
a86368dcb1 | ||
|
|
a13f906ed1 | ||
|
|
f9e91bf007 | ||
|
|
7c5fe42835 | ||
|
|
e76decbcf2 | ||
|
|
aac5a5dcaf | ||
|
|
9b3186f8a5 | ||
|
|
4917e367d5 | ||
|
|
955c3c7c71 | ||
|
|
8821162aef | ||
|
|
0356f7afb3 | ||
|
|
ba6fa54fdd | ||
|
|
b2d4ecab30 | ||
|
|
882a222d5c | ||
|
|
7b79c44608 | ||
|
|
580483d516 | ||
|
|
57c1078ee7 | ||
|
|
3a2920d4bc | ||
|
|
ad13fa3bb3 | ||
|
|
9b50119d31 | ||
|
|
3ff6316562 | ||
|
|
43058a3698 | ||
|
|
8c16ac47c1 | ||
|
|
6880cae3fb | ||
|
|
4fc684b2ed | ||
|
|
d63b9a1797 | ||
|
|
72bd934604 | ||
|
|
ed70e99b7b | ||
|
|
6d72b7c017 | ||
|
|
656fe49dbe | ||
|
|
3471ef3441 | ||
|
|
af9d8f1931 | ||
|
|
a30ca3e62f | ||
|
|
9e3bac0237 | ||
|
|
67a30b7a89 | ||
|
|
68ba45bcb2 | ||
|
|
6bacbac656 | ||
|
|
87e52b18c2 | ||
|
|
637cc9269d | ||
|
|
fcdd1944a4 | ||
|
|
5636784604 | ||
|
|
9a3b178da1 | ||
|
|
a1488005b6 | ||
|
|
cca68b31b1 | ||
|
|
85452aff4f | ||
|
|
d9d83abae2 | ||
|
|
0bc6cb2aeb | ||
|
|
d628cce058 | ||
|
|
b646e25fee | ||
|
|
94c3c8f412 | ||
|
|
d3988c04d6 | ||
|
|
dd0cb55997 | ||
|
|
aef27647a0 | ||
|
|
18f958d06d | ||
|
|
3efbb96119 | ||
|
|
e5d97666af | ||
|
|
83d7e932d6 | ||
|
|
f858f66fe0 | ||
|
|
fffb863f37 | ||
|
|
adf7c0e730 | ||
|
|
bbcee174ce | ||
|
|
9c6e6ea381 | ||
|
|
db9645fcb3 | ||
|
|
6af48d75a4 | ||
|
|
6234f7d1db | ||
|
|
301a65e05a | ||
|
|
376d4911b6 | ||
|
|
0559d2c19f | ||
|
|
54e482bc7b | ||
|
|
37c3b79551 | ||
|
|
78d8525699 | ||
|
|
23c00688b4 | ||
|
|
438410c22c | ||
|
|
59f348eb11 | ||
|
|
cbad65f657 | ||
|
|
1e8e107dd9 | ||
|
|
8631bf2bbb | ||
|
|
b9b41c20a6 | ||
|
|
2d3deccd8e | ||
|
|
68289a5d61 | ||
|
|
adccbc9b7b | ||
|
|
94b111cf6c | ||
|
|
7303955618 | ||
|
|
5e8bb9cc9d | ||
|
|
accfdf7936 | ||
|
|
c215247a6c | ||
|
|
96b202c80d | ||
|
|
0ac2f61a2c | ||
|
|
2aa6dcd9d8 | ||
|
|
469b85eb7c | ||
|
|
673ddfde04 | ||
|
|
56ca7eeb65 | ||
|
|
b414955230 | ||
|
|
af9072e725 | ||
|
|
9b903e93e3 | ||
|
|
7966f00a18 | ||
|
|
9a99a80710 | ||
|
|
be77874ec9 | ||
|
|
768286bffb | ||
|
|
f5c65d9ea1 | ||
|
|
f328890ed1 | ||
|
|
945bf626c6 | ||
|
|
f6869bbbc2 | ||
|
|
eafe11a7cf | ||
|
|
daba1b511b | ||
|
|
87a13d2c00 | ||
|
|
11a9b4baa0 | ||
|
|
de71fd0941 | ||
|
|
87c973c260 | ||
|
|
644ab0e270 | ||
|
|
3142220443 | ||
|
|
1f0ed5483a | ||
|
|
72f5a36522 | ||
|
|
7f19db1f7b | ||
|
|
3f2d658f20 | ||
|
|
05353c1f7e | ||
|
|
4d23e7c202 | ||
|
|
ad90b7dd2f | ||
|
|
3356a43c04 |
18
.gitignore
vendored
18
.gitignore
vendored
@@ -57,19 +57,21 @@ testgradient
|
|||||||
m4/*
|
m4/*
|
||||||
INSTALL
|
INSTALL
|
||||||
mkinstalldirs
|
mkinstalldirs
|
||||||
src/mutter-enum-types.[ch]
|
meta-enum-types.[ch]
|
||||||
src/stamp-mutter-enum-types.h
|
src/stamp-meta-enum-types.h
|
||||||
src/mutter-marshal.[ch]
|
|
||||||
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/meta-dbus-login1.[ch]
|
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-unstable-v*-protocol.c
|
||||||
src/xdg-shell-server-protocol.h
|
src/xdg-shell-unstable-v*-server-protocol.h
|
||||||
src/xserver-protocol.c
|
src/pointer-gestures-unstable-v*-protocol.c
|
||||||
src/xserver-server-protocol.h
|
src/pointer-gestures-unstable-v*-server-protocol.h
|
||||||
|
src/relative-pointer-unstable-v*-protocol.c
|
||||||
|
src/relative-pointer-unstable-v*-server-protocol.h
|
||||||
|
src/pointer-constraints-unstable-v*-protocol.c
|
||||||
|
src/pointer-constraints-unstable-v*-server-protocol.h
|
||||||
src/meta/meta-version.h
|
src/meta/meta-version.h
|
||||||
doc/reference/*.args
|
doc/reference/*.args
|
||||||
doc/reference/*.bak
|
doc/reference/*.bak
|
||||||
|
|||||||
@@ -9,5 +9,3 @@ DISTCLEANFILES = \
|
|||||||
intltool-update \
|
intltool-update \
|
||||||
po/stamp-it \
|
po/stamp-it \
|
||||||
po/.intltool-merge-cache
|
po/.intltool-merge-cache
|
||||||
|
|
||||||
DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc
|
|
||||||
|
|||||||
262
NEWS
262
NEWS
@@ -1,3 +1,265 @@
|
|||||||
|
3.19.4
|
||||||
|
======
|
||||||
|
* Fix updating stacking order when setting transient_for [Jonas; #755606]
|
||||||
|
* Support screen rotation when supported by the driver [Carlos; #745079]
|
||||||
|
* Protect against broken WM_CLASS property implementations [Sebastian; #759658]
|
||||||
|
* Handle wl_pointer v5 events on wayland [Carlos; #760637]
|
||||||
|
* Implement DND actions on wayland [Carlos; #760805]
|
||||||
|
* Misc. bug fixes [Jonas, Rui, Ray, Marek; #754711, #756789, #759297, #758613,
|
||||||
|
#760330, #760476, #759222, #760670]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Jonas Ådahl, Marek Chalupa, Carlos Garnacho, Sebastian Keller, Rui Matos,
|
||||||
|
Florian Müllner, Jasper St. Pierre, Ray Strode
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Aurimas Černius [lt]
|
||||||
|
|
||||||
|
3.19.3
|
||||||
|
======
|
||||||
|
* Correct refresh rate units on KMS/Wayland [Daniel; #758653]
|
||||||
|
* Fix crash when initial cursor position is not on a monitor [Marek; #756698]
|
||||||
|
* Fix crash when more CRTs are enabled than outputs connected [Rui; #751638]
|
||||||
|
* Fix touch pointer emulation on wayland [Carlos; #756754]
|
||||||
|
* Allow minimizing windows that don't advertise supporting it [Jasper; #758186]
|
||||||
|
* Force 2-finger scroll by default if available [Bastien; #759304]
|
||||||
|
* Fix crash during XWayland initialization [Marek; #751845]
|
||||||
|
* Ensure to send a ConfigureNotify to just mapped windows [Rui; #759492]
|
||||||
|
* Misc. bug fixes and cleanups [Carlos, Jonas, Lionel; #758239, #758633,
|
||||||
|
#755503, #759374]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Jonas Ådahl, Marek Chalupa, Carlos Garnacho, Lionel Landwerlin, Rui Matos,
|
||||||
|
Bastien Nocera, Daniel Stone, Jasper St. Pierre
|
||||||
|
|
||||||
|
3.19.2
|
||||||
|
======
|
||||||
|
* Fix crash on monitor unplug [Rui; #756796]
|
||||||
|
* Exit cleanly on initialization errors [Owen; #757311]
|
||||||
|
* Allow to determine backend setting from session type [Ray; #741666]
|
||||||
|
* Fix DRM device detection for non-PCI devices [Alban; #754911]
|
||||||
|
* Don't force placement of windows without buffer on wayland [Marek; #751887]
|
||||||
|
* Fix initialization of bypass compositor hint [Rui; #758544]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Alban Browaeys, Marek Chalupa, Rui Matos, Florian Müllner, Ray Strode,
|
||||||
|
Owen W. Taylor
|
||||||
|
|
||||||
|
3.19.1
|
||||||
|
======
|
||||||
|
* wayland: Allow to trigger popups through keyboard/touch [Carlos; #756296]
|
||||||
|
* Fix modifiers-only input source switching on Ubuntu [Alberts; #756543]
|
||||||
|
* Misc. bug fixes [Jonas, Rui, Giovanni, Florian; #756675, #756660, #746420,
|
||||||
|
#756548, #756796, #757101, #757148]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Jonas Ådahl, Giovanni Campagna, Carlos Garnacho, Rui Matos,
|
||||||
|
Alberts Muktupāvels, Florian Müllner
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Daniel Șerbănescu [ro]
|
||||||
|
|
||||||
|
3.18.1
|
||||||
|
======
|
||||||
|
* Misc. crash fixes [Jonas, Rui, Carlos, Owen, Florian; #755096, #754979,
|
||||||
|
#755490, #754357, #745785, #756642]
|
||||||
|
* Improve HiDPI support on wayland [Jonas; #755097]
|
||||||
|
* Fix doubly-scaled cursor on XWayland HiDPI [Jonas; #755099]
|
||||||
|
* Stop hiding titlebar buttons in dialogs [Florian; #641630]
|
||||||
|
* Add support for fullscreen/unfullscreen animations [Cosimo; #707248]
|
||||||
|
* Misc. bug fixes [Rui, Colin, Florian; #743339, #752047, #756074, #756649]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Jonas Ådahl, Cosimo Cecchi, Carlos Garnacho, Rui Matos, Florian Müllner,
|
||||||
|
Jasper St. Pierre, Colin Walters, Owen W. Taylor
|
||||||
|
|
||||||
|
3.18.0
|
||||||
|
======
|
||||||
|
* Misc. fixes [Florian, Jonas; #753434]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Jonas Ådahl, Florian Müllner
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Rūdolfs Mazurs [lv]
|
||||||
|
|
||||||
|
3.17.92
|
||||||
|
=======
|
||||||
|
* Don't omit the background color for backgrounds that don't fill the screen
|
||||||
|
[Ray; #754476]
|
||||||
|
* Fix up key state on FocusIn when running nested [Owen; #753948]
|
||||||
|
* Find the right DRM device instead of hardcoding card0 [Marek; #753434]
|
||||||
|
* Scale cursor on HiDPI screens [Jonas; #744932]
|
||||||
|
* Misc. fixes and cleanups [Lan, Jonas, Javier, Olivier; #754545, #754215,
|
||||||
|
#754621, #754715]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Jonas Ådahl, Marek Chalupa, Olivier Fourdan, Javier Jardón, Ting-Wei Lan,
|
||||||
|
Ray Strode, Owen W. Taylor
|
||||||
|
|
||||||
|
3.17.91
|
||||||
|
=======
|
||||||
|
* Send error on pointer-gesture protocol version mismatch [Jonas; #753855]
|
||||||
|
* Misc. cleanups [Jonas; #744932]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Jonas Ådahl
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Chao-Hsiung Liao [zh_TW], Piotr Drąg [pl]
|
||||||
|
|
||||||
|
3.17.90
|
||||||
|
=======
|
||||||
|
* Fix glitch with some fullscreen apps [Rui; #753020]
|
||||||
|
* Fix screen update issue with NVidia driver [Aaron, Rui; #728464]
|
||||||
|
* Only call frame callbacks for surfaces that get drawn [Adel; #739163]
|
||||||
|
* Misc. bug fixes and cleanups [Jonas, Rui, Ting-Wei; #753222, #752753, #753237,
|
||||||
|
#753380, #744104, #744932]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Jonas Ådahl, Adel Gadllah, Carlos Garnacho, Ting-Wei Lan, Rui Matos,
|
||||||
|
Florian Müllner, Aaron Plattner, Jasper St. Pierre
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Akom Chotiphantawanon [th]
|
||||||
|
|
||||||
|
3.17.4
|
||||||
|
======
|
||||||
|
* nested: Allow basic configuration of dummy outputs [Jonas; #747089]
|
||||||
|
* Send wl_surface.enter and wl_surface.leave on output changes [Jonas; #744453]
|
||||||
|
* Improve HiDPI handling on wayland [Jonas; #745655, #744934]
|
||||||
|
* Implement compositor-side animated cursors [Carlos; #752342]
|
||||||
|
* Misc. bug fixes [Peter, Marek, Carlos, Matthias, Rui; #750816, #751884,
|
||||||
|
#752248, #752551, #752552, #752673, #752674]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Jonas Ådahl, Marek Chalupa, Matthias Clasen, Carlos Garnacho, Peter Hutterer,
|
||||||
|
Rui Matos, Florian Müllner, Jasper St. Pierre
|
||||||
|
|
||||||
|
3.17.3
|
||||||
|
======
|
||||||
|
* Add X11/wayland clipboard interaction [Carlos; #738312]
|
||||||
|
* Support VM monitor layout hints on wayland [Thomas; #750363]
|
||||||
|
* Misc. bug fixes [Rui, Jonas, Olivier, Carlos, Ting-Wei, Peter, Florian;
|
||||||
|
#749994, #750256, #749716, #748705, #750552, #751036, #750007, #751136,
|
||||||
|
#750552, #751471, #751715, #750680]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Jonas Ådahl, Dave Airlie, Cosimo Cecchi, Olivier Fourdan, Carlos Garnacho,
|
||||||
|
Thomas Hellstrom, Peter Hutterer, Ting-Wei Lan, Jasper Lievisse Adriaanse,
|
||||||
|
Rui Matos, Florian Müllner, Jasper St. Pierre
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Marek Černocký [cs], Christian Kirbach [de], Pedro Albuquerque [pt]
|
||||||
|
|
||||||
|
3.17.2
|
||||||
|
======
|
||||||
|
* Honor default value for click method setting [Rui; #746290]
|
||||||
|
* Add X11/wayland clipboard interoperation [Carlos; #738312]
|
||||||
|
* Misc. bug fixes [Rui; #749076, #749711]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Carlos Garnacho, Rui Matos, Jasper St. Pierre
|
||||||
|
|
||||||
|
3.17.1
|
||||||
|
======
|
||||||
|
* Add public method to get neighboring monitor [Florian; #633994]
|
||||||
|
* Apply the right settings to the right input devices [Carlos; #747886]
|
||||||
|
* Fix scroll button setting [Ondrej; #747967]
|
||||||
|
* Add support for modal hint on wayland [Jonas; #745720]
|
||||||
|
* Don't reset idle time for non-hardware events [Rui; #748541]
|
||||||
|
* Misc. bug fixes [Ray, Rui; #748380, #748478]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Jonas Ådahl, Carlos Garnacho, Ondrej Holy, Rui Matos, Florian Müllner,
|
||||||
|
Jasper St. Pierre, Ray Strode, Tomeu Vizoso
|
||||||
|
|
||||||
|
3.16.1
|
||||||
|
======
|
||||||
|
* Add function to refresh all background instances [Rui; #739178]
|
||||||
|
* Fix swapped scroll methods on wayland [Ondrej; #746870]
|
||||||
|
* Manually activate stage to fix accessibility on wayland [Ray, Rui; #746670]
|
||||||
|
* Center pointer on primary monitor on startup [Carlos; #746896]
|
||||||
|
* wayland: Reword synchronized state application semantics [Jonas; #743617]
|
||||||
|
* Ensure input settings are applied on startup [Rui; #747434]
|
||||||
|
* Misc. bug fixes [Jonas, Giovanni, Calvin, Ray, Rui; #744932, #746509, #746692,
|
||||||
|
#746510, #746545, #747263]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Jonas Ådahl, Giovanni Campagna, Carlos Garnacho, Ondrej Holy, Rui Matos,
|
||||||
|
Jasper St. Pierre, Ray Strode, Calvin Walton
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Khaled Hosny [ar], Marek Černocký [cs]
|
||||||
|
|
||||||
|
3.16.0
|
||||||
|
======
|
||||||
|
* wayland: Don't skip notifying about initial maximized state [Jonas; #745303]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Jonas Ådahl
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Kjartan Maraas [nb], Jiri Grönroos [fi], Andika Triwidada [id],
|
||||||
|
Inaki Larranaga Murgoitio [eu], Ask H. Larsen [da], Muhammet Kara [tr]
|
||||||
|
|
||||||
|
3.15.92
|
||||||
|
=======
|
||||||
|
* Ensure pointer visibility on monitor changes [Rui, Marek; #745121, #745752]
|
||||||
|
* Fix geometry of shaded windows [Florian; #746145]
|
||||||
|
* Take over cursor visibility handling from gsd [Carlos; #712775]
|
||||||
|
* Fix touch interaction on window decorations [Carlos; #745335]
|
||||||
|
* Add options for libinput_config_click_method [Carlos; #746290]
|
||||||
|
* Scale window decorations on HiDPI displays [Florian; #744354]
|
||||||
|
* Misc. bug fixes [Carlos, Ray, Rui; #745163, #746295, #746098, #745734]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Marek Chalupa, Carlos Garnacho, Rui Matos, Florian Müllner,
|
||||||
|
Jasper St. Pierre, Ray Strode
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Piotr Drąg [pl], Milo Casagrande [it], Changwoo Ryu [ko],
|
||||||
|
Daniel Korostil [uk], Baurzhan Muftakhidinov [kk], Trần Ngọc Quân [vi],
|
||||||
|
Alexander Shopov [bg], Jordi Mas [ca], Samir Ribic [bs], A S Alam [pa],
|
||||||
|
Matej Urbančič [sl]
|
||||||
|
|
||||||
|
3.15.91
|
||||||
|
=======
|
||||||
|
* wayland: Fix nested compositor mode [Jonas; #745401]
|
||||||
|
* wayland: Fix pointer constraining [Marek; #727337]
|
||||||
|
* wayland: Fix input region on HiDPI [Jonas; #744933]
|
||||||
|
* Allow themes to style buttons differently based on function [Horst; #745108]
|
||||||
|
* Misc. bug fixes and cleanups [Ray, Rui, Alban; #745141, #745118, #745476,
|
||||||
|
#745442]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Jonas Ådahl, Alban Browaeys, Marek Chalupa, Horst, Rui Matos,
|
||||||
|
Jasper St. Pierre, Ray Strode
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Chao-Hsiung Liao [zh_TW], Efstathios Iosifidis [el], Dušan Kazik [sk],
|
||||||
|
Balázs Úr [hu], Daniel Mustieles [es], Claude Paroz [fr], Stas Solovey [ru],
|
||||||
|
Yosef Or Boczko [he], Rafael Ferreira [pt_BR], Aurimas Černius [lt],
|
||||||
|
Fran Dieguez [gl], Anders Jonsson [sv], Мирослав Николић [sr, sr@latin]
|
||||||
|
|
||||||
|
3.15.90
|
||||||
|
=======
|
||||||
|
* Initialize MetaOutput even when we can't get the EDID [Rui; #743412]
|
||||||
|
* Expose MetaMonitorManager to introspection [Rui; #743745]
|
||||||
|
* Fix flash on unredirection [Chris; #743858]
|
||||||
|
* Update xdg-shell implementation to v5 [Jonas; #744452]
|
||||||
|
* Do not try to use seat devices that aren't (yet) present [Ray; #744640]
|
||||||
|
* Add keybindings for switching to VT8-VT12 [Ray; #744800]
|
||||||
|
* Misc bug fixes [Jonas, Cosimo; #743678, #744500]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Jonas Ådahl, Cosimo Cecchi, Carlos Garnacho, Rui Matos, Jasper St. Pierre,
|
||||||
|
Ray Strode, Chris Wilson
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Yosef Or Boczko [he], Yuri Myasoedov [ru], Kristjan SCHMIDT [eo],
|
||||||
|
Matej Urbančič [sl], Dušan Kazik [sk]
|
||||||
|
|
||||||
3.15.4
|
3.15.4
|
||||||
======
|
======
|
||||||
* Use GTK+ theme for window decorations instead of metacity [Florian; #741917]
|
* Use GTK+ theme for window decorations instead of metacity [Florian; #741917]
|
||||||
|
|||||||
@@ -4,7 +4,6 @@
|
|||||||
srcdir=`dirname $0`
|
srcdir=`dirname $0`
|
||||||
test -z "$srcdir" && srcdir=.
|
test -z "$srcdir" && srcdir=.
|
||||||
|
|
||||||
PKG_NAME="mutter"
|
|
||||||
REQUIRED_AUTOMAKE_VERSION=1.11
|
REQUIRED_AUTOMAKE_VERSION=1.11
|
||||||
|
|
||||||
(test -f $srcdir/configure.ac \
|
(test -f $srcdir/configure.ac \
|
||||||
@@ -19,4 +18,4 @@ which gnome-autogen.sh || {
|
|||||||
echo "your distribution's package manager)."
|
echo "your distribution's package manager)."
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
USE_GNOME2_MACROS=1 USE_COMMON_DOC_BUILD=yes . gnome-autogen.sh
|
. gnome-autogen.sh
|
||||||
|
|||||||
36
configure.ac
36
configure.ac
@@ -1,7 +1,7 @@
|
|||||||
AC_PREREQ(2.62)
|
AC_PREREQ(2.62)
|
||||||
|
|
||||||
m4_define([mutter_major_version], [3])
|
m4_define([mutter_major_version], [3])
|
||||||
m4_define([mutter_minor_version], [15])
|
m4_define([mutter_minor_version], [19])
|
||||||
m4_define([mutter_micro_version], [4])
|
m4_define([mutter_micro_version], [4])
|
||||||
|
|
||||||
m4_define([mutter_version],
|
m4_define([mutter_version],
|
||||||
@@ -46,37 +46,25 @@ IT_PROG_INTLTOOL([0.41])
|
|||||||
AC_PROG_CC
|
AC_PROG_CC
|
||||||
AC_PROG_CC_C_O
|
AC_PROG_CC_C_O
|
||||||
AC_PROG_INSTALL
|
AC_PROG_INSTALL
|
||||||
|
AC_PROG_SED
|
||||||
AC_HEADER_STDC
|
AC_HEADER_STDC
|
||||||
PKG_PROG_PKG_CONFIG([0.21])
|
PKG_PROG_PKG_CONFIG([0.21])
|
||||||
|
|
||||||
# Sets GLIB_GENMARSHAL and GLIB_MKENUMS
|
# Sets GLIB_GENMARSHAL and GLIB_MKENUMS
|
||||||
AM_PATH_GLIB_2_0()
|
AM_PATH_GLIB_2_0()
|
||||||
|
|
||||||
#### Integer sizes
|
|
||||||
|
|
||||||
AC_CHECK_SIZEOF(char)
|
|
||||||
AC_CHECK_SIZEOF(short)
|
|
||||||
AC_CHECK_SIZEOF(long)
|
|
||||||
AC_CHECK_SIZEOF(int)
|
|
||||||
AC_CHECK_SIZEOF(void *)
|
|
||||||
AC_CHECK_SIZEOF(long long)
|
|
||||||
AC_CHECK_SIZEOF(__int64)
|
|
||||||
|
|
||||||
## byte order
|
|
||||||
AC_C_BIGENDIAN
|
|
||||||
|
|
||||||
CANBERRA_GTK=libcanberra-gtk3
|
CANBERRA_GTK=libcanberra-gtk3
|
||||||
CANBERRA_GTK_VERSION=0.26
|
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.9.11
|
gtk+-3.0 >= 3.19.8
|
||||||
gio-unix-2.0 >= 2.35.1
|
gio-unix-2.0 >= 2.35.1
|
||||||
pango >= 1.2.0
|
pango >= 1.2.0
|
||||||
cairo >= 1.10.0
|
cairo >= 1.10.0
|
||||||
gsettings-desktop-schemas >= 3.15.4
|
gsettings-desktop-schemas >= 3.19.3
|
||||||
$CLUTTER_PACKAGE >= 1.21.3
|
$CLUTTER_PACKAGE >= 1.25.1
|
||||||
cogl-1.0 >= 1.17.1
|
cogl-1.0 >= 1.17.1
|
||||||
upower-glib >= 0.99.0
|
upower-glib >= 0.99.0
|
||||||
gnome-desktop-3.0
|
gnome-desktop-3.0
|
||||||
@@ -90,6 +78,7 @@ MUTTER_PC_MODULES="
|
|||||||
xkeyboard-config
|
xkeyboard-config
|
||||||
xkbcommon >= 0.4.3
|
xkbcommon >= 0.4.3
|
||||||
xkbcommon-x11
|
xkbcommon-x11
|
||||||
|
xrender
|
||||||
x11-xcb
|
x11-xcb
|
||||||
xcb-randr
|
xcb-randr
|
||||||
"
|
"
|
||||||
@@ -231,6 +220,10 @@ AS_IF([test "$have_wayland" = "yes"], [
|
|||||||
[AC_MSG_ERROR([Could not find wayland-scanner in your PATH, required for parsing wayland extension protocols])])
|
[AC_MSG_ERROR([Could not find wayland-scanner in your PATH, required for parsing wayland extension protocols])])
|
||||||
AC_SUBST([WAYLAND_SCANNER])
|
AC_SUBST([WAYLAND_SCANNER])
|
||||||
AC_DEFINE([HAVE_WAYLAND],[1],[Define if you want to enable Wayland support])
|
AC_DEFINE([HAVE_WAYLAND],[1],[Define if you want to enable Wayland support])
|
||||||
|
|
||||||
|
PKG_CHECK_MODULES(WAYLAND_PROTOCOLS, [wayland-protocols >= 1.1],
|
||||||
|
[ac_wayland_protocols_pkgdatadir=`$PKG_CONFIG --variable=pkgdatadir wayland-protocols`])
|
||||||
|
AC_SUBST(WAYLAND_PROTOCOLS_DATADIR, $ac_wayland_protocols_pkgdatadir)
|
||||||
])
|
])
|
||||||
AM_CONDITIONAL([HAVE_WAYLAND],[test "$have_wayland" = "yes"])
|
AM_CONDITIONAL([HAVE_WAYLAND],[test "$have_wayland" = "yes"])
|
||||||
|
|
||||||
@@ -283,6 +276,8 @@ AC_CHECK_LIB(Xrandr, XRRUpdateConfiguration,
|
|||||||
|
|
||||||
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])
|
||||||
|
PKG_CHECK_EXISTS([xrandr >= 1.5.0],
|
||||||
|
AC_DEFINE([HAVE_XRANDR15],[1],[Define if you have support for XRandR 1.5 or greater]))
|
||||||
fi
|
fi
|
||||||
|
|
||||||
MUTTER_LIBS="$MUTTER_LIBS $RANDR_LIBS $X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS -lm"
|
MUTTER_LIBS="$MUTTER_LIBS $RANDR_LIBS $X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS -lm"
|
||||||
@@ -329,7 +324,10 @@ if test "x$enable_debug" = "xyes"; then
|
|||||||
CFLAGS="$CFLAGS -g -O"
|
CFLAGS="$CFLAGS -g -O"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
GTK_DOC_CHECK([1.15], [--flavour no-tmpl])
|
AC_CHECK_DECL([GL_EXT_x11_sync_object],
|
||||||
|
[],
|
||||||
|
[AC_MSG_ERROR([GL_EXT_x11_sync_object definition not found, please update your GL headers])],
|
||||||
|
[#include <GL/glx.h>])
|
||||||
|
|
||||||
#### Warnings (last since -Werror can disturb other tests)
|
#### Warnings (last since -Werror can disturb other tests)
|
||||||
|
|
||||||
@@ -402,8 +400,6 @@ Makefile
|
|||||||
data/Makefile
|
data/Makefile
|
||||||
doc/Makefile
|
doc/Makefile
|
||||||
doc/man/Makefile
|
doc/man/Makefile
|
||||||
doc/reference/Makefile
|
|
||||||
doc/reference/meta-docs.sgml
|
|
||||||
src/Makefile
|
src/Makefile
|
||||||
src/libmutter.pc
|
src/libmutter.pc
|
||||||
src/compositor/plugins/Makefile
|
src/compositor/plugins/Makefile
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
desktopfiles_in_files = \
|
desktopfiles_in_files = \
|
||||||
mutter.desktop.in \
|
mutter.desktop.in
|
||||||
mutter-wayland.desktop.in
|
|
||||||
desktopfilesdir = $(datadir)/applications
|
desktopfilesdir = $(datadir)/applications
|
||||||
desktopfiles_DATA = $(desktopfiles_in_files:.desktop.in=.desktop)
|
desktopfiles_DATA = $(desktopfiles_in_files:.desktop.in=.desktop)
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +0,0 @@
|
|||||||
[Desktop Entry]
|
|
||||||
Type=Application
|
|
||||||
_Name=Mutter (wayland compositor)
|
|
||||||
Exec=mutter --wayland --display-server
|
|
||||||
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
|
|
||||||
@@ -29,5 +29,25 @@
|
|||||||
<default><![CDATA[['<Primary><Alt>F7']]]></default>
|
<default><![CDATA[['<Primary><Alt>F7']]]></default>
|
||||||
<_summary>Switch to VT 7</_summary>
|
<_summary>Switch to VT 7</_summary>
|
||||||
</key>
|
</key>
|
||||||
|
<key name="switch-to-session-8" type="as">
|
||||||
|
<default><![CDATA[['<Primary><Alt>F8']]]></default>
|
||||||
|
<_summary>Switch to VT 8</_summary>
|
||||||
|
</key>
|
||||||
|
<key name="switch-to-session-9" type="as">
|
||||||
|
<default><![CDATA[['<Primary><Alt>F9']]]></default>
|
||||||
|
<_summary>Switch to VT 9</_summary>
|
||||||
|
</key>
|
||||||
|
<key name="switch-to-session-10" type="as">
|
||||||
|
<default><![CDATA[['<Primary><Alt>F10']]]></default>
|
||||||
|
<_summary>Switch to VT 10</_summary>
|
||||||
|
</key>
|
||||||
|
<key name="switch-to-session-11" type="as">
|
||||||
|
<default><![CDATA[['<Primary><Alt>F11']]]></default>
|
||||||
|
<_summary>Switch to VT 11</_summary>
|
||||||
|
</key>
|
||||||
|
<key name="switch-to-session-12" type="as">
|
||||||
|
<default><![CDATA[['<Primary><Alt>F12']]]></default>
|
||||||
|
<_summary>Switch to VT 12</_summary>
|
||||||
|
</key>
|
||||||
</schema>
|
</schema>
|
||||||
</schemalist>
|
</schemalist>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
SUBDIRS = man reference
|
SUBDIRS = man
|
||||||
|
|
||||||
EXTRA_DIST = dialogs.txt code-overview.txt \
|
EXTRA_DIST = dialogs.txt code-overview.txt \
|
||||||
how-to-get-focus-right.txt rationales.txt
|
how-to-get-focus-right.txt rationales.txt
|
||||||
|
|||||||
@@ -1,183 +0,0 @@
|
|||||||
## Process this file with automake to produce Makefile.in
|
|
||||||
|
|
||||||
# We require automake 1.6 at least.
|
|
||||||
AUTOMAKE_OPTIONS = 1.6
|
|
||||||
|
|
||||||
# This is a blank Makefile.am for using gtk-doc.
|
|
||||||
# Copy this to your project's API docs directory and modify the variables to
|
|
||||||
# suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples
|
|
||||||
# of using the various options.
|
|
||||||
|
|
||||||
# The name of the module, e.g. 'glib'.
|
|
||||||
DOC_MODULE=meta
|
|
||||||
|
|
||||||
# Uncomment for versioned docs and specify the version of the module, e.g. '2'.
|
|
||||||
#DOC_MODULE_VERSION=2
|
|
||||||
|
|
||||||
|
|
||||||
# The top-level SGML file. You can change this if you want to.
|
|
||||||
DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.sgml
|
|
||||||
|
|
||||||
# Directories containing the source code, relative to $(srcdir).
|
|
||||||
# gtk-doc will search all .c and .h files beneath these paths
|
|
||||||
# for inline comments documenting functions and macros.
|
|
||||||
# e.g. DOC_SOURCE_DIR=../../../gtk ../../../gdk
|
|
||||||
DOC_SOURCE_DIR=../../src/
|
|
||||||
|
|
||||||
# Extra options to pass to gtkdoc-scangobj. Not normally needed.
|
|
||||||
SCANGOBJ_OPTIONS=
|
|
||||||
|
|
||||||
# Extra options to supply to gtkdoc-scan.
|
|
||||||
# e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED"
|
|
||||||
SCAN_OPTIONS=--rebuild-types
|
|
||||||
|
|
||||||
# Extra options to supply to gtkdoc-mkdb.
|
|
||||||
# e.g. MKDB_OPTIONS=--xml-mode --output-format=xml
|
|
||||||
MKDB_OPTIONS=--xml-mode --output-format=xml
|
|
||||||
|
|
||||||
# Extra options to supply to gtkdoc-mktmpl
|
|
||||||
# e.g. MKTMPL_OPTIONS=--only-section-tmpl
|
|
||||||
MKTMPL_OPTIONS=
|
|
||||||
|
|
||||||
# Extra options to supply to gtkdoc-mkhtml
|
|
||||||
MKHTML_OPTIONS=
|
|
||||||
|
|
||||||
# Extra options to supply to gtkdoc-fixref. Not normally needed.
|
|
||||||
# e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html
|
|
||||||
FIXXREF_OPTIONS=
|
|
||||||
|
|
||||||
# Used for dependencies. The docs will be rebuilt if any of these change.
|
|
||||||
# e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h
|
|
||||||
# e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c
|
|
||||||
HFILE_GLOB=$(top_srcdir)/src/*/*.h
|
|
||||||
CFILE_GLOB=$(top_srcdir)/src/*/*.c
|
|
||||||
|
|
||||||
# Extra header to include when scanning, which are not under DOC_SOURCE_DIR
|
|
||||||
# e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h
|
|
||||||
EXTRA_HFILES=
|
|
||||||
|
|
||||||
# Header files or dirs to ignore when scanning. Use base file/dir names
|
|
||||||
# e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h private_code
|
|
||||||
IGNORE_HFILES= \
|
|
||||||
async-getprop.h \
|
|
||||||
atoms.h \
|
|
||||||
bell.h \
|
|
||||||
boxes-private.h \
|
|
||||||
clutter-utils.h \
|
|
||||||
cogl-utils.h \
|
|
||||||
compositor-private.h \
|
|
||||||
constraints.h \
|
|
||||||
core.h \
|
|
||||||
display-private.h \
|
|
||||||
draw-workspace.h \
|
|
||||||
edge-resistance.h \
|
|
||||||
eventqueue.h \
|
|
||||||
frame.h \
|
|
||||||
frames.h \
|
|
||||||
group-private.h \
|
|
||||||
group-props.h \
|
|
||||||
iconcache.h \
|
|
||||||
inlinepixbufs.h \
|
|
||||||
keybindings-private.h \
|
|
||||||
meta-background-actor-private.h \
|
|
||||||
meta-background-group-private.h \
|
|
||||||
meta-dbus-login1.h \
|
|
||||||
meta-module.h \
|
|
||||||
meta-plugin-manager.h \
|
|
||||||
meta-shadow-factory-private.h \
|
|
||||||
meta-texture-rectangle.h \
|
|
||||||
meta-texture-tower.h \
|
|
||||||
meta-window-actor-private.h \
|
|
||||||
meta-window-group.h \
|
|
||||||
meta-window-shape.h \
|
|
||||||
mutter-enum-types.h \
|
|
||||||
mutter-Xatomtype.h \
|
|
||||||
place.h \
|
|
||||||
preview-widget.h \
|
|
||||||
region-utils.h \
|
|
||||||
resizepopup.h \
|
|
||||||
screen-private.h \
|
|
||||||
session.h \
|
|
||||||
stack.h \
|
|
||||||
stack-tracker.h \
|
|
||||||
stamp-mutter-enum-types.h \
|
|
||||||
tabpopup.h \
|
|
||||||
theme.h \
|
|
||||||
theme-private.h \
|
|
||||||
tile-preview.h \
|
|
||||||
ui.h \
|
|
||||||
window-private.h \
|
|
||||||
window-props.h \
|
|
||||||
workspace-private.h \
|
|
||||||
xprops.h \
|
|
||||||
$(NULL)
|
|
||||||
|
|
||||||
if !HAVE_NATIVE_BACKEND
|
|
||||||
IGNORE_HFILES+= \
|
|
||||||
meta-backend-native.h \
|
|
||||||
meta-barrier-native.h \
|
|
||||||
meta-cursor-renderer-native.h \
|
|
||||||
meta-idle-monitor-native.h \
|
|
||||||
meta-input-settings-native.h \
|
|
||||||
meta-monitor-manager-kms.h \
|
|
||||||
$(NULL)
|
|
||||||
endif
|
|
||||||
|
|
||||||
if !HAVE_WAYLAND
|
|
||||||
IGNORE_HFILES += \
|
|
||||||
meta-surface-actor-wayland.h \
|
|
||||||
wayland \
|
|
||||||
$(NULL)
|
|
||||||
endif
|
|
||||||
|
|
||||||
MKDB_OPTIONS+=--ignore-files="$(IGNORE_HFILES)"
|
|
||||||
|
|
||||||
# Images to copy into HTML directory.
|
|
||||||
# e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png
|
|
||||||
HTML_IMAGES=
|
|
||||||
|
|
||||||
# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE).
|
|
||||||
# e.g. content_files=running.sgml building.sgml changes-2.0.sgml
|
|
||||||
content_files= \
|
|
||||||
mutter-overview.xml \
|
|
||||||
running-mutter.xml \
|
|
||||||
$(NULL)
|
|
||||||
|
|
||||||
# SGML files where gtk-doc abbrevations (#GtkWidget) are expanded
|
|
||||||
# These files must be listed here *and* in content_files
|
|
||||||
# e.g. expand_content_files=running.sgml
|
|
||||||
expand_content_files= \
|
|
||||||
mutter-overview.xml \
|
|
||||||
running-mutter.xml \
|
|
||||||
$(NULL)
|
|
||||||
|
|
||||||
# CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library.
|
|
||||||
# Only needed if you are using gtkdoc-scangobj to dynamically query widget
|
|
||||||
# signals and properties.
|
|
||||||
# e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS)
|
|
||||||
# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib)
|
|
||||||
GTKDOC_CFLAGS=$(MUTTER_CFLAGS)
|
|
||||||
GTKDOC_LIBS=$(MUTTER_LIBS) $(top_builddir)/src/libmutter.la
|
|
||||||
|
|
||||||
# This includes the standard gtk-doc make rules, copied by gtkdocize.
|
|
||||||
include $(top_srcdir)/gtk-doc.make
|
|
||||||
|
|
||||||
# Other files to distribute
|
|
||||||
# e.g. EXTRA_DIST += version.xml.in
|
|
||||||
EXTRA_DIST +=
|
|
||||||
|
|
||||||
# Files not to distribute
|
|
||||||
# for --rebuild-types in $(SCAN_OPTIONS), e.g. $(DOC_MODULE).types
|
|
||||||
# for --rebuild-sections in $(SCAN_OPTIONS) e.g. $(DOC_MODULE)-sections.txt
|
|
||||||
DISTCLEANFILES = $(DOC_MODULES).types
|
|
||||||
|
|
||||||
# Comment this out if you want 'make check' to test you doc status
|
|
||||||
# and run some sanity checks
|
|
||||||
if ENABLE_GTK_DOC
|
|
||||||
TESTS_ENVIRONMENT = cd $(srcdir) && \
|
|
||||||
DOC_MODULE=$(DOC_MODULE) DOC_MAIN_SGML_FILE=$(DOC_MAIN_SGML_FILE) \
|
|
||||||
SRCDIR=$(abs_srcdir) BUILDDIR=$(abs_builddir)
|
|
||||||
#TESTS = $(GTKDOC_CHECK)
|
|
||||||
endif
|
|
||||||
|
|
||||||
-include $(top_srcdir)/git.mk
|
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
<?xml version="1.0"?>
|
|
||||||
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
|
|
||||||
"http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd"
|
|
||||||
[
|
|
||||||
<!ENTITY % local.common.attrib "xmlns:xi CDATA #FIXED 'http://www.w3.org/2003/XInclude'">
|
|
||||||
<!ENTITY version "@VERSION@">
|
|
||||||
]>
|
|
||||||
<book id="index">
|
|
||||||
<bookinfo>
|
|
||||||
<title>Mutter Reference Manual</title>
|
|
||||||
<releaseinfo>
|
|
||||||
This document is for Mutter &version;.
|
|
||||||
The latest version of this documentation can be found on-line at
|
|
||||||
<ulink role="online-location" url="http://developer.gnome.org/meta/">http://developer.gnome.org/meta/</ulink>.
|
|
||||||
</releaseinfo>
|
|
||||||
</bookinfo>
|
|
||||||
|
|
||||||
<xi:include href="xml/mutter-overview.xml"/>
|
|
||||||
<xi:include href="xml/running-mutter.xml"/>
|
|
||||||
|
|
||||||
<part id="core-reference">
|
|
||||||
<title>Mutter Core Reference</title>
|
|
||||||
<xi:include href="xml/main.xml"/>
|
|
||||||
<xi:include href="xml/common.xml"/>
|
|
||||||
<xi:include href="xml/prefs.xml"/>
|
|
||||||
<xi:include href="xml/util.xml"/>
|
|
||||||
<xi:include href="xml/errors.xml"/>
|
|
||||||
<xi:include href="xml/meta-plugin.xml"/>
|
|
||||||
<xi:include href="xml/barrier.xml"/>
|
|
||||||
<xi:include href="xml/boxes.xml"/>
|
|
||||||
<xi:include href="xml/compositor.xml"/>
|
|
||||||
<xi:include href="xml/display.xml"/>
|
|
||||||
<xi:include href="xml/group.xml"/>
|
|
||||||
<xi:include href="xml/keybindings.xml"/>
|
|
||||||
<xi:include href="xml/meta-background-actor.xml"/>
|
|
||||||
<xi:include href="xml/meta-shadow-factory.xml"/>
|
|
||||||
<xi:include href="xml/meta-shaped-texture.xml"/>
|
|
||||||
<xi:include href="xml/meta-window-actor.xml"/>
|
|
||||||
<xi:include href="xml/screen.xml"/>
|
|
||||||
<xi:include href="xml/window.xml"/>
|
|
||||||
<xi:include href="xml/workspace.xml"/>
|
|
||||||
</part>
|
|
||||||
|
|
||||||
<chapter id="object-tree">
|
|
||||||
<title>Object Hierarchy</title>
|
|
||||||
<xi:include href="xml/tree_index.sgml"/>
|
|
||||||
</chapter>
|
|
||||||
<index id="api-index-full">
|
|
||||||
<title>API Index</title>
|
|
||||||
<xi:include href="xml/api-index-full.xml"><xi:fallback /></xi:include>
|
|
||||||
</index>
|
|
||||||
<index id="deprecated-api-index" role="deprecated">
|
|
||||||
<title>Index of deprecated API</title>
|
|
||||||
<xi:include href="xml/api-index-deprecated.xml"><xi:fallback /></xi:include>
|
|
||||||
</index>
|
|
||||||
|
|
||||||
<xi:include href="xml/annotation-glossary.xml"><xi:fallback /></xi:include>
|
|
||||||
</book>
|
|
||||||
@@ -1,675 +0,0 @@
|
|||||||
<SECTION>
|
|
||||||
<FILE>barrier</FILE>
|
|
||||||
<TITLE>MetaBarrier</TITLE>
|
|
||||||
MetaBarrier
|
|
||||||
MetaBarrierClass
|
|
||||||
meta_barrier_is_active
|
|
||||||
meta_barrier_destroy
|
|
||||||
meta_barrier_release
|
|
||||||
MetaBarrierDirection
|
|
||||||
MetaBarrierEvent
|
|
||||||
<SUBSECTION Standard>
|
|
||||||
META_BARRIER
|
|
||||||
META_BARRIER_CLASS
|
|
||||||
META_BARRIER_GET_CLASS
|
|
||||||
META_IS_BARRIER
|
|
||||||
META_IS_BARRIER_CLASS
|
|
||||||
META_TYPE_BARRIER
|
|
||||||
META_TYPE_BARRIER_EVENT
|
|
||||||
MetaBarrierPrivate
|
|
||||||
meta_barrier_event_get_type
|
|
||||||
meta_barrier_get_type
|
|
||||||
</SECTION>
|
|
||||||
|
|
||||||
<SECTION>
|
|
||||||
<FILE>boxes</FILE>
|
|
||||||
MetaRectangle
|
|
||||||
MetaStrut
|
|
||||||
MetaEdgeType
|
|
||||||
MetaEdge
|
|
||||||
meta_rectangle_copy
|
|
||||||
meta_rectangle_free
|
|
||||||
meta_rect
|
|
||||||
meta_rectangle_area
|
|
||||||
meta_rectangle_intersect
|
|
||||||
meta_rectangle_equal
|
|
||||||
meta_rectangle_union
|
|
||||||
meta_rectangle_overlap
|
|
||||||
meta_rectangle_vert_overlap
|
|
||||||
meta_rectangle_horiz_overlap
|
|
||||||
meta_rectangle_could_fit_rect
|
|
||||||
meta_rectangle_contains_rect
|
|
||||||
<SUBSECTION Standard>
|
|
||||||
META_TYPE_RECTANGLE
|
|
||||||
meta_rectangle_get_type
|
|
||||||
</SECTION>
|
|
||||||
|
|
||||||
<SECTION>
|
|
||||||
<FILE>common</FILE>
|
|
||||||
META_VIRTUAL_CORE_POINTER_ID
|
|
||||||
META_VIRTUAL_CORE_KEYBOARD_ID
|
|
||||||
MetaFrameFlags
|
|
||||||
MetaMenuOp
|
|
||||||
MetaWindowMenuFunc
|
|
||||||
MetaGrabOp
|
|
||||||
MetaCursor
|
|
||||||
MetaFrameType
|
|
||||||
MetaVirtualModifier
|
|
||||||
MetaDirection
|
|
||||||
MetaMotionDirection
|
|
||||||
MetaSide
|
|
||||||
MetaButtonFunction
|
|
||||||
MAX_BUTTONS_PER_CORNER
|
|
||||||
MetaButtonLayout
|
|
||||||
MetaFrameBorders
|
|
||||||
meta_frame_borders_clear
|
|
||||||
META_ICON_WIDTH
|
|
||||||
META_ICON_HEIGHT
|
|
||||||
META_MINI_ICON_WIDTH
|
|
||||||
META_MINI_ICON_HEIGHT
|
|
||||||
META_DEFAULT_ICON_NAME
|
|
||||||
META_PRIORITY_RESIZE
|
|
||||||
META_PRIORITY_BEFORE_REDRAW
|
|
||||||
META_PRIORITY_REDRAW
|
|
||||||
META_PRIORITY_PREFS_NOTIFY
|
|
||||||
POINT_IN_RECT
|
|
||||||
MetaStackLayer
|
|
||||||
MetaWindowMenu
|
|
||||||
MetaResizePopup
|
|
||||||
</SECTION>
|
|
||||||
|
|
||||||
<SECTION>
|
|
||||||
<FILE>compositor</FILE>
|
|
||||||
MetaCompEffect
|
|
||||||
MetaCompositor
|
|
||||||
meta_compositor_new
|
|
||||||
meta_compositor_destroy
|
|
||||||
meta_compositor_manage_screen
|
|
||||||
meta_compositor_unmanage_screen
|
|
||||||
meta_compositor_window_shape_changed
|
|
||||||
meta_compositor_process_event
|
|
||||||
meta_compositor_filter_keybinding
|
|
||||||
meta_compositor_add_window
|
|
||||||
meta_compositor_remove_window
|
|
||||||
meta_compositor_show_window
|
|
||||||
meta_compositor_hide_window
|
|
||||||
meta_compositor_switch_workspace
|
|
||||||
meta_compositor_maximize_window
|
|
||||||
meta_compositor_unmaximize_window
|
|
||||||
meta_compositor_sync_window_geometry
|
|
||||||
meta_compositor_set_updates_frozen
|
|
||||||
meta_compositor_queue_frame_drawn
|
|
||||||
meta_compositor_sync_stack
|
|
||||||
meta_compositor_sync_screen_size
|
|
||||||
meta_compositor_flash_screen
|
|
||||||
meta_get_stage_for_screen
|
|
||||||
meta_get_overlay_group_for_screen
|
|
||||||
meta_get_overlay_window
|
|
||||||
meta_get_window_actors
|
|
||||||
meta_get_window_group_for_screen
|
|
||||||
meta_get_top_window_group_for_screen
|
|
||||||
meta_disable_unredirect_for_screen
|
|
||||||
meta_enable_unredirect_for_screen
|
|
||||||
meta_set_stage_input_region
|
|
||||||
meta_empty_stage_input_region
|
|
||||||
</SECTION>
|
|
||||||
|
|
||||||
<SECTION>
|
|
||||||
<FILE>display</FILE>
|
|
||||||
MetaTabList
|
|
||||||
MetaTabShowType
|
|
||||||
meta_XFree
|
|
||||||
meta_display_get_compositor_version
|
|
||||||
meta_display_get_xinput_opcode
|
|
||||||
meta_display_supports_extended_barriers
|
|
||||||
meta_display_get_xdisplay
|
|
||||||
meta_display_get_compositor
|
|
||||||
meta_display_get_screens
|
|
||||||
meta_display_has_shape
|
|
||||||
meta_display_screen_for_root
|
|
||||||
meta_display_get_focus_window
|
|
||||||
meta_display_xwindow_is_a_no_focus_window
|
|
||||||
meta_display_get_damage_event_base
|
|
||||||
meta_display_get_shape_event_base
|
|
||||||
meta_display_xserver_time_is_before
|
|
||||||
meta_display_get_last_user_time
|
|
||||||
meta_display_get_current_time
|
|
||||||
meta_display_get_current_time_roundtrip
|
|
||||||
meta_display_get_ignored_modifier_mask
|
|
||||||
meta_display_get_tab_list
|
|
||||||
meta_display_get_tab_next
|
|
||||||
meta_display_get_tab_current
|
|
||||||
meta_display_begin_grab_op
|
|
||||||
meta_display_end_grab_op
|
|
||||||
meta_display_get_grab_op
|
|
||||||
meta_display_add_keybinding
|
|
||||||
meta_display_remove_keybinding
|
|
||||||
meta_display_get_keybinding_action
|
|
||||||
meta_display_set_input_focus_window
|
|
||||||
meta_display_focus_the_no_focus_window
|
|
||||||
meta_display_sort_windows_by_stacking
|
|
||||||
meta_display_get_leader_window
|
|
||||||
meta_display_add_ignored_crossing_serial
|
|
||||||
meta_display_unmanage_screen
|
|
||||||
meta_display_clear_mouse_mode
|
|
||||||
MetaDisplay
|
|
||||||
MetaDisplayClass
|
|
||||||
<SUBSECTION Standard>
|
|
||||||
META_DISPLAY
|
|
||||||
META_DISPLAY_CLASS
|
|
||||||
META_DISPLAY_GET_CLASS
|
|
||||||
META_IS_DISPLAY
|
|
||||||
META_IS_DISPLAY_CLASS
|
|
||||||
META_TYPE_DISPLAY
|
|
||||||
meta_display_get_type
|
|
||||||
</SECTION>
|
|
||||||
|
|
||||||
<SECTION>
|
|
||||||
<FILE>errors</FILE>
|
|
||||||
meta_error_trap_push
|
|
||||||
meta_error_trap_pop
|
|
||||||
meta_error_trap_push_with_return
|
|
||||||
meta_error_trap_pop_with_return
|
|
||||||
</SECTION>
|
|
||||||
|
|
||||||
<SECTION>
|
|
||||||
<FILE>group</FILE>
|
|
||||||
MetaGroup
|
|
||||||
meta_window_get_group
|
|
||||||
meta_window_compute_group
|
|
||||||
meta_window_shutdown_group
|
|
||||||
meta_window_group_leader_changed
|
|
||||||
meta_display_lookup_group
|
|
||||||
meta_group_list_windows
|
|
||||||
meta_group_update_layers
|
|
||||||
meta_group_get_startup_id
|
|
||||||
meta_group_get_size
|
|
||||||
meta_group_property_notify
|
|
||||||
</SECTION>
|
|
||||||
|
|
||||||
<SECTION>
|
|
||||||
<FILE>keybindings</FILE>
|
|
||||||
MetaKeyBinding
|
|
||||||
META_TYPE_KEY_BINDING
|
|
||||||
meta_key_binding_get_name
|
|
||||||
meta_key_binding_get_modifiers
|
|
||||||
meta_key_binding_get_mask
|
|
||||||
meta_key_binding_is_builtin
|
|
||||||
meta_keybindings_set_custom_handler
|
|
||||||
meta_screen_ungrab_all_keys
|
|
||||||
meta_screen_grab_all_keys
|
|
||||||
</SECTION>
|
|
||||||
|
|
||||||
<SECTION>
|
|
||||||
<FILE>main</FILE>
|
|
||||||
meta_get_option_context
|
|
||||||
meta_init
|
|
||||||
meta_run
|
|
||||||
meta_get_replace_current_wm
|
|
||||||
meta_set_wm_name
|
|
||||||
meta_set_gnome_wm_keybindings
|
|
||||||
MetaExitCode
|
|
||||||
meta_exit
|
|
||||||
meta_quit
|
|
||||||
</SECTION>
|
|
||||||
|
|
||||||
<SECTION>
|
|
||||||
<FILE>meta-background</FILE>
|
|
||||||
<TITLE>MetaBackground</TITLE>
|
|
||||||
MetaBackgroundEffects
|
|
||||||
MetaBackground
|
|
||||||
MetaBackgroundClass
|
|
||||||
meta_background_new
|
|
||||||
meta_background_copy
|
|
||||||
meta_background_load_gradient
|
|
||||||
meta_background_load_color
|
|
||||||
meta_background_load_still_frame
|
|
||||||
meta_background_load_file_async
|
|
||||||
meta_background_load_file_finish
|
|
||||||
meta_background_get_filename
|
|
||||||
meta_background_get_style
|
|
||||||
meta_background_get_shading
|
|
||||||
meta_background_get_color
|
|
||||||
meta_background_get_second_color
|
|
||||||
<SUBSECTION Standard>
|
|
||||||
META_BACKGROUND
|
|
||||||
META_BACKGROUND_CLASS
|
|
||||||
META_BACKGROUND_GET_CLASS
|
|
||||||
META_IS_BACKGROUND
|
|
||||||
META_IS_BACKGROUND_CLASS
|
|
||||||
META_TYPE_BACKGROUND
|
|
||||||
MetaBackgroundPrivate
|
|
||||||
meta_background_get_type
|
|
||||||
</SECTION>
|
|
||||||
|
|
||||||
<SECTION>
|
|
||||||
<FILE>meta-background-actor</FILE>
|
|
||||||
<TITLE>MetaBackgroundActor</TITLE>
|
|
||||||
MetaBackgroundActor
|
|
||||||
MetaBackgroundActorClass
|
|
||||||
meta_background_actor_new_for_screen
|
|
||||||
MetaSnippetHook
|
|
||||||
meta_background_actor_add_glsl_snippet
|
|
||||||
meta_background_actor_set_uniform_float
|
|
||||||
<SUBSECTION Standard>
|
|
||||||
META_BACKGROUND_ACTOR
|
|
||||||
META_BACKGROUND_ACTOR_CLASS
|
|
||||||
META_BACKGROUND_ACTOR_GET_CLASS
|
|
||||||
META_IS_BACKGROUND_ACTOR
|
|
||||||
META_IS_BACKGROUND_ACTOR_CLASS
|
|
||||||
META_TYPE_BACKGROUND_ACTOR
|
|
||||||
MetaBackgroundActorPrivate
|
|
||||||
meta_background_actor_get_type
|
|
||||||
</SECTION>
|
|
||||||
|
|
||||||
<SECTION>
|
|
||||||
<FILE>meta-background-group</FILE>
|
|
||||||
<TITLE>MetaBackgroundGroup</TITLE>
|
|
||||||
MetaBackgroundGroupClass
|
|
||||||
meta_background_group_new
|
|
||||||
<SUBSECTION Standard>
|
|
||||||
META_BACKGROUND_GROUP
|
|
||||||
META_BACKGROUND_GROUP_CLASS
|
|
||||||
META_BACKGROUND_GROUP_GET_CLASS
|
|
||||||
META_IS_BACKGROUND_GROUP
|
|
||||||
META_IS_BACKGROUND_GROUP_CLASS
|
|
||||||
META_TYPE_BACKGROUND_GROUP
|
|
||||||
MetaBackgroundGroupPrivate
|
|
||||||
meta_background_group_get_type
|
|
||||||
</SECTION>
|
|
||||||
|
|
||||||
<SECTION>
|
|
||||||
<FILE>meta-plugin</FILE>
|
|
||||||
<TITLE>MetaPlugin</TITLE>
|
|
||||||
MetaPlugin
|
|
||||||
MetaPluginClass
|
|
||||||
MetaPluginInfo
|
|
||||||
meta_plugin_running
|
|
||||||
meta_plugin_debug_mode
|
|
||||||
meta_plugin_get_info
|
|
||||||
MetaPluginVersion
|
|
||||||
META_PLUGIN_DECLARE
|
|
||||||
meta_plugin_switch_workspace_completed
|
|
||||||
meta_plugin_minimize_completed
|
|
||||||
meta_plugin_unminimize_completed
|
|
||||||
meta_plugin_maximize_completed
|
|
||||||
meta_plugin_unmaximize_completed
|
|
||||||
meta_plugin_map_completed
|
|
||||||
meta_plugin_destroy_completed
|
|
||||||
MetaModalOptions
|
|
||||||
meta_plugin_begin_modal
|
|
||||||
meta_plugin_end_modal
|
|
||||||
meta_plugin_get_screen
|
|
||||||
meta_plugin_manager_set_plugin_type
|
|
||||||
<SUBSECTION Standard>
|
|
||||||
META_IS_PLUGIN
|
|
||||||
META_IS_PLUGIN_CLASS
|
|
||||||
META_PLUGIN
|
|
||||||
META_PLUGIN_CLASS
|
|
||||||
META_PLUGIN_GET_CLASS
|
|
||||||
META_TYPE_PLUGIN
|
|
||||||
MetaPluginPrivate
|
|
||||||
meta_plugin_get_type
|
|
||||||
</SECTION>
|
|
||||||
|
|
||||||
<SECTION>
|
|
||||||
<FILE>meta-shadow-factory</FILE>
|
|
||||||
MetaShadowParams
|
|
||||||
meta_shadow_factory_get_default
|
|
||||||
meta_shadow_factory_set_params
|
|
||||||
meta_shadow_factory_get_params
|
|
||||||
MetaShadowFactory
|
|
||||||
MetaShadowFactoryClass
|
|
||||||
<SUBSECTION Standard>
|
|
||||||
META_IS_SHADOW_FACTORY
|
|
||||||
META_IS_SHADOW_FACTORY_CLASS
|
|
||||||
META_SHADOW_FACTORY
|
|
||||||
META_SHADOW_FACTORY_CLASS
|
|
||||||
META_SHADOW_FACTORY_GET_CLASS
|
|
||||||
META_TYPE_SHADOW_FACTORY
|
|
||||||
meta_shadow_factory_get_type
|
|
||||||
</SECTION>
|
|
||||||
|
|
||||||
<SECTION>
|
|
||||||
<FILE>meta-shaped-texture</FILE>
|
|
||||||
<TITLE>MetaShapedTexture</TITLE>
|
|
||||||
MetaShapedTexture
|
|
||||||
MetaShapedTextureClass
|
|
||||||
meta_shaped_texture_new
|
|
||||||
meta_shaped_texture_set_create_mipmaps
|
|
||||||
meta_shaped_texture_update_area
|
|
||||||
meta_shaped_texture_set_pixmap
|
|
||||||
meta_shaped_texture_get_texture
|
|
||||||
meta_shaped_texture_set_mask_texture
|
|
||||||
meta_shaped_texture_set_clip_region
|
|
||||||
meta_shaped_texture_get_image
|
|
||||||
<SUBSECTION Standard>
|
|
||||||
META_IS_SHAPED_TEXTURE
|
|
||||||
META_IS_SHAPED_TEXTURE_CLASS
|
|
||||||
META_SHAPED_TEXTURE
|
|
||||||
META_SHAPED_TEXTURE_CLASS
|
|
||||||
META_SHAPED_TEXTURE_GET_CLASS
|
|
||||||
META_TYPE_SHAPED_TEXTURE
|
|
||||||
MetaShapedTexturePrivate
|
|
||||||
meta_shaped_texture_get_type
|
|
||||||
</SECTION>
|
|
||||||
|
|
||||||
<SECTION>
|
|
||||||
<FILE>meta-window-actor</FILE>
|
|
||||||
<TITLE>MetaWindowActor</TITLE>
|
|
||||||
MetaWindowActor
|
|
||||||
MetaWindowActorClass
|
|
||||||
meta_window_actor_get_x_window
|
|
||||||
meta_window_actor_get_workspace
|
|
||||||
meta_window_actor_get_meta_window
|
|
||||||
meta_window_actor_get_texture
|
|
||||||
meta_window_actor_is_override_redirect
|
|
||||||
meta_window_actor_get_description
|
|
||||||
meta_window_actor_showing_on_its_workspace
|
|
||||||
meta_window_actor_is_destroyed
|
|
||||||
<SUBSECTION Standard>
|
|
||||||
META_IS_WINDOW_ACTOR
|
|
||||||
META_IS_WINDOW_ACTOR_CLASS
|
|
||||||
META_TYPE_WINDOW_ACTOR
|
|
||||||
META_WINDOW_ACTOR
|
|
||||||
META_WINDOW_ACTOR_CLASS
|
|
||||||
META_WINDOW_ACTOR_GET_CLASS
|
|
||||||
MetaWindowActorPrivate
|
|
||||||
meta_window_actor_get_type
|
|
||||||
</SECTION>
|
|
||||||
|
|
||||||
<SECTION>
|
|
||||||
<FILE>meta-cullable</FILE>
|
|
||||||
<TITLE>MetaCullable</TITLE>
|
|
||||||
MetaCullable
|
|
||||||
MetaCullableInterface
|
|
||||||
meta_cullable_cull_out
|
|
||||||
meta_cullable_reset_culling
|
|
||||||
meta_cullable_cull_out_children
|
|
||||||
meta_cullable_reset_culling_children
|
|
||||||
<SUBSECTION Standard>
|
|
||||||
META_TYPE_CULLABLE
|
|
||||||
META_CULLABLE
|
|
||||||
META_IS_CULLABLE
|
|
||||||
META_CULLABLE_GET_IFACE
|
|
||||||
meta_cullable_get_type
|
|
||||||
</SECTION>
|
|
||||||
|
|
||||||
<SECTION>
|
|
||||||
<FILE>prefs</FILE>
|
|
||||||
MetaPreference
|
|
||||||
MetaPrefsChangedFunc
|
|
||||||
meta_prefs_add_listener
|
|
||||||
meta_prefs_remove_listener
|
|
||||||
meta_prefs_init
|
|
||||||
meta_prefs_override_preference_schema
|
|
||||||
meta_preference_to_string
|
|
||||||
meta_prefs_get_mouse_button_mods
|
|
||||||
meta_prefs_get_mouse_button_resize
|
|
||||||
meta_prefs_get_mouse_button_menu
|
|
||||||
meta_prefs_get_focus_mode
|
|
||||||
meta_prefs_get_focus_new_windows
|
|
||||||
meta_prefs_get_attach_modal_dialogs
|
|
||||||
meta_prefs_get_raise_on_click
|
|
||||||
meta_prefs_get_theme
|
|
||||||
meta_prefs_get_titlebar_font
|
|
||||||
meta_prefs_get_num_workspaces
|
|
||||||
meta_prefs_get_dynamic_workspaces
|
|
||||||
meta_prefs_get_disable_workarounds
|
|
||||||
meta_prefs_get_auto_raise
|
|
||||||
meta_prefs_get_auto_raise_delay
|
|
||||||
meta_prefs_get_focus_change_on_pointer_rest
|
|
||||||
meta_prefs_get_gnome_accessibility
|
|
||||||
meta_prefs_get_gnome_animations
|
|
||||||
meta_prefs_get_edge_tiling
|
|
||||||
meta_prefs_get_auto_maximize
|
|
||||||
meta_prefs_get_button_layout
|
|
||||||
meta_prefs_get_action_double_click_titlebar
|
|
||||||
meta_prefs_get_action_middle_click_titlebar
|
|
||||||
meta_prefs_get_action_right_click_titlebar
|
|
||||||
meta_prefs_set_num_workspaces
|
|
||||||
meta_prefs_get_workspace_name
|
|
||||||
meta_prefs_change_workspace_name
|
|
||||||
meta_prefs_get_cursor_theme
|
|
||||||
meta_prefs_get_cursor_size
|
|
||||||
meta_prefs_get_compositing_manager
|
|
||||||
meta_prefs_get_force_fullscreen
|
|
||||||
meta_prefs_set_force_fullscreen
|
|
||||||
meta_prefs_get_workspaces_only_on_primary
|
|
||||||
meta_prefs_get_no_tab_popup
|
|
||||||
meta_prefs_set_no_tab_popup
|
|
||||||
meta_prefs_get_draggable_border_width
|
|
||||||
meta_prefs_get_ignore_request_hide_titlebar
|
|
||||||
meta_prefs_set_ignore_request_hide_titlebar
|
|
||||||
MetaKeyBindingAction
|
|
||||||
MetaKeyBindingFlags
|
|
||||||
MetaKeyCombo
|
|
||||||
MetaKeyHandlerFunc
|
|
||||||
meta_prefs_get_keybindings
|
|
||||||
meta_prefs_get_keybinding_action
|
|
||||||
meta_prefs_get_window_binding
|
|
||||||
meta_prefs_get_overlay_binding
|
|
||||||
meta_prefs_get_visual_bell
|
|
||||||
meta_prefs_bell_is_audible
|
|
||||||
meta_prefs_get_visual_bell_type
|
|
||||||
MetaKeyHandler
|
|
||||||
<SUBSECTION Standard>
|
|
||||||
meta_key_binding_get_type
|
|
||||||
</SECTION>
|
|
||||||
|
|
||||||
<SECTION>
|
|
||||||
<FILE>screen</FILE>
|
|
||||||
MetaScreen
|
|
||||||
MetaScreenClass
|
|
||||||
meta_screen_get_screen_number
|
|
||||||
meta_screen_get_display
|
|
||||||
meta_screen_get_xroot
|
|
||||||
meta_screen_get_size
|
|
||||||
meta_screen_get_compositor_data
|
|
||||||
meta_screen_set_compositor_data
|
|
||||||
meta_screen_for_x_screen
|
|
||||||
meta_screen_set_cm_selection
|
|
||||||
meta_screen_unset_cm_selection
|
|
||||||
meta_screen_get_startup_sequences
|
|
||||||
meta_screen_get_workspaces
|
|
||||||
meta_screen_get_n_workspaces
|
|
||||||
meta_screen_get_workspace_by_index
|
|
||||||
meta_screen_remove_workspace
|
|
||||||
meta_screen_append_new_workspace
|
|
||||||
meta_screen_get_active_workspace_index
|
|
||||||
meta_screen_get_active_workspace
|
|
||||||
meta_screen_get_n_monitors
|
|
||||||
meta_screen_get_primary_monitor
|
|
||||||
meta_screen_get_current_monitor
|
|
||||||
meta_screen_get_monitor_geometry
|
|
||||||
meta_screen_get_monitor_index_for_rect
|
|
||||||
meta_screen_focus_default_window
|
|
||||||
MetaScreenCorner
|
|
||||||
meta_screen_override_workspace_layout
|
|
||||||
<SUBSECTION Standard>
|
|
||||||
META_IS_SCREEN
|
|
||||||
META_IS_SCREEN_CLASS
|
|
||||||
META_SCREEN
|
|
||||||
META_SCREEN_CLASS
|
|
||||||
META_SCREEN_GET_CLASS
|
|
||||||
META_TYPE_SCREEN
|
|
||||||
meta_screen_get_type
|
|
||||||
</SECTION>
|
|
||||||
|
|
||||||
<SECTION>
|
|
||||||
<FILE>util</FILE>
|
|
||||||
meta_is_verbose
|
|
||||||
meta_set_verbose
|
|
||||||
meta_is_debugging
|
|
||||||
meta_set_debugging
|
|
||||||
meta_is_syncing
|
|
||||||
meta_set_syncing
|
|
||||||
meta_set_replace_current_wm
|
|
||||||
meta_debug_spew_real
|
|
||||||
meta_verbose_real
|
|
||||||
meta_bug
|
|
||||||
meta_warning
|
|
||||||
meta_fatal
|
|
||||||
MetaDebugTopic
|
|
||||||
meta_topic_real
|
|
||||||
meta_add_verbose_topic
|
|
||||||
meta_remove_verbose_topic
|
|
||||||
meta_push_no_msg_prefix
|
|
||||||
meta_pop_no_msg_prefix
|
|
||||||
meta_unsigned_long_equal
|
|
||||||
meta_unsigned_long_hash
|
|
||||||
meta_frame_type_to_string
|
|
||||||
meta_gravity_to_string
|
|
||||||
_
|
|
||||||
N_
|
|
||||||
meta_g_utf8_strndup
|
|
||||||
meta_free_gslist_and_elements
|
|
||||||
meta_show_dialog
|
|
||||||
meta_debug_spew
|
|
||||||
meta_verbose
|
|
||||||
meta_topic
|
|
||||||
MetaLaterType
|
|
||||||
meta_later_add
|
|
||||||
meta_later_remove
|
|
||||||
</SECTION>
|
|
||||||
|
|
||||||
<SECTION>
|
|
||||||
<FILE>window</FILE>
|
|
||||||
MetaWindow
|
|
||||||
MetaWindowClass
|
|
||||||
MetaWindowType
|
|
||||||
MetaMaximizeFlags
|
|
||||||
meta_window_get_frame
|
|
||||||
meta_window_has_focus
|
|
||||||
meta_window_appears_focused
|
|
||||||
meta_window_is_shaded
|
|
||||||
meta_window_is_monitor_sized
|
|
||||||
meta_window_is_override_redirect
|
|
||||||
meta_window_is_skip_taskbar
|
|
||||||
meta_window_get_rect
|
|
||||||
meta_window_get_buffer_rect
|
|
||||||
meta_window_get_frame_rect
|
|
||||||
meta_window_get_outer_rect
|
|
||||||
meta_window_client_rect_to_frame_rect
|
|
||||||
meta_window_frame_rect_to_client_rect
|
|
||||||
meta_window_get_screen
|
|
||||||
meta_window_get_display
|
|
||||||
meta_window_get_xwindow
|
|
||||||
meta_window_get_window_type
|
|
||||||
meta_window_get_window_type_atom
|
|
||||||
meta_window_get_workspace
|
|
||||||
meta_window_get_monitor
|
|
||||||
meta_window_is_on_all_workspaces
|
|
||||||
meta_window_located_on_workspace
|
|
||||||
meta_window_is_hidden
|
|
||||||
meta_window_activate
|
|
||||||
meta_window_activate_with_workspace
|
|
||||||
meta_window_get_description
|
|
||||||
meta_window_get_wm_class
|
|
||||||
meta_window_get_wm_class_instance
|
|
||||||
meta_window_showing_on_its_workspace
|
|
||||||
meta_window_get_gtk_application_id
|
|
||||||
meta_window_get_gtk_unique_bus_name
|
|
||||||
meta_window_get_gtk_application_object_path
|
|
||||||
meta_window_get_gtk_window_object_path
|
|
||||||
meta_window_get_gtk_app_menu_object_path
|
|
||||||
meta_window_get_gtk_menubar_object_path
|
|
||||||
meta_window_move
|
|
||||||
meta_window_move_frame
|
|
||||||
meta_window_move_resize_frame
|
|
||||||
meta_window_move_to_monitor
|
|
||||||
meta_window_resize
|
|
||||||
meta_window_set_demands_attention
|
|
||||||
meta_window_unset_demands_attention
|
|
||||||
meta_window_get_startup_id
|
|
||||||
meta_window_change_workspace_by_index
|
|
||||||
meta_window_change_workspace
|
|
||||||
meta_window_get_compositor_private
|
|
||||||
meta_window_set_compositor_private
|
|
||||||
meta_window_configure_notify
|
|
||||||
meta_window_get_role
|
|
||||||
meta_window_get_layer
|
|
||||||
meta_window_find_root_ancestor
|
|
||||||
meta_window_is_ancestor_of_transient
|
|
||||||
MetaWindowForeachFunc
|
|
||||||
meta_window_foreach_transient
|
|
||||||
meta_window_foreach_ancestor
|
|
||||||
meta_window_get_maximized
|
|
||||||
meta_window_is_fullscreen
|
|
||||||
meta_window_is_on_primary_monitor
|
|
||||||
meta_window_requested_bypass_compositor
|
|
||||||
meta_window_requested_dont_bypass_compositor
|
|
||||||
meta_window_is_mapped
|
|
||||||
meta_window_toplevel_is_mapped
|
|
||||||
meta_window_get_icon_geometry
|
|
||||||
meta_window_set_icon_geometry
|
|
||||||
meta_window_maximize
|
|
||||||
meta_window_unmaximize
|
|
||||||
meta_window_minimize
|
|
||||||
meta_window_unminimize
|
|
||||||
meta_window_raise
|
|
||||||
meta_window_lower
|
|
||||||
meta_window_get_title
|
|
||||||
meta_window_get_transient_for
|
|
||||||
meta_window_get_transient_for_as_xid
|
|
||||||
meta_window_delete
|
|
||||||
meta_window_get_stable_sequence
|
|
||||||
meta_window_get_user_time
|
|
||||||
meta_window_get_pid
|
|
||||||
meta_window_get_client_machine
|
|
||||||
meta_window_is_remote
|
|
||||||
meta_window_is_modal
|
|
||||||
meta_window_is_attached_dialog
|
|
||||||
meta_window_get_mutter_hints
|
|
||||||
meta_window_get_frame_type
|
|
||||||
meta_window_get_frame_bounds
|
|
||||||
meta_window_get_tile_match
|
|
||||||
meta_window_make_fullscreen
|
|
||||||
meta_window_unmake_fullscreen
|
|
||||||
meta_window_make_above
|
|
||||||
meta_window_unmake_above
|
|
||||||
meta_window_shade
|
|
||||||
meta_window_unshade
|
|
||||||
meta_window_stick
|
|
||||||
meta_window_unstick
|
|
||||||
meta_window_kill
|
|
||||||
meta_window_focus
|
|
||||||
meta_window_check_alive
|
|
||||||
meta_window_get_work_area_current_monitor
|
|
||||||
meta_window_get_work_area_for_monitor
|
|
||||||
meta_window_get_work_area_all_monitors
|
|
||||||
meta_window_begin_grab_op
|
|
||||||
<SUBSECTION Standard>
|
|
||||||
META_IS_WINDOW
|
|
||||||
META_IS_WINDOW_CLASS
|
|
||||||
META_TYPE_WINDOW
|
|
||||||
META_WINDOW
|
|
||||||
META_WINDOW_CLASS
|
|
||||||
META_WINDOW_GET_CLASS
|
|
||||||
meta_window_get_type
|
|
||||||
</SECTION>
|
|
||||||
|
|
||||||
<SECTION>
|
|
||||||
<FILE>workspace</FILE>
|
|
||||||
MetaWorkspace
|
|
||||||
MetaWorkspaceClass
|
|
||||||
meta_workspace_index
|
|
||||||
meta_workspace_get_screen
|
|
||||||
meta_workspace_list_windows
|
|
||||||
meta_workspace_get_work_area_for_monitor
|
|
||||||
meta_workspace_get_work_area_all_monitors
|
|
||||||
meta_workspace_activate
|
|
||||||
meta_workspace_activate_with_focus
|
|
||||||
meta_workspace_update_window_hints
|
|
||||||
meta_workspace_set_builtin_struts
|
|
||||||
meta_workspace_get_neighbor
|
|
||||||
<SUBSECTION Standard>
|
|
||||||
META_IS_WORKSPACE
|
|
||||||
META_IS_WORKSPACE_CLASS
|
|
||||||
META_TYPE_WORKSPACE
|
|
||||||
META_WORKSPACE
|
|
||||||
META_WORKSPACE_CLASS
|
|
||||||
META_WORKSPACE_GET_CLASS
|
|
||||||
meta_workspace_get_type
|
|
||||||
</SECTION>
|
|
||||||
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
<part id="mutter-overview">
|
|
||||||
|
|
||||||
<title>Overview</title>
|
|
||||||
|
|
||||||
<partintro>
|
|
||||||
|
|
||||||
<para>Mutter is a GObject-based library for creating compositing window managers.</para>
|
|
||||||
|
|
||||||
<para>Compositors that wish to use Mutter must implement a subclass of #MetaPlugin and register it with meta_plugin_manager_set_plugin_type() before calling meta_init() but after g_type_init().</para>
|
|
||||||
|
|
||||||
<para>#MetaPlugin provides virtual functions that allow to override default behavior in the window management code, such as the effect to perform when a window is created or when switching workspaces.</para>
|
|
||||||
|
|
||||||
</partintro>
|
|
||||||
|
|
||||||
</part>
|
|
||||||
@@ -1,100 +0,0 @@
|
|||||||
<part id="running-mutter">
|
|
||||||
|
|
||||||
<title>Running Mutter</title>
|
|
||||||
|
|
||||||
<partintro>
|
|
||||||
|
|
||||||
<section id="environment-variables">
|
|
||||||
<title>Environment Variables</title>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
Mutter automatically checks environment variables during
|
|
||||||
its initialization. These environment variables are meant
|
|
||||||
as debug tools or overrides for default behaviours:
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<variablelist>
|
|
||||||
<varlistentry>
|
|
||||||
<term>MUTTER_VERBOSE</term>
|
|
||||||
<listitem>
|
|
||||||
<para>Enable verbose mode, in which more information is printed to the console. Mutter needs to be built with the --enable-verbose-mode option (enabled by default). For more fine-grained control of the output, see meta_add_verbose_topic().</para>
|
|
||||||
</listitem>
|
|
||||||
</varlistentry>
|
|
||||||
<varlistentry>
|
|
||||||
<term>MUTTER_DEBUG</term>
|
|
||||||
<listitem>
|
|
||||||
<para>Traps and prints X errors to the console.</para>
|
|
||||||
</listitem>
|
|
||||||
</varlistentry>
|
|
||||||
<varlistentry>
|
|
||||||
<term>MUTTER_G_FATAL_WARNINGS</term>
|
|
||||||
<listitem>
|
|
||||||
<para>Causes any logging from the domains Mutter, Gtk, Gdk, Pango or GLib to terminate the process (only when using the log functions in GLib).</para>
|
|
||||||
</listitem>
|
|
||||||
</varlistentry>
|
|
||||||
<varlistentry>
|
|
||||||
<term>MUTTER_USE_LOGFILE</term>
|
|
||||||
<listitem>
|
|
||||||
<para>Log all messages to a temporary file.</para>
|
|
||||||
</listitem>
|
|
||||||
</varlistentry>
|
|
||||||
<varlistentry>
|
|
||||||
<term>MUTTER_DEBUG_XINERAMA</term>
|
|
||||||
<listitem>
|
|
||||||
<para>Log extra information about support of the XINERAMA extension.</para>
|
|
||||||
</listitem>
|
|
||||||
</varlistentry>
|
|
||||||
<varlistentry>
|
|
||||||
<term>MUTTER_DEBUG_SM</term>
|
|
||||||
<listitem>
|
|
||||||
<para>Log extra information about session management.</para>
|
|
||||||
</listitem>
|
|
||||||
</varlistentry>
|
|
||||||
<varlistentry>
|
|
||||||
<term>MUTTER_DEBUG_BUTTON_GRABS</term>
|
|
||||||
<listitem>
|
|
||||||
<para>Log extra information about button grabs.</para>
|
|
||||||
</listitem>
|
|
||||||
</varlistentry>
|
|
||||||
<varlistentry>
|
|
||||||
<term>MUTTER_SYNC</term>
|
|
||||||
<listitem>
|
|
||||||
<para>Call XSync after each X call.</para>
|
|
||||||
</listitem>
|
|
||||||
</varlistentry>
|
|
||||||
<varlistentry>
|
|
||||||
<term>MUTTER_DISPLAY</term>
|
|
||||||
<listitem>
|
|
||||||
<para>Name of the X11 display to use.</para>
|
|
||||||
</listitem>
|
|
||||||
</varlistentry>
|
|
||||||
<varlistentry>
|
|
||||||
<term>META_DISABLE_MIPMAPS</term>
|
|
||||||
<listitem>
|
|
||||||
<para>Disable use of mipmaps for the textures that back window pixmaps.</para>
|
|
||||||
</listitem>
|
|
||||||
</varlistentry>
|
|
||||||
<varlistentry>
|
|
||||||
<term>MUTTER_USE_STATIC_GRAVITY</term>
|
|
||||||
<listitem>
|
|
||||||
<para>Enable support for clients with static bit-gravity.</para>
|
|
||||||
</listitem>
|
|
||||||
</varlistentry>
|
|
||||||
<varlistentry>
|
|
||||||
<term>MUTTER_WM_CLASS_FILTER</term>
|
|
||||||
<listitem>
|
|
||||||
<para>Comma-separated list of WM_CLASS names to which to restrict Mutter to.</para>
|
|
||||||
</listitem>
|
|
||||||
</varlistentry>
|
|
||||||
<varlistentry>
|
|
||||||
<term>MUTTER_DISABLE_FALLBACK_COLOR</term>
|
|
||||||
<listitem>
|
|
||||||
<para>Disable fallback for themed colors, for easier detection of typographical errors.</para>
|
|
||||||
</listitem>
|
|
||||||
</varlistentry>
|
|
||||||
</variablelist>
|
|
||||||
|
|
||||||
</section>
|
|
||||||
|
|
||||||
</partintro>
|
|
||||||
</part>
|
|
||||||
@@ -1 +1,2 @@
|
|||||||
data/mutter-wayland.desktop.in
|
# List of source files that should NOT be translated.
|
||||||
|
# Please keep this file sorted alphabetically.
|
||||||
|
|||||||
766
po/bg.po
766
po/bg.po
@@ -1,9 +1,9 @@
|
|||||||
# Bulgarian translation of mutter po-file.
|
# Bulgarian translation of mutter po-file.
|
||||||
# Copyright (C) 2002, 2004, 2006, 2007, 2008 Free Software Foundation, Inc.
|
# Copyright (C) 2002, 2004, 2006, 2007, 2008 Free Software Foundation, Inc.
|
||||||
# Copyright (C) 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc.
|
# Copyright (C) 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc.
|
||||||
# Copyright (C) 2014 Free Software Foundation, Inc.
|
# Copyright (C) 2014, 2015 Free Software Foundation, Inc.
|
||||||
# Alexander Shopov <ash@kambanaria.org>, 2002, 2006, 2007, 2009, 2010.
|
# Alexander Shopov <ash@kambanaria.org>, 2002, 2006, 2007, 2009, 2010.
|
||||||
# Alexander Shopov <ash@kambanaria.org>, 2011, 2012, 2013, 2014.
|
# Alexander Shopov <ash@kambanaria.org>, 2011, 2012, 2013, 2014, 2015.
|
||||||
# Vladimir Petkov <kaladan@gmail.com>, 2004.
|
# Vladimir Petkov <kaladan@gmail.com>, 2004.
|
||||||
# Rostislav Raykov <zbrox@i-space.org>, 2004.
|
# Rostislav Raykov <zbrox@i-space.org>, 2004.
|
||||||
# Yavor Doganov <yavor@gnu.org>, 2008.
|
# Yavor Doganov <yavor@gnu.org>, 2008.
|
||||||
@@ -12,8 +12,8 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: mutter master\n"
|
"Project-Id-Version: mutter master\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2014-09-25 06:27+0300\n"
|
"POT-Creation-Date: 2015-03-10 09:51+0200\n"
|
||||||
"PO-Revision-Date: 2014-09-25 06:27+0300\n"
|
"PO-Revision-Date: 2015-03-10 09:51+0200\n"
|
||||||
"Last-Translator: Alexander Shopov <ash@kambanaria.org>\n"
|
"Last-Translator: Alexander Shopov <ash@kambanaria.org>\n"
|
||||||
"Language-Team: Bulgarian <dict@fsa-bg.org>\n"
|
"Language-Team: Bulgarian <dict@fsa-bg.org>\n"
|
||||||
"Language: bg\n"
|
"Language: bg\n"
|
||||||
@@ -437,29 +437,49 @@ msgstr "Превключване към виртуална графична ко
|
|||||||
msgid "Switch to VT 7"
|
msgid "Switch to VT 7"
|
||||||
msgstr "Превключване към виртуална графична конзола 7"
|
msgstr "Превключване към виртуална графична конзола 7"
|
||||||
|
|
||||||
#: ../src/backends/meta-monitor-manager.c:412
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:8
|
||||||
|
msgid "Switch to VT 8"
|
||||||
|
msgstr "Превключване към виртуална графична конзола 8"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:9
|
||||||
|
msgid "Switch to VT 9"
|
||||||
|
msgstr "Превключване към виртуална графична конзола 9"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:10
|
||||||
|
msgid "Switch to VT 10"
|
||||||
|
msgstr "Превключване към виртуална графична конзола 10"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:11
|
||||||
|
msgid "Switch to VT 11"
|
||||||
|
msgstr "Превключване към виртуална графична конзола 11"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:12
|
||||||
|
msgid "Switch to VT 12"
|
||||||
|
msgstr "Превключване към виртуална графична конзола 12"
|
||||||
|
|
||||||
|
#: ../src/backends/meta-monitor-manager.c:364
|
||||||
msgid "Built-in display"
|
msgid "Built-in display"
|
||||||
msgstr "Вграден екран"
|
msgstr "Вграден екран"
|
||||||
|
|
||||||
#: ../src/backends/meta-monitor-manager.c:437
|
#: ../src/backends/meta-monitor-manager.c:391
|
||||||
msgid "Unknown"
|
msgid "Unknown"
|
||||||
msgstr "Непознат"
|
msgstr "Непознат"
|
||||||
|
|
||||||
#: ../src/backends/meta-monitor-manager.c:439
|
#: ../src/backends/meta-monitor-manager.c:393
|
||||||
msgid "Unknown Display"
|
msgid "Unknown Display"
|
||||||
msgstr "Непознат екран"
|
msgstr "Непознат екран"
|
||||||
|
|
||||||
#. TRANSLATORS: this is a monitor vendor name, followed by a
|
#. TRANSLATORS: this is a monitor vendor name, followed by a
|
||||||
#. * size in inches, like 'Dell 15"'
|
#. * size in inches, like 'Dell 15"'
|
||||||
#.
|
#.
|
||||||
#: ../src/backends/meta-monitor-manager.c:447
|
#: ../src/backends/meta-monitor-manager.c:401
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s %s"
|
msgid "%s %s"
|
||||||
msgstr "%s %s"
|
msgstr "%s %s"
|
||||||
|
|
||||||
#. 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:443
|
#: ../src/compositor/compositor.c:456
|
||||||
#, 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"
|
||||||
@@ -495,7 +515,7 @@ msgstr "Из_чакване"
|
|||||||
msgid "_Force Quit"
|
msgid "_Force Quit"
|
||||||
msgstr "_Принудително спиране"
|
msgstr "_Принудително спиране"
|
||||||
|
|
||||||
#: ../src/core/display.c:547
|
#: ../src/core/display.c:562
|
||||||
#, 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 "Неуспешно отваряне на дисплея на X Window „%s“\n"
|
msgstr "Неуспешно отваряне на дисплея на X Window „%s“\n"
|
||||||
@@ -534,19 +554,6 @@ msgstr "Wayland да е мениджър за наслагване"
|
|||||||
msgid "Run as a full display server, rather than nested"
|
msgid "Run as a full display server, rather than nested"
|
||||||
msgstr "Изпълнение като самостоятелен, а не вграден сървър за изобразяване"
|
msgstr "Изпълнение като самостоятелен, а не вграден сървър за изобразяване"
|
||||||
|
|
||||||
#: ../src/core/main.c:451
|
|
||||||
#, c-format
|
|
||||||
msgid "Failed to scan themes directory: %s\n"
|
|
||||||
msgstr "Неуспешно сканиране на папката с темите: %s\n"
|
|
||||||
|
|
||||||
#: ../src/core/main.c:467
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Could not find a theme! Be sure %s exists and contains the usual themes.\n"
|
|
||||||
msgstr ""
|
|
||||||
"Не е открита тема! Проверете дали папката „%s“ съществува и съдържа "
|
|
||||||
"обичайните теми.\n"
|
|
||||||
|
|
||||||
#: ../src/core/mutter.c:39
|
#: ../src/core/mutter.c:39
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -571,718 +578,29 @@ msgstr "Отпечатване на версията на програмата"
|
|||||||
msgid "Mutter plugin to use"
|
msgid "Mutter plugin to use"
|
||||||
msgstr "Приставка, която да се ползва"
|
msgstr "Приставка, която да се ползва"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:2065
|
#: ../src/core/prefs.c:2004
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Workspace %d"
|
msgid "Workspace %d"
|
||||||
msgstr "Работен плот %d"
|
msgstr "Работен плот %d"
|
||||||
|
|
||||||
#: ../src/core/screen.c:543
|
#: ../src/core/screen.c:525
|
||||||
|
#, c-format
|
||||||
|
msgid ""
|
||||||
|
"Display \"%s\" already has a window manager; try using the --replace option "
|
||||||
|
"to replace the current window manager."
|
||||||
|
msgstr ""
|
||||||
|
"Вече има мениджър на прозорци на дисплей „%s“. Пробвайте да го замените с "
|
||||||
|
"опцията „--replace“."
|
||||||
|
|
||||||
|
#: ../src/core/screen.c:607
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Screen %d on display '%s' is invalid\n"
|
msgid "Screen %d on display '%s' is invalid\n"
|
||||||
msgstr "Екранът %d на дисплей „%s“ е невалиден\n"
|
msgstr "Екранът %d на дисплей „%s“ е невалиден\n"
|
||||||
|
|
||||||
#: ../src/core/screen.c:559
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Screen %d on display \"%s\" already has a window manager; try using the --"
|
|
||||||
"replace option to replace the current window manager.\n"
|
|
||||||
msgstr ""
|
|
||||||
"Екранът %d на дисплей „%s“ вече има мениджър на прозорци; пробвайте да го "
|
|
||||||
"замените с опцията --replace.\n"
|
|
||||||
|
|
||||||
#: ../src/core/screen.c:652
|
|
||||||
#, c-format
|
|
||||||
msgid "Screen %d on display \"%s\" already has a window manager\n"
|
|
||||||
msgstr "Екран %d на дисплей „%s“ вече има мениджър за прозорци\n"
|
|
||||||
|
|
||||||
#: ../src/core/util.c:118
|
#: ../src/core/util.c:118
|
||||||
msgid "Mutter was compiled without support for verbose mode\n"
|
msgid "Mutter was compiled without support for verbose mode\n"
|
||||||
msgstr "Mutter е компилиран без поддръжка на подробен режим\n"
|
msgstr "Mutter е компилиран без поддръжка на подробен режим\n"
|
||||||
|
|
||||||
#. Translators: This represents the size of a window. The first number is
|
|
||||||
#. * the width of the window and the second is the height.
|
|
||||||
#.
|
|
||||||
#: ../src/ui/resizepopup.c:134
|
|
||||||
#, c-format
|
|
||||||
msgid "%d x %d"
|
|
||||||
msgstr "%d×%d"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:233
|
|
||||||
msgid "top"
|
|
||||||
msgstr "горния"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:235
|
|
||||||
msgid "bottom"
|
|
||||||
msgstr "долния"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:237
|
|
||||||
msgid "left"
|
|
||||||
msgstr "левия"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:239
|
|
||||||
msgid "right"
|
|
||||||
msgstr "десния"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:267
|
|
||||||
#, c-format
|
|
||||||
msgid "frame geometry does not specify \"%s\" dimension"
|
|
||||||
msgstr "геометрията на рамката не указва %s размер"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:286
|
|
||||||
#, c-format
|
|
||||||
msgid "frame geometry does not specify dimension \"%s\" for border \"%s\""
|
|
||||||
msgstr "геометрията на рамката не указва %s размер на %s ръб"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:323
|
|
||||||
#, c-format
|
|
||||||
msgid "Button aspect ratio %g is not reasonable"
|
|
||||||
msgstr "Отношението на размерите на бутона %g е неподходящо"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:335
|
|
||||||
#, c-format
|
|
||||||
msgid "Frame geometry does not specify size of buttons"
|
|
||||||
msgstr "Геометрията на рамката не указва размера на бутоните"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1061
|
|
||||||
#, c-format
|
|
||||||
msgid "Gradients should have at least two colors"
|
|
||||||
msgstr "Преливките трябва да имат поне два цвята"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1211
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"GTK custom color specification must have color name and fallback in "
|
|
||||||
"parentheses, e.g. gtk:custom(foo,bar); could not parse \"%s\""
|
|
||||||
msgstr ""
|
|
||||||
"Цветовата спецификация на GTK трябва да съдържа в скоби име на основен и "
|
|
||||||
"резервен цвят: напр. gtk:custom(foo,bar). Неуспешен анализ на „%s“"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1227
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Invalid character '%c' in color_name parameter of gtk:custom, only A-Za-z0-9-"
|
|
||||||
"_ are valid"
|
|
||||||
msgstr ""
|
|
||||||
"Неправилен знак „%c“ в параметъра за име на цвят (color_name) на gtk:custom. "
|
|
||||||
"Позволени са само A-Za-z0-9-_."
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1241
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Gtk:custom format is \"gtk:custom(color_name,fallback)\", \"%s\" does not "
|
|
||||||
"fit the format"
|
|
||||||
msgstr ""
|
|
||||||
"Форматът на Gtk:custom е „gtk:custom(основен_цвят,резервен_цвят)“, „%s“ не "
|
|
||||||
"съответства на формата"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1286
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"GTK color specification must have the state in brackets, e.g. gtk:fg[NORMAL] "
|
|
||||||
"where NORMAL is the state; could not parse \"%s\""
|
|
||||||
msgstr ""
|
|
||||||
"Цветовата спецификация на GTK трябва да указва състоянието в квадратни "
|
|
||||||
"скоби, напр. gtk:fg[NORMAL], където NORMAL е състоянието. Неуспешен анализ "
|
|
||||||
"на „%s“"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1300
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"GTK color specification must have a close bracket after the state, e.g. gtk:"
|
|
||||||
"fg[NORMAL] where NORMAL is the state; could not parse \"%s\""
|
|
||||||
msgstr ""
|
|
||||||
"Цветовата спецификация на GTK трябва да съдържа квадратна скоба след "
|
|
||||||
"състоянието, напр. gtk:fg[NORMAL], където NORMAL е състоянието. Неуспешен "
|
|
||||||
"анализ на „%s“"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1311
|
|
||||||
#, c-format
|
|
||||||
msgid "Did not understand state \"%s\" in color specification"
|
|
||||||
msgstr "Неуспешен анализ на състоянието „%s“ в цветовата спецификация"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1324
|
|
||||||
#, c-format
|
|
||||||
msgid "Did not understand color component \"%s\" in color specification"
|
|
||||||
msgstr "Неуспешен анализ на цветови компонент „%s“ в цветовата спецификация"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1352
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Blend format is \"blend/bg_color/fg_color/alpha\", \"%s\" does not fit the "
|
|
||||||
"format"
|
|
||||||
msgstr ""
|
|
||||||
"Форматът на смесването е „blend/bg_color/fg_color/alpha“, „%s“ не се "
|
|
||||||
"подчинява на форма̀та"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1363
|
|
||||||
#, c-format
|
|
||||||
msgid "Could not parse alpha value \"%s\" in blended color"
|
|
||||||
msgstr "Неуспешен анализ на алфа стойността „%s“ в смесения цвят"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1373
|
|
||||||
#, c-format
|
|
||||||
msgid "Alpha value \"%s\" in blended color is not between 0.0 and 1.0"
|
|
||||||
msgstr "Алфа стойността „%s“ в смесения цвят не е между 0.0 и 1.0"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1419
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Shade format is \"shade/base_color/factor\", \"%s\" does not fit the format"
|
|
||||||
msgstr ""
|
|
||||||
"Форматът на навиването е един от „shade“/„base_color“/„factor“, „%s“ не "
|
|
||||||
"съответства на формата"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1430
|
|
||||||
#, c-format
|
|
||||||
msgid "Could not parse shade factor \"%s\" in shaded color"
|
|
||||||
msgstr "Неуспешен анализа на фактора на навиването „%s“ в цвета за навиване"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1440
|
|
||||||
#, c-format
|
|
||||||
msgid "Shade factor \"%s\" in shaded color is negative"
|
|
||||||
msgstr "Факторът на навиване „%s“ в цвета за сянката е отрицателен"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1469
|
|
||||||
#, c-format
|
|
||||||
msgid "Could not parse color \"%s\""
|
|
||||||
msgstr "Неуспешен анализ на цвета „%s“"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1778
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression contains character '%s' which is not allowed"
|
|
||||||
msgstr "Изразът за координати съдържа символа „%s“, който не е позволен"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1805
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Coordinate expression contains floating point number '%s' which could not be "
|
|
||||||
"parsed"
|
|
||||||
msgstr ""
|
|
||||||
"Изразът за координати съдържа числото с плаваща запетая „%s“, което не може "
|
|
||||||
"да бъде анализирано"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1819
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression contains integer '%s' which could not be parsed"
|
|
||||||
msgstr ""
|
|
||||||
"Изразът за координати съдържа цялото число „%s“, което не може да бъде "
|
|
||||||
"анализирано"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1940
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Coordinate expression contained unknown operator at the start of this text: "
|
|
||||||
"\"%s\""
|
|
||||||
msgstr ""
|
|
||||||
"Изразът за координати съдържа непознат оператор в началото на този текст: "
|
|
||||||
"„%s“"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1997
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression was empty or not understood"
|
|
||||||
msgstr "Изразът за координати бе празен или не бе разбран"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2110 ../src/ui/theme.c:2120 ../src/ui/theme.c:2154
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression results in division by zero"
|
|
||||||
msgstr "Изразът за координати дава деление на нула"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2162
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Coordinate expression tries to use mod operator on a floating-point number"
|
|
||||||
msgstr ""
|
|
||||||
"Изразът за координати използва оператора mod върху число с плаваща запетая"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2218
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Coordinate expression has an operator \"%s\" where an operand was expected"
|
|
||||||
msgstr ""
|
|
||||||
"Изразът за координати използва оператора „%s“ на място, където се очаква "
|
|
||||||
"операнд"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2227
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression had an operand where an operator was expected"
|
|
||||||
msgstr ""
|
|
||||||
"Изразът за координати използва оператор на място, където се очаква операнд"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2235
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression ended with an operator instead of an operand"
|
|
||||||
msgstr "Изразът за координати завършва с оператор вместо с операнд"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2245
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Coordinate expression has operator \"%c\" following operator \"%c\" with no "
|
|
||||||
"operand in between"
|
|
||||||
msgstr ""
|
|
||||||
"Изразът за координати използва оператора „%c“ след „%c“ без да има операнд "
|
|
||||||
"между тях"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2396 ../src/ui/theme.c:2441
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression had unknown variable or constant \"%s\""
|
|
||||||
msgstr ""
|
|
||||||
"Изразът за координати използва непознатата променлива или константа „%s“"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2495
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression parser overflowed its buffer."
|
|
||||||
msgstr "Анализаторът на изрази за координати препълни буфера си."
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2524
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression had a close parenthesis with no open parenthesis"
|
|
||||||
msgstr "В израза за координати има затваряща скоба без съответна отваряща"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2588
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression had an open parenthesis with no close parenthesis"
|
|
||||||
msgstr "В израза за координати има отваряща скоба без съответна затваряща"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2599
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression doesn't seem to have any operators or operands"
|
|
||||||
msgstr "Изразът за координати не съдържа нито оператори, нито операнди"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2812 ../src/ui/theme.c:2832 ../src/ui/theme.c:2852
|
|
||||||
#, c-format
|
|
||||||
msgid "Theme contained an expression that resulted in an error: %s\n"
|
|
||||||
msgstr "Темата съдържа израз, който даде грешка: %s\n"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:4455
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"<button function=\"%s\" state=\"%s\" draw_ops=\"whatever\"/> must be "
|
|
||||||
"specified for this frame style"
|
|
||||||
msgstr ""
|
|
||||||
"За този стил на рамката трябва да се укаже <button function=\"%s\" state=\"%s"
|
|
||||||
"\" draw_ops=\"нещо си\"/>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:4970 ../src/ui/theme.c:4995
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Missing <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/>"
|
|
||||||
msgstr ""
|
|
||||||
"Липсва <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"нещо си\"/>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5041
|
|
||||||
#, c-format
|
|
||||||
msgid "Failed to load theme \"%s\": %s\n"
|
|
||||||
msgstr "Неуспешно зареждане на темата „%s“: %s\n"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5177 ../src/ui/theme.c:5184 ../src/ui/theme.c:5191
|
|
||||||
#: ../src/ui/theme.c:5198 ../src/ui/theme.c:5205
|
|
||||||
#, c-format
|
|
||||||
msgid "No <%s> set for theme \"%s\""
|
|
||||||
msgstr "Не е даден елементът <%s> за темата „%s“"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5213
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"No frame style set for window type \"%s\" in theme \"%s\", add a <window "
|
|
||||||
"type=\"%s\" style_set=\"whatever\"/> element"
|
|
||||||
msgstr ""
|
|
||||||
"Няма указан стил на рамката за „%s“ прозорците в тема „%s“. Добавете елемент "
|
|
||||||
"<window type=\"%s\" style_set=\"нещо си\"/>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5620 ../src/ui/theme.c:5682 ../src/ui/theme.c:5745
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"User-defined constants must begin with a capital letter; \"%s\" does not"
|
|
||||||
msgstr ""
|
|
||||||
"Константите определени от потребителя трябва да започват с главна буква, а "
|
|
||||||
"„%s“ не започва така"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5628 ../src/ui/theme.c:5690 ../src/ui/theme.c:5753
|
|
||||||
#, c-format
|
|
||||||
msgid "Constant \"%s\" has already been defined"
|
|
||||||
msgstr "Константата „%s“ вече е дефинирана"
|
|
||||||
|
|
||||||
#. Translators: This means that an attribute which should have been found
|
|
||||||
#. * on an XML element was not in fact found.
|
|
||||||
#.
|
|
||||||
#: ../src/ui/theme-parser.c:234
|
|
||||||
#, c-format
|
|
||||||
msgid "No \"%s\" attribute on element <%s>"
|
|
||||||
msgstr "Елементът <%s> няма атрибут „%s“"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:263 ../src/ui/theme-parser.c:281
|
|
||||||
#, c-format
|
|
||||||
msgid "Line %d character %d: %s"
|
|
||||||
msgstr "Ред %d, знак %d: %s"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:481
|
|
||||||
#, c-format
|
|
||||||
msgid "Attribute \"%s\" repeated twice on the same <%s> element"
|
|
||||||
msgstr "Атрибутът „%s“ се повтаря два пъти в един елемент <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:505 ../src/ui/theme-parser.c:554
|
|
||||||
#, c-format
|
|
||||||
msgid "Attribute \"%s\" is invalid on <%s> element in this context"
|
|
||||||
msgstr "Атрибутът „%s“ е невалиден за елемента <%s> в този контекст"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:596
|
|
||||||
#, c-format
|
|
||||||
msgid "Could not parse \"%s\" as an integer"
|
|
||||||
msgstr "„%s“ не може да се анализира като цяло число"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:605 ../src/ui/theme-parser.c:660
|
|
||||||
#, c-format
|
|
||||||
msgid "Did not understand trailing characters \"%s\" in string \"%s\""
|
|
||||||
msgstr "Крайните символи „%s“ в низа „%s“ са неразбираеми"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:615
|
|
||||||
#, c-format
|
|
||||||
msgid "Integer %ld must be positive"
|
|
||||||
msgstr "Цялото число %ld трябва да е положително"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:623
|
|
||||||
#, c-format
|
|
||||||
msgid "Integer %ld is too large, current max is %d"
|
|
||||||
msgstr "Цялото число %ld е прекалено голямо, максимумът е %d"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:651 ../src/ui/theme-parser.c:767
|
|
||||||
#, c-format
|
|
||||||
msgid "Could not parse \"%s\" as a floating point number"
|
|
||||||
msgstr "„%s“ не може да се интерпретира като число с плаваща запетая"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:682 ../src/ui/theme-parser.c:710
|
|
||||||
#, c-format
|
|
||||||
msgid "Boolean values must be \"true\" or \"false\" not \"%s\""
|
|
||||||
msgstr ""
|
|
||||||
"Булевите стойности са или „true“ (истина), или „false“ (лъжа). Не са „%s“"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:737
|
|
||||||
#, c-format
|
|
||||||
msgid "Angle must be between 0.0 and 360.0, was %g\n"
|
|
||||||
msgstr "Ъгълът трябва да е между 0.0 и 360.0, а е %g\n"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:800
|
|
||||||
#, c-format
|
|
||||||
msgid "Alpha must be between 0.0 (invisible) and 1.0 (fully opaque), was %g\n"
|
|
||||||
msgstr ""
|
|
||||||
"Алфа трябва да е между 0.0 (пълна прозрачност) и 1.0 (пълна непрозрачност), "
|
|
||||||
"а е %g\n"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:865
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Invalid title scale \"%s\" (must be one of xx-small,x-small,small,medium,"
|
|
||||||
"large,x-large,xx-large)\n"
|
|
||||||
msgstr ""
|
|
||||||
"Невалидно увеличение на заглавието „%s“ (трябва да е едно от „xx-small“ (най-"
|
|
||||||
"малко), „x-small“ (много малко), „small“ (малко), „medium“ (средно), "
|
|
||||||
"„large“ (голямо), „x-large“ (много голямо), „xx-large“ (най-голямо))\n"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1021 ../src/ui/theme-parser.c:1084
|
|
||||||
#: ../src/ui/theme-parser.c:1118 ../src/ui/theme-parser.c:1221
|
|
||||||
#, c-format
|
|
||||||
msgid "<%s> name \"%s\" used a second time"
|
|
||||||
msgstr "Името „%2$s“ на <%1$s> е използвано втори път"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1033 ../src/ui/theme-parser.c:1130
|
|
||||||
#: ../src/ui/theme-parser.c:1233
|
|
||||||
#, c-format
|
|
||||||
msgid "<%s> parent \"%s\" has not been defined"
|
|
||||||
msgstr "Родителят „%2$s“ на <%1$s> не е дефиниран"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1143
|
|
||||||
#, c-format
|
|
||||||
msgid "<%s> geometry \"%s\" has not been defined"
|
|
||||||
msgstr "Геометрията „%2$s“ на <%1$s> не е дефинирана"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1156
|
|
||||||
#, c-format
|
|
||||||
msgid "<%s> must specify either a geometry or a parent that has a geometry"
|
|
||||||
msgstr "<%s> трябва да указва или геометрия, или родител с геометрия"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1198
|
|
||||||
msgid "You must specify a background for an alpha value to be meaningful"
|
|
||||||
msgstr "За да бъде алфа стойността валидна, трябва да е указан фон"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1266
|
|
||||||
#, c-format
|
|
||||||
msgid "Unknown type \"%s\" on <%s> element"
|
|
||||||
msgstr "Непознат вид „%s“ на елемента <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1277
|
|
||||||
#, c-format
|
|
||||||
msgid "Unknown style_set \"%s\" on <%s> element"
|
|
||||||
msgstr "Непознат style_set „%s“ на елемента <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1285
|
|
||||||
#, c-format
|
|
||||||
msgid "Window type \"%s\" has already been assigned a style set"
|
|
||||||
msgstr "Видът прозорци „%s“ вече има установен вид на стила"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1315 ../src/ui/theme-parser.c:1379
|
|
||||||
#: ../src/ui/theme-parser.c:1605 ../src/ui/theme-parser.c:2840
|
|
||||||
#: ../src/ui/theme-parser.c:2886 ../src/ui/theme-parser.c:3036
|
|
||||||
#: ../src/ui/theme-parser.c:3272 ../src/ui/theme-parser.c:3310
|
|
||||||
#: ../src/ui/theme-parser.c:3348 ../src/ui/theme-parser.c:3386
|
|
||||||
#, c-format
|
|
||||||
msgid "Element <%s> is not allowed below <%s>"
|
|
||||||
msgstr "Елементът <%s> не е позволен под <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1429 ../src/ui/theme-parser.c:1443
|
|
||||||
#: ../src/ui/theme-parser.c:1488
|
|
||||||
msgid ""
|
|
||||||
"Cannot specify both \"button_width\"/\"button_height\" and \"aspect_ratio\" "
|
|
||||||
"for buttons"
|
|
||||||
msgstr ""
|
|
||||||
"Не може да се указват едновременно и двата размера („button_width“, "
|
|
||||||
"„button_height“ — височина и широчина на бутоните), и съотношението на "
|
|
||||||
"размерите им — „aspect_ratio“"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1452
|
|
||||||
#, c-format
|
|
||||||
msgid "Distance \"%s\" is unknown"
|
|
||||||
msgstr "Разстоянието „%s“ е неизвестно"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1497
|
|
||||||
#, c-format
|
|
||||||
msgid "Aspect ratio \"%s\" is unknown"
|
|
||||||
msgstr "Пропорцията „%s“ е неизвестна"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1559
|
|
||||||
#, c-format
|
|
||||||
msgid "Border \"%s\" is unknown"
|
|
||||||
msgstr "Границата „%s“ е непозната"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1870
|
|
||||||
#, c-format
|
|
||||||
msgid "No \"start_angle\" or \"from\" attribute on element <%s>"
|
|
||||||
msgstr "Елементът <%s> няма атрибут „start_angle“ или „from“"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1877
|
|
||||||
#, c-format
|
|
||||||
msgid "No \"extent_angle\" or \"to\" attribute on element <%s>"
|
|
||||||
msgstr "Елементът <%s> няма атрибут „extent_angle“ или „to“"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2117
|
|
||||||
#, c-format
|
|
||||||
msgid "Did not understand value \"%s\" for type of gradient"
|
|
||||||
msgstr "Стойността „%s“ не може да се анализира като вид градиент"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2195 ../src/ui/theme-parser.c:2570
|
|
||||||
#, c-format
|
|
||||||
msgid "Did not understand fill type \"%s\" for <%s> element"
|
|
||||||
msgstr "Непознато запълване „%s“ за елемента <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2362 ../src/ui/theme-parser.c:2445
|
|
||||||
#: ../src/ui/theme-parser.c:2508
|
|
||||||
#, c-format
|
|
||||||
msgid "Did not understand state \"%s\" for <%s> element"
|
|
||||||
msgstr "Неуспешен анализ на състоянието „%s“ на елемента <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2372 ../src/ui/theme-parser.c:2455
|
|
||||||
#, c-format
|
|
||||||
msgid "Did not understand shadow \"%s\" for <%s> element"
|
|
||||||
msgstr "Неуспешен анализ на сянката „%s“ на елемента <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2382
|
|
||||||
#, c-format
|
|
||||||
msgid "Did not understand arrow \"%s\" for <%s> element"
|
|
||||||
msgstr "Неуспешен анализ на стрелката „%s“ на елемента <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2696 ../src/ui/theme-parser.c:2792
|
|
||||||
#, c-format
|
|
||||||
msgid "No <draw_ops> called \"%s\" has been defined"
|
|
||||||
msgstr "Няма дефинирани <draw_ops> с име „%s“"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2708 ../src/ui/theme-parser.c:2804
|
|
||||||
#, c-format
|
|
||||||
msgid "Including draw_ops \"%s\" here would create a circular reference"
|
|
||||||
msgstr "Включването на draw_ops „%s“ тук би предизвикало циклична зависимост"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2919
|
|
||||||
#, c-format
|
|
||||||
msgid "Unknown position \"%s\" for frame piece"
|
|
||||||
msgstr "Непозната позиция „%s“ за елемент на рамката"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2927
|
|
||||||
#, c-format
|
|
||||||
msgid "Frame style already has a piece at position %s"
|
|
||||||
msgstr "Стилът на рамката вече има елемент на позицията %s"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2944 ../src/ui/theme-parser.c:3021
|
|
||||||
#, c-format
|
|
||||||
msgid "No <draw_ops> with the name \"%s\" has been defined"
|
|
||||||
msgstr "Няма дефиниран <draw_ops> с името „%s“"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2974
|
|
||||||
#, c-format
|
|
||||||
msgid "Unknown function \"%s\" for button"
|
|
||||||
msgstr "Непозната функция „%s“ за бутона"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2984
|
|
||||||
#, c-format
|
|
||||||
msgid "Button function \"%s\" does not exist in this version (%d, need %d)"
|
|
||||||
msgstr ""
|
|
||||||
"Функцията на бутона „%s“ не съществува в тази версия (%d, а трябва да е %d)"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2996
|
|
||||||
#, c-format
|
|
||||||
msgid "Unknown state \"%s\" for button"
|
|
||||||
msgstr "Непознато състояние „%s“ за бутона"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3004
|
|
||||||
#, c-format
|
|
||||||
msgid "Frame style already has a button for function %s state %s"
|
|
||||||
msgstr "Стилът на рамката има бутон за функция %s, състояние %s"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3075
|
|
||||||
#, c-format
|
|
||||||
msgid "\"%s\" is not a valid value for focus attribute"
|
|
||||||
msgstr "„%s“ не е валидна стойност за атрибута фокус"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3084
|
|
||||||
#, c-format
|
|
||||||
msgid "\"%s\" is not a valid value for state attribute"
|
|
||||||
msgstr "„%s“ не е валидна стойност за атрибута състояние"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3094
|
|
||||||
#, c-format
|
|
||||||
msgid "A style called \"%s\" has not been defined"
|
|
||||||
msgstr "Не е дефиниран стил на име „%s“"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3115 ../src/ui/theme-parser.c:3138
|
|
||||||
#, c-format
|
|
||||||
msgid "\"%s\" is not a valid value for resize attribute"
|
|
||||||
msgstr "„%s“ не е валидна стойност за атрибута оразмеряване"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3149
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Should not have \"resize\" attribute on <%s> element for maximized/shaded "
|
|
||||||
"states"
|
|
||||||
msgstr ""
|
|
||||||
"Елементът <%s> не трябва да има атрибут „resize“ за състоянията максимизиран/"
|
|
||||||
"засенчен"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3163
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Should not have \"resize\" attribute on <%s> element for maximized states"
|
|
||||||
msgstr ""
|
|
||||||
"Елементът <%s> не трябва да има атрибут „resize“ за състоянието максимизиран"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3177 ../src/ui/theme-parser.c:3221
|
|
||||||
#, c-format
|
|
||||||
msgid "Style has already been specified for state %s resize %s focus %s"
|
|
||||||
msgstr "Вече е указан стил за състояние %s, оразмеряване %s, фокус %s"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3188 ../src/ui/theme-parser.c:3199
|
|
||||||
#: ../src/ui/theme-parser.c:3210 ../src/ui/theme-parser.c:3232
|
|
||||||
#: ../src/ui/theme-parser.c:3243 ../src/ui/theme-parser.c:3254
|
|
||||||
#, c-format
|
|
||||||
msgid "Style has already been specified for state %s focus %s"
|
|
||||||
msgstr "Вече е указан стил за състояние %s, фокус %s"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3293
|
|
||||||
msgid ""
|
|
||||||
"Can't have a two draw_ops for a <piece> element (theme specified a draw_ops "
|
|
||||||
"attribute and also a <draw_ops> element, or specified two elements)"
|
|
||||||
msgstr ""
|
|
||||||
"Не може да има два draw_ops за елемент <piece> (темата е указала атрибут "
|
|
||||||
"draw_ops и елемент <draw_ops> или два елемента)"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3331
|
|
||||||
msgid ""
|
|
||||||
"Can't have a two draw_ops for a <button> element (theme specified a draw_ops "
|
|
||||||
"attribute and also a <draw_ops> element, or specified two elements)"
|
|
||||||
msgstr ""
|
|
||||||
"Не може да има два draw_ops за елемент <button> (темата е указала атрибут "
|
|
||||||
"draw_ops и елемент <draw_ops> или два елемента)"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3369
|
|
||||||
msgid ""
|
|
||||||
"Can't have a two draw_ops for a <menu_icon> element (theme specified a "
|
|
||||||
"draw_ops attribute and also a <draw_ops> element, or specified two elements)"
|
|
||||||
msgstr ""
|
|
||||||
"Не може да има два draw_ops за елемент <menu_icon> (темата е указала атрибут "
|
|
||||||
"draw_ops и елемент <draw_ops> или два елемента)"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3433
|
|
||||||
#, c-format
|
|
||||||
msgid "Bad version specification '%s'"
|
|
||||||
msgstr "Неправилна версия „%s“"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3506
|
|
||||||
msgid ""
|
|
||||||
"\"version\" attribute cannot be used in metacity-theme-1.xml or metacity-"
|
|
||||||
"theme-2.xml"
|
|
||||||
msgstr ""
|
|
||||||
"Атрибутът „version“ (версия) не може да се използва в in metacity-theme-1."
|
|
||||||
"xml или metacity-theme-2.xml"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3529
|
|
||||||
#, c-format
|
|
||||||
msgid "Theme requires version %s but latest supported theme version is %d.%d"
|
|
||||||
msgstr "Темата изисква версия %s, но най-високата поддържана версия е %d.%d"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3561
|
|
||||||
#, c-format
|
|
||||||
msgid "Outermost element in theme must be <metacity_theme> not <%s>"
|
|
||||||
msgstr "Най-външният елемент в темата трябва да е <metacity_theme>, а не <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3581
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Element <%s> is not allowed inside a name/author/date/description element"
|
|
||||||
msgstr "Елементът <%s> не е разрешен в елементите name/author/date/description"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3586
|
|
||||||
#, c-format
|
|
||||||
msgid "Element <%s> is not allowed inside a <constant> element"
|
|
||||||
msgstr "Елементът <%s> не е позволен в <constant> елемент"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3598
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Element <%s> is not allowed inside a distance/border/aspect_ratio element"
|
|
||||||
msgstr "Елементът <%s> не е позволен в елемент distance/border/aspect_ratio"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3620
|
|
||||||
#, c-format
|
|
||||||
msgid "Element <%s> is not allowed inside a draw operation element"
|
|
||||||
msgstr "Елементът <%s> не е позволен в елемент с операция за чертане"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3630 ../src/ui/theme-parser.c:3660
|
|
||||||
#: ../src/ui/theme-parser.c:3665 ../src/ui/theme-parser.c:3670
|
|
||||||
#, c-format
|
|
||||||
msgid "Element <%s> is not allowed inside a <%s> element"
|
|
||||||
msgstr "Елементът <%s> не е позволен в елемент <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3898
|
|
||||||
msgid "No draw_ops provided for frame piece"
|
|
||||||
msgstr "Няма draw_ops за детайл от рамката"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3913
|
|
||||||
msgid "No draw_ops provided for button"
|
|
||||||
msgstr "Няма draw_ops за бутон"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3967
|
|
||||||
#, c-format
|
|
||||||
msgid "No text is allowed inside element <%s>"
|
|
||||||
msgstr "Не е позволен текст в елемента <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:4025 ../src/ui/theme-parser.c:4037
|
|
||||||
#: ../src/ui/theme-parser.c:4049 ../src/ui/theme-parser.c:4061
|
|
||||||
#: ../src/ui/theme-parser.c:4073
|
|
||||||
#, c-format
|
|
||||||
msgid "<%s> specified twice for this theme"
|
|
||||||
msgstr "<%s> е указан два пъти за тази тема"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:4335
|
|
||||||
#, c-format
|
|
||||||
msgid "Failed to find a valid file for theme %s\n"
|
|
||||||
msgstr "Не е намерен валиден файл за темата %s\n"
|
|
||||||
|
|
||||||
#: ../src/x11/session.c:1815
|
#: ../src/x11/session.c:1815
|
||||||
msgid ""
|
msgid ""
|
||||||
"These windows do not support "save current setup" and will have to "
|
"These windows do not support "save current setup" and will have to "
|
||||||
@@ -1291,7 +609,7 @@ msgstr ""
|
|||||||
"Тези прозорци не поддържат операцията по записване на текущото състояние и "
|
"Тези прозорци не поддържат операцията по записване на текущото състояние и "
|
||||||
"ще трябва да се стартират ръчно при следващото ви влизане."
|
"ще трябва да се стартират ръчно при следващото ви влизане."
|
||||||
|
|
||||||
#: ../src/x11/window-props.c:558
|
#: ../src/x11/window-props.c:549
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s (on %s)"
|
msgid "%s (on %s)"
|
||||||
msgstr "%s (от %s)"
|
msgstr "%s (от %s)"
|
||||||
|
|||||||
102
po/cs.po
102
po/cs.po
@@ -12,7 +12,7 @@ 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: 2015-01-06 22:57+0000\n"
|
"POT-Creation-Date: 2015-03-24 23:25+0000\n"
|
||||||
"PO-Revision-Date: 2014-09-22 15:01+0200\n"
|
"PO-Revision-Date: 2014-09-22 15:01+0200\n"
|
||||||
"Last-Translator: Petr Kovar <pknbe@volny.cz>\n"
|
"Last-Translator: Petr Kovar <pknbe@volny.cz>\n"
|
||||||
"Language-Team: Czech <gnome-cs-list@gnome.org>\n"
|
"Language-Team: Czech <gnome-cs-list@gnome.org>\n"
|
||||||
@@ -30,91 +30,91 @@ msgstr "Navigace"
|
|||||||
|
|
||||||
#: ../data/50-mutter-navigation.xml.in.h:2
|
#: ../data/50-mutter-navigation.xml.in.h:2
|
||||||
msgid "Move window to workspace 1"
|
msgid "Move window to workspace 1"
|
||||||
msgstr "Přesunout okno na plochu 1"
|
msgstr "Přesunout okno na pracovní plochu 1"
|
||||||
|
|
||||||
#: ../data/50-mutter-navigation.xml.in.h:3
|
#: ../data/50-mutter-navigation.xml.in.h:3
|
||||||
msgid "Move window to workspace 2"
|
msgid "Move window to workspace 2"
|
||||||
msgstr "Přesunout okno na plochu 2"
|
msgstr "Přesunout okno na pracovní plochu 2"
|
||||||
|
|
||||||
#: ../data/50-mutter-navigation.xml.in.h:4
|
#: ../data/50-mutter-navigation.xml.in.h:4
|
||||||
msgid "Move window to workspace 3"
|
msgid "Move window to workspace 3"
|
||||||
msgstr "Přesunout okno na plochu 3"
|
msgstr "Přesunout okno na pracovní plochu 3"
|
||||||
|
|
||||||
#: ../data/50-mutter-navigation.xml.in.h:5
|
#: ../data/50-mutter-navigation.xml.in.h:5
|
||||||
msgid "Move window to workspace 4"
|
msgid "Move window to workspace 4"
|
||||||
msgstr "Přesunout okno na plochu 4"
|
msgstr "Přesunout okno na pracovní plochu 4"
|
||||||
|
|
||||||
#: ../data/50-mutter-navigation.xml.in.h:6
|
#: ../data/50-mutter-navigation.xml.in.h:6
|
||||||
msgid "Move window to last workspace"
|
msgid "Move window to last workspace"
|
||||||
msgstr "Přesunout okno na poslední plochu"
|
msgstr "Přesunout okno na poslední pracovní plochu"
|
||||||
|
|
||||||
#: ../data/50-mutter-navigation.xml.in.h:7
|
#: ../data/50-mutter-navigation.xml.in.h:7
|
||||||
msgid "Move window one workspace to the left"
|
msgid "Move window one workspace to the left"
|
||||||
msgstr "Přesunout okno o plochu doleva"
|
msgstr "Přesunout okno o jednu pracovní plochu doleva"
|
||||||
|
|
||||||
#: ../data/50-mutter-navigation.xml.in.h:8
|
#: ../data/50-mutter-navigation.xml.in.h:8
|
||||||
msgid "Move window one workspace to the right"
|
msgid "Move window one workspace to the right"
|
||||||
msgstr "Přesunout okno o plochu doprava"
|
msgstr "Přesunout okno o jednu pracovní plochu doprava"
|
||||||
|
|
||||||
#: ../data/50-mutter-navigation.xml.in.h:9
|
#: ../data/50-mutter-navigation.xml.in.h:9
|
||||||
msgid "Move window one workspace up"
|
msgid "Move window one workspace up"
|
||||||
msgstr "Přesunout okno o plochu nahoru"
|
msgstr "Přesunout okno o jednu pracovní plochu nahoru"
|
||||||
|
|
||||||
#: ../data/50-mutter-navigation.xml.in.h:10
|
#: ../data/50-mutter-navigation.xml.in.h:10
|
||||||
msgid "Move window one workspace down"
|
msgid "Move window one workspace down"
|
||||||
msgstr "Přesunout okno o plochu dolů"
|
msgstr "Přesunout okno o jednu pracovní plochu dolů"
|
||||||
|
|
||||||
#: ../data/50-mutter-navigation.xml.in.h:11
|
#: ../data/50-mutter-navigation.xml.in.h:11
|
||||||
msgid "Move window one monitor to the left"
|
msgid "Move window one monitor to the left"
|
||||||
msgstr "Přesunout okno o monitor doleva"
|
msgstr "Přesunout okno o jeden monitor doleva"
|
||||||
|
|
||||||
#: ../data/50-mutter-navigation.xml.in.h:12
|
#: ../data/50-mutter-navigation.xml.in.h:12
|
||||||
msgid "Move window one monitor to the right"
|
msgid "Move window one monitor to the right"
|
||||||
msgstr "Přesunout okno o monitor doprava"
|
msgstr "Přesunout okno o jeden monitor doprava"
|
||||||
|
|
||||||
#: ../data/50-mutter-navigation.xml.in.h:13
|
#: ../data/50-mutter-navigation.xml.in.h:13
|
||||||
msgid "Move window one monitor up"
|
msgid "Move window one monitor up"
|
||||||
msgstr "Přesunout okno o monitor nahoru"
|
msgstr "Přesunout okno o jeden monitor nahoru"
|
||||||
|
|
||||||
#: ../data/50-mutter-navigation.xml.in.h:14
|
#: ../data/50-mutter-navigation.xml.in.h:14
|
||||||
msgid "Move window one monitor down"
|
msgid "Move window one monitor down"
|
||||||
msgstr "Přesunout okno o monitor dolů"
|
msgstr "Přesunout okno o jeden monitor dolů"
|
||||||
|
|
||||||
#: ../data/50-mutter-navigation.xml.in.h:15
|
#: ../data/50-mutter-navigation.xml.in.h:15
|
||||||
msgid "Switch applications"
|
msgid "Switch applications"
|
||||||
msgstr "Přepnout mezi aplikacemi"
|
msgstr "Přepnout do jiné aplikace"
|
||||||
|
|
||||||
#: ../data/50-mutter-navigation.xml.in.h:16
|
#: ../data/50-mutter-navigation.xml.in.h:16
|
||||||
msgid "Switch to previous application"
|
msgid "Switch to previous application"
|
||||||
msgstr "Přepnout na předchozí aplikaci"
|
msgstr "Přepnout do předchozí aplikaci"
|
||||||
|
|
||||||
#: ../data/50-mutter-navigation.xml.in.h:17
|
#: ../data/50-mutter-navigation.xml.in.h:17
|
||||||
msgid "Switch windows"
|
msgid "Switch windows"
|
||||||
msgstr "Přepnout mezi okny"
|
msgstr "Přepnout do jiného okna"
|
||||||
|
|
||||||
#: ../data/50-mutter-navigation.xml.in.h:18
|
#: ../data/50-mutter-navigation.xml.in.h:18
|
||||||
msgid "Switch to previous window"
|
msgid "Switch to previous window"
|
||||||
msgstr "Přepnout na předchozí okno"
|
msgstr "Přepnout do minulého okna"
|
||||||
|
|
||||||
#: ../data/50-mutter-navigation.xml.in.h:19
|
#: ../data/50-mutter-navigation.xml.in.h:19
|
||||||
msgid "Switch windows of an application"
|
msgid "Switch windows of an application"
|
||||||
msgstr "Přepnout mezi okny aplikace"
|
msgstr "Přepnout do jiného okna aplikace"
|
||||||
|
|
||||||
#: ../data/50-mutter-navigation.xml.in.h:20
|
#: ../data/50-mutter-navigation.xml.in.h:20
|
||||||
msgid "Switch to previous window of an application"
|
msgid "Switch to previous window of an application"
|
||||||
msgstr "Přepnout na předchozí okno aplikace"
|
msgstr "Přepnout do předchozího okna aplikace"
|
||||||
|
|
||||||
#: ../data/50-mutter-navigation.xml.in.h:21
|
#: ../data/50-mutter-navigation.xml.in.h:21
|
||||||
msgid "Switch system controls"
|
msgid "Switch system controls"
|
||||||
msgstr "Přepnout mezi systémovými ovládacími prvky"
|
msgstr "Přepnout na systémový ovládací prvek"
|
||||||
|
|
||||||
#: ../data/50-mutter-navigation.xml.in.h:22
|
#: ../data/50-mutter-navigation.xml.in.h:22
|
||||||
msgid "Switch to previous system control"
|
msgid "Switch to previous system control"
|
||||||
msgstr "Přepnout na předchozí systémové ovládací prvky"
|
msgstr "Přepnout na minulý systémový ovládací prvek"
|
||||||
|
|
||||||
#: ../data/50-mutter-navigation.xml.in.h:23
|
#: ../data/50-mutter-navigation.xml.in.h:23
|
||||||
msgid "Switch windows directly"
|
msgid "Switch windows directly"
|
||||||
msgstr "Přepnout přímo mezi okny"
|
msgstr "Přepnout do minulého okna"
|
||||||
|
|
||||||
#: ../data/50-mutter-navigation.xml.in.h:24
|
#: ../data/50-mutter-navigation.xml.in.h:24
|
||||||
msgid "Switch directly to previous window"
|
msgid "Switch directly to previous window"
|
||||||
@@ -122,15 +122,15 @@ msgstr "Přepnout přímo na předchozí okno"
|
|||||||
|
|
||||||
#: ../data/50-mutter-navigation.xml.in.h:25
|
#: ../data/50-mutter-navigation.xml.in.h:25
|
||||||
msgid "Switch windows of an app directly"
|
msgid "Switch windows of an app directly"
|
||||||
msgstr "Přepnout přímo mezi okny aplikace"
|
msgstr "Přepnout do jiného okna aplikace"
|
||||||
|
|
||||||
#: ../data/50-mutter-navigation.xml.in.h:26
|
#: ../data/50-mutter-navigation.xml.in.h:26
|
||||||
msgid "Switch directly to previous window of an app"
|
msgid "Switch directly to previous window of an app"
|
||||||
msgstr "Přepnout přímo na předchozí okno aplikace"
|
msgstr "Přepnout do předchozího okna aplikace"
|
||||||
|
|
||||||
#: ../data/50-mutter-navigation.xml.in.h:27
|
#: ../data/50-mutter-navigation.xml.in.h:27
|
||||||
msgid "Switch system controls directly"
|
msgid "Switch system controls directly"
|
||||||
msgstr "Přepnout přímo mezi systémovými ovládacími prvky"
|
msgstr "Přepnout na minulý systémový ovládací prvek"
|
||||||
|
|
||||||
#: ../data/50-mutter-navigation.xml.in.h:28
|
#: ../data/50-mutter-navigation.xml.in.h:28
|
||||||
msgid "Switch directly to previous system control"
|
msgid "Switch directly to previous system control"
|
||||||
@@ -198,7 +198,7 @@ msgstr "Aktivovat nabídku okna"
|
|||||||
|
|
||||||
#: ../data/50-mutter-windows.xml.in.h:3
|
#: ../data/50-mutter-windows.xml.in.h:3
|
||||||
msgid "Toggle fullscreen mode"
|
msgid "Toggle fullscreen mode"
|
||||||
msgstr "Přepnout režim na celou obrazovku"
|
msgstr "Přepnout režim celé obrazovky"
|
||||||
|
|
||||||
#: ../data/50-mutter-windows.xml.in.h:4
|
#: ../data/50-mutter-windows.xml.in.h:4
|
||||||
msgid "Toggle maximization state"
|
msgid "Toggle maximization state"
|
||||||
@@ -210,7 +210,7 @@ msgstr "Maximalizovat okno"
|
|||||||
|
|
||||||
#: ../data/50-mutter-windows.xml.in.h:6
|
#: ../data/50-mutter-windows.xml.in.h:6
|
||||||
msgid "Restore window"
|
msgid "Restore window"
|
||||||
msgstr "Obnovit okno"
|
msgstr "Obnovit velikost okna"
|
||||||
|
|
||||||
#: ../data/50-mutter-windows.xml.in.h:7
|
#: ../data/50-mutter-windows.xml.in.h:7
|
||||||
msgid "Toggle shaded state"
|
msgid "Toggle shaded state"
|
||||||
@@ -234,20 +234,20 @@ msgstr "Změnit velikost okna"
|
|||||||
|
|
||||||
#: ../data/50-mutter-windows.xml.in.h:12
|
#: ../data/50-mutter-windows.xml.in.h:12
|
||||||
msgid "Toggle window on all workspaces or one"
|
msgid "Toggle window on all workspaces or one"
|
||||||
msgstr "Přepnout výskyt okna na všech plochách nebo jen na jedné"
|
msgstr "Přepnout okno na všechny/jednu pracovní plochu"
|
||||||
|
|
||||||
#: ../data/50-mutter-windows.xml.in.h:13
|
#: ../data/50-mutter-windows.xml.in.h:13
|
||||||
msgid "Raise window if covered, otherwise lower it"
|
msgid "Raise window if covered, otherwise lower it"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Přenést okno do popředí, pokud je zakryté, jinak jej odsunout do pozadí"
|
"Když je okno zakryté vynést jej do popředí, jinak odsunout do pozadí"
|
||||||
|
|
||||||
#: ../data/50-mutter-windows.xml.in.h:14
|
#: ../data/50-mutter-windows.xml.in.h:14
|
||||||
msgid "Raise window above other windows"
|
msgid "Raise window above other windows"
|
||||||
msgstr "Přenést okno do popředí nad ostatní okna"
|
msgstr "Vynést okno do popředí nad ostatní okna"
|
||||||
|
|
||||||
#: ../data/50-mutter-windows.xml.in.h:15
|
#: ../data/50-mutter-windows.xml.in.h:15
|
||||||
msgid "Lower window below other windows"
|
msgid "Lower window below other windows"
|
||||||
msgstr "Odsunout okno do pozadí pod ostatní okna"
|
msgstr "Odsunout okno do pozadí za ostatní okna"
|
||||||
|
|
||||||
#: ../data/50-mutter-windows.xml.in.h:16
|
#: ../data/50-mutter-windows.xml.in.h:16
|
||||||
msgid "Maximize window vertically"
|
msgid "Maximize window vertically"
|
||||||
@@ -259,11 +259,11 @@ msgstr "Maximalizovat okno vodorovně"
|
|||||||
|
|
||||||
#: ../data/50-mutter-windows.xml.in.h:18
|
#: ../data/50-mutter-windows.xml.in.h:18
|
||||||
msgid "View split on left"
|
msgid "View split on left"
|
||||||
msgstr "Zobrazit rozdělení nalevo"
|
msgstr "Rozdělit okno přes levou půlku obrazovky"
|
||||||
|
|
||||||
#: ../data/50-mutter-windows.xml.in.h:19
|
#: ../data/50-mutter-windows.xml.in.h:19
|
||||||
msgid "View split on right"
|
msgid "View split on right"
|
||||||
msgstr "Zobrazit rozdělení napravo"
|
msgstr "Rozdělit okno přes pravou půlku obrazovky"
|
||||||
|
|
||||||
#: ../data/mutter.desktop.in.h:1
|
#: ../data/mutter.desktop.in.h:1
|
||||||
msgid "Mutter"
|
msgid "Mutter"
|
||||||
@@ -437,22 +437,42 @@ msgstr "Přepnout na VT 6"
|
|||||||
msgid "Switch to VT 7"
|
msgid "Switch to VT 7"
|
||||||
msgstr "Přepnout na VT 7"
|
msgstr "Přepnout na VT 7"
|
||||||
|
|
||||||
#: ../src/backends/meta-monitor-manager.c:351
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:8
|
||||||
|
msgid "Switch to VT 8"
|
||||||
|
msgstr "Přepnout na VT 8"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:9
|
||||||
|
msgid "Switch to VT 9"
|
||||||
|
msgstr "Přepnout na VT 9"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:10
|
||||||
|
msgid "Switch to VT 10"
|
||||||
|
msgstr "Přepnout na VT 10"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:11
|
||||||
|
msgid "Switch to VT 11"
|
||||||
|
msgstr "Přepnout na VT 11"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:12
|
||||||
|
msgid "Switch to VT 12"
|
||||||
|
msgstr "Přepnout na VT 12"
|
||||||
|
|
||||||
|
#: ../src/backends/meta-monitor-manager.c:364
|
||||||
msgid "Built-in display"
|
msgid "Built-in display"
|
||||||
msgstr "Vestavěný displej"
|
msgstr "Vestavěný displej"
|
||||||
|
|
||||||
#: ../src/backends/meta-monitor-manager.c:378
|
#: ../src/backends/meta-monitor-manager.c:391
|
||||||
msgid "Unknown"
|
msgid "Unknown"
|
||||||
msgstr "Neznámý"
|
msgstr "Neznámý"
|
||||||
|
|
||||||
#: ../src/backends/meta-monitor-manager.c:380
|
#: ../src/backends/meta-monitor-manager.c:393
|
||||||
msgid "Unknown Display"
|
msgid "Unknown Display"
|
||||||
msgstr "Neznámý displej"
|
msgstr "Neznámý displej"
|
||||||
|
|
||||||
#. TRANSLATORS: this is a monitor vendor name, followed by a
|
#. TRANSLATORS: this is a monitor vendor name, followed by a
|
||||||
#. * size in inches, like 'Dell 15"'
|
#. * size in inches, like 'Dell 15"'
|
||||||
#.
|
#.
|
||||||
#: ../src/backends/meta-monitor-manager.c:388
|
#: ../src/backends/meta-monitor-manager.c:401
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s %s"
|
msgid "%s %s"
|
||||||
msgstr "%s %s"
|
msgstr "%s %s"
|
||||||
@@ -495,7 +515,7 @@ msgstr "_Počkat"
|
|||||||
msgid "_Force Quit"
|
msgid "_Force Quit"
|
||||||
msgstr "_Vynutit ukončení"
|
msgstr "_Vynutit ukončení"
|
||||||
|
|
||||||
#: ../src/core/display.c:561
|
#: ../src/core/display.c:562
|
||||||
#, 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 "Nelze otevřít displej X Window System „%s“\n"
|
msgstr "Nelze otevřít displej X Window System „%s“\n"
|
||||||
@@ -556,7 +576,7 @@ msgstr "Vypíše verzi"
|
|||||||
msgid "Mutter plugin to use"
|
msgid "Mutter plugin to use"
|
||||||
msgstr "Zásuvný modul Mutter, který se má použít"
|
msgstr "Zásuvný modul Mutter, který se má použít"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:2015
|
#: ../src/core/prefs.c:2004
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Workspace %d"
|
msgid "Workspace %d"
|
||||||
msgstr "Plocha %d"
|
msgstr "Plocha %d"
|
||||||
@@ -587,7 +607,7 @@ msgstr ""
|
|||||||
"Tato okna nepodporují "ukládání aktuálního nastavení" a po vašem "
|
"Tato okna nepodporují "ukládání aktuálního nastavení" a po vašem "
|
||||||
"příštím přihlášení je budete muset spustit ručně."
|
"příštím přihlášení je budete muset spustit ručně."
|
||||||
|
|
||||||
#: ../src/x11/window-props.c:558
|
#: ../src/x11/window-props.c:549
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s (on %s)"
|
msgid "%s (on %s)"
|
||||||
msgstr "%s (na %s)"
|
msgstr "%s (na %s)"
|
||||||
|
|||||||
44
po/es.po
44
po/es.po
@@ -14,8 +14,8 @@ msgstr ""
|
|||||||
"Project-Id-Version: mutter.master\n"
|
"Project-Id-Version: mutter.master\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: 2015-01-11 22:56+0000\n"
|
"POT-Creation-Date: 2015-02-23 11:10+0000\n"
|
||||||
"PO-Revision-Date: 2015-01-12 12:14+0100\n"
|
"PO-Revision-Date: 2015-02-23 19:07+0100\n"
|
||||||
"Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n"
|
"Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n"
|
||||||
"Language-Team: Español; Castellano <gnome-es-list@gnome.org>\n"
|
"Language-Team: Español; Castellano <gnome-es-list@gnome.org>\n"
|
||||||
"Language: \n"
|
"Language: \n"
|
||||||
@@ -444,22 +444,47 @@ msgstr "Cambiar al VT 6"
|
|||||||
msgid "Switch to VT 7"
|
msgid "Switch to VT 7"
|
||||||
msgstr "Cambiar al VT 7"
|
msgstr "Cambiar al VT 7"
|
||||||
|
|
||||||
#: ../src/backends/meta-monitor-manager.c:351
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:8
|
||||||
|
#| msgid "Switch to VT 1"
|
||||||
|
msgid "Switch to VT 8"
|
||||||
|
msgstr "Cambiar al VT 8"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:9
|
||||||
|
#| msgid "Switch to VT 1"
|
||||||
|
msgid "Switch to VT 9"
|
||||||
|
msgstr "Cambiar al VT 9"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:10
|
||||||
|
#| msgid "Switch to VT 1"
|
||||||
|
msgid "Switch to VT 10"
|
||||||
|
msgstr "Cambiar al VT 10"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:11
|
||||||
|
#| msgid "Switch to VT 1"
|
||||||
|
msgid "Switch to VT 11"
|
||||||
|
msgstr "Cambiar al VT 11"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:12
|
||||||
|
#| msgid "Switch to VT 1"
|
||||||
|
msgid "Switch to VT 12"
|
||||||
|
msgstr "Cambiar al VT 12"
|
||||||
|
|
||||||
|
#: ../src/backends/meta-monitor-manager.c:364
|
||||||
msgid "Built-in display"
|
msgid "Built-in display"
|
||||||
msgstr "Pantalla integrada"
|
msgstr "Pantalla integrada"
|
||||||
|
|
||||||
#: ../src/backends/meta-monitor-manager.c:378
|
#: ../src/backends/meta-monitor-manager.c:391
|
||||||
msgid "Unknown"
|
msgid "Unknown"
|
||||||
msgstr "Desconocida"
|
msgstr "Desconocida"
|
||||||
|
|
||||||
#: ../src/backends/meta-monitor-manager.c:380
|
#: ../src/backends/meta-monitor-manager.c:393
|
||||||
msgid "Unknown Display"
|
msgid "Unknown Display"
|
||||||
msgstr "Pantalla desconocida"
|
msgstr "Pantalla desconocida"
|
||||||
|
|
||||||
#. TRANSLATORS: this is a monitor vendor name, followed by a
|
#. TRANSLATORS: this is a monitor vendor name, followed by a
|
||||||
#. * size in inches, like 'Dell 15"'
|
#. * size in inches, like 'Dell 15"'
|
||||||
#.
|
#.
|
||||||
#: ../src/backends/meta-monitor-manager.c:388
|
#: ../src/backends/meta-monitor-manager.c:401
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s %s"
|
msgid "%s %s"
|
||||||
msgstr "%s %s"
|
msgstr "%s %s"
|
||||||
@@ -504,7 +529,7 @@ msgstr "_Esperar"
|
|||||||
msgid "_Force Quit"
|
msgid "_Force Quit"
|
||||||
msgstr "_Forzar la salida"
|
msgstr "_Forzar la salida"
|
||||||
|
|
||||||
#: ../src/core/display.c:561
|
#: ../src/core/display.c:562
|
||||||
#, 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 "Ocurrió un error al abrir la pantalla de X Window System «%s»\n"
|
msgstr "Ocurrió un error al abrir la pantalla de X Window System «%s»\n"
|
||||||
@@ -571,9 +596,6 @@ msgstr "Área de trabajo %d"
|
|||||||
|
|
||||||
#: ../src/core/screen.c:525
|
#: ../src/core/screen.c:525
|
||||||
#, c-format
|
#, c-format
|
||||||
#| msgid ""
|
|
||||||
#| "Screen %d on display \"%s\" already has a window manager; try using the --"
|
|
||||||
#| "replace option to replace the current window manager.\n"
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Display \"%s\" already has a window manager; try using the --replace option "
|
"Display \"%s\" already has a window manager; try using the --replace option "
|
||||||
"to replace the current window manager."
|
"to replace the current window manager."
|
||||||
@@ -598,7 +620,7 @@ msgstr ""
|
|||||||
"Estas ventanas no soportan «guardar la configuración actual» y tendrán que "
|
"Estas ventanas no soportan «guardar la configuración actual» y tendrán que "
|
||||||
"reiniciarse manualmente la próxima vez que inicie una sesión."
|
"reiniciarse manualmente la próxima vez que inicie una sesión."
|
||||||
|
|
||||||
#: ../src/x11/window-props.c:558
|
#: ../src/x11/window-props.c:549
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s (on %s)"
|
msgid "%s (on %s)"
|
||||||
msgstr "%s (on %s)"
|
msgstr "%s (on %s)"
|
||||||
|
|||||||
40
po/eu.po
40
po/eu.po
@@ -11,8 +11,8 @@ msgstr ""
|
|||||||
"Project-Id-Version: mutter master\n"
|
"Project-Id-Version: mutter master\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: 2015-01-08 18:46+0100\n"
|
"POT-Creation-Date: 2015-03-21 15:50+0100\n"
|
||||||
"PO-Revision-Date: 2015-01-08 18:47+0100\n"
|
"PO-Revision-Date: 2015-03-21 15:51+0100\n"
|
||||||
"Last-Translator: Iñaki Larrañaga Murgoitio <dooteo@zundan.com>\n"
|
"Last-Translator: Iñaki Larrañaga Murgoitio <dooteo@zundan.com>\n"
|
||||||
"Language-Team: Basque <librezale@librezale.org>\n"
|
"Language-Team: Basque <librezale@librezale.org>\n"
|
||||||
"Language: eu\n"
|
"Language: eu\n"
|
||||||
@@ -435,22 +435,42 @@ msgstr "Aldatu 6. TBra"
|
|||||||
msgid "Switch to VT 7"
|
msgid "Switch to VT 7"
|
||||||
msgstr "Aldatu 7. TBra"
|
msgstr "Aldatu 7. TBra"
|
||||||
|
|
||||||
#: ../src/backends/meta-monitor-manager.c:351
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:8
|
||||||
|
msgid "Switch to VT 8"
|
||||||
|
msgstr "Aldatu 8. TBra"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:9
|
||||||
|
msgid "Switch to VT 9"
|
||||||
|
msgstr "Aldatu 9. TBra"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:10
|
||||||
|
msgid "Switch to VT 10"
|
||||||
|
msgstr "Aldatu 10. TBra"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:11
|
||||||
|
msgid "Switch to VT 11"
|
||||||
|
msgstr "Aldatu 11. TBra"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:12
|
||||||
|
msgid "Switch to VT 12"
|
||||||
|
msgstr "Aldatu 12. TBra"
|
||||||
|
|
||||||
|
#: ../src/backends/meta-monitor-manager.c:364
|
||||||
msgid "Built-in display"
|
msgid "Built-in display"
|
||||||
msgstr "Bertako pantaila"
|
msgstr "Bertako pantaila"
|
||||||
|
|
||||||
#: ../src/backends/meta-monitor-manager.c:378
|
#: ../src/backends/meta-monitor-manager.c:391
|
||||||
msgid "Unknown"
|
msgid "Unknown"
|
||||||
msgstr "Ezezaguna"
|
msgstr "Ezezaguna"
|
||||||
|
|
||||||
#: ../src/backends/meta-monitor-manager.c:380
|
#: ../src/backends/meta-monitor-manager.c:393
|
||||||
msgid "Unknown Display"
|
msgid "Unknown Display"
|
||||||
msgstr "Pantaila ezezaguna"
|
msgstr "Pantaila ezezaguna"
|
||||||
|
|
||||||
#. TRANSLATORS: this is a monitor vendor name, followed by a
|
#. TRANSLATORS: this is a monitor vendor name, followed by a
|
||||||
#. * size in inches, like 'Dell 15"'
|
#. * size in inches, like 'Dell 15"'
|
||||||
#.
|
#.
|
||||||
#: ../src/backends/meta-monitor-manager.c:388
|
#: ../src/backends/meta-monitor-manager.c:401
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s %s"
|
msgid "%s %s"
|
||||||
msgstr "%s %s"
|
msgstr "%s %s"
|
||||||
@@ -495,7 +515,7 @@ msgstr "_Itxaron"
|
|||||||
msgid "_Force Quit"
|
msgid "_Force Quit"
|
||||||
msgstr "_Behartu ixtera"
|
msgstr "_Behartu ixtera"
|
||||||
|
|
||||||
#: ../src/core/display.c:561
|
#: ../src/core/display.c:562
|
||||||
#, 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 "Huts egin du X Window sistemaren '%s' pantaila irekitzean\n"
|
msgstr "Huts egin du X Window sistemaren '%s' pantaila irekitzean\n"
|
||||||
@@ -566,8 +586,8 @@ msgid ""
|
|||||||
"Display \"%s\" already has a window manager; try using the --replace option "
|
"Display \"%s\" already has a window manager; try using the --replace option "
|
||||||
"to replace the current window manager."
|
"to replace the current window manager."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"'%s' pantailak badu leiho-kudeatzailea; erabili --replace aukera "
|
"'%s' pantailak badu leiho-kudeatzailea; erabili --replace aukera uneko leiho-"
|
||||||
"uneko leiho-kudeatzailea ordezteko."
|
"kudeatzailea ordezteko."
|
||||||
|
|
||||||
#: ../src/core/screen.c:607
|
#: ../src/core/screen.c:607
|
||||||
#, c-format
|
#, c-format
|
||||||
@@ -586,7 +606,7 @@ msgstr ""
|
|||||||
"Leiho hauek ez dute onartzen "gorde uneko konfigurazioa" eta eskuz "
|
"Leiho hauek ez dute onartzen "gorde uneko konfigurazioa" eta eskuz "
|
||||||
"berrabiarazi beharko dituzu hurrengo saioa hasten duzunean."
|
"berrabiarazi beharko dituzu hurrengo saioa hasten duzunean."
|
||||||
|
|
||||||
#: ../src/x11/window-props.c:558
|
#: ../src/x11/window-props.c:549
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s (on %s)"
|
msgid "%s (on %s)"
|
||||||
msgstr "%s (%s)"
|
msgstr "%s (%s)"
|
||||||
|
|||||||
818
po/fr.po
818
po/fr.po
@@ -1,5 +1,5 @@
|
|||||||
# French translation of mutter.
|
# French translation of mutter.
|
||||||
# Copyright (C) 2002-2014 Free Software Foundation, Inc.
|
# Copyright (C) 2002-2015 Free Software Foundation, Inc.
|
||||||
# This file is distributed under the same license as the metacity package.
|
# This file is distributed under the same license as the metacity package.
|
||||||
#
|
#
|
||||||
# Christophe Fergeau <teuf@users.sourceforge.net>, 2002.
|
# Christophe Fergeau <teuf@users.sourceforge.net>, 2002.
|
||||||
@@ -11,17 +11,16 @@
|
|||||||
# Cyprien Le Pannérer <cyplp@free.fr>, 2006.
|
# Cyprien Le Pannérer <cyplp@free.fr>, 2006.
|
||||||
# Robert-André Mauchin <zebob.m@gmail.com>, 2007.
|
# Robert-André Mauchin <zebob.m@gmail.com>, 2007.
|
||||||
# Stéphane Raimbault <stephane.raimbault@gmail.com>, 2007.
|
# Stéphane Raimbault <stephane.raimbault@gmail.com>, 2007.
|
||||||
# Claude Paroz <claude@2xlibre.net>, 2008-2014.
|
# Claude Paroz <claude@2xlibre.net>, 2008-2015.
|
||||||
# Bruno Brouard <annoa.b@gmail.com>, 2011-12.
|
# Bruno Brouard <annoa.b@gmail.com>, 2011-12.
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: mutter masterReport-Msgid-Bugs-To: http://bugzilla.gnome."
|
"Project-Id-Version: mutter master\n"
|
||||||
"org/enter_bug.cgi?product=mutter&component=general\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: 2014-08-29 21:52+0000\n"
|
"POT-Creation-Date: 2015-02-23 23:11+0000\n"
|
||||||
"PO-Revision-Date: 2014-08-30 11:59+0200\n"
|
"PO-Revision-Date: 2015-02-24 10:08+0100\n"
|
||||||
"Last-Translator: Claude Paroz <claude@2xlibre.net>\n"
|
"Last-Translator: Claude Paroz <claude@2xlibre.net>\n"
|
||||||
"Language-Team: GNOME French Team <gnomefr@traduc.org>\n"
|
"Language-Team: GNOME French Team <gnomefr@traduc.org>\n"
|
||||||
"Language: fr\n"
|
"Language: fr\n"
|
||||||
@@ -408,8 +407,8 @@ msgid ""
|
|||||||
"When true, the new windows will always be put in the center of the active "
|
"When true, the new windows will always be put in the center of the active "
|
||||||
"screen of the monitor."
|
"screen of the monitor."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Si true (vrai), les nouvelles fenêtres seront toujours placées au centre "
|
"Si true (vrai), les nouvelles fenêtres seront toujours placées au centre de "
|
||||||
"de l'écran actif du moniteur."
|
"l'écran actif du moniteur."
|
||||||
|
|
||||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:21
|
#: ../data/org.gnome.mutter.gschema.xml.in.h:21
|
||||||
msgid "Select window from tab popup"
|
msgid "Select window from tab popup"
|
||||||
@@ -449,29 +448,49 @@ msgstr "Passer à l'émulateur de terminal 6"
|
|||||||
msgid "Switch to VT 7"
|
msgid "Switch to VT 7"
|
||||||
msgstr "Passer à l'émulateur de terminal 7"
|
msgstr "Passer à l'émulateur de terminal 7"
|
||||||
|
|
||||||
#: ../src/backends/meta-monitor-manager.c:412
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:8
|
||||||
|
msgid "Switch to VT 8"
|
||||||
|
msgstr "Passer à l'émulateur de terminal 8"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:9
|
||||||
|
msgid "Switch to VT 9"
|
||||||
|
msgstr "Passer à l'émulateur de terminal 9"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:10
|
||||||
|
msgid "Switch to VT 10"
|
||||||
|
msgstr "Passer à l'émulateur de terminal 10"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:11
|
||||||
|
msgid "Switch to VT 11"
|
||||||
|
msgstr "Passer à l'émulateur de terminal 11"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:12
|
||||||
|
msgid "Switch to VT 12"
|
||||||
|
msgstr "Passer à l'émulateur de terminal 12"
|
||||||
|
|
||||||
|
#: ../src/backends/meta-monitor-manager.c:364
|
||||||
msgid "Built-in display"
|
msgid "Built-in display"
|
||||||
msgstr "Affichage intégré"
|
msgstr "Affichage intégré"
|
||||||
|
|
||||||
#: ../src/backends/meta-monitor-manager.c:437
|
#: ../src/backends/meta-monitor-manager.c:391
|
||||||
msgid "Unknown"
|
msgid "Unknown"
|
||||||
msgstr "Inconnu"
|
msgstr "Inconnu"
|
||||||
|
|
||||||
#: ../src/backends/meta-monitor-manager.c:439
|
#: ../src/backends/meta-monitor-manager.c:393
|
||||||
msgid "Unknown Display"
|
msgid "Unknown Display"
|
||||||
msgstr "Affichage inconnu"
|
msgstr "Affichage inconnu"
|
||||||
|
|
||||||
#. TRANSLATORS: this is a monitor vendor name, followed by a
|
#. TRANSLATORS: this is a monitor vendor name, followed by a
|
||||||
#. * size in inches, like 'Dell 15"'
|
#. * size in inches, like 'Dell 15"'
|
||||||
#.
|
#.
|
||||||
#: ../src/backends/meta-monitor-manager.c:447
|
#: ../src/backends/meta-monitor-manager.c:401
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s %s"
|
msgid "%s %s"
|
||||||
msgstr "%s %s"
|
msgstr "%s %s"
|
||||||
|
|
||||||
#. 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:443
|
#: ../src/compositor/compositor.c:456
|
||||||
#, 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"
|
||||||
@@ -480,10 +499,6 @@ msgstr ""
|
|||||||
"Un autre gestionnaire de composition est déjà lancé sur l'écran %i de "
|
"Un autre gestionnaire de composition est déjà lancé sur l'écran %i de "
|
||||||
"l'affichage « %s »."
|
"l'affichage « %s »."
|
||||||
|
|
||||||
#: ../src/compositor/meta-background.c:1044
|
|
||||||
msgid "background texture could not be created from file"
|
|
||||||
msgstr "la texture d'arrière-plan n'a pas pu être créée depuis le fichier"
|
|
||||||
|
|
||||||
#: ../src/core/bell.c:185
|
#: ../src/core/bell.c:185
|
||||||
msgid "Bell event"
|
msgid "Bell event"
|
||||||
msgstr "Évènement sonore"
|
msgstr "Évènement sonore"
|
||||||
@@ -513,7 +528,7 @@ msgstr "_Attendre"
|
|||||||
msgid "_Force Quit"
|
msgid "_Force Quit"
|
||||||
msgstr "_Forcer à quitter"
|
msgstr "_Forcer à quitter"
|
||||||
|
|
||||||
#: ../src/core/display.c:547
|
#: ../src/core/display.c:562
|
||||||
#, 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 "Impossible d'ouvrir l'affichage « %s » du système X Window\n"
|
msgstr "Impossible d'ouvrir l'affichage « %s » du système X Window\n"
|
||||||
@@ -550,19 +565,6 @@ msgstr "Lancer comme un compositeur wayland"
|
|||||||
msgid "Run as a full display server, rather than nested"
|
msgid "Run as a full display server, rather than nested"
|
||||||
msgstr "Lancer comme un serveur d'affichage complet, plutôt qu'imbriqué"
|
msgstr "Lancer comme un serveur d'affichage complet, plutôt qu'imbriqué"
|
||||||
|
|
||||||
#: ../src/core/main.c:459
|
|
||||||
#, c-format
|
|
||||||
msgid "Failed to scan themes directory: %s\n"
|
|
||||||
msgstr "Le parcours du répertoire de thèmes a échoué : %s\n"
|
|
||||||
|
|
||||||
#: ../src/core/main.c:475
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Could not find a theme! Be sure %s exists and contains the usual themes.\n"
|
|
||||||
msgstr ""
|
|
||||||
"Impossible de trouver un thème ! Assurez-vous que %s existe et contient les "
|
|
||||||
"thèmes habituels.\n"
|
|
||||||
|
|
||||||
#: ../src/core/mutter.c:39
|
#: ../src/core/mutter.c:39
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -587,759 +589,29 @@ msgstr "Afficher la version"
|
|||||||
msgid "Mutter plugin to use"
|
msgid "Mutter plugin to use"
|
||||||
msgstr "Greffon de Mutter à utiliser"
|
msgstr "Greffon de Mutter à utiliser"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:2101
|
#: ../src/core/prefs.c:2004
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Workspace %d"
|
msgid "Workspace %d"
|
||||||
msgstr "Espace de travail %d"
|
msgstr "Espace de travail %d"
|
||||||
|
|
||||||
#: ../src/core/screen.c:548
|
#: ../src/core/screen.c:525
|
||||||
|
#, c-format
|
||||||
|
msgid ""
|
||||||
|
"Display \"%s\" already has a window manager; try using the --replace option "
|
||||||
|
"to replace the current window manager."
|
||||||
|
msgstr ""
|
||||||
|
"L'affichage « %s » a déjà un gestionnaire de fenêtres ; essayez d'utiliser "
|
||||||
|
"l'option --replace pour remplacer le gestionnaire de fenêtres actuel."
|
||||||
|
|
||||||
|
#: ../src/core/screen.c:607
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Screen %d on display '%s' is invalid\n"
|
msgid "Screen %d on display '%s' is invalid\n"
|
||||||
msgstr "L'écran %d sur l'affichage « %s » n'est pas valide\n"
|
msgstr "L'écran %d sur l'affichage « %s » n'est pas valide\n"
|
||||||
|
|
||||||
#: ../src/core/screen.c:564
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Screen %d on display \"%s\" already has a window manager; try using the --"
|
|
||||||
"replace option to replace the current window manager.\n"
|
|
||||||
msgstr ""
|
|
||||||
"L'écran %d sur l'affichage « %s » a déjà un gestionnaire de fenêtres ; "
|
|
||||||
"essayez d'utiliser l'option --replace pour remplacer le gestionnaire de "
|
|
||||||
"fenêtres actuel.\n"
|
|
||||||
|
|
||||||
#: ../src/core/screen.c:657
|
|
||||||
#, c-format
|
|
||||||
msgid "Screen %d on display \"%s\" already has a window manager\n"
|
|
||||||
msgstr "L'écran %d sur l'affichage « %s » a déjà un gestionnaire de fenêtres\n"
|
|
||||||
|
|
||||||
#: ../src/core/util.c:118
|
#: ../src/core/util.c:118
|
||||||
msgid "Mutter was compiled without support for verbose mode\n"
|
msgid "Mutter was compiled without support for verbose mode\n"
|
||||||
msgstr "Mutter a été compilé sans la prise en charge du mode bavard\n"
|
msgstr "Mutter a été compilé sans la prise en charge du mode bavard\n"
|
||||||
|
|
||||||
#. Translators: This represents the size of a window. The first number is
|
|
||||||
#. * the width of the window and the second is the height.
|
|
||||||
#.
|
|
||||||
#: ../src/ui/resizepopup.c:134
|
|
||||||
#, c-format
|
|
||||||
msgid "%d x %d"
|
|
||||||
msgstr "%d x %d"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:233
|
|
||||||
msgid "top"
|
|
||||||
msgstr "haut"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:235
|
|
||||||
msgid "bottom"
|
|
||||||
msgstr "bas"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:237
|
|
||||||
msgid "left"
|
|
||||||
msgstr "gauche"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:239
|
|
||||||
msgid "right"
|
|
||||||
msgstr "droite"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:267
|
|
||||||
#, c-format
|
|
||||||
msgid "frame geometry does not specify \"%s\" dimension"
|
|
||||||
msgstr "la géométrie du cadre n'indique pas la dimension « %s »"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:286
|
|
||||||
#, c-format
|
|
||||||
msgid "frame geometry does not specify dimension \"%s\" for border \"%s\""
|
|
||||||
msgstr ""
|
|
||||||
"la géométrie du cadre n'indique pas la dimension « %s » pour la bordure "
|
|
||||||
"« %s »"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:323
|
|
||||||
#, c-format
|
|
||||||
msgid "Button aspect ratio %g is not reasonable"
|
|
||||||
msgstr "La proportion du bouton %g n'est pas raisonnable"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:335
|
|
||||||
#, c-format
|
|
||||||
msgid "Frame geometry does not specify size of buttons"
|
|
||||||
msgstr "La géométrie du cadre n'indique pas la taille des boutons"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1061
|
|
||||||
#, c-format
|
|
||||||
msgid "Gradients should have at least two colors"
|
|
||||||
msgstr "Les dégradés doivent comporter au moins deux couleurs"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1211
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"GTK custom color specification must have color name and fallback in "
|
|
||||||
"parentheses, e.g. gtk:custom(foo,bar); could not parse \"%s\""
|
|
||||||
msgstr ""
|
|
||||||
"Une spécification de couleur personnalisée GTK doit comporter un nom de "
|
|
||||||
"couleur et un substitut entre parenthèses, par ex. gtk:custom(foo,bar) ; "
|
|
||||||
"impossible d'analyser « %s »"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1227
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Invalid character '%c' in color_name parameter of gtk:custom, only A-Za-z0-9-"
|
|
||||||
"_ are valid"
|
|
||||||
msgstr ""
|
|
||||||
"Caractère « %c » non valide dans le paramètre color_name de gtk:custom, "
|
|
||||||
"seuls A-Za-z0-9-_ sont acceptés"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1241
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Gtk:custom format is \"gtk:custom(color_name,fallback)\", \"%s\" does not "
|
|
||||||
"fit the format"
|
|
||||||
msgstr ""
|
|
||||||
"Le format de gtk:custom est « gtk:custom(nom_couleur,substitut) », « %s » ne "
|
|
||||||
"correspond pas à ce format"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1286
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"GTK color specification must have the state in brackets, e.g. gtk:fg[NORMAL] "
|
|
||||||
"where NORMAL is the state; could not parse \"%s\""
|
|
||||||
msgstr ""
|
|
||||||
"La spécification de couleur GTK doit présenter l'état entre crochets, p. ex. "
|
|
||||||
"gtk:fg[NORMAL] où NORMAL est l'état ; impossible d'analyser « %s »"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1300
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"GTK color specification must have a close bracket after the state, e.g. gtk:"
|
|
||||||
"fg[NORMAL] where NORMAL is the state; could not parse \"%s\""
|
|
||||||
msgstr ""
|
|
||||||
"La spécification de couleur GTK doit comporter un crochet de fermeture après "
|
|
||||||
"l'état, p. ex. gtk:fg[NORMAL] où NORMAL est l'état ; impossible d'analyser "
|
|
||||||
"« %s »"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1311
|
|
||||||
#, c-format
|
|
||||||
msgid "Did not understand state \"%s\" in color specification"
|
|
||||||
msgstr ""
|
|
||||||
"Impossible de comprendre l'état « %s » dans la spécification de couleur"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1324
|
|
||||||
#, c-format
|
|
||||||
msgid "Did not understand color component \"%s\" in color specification"
|
|
||||||
msgstr ""
|
|
||||||
"Impossible de comprendre le composant de couleur « %s » dans la "
|
|
||||||
"spécification de couleur"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1352
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Blend format is \"blend/bg_color/fg_color/alpha\", \"%s\" does not fit the "
|
|
||||||
"format"
|
|
||||||
msgstr ""
|
|
||||||
"Le format de mélange est « blend/bg_color/fg_color/alpha », « %s » ne "
|
|
||||||
"correspond pas à ce format ."
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1363
|
|
||||||
#, c-format
|
|
||||||
msgid "Could not parse alpha value \"%s\" in blended color"
|
|
||||||
msgstr "Impossible d'analyser la valeur alpha « %s » en couleur mélangée"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1373
|
|
||||||
#, c-format
|
|
||||||
msgid "Alpha value \"%s\" in blended color is not between 0.0 and 1.0"
|
|
||||||
msgstr ""
|
|
||||||
"La valeur alpha « %s » en couleur mélangée n'est pas comprise entre 0,0 et "
|
|
||||||
"1,0"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1419
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Shade format is \"shade/base_color/factor\", \"%s\" does not fit the format"
|
|
||||||
msgstr ""
|
|
||||||
"Le format d'ombre est « shade/base_color/factor », « %s » ne correspond pas "
|
|
||||||
"au format"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1430
|
|
||||||
#, c-format
|
|
||||||
msgid "Could not parse shade factor \"%s\" in shaded color"
|
|
||||||
msgstr "Impossible d'analyser le facteur d'ombre « %s » en couleur ombrée"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1440
|
|
||||||
#, c-format
|
|
||||||
msgid "Shade factor \"%s\" in shaded color is negative"
|
|
||||||
msgstr "Le facteur d'ombre « %s » en couleur ombrée est négatif"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1469
|
|
||||||
#, c-format
|
|
||||||
msgid "Could not parse color \"%s\""
|
|
||||||
msgstr "Impossible d'analyser la couleur « %s »"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1778
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression contains character '%s' which is not allowed"
|
|
||||||
msgstr ""
|
|
||||||
"L'expression de la coordonnée contient le caractère « %s » qui n'est pas "
|
|
||||||
"autorisé"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1805
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Coordinate expression contains floating point number '%s' which could not be "
|
|
||||||
"parsed"
|
|
||||||
msgstr ""
|
|
||||||
"L'expression de la coordonnée contient la valeur en virgule flottante « %s » "
|
|
||||||
"qui ne peut pas être analysée"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1819
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression contains integer '%s' which could not be parsed"
|
|
||||||
msgstr ""
|
|
||||||
"L'expression de la coordonnée contient l'entier « %s » qui n'a pas pu être "
|
|
||||||
"analysé"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1940
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Coordinate expression contained unknown operator at the start of this text: "
|
|
||||||
"\"%s\""
|
|
||||||
msgstr ""
|
|
||||||
"L'expression de la coordonnée contenait un opérateur inconnu au début de ce "
|
|
||||||
"texte : « %s »"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1997
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression was empty or not understood"
|
|
||||||
msgstr "L'expression de la coordonnée était vide ou incomprise"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2110 ../src/ui/theme.c:2120 ../src/ui/theme.c:2154
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression results in division by zero"
|
|
||||||
msgstr "L'expression de la coordonnée entraîne une division par zéro"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2162
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Coordinate expression tries to use mod operator on a floating-point number"
|
|
||||||
msgstr ""
|
|
||||||
"L'expression de la coordonnée tente d'utiliser l'opérateur mod sur une "
|
|
||||||
"valeur en virgule flottante"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2218
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Coordinate expression has an operator \"%s\" where an operand was expected"
|
|
||||||
msgstr ""
|
|
||||||
"L'expression de la coordonnée a un opérateur « %s » là où un opérande était "
|
|
||||||
"attendu"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2227
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression had an operand where an operator was expected"
|
|
||||||
msgstr ""
|
|
||||||
"L'expression de la coordonnée a un opérande là où un opérateur était attendu"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2235
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression ended with an operator instead of an operand"
|
|
||||||
msgstr ""
|
|
||||||
"L'expression de la coordonnée était terminée par un opérateur au lieu d'un "
|
|
||||||
"opérande"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2245
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Coordinate expression has operator \"%c\" following operator \"%c\" with no "
|
|
||||||
"operand in between"
|
|
||||||
msgstr ""
|
|
||||||
"L'expression de la coordonnée a un opérateur « %c » suivant l'opérateur "
|
|
||||||
"« %c » sans opérande entre eux"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2396 ../src/ui/theme.c:2441
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression had unknown variable or constant \"%s\""
|
|
||||||
msgstr ""
|
|
||||||
"L'expression de la coordonnée possède une variable ou constante inconnue "
|
|
||||||
"« %s »"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2495
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression parser overflowed its buffer."
|
|
||||||
msgstr ""
|
|
||||||
"L'analyseur d'expression de coordonnées a dépassé la capacité de son tampon."
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2524
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression had a close parenthesis with no open parenthesis"
|
|
||||||
msgstr ""
|
|
||||||
"L'expression de la coordonnée comporte une parenthèse de fermeture, mais pas "
|
|
||||||
"de parenthèse d'ouverture"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2588
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression had an open parenthesis with no close parenthesis"
|
|
||||||
msgstr ""
|
|
||||||
"L'expression de la coordonnée comporte une parenthèse d'ouverture, mais pas "
|
|
||||||
"de parenthèse de fermeture"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2599
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression doesn't seem to have any operators or operands"
|
|
||||||
msgstr ""
|
|
||||||
"L'expression de la coordonnée ne semble pas comprendre d'opérateur ni "
|
|
||||||
"d'opérande"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2812 ../src/ui/theme.c:2832 ../src/ui/theme.c:2852
|
|
||||||
#, c-format
|
|
||||||
msgid "Theme contained an expression that resulted in an error: %s\n"
|
|
||||||
msgstr "Le thème contient une expression qui a entraîné une erreur : %s\n"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:4455
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"<button function=\"%s\" state=\"%s\" draw_ops=\"whatever\"/> must be "
|
|
||||||
"specified for this frame style"
|
|
||||||
msgstr ""
|
|
||||||
"<button function=\"%s\" state=\"%s\" draw_ops=\"whatever\"/> doit être "
|
|
||||||
"indiqué pour ce style de cadre"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:4970 ../src/ui/theme.c:4995
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Missing <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/>"
|
|
||||||
msgstr ""
|
|
||||||
"<frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/> manquant"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5041
|
|
||||||
#, c-format
|
|
||||||
msgid "Failed to load theme \"%s\": %s\n"
|
|
||||||
msgstr "Impossible de charger le thème « %s » : %s\n"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5177 ../src/ui/theme.c:5184 ../src/ui/theme.c:5191
|
|
||||||
#: ../src/ui/theme.c:5198 ../src/ui/theme.c:5205
|
|
||||||
#, c-format
|
|
||||||
msgid "No <%s> set for theme \"%s\""
|
|
||||||
msgstr "Aucun <%s> défini pour le thème « %s »"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5213
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"No frame style set for window type \"%s\" in theme \"%s\", add a <window "
|
|
||||||
"type=\"%s\" style_set=\"whatever\"/> element"
|
|
||||||
msgstr ""
|
|
||||||
"Aucun style de cadre défini pour le type de fenêtre « %s » dans le thème "
|
|
||||||
"« %s », ajoutez un élément <window type=\"%s\" style_set=\"whatever\"/>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5620 ../src/ui/theme.c:5682 ../src/ui/theme.c:5745
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"User-defined constants must begin with a capital letter; \"%s\" does not"
|
|
||||||
msgstr ""
|
|
||||||
"Les constantes définies par l'utilisateur doivent commencer par une "
|
|
||||||
"majuscule ; « %s » commence par une minuscule"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5628 ../src/ui/theme.c:5690 ../src/ui/theme.c:5753
|
|
||||||
#, c-format
|
|
||||||
msgid "Constant \"%s\" has already been defined"
|
|
||||||
msgstr "La constante « %s » a déjà été définie"
|
|
||||||
|
|
||||||
#. Translators: This means that an attribute which should have been found
|
|
||||||
#. * on an XML element was not in fact found.
|
|
||||||
#.
|
|
||||||
#: ../src/ui/theme-parser.c:234
|
|
||||||
#, c-format
|
|
||||||
msgid "No \"%s\" attribute on element <%s>"
|
|
||||||
msgstr "Aucun attribut « %s » sur l'élément <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:263 ../src/ui/theme-parser.c:281
|
|
||||||
#, c-format
|
|
||||||
msgid "Line %d character %d: %s"
|
|
||||||
msgstr "Ligne %d caractère %d: %s"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:481
|
|
||||||
#, c-format
|
|
||||||
msgid "Attribute \"%s\" repeated twice on the same <%s> element"
|
|
||||||
msgstr "Attribut « %s » répété deux fois sur le même élément <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:505 ../src/ui/theme-parser.c:554
|
|
||||||
#, c-format
|
|
||||||
msgid "Attribute \"%s\" is invalid on <%s> element in this context"
|
|
||||||
msgstr "Attribut « %s » non valide sur l'élément <%s> dans ce contexte"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:596
|
|
||||||
#, c-format
|
|
||||||
msgid "Could not parse \"%s\" as an integer"
|
|
||||||
msgstr "Impossible d'analyser « %s » en tant qu'entier"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:605 ../src/ui/theme-parser.c:660
|
|
||||||
#, c-format
|
|
||||||
msgid "Did not understand trailing characters \"%s\" in string \"%s\""
|
|
||||||
msgstr "Caractères de fin « %s » non compris dans la chaîne « %s »"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:615
|
|
||||||
#, c-format
|
|
||||||
msgid "Integer %ld must be positive"
|
|
||||||
msgstr "L'entier %ld doit être positif"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:623
|
|
||||||
#, c-format
|
|
||||||
msgid "Integer %ld is too large, current max is %d"
|
|
||||||
msgstr "L'entier %ld est trop élevé, le max. actuel est %d"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:651 ../src/ui/theme-parser.c:767
|
|
||||||
#, c-format
|
|
||||||
msgid "Could not parse \"%s\" as a floating point number"
|
|
||||||
msgstr "Impossible d'analyser « %s » en tant que valeur en virgule flottante"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:682 ../src/ui/theme-parser.c:710
|
|
||||||
#, c-format
|
|
||||||
msgid "Boolean values must be \"true\" or \"false\" not \"%s\""
|
|
||||||
msgstr ""
|
|
||||||
"Les valeurs booléennes doivent être « true » ou « false » et non « %s »"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:737
|
|
||||||
#, c-format
|
|
||||||
msgid "Angle must be between 0.0 and 360.0, was %g\n"
|
|
||||||
msgstr "L'angle doit être compris entre 0,0 et 360,0. Il était de %g\n"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:800
|
|
||||||
#, c-format
|
|
||||||
msgid "Alpha must be between 0.0 (invisible) and 1.0 (fully opaque), was %g\n"
|
|
||||||
msgstr ""
|
|
||||||
"La valeur alpha doit être comprise entre 0,0 (invisible) et 1,0 (entièrement "
|
|
||||||
"opaque). Elle était de %g\n"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:865
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Invalid title scale \"%s\" (must be one of xx-small,x-small,small,medium,"
|
|
||||||
"large,x-large,xx-large)\n"
|
|
||||||
msgstr ""
|
|
||||||
"Échelle de titre non valide « %s » (elle doit avoir l'une des valeurs "
|
|
||||||
"suivantes : xx-small, x-small, small, medium,large, x-large, xx-large)\n"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1021 ../src/ui/theme-parser.c:1084
|
|
||||||
#: ../src/ui/theme-parser.c:1118 ../src/ui/theme-parser.c:1221
|
|
||||||
#, c-format
|
|
||||||
msgid "<%s> name \"%s\" used a second time"
|
|
||||||
msgstr "<%s> - nom « %s » utilisé une deuxième fois"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1033 ../src/ui/theme-parser.c:1130
|
|
||||||
#: ../src/ui/theme-parser.c:1233
|
|
||||||
#, c-format
|
|
||||||
msgid "<%s> parent \"%s\" has not been defined"
|
|
||||||
msgstr "<%s> - parent « %s » non défini"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1143
|
|
||||||
#, c-format
|
|
||||||
msgid "<%s> geometry \"%s\" has not been defined"
|
|
||||||
msgstr "<%s> - géométrie « %s » non définie"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1156
|
|
||||||
#, c-format
|
|
||||||
msgid "<%s> must specify either a geometry or a parent that has a geometry"
|
|
||||||
msgstr "<%s> doit indiquer une géométrie ou un parent qui en possède une"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1198
|
|
||||||
msgid "You must specify a background for an alpha value to be meaningful"
|
|
||||||
msgstr ""
|
|
||||||
"Vous devez indiquer un arrière-plan pour qu'une valeur alpha ait du sens."
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1266
|
|
||||||
#, c-format
|
|
||||||
msgid "Unknown type \"%s\" on <%s> element"
|
|
||||||
msgstr "Type inconnu « %s » sur l'élément <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1277
|
|
||||||
#, c-format
|
|
||||||
msgid "Unknown style_set \"%s\" on <%s> element"
|
|
||||||
msgstr "style_set inconnu « %s » sur l'élément <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1285
|
|
||||||
#, c-format
|
|
||||||
msgid "Window type \"%s\" has already been assigned a style set"
|
|
||||||
msgstr "Le type de fenêtre « %s » s'est déjà vu attribuer un jeu de styles"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1315 ../src/ui/theme-parser.c:1379
|
|
||||||
#: ../src/ui/theme-parser.c:1605 ../src/ui/theme-parser.c:2840
|
|
||||||
#: ../src/ui/theme-parser.c:2886 ../src/ui/theme-parser.c:3036
|
|
||||||
#: ../src/ui/theme-parser.c:3272 ../src/ui/theme-parser.c:3310
|
|
||||||
#: ../src/ui/theme-parser.c:3348 ../src/ui/theme-parser.c:3386
|
|
||||||
#, c-format
|
|
||||||
msgid "Element <%s> is not allowed below <%s>"
|
|
||||||
msgstr "L'élément <%s> n'est pas autorisé sous <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1429 ../src/ui/theme-parser.c:1443
|
|
||||||
#: ../src/ui/theme-parser.c:1488
|
|
||||||
msgid ""
|
|
||||||
"Cannot specify both \"button_width\"/\"button_height\" and \"aspect_ratio\" "
|
|
||||||
"for buttons"
|
|
||||||
msgstr ""
|
|
||||||
"Impossible d'indiquer à la fois « button_width » / "
|
|
||||||
"« button_height » (largeur/hauteur) et « aspect_ratio » (proportion) pour "
|
|
||||||
"les boutons"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1452
|
|
||||||
#, c-format
|
|
||||||
msgid "Distance \"%s\" is unknown"
|
|
||||||
msgstr "Distance « %s » inconnue"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1497
|
|
||||||
#, c-format
|
|
||||||
msgid "Aspect ratio \"%s\" is unknown"
|
|
||||||
msgstr "Proportion « %s » inconnue"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1559
|
|
||||||
#, c-format
|
|
||||||
msgid "Border \"%s\" is unknown"
|
|
||||||
msgstr "Bordure « %s » inconnue"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1870
|
|
||||||
#, c-format
|
|
||||||
msgid "No \"start_angle\" or \"from\" attribute on element <%s>"
|
|
||||||
msgstr ""
|
|
||||||
"Aucun attribut « start_angle » (« début d'angle ») ou « from » (« depuis ») "
|
|
||||||
"sur l'élément <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1877
|
|
||||||
#, c-format
|
|
||||||
msgid "No \"extent_angle\" or \"to\" attribute on element <%s>"
|
|
||||||
msgstr ""
|
|
||||||
"Aucun attribut « extent_angle » (« extension d'angle ») ou « to » (« vers ») "
|
|
||||||
"sur l'élément <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2117
|
|
||||||
#, c-format
|
|
||||||
msgid "Did not understand value \"%s\" for type of gradient"
|
|
||||||
msgstr "Impossible de comprendre la valeur « %s » pour le type de dégradé"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2195 ../src/ui/theme-parser.c:2570
|
|
||||||
#, c-format
|
|
||||||
msgid "Did not understand fill type \"%s\" for <%s> element"
|
|
||||||
msgstr ""
|
|
||||||
"Impossible de comprendre le type de remplissage « %s » pour l'élément <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2362 ../src/ui/theme-parser.c:2445
|
|
||||||
#: ../src/ui/theme-parser.c:2508
|
|
||||||
#, c-format
|
|
||||||
msgid "Did not understand state \"%s\" for <%s> element"
|
|
||||||
msgstr "Impossible de comprendre l'état « %s » pour l'élément <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2372 ../src/ui/theme-parser.c:2455
|
|
||||||
#, c-format
|
|
||||||
msgid "Did not understand shadow \"%s\" for <%s> element"
|
|
||||||
msgstr "Impossible de comprendre l'ombre « %s » pour l'élément <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2382
|
|
||||||
#, c-format
|
|
||||||
msgid "Did not understand arrow \"%s\" for <%s> element"
|
|
||||||
msgstr "Impossible de comprendre la flèche « %s » pour l'élément <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2696 ../src/ui/theme-parser.c:2792
|
|
||||||
#, c-format
|
|
||||||
msgid "No <draw_ops> called \"%s\" has been defined"
|
|
||||||
msgstr "Aucun <draw_ops> appelé « %s » n'a été défini"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2708 ../src/ui/theme-parser.c:2804
|
|
||||||
#, c-format
|
|
||||||
msgid "Including draw_ops \"%s\" here would create a circular reference"
|
|
||||||
msgstr "L'inclusion du draw_ops « %s » ici créerait une référence circulaire"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2919
|
|
||||||
#, c-format
|
|
||||||
msgid "Unknown position \"%s\" for frame piece"
|
|
||||||
msgstr "Position inconnue « %s » de la pièce du cadre"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2927
|
|
||||||
#, c-format
|
|
||||||
msgid "Frame style already has a piece at position %s"
|
|
||||||
msgstr "Le style de cadre a déjà une pièce à la position %s"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2944 ../src/ui/theme-parser.c:3021
|
|
||||||
#, c-format
|
|
||||||
msgid "No <draw_ops> with the name \"%s\" has been defined"
|
|
||||||
msgstr "Aucun <draw_ops> avec le nom « %s » n'a été défini"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2974
|
|
||||||
#, c-format
|
|
||||||
msgid "Unknown function \"%s\" for button"
|
|
||||||
msgstr "Fonction inconnue « %s » pour le bouton"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2984
|
|
||||||
#, c-format
|
|
||||||
msgid "Button function \"%s\" does not exist in this version (%d, need %d)"
|
|
||||||
msgstr ""
|
|
||||||
"La fonction « %s » du bouton n'existe pas dans la version (%d, a besoin de "
|
|
||||||
"%d)"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2996
|
|
||||||
#, c-format
|
|
||||||
msgid "Unknown state \"%s\" for button"
|
|
||||||
msgstr "État inconnu « %s » pour le bouton"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3004
|
|
||||||
#, c-format
|
|
||||||
msgid "Frame style already has a button for function %s state %s"
|
|
||||||
msgstr "Le style de cadre a déjà un bouton pour la fonction %s, état %s"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3075
|
|
||||||
#, c-format
|
|
||||||
msgid "\"%s\" is not a valid value for focus attribute"
|
|
||||||
msgstr "« %s » n'est pas une valeur valide pour l'attribut de focus"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3084
|
|
||||||
#, c-format
|
|
||||||
msgid "\"%s\" is not a valid value for state attribute"
|
|
||||||
msgstr "« %s » n'est pas une valeur valide pour l'attribut d'état"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3094
|
|
||||||
#, c-format
|
|
||||||
msgid "A style called \"%s\" has not been defined"
|
|
||||||
msgstr "Aucun style appelé « %s » n'a été défini"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3115 ../src/ui/theme-parser.c:3138
|
|
||||||
#, c-format
|
|
||||||
msgid "\"%s\" is not a valid value for resize attribute"
|
|
||||||
msgstr ""
|
|
||||||
"« %s » n'est pas une valeur valide pour l'attribut de redimensionnement"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3149
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Should not have \"resize\" attribute on <%s> element for maximized/shaded "
|
|
||||||
"states"
|
|
||||||
msgstr ""
|
|
||||||
"L'attribut « resize » (« redimensionnement ») ne devrait pas figurer sur "
|
|
||||||
"l'élément <%s> pour les états maximisé/réduit dans la barre de titre"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3163
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Should not have \"resize\" attribute on <%s> element for maximized states"
|
|
||||||
msgstr ""
|
|
||||||
"L'attribut « resize » (« redimensionnement ») ne devrait pas figurer sur "
|
|
||||||
"l'élément <%s> pour l'état maximisé"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3177 ../src/ui/theme-parser.c:3221
|
|
||||||
#, c-format
|
|
||||||
msgid "Style has already been specified for state %s resize %s focus %s"
|
|
||||||
msgstr ""
|
|
||||||
"Le style a déjà été indiqué pour l'état %s, redimensionnement %s, focus %s"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3188 ../src/ui/theme-parser.c:3199
|
|
||||||
#: ../src/ui/theme-parser.c:3210 ../src/ui/theme-parser.c:3232
|
|
||||||
#: ../src/ui/theme-parser.c:3243 ../src/ui/theme-parser.c:3254
|
|
||||||
#, c-format
|
|
||||||
msgid "Style has already been specified for state %s focus %s"
|
|
||||||
msgstr "Le style a déjà été indiqué pour l'état %s, focus %s"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3293
|
|
||||||
msgid ""
|
|
||||||
"Can't have a two draw_ops for a <piece> element (theme specified a draw_ops "
|
|
||||||
"attribute and also a <draw_ops> element, or specified two elements)"
|
|
||||||
msgstr ""
|
|
||||||
"Impossible d'avoir deux attributs draw_ops pour un élément <piece> (le thème "
|
|
||||||
"indiquait un attribut draw_ops et un élément <draw_ops> ou deux éléments)"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3331
|
|
||||||
msgid ""
|
|
||||||
"Can't have a two draw_ops for a <button> element (theme specified a draw_ops "
|
|
||||||
"attribute and also a <draw_ops> element, or specified two elements)"
|
|
||||||
msgstr ""
|
|
||||||
"Impossible d'avoir deux attributs draw_ops pour un élément <button> (le "
|
|
||||||
"thème indiquait un attribut draw_ops et un élément <draw_ops> ou deux "
|
|
||||||
"éléments)"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3369
|
|
||||||
msgid ""
|
|
||||||
"Can't have a two draw_ops for a <menu_icon> element (theme specified a "
|
|
||||||
"draw_ops attribute and also a <draw_ops> element, or specified two elements)"
|
|
||||||
msgstr ""
|
|
||||||
"Impossible d'avoir deux attributs draw_ops pour un élément <menu_icon> (le "
|
|
||||||
"thème indiquait un attribut draw_ops et un élément <draw_ops> ou deux "
|
|
||||||
"éléments)"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3433
|
|
||||||
#, c-format
|
|
||||||
msgid "Bad version specification '%s'"
|
|
||||||
msgstr "Mauvaise spécification de version « %s »"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3506
|
|
||||||
msgid ""
|
|
||||||
"\"version\" attribute cannot be used in metacity-theme-1.xml or metacity-"
|
|
||||||
"theme-2.xml"
|
|
||||||
msgstr ""
|
|
||||||
"L'attribut « version » ne peut pas être utilisé dans metacity-theme-1.xml or "
|
|
||||||
"metacity-theme-2.xml"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3529
|
|
||||||
#, c-format
|
|
||||||
msgid "Theme requires version %s but latest supported theme version is %d.%d"
|
|
||||||
msgstr ""
|
|
||||||
"Le thème nécessite la version %s mais la version de thème la plus récente "
|
|
||||||
"prise en charge est %d.%d"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3561
|
|
||||||
#, c-format
|
|
||||||
msgid "Outermost element in theme must be <metacity_theme> not <%s>"
|
|
||||||
msgstr ""
|
|
||||||
"L'élément le plus extérieur dans le thème doit être <metacity_theme> et non <"
|
|
||||||
"%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3581
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Element <%s> is not allowed inside a name/author/date/description element"
|
|
||||||
msgstr ""
|
|
||||||
"L'élément <%s> n'est pas autorisé dans un élément name/author/date/"
|
|
||||||
"description"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3586
|
|
||||||
#, c-format
|
|
||||||
msgid "Element <%s> is not allowed inside a <constant> element"
|
|
||||||
msgstr "L'élément <%s> n'est pas autorisé dans un élément <constant>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3598
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Element <%s> is not allowed inside a distance/border/aspect_ratio element"
|
|
||||||
msgstr ""
|
|
||||||
"L'élément <%s> n'est pas autorisé dans un élément distance/border/"
|
|
||||||
"aspect_ratio"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3620
|
|
||||||
#, c-format
|
|
||||||
msgid "Element <%s> is not allowed inside a draw operation element"
|
|
||||||
msgstr ""
|
|
||||||
"L'élément <%s> n'est pas autorisé dans un élément d'opération de dessin"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3630 ../src/ui/theme-parser.c:3660
|
|
||||||
#: ../src/ui/theme-parser.c:3665 ../src/ui/theme-parser.c:3670
|
|
||||||
#, c-format
|
|
||||||
msgid "Element <%s> is not allowed inside a <%s> element"
|
|
||||||
msgstr "L'élément <%s> n'est pas autorisé dans un élément <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3898
|
|
||||||
msgid "No draw_ops provided for frame piece"
|
|
||||||
msgstr "Aucun attribut draw_ops fourni pour la pièce du cadre"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3913
|
|
||||||
msgid "No draw_ops provided for button"
|
|
||||||
msgstr "Aucun attribut draw_ops fourni pour le bouton"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3967
|
|
||||||
#, c-format
|
|
||||||
msgid "No text is allowed inside element <%s>"
|
|
||||||
msgstr "Aucun texte autorisé dans l'élément <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:4025 ../src/ui/theme-parser.c:4037
|
|
||||||
#: ../src/ui/theme-parser.c:4049 ../src/ui/theme-parser.c:4061
|
|
||||||
#: ../src/ui/theme-parser.c:4073
|
|
||||||
#, c-format
|
|
||||||
msgid "<%s> specified twice for this theme"
|
|
||||||
msgstr "<%s> indiqué deux fois pour ce thème"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:4335
|
|
||||||
#, c-format
|
|
||||||
msgid "Failed to find a valid file for theme %s\n"
|
|
||||||
msgstr "Impossible de trouver un fichier valide pour le thème %s\n"
|
|
||||||
|
|
||||||
#: ../src/x11/session.c:1815
|
#: ../src/x11/session.c:1815
|
||||||
msgid ""
|
msgid ""
|
||||||
"These windows do not support "save current setup" and will have to "
|
"These windows do not support "save current setup" and will have to "
|
||||||
@@ -1349,7 +621,7 @@ msgstr ""
|
|||||||
"configuration actuelle » et devront être redémarrées manuellement à la "
|
"configuration actuelle » et devront être redémarrées manuellement à la "
|
||||||
"prochaine connexion."
|
"prochaine connexion."
|
||||||
|
|
||||||
#: ../src/x11/window-props.c:515
|
#: ../src/x11/window-props.c:549
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s (on %s)"
|
msgid "%s (on %s)"
|
||||||
msgstr "%s (sur %s)"
|
msgstr "%s (sur %s)"
|
||||||
|
|||||||
41
po/gl.po
41
po/gl.po
@@ -10,20 +10,21 @@
|
|||||||
# Fran Diéguez <frandieguez@gnome.org>, 2009, 2010, 2011, 2012.
|
# Fran Diéguez <frandieguez@gnome.org>, 2009, 2010, 2011, 2012.
|
||||||
# Leandro Regueiro <leandro.regueiro@gmail.com>, 2012.
|
# Leandro Regueiro <leandro.regueiro@gmail.com>, 2012.
|
||||||
# Fran Dieguez <frandieguez@gnome.org>, 2012, 2013, 2014, 2015.
|
# Fran Dieguez <frandieguez@gnome.org>, 2012, 2013, 2014, 2015.
|
||||||
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: gl\n"
|
"Project-Id-Version: gl\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2015-01-13 00:23+0100\n"
|
"POT-Creation-Date: 2015-02-28 22:43+0100\n"
|
||||||
"PO-Revision-Date: 2015-01-13 00:24+0200\n"
|
"PO-Revision-Date: 2015-02-28 22:42+0100\n"
|
||||||
"Last-Translator: Fran Dieguez <frandieguez@gnome.org>\n"
|
"Last-Translator: Fran Dieguez <frandieguez@gnome.org>\n"
|
||||||
"Language-Team: gnome-l10n-gl@gnome.org\n"
|
"Language-Team: Galician <>\n"
|
||||||
"Language: gl\n"
|
"Language: gl\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
"X-Generator: Virtaal 0.7.1\n"
|
"X-Generator: Gtranslator 2.91.6\n"
|
||||||
|
|
||||||
#: ../data/50-mutter-navigation.xml.in.h:1
|
#: ../data/50-mutter-navigation.xml.in.h:1
|
||||||
msgid "Navigation"
|
msgid "Navigation"
|
||||||
@@ -440,22 +441,42 @@ msgstr "Cambiar á VT 6"
|
|||||||
msgid "Switch to VT 7"
|
msgid "Switch to VT 7"
|
||||||
msgstr "Cambiar á VT 7"
|
msgstr "Cambiar á VT 7"
|
||||||
|
|
||||||
#: ../src/backends/meta-monitor-manager.c:351
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:8
|
||||||
|
msgid "Switch to VT 8"
|
||||||
|
msgstr "Cambiar á VT 8"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:9
|
||||||
|
msgid "Switch to VT 9"
|
||||||
|
msgstr "Cambiar á VT 9"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:10
|
||||||
|
msgid "Switch to VT 10"
|
||||||
|
msgstr "Cambiar á VT 10"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:11
|
||||||
|
msgid "Switch to VT 11"
|
||||||
|
msgstr "Cambiar á VT 11"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:12
|
||||||
|
msgid "Switch to VT 12"
|
||||||
|
msgstr "Cambiar á VT 12"
|
||||||
|
|
||||||
|
#: ../src/backends/meta-monitor-manager.c:364
|
||||||
msgid "Built-in display"
|
msgid "Built-in display"
|
||||||
msgstr "Pantalla embebida"
|
msgstr "Pantalla embebida"
|
||||||
|
|
||||||
#: ../src/backends/meta-monitor-manager.c:378
|
#: ../src/backends/meta-monitor-manager.c:391
|
||||||
msgid "Unknown"
|
msgid "Unknown"
|
||||||
msgstr "Descoñecido"
|
msgstr "Descoñecido"
|
||||||
|
|
||||||
#: ../src/backends/meta-monitor-manager.c:380
|
#: ../src/backends/meta-monitor-manager.c:393
|
||||||
msgid "Unknown Display"
|
msgid "Unknown Display"
|
||||||
msgstr "Pantalla descoñecida"
|
msgstr "Pantalla descoñecida"
|
||||||
|
|
||||||
#. TRANSLATORS: this is a monitor vendor name, followed by a
|
#. TRANSLATORS: this is a monitor vendor name, followed by a
|
||||||
#. * size in inches, like 'Dell 15"'
|
#. * size in inches, like 'Dell 15"'
|
||||||
#.
|
#.
|
||||||
#: ../src/backends/meta-monitor-manager.c:388
|
#: ../src/backends/meta-monitor-manager.c:401
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s %s"
|
msgid "%s %s"
|
||||||
msgstr "%s %s"
|
msgstr "%s %s"
|
||||||
@@ -500,7 +521,7 @@ msgstr "Espe_rar"
|
|||||||
msgid "_Force Quit"
|
msgid "_Force Quit"
|
||||||
msgstr "_Forzar a saída"
|
msgstr "_Forzar a saída"
|
||||||
|
|
||||||
#: ../src/core/display.c:561
|
#: ../src/core/display.c:562
|
||||||
#, 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 "Produciuse un erro ao abrir a visualización do X Window System «%s»\n"
|
msgstr "Produciuse un erro ao abrir a visualización do X Window System «%s»\n"
|
||||||
@@ -591,7 +612,7 @@ msgstr ""
|
|||||||
"Estas xanelas non soportan "save current setup" e terán que "
|
"Estas xanelas non soportan "save current setup" e terán que "
|
||||||
"reiniciarse manualmente a próxima vez que inicie a sesión."
|
"reiniciarse manualmente a próxima vez que inicie a sesión."
|
||||||
|
|
||||||
#: ../src/x11/window-props.c:558
|
#: ../src/x11/window-props.c:549
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s (on %s)"
|
msgid "%s (on %s)"
|
||||||
msgstr "%s (en %s)"
|
msgstr "%s (en %s)"
|
||||||
|
|||||||
764
po/id.po
764
po/id.po
@@ -5,21 +5,21 @@
|
|||||||
# Mohammad DAMT <mdamt@bisnisweb.com>, 2003-2005.
|
# Mohammad DAMT <mdamt@bisnisweb.com>, 2003-2005.
|
||||||
# Ahmad Riza H Nst <rizahnst@eriagempita.co.id>, 2006.
|
# Ahmad Riza H Nst <rizahnst@eriagempita.co.id>, 2006.
|
||||||
# Dirgita <dirgitadevina@yahoo.co.id>, 2011, 2012, 2014.
|
# Dirgita <dirgitadevina@yahoo.co.id>, 2011, 2012, 2014.
|
||||||
# Andika Triwidada <andika@gmail.com>, 2011, 2012, 2013, 2014.
|
# Andika Triwidada <andika@gmail.com>, 2011-2015.
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: mutter master\n"
|
"Project-Id-Version: mutter master\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: 2014-09-01 21:52+0000\n"
|
"POT-Creation-Date: 2015-03-21 11:13+0000\n"
|
||||||
"PO-Revision-Date: 2014-09-03 20:56+0700\n"
|
"PO-Revision-Date: 2015-03-21 19:04+0700\n"
|
||||||
"Last-Translator: Andika Triwidada <andika@gmail.com>\n"
|
"Last-Translator: Andika Triwidada <andika@gmail.com>\n"
|
||||||
"Language-Team: Indonesian <gnome-l10n-id@googlegroups.com>\n"
|
"Language-Team: Indonesian <gnome-l10n-id@googlegroups.com>\n"
|
||||||
"Language: id\n"
|
"Language: id\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Generator: Poedit 1.6.9\n"
|
"X-Generator: Poedit 1.7.1\n"
|
||||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||||
|
|
||||||
#: ../data/50-mutter-navigation.xml.in.h:1
|
#: ../data/50-mutter-navigation.xml.in.h:1
|
||||||
@@ -434,29 +434,49 @@ msgstr "Pindah ke VT 6"
|
|||||||
msgid "Switch to VT 7"
|
msgid "Switch to VT 7"
|
||||||
msgstr "Pindah ke VT 7"
|
msgstr "Pindah ke VT 7"
|
||||||
|
|
||||||
#: ../src/backends/meta-monitor-manager.c:412
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:8
|
||||||
|
msgid "Switch to VT 8"
|
||||||
|
msgstr "Pindah ke VT 8"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:9
|
||||||
|
msgid "Switch to VT 9"
|
||||||
|
msgstr "Pindah ke VT 9"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:10
|
||||||
|
msgid "Switch to VT 10"
|
||||||
|
msgstr "Pindah ke VT 10"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:11
|
||||||
|
msgid "Switch to VT 11"
|
||||||
|
msgstr "Pindah ke VT 11"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:12
|
||||||
|
msgid "Switch to VT 12"
|
||||||
|
msgstr "Pindah ke VT 12"
|
||||||
|
|
||||||
|
#: ../src/backends/meta-monitor-manager.c:364
|
||||||
msgid "Built-in display"
|
msgid "Built-in display"
|
||||||
msgstr "Tampilan bawaan"
|
msgstr "Tampilan bawaan"
|
||||||
|
|
||||||
#: ../src/backends/meta-monitor-manager.c:437
|
#: ../src/backends/meta-monitor-manager.c:391
|
||||||
msgid "Unknown"
|
msgid "Unknown"
|
||||||
msgstr "Tak Dikenal"
|
msgstr "Tak Dikenal"
|
||||||
|
|
||||||
#: ../src/backends/meta-monitor-manager.c:439
|
#: ../src/backends/meta-monitor-manager.c:393
|
||||||
msgid "Unknown Display"
|
msgid "Unknown Display"
|
||||||
msgstr "Tampilan Tak Dikenal"
|
msgstr "Tampilan Tak Dikenal"
|
||||||
|
|
||||||
#. TRANSLATORS: this is a monitor vendor name, followed by a
|
#. TRANSLATORS: this is a monitor vendor name, followed by a
|
||||||
#. * size in inches, like 'Dell 15"'
|
#. * size in inches, like 'Dell 15"'
|
||||||
#.
|
#.
|
||||||
#: ../src/backends/meta-monitor-manager.c:447
|
#: ../src/backends/meta-monitor-manager.c:401
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s %s"
|
msgid "%s %s"
|
||||||
msgstr "%s %s"
|
msgstr "%s %s"
|
||||||
|
|
||||||
#. 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:443
|
#: ../src/compositor/compositor.c:456
|
||||||
#, 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"
|
||||||
@@ -464,10 +484,6 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Manajer komposit lain telah berjalan pada layar %i pada tampilan \"%s\"."
|
"Manajer komposit lain telah berjalan pada layar %i pada tampilan \"%s\"."
|
||||||
|
|
||||||
#: ../src/compositor/meta-background.c:1044
|
|
||||||
msgid "background texture could not be created from file"
|
|
||||||
msgstr "tekstur latar tak bisa dibuat dari berkas"
|
|
||||||
|
|
||||||
#: ../src/core/bell.c:185
|
#: ../src/core/bell.c:185
|
||||||
msgid "Bell event"
|
msgid "Bell event"
|
||||||
msgstr "Bel peristiwa"
|
msgstr "Bel peristiwa"
|
||||||
@@ -496,7 +512,7 @@ msgstr "_Tunggu"
|
|||||||
msgid "_Force Quit"
|
msgid "_Force Quit"
|
||||||
msgstr "_Matikan Paksa"
|
msgstr "_Matikan Paksa"
|
||||||
|
|
||||||
#: ../src/core/display.c:547
|
#: ../src/core/display.c:562
|
||||||
#, 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 "Gagal membuka tampilan X Window System '%s'\n"
|
msgstr "Gagal membuka tampilan X Window System '%s'\n"
|
||||||
@@ -533,17 +549,6 @@ msgstr "Jalankan sebagai kompositor wayland"
|
|||||||
msgid "Run as a full display server, rather than nested"
|
msgid "Run as a full display server, rather than nested"
|
||||||
msgstr "Jalankan sebagai server tampilan penuh, ketimbang tampilan bersarang"
|
msgstr "Jalankan sebagai server tampilan penuh, ketimbang tampilan bersarang"
|
||||||
|
|
||||||
#: ../src/core/main.c:459
|
|
||||||
#, c-format
|
|
||||||
msgid "Failed to scan themes directory: %s\n"
|
|
||||||
msgstr "Gagal memeriksa direktori tema: %s\n"
|
|
||||||
|
|
||||||
#: ../src/core/main.c:475
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Could not find a theme! Be sure %s exists and contains the usual themes.\n"
|
|
||||||
msgstr "Tak menemukan tema! Pastikan %s ada dan berisi tema yang biasa.\n"
|
|
||||||
|
|
||||||
#: ../src/core/mutter.c:39
|
#: ../src/core/mutter.c:39
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -568,714 +573,29 @@ msgstr "Cetak versi"
|
|||||||
msgid "Mutter plugin to use"
|
msgid "Mutter plugin to use"
|
||||||
msgstr "Pengaya Mutter yang dipakai"
|
msgstr "Pengaya Mutter yang dipakai"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:2101
|
#: ../src/core/prefs.c:2004
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Workspace %d"
|
msgid "Workspace %d"
|
||||||
msgstr "Area kerja %d"
|
msgstr "Area kerja %d"
|
||||||
|
|
||||||
#: ../src/core/screen.c:548
|
#: ../src/core/screen.c:525
|
||||||
|
#, c-format
|
||||||
|
msgid ""
|
||||||
|
"Display \"%s\" already has a window manager; try using the --replace option "
|
||||||
|
"to replace the current window manager."
|
||||||
|
msgstr ""
|
||||||
|
"Tampilan \"%s\" sudah memiliki manajer jendela; cobalah gunakan pilihan --"
|
||||||
|
"replace untuk mengganti manajer jendela saat ini."
|
||||||
|
|
||||||
|
#: ../src/core/screen.c:607
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Screen %d on display '%s' is invalid\n"
|
msgid "Screen %d on display '%s' is invalid\n"
|
||||||
msgstr "Layar %d pada tampilan '%s' tidak benar\n"
|
msgstr "Layar %d pada tampilan '%s' tidak benar\n"
|
||||||
|
|
||||||
#: ../src/core/screen.c:564
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Screen %d on display \"%s\" already has a window manager; try using the --"
|
|
||||||
"replace option to replace the current window manager.\n"
|
|
||||||
msgstr ""
|
|
||||||
"Layar %d pada tampilan \"%s\" sudah memiliki pengatur jendela. Cobalah "
|
|
||||||
"gunakan pilihan --replace untuk mengganti pengatur jendela yang aktif.\n"
|
|
||||||
|
|
||||||
#: ../src/core/screen.c:657
|
|
||||||
#, c-format
|
|
||||||
msgid "Screen %d on display \"%s\" already has a window manager\n"
|
|
||||||
msgstr "Layar %d pada tampilan \"%s\" sudah ada pengatur jendelanya\n"
|
|
||||||
|
|
||||||
#: ../src/core/util.c:118
|
#: ../src/core/util.c:118
|
||||||
msgid "Mutter was compiled without support for verbose mode\n"
|
msgid "Mutter was compiled without support for verbose mode\n"
|
||||||
msgstr "Muter dikompilasi tanpa dukungan mode riuh\n"
|
msgstr "Muter dikompilasi tanpa dukungan mode riuh\n"
|
||||||
|
|
||||||
#. Translators: This represents the size of a window. The first number is
|
|
||||||
#. * the width of the window and the second is the height.
|
|
||||||
#.
|
|
||||||
#: ../src/ui/resizepopup.c:134
|
|
||||||
#, c-format
|
|
||||||
msgid "%d x %d"
|
|
||||||
msgstr "%d x %d"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:233
|
|
||||||
msgid "top"
|
|
||||||
msgstr "atas"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:235
|
|
||||||
msgid "bottom"
|
|
||||||
msgstr "bawah"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:237
|
|
||||||
msgid "left"
|
|
||||||
msgstr "kiri"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:239
|
|
||||||
msgid "right"
|
|
||||||
msgstr "kanan"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:267
|
|
||||||
#, c-format
|
|
||||||
msgid "frame geometry does not specify \"%s\" dimension"
|
|
||||||
msgstr "ukuran frame tidak menyebutkan dimensi \"%s\""
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:286
|
|
||||||
#, c-format
|
|
||||||
msgid "frame geometry does not specify dimension \"%s\" for border \"%s\""
|
|
||||||
msgstr "ukuran frame tidak menyebutkan dimensi \"%s\" untuk batas \"%s\""
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:323
|
|
||||||
#, c-format
|
|
||||||
msgid "Button aspect ratio %g is not reasonable"
|
|
||||||
msgstr "Aspek rasio tombol %g tidak wajar"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:335
|
|
||||||
#, c-format
|
|
||||||
msgid "Frame geometry does not specify size of buttons"
|
|
||||||
msgstr "Ukuran frame tidak menyebutkan ukuran tombol"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1061
|
|
||||||
#, c-format
|
|
||||||
msgid "Gradients should have at least two colors"
|
|
||||||
msgstr "Gradien harus paling tidak ada dua warna"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1211
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"GTK custom color specification must have color name and fallback in "
|
|
||||||
"parentheses, e.g. gtk:custom(foo,bar); could not parse \"%s\""
|
|
||||||
msgstr ""
|
|
||||||
"Spesifikasi warna ubahan GTK mesti memiliki nama warna dan cadangan dalam "
|
|
||||||
"kurung, mis. gtk:custom(foo,bar); tak bisa mengurai \"%s\""
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1227
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Invalid character '%c' in color_name parameter of gtk:custom, only A-Za-z0-9-"
|
|
||||||
"_ are valid"
|
|
||||||
msgstr ""
|
|
||||||
"Karakter tak valid '%c' dalam parameter color_name dari gtk:custom, hanya A-"
|
|
||||||
"Za-z0-9-_ yang valid"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1241
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Gtk:custom format is \"gtk:custom(color_name,fallback)\", \"%s\" does not "
|
|
||||||
"fit the format"
|
|
||||||
msgstr ""
|
|
||||||
"Format Gtk:custom adalah \"gtk:custom(color_name,fallback)\", \"%s\" tak "
|
|
||||||
"memenuhi format"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1286
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"GTK color specification must have the state in brackets, e.g. gtk:fg[NORMAL] "
|
|
||||||
"where NORMAL is the state; could not parse \"%s\""
|
|
||||||
msgstr ""
|
|
||||||
"Spesifikasi warna GTK harus memiliki kondisi pada kurung, misal gtk:"
|
|
||||||
"fg[NORMAL] dengan NORMAL adalah jenis kondisinya, tidak dapat membaca \"%s\""
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1300
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"GTK color specification must have a close bracket after the state, e.g. gtk:"
|
|
||||||
"fg[NORMAL] where NORMAL is the state; could not parse \"%s\""
|
|
||||||
msgstr ""
|
|
||||||
"Spesifikasi warna GTK harus memiliki kurung tutup pada kondisinya, misal gtk:"
|
|
||||||
"fg[NORMAL] dengan NORMAL adalah jenis kondisinya, tidak dapat membaca \"%s\""
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1311
|
|
||||||
#, c-format
|
|
||||||
msgid "Did not understand state \"%s\" in color specification"
|
|
||||||
msgstr "Kondisi \"%s\" tidak benar pada spesifikasi warna"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1324
|
|
||||||
#, c-format
|
|
||||||
msgid "Did not understand color component \"%s\" in color specification"
|
|
||||||
msgstr "Komponen warna \"%s\" tidak benar pada spesifikasi warna"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1352
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Blend format is \"blend/bg_color/fg_color/alpha\", \"%s\" does not fit the "
|
|
||||||
"format"
|
|
||||||
msgstr ""
|
|
||||||
"Format pencampuran adalah \"blend/bg_color/fg_color/alpha\", \"%s\" bukan "
|
|
||||||
"ditulis dalam format yang benar"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1363
|
|
||||||
#, c-format
|
|
||||||
msgid "Could not parse alpha value \"%s\" in blended color"
|
|
||||||
msgstr "Tak dapat membaca nilai alpha \"%s\" pada pencampuran warna"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1373
|
|
||||||
#, c-format
|
|
||||||
msgid "Alpha value \"%s\" in blended color is not between 0.0 and 1.0"
|
|
||||||
msgstr ""
|
|
||||||
"Nilai alpha \"%s\" pada warna yang dicampur tidak ada dalam rentang 0.0 dan "
|
|
||||||
"1.0"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1419
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Shade format is \"shade/base_color/factor\", \"%s\" does not fit the format"
|
|
||||||
msgstr ""
|
|
||||||
"Format bayangan adalah \"shade/base_color/factor\", \"%s\" ditulis dalam "
|
|
||||||
"format yang keliru"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1430
|
|
||||||
#, c-format
|
|
||||||
msgid "Could not parse shade factor \"%s\" in shaded color"
|
|
||||||
msgstr "Tak dapat membaca faktor bayangan \"%s\" pada warna berbayang"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1440
|
|
||||||
#, c-format
|
|
||||||
msgid "Shade factor \"%s\" in shaded color is negative"
|
|
||||||
msgstr "Faktor bayangan \"%s\" pada warna berbayang bernilai negatif"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1469
|
|
||||||
#, c-format
|
|
||||||
msgid "Could not parse color \"%s\""
|
|
||||||
msgstr "Tak dapat membaca warna \"%s\""
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1778
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression contains character '%s' which is not allowed"
|
|
||||||
msgstr "Ekspresi koordinat berisi karakter '%s' yang tidak diperbolehkan"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1805
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Coordinate expression contains floating point number '%s' which could not be "
|
|
||||||
"parsed"
|
|
||||||
msgstr ""
|
|
||||||
"Ekspresi koordinat berisi angka floating point '%s' yang tidak dapat dibaca"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1819
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression contains integer '%s' which could not be parsed"
|
|
||||||
msgstr "Ekspresi koordinat berisi integer '%s' yang tidak dapat dibaca"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1940
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Coordinate expression contained unknown operator at the start of this text: "
|
|
||||||
"\"%s\""
|
|
||||||
msgstr ""
|
|
||||||
"Ekspresi koordinat berisi operator tak dikenal pada awal teks berikut: \"%s\""
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1997
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression was empty or not understood"
|
|
||||||
msgstr "Ekspresi koordinat kosong atau tidak dapat dimengerti"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2110 ../src/ui/theme.c:2120 ../src/ui/theme.c:2154
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression results in division by zero"
|
|
||||||
msgstr "Ekspresi koordinat menghasilkan pembagian dengan nol"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2162
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Coordinate expression tries to use mod operator on a floating-point number"
|
|
||||||
msgstr "Ekspresi koordinat menggunakan operator mod pada angka bilangan nyata"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2218
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Coordinate expression has an operator \"%s\" where an operand was expected"
|
|
||||||
msgstr "Ekspresi koordinat menggunakan operator \"%s\" tanpa adanya operan"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2227
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression had an operand where an operator was expected"
|
|
||||||
msgstr "Ekspresi koordinat menggunakan operand tanpa operator"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2235
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression ended with an operator instead of an operand"
|
|
||||||
msgstr ""
|
|
||||||
"Ekspresi koordinat diakhiri dengan operator, seharusnya diakhiri dengan "
|
|
||||||
"operand"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2245
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Coordinate expression has operator \"%c\" following operator \"%c\" with no "
|
|
||||||
"operand in between"
|
|
||||||
msgstr ""
|
|
||||||
"Ekspresi koordinat memiliki operator \"%c\" diikuti operator \"%c\" tanpa "
|
|
||||||
"adanya operand di antarany"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2396 ../src/ui/theme.c:2441
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression had unknown variable or constant \"%s\""
|
|
||||||
msgstr ""
|
|
||||||
"Ada variabel atau konstanta \"%s\" tidak diketahui pada ekspresi koordinat"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2495
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression parser overflowed its buffer."
|
|
||||||
msgstr "Ekspresi koordinat melampaui batasannya."
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2524
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression had a close parenthesis with no open parenthesis"
|
|
||||||
msgstr "Terdapat kurung tutup tanpa kurung buka pada ekspresi koordinat"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2588
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression had an open parenthesis with no close parenthesis"
|
|
||||||
msgstr "Terdapat kurung buka tanpa kurung tutup pada ekspresi koordinat"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2599
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression doesn't seem to have any operators or operands"
|
|
||||||
msgstr "Ekspresi koordinat sepertinya tidak memiliki operator atau operan"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2812 ../src/ui/theme.c:2832 ../src/ui/theme.c:2852
|
|
||||||
#, c-format
|
|
||||||
msgid "Theme contained an expression that resulted in an error: %s\n"
|
|
||||||
msgstr "Tema mengandung ekspresi yang menghasilkan galat: %s\n"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:4455
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"<button function=\"%s\" state=\"%s\" draw_ops=\"whatever\"/> must be "
|
|
||||||
"specified for this frame style"
|
|
||||||
msgstr ""
|
|
||||||
"<button function=\"%s\" state=\"%s\" draw_ops=\"whatever\"/> tidak "
|
|
||||||
"disebutkan pada gaya frame ini"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:4970 ../src/ui/theme.c:4995
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Missing <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/>"
|
|
||||||
msgstr ""
|
|
||||||
"<frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/> tidak ada"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5041
|
|
||||||
#, c-format
|
|
||||||
msgid "Failed to load theme \"%s\": %s\n"
|
|
||||||
msgstr "Gagal membuka tema \"%s\": %s\n"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5177 ../src/ui/theme.c:5184 ../src/ui/theme.c:5191
|
|
||||||
#: ../src/ui/theme.c:5198 ../src/ui/theme.c:5205
|
|
||||||
#, c-format
|
|
||||||
msgid "No <%s> set for theme \"%s\""
|
|
||||||
msgstr "Tak ada <%s> yang ditentukan untuk tema \"%s\""
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5213
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"No frame style set for window type \"%s\" in theme \"%s\", add a <window "
|
|
||||||
"type=\"%s\" style_set=\"whatever\"/> element"
|
|
||||||
msgstr ""
|
|
||||||
"Tak ada gaya frame untuk tipe window \"%s\" pada tema \"%s\". Tambah dulu "
|
|
||||||
"elemen <window type=\"%s\" style_set=\"whatever\"/>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5620 ../src/ui/theme.c:5682 ../src/ui/theme.c:5745
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"User-defined constants must begin with a capital letter; \"%s\" does not"
|
|
||||||
msgstr ""
|
|
||||||
"Konstanta buatan pengguna harus dimulai dengan huruf besar: \"%s\" tidak"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5628 ../src/ui/theme.c:5690 ../src/ui/theme.c:5753
|
|
||||||
#, c-format
|
|
||||||
msgid "Constant \"%s\" has already been defined"
|
|
||||||
msgstr "Konstanta \"%s\" telah didefinisikan sebelumnya"
|
|
||||||
|
|
||||||
#. Translators: This means that an attribute which should have been found
|
|
||||||
#. * on an XML element was not in fact found.
|
|
||||||
#.
|
|
||||||
#: ../src/ui/theme-parser.c:234
|
|
||||||
#, c-format
|
|
||||||
msgid "No \"%s\" attribute on element <%s>"
|
|
||||||
msgstr "Tak ada atribut \"%s\" pada elemen <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:263 ../src/ui/theme-parser.c:281
|
|
||||||
#, c-format
|
|
||||||
msgid "Line %d character %d: %s"
|
|
||||||
msgstr "Baris %d karakter %d: %s"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:481
|
|
||||||
#, c-format
|
|
||||||
msgid "Attribute \"%s\" repeated twice on the same <%s> element"
|
|
||||||
msgstr "Atribut \"%s\" diulangi dua kali pada elemen <%s> yang sama"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:505 ../src/ui/theme-parser.c:554
|
|
||||||
#, c-format
|
|
||||||
msgid "Attribute \"%s\" is invalid on <%s> element in this context"
|
|
||||||
msgstr "Atribut \"%s\" tidak diperkenankan pada elemen <%s> pada konteks ini"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:596
|
|
||||||
#, c-format
|
|
||||||
msgid "Could not parse \"%s\" as an integer"
|
|
||||||
msgstr "Tak dapat menguraikan \"%s\" sebagai integer"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:605 ../src/ui/theme-parser.c:660
|
|
||||||
#, c-format
|
|
||||||
msgid "Did not understand trailing characters \"%s\" in string \"%s\""
|
|
||||||
msgstr "Tak mengerti karakter \"%s\" kenapa ada dibuntut string \"%s\""
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:615
|
|
||||||
#, c-format
|
|
||||||
msgid "Integer %ld must be positive"
|
|
||||||
msgstr "Integer %ld harus bernilai positif"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:623
|
|
||||||
#, c-format
|
|
||||||
msgid "Integer %ld is too large, current max is %d"
|
|
||||||
msgstr "Integer %ld terlalu besar, maksimal %d"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:651 ../src/ui/theme-parser.c:767
|
|
||||||
#, c-format
|
|
||||||
msgid "Could not parse \"%s\" as a floating point number"
|
|
||||||
msgstr "Tak dapat membaca \"%s\" sebagai angka floating point"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:682 ../src/ui/theme-parser.c:710
|
|
||||||
#, c-format
|
|
||||||
msgid "Boolean values must be \"true\" or \"false\" not \"%s\""
|
|
||||||
msgstr "Nilai boolean harus \"true\" atau \"false\" dan bukannya \"%s\""
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:737
|
|
||||||
#, c-format
|
|
||||||
msgid "Angle must be between 0.0 and 360.0, was %g\n"
|
|
||||||
msgstr "Sudut harus ada dalam rentang 0.0 dan 360.0, dalam berkas didapat %g\n"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:800
|
|
||||||
#, c-format
|
|
||||||
msgid "Alpha must be between 0.0 (invisible) and 1.0 (fully opaque), was %g\n"
|
|
||||||
msgstr ""
|
|
||||||
"Alpha harus ada dalam rentang 0.0 (tidak kelihatan) dan 1.0 (nampak semua, "
|
|
||||||
"dalam berkas didapat %g\n"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:865
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Invalid title scale \"%s\" (must be one of xx-small,x-small,small,medium,"
|
|
||||||
"large,x-large,xx-large)\n"
|
|
||||||
msgstr ""
|
|
||||||
"Skala judul \"%s\" tidak benar (harusnya bernilai xx-small, x-small, small, "
|
|
||||||
"medium, large, x-large, xx-large)\n"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1021 ../src/ui/theme-parser.c:1084
|
|
||||||
#: ../src/ui/theme-parser.c:1118 ../src/ui/theme-parser.c:1221
|
|
||||||
#, c-format
|
|
||||||
msgid "<%s> name \"%s\" used a second time"
|
|
||||||
msgstr "Nama <%s> \"%s\" digunakan kedua kali"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1033 ../src/ui/theme-parser.c:1130
|
|
||||||
#: ../src/ui/theme-parser.c:1233
|
|
||||||
#, c-format
|
|
||||||
msgid "<%s> parent \"%s\" has not been defined"
|
|
||||||
msgstr "Induk <%s> \"%s\" belum didefinisikan"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1143
|
|
||||||
#, c-format
|
|
||||||
msgid "<%s> geometry \"%s\" has not been defined"
|
|
||||||
msgstr "Geometri <%s> \"%s\" belum didefinisikan"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1156
|
|
||||||
#, c-format
|
|
||||||
msgid "<%s> must specify either a geometry or a parent that has a geometry"
|
|
||||||
msgstr "<%s> harus menentukan geometri atau induk yang ada geometrinya"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1198
|
|
||||||
msgid "You must specify a background for an alpha value to be meaningful"
|
|
||||||
msgstr ""
|
|
||||||
"Anda mesti menyatakan suatu latar belakang bagi nilai alfa agar berarti"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1266
|
|
||||||
#, c-format
|
|
||||||
msgid "Unknown type \"%s\" on <%s> element"
|
|
||||||
msgstr "Tipe \"%s\" tidak dikenal pada elemen <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1277
|
|
||||||
#, c-format
|
|
||||||
msgid "Unknown style_set \"%s\" on <%s> element"
|
|
||||||
msgstr "style_set \"%s\" tidak dikenali pada elemen <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1285
|
|
||||||
#, c-format
|
|
||||||
msgid "Window type \"%s\" has already been assigned a style set"
|
|
||||||
msgstr "Tipe jendela \"%s\" sudah memiliki set gaya"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1315 ../src/ui/theme-parser.c:1379
|
|
||||||
#: ../src/ui/theme-parser.c:1605 ../src/ui/theme-parser.c:2840
|
|
||||||
#: ../src/ui/theme-parser.c:2886 ../src/ui/theme-parser.c:3036
|
|
||||||
#: ../src/ui/theme-parser.c:3272 ../src/ui/theme-parser.c:3310
|
|
||||||
#: ../src/ui/theme-parser.c:3348 ../src/ui/theme-parser.c:3386
|
|
||||||
#, c-format
|
|
||||||
msgid "Element <%s> is not allowed below <%s>"
|
|
||||||
msgstr "Elemen <%s> tidak diperkenankan ada di bawah <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1429 ../src/ui/theme-parser.c:1443
|
|
||||||
#: ../src/ui/theme-parser.c:1488
|
|
||||||
msgid ""
|
|
||||||
"Cannot specify both \"button_width\"/\"button_height\" and \"aspect_ratio\" "
|
|
||||||
"for buttons"
|
|
||||||
msgstr ""
|
|
||||||
"Tak dapat menyatakan \"button_width\"/\"button_height\" dan \"aspect_ratio\" "
|
|
||||||
"sekaligus untuk tombol"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1452
|
|
||||||
#, c-format
|
|
||||||
msgid "Distance \"%s\" is unknown"
|
|
||||||
msgstr "Jarak \"%s\" tidak dikenal"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1497
|
|
||||||
#, c-format
|
|
||||||
msgid "Aspect ratio \"%s\" is unknown"
|
|
||||||
msgstr "Rasio aspek \"%s\" tidak dikenal"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1559
|
|
||||||
#, c-format
|
|
||||||
msgid "Border \"%s\" is unknown"
|
|
||||||
msgstr "Batas \"%s\" tidak dikenal"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1870
|
|
||||||
#, c-format
|
|
||||||
msgid "No \"start_angle\" or \"from\" attribute on element <%s>"
|
|
||||||
msgstr "Tak ada atribut \"start_angle\" atau \"from\" pada elemen <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1877
|
|
||||||
#, c-format
|
|
||||||
msgid "No \"extent_angle\" or \"to\" attribute on element <%s>"
|
|
||||||
msgstr "Tak ada atribut \"extent_angle\" atau \"to\" pada elemen <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2117
|
|
||||||
#, c-format
|
|
||||||
msgid "Did not understand value \"%s\" for type of gradient"
|
|
||||||
msgstr "Nilai \"%s\" bukan nilai yang sah untuk tipe gradien"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2195 ../src/ui/theme-parser.c:2570
|
|
||||||
#, c-format
|
|
||||||
msgid "Did not understand fill type \"%s\" for <%s> element"
|
|
||||||
msgstr "Tipe isian \"%s\" tidak dikenal untuk elemen <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2362 ../src/ui/theme-parser.c:2445
|
|
||||||
#: ../src/ui/theme-parser.c:2508
|
|
||||||
#, c-format
|
|
||||||
msgid "Did not understand state \"%s\" for <%s> element"
|
|
||||||
msgstr "Kondisi \"%s\" tidak dikenal untuk elemen <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2372 ../src/ui/theme-parser.c:2455
|
|
||||||
#, c-format
|
|
||||||
msgid "Did not understand shadow \"%s\" for <%s> element"
|
|
||||||
msgstr "Bayangan \"%s\" tidak dikenal untuk elemen <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2382
|
|
||||||
#, c-format
|
|
||||||
msgid "Did not understand arrow \"%s\" for <%s> element"
|
|
||||||
msgstr "Panah \"%s\" tidak dikenal untuk elemen <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2696 ../src/ui/theme-parser.c:2792
|
|
||||||
#, c-format
|
|
||||||
msgid "No <draw_ops> called \"%s\" has been defined"
|
|
||||||
msgstr "Tak ada <draw_ops> bernama \"%s\" yang telah didefinisikan"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2708 ../src/ui/theme-parser.c:2804
|
|
||||||
#, c-format
|
|
||||||
msgid "Including draw_ops \"%s\" here would create a circular reference"
|
|
||||||
msgstr ""
|
|
||||||
"Menyertakan draw_ops \"%s\" di sini akan membuat referensi tak berujung"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2919
|
|
||||||
#, c-format
|
|
||||||
msgid "Unknown position \"%s\" for frame piece"
|
|
||||||
msgstr "Posisi \"%s\" tidak dikenal untuk bagian frame"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2927
|
|
||||||
#, c-format
|
|
||||||
msgid "Frame style already has a piece at position %s"
|
|
||||||
msgstr "Gaya frame sudah memiliki bagian pada posisi %s"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2944 ../src/ui/theme-parser.c:3021
|
|
||||||
#, c-format
|
|
||||||
msgid "No <draw_ops> with the name \"%s\" has been defined"
|
|
||||||
msgstr "Tak ada <draw_ops> dengan nama \"%s\" yang didefinisikan"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2974
|
|
||||||
#, c-format
|
|
||||||
msgid "Unknown function \"%s\" for button"
|
|
||||||
msgstr "Fungsi \"%s\" tidak dikenal untuk tombol"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2984
|
|
||||||
#, c-format
|
|
||||||
msgid "Button function \"%s\" does not exist in this version (%d, need %d)"
|
|
||||||
msgstr ""
|
|
||||||
"Tombol fungsi \"%s\" tidak tersedia untuk versi ini (%d, memerlukan %d)"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2996
|
|
||||||
#, c-format
|
|
||||||
msgid "Unknown state \"%s\" for button"
|
|
||||||
msgstr "Kondisi \"%s\" tidak dikenal untuk tombol"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3004
|
|
||||||
#, c-format
|
|
||||||
msgid "Frame style already has a button for function %s state %s"
|
|
||||||
msgstr "Gaya bingkai sudah memiliki tombol untuk fungsi %s kondisi %s"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3075
|
|
||||||
#, c-format
|
|
||||||
msgid "\"%s\" is not a valid value for focus attribute"
|
|
||||||
msgstr "\"%s\" bukan nilai yang benar untuk atribut focus"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3084
|
|
||||||
#, c-format
|
|
||||||
msgid "\"%s\" is not a valid value for state attribute"
|
|
||||||
msgstr "\"%s\" bukan nilai yang benar untuk atribut state"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3094
|
|
||||||
#, c-format
|
|
||||||
msgid "A style called \"%s\" has not been defined"
|
|
||||||
msgstr "Gaya bernama \"%s\" belum didefinisikan"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3115 ../src/ui/theme-parser.c:3138
|
|
||||||
#, c-format
|
|
||||||
msgid "\"%s\" is not a valid value for resize attribute"
|
|
||||||
msgstr "\"%s\" bukan nilai yang benar untuk atribut resize"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3149
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Should not have \"resize\" attribute on <%s> element for maximized/shaded "
|
|
||||||
"states"
|
|
||||||
msgstr ""
|
|
||||||
"Atribut \"resize\" tidak boleh ada pada elemen <%s> untuk kondisi ukuran "
|
|
||||||
"window maksimum/tergulung"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3163
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Should not have \"resize\" attribute on <%s> element for maximized states"
|
|
||||||
msgstr ""
|
|
||||||
"Atribut \"resize\" tidak boleh ada pada elemen <%s> untuk kondisi ukuran "
|
|
||||||
"jendela maksimal"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3177 ../src/ui/theme-parser.c:3221
|
|
||||||
#, c-format
|
|
||||||
msgid "Style has already been specified for state %s resize %s focus %s"
|
|
||||||
msgstr "Gaya sudah menjelaskan kondisi %s resize %s focus %s"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3188 ../src/ui/theme-parser.c:3199
|
|
||||||
#: ../src/ui/theme-parser.c:3210 ../src/ui/theme-parser.c:3232
|
|
||||||
#: ../src/ui/theme-parser.c:3243 ../src/ui/theme-parser.c:3254
|
|
||||||
#, c-format
|
|
||||||
msgid "Style has already been specified for state %s focus %s"
|
|
||||||
msgstr "Gaya sudah menjelaskan kondisi %s focus %s"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3293
|
|
||||||
msgid ""
|
|
||||||
"Can't have a two draw_ops for a <piece> element (theme specified a draw_ops "
|
|
||||||
"attribute and also a <draw_ops> element, or specified two elements)"
|
|
||||||
msgstr ""
|
|
||||||
"Tak boleh ada dua draw_ops untuk elemen <piece> (tema menyebutkan atribut "
|
|
||||||
"draw_ops dan juga elemen <draw_ops> atau meyebutkan dua elemen tersebut "
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3331
|
|
||||||
msgid ""
|
|
||||||
"Can't have a two draw_ops for a <button> element (theme specified a draw_ops "
|
|
||||||
"attribute and also a <draw_ops> element, or specified two elements)"
|
|
||||||
msgstr ""
|
|
||||||
"Tak boleh ada dua draw_ops untuk elemen <button> (tema menyebutkan atribut "
|
|
||||||
"draw_ops dan juga elemen <draw_ops> atau meyebutkan dua elemen tersebut "
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3369
|
|
||||||
msgid ""
|
|
||||||
"Can't have a two draw_ops for a <menu_icon> element (theme specified a "
|
|
||||||
"draw_ops attribute and also a <draw_ops> element, or specified two elements)"
|
|
||||||
msgstr ""
|
|
||||||
"Tak boleh ada dua draw_ops untuk elemen <menu_icon> (tema menyebutkan "
|
|
||||||
"atribut draw_ops dan juga elemen <draw_ops> atau meyebutkan dua elemen "
|
|
||||||
"tersebut "
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3433
|
|
||||||
#, c-format
|
|
||||||
msgid "Bad version specification '%s'"
|
|
||||||
msgstr "Spesifikasi versi '%s' jelek"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3506
|
|
||||||
msgid ""
|
|
||||||
"\"version\" attribute cannot be used in metacity-theme-1.xml or metacity-"
|
|
||||||
"theme-2.xml"
|
|
||||||
msgstr ""
|
|
||||||
"Atribut \"version\" tidak dapat dipakai dalam metacity-theme-1.xml atau "
|
|
||||||
"metacity-theme-2.xml"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3529
|
|
||||||
#, c-format
|
|
||||||
msgid "Theme requires version %s but latest supported theme version is %d.%d"
|
|
||||||
msgstr "Tema memerlukan versi %s tetapi versi yang didukung adalah %d.%d"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3561
|
|
||||||
#, c-format
|
|
||||||
msgid "Outermost element in theme must be <metacity_theme> not <%s>"
|
|
||||||
msgstr "Elemen tema paling luar haruslah <metacity_theme> dan bukan <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3581
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Element <%s> is not allowed inside a name/author/date/description element"
|
|
||||||
msgstr ""
|
|
||||||
"Elemen <%s> tidak diperbolehkan berada elemen name/author/date/description"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3586
|
|
||||||
#, c-format
|
|
||||||
msgid "Element <%s> is not allowed inside a <constant> element"
|
|
||||||
msgstr "Elemen <%s> tidak boleh ada dalam elemen <constat>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3598
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Element <%s> is not allowed inside a distance/border/aspect_ratio element"
|
|
||||||
msgstr ""
|
|
||||||
"Elemen <%s> tidak boleh ada di dalam elemen distance/border/aspec_ratio"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3620
|
|
||||||
#, c-format
|
|
||||||
msgid "Element <%s> is not allowed inside a draw operation element"
|
|
||||||
msgstr "Elemen <%s> tidak boleh ada di dalam elemen operasi gambar"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3630 ../src/ui/theme-parser.c:3660
|
|
||||||
#: ../src/ui/theme-parser.c:3665 ../src/ui/theme-parser.c:3670
|
|
||||||
#, c-format
|
|
||||||
msgid "Element <%s> is not allowed inside a <%s> element"
|
|
||||||
msgstr "Elemen <%s> tidak boleh ada di dalam elemen <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3898
|
|
||||||
msgid "No draw_ops provided for frame piece"
|
|
||||||
msgstr "Tak ada draw_ops yang disediakan untuk bagian frame"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3913
|
|
||||||
msgid "No draw_ops provided for button"
|
|
||||||
msgstr "Tak ada draw_ops yang disediakan untuk tombol"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3967
|
|
||||||
#, c-format
|
|
||||||
msgid "No text is allowed inside element <%s>"
|
|
||||||
msgstr "Tak boleh ada teks di dalam elemen <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:4025 ../src/ui/theme-parser.c:4037
|
|
||||||
#: ../src/ui/theme-parser.c:4049 ../src/ui/theme-parser.c:4061
|
|
||||||
#: ../src/ui/theme-parser.c:4073
|
|
||||||
#, c-format
|
|
||||||
msgid "<%s> specified twice for this theme"
|
|
||||||
msgstr "<%s> disebutkan dua kali pada tema ini"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:4335
|
|
||||||
#, c-format
|
|
||||||
msgid "Failed to find a valid file for theme %s\n"
|
|
||||||
msgstr "Gagal menemukan berkas yang sah untuk tema %s\n"
|
|
||||||
|
|
||||||
#: ../src/x11/session.c:1815
|
#: ../src/x11/session.c:1815
|
||||||
msgid ""
|
msgid ""
|
||||||
"These windows do not support "save current setup" and will have to "
|
"These windows do not support "save current setup" and will have to "
|
||||||
@@ -1284,7 +604,7 @@ msgstr ""
|
|||||||
"Jendela ini tidak bisa "menyimpan setelan aktif saat ini" dan bila "
|
"Jendela ini tidak bisa "menyimpan setelan aktif saat ini" dan bila "
|
||||||
"log masuk kali lain Anda harus menjalankannya ulang."
|
"log masuk kali lain Anda harus menjalankannya ulang."
|
||||||
|
|
||||||
#: ../src/x11/window-props.c:515
|
#: ../src/x11/window-props.c:549
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s (on %s)"
|
msgid "%s (on %s)"
|
||||||
msgstr "%s (pada %s)"
|
msgstr "%s (pada %s)"
|
||||||
|
|||||||
822
po/pl.po
822
po/pl.po
@@ -9,14 +9,14 @@
|
|||||||
# Marek Stępień <marcoos@aviary.pl>, 2007.
|
# Marek Stępień <marcoos@aviary.pl>, 2007.
|
||||||
# Wadim Dziedzic <wdziedzic@aviary.pl>, 2007.
|
# Wadim Dziedzic <wdziedzic@aviary.pl>, 2007.
|
||||||
# Tomasz Dominikowski <dominikowski@gmail.com>, 2008-2009.
|
# Tomasz Dominikowski <dominikowski@gmail.com>, 2008-2009.
|
||||||
# Piotr Drąg <piotrdrag@gmail.com>, 2010-2014.
|
# Piotr Drąg <piotrdrag@gmail.com>, 2010-2015.
|
||||||
# Aviary.pl <gnomepl@aviary.pl>, 2007-2014.
|
# Aviary.pl <gnomepl@aviary.pl>, 2007-2015.
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: mutter\n"
|
"Project-Id-Version: mutter\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2014-09-03 15:55+0200\n"
|
"POT-Creation-Date: 2015-08-26 18:49+0200\n"
|
||||||
"PO-Revision-Date: 2014-09-03 15:58+0200\n"
|
"PO-Revision-Date: 2015-08-26 18:50+0200\n"
|
||||||
"Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
|
"Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
|
||||||
"Language-Team: Polish <gnomepl@aviary.pl>\n"
|
"Language-Team: Polish <gnomepl@aviary.pl>\n"
|
||||||
"Language: pl\n"
|
"Language: pl\n"
|
||||||
@@ -285,9 +285,9 @@ msgid ""
|
|||||||
"\"Windows key\" on PC hardware. It's expected that this binding either the "
|
"\"Windows key\" on PC hardware. It's expected that this binding either the "
|
||||||
"default or set to the empty string."
|
"default or set to the empty string."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Ten klawisz inicjuje tryb \"overlay\", który jest połączeniem podglądu okien "
|
"Ten klawisz inicjuje tryb „overlay”, który jest połączeniem podglądu okien i "
|
||||||
"i systemu uruchamiania programów. Domyślnie jest przeznaczony do powiązania "
|
"systemu uruchamiania programów. Domyślnie jest przeznaczony do powiązania z "
|
||||||
"z klawiszem \"Windows\" na komputerach typu PC. Ustawienie tego powiązania "
|
"klawiszem „Windows” na komputerach typu PC. Ustawienie tego powiązania "
|
||||||
"powinno być domyślne lub puste."
|
"powinno być domyślne lub puste."
|
||||||
|
|
||||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:3
|
#: ../data/org.gnome.mutter.gschema.xml.in.h:3
|
||||||
@@ -300,9 +300,9 @@ msgid ""
|
|||||||
"attached to the titlebar of the parent window and are moved together with "
|
"attached to the titlebar of the parent window and are moved together with "
|
||||||
"the parent window."
|
"the parent window."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Jeśli wynosi \"true\", to modalne okna dialogowe pojawiają się dołączone do "
|
"Jeśli wynosi wartość „true”, to modalne okna dialogowe pojawiają się "
|
||||||
"paska tytułowego okna nadrzędnego zamiast posiadać oddzielne paski tytułowe "
|
"dołączone do paska tytułowego okna nadrzędnego zamiast posiadać oddzielne "
|
||||||
"i są przenoszone razem z nim."
|
"paski tytułowe i są przenoszone razem z nim."
|
||||||
|
|
||||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:5
|
#: ../data/org.gnome.mutter.gschema.xml.in.h:5
|
||||||
msgid "Enable edge tiling when dropping windows on screen edges"
|
msgid "Enable edge tiling when dropping windows on screen edges"
|
||||||
@@ -332,7 +332,7 @@ msgid ""
|
|||||||
"gnome.desktop.wm.preferences)."
|
"gnome.desktop.wm.preferences)."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Określa, czy obszary robocze są zarządzane dynamicznie, czy istnieje "
|
"Określa, czy obszary robocze są zarządzane dynamicznie, czy istnieje "
|
||||||
"statyczna liczba obszarów (określona przez klucz \"num-workspaces\" w org."
|
"statyczna liczba obszarów (określona przez klucz „num-workspaces” w org."
|
||||||
"gnome.desktop.wm.preferences)."
|
"gnome.desktop.wm.preferences)."
|
||||||
|
|
||||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:9
|
#: ../data/org.gnome.mutter.gschema.xml.in.h:9
|
||||||
@@ -369,9 +369,9 @@ msgid ""
|
|||||||
"the focus will not be changed immediately when entering a window, but only "
|
"the focus will not be changed immediately when entering a window, but only "
|
||||||
"after the pointer stops moving."
|
"after the pointer stops moving."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Jeśli jest ustawione na wartość \"true\", a tryb aktywności to \"sloppy\" "
|
"Jeśli jest ustawione na wartość „true”, a tryb aktywności to „sloppy” lub "
|
||||||
"lub \"mouse\", to aktywność nie będzie zmieniana od razu po przejściu do "
|
"„mouse”, to aktywność nie będzie zmieniana od razu po przejściu do okna, ale "
|
||||||
"okna, ale dopiero po zatrzymaniu ruchu kursora."
|
"dopiero po zatrzymaniu ruchu kursora."
|
||||||
|
|
||||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:15
|
#: ../data/org.gnome.mutter.gschema.xml.in.h:15
|
||||||
msgid "Draggable border width"
|
msgid "Draggable border width"
|
||||||
@@ -409,7 +409,7 @@ msgid ""
|
|||||||
"When true, the new windows will always be put in the center of the active "
|
"When true, the new windows will always be put in the center of the active "
|
||||||
"screen of the monitor."
|
"screen of the monitor."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Jeśli wynosi \"true\", to nowe okna będą zawsze umieszczane na środku "
|
"Jeśli wynosi wartość „true”, to nowe okna będą zawsze umieszczane na środku "
|
||||||
"aktywnego ekranu monitora."
|
"aktywnego ekranu monitora."
|
||||||
|
|
||||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:21
|
#: ../data/org.gnome.mutter.gschema.xml.in.h:21
|
||||||
@@ -448,39 +448,55 @@ msgstr "Przełączenie na 6. konsolę wirtualną"
|
|||||||
msgid "Switch to VT 7"
|
msgid "Switch to VT 7"
|
||||||
msgstr "Przełączenie na 7. konsolę wirtualną"
|
msgstr "Przełączenie na 7. konsolę wirtualną"
|
||||||
|
|
||||||
#: ../src/backends/meta-monitor-manager.c:412
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:8
|
||||||
|
msgid "Switch to VT 8"
|
||||||
|
msgstr "Przełączenie na 8. konsolę wirtualną"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:9
|
||||||
|
msgid "Switch to VT 9"
|
||||||
|
msgstr "Przełączenie na 9. konsolę wirtualną"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:10
|
||||||
|
msgid "Switch to VT 10"
|
||||||
|
msgstr "Przełączenie na 10. konsolę wirtualną"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:11
|
||||||
|
msgid "Switch to VT 11"
|
||||||
|
msgstr "Przełączenie na 11. konsolę wirtualną"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:12
|
||||||
|
msgid "Switch to VT 12"
|
||||||
|
msgstr "Przełączenie na 12. konsolę wirtualną"
|
||||||
|
|
||||||
|
#: ../src/backends/meta-monitor-manager.c:500
|
||||||
msgid "Built-in display"
|
msgid "Built-in display"
|
||||||
msgstr "Wbudowany ekran"
|
msgstr "Wbudowany ekran"
|
||||||
|
|
||||||
#: ../src/backends/meta-monitor-manager.c:437
|
#: ../src/backends/meta-monitor-manager.c:526
|
||||||
msgid "Unknown"
|
msgid "Unknown"
|
||||||
msgstr "Nieznany"
|
msgstr "Nieznany"
|
||||||
|
|
||||||
#: ../src/backends/meta-monitor-manager.c:439
|
#: ../src/backends/meta-monitor-manager.c:528
|
||||||
msgid "Unknown Display"
|
msgid "Unknown Display"
|
||||||
msgstr "Nieznany ekran"
|
msgstr "Nieznany ekran"
|
||||||
|
|
||||||
#. TRANSLATORS: this is a monitor vendor name, followed by a
|
#. TRANSLATORS: this is a monitor vendor name, followed by a
|
||||||
#. * size in inches, like 'Dell 15"'
|
#. * size in inches, like 'Dell 15"'
|
||||||
#.
|
#.
|
||||||
#: ../src/backends/meta-monitor-manager.c:447
|
#: ../src/backends/meta-monitor-manager.c:536
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s %s"
|
msgid "%s %s"
|
||||||
msgstr "%s %s"
|
msgstr "%s %s"
|
||||||
|
|
||||||
#. 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:443
|
#: ../src/compositor/compositor.c:456
|
||||||
#, 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 ""
|
||||||
"Inny menedżer składania jest już uruchomiony na podekranie %i ekranu \"%s\"."
|
"Inny menedżer składania jest już uruchomiony na podekranie %i ekranu „%s”."
|
||||||
|
|
||||||
#: ../src/compositor/meta-background.c:1044
|
|
||||||
msgid "background texture could not be created from file"
|
|
||||||
msgstr "nie można utworzyć tekstury tła z pliku"
|
|
||||||
|
|
||||||
#: ../src/core/bell.c:185
|
#: ../src/core/bell.c:185
|
||||||
msgid "Bell event"
|
msgid "Bell event"
|
||||||
@@ -489,7 +505,7 @@ msgstr "Zdarzenie sygnału dźwiękowego"
|
|||||||
#: ../src/core/delete.c:127
|
#: ../src/core/delete.c:127
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "“%s” is not responding."
|
msgid "“%s” is not responding."
|
||||||
msgstr "Okno \"%s\" nie odpowiada."
|
msgstr "Okno „%s” nie odpowiada."
|
||||||
|
|
||||||
#: ../src/core/delete.c:129
|
#: ../src/core/delete.c:129
|
||||||
msgid "Application is not responding."
|
msgid "Application is not responding."
|
||||||
@@ -509,11 +525,10 @@ msgstr "_Czekaj"
|
|||||||
msgid "_Force Quit"
|
msgid "_Force Quit"
|
||||||
msgstr "_Zakończ"
|
msgstr "_Zakończ"
|
||||||
|
|
||||||
#: ../src/core/display.c:547
|
#: ../src/core/display.c:563
|
||||||
#, 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 ""
|
msgstr "Otwarcie połączenia z ekranem „%s” systemu X Window się nie powiodło\n"
|
||||||
"Otwarcie połączenia z ekranem \"%s\" systemu X Window się nie powiodło\n"
|
|
||||||
|
|
||||||
#: ../src/core/main.c:176
|
#: ../src/core/main.c:176
|
||||||
msgid "Disable connection to session manager"
|
msgid "Disable connection to session manager"
|
||||||
@@ -547,19 +562,6 @@ msgstr "Uruchamia jako menedżer składania Wayland"
|
|||||||
msgid "Run as a full display server, rather than nested"
|
msgid "Run as a full display server, rather than nested"
|
||||||
msgstr "Uruchamia pełny serwer wyświetlania zamiast osadzonego"
|
msgstr "Uruchamia pełny serwer wyświetlania zamiast osadzonego"
|
||||||
|
|
||||||
#: ../src/core/main.c:459
|
|
||||||
#, c-format
|
|
||||||
msgid "Failed to scan themes directory: %s\n"
|
|
||||||
msgstr "Przejrzenie katalogu z motywami się nie powiodło: %s\n"
|
|
||||||
|
|
||||||
#: ../src/core/main.c:475
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Could not find a theme! Be sure %s exists and contains the usual themes.\n"
|
|
||||||
msgstr ""
|
|
||||||
"Nie można odnaleźć żadnego motywu. Proszę sprawdzić, czy katalog %s istnieje "
|
|
||||||
"i zawiera standardowe motywy.\n"
|
|
||||||
|
|
||||||
#: ../src/core/mutter.c:39
|
#: ../src/core/mutter.c:39
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -570,7 +572,7 @@ msgid ""
|
|||||||
"PARTICULAR PURPOSE.\n"
|
"PARTICULAR PURPOSE.\n"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"mutter %s\n"
|
"mutter %s\n"
|
||||||
"Copyright (C) 2001-%d Havoc Pennington, Red Hat, Inc., oraz inni\n"
|
"Copyright (C) 2001—%d Havoc Pennington, Red Hat, Inc., oraz inni\n"
|
||||||
"Niniejszy program jest wolnym oprogramowaniem, aby poznać warunki, pod\n"
|
"Niniejszy program jest wolnym oprogramowaniem, aby poznać warunki, pod\n"
|
||||||
"jakimi dopuszczalne jest kopiowanie programu, zajrzyj do jego źródeł.\n"
|
"jakimi dopuszczalne jest kopiowanie programu, zajrzyj do jego źródeł.\n"
|
||||||
"Na program nie udziela się ŻADNYCH GWARANCJI, nawet domyślnej gwarancji\n"
|
"Na program nie udziela się ŻADNYCH GWARANCJI, nawet domyślnej gwarancji\n"
|
||||||
@@ -584,749 +586,39 @@ msgstr "Wyświetla wersję"
|
|||||||
msgid "Mutter plugin to use"
|
msgid "Mutter plugin to use"
|
||||||
msgstr "Używana wtyczka programu Mutter"
|
msgstr "Używana wtyczka programu Mutter"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:2101
|
#: ../src/core/prefs.c:2004
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Workspace %d"
|
msgid "Workspace %d"
|
||||||
msgstr "Obszar roboczy %d"
|
msgstr "Obszar roboczy %d"
|
||||||
|
|
||||||
#: ../src/core/screen.c:548
|
#: ../src/core/screen.c:525
|
||||||
#, c-format
|
|
||||||
msgid "Screen %d on display '%s' is invalid\n"
|
|
||||||
msgstr "Podekran %d ekranu \"%s\" jest nieprawidłowy\n"
|
|
||||||
|
|
||||||
#: ../src/core/screen.c:564
|
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Screen %d on display \"%s\" already has a window manager; try using the --"
|
"Display \"%s\" already has a window manager; try using the --replace option "
|
||||||
"replace option to replace the current window manager.\n"
|
"to replace the current window manager."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Na podekranie %d ekranu \"%s\" działa już menedżer okien. Aby zastąpić "
|
"Na ekranie „%s” działa już menedżer okien. Aby zastąpić działającego "
|
||||||
"działającego menedżera okien, proszę spróbować użyć opcji --replace.\n"
|
"menedżera okien, proszę spróbować użyć opcji --replace."
|
||||||
|
|
||||||
#: ../src/core/screen.c:657
|
#: ../src/core/screen.c:607
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Screen %d on display \"%s\" already has a window manager\n"
|
msgid "Screen %d on display '%s' is invalid\n"
|
||||||
msgstr "Na podekranie %d ekranu \"%s\" działa już menedżer okien\n"
|
msgstr "Podekran %d ekranu „%s” jest nieprawidłowy\n"
|
||||||
|
|
||||||
#: ../src/core/util.c:118
|
#: ../src/core/util.c:118
|
||||||
msgid "Mutter was compiled without support for verbose mode\n"
|
msgid "Mutter was compiled without support for verbose mode\n"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Program Mutter został skompilowany bez obsługi trybu z obszerną informacją\n"
|
"Program Mutter został skompilowany bez obsługi trybu z obszerną informacją\n"
|
||||||
|
|
||||||
#. Translators: This represents the size of a window. The first number is
|
|
||||||
#. * the width of the window and the second is the height.
|
|
||||||
#.
|
|
||||||
#: ../src/ui/resizepopup.c:134
|
|
||||||
#, c-format
|
|
||||||
msgid "%d x %d"
|
|
||||||
msgstr "%d x %d"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:233
|
|
||||||
msgid "top"
|
|
||||||
msgstr "góra"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:235
|
|
||||||
msgid "bottom"
|
|
||||||
msgstr "dół"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:237
|
|
||||||
msgid "left"
|
|
||||||
msgstr "lewa"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:239
|
|
||||||
msgid "right"
|
|
||||||
msgstr "prawa"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:267
|
|
||||||
#, c-format
|
|
||||||
msgid "frame geometry does not specify \"%s\" dimension"
|
|
||||||
msgstr "Rozmiar ramki nie określa wymiaru \"%s\""
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:286
|
|
||||||
#, c-format
|
|
||||||
msgid "frame geometry does not specify dimension \"%s\" for border \"%s\""
|
|
||||||
msgstr "Rozmiar ramki nie określa wymiaru \"%s\" dla krawędzi \"%s\""
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:323
|
|
||||||
#, c-format
|
|
||||||
msgid "Button aspect ratio %g is not reasonable"
|
|
||||||
msgstr ""
|
|
||||||
"Współczynnik proporcji przycisku %g nie mieści się w rozsądnych granicach"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:335
|
|
||||||
#, c-format
|
|
||||||
msgid "Frame geometry does not specify size of buttons"
|
|
||||||
msgstr "Rozmiar ramki nie określa liczby przycisków"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1061
|
|
||||||
#, c-format
|
|
||||||
msgid "Gradients should have at least two colors"
|
|
||||||
msgstr "Gradienty powinny się składać co najmniej z dwóch kolorów"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1211
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"GTK custom color specification must have color name and fallback in "
|
|
||||||
"parentheses, e.g. gtk:custom(foo,bar); could not parse \"%s\""
|
|
||||||
msgstr ""
|
|
||||||
"Własna specyfikacja koloru biblioteki GTK+ musi posiadać nazwę koloru i "
|
|
||||||
"kolor zastępczy w nawiasach, np. gtk:custom(foo,bar); nie można przetworzyć "
|
|
||||||
"\"%s\""
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1227
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Invalid character '%c' in color_name parameter of gtk:custom, only A-Za-z0-9-"
|
|
||||||
"_ are valid"
|
|
||||||
msgstr ""
|
|
||||||
"Nieprawidłowy znak \"%c\" w parametrze nazwa_koloru opcji gtk:custom, tylko "
|
|
||||||
"znaki A-Za-z0-9-_ są prawidłowe"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1241
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Gtk:custom format is \"gtk:custom(color_name,fallback)\", \"%s\" does not "
|
|
||||||
"fit the format"
|
|
||||||
msgstr ""
|
|
||||||
"Formatem Gtk:custom jest \"gtk:custom(nazwa_koloru,kolor_zastępczy)\", \"%s"
|
|
||||||
"\" nie pasuje do formatu"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1286
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"GTK color specification must have the state in brackets, e.g. gtk:fg[NORMAL] "
|
|
||||||
"where NORMAL is the state; could not parse \"%s\""
|
|
||||||
msgstr ""
|
|
||||||
"Specyfikacja koloru biblioteki GTK+ musi zawierać stan w nawiasach "
|
|
||||||
"kwadratowych, np. gtk:fg[NORMAL], gdzie NORMAL jest nazwą stanu; nie można "
|
|
||||||
"przetworzyć \"%s\""
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1300
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"GTK color specification must have a close bracket after the state, e.g. gtk:"
|
|
||||||
"fg[NORMAL] where NORMAL is the state; could not parse \"%s\""
|
|
||||||
msgstr ""
|
|
||||||
"Specyfikacja koloru biblioteki GTK+ musi po nazwie stanu zawierać zamykający "
|
|
||||||
"nawias kwadratowy, np. gtk:fg[NORMAL], gdzie NORMAL jest nazwą stanu; nie "
|
|
||||||
"można przetworzyć \"%s\""
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1311
|
|
||||||
#, c-format
|
|
||||||
msgid "Did not understand state \"%s\" in color specification"
|
|
||||||
msgstr "Niezrozumiały stan \"%s\" w specyfikacji koloru"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1324
|
|
||||||
#, c-format
|
|
||||||
msgid "Did not understand color component \"%s\" in color specification"
|
|
||||||
msgstr "Niezrozumiała definicja koloru \"%s\" w specyfikacji koloru"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1352
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Blend format is \"blend/bg_color/fg_color/alpha\", \"%s\" does not fit the "
|
|
||||||
"format"
|
|
||||||
msgstr ""
|
|
||||||
"Formatem przenikania jest \"blend/bg_color/fg_color/alpha\", \"%s\" nie "
|
|
||||||
"pasuje do formatu"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1363
|
|
||||||
#, c-format
|
|
||||||
msgid "Could not parse alpha value \"%s\" in blended color"
|
|
||||||
msgstr "Nie można przetworzyć wartości alfa \"%s\" w przenikającym kolorze"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1373
|
|
||||||
#, c-format
|
|
||||||
msgid "Alpha value \"%s\" in blended color is not between 0.0 and 1.0"
|
|
||||||
msgstr ""
|
|
||||||
"Wartość alfa \"%s\" w przenikającym kolorze nie zawiera się pomiędzy 0,0 i "
|
|
||||||
"1,0"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1419
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Shade format is \"shade/base_color/factor\", \"%s\" does not fit the format"
|
|
||||||
msgstr ""
|
|
||||||
"Formatem przenikania jest \"shade/base_color/factor\", \"%s\" nie pasuje do "
|
|
||||||
"formatu"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1430
|
|
||||||
#, c-format
|
|
||||||
msgid "Could not parse shade factor \"%s\" in shaded color"
|
|
||||||
msgstr ""
|
|
||||||
"Nie można przetworzyć współczynnika przenikania \"%s\" w przenikającym "
|
|
||||||
"kolorze"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1440
|
|
||||||
#, c-format
|
|
||||||
msgid "Shade factor \"%s\" in shaded color is negative"
|
|
||||||
msgstr "Współczynnik przenikania \"%s\" w przenikającym kolorze jest ujemny"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1469
|
|
||||||
#, c-format
|
|
||||||
msgid "Could not parse color \"%s\""
|
|
||||||
msgstr "Nie można przetworzyć koloru \"%s\""
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1778
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression contains character '%s' which is not allowed"
|
|
||||||
msgstr "Wyrażenie określające współrzędne zawiera niedozwolony znak \"%s\""
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1805
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Coordinate expression contains floating point number '%s' which could not be "
|
|
||||||
"parsed"
|
|
||||||
msgstr ""
|
|
||||||
"Wyrażenie określające współrzędne zawiera liczbę zmiennoprzecinkową \"%s\", "
|
|
||||||
"której nie można przetworzyć"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1819
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression contains integer '%s' which could not be parsed"
|
|
||||||
msgstr ""
|
|
||||||
"Wyrażenie określające współrzędne zawiera liczbę całkowitą \"%s\", której "
|
|
||||||
"nie można przetworzyć"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1940
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Coordinate expression contained unknown operator at the start of this text: "
|
|
||||||
"\"%s\""
|
|
||||||
msgstr ""
|
|
||||||
"Wyrażenie określające współrzędne zawiera nieznany operator na początku "
|
|
||||||
"tekstu: \"%s\""
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1997
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression was empty or not understood"
|
|
||||||
msgstr ""
|
|
||||||
"Wyrażenie określające współrzędne jest puste lub nie można go rozpoznać"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2110 ../src/ui/theme.c:2120 ../src/ui/theme.c:2154
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression results in division by zero"
|
|
||||||
msgstr "Wyrażenie opisujące położenie zawiera dzielenie przez zero"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2162
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Coordinate expression tries to use mod operator on a floating-point number"
|
|
||||||
msgstr ""
|
|
||||||
"Wyrażenie opisujące położenie używa operatora dzielenia modulo z liczbą "
|
|
||||||
"zmiennoprzecinkową"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2218
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Coordinate expression has an operator \"%s\" where an operand was expected"
|
|
||||||
msgstr ""
|
|
||||||
"Wyrażenie opisujące położenie zawiera operator \"%s\" w miejscu, w którym "
|
|
||||||
"oczekiwano operandu"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2227
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression had an operand where an operator was expected"
|
|
||||||
msgstr ""
|
|
||||||
"Wyrażenie opisujące położenie zawiera operand w miejscu, w którym oczekiwano "
|
|
||||||
"operatora"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2235
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression ended with an operator instead of an operand"
|
|
||||||
msgstr "Wyrażenie opisujące położenie kończy się operatorem zamiast operandem"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2245
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Coordinate expression has operator \"%c\" following operator \"%c\" with no "
|
|
||||||
"operand in between"
|
|
||||||
msgstr ""
|
|
||||||
"Wyrażenie opisujące położenie zawiera operator \"%c\" bezpośrednio po "
|
|
||||||
"operatorze \"%c\" bez rozdzielającego ich operandu"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2396 ../src/ui/theme.c:2441
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression had unknown variable or constant \"%s\""
|
|
||||||
msgstr ""
|
|
||||||
"Wyrażenie opisujące położenie zawiera nieznaną zmienną lub stałą \"%s\""
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2495
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression parser overflowed its buffer."
|
|
||||||
msgstr "Parser wyrażeń określających współrzędne przepełnił swój bufor."
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2524
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression had a close parenthesis with no open parenthesis"
|
|
||||||
msgstr ""
|
|
||||||
"Wyrażenie opisujące położenie zawiera nawias zamykający bez odpowiadającego "
|
|
||||||
"mu nawiasu otwierającego"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2588
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression had an open parenthesis with no close parenthesis"
|
|
||||||
msgstr ""
|
|
||||||
"Wyrażenie opisujące położenie zawiera nawias otwierający bez odpowiadającego "
|
|
||||||
"mu nawiasu zamykającego"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2599
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression doesn't seem to have any operators or operands"
|
|
||||||
msgstr ""
|
|
||||||
"Wyrażenie opisujące położenie nie zawiera żadnych operatorów ani operandów"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2812 ../src/ui/theme.c:2832 ../src/ui/theme.c:2852
|
|
||||||
#, c-format
|
|
||||||
msgid "Theme contained an expression that resulted in an error: %s\n"
|
|
||||||
msgstr "Motyw zawiera wyrażenie, przy którego obliczaniu wystąpił błąd: %s\n"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:4455
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"<button function=\"%s\" state=\"%s\" draw_ops=\"whatever\"/> must be "
|
|
||||||
"specified for this frame style"
|
|
||||||
msgstr ""
|
|
||||||
"Przy tym stylu ramki należy podać <button function=\"%s\" state=\"%s\" "
|
|
||||||
"draw_ops=\"cokolwiek\"/>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:4970 ../src/ui/theme.c:4995
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Missing <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/>"
|
|
||||||
msgstr ""
|
|
||||||
"Brak <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"cokolwiek\"/>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5041
|
|
||||||
#, c-format
|
|
||||||
msgid "Failed to load theme \"%s\": %s\n"
|
|
||||||
msgstr "Wczytanie motywu \"%s\" się nie powiodło: %s\n"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5177 ../src/ui/theme.c:5184 ../src/ui/theme.c:5191
|
|
||||||
#: ../src/ui/theme.c:5198 ../src/ui/theme.c:5205
|
|
||||||
#, c-format
|
|
||||||
msgid "No <%s> set for theme \"%s\""
|
|
||||||
msgstr "Nie określono elementu <%s> dla motywu \"%s\""
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5213
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"No frame style set for window type \"%s\" in theme \"%s\", add a <window "
|
|
||||||
"type=\"%s\" style_set=\"whatever\"/> element"
|
|
||||||
msgstr ""
|
|
||||||
"Przy typie okna \"%s\" w motywie \"%s\" nie ustawiono stylu ramki. Należy "
|
|
||||||
"dodać element <window type=\"%s\" style_set=\"cokolwiek\"/>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5620 ../src/ui/theme.c:5682 ../src/ui/theme.c:5745
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"User-defined constants must begin with a capital letter; \"%s\" does not"
|
|
||||||
msgstr ""
|
|
||||||
"Stałe definiowane przez użytkownika powinny rozpoczynać się wielką literą, "
|
|
||||||
"natomiast \"%s\" nie spełnia tego warunku"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5628 ../src/ui/theme.c:5690 ../src/ui/theme.c:5753
|
|
||||||
#, c-format
|
|
||||||
msgid "Constant \"%s\" has already been defined"
|
|
||||||
msgstr "Stała \"%s\" została już określona"
|
|
||||||
|
|
||||||
#. Translators: This means that an attribute which should have been found
|
|
||||||
#. * on an XML element was not in fact found.
|
|
||||||
#.
|
|
||||||
#: ../src/ui/theme-parser.c:234
|
|
||||||
#, c-format
|
|
||||||
msgid "No \"%s\" attribute on element <%s>"
|
|
||||||
msgstr "Brak atrybutu \"%s\" w elemencie <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:263 ../src/ui/theme-parser.c:281
|
|
||||||
#, c-format
|
|
||||||
msgid "Line %d character %d: %s"
|
|
||||||
msgstr "Wiersz %d, znak %d: %s"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:481
|
|
||||||
#, c-format
|
|
||||||
msgid "Attribute \"%s\" repeated twice on the same <%s> element"
|
|
||||||
msgstr "Atrybut \"%s\" wystąpił dwukrotnie wewnątrz jednego elementu <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:505 ../src/ui/theme-parser.c:554
|
|
||||||
#, c-format
|
|
||||||
msgid "Attribute \"%s\" is invalid on <%s> element in this context"
|
|
||||||
msgstr ""
|
|
||||||
"Atrybut \"%s\" jest nieprawidłowy wewnątrz elementu <%s> w tym kontekście"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:596
|
|
||||||
#, c-format
|
|
||||||
msgid "Could not parse \"%s\" as an integer"
|
|
||||||
msgstr "Nie można przetworzyć \"%s\" jako liczby całkowitej"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:605 ../src/ui/theme-parser.c:660
|
|
||||||
#, c-format
|
|
||||||
msgid "Did not understand trailing characters \"%s\" in string \"%s\""
|
|
||||||
msgstr "Nie można rozpoznać końcowych znaków \"%s\" w napisie \"%s\""
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:615
|
|
||||||
#, c-format
|
|
||||||
msgid "Integer %ld must be positive"
|
|
||||||
msgstr "Liczba całkowita %ld musi być dodatnia"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:623
|
|
||||||
#, c-format
|
|
||||||
msgid "Integer %ld is too large, current max is %d"
|
|
||||||
msgstr "Liczba całkowita %ld jest za duża, obecne maksimum to %d"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:651 ../src/ui/theme-parser.c:767
|
|
||||||
#, c-format
|
|
||||||
msgid "Could not parse \"%s\" as a floating point number"
|
|
||||||
msgstr "Napis \"%s\" nie jest zapisem liczby zmiennoprzecinkowej"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:682 ../src/ui/theme-parser.c:710
|
|
||||||
#, c-format
|
|
||||||
msgid "Boolean values must be \"true\" or \"false\" not \"%s\""
|
|
||||||
msgstr "Wartościami logicznymi są \"true\" i \"false\", a nie \"%s\""
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:737
|
|
||||||
#, c-format
|
|
||||||
msgid "Angle must be between 0.0 and 360.0, was %g\n"
|
|
||||||
msgstr "Wartość kąta musi się mieścić pomiędzy 0,0 i 360,0, odczytano %g\n"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:800
|
|
||||||
#, c-format
|
|
||||||
msgid "Alpha must be between 0.0 (invisible) and 1.0 (fully opaque), was %g\n"
|
|
||||||
msgstr ""
|
|
||||||
"Wartość alfa musi się mieścić pomiędzy 0,0 (niewidoczne) i 1,0 (w pełni "
|
|
||||||
"nieprzezroczyste), odczytano %g\n"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:865
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Invalid title scale \"%s\" (must be one of xx-small,x-small,small,medium,"
|
|
||||||
"large,x-large,xx-large)\n"
|
|
||||||
msgstr ""
|
|
||||||
"Nieprawidłowy rozmiar tytułu \"%s\" (musi on być jedną z wartości: xx-small, "
|
|
||||||
"x-small, small, medium, large, x-large, xx-large)\n"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1021 ../src/ui/theme-parser.c:1084
|
|
||||||
#: ../src/ui/theme-parser.c:1118 ../src/ui/theme-parser.c:1221
|
|
||||||
#, c-format
|
|
||||||
msgid "<%s> name \"%s\" used a second time"
|
|
||||||
msgstr "<%s>: użyto nazwy \"%s\" po raz drugi"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1033 ../src/ui/theme-parser.c:1130
|
|
||||||
#: ../src/ui/theme-parser.c:1233
|
|
||||||
#, c-format
|
|
||||||
msgid "<%s> parent \"%s\" has not been defined"
|
|
||||||
msgstr "<%s>: nie określono elementu nadrzędnego o nazwie \"%s\""
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1143
|
|
||||||
#, c-format
|
|
||||||
msgid "<%s> geometry \"%s\" has not been defined"
|
|
||||||
msgstr "<%s>: nie określono geometrii o nazwie \"%s\""
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1156
|
|
||||||
#, c-format
|
|
||||||
msgid "<%s> must specify either a geometry or a parent that has a geometry"
|
|
||||||
msgstr "<%s> musi albo określać geometrię, albo element nadrzędny z geometrią"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1198
|
|
||||||
msgid "You must specify a background for an alpha value to be meaningful"
|
|
||||||
msgstr "Aby wartość alfa miała sens, należy określić tło"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1266
|
|
||||||
#, c-format
|
|
||||||
msgid "Unknown type \"%s\" on <%s> element"
|
|
||||||
msgstr "Nieznany typ \"%s\" wewnątrz elementu <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1277
|
|
||||||
#, c-format
|
|
||||||
msgid "Unknown style_set \"%s\" on <%s> element"
|
|
||||||
msgstr "Nieznana wartość atrybutu \"style_set\" (%s) wewnątrz elementu <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1285
|
|
||||||
#, c-format
|
|
||||||
msgid "Window type \"%s\" has already been assigned a style set"
|
|
||||||
msgstr "Z typem okna \"%s\" powiązano już zbiór stylów"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1315 ../src/ui/theme-parser.c:1379
|
|
||||||
#: ../src/ui/theme-parser.c:1605 ../src/ui/theme-parser.c:2840
|
|
||||||
#: ../src/ui/theme-parser.c:2886 ../src/ui/theme-parser.c:3036
|
|
||||||
#: ../src/ui/theme-parser.c:3272 ../src/ui/theme-parser.c:3310
|
|
||||||
#: ../src/ui/theme-parser.c:3348 ../src/ui/theme-parser.c:3386
|
|
||||||
#, c-format
|
|
||||||
msgid "Element <%s> is not allowed below <%s>"
|
|
||||||
msgstr "Element <%s> nie jest dopuszczalny poniżej <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1429 ../src/ui/theme-parser.c:1443
|
|
||||||
#: ../src/ui/theme-parser.c:1488
|
|
||||||
msgid ""
|
|
||||||
"Cannot specify both \"button_width\"/\"button_height\" and \"aspect_ratio\" "
|
|
||||||
"for buttons"
|
|
||||||
msgstr ""
|
|
||||||
"Nie można jednocześnie określać dla przycisku jego szerokości i wysokości "
|
|
||||||
"oraz współczynnika proporcji"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1452
|
|
||||||
#, c-format
|
|
||||||
msgid "Distance \"%s\" is unknown"
|
|
||||||
msgstr "Odległość \"%s\" jest nieznana"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1497
|
|
||||||
#, c-format
|
|
||||||
msgid "Aspect ratio \"%s\" is unknown"
|
|
||||||
msgstr "Współczynnik proporcji \"%s\" jest nieznany"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1559
|
|
||||||
#, c-format
|
|
||||||
msgid "Border \"%s\" is unknown"
|
|
||||||
msgstr "Krawędź \"%s\" jest nieznana"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1870
|
|
||||||
#, c-format
|
|
||||||
msgid "No \"start_angle\" or \"from\" attribute on element <%s>"
|
|
||||||
msgstr "Brak atrybutu \"start_angle\" wewnątrz elementu <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1877
|
|
||||||
#, c-format
|
|
||||||
msgid "No \"extent_angle\" or \"to\" attribute on element <%s>"
|
|
||||||
msgstr "Brak atrybutu \"extent_angle\" wewnątrz elementu <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2117
|
|
||||||
#, c-format
|
|
||||||
msgid "Did not understand value \"%s\" for type of gradient"
|
|
||||||
msgstr "Niezrozumiała wartość \"%s\" typu gradientu"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2195 ../src/ui/theme-parser.c:2570
|
|
||||||
#, c-format
|
|
||||||
msgid "Did not understand fill type \"%s\" for <%s> element"
|
|
||||||
msgstr "Niezrozumiały typ wypełnienia \"%s\" elementu <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2362 ../src/ui/theme-parser.c:2445
|
|
||||||
#: ../src/ui/theme-parser.c:2508
|
|
||||||
#, c-format
|
|
||||||
msgid "Did not understand state \"%s\" for <%s> element"
|
|
||||||
msgstr "Niezrozumiały stan \"%s\" (atrybut \"state\") elementu <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2372 ../src/ui/theme-parser.c:2455
|
|
||||||
#, c-format
|
|
||||||
msgid "Did not understand shadow \"%s\" for <%s> element"
|
|
||||||
msgstr "Niezrozumiały cień \"%s\" (atrybut \"shadow\") elementu <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2382
|
|
||||||
#, c-format
|
|
||||||
msgid "Did not understand arrow \"%s\" for <%s> element"
|
|
||||||
msgstr "Niezrozumiała strzałka \"%s\" (atrybut \"arrow\") elementu <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2696 ../src/ui/theme-parser.c:2792
|
|
||||||
#, c-format
|
|
||||||
msgid "No <draw_ops> called \"%s\" has been defined"
|
|
||||||
msgstr "Nie określono elementu <draw_ops> o nazwie \"%s\""
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2708 ../src/ui/theme-parser.c:2804
|
|
||||||
#, c-format
|
|
||||||
msgid "Including draw_ops \"%s\" here would create a circular reference"
|
|
||||||
msgstr ""
|
|
||||||
"Włączenie tutaj elementu \"draw_ops\" o nazwie \"%s\" spowodowałoby "
|
|
||||||
"zapętlone odwołanie"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2919
|
|
||||||
#, c-format
|
|
||||||
msgid "Unknown position \"%s\" for frame piece"
|
|
||||||
msgstr "Nieznane położenie \"%s\" elementu ramki"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2927
|
|
||||||
#, c-format
|
|
||||||
msgid "Frame style already has a piece at position %s"
|
|
||||||
msgstr "Styl ramki zawiera już element o położeniu %s"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2944 ../src/ui/theme-parser.c:3021
|
|
||||||
#, c-format
|
|
||||||
msgid "No <draw_ops> with the name \"%s\" has been defined"
|
|
||||||
msgstr "Nie określono elementu <draw_ops> o nazwie \"%s\""
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2974
|
|
||||||
#, c-format
|
|
||||||
msgid "Unknown function \"%s\" for button"
|
|
||||||
msgstr "Nieznana funkcja \"%s\" powiązana z przyciskiem"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2984
|
|
||||||
#, c-format
|
|
||||||
msgid "Button function \"%s\" does not exist in this version (%d, need %d)"
|
|
||||||
msgstr "Funkcja \"%s\" przycisku nie istnieje w tej wersji (%d, wymaga %d)"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2996
|
|
||||||
#, c-format
|
|
||||||
msgid "Unknown state \"%s\" for button"
|
|
||||||
msgstr "Nieznany stan \"%s\" powiązany z przyciskiem"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3004
|
|
||||||
#, c-format
|
|
||||||
msgid "Frame style already has a button for function %s state %s"
|
|
||||||
msgstr ""
|
|
||||||
"Dla stylu ramki określono już przycisk, związany z funkcją %s i stanem %s"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3075
|
|
||||||
#, c-format
|
|
||||||
msgid "\"%s\" is not a valid value for focus attribute"
|
|
||||||
msgstr "\"%s\" nie jest prawidłową wartością atrybutu \"focus\""
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3084
|
|
||||||
#, c-format
|
|
||||||
msgid "\"%s\" is not a valid value for state attribute"
|
|
||||||
msgstr "\"%s\" nie jest prawidłową wartością atrybutu \"state\""
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3094
|
|
||||||
#, c-format
|
|
||||||
msgid "A style called \"%s\" has not been defined"
|
|
||||||
msgstr "Nie określono stylu o nazwie \"%s\""
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3115 ../src/ui/theme-parser.c:3138
|
|
||||||
#, c-format
|
|
||||||
msgid "\"%s\" is not a valid value for resize attribute"
|
|
||||||
msgstr "\"%s\" nie jest prawidłową wartością atrybutu \"resize\""
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3149
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Should not have \"resize\" attribute on <%s> element for maximized/shaded "
|
|
||||||
"states"
|
|
||||||
msgstr ""
|
|
||||||
"Element <%s> nie powinien zawierać atrybutu \"resize\" przy stanie "
|
|
||||||
"zmaksymalizowanym lub zwiniętym"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3163
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Should not have \"resize\" attribute on <%s> element for maximized states"
|
|
||||||
msgstr ""
|
|
||||||
"Element <%s> nie powinien zawierać atrybutu \"resize\" przy stanie "
|
|
||||||
"zmaksymalizowanym"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3177 ../src/ui/theme-parser.c:3221
|
|
||||||
#, c-format
|
|
||||||
msgid "Style has already been specified for state %s resize %s focus %s"
|
|
||||||
msgstr "Określono już styl dla stanu %s, rozmiaru %s i uaktywnienia %s"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3188 ../src/ui/theme-parser.c:3199
|
|
||||||
#: ../src/ui/theme-parser.c:3210 ../src/ui/theme-parser.c:3232
|
|
||||||
#: ../src/ui/theme-parser.c:3243 ../src/ui/theme-parser.c:3254
|
|
||||||
#, c-format
|
|
||||||
msgid "Style has already been specified for state %s focus %s"
|
|
||||||
msgstr "Określono już styl dla stanu %s i uaktywnienia %s"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3293
|
|
||||||
msgid ""
|
|
||||||
"Can't have a two draw_ops for a <piece> element (theme specified a draw_ops "
|
|
||||||
"attribute and also a <draw_ops> element, or specified two elements)"
|
|
||||||
msgstr ""
|
|
||||||
"Element <piece> nie może zawierać dwóch \"draw_ops\" (motyw zawiera atrybut "
|
|
||||||
"\"draw_ops\" i element <draw_ops> lub dwa elementy)"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3331
|
|
||||||
msgid ""
|
|
||||||
"Can't have a two draw_ops for a <button> element (theme specified a draw_ops "
|
|
||||||
"attribute and also a <draw_ops> element, or specified two elements)"
|
|
||||||
msgstr ""
|
|
||||||
"Element <button> nie może zawierać dwóch \"draw_ops\" (motyw zawiera atrybut "
|
|
||||||
"\"draw_ops\" i element <draw_ops> lub dwa elementy)"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3369
|
|
||||||
msgid ""
|
|
||||||
"Can't have a two draw_ops for a <menu_icon> element (theme specified a "
|
|
||||||
"draw_ops attribute and also a <draw_ops> element, or specified two elements)"
|
|
||||||
msgstr ""
|
|
||||||
"Element <menu_icon> nie może zawierać dwóch \"draw_ops\" (motyw zawiera "
|
|
||||||
"atrybut \"draw_ops\" i element <draw_ops> lub dwa elementy)"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3433
|
|
||||||
#, c-format
|
|
||||||
msgid "Bad version specification '%s'"
|
|
||||||
msgstr "Błędne określenie wersji \"%s\""
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3506
|
|
||||||
msgid ""
|
|
||||||
"\"version\" attribute cannot be used in metacity-theme-1.xml or metacity-"
|
|
||||||
"theme-2.xml"
|
|
||||||
msgstr ""
|
|
||||||
"Atrybut \"version\" nie może być używany w plikach metacity-theme-1.xml lub "
|
|
||||||
"metacity-theme-2.xml"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3529
|
|
||||||
#, c-format
|
|
||||||
msgid "Theme requires version %s but latest supported theme version is %d.%d"
|
|
||||||
msgstr ""
|
|
||||||
"Motyw wymaga wersji %s, ale najnowsza obsługiwana wersja motywów to %d.%d"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3561
|
|
||||||
#, c-format
|
|
||||||
msgid "Outermost element in theme must be <metacity_theme> not <%s>"
|
|
||||||
msgstr "Głównym elementem motywu musi być <metacity_theme>, nie <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3581
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Element <%s> is not allowed inside a name/author/date/description element"
|
|
||||||
msgstr ""
|
|
||||||
"Element <%s> nie jest dopuszczalny wewnątrz elementu name/author/date/"
|
|
||||||
"description"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3586
|
|
||||||
#, c-format
|
|
||||||
msgid "Element <%s> is not allowed inside a <constant> element"
|
|
||||||
msgstr "Element <%s> nie jest dopuszczalny wewnątrz elementu <constant>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3598
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Element <%s> is not allowed inside a distance/border/aspect_ratio element"
|
|
||||||
msgstr ""
|
|
||||||
"Element <%s> nie jest dopuszczalny wewnątrz elementu distance/border/"
|
|
||||||
"aspect_ratio"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3620
|
|
||||||
#, c-format
|
|
||||||
msgid "Element <%s> is not allowed inside a draw operation element"
|
|
||||||
msgstr ""
|
|
||||||
"Element <%s> nie jest dopuszczalny wewnątrz elementu działania rysowania"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3630 ../src/ui/theme-parser.c:3660
|
|
||||||
#: ../src/ui/theme-parser.c:3665 ../src/ui/theme-parser.c:3670
|
|
||||||
#, c-format
|
|
||||||
msgid "Element <%s> is not allowed inside a <%s> element"
|
|
||||||
msgstr "Element <%s> nie jest dopuszczalny wewnątrz elementu <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3898
|
|
||||||
msgid "No draw_ops provided for frame piece"
|
|
||||||
msgstr "Brak elementu \"draw_ops\" powiązanego z elementem ramki"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3913
|
|
||||||
msgid "No draw_ops provided for button"
|
|
||||||
msgstr "Brak elementu \"draw_ops\" powiązanego z przyciskiem"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3967
|
|
||||||
#, c-format
|
|
||||||
msgid "No text is allowed inside element <%s>"
|
|
||||||
msgstr "Wewnątrz elementu <%s> nie jest dopuszczalny tekst"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:4025 ../src/ui/theme-parser.c:4037
|
|
||||||
#: ../src/ui/theme-parser.c:4049 ../src/ui/theme-parser.c:4061
|
|
||||||
#: ../src/ui/theme-parser.c:4073
|
|
||||||
#, c-format
|
|
||||||
msgid "<%s> specified twice for this theme"
|
|
||||||
msgstr "<%s> określono dwukrotnie dla tego motywu"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:4335
|
|
||||||
#, c-format
|
|
||||||
msgid "Failed to find a valid file for theme %s\n"
|
|
||||||
msgstr "Odnalezienie prawidłowego pliku dla motywu %s się nie powiodło\n"
|
|
||||||
|
|
||||||
#: ../src/x11/session.c:1815
|
#: ../src/x11/session.c:1815
|
||||||
msgid ""
|
msgid ""
|
||||||
"These windows do not support "save current setup" and will have to "
|
"These windows do not support "save current setup" and will have to "
|
||||||
"be restarted manually next time you log in."
|
"be restarted manually next time you log in."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Te okna nie obsługują opcji zapisu aktualnego stanu (\"save current setup"
|
"Te okna nie obsługują opcji zapisu obecnego stanu („save current setup”), "
|
||||||
"\"), więc przy następnym zalogowaniu będą musiały zostać uruchomione ręcznie."
|
"więc przy następnym zalogowaniu będą musiały zostać uruchomione ręcznie."
|
||||||
|
|
||||||
#: ../src/x11/window-props.c:515
|
#: ../src/x11/window-props.c:549
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s (on %s)"
|
msgid "%s (on %s)"
|
||||||
msgstr "%s (na %s)"
|
msgstr "%s (na %s)"
|
||||||
|
|||||||
38
po/pt_BR.po
38
po/pt_BR.po
@@ -21,8 +21,8 @@ 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: 2015-01-08 22:56+0000\n"
|
"POT-Creation-Date: 2015-02-26 11:24+0000\n"
|
||||||
"PO-Revision-Date: 2015-01-08 23:54-0300\n"
|
"PO-Revision-Date: 2015-02-26 17:36-0300\n"
|
||||||
"Last-Translator: Rafael Ferreira <rafael.f.f1@gmail.com>\n"
|
"Last-Translator: Rafael Ferreira <rafael.f.f1@gmail.com>\n"
|
||||||
"Language-Team: Brazilian Portuguese <gnome-pt_br-list@gnome.org>\n"
|
"Language-Team: Brazilian Portuguese <gnome-pt_br-list@gnome.org>\n"
|
||||||
"Language: pt_BR\n"
|
"Language: pt_BR\n"
|
||||||
@@ -30,7 +30,7 @@ msgstr ""
|
|||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||||
"X-Generator: Poedit 1.7.1\n"
|
"X-Generator: Poedit 1.7.4\n"
|
||||||
|
|
||||||
#: ../data/50-mutter-navigation.xml.in.h:1
|
#: ../data/50-mutter-navigation.xml.in.h:1
|
||||||
msgid "Navigation"
|
msgid "Navigation"
|
||||||
@@ -452,22 +452,42 @@ msgstr "Trocar para o VT 6"
|
|||||||
msgid "Switch to VT 7"
|
msgid "Switch to VT 7"
|
||||||
msgstr "Trocar para o VT 7"
|
msgstr "Trocar para o VT 7"
|
||||||
|
|
||||||
#: ../src/backends/meta-monitor-manager.c:351
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:8
|
||||||
|
msgid "Switch to VT 8"
|
||||||
|
msgstr "Trocar para o VT 8"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:9
|
||||||
|
msgid "Switch to VT 9"
|
||||||
|
msgstr "Trocar para o VT 9"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:10
|
||||||
|
msgid "Switch to VT 10"
|
||||||
|
msgstr "Trocar para o VT 10"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:11
|
||||||
|
msgid "Switch to VT 11"
|
||||||
|
msgstr "Trocar para o VT 11"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:12
|
||||||
|
msgid "Switch to VT 12"
|
||||||
|
msgstr "Trocar para o VT 12"
|
||||||
|
|
||||||
|
#: ../src/backends/meta-monitor-manager.c:364
|
||||||
msgid "Built-in display"
|
msgid "Built-in display"
|
||||||
msgstr "Tela embutida"
|
msgstr "Tela embutida"
|
||||||
|
|
||||||
#: ../src/backends/meta-monitor-manager.c:378
|
#: ../src/backends/meta-monitor-manager.c:391
|
||||||
msgid "Unknown"
|
msgid "Unknown"
|
||||||
msgstr "Desconhecido"
|
msgstr "Desconhecido"
|
||||||
|
|
||||||
#: ../src/backends/meta-monitor-manager.c:380
|
#: ../src/backends/meta-monitor-manager.c:393
|
||||||
msgid "Unknown Display"
|
msgid "Unknown Display"
|
||||||
msgstr "Monitor desconhecido"
|
msgstr "Monitor desconhecido"
|
||||||
|
|
||||||
#. TRANSLATORS: this is a monitor vendor name, followed by a
|
#. TRANSLATORS: this is a monitor vendor name, followed by a
|
||||||
#. * size in inches, like 'Dell 15"'
|
#. * size in inches, like 'Dell 15"'
|
||||||
#.
|
#.
|
||||||
#: ../src/backends/meta-monitor-manager.c:388
|
#: ../src/backends/meta-monitor-manager.c:401
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s %s"
|
msgid "%s %s"
|
||||||
msgstr "%s de %s"
|
msgstr "%s de %s"
|
||||||
@@ -511,7 +531,7 @@ msgstr "_Esperar"
|
|||||||
msgid "_Force Quit"
|
msgid "_Force Quit"
|
||||||
msgstr "_Forçar sair"
|
msgstr "_Forçar sair"
|
||||||
|
|
||||||
#: ../src/core/display.c:561
|
#: ../src/core/display.c:562
|
||||||
#, 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 "Falha ao abrir a exibição \"%s\" do sistema de janelas X\n"
|
msgstr "Falha ao abrir a exibição \"%s\" do sistema de janelas X\n"
|
||||||
@@ -604,7 +624,7 @@ msgstr ""
|
|||||||
"atual" e precisarão ser reiniciadas manualmente quando você reiniciar a "
|
"atual" e precisarão ser reiniciadas manualmente quando você reiniciar a "
|
||||||
"sessão."
|
"sessão."
|
||||||
|
|
||||||
#: ../src/x11/window-props.c:558
|
#: ../src/x11/window-props.c:549
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s (on %s)"
|
msgid "%s (on %s)"
|
||||||
msgstr "%s (em %s)"
|
msgstr "%s (em %s)"
|
||||||
|
|||||||
782
po/sl.po
782
po/sl.po
@@ -4,15 +4,15 @@
|
|||||||
#
|
#
|
||||||
# Andraž Tori <andraz.tori1@guest.arnes.si>, 2000.
|
# Andraž Tori <andraz.tori1@guest.arnes.si>, 2000.
|
||||||
# Matjaž Horvat <m@owca.info>, 2006.
|
# Matjaž Horvat <m@owca.info>, 2006.
|
||||||
# Matej Urbančič <mateju@svn.gnome.org>, 2007-2014.
|
# Matej Urbančič <mateju@svn.gnome.org>, 2007-2015.
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: mutter master\n"
|
"Project-Id-Version: mutter master\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: 2014-12-26 10:55+0000\n"
|
"POT-Creation-Date: 2015-03-15 11:07+0000\n"
|
||||||
"PO-Revision-Date: 2014-12-26 19:24+0100\n"
|
"PO-Revision-Date: 2015-03-15 14:36+0100\n"
|
||||||
"Last-Translator: Matej Urbančič <mateju@svn.gnome.org>\n"
|
"Last-Translator: Matej Urbančič <mateju@svn.gnome.org>\n"
|
||||||
"Language-Team: Slovenian GNOME Translation Team <gnome-si@googlegroups.com>\n"
|
"Language-Team: Slovenian GNOME Translation Team <gnome-si@googlegroups.com>\n"
|
||||||
"Language: sl_SI\n"
|
"Language: sl_SI\n"
|
||||||
@@ -435,22 +435,42 @@ msgstr "Preklopi na VT 6"
|
|||||||
msgid "Switch to VT 7"
|
msgid "Switch to VT 7"
|
||||||
msgstr "Preklopi na VT 7"
|
msgstr "Preklopi na VT 7"
|
||||||
|
|
||||||
#: ../src/backends/meta-monitor-manager.c:375
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:8
|
||||||
|
msgid "Switch to VT 8"
|
||||||
|
msgstr "Preklopi na VT 8"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:9
|
||||||
|
msgid "Switch to VT 9"
|
||||||
|
msgstr "Preklopi na VT 9"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:10
|
||||||
|
msgid "Switch to VT 10"
|
||||||
|
msgstr "Preklopi na VT 10"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:11
|
||||||
|
msgid "Switch to VT 11"
|
||||||
|
msgstr "Preklopi na VT 11"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:12
|
||||||
|
msgid "Switch to VT 12"
|
||||||
|
msgstr "Preklopi na VT 12"
|
||||||
|
|
||||||
|
#: ../src/backends/meta-monitor-manager.c:364
|
||||||
msgid "Built-in display"
|
msgid "Built-in display"
|
||||||
msgstr "Vgrajen zaslon"
|
msgstr "Vgrajen zaslon"
|
||||||
|
|
||||||
#: ../src/backends/meta-monitor-manager.c:400
|
#: ../src/backends/meta-monitor-manager.c:391
|
||||||
msgid "Unknown"
|
msgid "Unknown"
|
||||||
msgstr "Neznano"
|
msgstr "Neznano"
|
||||||
|
|
||||||
#: ../src/backends/meta-monitor-manager.c:402
|
#: ../src/backends/meta-monitor-manager.c:393
|
||||||
msgid "Unknown Display"
|
msgid "Unknown Display"
|
||||||
msgstr "Neznan zaslon"
|
msgstr "Neznan zaslon"
|
||||||
|
|
||||||
#. TRANSLATORS: this is a monitor vendor name, followed by a
|
#. TRANSLATORS: this is a monitor vendor name, followed by a
|
||||||
#. * size in inches, like 'Dell 15"'
|
#. * size in inches, like 'Dell 15"'
|
||||||
#.
|
#.
|
||||||
#: ../src/backends/meta-monitor-manager.c:410
|
#: ../src/backends/meta-monitor-manager.c:401
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s %s"
|
msgid "%s %s"
|
||||||
msgstr "%s %s"
|
msgstr "%s %s"
|
||||||
@@ -494,7 +514,7 @@ msgstr "_Počakaj"
|
|||||||
msgid "_Force Quit"
|
msgid "_Force Quit"
|
||||||
msgstr "_Vsili konec"
|
msgstr "_Vsili konec"
|
||||||
|
|
||||||
#: ../src/core/display.c:550
|
#: ../src/core/display.c:562
|
||||||
#, 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 "Ni mogoče odpreti zaslona '%s' okenskega sistema X\n"
|
msgstr "Ni mogoče odpreti zaslona '%s' okenskega sistema X\n"
|
||||||
@@ -531,19 +551,6 @@ msgstr "Zaženi izbirnik wayland"
|
|||||||
msgid "Run as a full display server, rather than nested"
|
msgid "Run as a full display server, rather than nested"
|
||||||
msgstr "Zaženi kot polni strežnik zaslona in ne vstavljeno"
|
msgstr "Zaženi kot polni strežnik zaslona in ne vstavljeno"
|
||||||
|
|
||||||
#: ../src/core/main.c:451
|
|
||||||
#, c-format
|
|
||||||
msgid "Failed to scan themes directory: %s\n"
|
|
||||||
msgstr "Ni mogoče preiskati mape tem: %s\n"
|
|
||||||
|
|
||||||
#: ../src/core/main.c:467
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Could not find a theme! Be sure %s exists and contains the usual themes.\n"
|
|
||||||
msgstr ""
|
|
||||||
"Ni mogoče najti teme! Prepričajte se, da %s obstaja in vsebuje običajni "
|
|
||||||
"zapis teme.\n"
|
|
||||||
|
|
||||||
#: ../src/core/mutter.c:39
|
#: ../src/core/mutter.c:39
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -568,717 +575,30 @@ msgid "Mutter plugin to use"
|
|||||||
msgstr "Vstavek Mutter za uporabo"
|
msgstr "Vstavek Mutter za uporabo"
|
||||||
|
|
||||||
# G:1 K:0 O:0
|
# G:1 K:0 O:0
|
||||||
#: ../src/core/prefs.c:2064
|
#: ../src/core/prefs.c:2004
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Workspace %d"
|
msgid "Workspace %d"
|
||||||
msgstr "Delovna površina %d"
|
msgstr "Delovna površina %d"
|
||||||
|
|
||||||
#: ../src/core/screen.c:534
|
#: ../src/core/screen.c:525
|
||||||
|
#, c-format
|
||||||
|
msgid ""
|
||||||
|
"Display \"%s\" already has a window manager; try using the --replace option "
|
||||||
|
"to replace the current window manager."
|
||||||
|
msgstr ""
|
||||||
|
"Zaslon \"%s\" že ima določen upravljalnik oken; poskušajte uporabiti možnost "
|
||||||
|
"--replace za zamenjavo trenutnega upravljalnika zaslona."
|
||||||
|
|
||||||
|
#: ../src/core/screen.c:607
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Screen %d on display '%s' is invalid\n"
|
msgid "Screen %d on display '%s' is invalid\n"
|
||||||
msgstr "Zaslon %d na prikazu '%s' ni veljaven\n"
|
msgstr "Zaslon %d na prikazu '%s' ni veljaven\n"
|
||||||
|
|
||||||
#: ../src/core/screen.c:550
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Screen %d on display \"%s\" already has a window manager; try using the --"
|
|
||||||
"replace option to replace the current window manager.\n"
|
|
||||||
msgstr ""
|
|
||||||
"Zaslon %d na prikazu \"%s\" je že upravljan z upravljalnikom oken; "
|
|
||||||
"poskušajte uporabiti možnost --replace za zamenjavo trenutnega.\n"
|
|
||||||
|
|
||||||
#: ../src/core/screen.c:643
|
|
||||||
#, c-format
|
|
||||||
msgid "Screen %d on display \"%s\" already has a window manager\n"
|
|
||||||
msgstr "Zaslon %d na prikazu \"%s\" je že upravljan z upravljalnikom oken\n"
|
|
||||||
|
|
||||||
#: ../src/core/util.c:118
|
#: ../src/core/util.c:118
|
||||||
msgid "Mutter was compiled without support for verbose mode\n"
|
msgid "Mutter was compiled without support for verbose mode\n"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Program Mutter je kodno preveden brez podpore za podrobni način izpisovanja\n"
|
"Program Mutter je kodno preveden brez podpore za podrobni način izpisovanja\n"
|
||||||
|
|
||||||
#. Translators: This represents the size of a window. The first number is
|
|
||||||
#. * the width of the window and the second is the height.
|
|
||||||
#.
|
|
||||||
#: ../src/ui/resizepopup.c:134
|
|
||||||
#, c-format
|
|
||||||
msgid "%d x %d"
|
|
||||||
msgstr "%d x %d"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:233
|
|
||||||
msgid "top"
|
|
||||||
msgstr "zgoraj"
|
|
||||||
|
|
||||||
# G:12 K:5 O:0
|
|
||||||
#: ../src/ui/theme.c:235
|
|
||||||
msgid "bottom"
|
|
||||||
msgstr "spodaj"
|
|
||||||
|
|
||||||
# G:10 K:4 O:0
|
|
||||||
#: ../src/ui/theme.c:237
|
|
||||||
msgid "left"
|
|
||||||
msgstr "levo"
|
|
||||||
|
|
||||||
# G:1 K:0 O:0
|
|
||||||
#: ../src/ui/theme.c:239
|
|
||||||
msgid "right"
|
|
||||||
msgstr "desno"
|
|
||||||
|
|
||||||
# G:1 K:0 O:0
|
|
||||||
#: ../src/ui/theme.c:267
|
|
||||||
#, c-format
|
|
||||||
msgid "frame geometry does not specify \"%s\" dimension"
|
|
||||||
msgstr "geometrija okvirja ne navaja dimenzije \"%s\""
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:286
|
|
||||||
#, c-format
|
|
||||||
msgid "frame geometry does not specify dimension \"%s\" for border \"%s\""
|
|
||||||
msgstr "geometrija okvirja ne navaja dimenzije \"%s\" za rob \"%s\""
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:323
|
|
||||||
#, c-format
|
|
||||||
msgid "Button aspect ratio %g is not reasonable"
|
|
||||||
msgstr "Vrednost razmerja gumba %g ni smiselna"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:335
|
|
||||||
#, c-format
|
|
||||||
msgid "Frame geometry does not specify size of buttons"
|
|
||||||
msgstr "Geometrija okvirja ne navaja velikosti gumbov"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1061
|
|
||||||
#, c-format
|
|
||||||
msgid "Gradients should have at least two colors"
|
|
||||||
msgstr "Prelivi bi morali imeti vsaj dve barvi"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1211
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"GTK custom color specification must have color name and fallback in "
|
|
||||||
"parentheses, e.g. gtk:custom(foo,bar); could not parse \"%s\""
|
|
||||||
msgstr ""
|
|
||||||
"Navedba barve GTK mora biti opredeljena z imenom barve in v navednicah "
|
|
||||||
"povrnjeno barvo , npr. gtk:izbirno(ime_barve,povrnjena_barva); ni mogoče "
|
|
||||||
"razčleniti \"%s\""
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1227
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Invalid character '%c' in color_name parameter of gtk:custom, only A-Za-z0-9-"
|
|
||||||
"_ are valid"
|
|
||||||
msgstr ""
|
|
||||||
"Neveljaven znak '%c' v imenu barve gtk:izbirno; dovoljeni znaki so le A-Za-"
|
|
||||||
"z0-9-_."
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1241
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Gtk:custom format is \"gtk:custom(color_name,fallback)\", \"%s\" does not "
|
|
||||||
"fit the format"
|
|
||||||
msgstr ""
|
|
||||||
"Gtk:zapis po meri \"gtk:izbirno(ime_barve,povrnjena_barva)\", \"%s\" ne "
|
|
||||||
"ustreza pravilni obliki."
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1286
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"GTK color specification must have the state in brackets, e.g. gtk:fg[NORMAL] "
|
|
||||||
"where NORMAL is the state; could not parse \"%s\""
|
|
||||||
msgstr ""
|
|
||||||
"Navedba barve GTK mora vsebovati stanje v oglatih oklepajih, npr. gtk:"
|
|
||||||
"fg[NORMAL], kjer je NORMAL stanje; ni mogoče razčleniti \"%s\""
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1300
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"GTK color specification must have a close bracket after the state, e.g. gtk:"
|
|
||||||
"fg[NORMAL] where NORMAL is the state; could not parse \"%s\""
|
|
||||||
msgstr ""
|
|
||||||
"Navedbi barve GTK manjka oglati zaklepaj za stanjem, npr. gtk:fg[NORMAL], "
|
|
||||||
"kjer je NORMAL stanje; ni mogoče razčleniti \"%s\""
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1311
|
|
||||||
#, c-format
|
|
||||||
msgid "Did not understand state \"%s\" in color specification"
|
|
||||||
msgstr "Ni mogoče razumeti stanja \"%s\" v navedbi barve "
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1324
|
|
||||||
#, c-format
|
|
||||||
msgid "Did not understand color component \"%s\" in color specification"
|
|
||||||
msgstr "Ni mogoče razumeti barvne komponente \"%s\" v navedbi barve"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1352
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Blend format is \"blend/bg_color/fg_color/alpha\", \"%s\" does not fit the "
|
|
||||||
"format"
|
|
||||||
msgstr ""
|
|
||||||
"Oblika zapisa preliva je \"blend/bg_color/fg_color/alpha\", \"%s\" ne "
|
|
||||||
"ustreza pravilni obliki"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1363
|
|
||||||
#, c-format
|
|
||||||
msgid "Could not parse alpha value \"%s\" in blended color"
|
|
||||||
msgstr "V prelivni barvi ni mogoče razčleniti vrednosti alfa \"%s\""
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1373
|
|
||||||
#, c-format
|
|
||||||
msgid "Alpha value \"%s\" in blended color is not between 0.0 and 1.0"
|
|
||||||
msgstr "V prelivni barvi alfa vrednost \"%s\" ni med 0.0 in 1.0"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1419
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Shade format is \"shade/base_color/factor\", \"%s\" does not fit the format"
|
|
||||||
msgstr ""
|
|
||||||
"Oblika zapisa barve senčenja je \"shade/base_color/factor\", \"%s\" ne "
|
|
||||||
"ustreza pravilni obliki."
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1430
|
|
||||||
#, c-format
|
|
||||||
msgid "Could not parse shade factor \"%s\" in shaded color"
|
|
||||||
msgstr "Ni mogoče razčleniti vrednosti senčenja \"%s\" v senčeni barvi"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1440
|
|
||||||
#, c-format
|
|
||||||
msgid "Shade factor \"%s\" in shaded color is negative"
|
|
||||||
msgstr "V senčeni barvi je vrednost senčenja \"%s\" negativna"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1469
|
|
||||||
#, c-format
|
|
||||||
msgid "Could not parse color \"%s\""
|
|
||||||
msgstr "Ni mogoče razčleniti barve \"%s\""
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1778
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression contains character '%s' which is not allowed"
|
|
||||||
msgstr "Izraz koordinat vsebuje znak '%s', ki pa ni dovoljen"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1805
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Coordinate expression contains floating point number '%s' which could not be "
|
|
||||||
"parsed"
|
|
||||||
msgstr ""
|
|
||||||
"Izraz koordinat vsebuje številko s plavajočo vejico '%s', ki je ni mogoče "
|
|
||||||
"razčleniti"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1819
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression contains integer '%s' which could not be parsed"
|
|
||||||
msgstr "Izraz koordinat vsebuje celo število '%s', ki ga ni mogoče razčleniti"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1940
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Coordinate expression contained unknown operator at the start of this text: "
|
|
||||||
"\"%s\""
|
|
||||||
msgstr "Izraz koordinat vsebuje neznan operator na začetku besedila: \"%s\""
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1997
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression was empty or not understood"
|
|
||||||
msgstr "Izraz koordinat je prazen ali pa ni v razumljivem zapisu"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2110 ../src/ui/theme.c:2120 ../src/ui/theme.c:2154
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression results in division by zero"
|
|
||||||
msgstr "Izraz koordinat povzroči deljenje z vrednostjo nič"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2162
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Coordinate expression tries to use mod operator on a floating-point number"
|
|
||||||
msgstr ""
|
|
||||||
"Izraz koordinat poskuša uporabiti operator mod ali številko s plavajočo "
|
|
||||||
"vejico"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2218
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Coordinate expression has an operator \"%s\" where an operand was expected"
|
|
||||||
msgstr "Izraz koordinat vsebuje operator \"%s\", kjer je pričakovan operand"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2227
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression had an operand where an operator was expected"
|
|
||||||
msgstr "Izraz koordinat vsebuje operand kjer je pričakovan operator"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2235
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression ended with an operator instead of an operand"
|
|
||||||
msgstr "Izraz koordinat se konča z operatorjem namesto z operandom"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2245
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Coordinate expression has operator \"%c\" following operator \"%c\" with no "
|
|
||||||
"operand in between"
|
|
||||||
msgstr ""
|
|
||||||
"Izraz koordinat vsebuje operator \"%c\", ki sledi operatorju \"%c\", brez "
|
|
||||||
"vmesnega operanda"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2396 ../src/ui/theme.c:2441
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression had unknown variable or constant \"%s\""
|
|
||||||
msgstr "Izraz koordinat vsebuje neznano spremenljivko ali konstanto \"%s\""
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2495
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression parser overflowed its buffer."
|
|
||||||
msgstr "Razčlenjevalnik izrazov koordinat je preplavil medpomnilnik."
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2524
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression had a close parenthesis with no open parenthesis"
|
|
||||||
msgstr "Izraz koordinat vsebuje zaklepaj, ne pa tudi uklepaja"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2588
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression had an open parenthesis with no close parenthesis"
|
|
||||||
msgstr "Izraz koordinat vsebuje uklepaj, vendar je brez zaklepaja"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2599
|
|
||||||
#, c-format
|
|
||||||
msgid "Coordinate expression doesn't seem to have any operators or operands"
|
|
||||||
msgstr "Videti je, da izraz koordinat ne vsebuje operatorjev ali operandov"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2812 ../src/ui/theme.c:2832 ../src/ui/theme.c:2852
|
|
||||||
#, c-format
|
|
||||||
msgid "Theme contained an expression that resulted in an error: %s\n"
|
|
||||||
msgstr "Tema vsebuje izraz, ki povzroča napako: %s\n"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:4455
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"<button function=\"%s\" state=\"%s\" draw_ops=\"whatever\"/> must be "
|
|
||||||
"specified for this frame style"
|
|
||||||
msgstr ""
|
|
||||||
"Za ta slog okvirja mora biti naveden <button function=\"%s\" state=\"%s\" "
|
|
||||||
"draw_ops=\"karkoli\"/>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:4970 ../src/ui/theme.c:4995
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Missing <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/>"
|
|
||||||
msgstr ""
|
|
||||||
"Manjka <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"karkoli\"/>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5041
|
|
||||||
#, c-format
|
|
||||||
msgid "Failed to load theme \"%s\": %s\n"
|
|
||||||
msgstr "Napaka med nalaganjem teme \"%s\": %s\n"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5177 ../src/ui/theme.c:5184 ../src/ui/theme.c:5191
|
|
||||||
#: ../src/ui/theme.c:5198 ../src/ui/theme.c:5205
|
|
||||||
#, c-format
|
|
||||||
msgid "No <%s> set for theme \"%s\""
|
|
||||||
msgstr "Ni nastavljena vrednost <%s> za temo \"%s\""
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5213
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"No frame style set for window type \"%s\" in theme \"%s\", add a <window "
|
|
||||||
"type=\"%s\" style_set=\"whatever\"/> element"
|
|
||||||
msgstr ""
|
|
||||||
"Ni določenega sloga okvirja okna vrste \"%s\" v temi \"%s\". Dodajte predmet "
|
|
||||||
"<window type=\"%s\" style_set=\"whatever\"/>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5620 ../src/ui/theme.c:5682 ../src/ui/theme.c:5745
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"User-defined constants must begin with a capital letter; \"%s\" does not"
|
|
||||||
msgstr ""
|
|
||||||
"Uporabniško določene konstante se morajo začeti z veliko črko; vrednost \"%s"
|
|
||||||
"\" se ne"
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5628 ../src/ui/theme.c:5690 ../src/ui/theme.c:5753
|
|
||||||
#, c-format
|
|
||||||
msgid "Constant \"%s\" has already been defined"
|
|
||||||
msgstr "Konstanta \"%s\" je že določena"
|
|
||||||
|
|
||||||
#. Translators: This means that an attribute which should have been found
|
|
||||||
#. * on an XML element was not in fact found.
|
|
||||||
#.
|
|
||||||
#: ../src/ui/theme-parser.c:234
|
|
||||||
#, c-format
|
|
||||||
msgid "No \"%s\" attribute on element <%s>"
|
|
||||||
msgstr "Ni atributa \"%s\" za predmet <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:263 ../src/ui/theme-parser.c:281
|
|
||||||
#, c-format
|
|
||||||
msgid "Line %d character %d: %s"
|
|
||||||
msgstr "Vrstica %d, znak %d: %s"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:481
|
|
||||||
#, c-format
|
|
||||||
msgid "Attribute \"%s\" repeated twice on the same <%s> element"
|
|
||||||
msgstr "Atribut \"%s\" je bil v enakem predmetu <%s> ponovljen dvakrat"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:505 ../src/ui/theme-parser.c:554
|
|
||||||
#, c-format
|
|
||||||
msgid "Attribute \"%s\" is invalid on <%s> element in this context"
|
|
||||||
msgstr "Atribut \"%s\" je na ta način v predmetu <%s> neveljaven"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:596
|
|
||||||
#, c-format
|
|
||||||
msgid "Could not parse \"%s\" as an integer"
|
|
||||||
msgstr "Ni mogoče razčleniti \"%s\" kot celoštevilčne vrednosti"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:605 ../src/ui/theme-parser.c:660
|
|
||||||
#, c-format
|
|
||||||
msgid "Did not understand trailing characters \"%s\" in string \"%s\""
|
|
||||||
msgstr "Ni mogoče razumeti končnih znakov \"%s\" v nizu \"%s\""
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:615
|
|
||||||
#, c-format
|
|
||||||
msgid "Integer %ld must be positive"
|
|
||||||
msgstr "Celoštevilska vrednost %ld mora biti pozitivna"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:623
|
|
||||||
#, c-format
|
|
||||||
msgid "Integer %ld is too large, current max is %d"
|
|
||||||
msgstr "Celoštevilska vrednost %ld je prevelika; trenutna omejitev je %d"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:651 ../src/ui/theme-parser.c:767
|
|
||||||
#, c-format
|
|
||||||
msgid "Could not parse \"%s\" as a floating point number"
|
|
||||||
msgstr "Ni mogoče razčleniti \"%s\" kot števila s plavajočo vejico"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:682 ../src/ui/theme-parser.c:710
|
|
||||||
#, c-format
|
|
||||||
msgid "Boolean values must be \"true\" or \"false\" not \"%s\""
|
|
||||||
msgstr "Logične vrednosti morajo biti \"prav\" ali \"napak\" in ne \"%s\""
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:737
|
|
||||||
#, c-format
|
|
||||||
msgid "Angle must be between 0.0 and 360.0, was %g\n"
|
|
||||||
msgstr "Kot mora biti med 0.0 in 360.0, določen pa je z vrednostjo %g\n"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:800
|
|
||||||
#, c-format
|
|
||||||
msgid "Alpha must be between 0.0 (invisible) and 1.0 (fully opaque), was %g\n"
|
|
||||||
msgstr ""
|
|
||||||
"Alfa mora biti med 0.0 (nevidno) in 1.0 (popolnoma vidno), vrednost pa je "
|
|
||||||
"določena na %g\n"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:865
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Invalid title scale \"%s\" (must be one of xx-small,x-small,small,medium,"
|
|
||||||
"large,x-large,xx-large)\n"
|
|
||||||
msgstr ""
|
|
||||||
"Neveljavna velikost naziva \"%s\" (mora biti eno od xx-small,x-small,small,"
|
|
||||||
"medium,large,x-large,xx-large)\n"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1021 ../src/ui/theme-parser.c:1084
|
|
||||||
#: ../src/ui/theme-parser.c:1118 ../src/ui/theme-parser.c:1221
|
|
||||||
#, c-format
|
|
||||||
msgid "<%s> name \"%s\" used a second time"
|
|
||||||
msgstr "ime <%s> \"%s\" je uporabljeno drugič"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1033 ../src/ui/theme-parser.c:1130
|
|
||||||
#: ../src/ui/theme-parser.c:1233
|
|
||||||
#, c-format
|
|
||||||
msgid "<%s> parent \"%s\" has not been defined"
|
|
||||||
msgstr "nadrejeni predmet <%s> \"%s\" ni naveden"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1143
|
|
||||||
#, c-format
|
|
||||||
msgid "<%s> geometry \"%s\" has not been defined"
|
|
||||||
msgstr "geometrija <%s> \"%s\" ni navedena"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1156
|
|
||||||
#, c-format
|
|
||||||
msgid "<%s> must specify either a geometry or a parent that has a geometry"
|
|
||||||
msgstr ""
|
|
||||||
"<%s> mora imeti navedeno ali geometrijo ali nadrejeni predmet z določeno "
|
|
||||||
"geometrijo"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1198
|
|
||||||
msgid "You must specify a background for an alpha value to be meaningful"
|
|
||||||
msgstr "Določiti je treba ozadje, v kolikor naj ima alfa vrednost pomen."
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1266
|
|
||||||
#, c-format
|
|
||||||
msgid "Unknown type \"%s\" on <%s> element"
|
|
||||||
msgstr "Neznana vrsta \"%s\" v predmetu <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1277
|
|
||||||
#, c-format
|
|
||||||
msgid "Unknown style_set \"%s\" on <%s> element"
|
|
||||||
msgstr "Neznan style_set \"%s\" v predmetu <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1285
|
|
||||||
#, c-format
|
|
||||||
msgid "Window type \"%s\" has already been assigned a style set"
|
|
||||||
msgstr "Vrsti okna \"%s\" je slog že določen"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1315 ../src/ui/theme-parser.c:1379
|
|
||||||
#: ../src/ui/theme-parser.c:1605 ../src/ui/theme-parser.c:2840
|
|
||||||
#: ../src/ui/theme-parser.c:2886 ../src/ui/theme-parser.c:3036
|
|
||||||
#: ../src/ui/theme-parser.c:3272 ../src/ui/theme-parser.c:3310
|
|
||||||
#: ../src/ui/theme-parser.c:3348 ../src/ui/theme-parser.c:3386
|
|
||||||
#, c-format
|
|
||||||
msgid "Element <%s> is not allowed below <%s>"
|
|
||||||
msgstr "Predmet <%s> ni dovoljen pod <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1429 ../src/ui/theme-parser.c:1443
|
|
||||||
#: ../src/ui/theme-parser.c:1488
|
|
||||||
msgid ""
|
|
||||||
"Cannot specify both \"button_width\"/\"button_height\" and \"aspect_ratio\" "
|
|
||||||
"for buttons"
|
|
||||||
msgstr ""
|
|
||||||
"Ni mogoče navesti tako vrednosti \"button_width\"/\"button_height\", kot "
|
|
||||||
"vrednosti razmerja\"aspect_ratio\" gumba"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1452
|
|
||||||
#, c-format
|
|
||||||
msgid "Distance \"%s\" is unknown"
|
|
||||||
msgstr "Razdalja \"%s\" ni znana"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1497
|
|
||||||
#, c-format
|
|
||||||
msgid "Aspect ratio \"%s\" is unknown"
|
|
||||||
msgstr "Razmerje \"%s\" ni znano"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1559
|
|
||||||
#, c-format
|
|
||||||
msgid "Border \"%s\" is unknown"
|
|
||||||
msgstr "Rob \"%s\" ni znane vrste"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1870
|
|
||||||
#, c-format
|
|
||||||
msgid "No \"start_angle\" or \"from\" attribute on element <%s>"
|
|
||||||
msgstr "Predmet <%s> nima določenega atributa \"start_angle\" ali \"from\""
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1877
|
|
||||||
#, c-format
|
|
||||||
msgid "No \"extent_angle\" or \"to\" attribute on element <%s>"
|
|
||||||
msgstr "Predmet <%s> nima določenega atributa \"extent_angle\" ali \"to\""
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2117
|
|
||||||
#, c-format
|
|
||||||
msgid "Did not understand value \"%s\" for type of gradient"
|
|
||||||
msgstr "Ni mogoče razumeti vrednosti za vrsto preliva \"%s\""
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2195 ../src/ui/theme-parser.c:2570
|
|
||||||
#, c-format
|
|
||||||
msgid "Did not understand fill type \"%s\" for <%s> element"
|
|
||||||
msgstr "Neprepoznana vrsta polnjenja \"%s\" za predmet <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2362 ../src/ui/theme-parser.c:2445
|
|
||||||
#: ../src/ui/theme-parser.c:2508
|
|
||||||
#, c-format
|
|
||||||
msgid "Did not understand state \"%s\" for <%s> element"
|
|
||||||
msgstr "Ni mogoče razumeti stanja \"%s\" za predmet <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2372 ../src/ui/theme-parser.c:2455
|
|
||||||
#, c-format
|
|
||||||
msgid "Did not understand shadow \"%s\" for <%s> element"
|
|
||||||
msgstr "Ni mogoče razumeti senčenja \"%s\" za predmet <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2382
|
|
||||||
#, c-format
|
|
||||||
msgid "Did not understand arrow \"%s\" for <%s> element"
|
|
||||||
msgstr "Ni mogoče razumeti puščice \"%s\" za predmet <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2696 ../src/ui/theme-parser.c:2792
|
|
||||||
#, c-format
|
|
||||||
msgid "No <draw_ops> called \"%s\" has been defined"
|
|
||||||
msgstr "<draw_ops> imenovan \"%s\" ni naveden"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2708 ../src/ui/theme-parser.c:2804
|
|
||||||
#, c-format
|
|
||||||
msgid "Including draw_ops \"%s\" here would create a circular reference"
|
|
||||||
msgstr "Vključevanje draw_ops \"%s\" na tem mestu ustvari krožno sklicevanje"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2919
|
|
||||||
#, c-format
|
|
||||||
msgid "Unknown position \"%s\" for frame piece"
|
|
||||||
msgstr "Neznan položaj \"%s\" za del okvirja"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2927
|
|
||||||
#, c-format
|
|
||||||
msgid "Frame style already has a piece at position %s"
|
|
||||||
msgstr "Slog okvirja že ima del na položaju %s"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2944 ../src/ui/theme-parser.c:3021
|
|
||||||
#, c-format
|
|
||||||
msgid "No <draw_ops> with the name \"%s\" has been defined"
|
|
||||||
msgstr "Za ime \"%s\" ni navedenega <draw_ops>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2974
|
|
||||||
#, c-format
|
|
||||||
msgid "Unknown function \"%s\" for button"
|
|
||||||
msgstr "Neznana funkcija \"%s\" za gumb"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2984
|
|
||||||
#, c-format
|
|
||||||
msgid "Button function \"%s\" does not exist in this version (%d, need %d)"
|
|
||||||
msgstr "Funkcija gumba \"%s\" ne obstaja v tej različici (%d, zahtevana %d)"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2996
|
|
||||||
#, c-format
|
|
||||||
msgid "Unknown state \"%s\" for button"
|
|
||||||
msgstr "Neznano stanje \"%s\" za gumb"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3004
|
|
||||||
#, c-format
|
|
||||||
msgid "Frame style already has a button for function %s state %s"
|
|
||||||
msgstr "Slog okvirja že ima gumb za funkcijo %s stanje %s"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3075
|
|
||||||
#, c-format
|
|
||||||
msgid "\"%s\" is not a valid value for focus attribute"
|
|
||||||
msgstr "\"%s\" ni veljavna vrednost za atribut \"focus\""
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3084
|
|
||||||
#, c-format
|
|
||||||
msgid "\"%s\" is not a valid value for state attribute"
|
|
||||||
msgstr "\"%s\" ni veljavna vrednost za atribut \"state\""
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3094
|
|
||||||
#, c-format
|
|
||||||
msgid "A style called \"%s\" has not been defined"
|
|
||||||
msgstr "Slog imenovan \"%s\" ni določen"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3115 ../src/ui/theme-parser.c:3138
|
|
||||||
#, c-format
|
|
||||||
msgid "\"%s\" is not a valid value for resize attribute"
|
|
||||||
msgstr "\"%s\" ni veljavna vrednost za atribut \"resize\""
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3149
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Should not have \"resize\" attribute on <%s> element for maximized/shaded "
|
|
||||||
"states"
|
|
||||||
msgstr ""
|
|
||||||
"Predmetu <%s> ni mogoče določiti atributa \"resize\" za razpeta/senčena "
|
|
||||||
"stanja"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3163
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Should not have \"resize\" attribute on <%s> element for maximized states"
|
|
||||||
msgstr "Predmetu <%s> ni mogoče določiti atributa \"resize\" za razpeta stanja"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3177 ../src/ui/theme-parser.c:3221
|
|
||||||
#, c-format
|
|
||||||
msgid "Style has already been specified for state %s resize %s focus %s"
|
|
||||||
msgstr "Slog za stanje %s, spremenjeno velikost %s in žarišče %s je že naveden"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3188 ../src/ui/theme-parser.c:3199
|
|
||||||
#: ../src/ui/theme-parser.c:3210 ../src/ui/theme-parser.c:3232
|
|
||||||
#: ../src/ui/theme-parser.c:3243 ../src/ui/theme-parser.c:3254
|
|
||||||
#, c-format
|
|
||||||
msgid "Style has already been specified for state %s focus %s"
|
|
||||||
msgstr "Slog za stanje %s in žarišče %s je že naveden"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3293
|
|
||||||
msgid ""
|
|
||||||
"Can't have a two draw_ops for a <piece> element (theme specified a draw_ops "
|
|
||||||
"attribute and also a <draw_ops> element, or specified two elements)"
|
|
||||||
msgstr ""
|
|
||||||
"Za predmet <piece> ni mogoče imeti določenih dveh vrednosti draw_ops (tema "
|
|
||||||
"je navedla atribut draw_ops in hkrati predmet <draw_ops> ali navedena dva "
|
|
||||||
"predmeta)"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3331
|
|
||||||
msgid ""
|
|
||||||
"Can't have a two draw_ops for a <button> element (theme specified a draw_ops "
|
|
||||||
"attribute and also a <draw_ops> element, or specified two elements)"
|
|
||||||
msgstr ""
|
|
||||||
"Za predmet <button> ni mogoče imeti določenih dveh vrednosti draw_ops (tema "
|
|
||||||
"ima naveden atribut draw_ops in hkrati element <draw_ops> ali pa ima "
|
|
||||||
"navedena dva elementa)"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3369
|
|
||||||
msgid ""
|
|
||||||
"Can't have a two draw_ops for a <menu_icon> element (theme specified a "
|
|
||||||
"draw_ops attribute and also a <draw_ops> element, or specified two elements)"
|
|
||||||
msgstr ""
|
|
||||||
"Za element <menu_icon> ni mogoče imeti dveh draw_ops (tema ima naveden "
|
|
||||||
"atribut draw_ops in hkrati predmet <draw_ops> ali pa ima navedena dva "
|
|
||||||
"predmeta)"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3433
|
|
||||||
#, c-format
|
|
||||||
msgid "Bad version specification '%s'"
|
|
||||||
msgstr "Slabo določilo različice '%s'"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3506
|
|
||||||
msgid ""
|
|
||||||
"\"version\" attribute cannot be used in metacity-theme-1.xml or metacity-"
|
|
||||||
"theme-2.xml"
|
|
||||||
msgstr ""
|
|
||||||
"atributa \"version\" ni mogoče uporabiti v temi metacity-theme-1.xml oziroma "
|
|
||||||
"metacity-theme-2.xml"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3529
|
|
||||||
#, c-format
|
|
||||||
msgid "Theme requires version %s but latest supported theme version is %d.%d"
|
|
||||||
msgstr "Tema zahteva različico %s, zadnja podprta različica teme pa je %d.%d"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3561
|
|
||||||
#, c-format
|
|
||||||
msgid "Outermost element in theme must be <metacity_theme> not <%s>"
|
|
||||||
msgstr "Najbolj zunanji predmet teme mora biti <metacity_theme> in ne <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3581
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Element <%s> is not allowed inside a name/author/date/description element"
|
|
||||||
msgstr ""
|
|
||||||
"Predmet <%s> ni dovoljen znotraj predmetov imena, avtorja, datuma ali opisa"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3586
|
|
||||||
#, c-format
|
|
||||||
msgid "Element <%s> is not allowed inside a <constant> element"
|
|
||||||
msgstr "Predmet <%s> ni dovoljen znotraj predmeta <constant>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3598
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Element <%s> is not allowed inside a distance/border/aspect_ratio element"
|
|
||||||
msgstr ""
|
|
||||||
"Predmet <%s> ni dovoljen znotraj predmetov razdalje/robov/razmerja velikosti"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3620
|
|
||||||
#, c-format
|
|
||||||
msgid "Element <%s> is not allowed inside a draw operation element"
|
|
||||||
msgstr "Predmet <%s> ni dovoljen znotraj predmeta izrisevanja"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3630 ../src/ui/theme-parser.c:3660
|
|
||||||
#: ../src/ui/theme-parser.c:3665 ../src/ui/theme-parser.c:3670
|
|
||||||
#, c-format
|
|
||||||
msgid "Element <%s> is not allowed inside a <%s> element"
|
|
||||||
msgstr "Predmet <%s> ni dovoljen znotraj predmeta <%s>"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3898
|
|
||||||
msgid "No draw_ops provided for frame piece"
|
|
||||||
msgstr "Za del okvirja ni navedena vrednost draw_ops"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3913
|
|
||||||
msgid "No draw_ops provided for button"
|
|
||||||
msgstr "Za gumb ni navedena vrednost draw_ops"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:3967
|
|
||||||
#, c-format
|
|
||||||
msgid "No text is allowed inside element <%s>"
|
|
||||||
msgstr "Znotraj predmeta <%s> besedilo ni dovoljeno"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:4025 ../src/ui/theme-parser.c:4037
|
|
||||||
#: ../src/ui/theme-parser.c:4049 ../src/ui/theme-parser.c:4061
|
|
||||||
#: ../src/ui/theme-parser.c:4073
|
|
||||||
#, c-format
|
|
||||||
msgid "<%s> specified twice for this theme"
|
|
||||||
msgstr "Vrednost <%s> je za to temo navedena dvakrat"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:4335
|
|
||||||
#, c-format
|
|
||||||
msgid "Failed to find a valid file for theme %s\n"
|
|
||||||
msgstr "Ni mogoče najti veljavne datoteke za temo %s\n"
|
|
||||||
|
|
||||||
# G:2 K:6 O:0
|
# G:2 K:6 O:0
|
||||||
#: ../src/x11/session.c:1815
|
#: ../src/x11/session.c:1815
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -1288,16 +608,26 @@ msgstr ""
|
|||||||
"Ta okna ne podpirajo možnosti "shranjevanja trenutnih nastavitev", "
|
"Ta okna ne podpirajo možnosti "shranjevanja trenutnih nastavitev", "
|
||||||
"zato jih bo treba ob naslednji prijavi zagnati ročno."
|
"zato jih bo treba ob naslednji prijavi zagnati ročno."
|
||||||
|
|
||||||
#: ../src/x11/window-props.c:558
|
#: ../src/x11/window-props.c:549
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s (on %s)"
|
msgid "%s (on %s)"
|
||||||
msgstr "%s (na %s)"
|
msgstr "%s (na %s)"
|
||||||
|
|
||||||
#~ msgid "background texture could not be created from file"
|
#~ msgid "Failed to scan themes directory: %s\n"
|
||||||
#~ msgstr "teksture ozadja iz datoteke ni mogoče ustvariti"
|
#~ msgstr "Ni mogoče preiskati mape tem: %s\n"
|
||||||
|
|
||||||
#~ msgid "Unknown window information request: %d"
|
#~ msgid ""
|
||||||
#~ msgstr "Zahteva izpisa podrobnosti neznanega okna: %d"
|
#~ "Could not find a theme! Be sure %s exists and contains the usual themes.\n"
|
||||||
|
#~ msgstr ""
|
||||||
|
#~ "Ni mogoče najti teme! Prepričajte se, da %s obstaja in vsebuje običajni "
|
||||||
|
#~ "zapis teme.\n"
|
||||||
|
|
||||||
#~ msgid "Missing %s extension required for compositing"
|
#~ msgid "Screen %d on display \"%s\" already has a window manager\n"
|
||||||
#~ msgstr "Manjka razširitev %s, ki je ključna za sestavljanje"
|
#~ msgstr ""
|
||||||
|
#~ "Zaslon %d na prikazu \"%s\" je že upravljan z upravljalnikom oken\n"
|
||||||
|
|
||||||
|
#~ msgid "%d x %d"
|
||||||
|
#~ msgstr "%d x %d"
|
||||||
|
|
||||||
|
#~ msgid "top"
|
||||||
|
#~ msgstr "zgoraj"
|
||||||
|
|||||||
1252
po/sr@latin.po
1252
po/sr@latin.po
File diff suppressed because it is too large
Load Diff
1190
po/zh_TW.po
1190
po/zh_TW.po
File diff suppressed because it is too large
Load Diff
@@ -9,6 +9,7 @@ dist_stacking_DATA = \
|
|||||||
tests/stacking/basic-wayland.metatest \
|
tests/stacking/basic-wayland.metatest \
|
||||||
tests/stacking/minimized.metatest \
|
tests/stacking/minimized.metatest \
|
||||||
tests/stacking/mixed-windows.metatest \
|
tests/stacking/mixed-windows.metatest \
|
||||||
|
tests/stacking/set-parent.metatest \
|
||||||
tests/stacking/override-redirect.metatest
|
tests/stacking/override-redirect.metatest
|
||||||
|
|
||||||
mutter-all.test: tests/mutter-all.test.in
|
mutter-all.test: tests/mutter-all.test.in
|
||||||
@@ -41,9 +42,6 @@ endif
|
|||||||
# Some random test programs for bits of the code
|
# Some random test programs for bits of the code
|
||||||
|
|
||||||
testboxes_SOURCES = core/testboxes.c
|
testboxes_SOURCES = core/testboxes.c
|
||||||
testasyncgetprop_SOURCES = x11/testasyncgetprop.c
|
|
||||||
|
|
||||||
noinst_PROGRAMS+=testboxes testasyncgetprop
|
|
||||||
|
|
||||||
testboxes_LDADD = $(MUTTER_LIBS) libmutter.la
|
testboxes_LDADD = $(MUTTER_LIBS) libmutter.la
|
||||||
testasyncgetprop_LDADD = $(MUTTER_LIBS) libmutter.la
|
|
||||||
|
noinst_PROGRAMS += testboxes
|
||||||
|
|||||||
109
src/Makefile.am
109
src/Makefile.am
@@ -39,22 +39,27 @@ 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) \
|
$(dbus_login1_built_sources) \
|
||||||
mutter-enum-types.h \
|
meta/meta-enum-types.h \
|
||||||
mutter-enum-types.c \
|
meta-enum-types.c \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
if HAVE_WAYLAND
|
if HAVE_WAYLAND
|
||||||
mutter_built_sources += \
|
mutter_built_sources += \
|
||||||
|
pointer-gestures-unstable-v1-protocol.c \
|
||||||
|
pointer-gestures-unstable-v1-server-protocol.h \
|
||||||
gtk-shell-protocol.c \
|
gtk-shell-protocol.c \
|
||||||
gtk-shell-server-protocol.h \
|
gtk-shell-server-protocol.h \
|
||||||
xdg-shell-protocol.c \
|
xdg-shell-unstable-v5-protocol.c \
|
||||||
xdg-shell-server-protocol.h \
|
xdg-shell-unstable-v5-server-protocol.h \
|
||||||
|
relative-pointer-unstable-v1-protocol.c \
|
||||||
|
relative-pointer-unstable-v1-server-protocol.h \
|
||||||
|
pointer-constraints-unstable-v1-protocol.c \
|
||||||
|
pointer-constraints-unstable-v1-server-protocol.h \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
wayland_protocols = \
|
wayland_protocols = \
|
||||||
wayland/protocol/gtk-shell.xml \
|
wayland/protocol/gtk-shell.xml \
|
||||||
wayland/protocol/xdg-shell.xml \
|
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
libmutter_la_SOURCES = \
|
libmutter_la_SOURCES = \
|
||||||
@@ -65,7 +70,6 @@ libmutter_la_SOURCES = \
|
|||||||
backends/meta-barrier-private.h \
|
backends/meta-barrier-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-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.c \
|
||||||
@@ -80,9 +84,12 @@ libmutter_la_SOURCES = \
|
|||||||
backends/meta-monitor-config.c \
|
backends/meta-monitor-config.c \
|
||||||
backends/meta-monitor-config.h \
|
backends/meta-monitor-config.h \
|
||||||
backends/meta-monitor-manager.c \
|
backends/meta-monitor-manager.c \
|
||||||
backends/meta-monitor-manager.h \
|
meta/meta-monitor-manager.h \
|
||||||
|
backends/meta-monitor-manager-private.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-pointer-constraint.c \
|
||||||
|
backends/meta-pointer-constraint.h \
|
||||||
backends/meta-stage.h \
|
backends/meta-stage.h \
|
||||||
backends/meta-stage.c \
|
backends/meta-stage.c \
|
||||||
backends/edid-parse.c \
|
backends/edid-parse.c \
|
||||||
@@ -93,6 +100,8 @@ libmutter_la_SOURCES = \
|
|||||||
backends/x11/meta-barrier-x11.h \
|
backends/x11/meta-barrier-x11.h \
|
||||||
backends/x11/meta-cursor-renderer-x11.c \
|
backends/x11/meta-cursor-renderer-x11.c \
|
||||||
backends/x11/meta-cursor-renderer-x11.h \
|
backends/x11/meta-cursor-renderer-x11.h \
|
||||||
|
backends/x11/nested/meta-cursor-renderer-x11-nested.c \
|
||||||
|
backends/x11/nested/meta-cursor-renderer-x11-nested.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-input-settings-x11.c \
|
backends/x11/meta-input-settings-x11.c \
|
||||||
@@ -107,6 +116,8 @@ libmutter_la_SOURCES = \
|
|||||||
core/boxes.c \
|
core/boxes.c \
|
||||||
core/boxes-private.h \
|
core/boxes-private.h \
|
||||||
meta/boxes.h \
|
meta/boxes.h \
|
||||||
|
core/meta-border.c \
|
||||||
|
core/meta-border.h \
|
||||||
compositor/clutter-utils.c \
|
compositor/clutter-utils.c \
|
||||||
compositor/clutter-utils.h \
|
compositor/clutter-utils.h \
|
||||||
compositor/cogl-utils.c \
|
compositor/cogl-utils.c \
|
||||||
@@ -131,13 +142,14 @@ libmutter_la_SOURCES = \
|
|||||||
compositor/meta-plugin-manager.c \
|
compositor/meta-plugin-manager.c \
|
||||||
compositor/meta-plugin-manager.h \
|
compositor/meta-plugin-manager.h \
|
||||||
compositor/meta-shadow-factory.c \
|
compositor/meta-shadow-factory.c \
|
||||||
compositor/meta-shadow-factory-private.h \
|
|
||||||
compositor/meta-shaped-texture.c \
|
compositor/meta-shaped-texture.c \
|
||||||
compositor/meta-shaped-texture-private.h \
|
compositor/meta-shaped-texture-private.h \
|
||||||
compositor/meta-surface-actor.c \
|
compositor/meta-surface-actor.c \
|
||||||
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-sync-ring.c \
|
||||||
|
compositor/meta-sync-ring.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 \
|
||||||
@@ -147,7 +159,6 @@ libmutter_la_SOURCES = \
|
|||||||
compositor/meta-window-group.c \
|
compositor/meta-window-group.c \
|
||||||
compositor/meta-window-group.h \
|
compositor/meta-window-group.h \
|
||||||
compositor/meta-window-shape.c \
|
compositor/meta-window-shape.c \
|
||||||
compositor/meta-window-shape.h \
|
|
||||||
compositor/region-utils.c \
|
compositor/region-utils.c \
|
||||||
compositor/region-utils.h \
|
compositor/region-utils.h \
|
||||||
meta/compositor.h \
|
meta/compositor.h \
|
||||||
@@ -158,6 +169,7 @@ libmutter_la_SOURCES = \
|
|||||||
meta/meta-plugin.h \
|
meta/meta-plugin.h \
|
||||||
meta/meta-shadow-factory.h \
|
meta/meta-shadow-factory.h \
|
||||||
meta/meta-window-actor.h \
|
meta/meta-window-actor.h \
|
||||||
|
meta/meta-window-shape.h \
|
||||||
meta/compositor-mutter.h \
|
meta/compositor-mutter.h \
|
||||||
core/constraints.c \
|
core/constraints.c \
|
||||||
core/constraints.h \
|
core/constraints.h \
|
||||||
@@ -186,6 +198,8 @@ libmutter_la_SOURCES = \
|
|||||||
core/screen.c \
|
core/screen.c \
|
||||||
core/screen-private.h \
|
core/screen-private.h \
|
||||||
meta/screen.h \
|
meta/screen.h \
|
||||||
|
core/startup-notification.c \
|
||||||
|
core/startup-notification-private.h \
|
||||||
meta/types.h \
|
meta/types.h \
|
||||||
core/restart.c \
|
core/restart.c \
|
||||||
core/stack.c \
|
core/stack.c \
|
||||||
@@ -209,10 +223,7 @@ libmutter_la_SOURCES = \
|
|||||||
meta/theme.h \
|
meta/theme.h \
|
||||||
ui/theme-private.h \
|
ui/theme-private.h \
|
||||||
ui/ui.c \
|
ui/ui.c \
|
||||||
x11/iconcache.c \
|
x11/atomnames.h \
|
||||||
x11/iconcache.h \
|
|
||||||
x11/async-getprop.c \
|
|
||||||
x11/async-getprop.h \
|
|
||||||
x11/events.c \
|
x11/events.c \
|
||||||
x11/events.h \
|
x11/events.h \
|
||||||
x11/group-private.h \
|
x11/group-private.h \
|
||||||
@@ -220,6 +231,8 @@ libmutter_la_SOURCES = \
|
|||||||
x11/group-props.h \
|
x11/group-props.h \
|
||||||
x11/group.c \
|
x11/group.c \
|
||||||
meta/group.h \
|
meta/group.h \
|
||||||
|
x11/iconcache.c \
|
||||||
|
x11/iconcache.h \
|
||||||
x11/session.c \
|
x11/session.c \
|
||||||
x11/session.h \
|
x11/session.h \
|
||||||
x11/window-props.c \
|
x11/window-props.c \
|
||||||
@@ -241,6 +254,8 @@ libmutter_la_SOURCES += \
|
|||||||
wayland/meta-wayland-private.h \
|
wayland/meta-wayland-private.h \
|
||||||
wayland/meta-xwayland.c \
|
wayland/meta-xwayland.c \
|
||||||
wayland/meta-xwayland.h \
|
wayland/meta-xwayland.h \
|
||||||
|
wayland/meta-xwayland-selection.c \
|
||||||
|
wayland/meta-xwayland-selection-private.h \
|
||||||
wayland/meta-xwayland-private.h \
|
wayland/meta-xwayland-private.h \
|
||||||
wayland/meta-wayland-buffer.c \
|
wayland/meta-wayland-buffer.c \
|
||||||
wayland/meta-wayland-buffer.h \
|
wayland/meta-wayland-buffer.h \
|
||||||
@@ -248,10 +263,25 @@ libmutter_la_SOURCES += \
|
|||||||
wayland/meta-wayland-region.h \
|
wayland/meta-wayland-region.h \
|
||||||
wayland/meta-wayland-data-device.c \
|
wayland/meta-wayland-data-device.c \
|
||||||
wayland/meta-wayland-data-device.h \
|
wayland/meta-wayland-data-device.h \
|
||||||
|
wayland/meta-wayland-data-device-private.h \
|
||||||
|
wayland/meta-wayland-pointer-gestures.c \
|
||||||
|
wayland/meta-wayland-pointer-gestures.h \
|
||||||
|
wayland/meta-wayland-pointer-gesture-swipe.c \
|
||||||
|
wayland/meta-wayland-pointer-gesture-swipe.h \
|
||||||
|
wayland/meta-wayland-pointer-gesture-pinch.c \
|
||||||
|
wayland/meta-wayland-pointer-gesture-pinch.h \
|
||||||
wayland/meta-wayland-keyboard.c \
|
wayland/meta-wayland-keyboard.c \
|
||||||
wayland/meta-wayland-keyboard.h \
|
wayland/meta-wayland-keyboard.h \
|
||||||
wayland/meta-wayland-pointer.c \
|
wayland/meta-wayland-pointer.c \
|
||||||
wayland/meta-wayland-pointer.h \
|
wayland/meta-wayland-pointer.h \
|
||||||
|
wayland/meta-wayland-pointer-constraints.c \
|
||||||
|
wayland/meta-wayland-pointer-constraints.h \
|
||||||
|
wayland/meta-pointer-lock-wayland.c \
|
||||||
|
wayland/meta-pointer-lock-wayland.h \
|
||||||
|
wayland/meta-pointer-confinement-wayland.c \
|
||||||
|
wayland/meta-pointer-confinement-wayland.h \
|
||||||
|
wayland/meta-wayland-popup.c \
|
||||||
|
wayland/meta-wayland-popup.h \
|
||||||
wayland/meta-wayland-seat.c \
|
wayland/meta-wayland-seat.c \
|
||||||
wayland/meta-wayland-seat.h \
|
wayland/meta-wayland-seat.h \
|
||||||
wayland/meta-wayland-touch.c \
|
wayland/meta-wayland-touch.c \
|
||||||
@@ -262,8 +292,8 @@ libmutter_la_SOURCES += \
|
|||||||
wayland/meta-wayland-versions.h \
|
wayland/meta-wayland-versions.h \
|
||||||
wayland/meta-wayland-outputs.c \
|
wayland/meta-wayland-outputs.c \
|
||||||
wayland/meta-wayland-outputs.h \
|
wayland/meta-wayland-outputs.h \
|
||||||
wayland/window-wayland.c \
|
wayland/meta-window-wayland.c \
|
||||||
wayland/window-wayland.h \
|
wayland/meta-window-wayland.h \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
@@ -315,9 +345,11 @@ libmutterinclude_headers = \
|
|||||||
meta/meta-cursor-tracker.h \
|
meta/meta-cursor-tracker.h \
|
||||||
meta/meta-idle-monitor.h \
|
meta/meta-idle-monitor.h \
|
||||||
meta/meta-plugin.h \
|
meta/meta-plugin.h \
|
||||||
|
meta/meta-monitor-manager.h \
|
||||||
meta/meta-shaped-texture.h \
|
meta/meta-shaped-texture.h \
|
||||||
meta/meta-shadow-factory.h \
|
meta/meta-shadow-factory.h \
|
||||||
meta/meta-window-actor.h \
|
meta/meta-window-actor.h \
|
||||||
|
meta/meta-window-shape.h \
|
||||||
meta/prefs.h \
|
meta/prefs.h \
|
||||||
meta/screen.h \
|
meta/screen.h \
|
||||||
meta/theme.h \
|
meta/theme.h \
|
||||||
@@ -328,22 +360,18 @@ libmutterinclude_headers = \
|
|||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
libmutterinclude_built_headers = \
|
libmutterinclude_built_headers = \
|
||||||
meta/meta-version.h
|
meta/meta-version.h \
|
||||||
|
meta/meta-enum-types.h \
|
||||||
|
$(NULL)
|
||||||
|
|
||||||
libmutterinclude_base_headers = \
|
libmutterinclude_base_headers = \
|
||||||
$(libmutterinclude_headers) \
|
$(libmutterinclude_headers) \
|
||||||
$(libmutterinclude_built_headers)
|
$(libmutterinclude_built_headers)
|
||||||
|
|
||||||
# Excluded from scanning for introspection but installed
|
|
||||||
# atomnames.h: macros cause problems for scanning process
|
|
||||||
libmutterinclude_extra_headers = \
|
|
||||||
meta/atomnames.h
|
|
||||||
|
|
||||||
libmutterincludedir = $(includedir)/mutter/meta
|
libmutterincludedir = $(includedir)/mutter/meta
|
||||||
|
|
||||||
libmutterinclude_HEADERS = \
|
libmutterinclude_HEADERS = \
|
||||||
$(libmutterinclude_headers) \
|
$(libmutterinclude_headers)
|
||||||
$(libmutterinclude_extra_headers)
|
|
||||||
|
|
||||||
nodist_libmutterinclude_HEADERS = \
|
nodist_libmutterinclude_HEADERS = \
|
||||||
$(libmutterinclude_built_headers)
|
$(libmutterinclude_built_headers)
|
||||||
@@ -386,7 +414,6 @@ Meta-$(api_version).gir: libmutter.la
|
|||||||
@META_GIR@_CFLAGS = $(AM_CPPFLAGS)
|
@META_GIR@_CFLAGS = $(AM_CPPFLAGS)
|
||||||
@META_GIR@_LIBS = libmutter.la
|
@META_GIR@_LIBS = libmutter.la
|
||||||
@META_GIR@_FILES = \
|
@META_GIR@_FILES = \
|
||||||
mutter-enum-types.h \
|
|
||||||
$(libmutterinclude_base_headers) \
|
$(libmutterinclude_base_headers) \
|
||||||
$(filter %.c,$(libmutter_la_SOURCES) $(nodist_libmutter_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
|
||||||
@@ -409,8 +436,8 @@ pkgconfig_DATA = libmutter.pc
|
|||||||
EXTRA_DIST += \
|
EXTRA_DIST += \
|
||||||
$(wayland_protocols) \
|
$(wayland_protocols) \
|
||||||
libmutter.pc.in \
|
libmutter.pc.in \
|
||||||
mutter-enum-types.h.in \
|
meta-enum-types.h.in \
|
||||||
mutter-enum-types.c.in \
|
meta-enum-types.c.in \
|
||||||
org.freedesktop.login1.xml \
|
org.freedesktop.login1.xml \
|
||||||
org.gnome.Mutter.DisplayConfig.xml \
|
org.gnome.Mutter.DisplayConfig.xml \
|
||||||
org.gnome.Mutter.IdleMonitor.xml \
|
org.gnome.Mutter.IdleMonitor.xml \
|
||||||
@@ -420,26 +447,26 @@ BUILT_SOURCES = \
|
|||||||
$(mutter_built_sources) \
|
$(mutter_built_sources) \
|
||||||
$(libmutterinclude_built_headers)
|
$(libmutterinclude_built_headers)
|
||||||
|
|
||||||
MUTTER_STAMP_FILES = stamp-mutter-enum-types.h
|
MUTTER_STAMP_FILES = stamp-meta-enum-types.h
|
||||||
CLEANFILES += $(MUTTER_STAMP_FILES)
|
CLEANFILES += $(MUTTER_STAMP_FILES)
|
||||||
|
|
||||||
mutter-enum-types.h: stamp-mutter-enum-types.h Makefile
|
meta/meta-enum-types.h: stamp-meta-enum-types.h Makefile
|
||||||
@true
|
@true
|
||||||
stamp-mutter-enum-types.h: $(libmutterinclude_base_headers) mutter-enum-types.h.in
|
stamp-meta-enum-types.h: $(libmutterinclude_headers) meta-enum-types.h.in
|
||||||
$(AM_V_GEN) ( cd $(srcdir) && \
|
$(AM_V_GEN) ( cd $(srcdir) && \
|
||||||
$(GLIB_MKENUMS) \
|
$(GLIB_MKENUMS) \
|
||||||
--template mutter-enum-types.h.in \
|
--template meta-enum-types.h.in \
|
||||||
$(libmutterinclude_base_headers) ) >> xgen-teth && \
|
$(libmutterinclude_base_headers) ) >> xgen-teth && \
|
||||||
(cmp -s xgen-teth mutter-enum-types.h || cp xgen-teth mutter-enum-types.h) && \
|
(cmp -s xgen-teth meta/meta-enum-types.h || cp xgen-teth meta/meta-enum-types.h) && \
|
||||||
rm -f xgen-teth && \
|
rm -f xgen-teth && \
|
||||||
echo timestamp > $(@F)
|
echo timestamp > $(@F)
|
||||||
|
|
||||||
mutter-enum-types.c: stamp-mutter-enum-types.h mutter-enum-types.c.in
|
meta-enum-types.c: stamp-meta-enum-types.h meta-enum-types.c.in
|
||||||
$(AM_V_GEN) ( cd $(srcdir) && \
|
$(AM_V_GEN) ( cd $(srcdir) && \
|
||||||
$(GLIB_MKENUMS) \
|
$(GLIB_MKENUMS) \
|
||||||
--template mutter-enum-types.c.in \
|
--template meta-enum-types.c.in \
|
||||||
$(libmutterinclude_base_headers) ) >> xgen-tetc && \
|
$(libmutterinclude_base_headers) ) >> xgen-tetc && \
|
||||||
cp xgen-tetc mutter-enum-types.c && \
|
cp xgen-tetc meta-enum-types.c && \
|
||||||
rm -f xgen-tetc
|
rm -f xgen-tetc
|
||||||
|
|
||||||
dbus_display_config_built_sources = meta-dbus-display-config.c meta-dbus-display-config.h
|
dbus_display_config_built_sources = meta-dbus-display-config.c meta-dbus-display-config.h
|
||||||
@@ -468,6 +495,20 @@ $(dbus_login1_built_sources) : Makefile.am org.freedesktop.login1.xml
|
|||||||
--generate-c-code meta-dbus-login1 \
|
--generate-c-code meta-dbus-login1 \
|
||||||
$(srcdir)/org.freedesktop.login1.xml
|
$(srcdir)/org.freedesktop.login1.xml
|
||||||
|
|
||||||
|
.SECONDEXPANSION:
|
||||||
|
|
||||||
|
define protostability
|
||||||
|
$(shell echo $1 | sed 's/.*\(\<unstable\>\|\<stable\>\).*/\1/')
|
||||||
|
endef
|
||||||
|
|
||||||
|
define protoname
|
||||||
|
$(shell echo $1 | sed 's/\([a-z\-]\+\)-[a-z]\+-v[0-9]\+/\1/')
|
||||||
|
endef
|
||||||
|
|
||||||
|
%-protocol.c : $(WAYLAND_PROTOCOLS_DATADIR)/$$(call protostability,$$*)/$$(call protoname,$$*)/$$*.xml
|
||||||
|
$(AM_V_GEN)$(WAYLAND_SCANNER) code < $< > $@
|
||||||
|
%-server-protocol.h : $(WAYLAND_PROTOCOLS_DATADIR)/$$(call protostability,$$*)/$$(call protoname,$$*)/$$*.xml
|
||||||
|
$(AM_V_GEN)$(WAYLAND_SCANNER) server-header < $< > $@
|
||||||
%-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
|
||||||
|
|||||||
@@ -33,7 +33,8 @@
|
|||||||
#include <meta/meta-backend.h>
|
#include <meta/meta-backend.h>
|
||||||
#include <meta/meta-idle-monitor.h>
|
#include <meta/meta-idle-monitor.h>
|
||||||
#include "meta-cursor-renderer.h"
|
#include "meta-cursor-renderer.h"
|
||||||
#include "meta-monitor-manager.h"
|
#include "meta-monitor-manager-private.h"
|
||||||
|
#include "backends/meta-pointer-constraint.h"
|
||||||
|
|
||||||
#define DEFAULT_XKB_RULES_FILE "evdev"
|
#define DEFAULT_XKB_RULES_FILE "evdev"
|
||||||
#define DEFAULT_XKB_MODEL "pc105+inet"
|
#define DEFAULT_XKB_MODEL "pc105+inet"
|
||||||
@@ -50,6 +51,9 @@ struct _MetaBackend
|
|||||||
GObject parent;
|
GObject parent;
|
||||||
|
|
||||||
GHashTable *device_monitors;
|
GHashTable *device_monitors;
|
||||||
|
gint current_device_id;
|
||||||
|
|
||||||
|
MetaPointerConstraint *client_pointer_constraint;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _MetaBackendClass
|
struct _MetaBackendClass
|
||||||
@@ -86,6 +90,13 @@ struct _MetaBackendClass
|
|||||||
|
|
||||||
void (* update_screen_size) (MetaBackend *backend, int width, int height);
|
void (* update_screen_size) (MetaBackend *backend, int width, int height);
|
||||||
void (* select_stage_events) (MetaBackend *backend);
|
void (* select_stage_events) (MetaBackend *backend);
|
||||||
|
|
||||||
|
gboolean (* get_relative_motion_deltas) (MetaBackend *backend,
|
||||||
|
const ClutterEvent *event,
|
||||||
|
double *dx,
|
||||||
|
double *dy,
|
||||||
|
double *dx_unaccel,
|
||||||
|
double *dy_unaccel);
|
||||||
};
|
};
|
||||||
|
|
||||||
MetaIdleMonitor * meta_backend_get_idle_monitor (MetaBackend *backend,
|
MetaIdleMonitor * meta_backend_get_idle_monitor (MetaBackend *backend,
|
||||||
@@ -106,4 +117,17 @@ void meta_backend_warp_pointer (MetaBackend *backend,
|
|||||||
|
|
||||||
struct xkb_keymap * meta_backend_get_keymap (MetaBackend *backend);
|
struct xkb_keymap * meta_backend_get_keymap (MetaBackend *backend);
|
||||||
|
|
||||||
|
void meta_backend_update_last_device (MetaBackend *backend,
|
||||||
|
int device_id);
|
||||||
|
|
||||||
|
gboolean meta_backend_get_relative_motion_deltas (MetaBackend *backend,
|
||||||
|
const ClutterEvent *event,
|
||||||
|
double *dx,
|
||||||
|
double *dy,
|
||||||
|
double *dx_unaccel,
|
||||||
|
double *dy_unaccel);
|
||||||
|
|
||||||
|
void meta_backend_set_client_pointer_constraint (MetaBackend *backend,
|
||||||
|
MetaPointerConstraint *constraint);
|
||||||
|
|
||||||
#endif /* META_BACKEND_PRIVATE_H */
|
#endif /* META_BACKEND_PRIVATE_H */
|
||||||
|
|||||||
@@ -24,11 +24,14 @@
|
|||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include <meta/meta-backend.h>
|
#include <meta/meta-backend.h>
|
||||||
#include "meta-backend-private.h"
|
#include "meta-backend-private.h"
|
||||||
#include "meta-input-settings-private.h"
|
#include "meta-input-settings-private.h"
|
||||||
|
|
||||||
#include "backends/x11/meta-backend-x11.h"
|
#include "backends/x11/meta-backend-x11.h"
|
||||||
|
#include "meta-cursor-tracker-private.h"
|
||||||
#include "meta-stage.h"
|
#include "meta-stage.h"
|
||||||
|
|
||||||
#ifdef HAVE_NATIVE_BACKEND
|
#ifdef HAVE_NATIVE_BACKEND
|
||||||
@@ -37,6 +40,8 @@
|
|||||||
|
|
||||||
#include "backends/meta-idle-monitor-private.h"
|
#include "backends/meta-idle-monitor-private.h"
|
||||||
|
|
||||||
|
#include "backends/meta-monitor-manager-dummy.h"
|
||||||
|
|
||||||
static MetaBackend *_backend;
|
static MetaBackend *_backend;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -89,12 +94,37 @@ meta_backend_sync_screen_size (MetaBackend *backend)
|
|||||||
META_BACKEND_GET_CLASS (backend)->update_screen_size (backend, width, height);
|
META_BACKEND_GET_CLASS (backend)->update_screen_size (backend, width, height);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
center_pointer (MetaBackend *backend)
|
||||||
|
{
|
||||||
|
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
|
||||||
|
MetaMonitorInfo *monitors, *primary;
|
||||||
|
guint n_monitors;
|
||||||
|
|
||||||
|
monitors = meta_monitor_manager_get_monitor_infos (priv->monitor_manager, &n_monitors);
|
||||||
|
primary = &monitors[meta_monitor_manager_get_primary_index (priv->monitor_manager)];
|
||||||
|
meta_backend_warp_pointer (backend,
|
||||||
|
primary->rect.x + primary->rect.width / 2,
|
||||||
|
primary->rect.y + primary->rect.height / 2);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
on_monitors_changed (MetaMonitorManager *monitors,
|
on_monitors_changed (MetaMonitorManager *monitors,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
MetaBackend *backend = META_BACKEND (user_data);
|
MetaBackend *backend = META_BACKEND (user_data);
|
||||||
|
ClutterDeviceManager *manager = clutter_device_manager_get_default ();
|
||||||
|
ClutterInputDevice *device = clutter_device_manager_get_core_device (manager, CLUTTER_POINTER_DEVICE);
|
||||||
|
ClutterPoint point;
|
||||||
|
|
||||||
meta_backend_sync_screen_size (backend);
|
meta_backend_sync_screen_size (backend);
|
||||||
|
|
||||||
|
if (clutter_input_device_get_coords (device, NULL, &point))
|
||||||
|
{
|
||||||
|
/* If we're outside all monitors, warp the pointer back inside */
|
||||||
|
if (meta_monitor_manager_get_monitor_at_point (monitors, point.x, point.y) < 0)
|
||||||
|
center_pointer (backend);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static MetaIdleMonitor *
|
static MetaIdleMonitor *
|
||||||
@@ -134,6 +164,55 @@ on_device_added (ClutterDeviceManager *device_manager,
|
|||||||
create_device_monitor (backend, device_id);
|
create_device_monitor (backend, device_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline gboolean
|
||||||
|
device_is_slave_touchscreen (ClutterInputDevice *device)
|
||||||
|
{
|
||||||
|
return (clutter_input_device_get_device_mode (device) != CLUTTER_INPUT_MODE_MASTER &&
|
||||||
|
clutter_input_device_get_device_type (device) == CLUTTER_TOUCHSCREEN_DEVICE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline gboolean
|
||||||
|
check_has_pointing_device (ClutterDeviceManager *manager)
|
||||||
|
{
|
||||||
|
const GSList *devices;
|
||||||
|
|
||||||
|
devices = clutter_device_manager_peek_devices (manager);
|
||||||
|
|
||||||
|
for (; devices; devices = devices->next)
|
||||||
|
{
|
||||||
|
ClutterInputDevice *device = devices->data;
|
||||||
|
|
||||||
|
if (clutter_input_device_get_device_mode (device) == CLUTTER_INPUT_MODE_MASTER)
|
||||||
|
continue;
|
||||||
|
if (clutter_input_device_get_device_type (device) == CLUTTER_TOUCHSCREEN_DEVICE ||
|
||||||
|
clutter_input_device_get_device_type (device) == CLUTTER_KEYBOARD_DEVICE)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline gboolean
|
||||||
|
check_has_slave_touchscreen (ClutterDeviceManager *manager)
|
||||||
|
{
|
||||||
|
const GSList *devices;
|
||||||
|
|
||||||
|
devices = clutter_device_manager_peek_devices (manager);
|
||||||
|
|
||||||
|
for (; devices; devices = devices->next)
|
||||||
|
{
|
||||||
|
ClutterInputDevice *device = devices->data;
|
||||||
|
|
||||||
|
if (clutter_input_device_get_device_mode (device) != CLUTTER_INPUT_MODE_MASTER &&
|
||||||
|
clutter_input_device_get_device_type (device) == CLUTTER_TOUCHSCREEN_DEVICE)
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
on_device_removed (ClutterDeviceManager *device_manager,
|
on_device_removed (ClutterDeviceManager *device_manager,
|
||||||
ClutterInputDevice *device,
|
ClutterInputDevice *device,
|
||||||
@@ -143,6 +222,41 @@ on_device_removed (ClutterDeviceManager *device_manager,
|
|||||||
int device_id = clutter_input_device_get_device_id (device);
|
int device_id = clutter_input_device_get_device_id (device);
|
||||||
|
|
||||||
destroy_device_monitor (backend, device_id);
|
destroy_device_monitor (backend, device_id);
|
||||||
|
|
||||||
|
/* If the device the user last interacted goes away, check again pointer
|
||||||
|
* visibility.
|
||||||
|
*/
|
||||||
|
if (backend->current_device_id == device_id)
|
||||||
|
{
|
||||||
|
MetaCursorTracker *cursor_tracker = meta_cursor_tracker_get_for_screen (NULL);
|
||||||
|
gboolean has_touchscreen, has_pointing_device;
|
||||||
|
ClutterInputDeviceType device_type;
|
||||||
|
|
||||||
|
device_type = clutter_input_device_get_device_type (device);
|
||||||
|
has_touchscreen = check_has_slave_touchscreen (device_manager);
|
||||||
|
|
||||||
|
if (device_type == CLUTTER_TOUCHSCREEN_DEVICE && has_touchscreen)
|
||||||
|
{
|
||||||
|
/* There's more touchscreens left, keep the pointer hidden */
|
||||||
|
meta_cursor_tracker_set_pointer_visible (cursor_tracker, FALSE);
|
||||||
|
}
|
||||||
|
else if (device_type != CLUTTER_KEYBOARD_DEVICE)
|
||||||
|
{
|
||||||
|
has_pointing_device = check_has_pointing_device (device_manager);
|
||||||
|
meta_cursor_tracker_set_pointer_visible (cursor_tracker,
|
||||||
|
has_pointing_device &&
|
||||||
|
!has_touchscreen);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static MetaMonitorManager *
|
||||||
|
create_monitor_manager (MetaBackend *backend)
|
||||||
|
{
|
||||||
|
if (g_getenv ("META_DUMMY_MONITORS"))
|
||||||
|
return g_object_new (META_TYPE_MONITOR_MANAGER_DUMMY, NULL);
|
||||||
|
|
||||||
|
return META_BACKEND_GET_CLASS (backend)->create_monitor_manager (backend);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -154,7 +268,7 @@ meta_backend_real_post_init (MetaBackend *backend)
|
|||||||
clutter_actor_realize (priv->stage);
|
clutter_actor_realize (priv->stage);
|
||||||
META_BACKEND_GET_CLASS (backend)->select_stage_events (backend);
|
META_BACKEND_GET_CLASS (backend)->select_stage_events (backend);
|
||||||
|
|
||||||
priv->monitor_manager = META_BACKEND_GET_CLASS (backend)->create_monitor_manager (backend);
|
priv->monitor_manager = create_monitor_manager (backend);
|
||||||
|
|
||||||
g_signal_connect (priv->monitor_manager, "monitors-changed",
|
g_signal_connect (priv->monitor_manager, "monitors-changed",
|
||||||
G_CALLBACK (on_monitors_changed), backend);
|
G_CALLBACK (on_monitors_changed), backend);
|
||||||
@@ -166,7 +280,9 @@ meta_backend_real_post_init (MetaBackend *backend)
|
|||||||
NULL, (GDestroyNotify) g_object_unref);
|
NULL, (GDestroyNotify) g_object_unref);
|
||||||
|
|
||||||
{
|
{
|
||||||
|
MetaCursorTracker *cursor_tracker;
|
||||||
ClutterDeviceManager *manager;
|
ClutterDeviceManager *manager;
|
||||||
|
gboolean has_touchscreen = FALSE;
|
||||||
GSList *devices, *l;
|
GSList *devices, *l;
|
||||||
|
|
||||||
/* Create the core device monitor. */
|
/* Create the core device monitor. */
|
||||||
@@ -184,12 +300,18 @@ meta_backend_real_post_init (MetaBackend *backend)
|
|||||||
{
|
{
|
||||||
ClutterInputDevice *device = l->data;
|
ClutterInputDevice *device = l->data;
|
||||||
on_device_added (manager, device, backend);
|
on_device_added (manager, device, backend);
|
||||||
|
has_touchscreen |= device_is_slave_touchscreen (device);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cursor_tracker = meta_cursor_tracker_get_for_screen (NULL);
|
||||||
|
meta_cursor_tracker_set_pointer_visible (cursor_tracker, !has_touchscreen);
|
||||||
|
|
||||||
g_slist_free (devices);
|
g_slist_free (devices);
|
||||||
}
|
}
|
||||||
|
|
||||||
priv->input_settings = meta_input_settings_create ();
|
priv->input_settings = meta_input_settings_create ();
|
||||||
|
|
||||||
|
center_pointer (backend);
|
||||||
}
|
}
|
||||||
|
|
||||||
static MetaCursorRenderer *
|
static MetaCursorRenderer *
|
||||||
@@ -231,6 +353,17 @@ meta_backend_real_select_stage_events (MetaBackend *backend)
|
|||||||
/* Do nothing */
|
/* Do nothing */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
meta_backend_real_get_relative_motion_deltas (MetaBackend *backend,
|
||||||
|
const ClutterEvent *event,
|
||||||
|
double *dx,
|
||||||
|
double *dy,
|
||||||
|
double *dx_unaccel,
|
||||||
|
double *dy_unaccel)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_backend_class_init (MetaBackendClass *klass)
|
meta_backend_class_init (MetaBackendClass *klass)
|
||||||
{
|
{
|
||||||
@@ -244,6 +377,7 @@ meta_backend_class_init (MetaBackendClass *klass)
|
|||||||
klass->ungrab_device = meta_backend_real_ungrab_device;
|
klass->ungrab_device = meta_backend_real_ungrab_device;
|
||||||
klass->update_screen_size = meta_backend_real_update_screen_size;
|
klass->update_screen_size = meta_backend_real_update_screen_size;
|
||||||
klass->select_stage_events = meta_backend_real_select_stage_events;
|
klass->select_stage_events = meta_backend_real_select_stage_events;
|
||||||
|
klass->get_relative_motion_deltas = meta_backend_real_get_relative_motion_deltas;
|
||||||
|
|
||||||
g_signal_new ("keymap-changed",
|
g_signal_new ("keymap-changed",
|
||||||
G_TYPE_FROM_CLASS (object_class),
|
G_TYPE_FROM_CLASS (object_class),
|
||||||
@@ -257,6 +391,12 @@ meta_backend_class_init (MetaBackendClass *klass)
|
|||||||
0,
|
0,
|
||||||
NULL, NULL, NULL,
|
NULL, NULL, NULL,
|
||||||
G_TYPE_NONE, 1, G_TYPE_UINT);
|
G_TYPE_NONE, 1, G_TYPE_UINT);
|
||||||
|
g_signal_new ("last-device-changed",
|
||||||
|
G_TYPE_FROM_CLASS (object_class),
|
||||||
|
G_SIGNAL_RUN_LAST,
|
||||||
|
0,
|
||||||
|
NULL, NULL, NULL,
|
||||||
|
G_TYPE_NONE, 1, G_TYPE_INT);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -377,6 +517,71 @@ meta_backend_get_stage (MetaBackend *backend)
|
|||||||
return priv->stage;
|
return priv->stage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_backend_update_last_device (MetaBackend *backend,
|
||||||
|
int device_id)
|
||||||
|
{
|
||||||
|
ClutterInputDeviceType device_type;
|
||||||
|
MetaCursorTracker *cursor_tracker;
|
||||||
|
ClutterDeviceManager *manager;
|
||||||
|
ClutterInputDevice *device;
|
||||||
|
|
||||||
|
if (backend->current_device_id == device_id)
|
||||||
|
return;
|
||||||
|
|
||||||
|
manager = clutter_device_manager_get_default ();
|
||||||
|
device = clutter_device_manager_get_device (manager, device_id);
|
||||||
|
|
||||||
|
if (!device ||
|
||||||
|
clutter_input_device_get_device_mode (device) == CLUTTER_INPUT_MODE_MASTER)
|
||||||
|
return;
|
||||||
|
|
||||||
|
device_type = clutter_input_device_get_device_type (device);
|
||||||
|
|
||||||
|
cursor_tracker = meta_cursor_tracker_get_for_screen (NULL);
|
||||||
|
backend->current_device_id = device_id;
|
||||||
|
g_signal_emit_by_name (backend, "last-device-changed", device_id);
|
||||||
|
|
||||||
|
if (device_type == CLUTTER_KEYBOARD_DEVICE)
|
||||||
|
return;
|
||||||
|
|
||||||
|
switch (device_type)
|
||||||
|
{
|
||||||
|
case CLUTTER_TOUCHSCREEN_DEVICE:
|
||||||
|
meta_cursor_tracker_set_pointer_visible (cursor_tracker, FALSE);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
meta_cursor_tracker_set_pointer_visible (cursor_tracker, TRUE);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
meta_backend_get_relative_motion_deltas (MetaBackend *backend,
|
||||||
|
const ClutterEvent *event,
|
||||||
|
double *dx,
|
||||||
|
double *dy,
|
||||||
|
double *dx_unaccel,
|
||||||
|
double *dy_unaccel)
|
||||||
|
{
|
||||||
|
MetaBackendClass *klass = META_BACKEND_GET_CLASS (backend);
|
||||||
|
return klass->get_relative_motion_deltas (backend,
|
||||||
|
event,
|
||||||
|
dx, dy,
|
||||||
|
dx_unaccel, dy_unaccel);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_backend_set_client_pointer_constraint (MetaBackend *backend,
|
||||||
|
MetaPointerConstraint *constraint)
|
||||||
|
{
|
||||||
|
g_assert (!constraint || (constraint && !backend->client_pointer_constraint));
|
||||||
|
|
||||||
|
g_clear_object (&backend->client_pointer_constraint);
|
||||||
|
if (constraint)
|
||||||
|
backend->client_pointer_constraint = g_object_ref (constraint);
|
||||||
|
}
|
||||||
|
|
||||||
static GType
|
static GType
|
||||||
get_backend_type (void)
|
get_backend_type (void)
|
||||||
{
|
{
|
||||||
@@ -461,7 +666,10 @@ meta_clutter_init (void)
|
|||||||
meta_create_backend ();
|
meta_create_backend ();
|
||||||
|
|
||||||
if (clutter_init (NULL, NULL) != CLUTTER_INIT_SUCCESS)
|
if (clutter_init (NULL, NULL) != CLUTTER_INIT_SUCCESS)
|
||||||
g_error ("Unable to initialize Clutter.\n");
|
{
|
||||||
|
g_warning ("Unable to initialize Clutter.\n");
|
||||||
|
exit (1);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* XXX: We cannot handle high dpi scaling yet, so fix the scale to 1
|
* XXX: We cannot handle high dpi scaling yet, so fix the scale to 1
|
||||||
|
|||||||
@@ -26,6 +26,8 @@
|
|||||||
#ifndef META_BARRIER_PRIVATE_H
|
#ifndef META_BARRIER_PRIVATE_H
|
||||||
#define META_BARRIER_PRIVATE_H
|
#define META_BARRIER_PRIVATE_H
|
||||||
|
|
||||||
|
#include "core/meta-border.h"
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
#define META_TYPE_BARRIER_IMPL (meta_barrier_impl_get_type ())
|
#define META_TYPE_BARRIER_IMPL (meta_barrier_impl_get_type ())
|
||||||
@@ -67,14 +69,7 @@ G_END_DECLS
|
|||||||
struct _MetaBarrierPrivate
|
struct _MetaBarrierPrivate
|
||||||
{
|
{
|
||||||
MetaDisplay *display;
|
MetaDisplay *display;
|
||||||
|
MetaBorder border;
|
||||||
int x1;
|
|
||||||
int y1;
|
|
||||||
int x2;
|
|
||||||
int y2;
|
|
||||||
|
|
||||||
MetaBarrierDirection directions;
|
|
||||||
|
|
||||||
MetaBarrierImpl *impl;
|
MetaBarrierImpl *impl;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
#include "backends/native/meta-barrier-native.h"
|
#include "backends/native/meta-barrier-native.h"
|
||||||
#include "backends/x11/meta-backend-x11.h"
|
#include "backends/x11/meta-backend-x11.h"
|
||||||
#include "backends/x11/meta-barrier-x11.h"
|
#include "backends/x11/meta-barrier-x11.h"
|
||||||
#include "mutter-enum-types.h"
|
#include <meta/meta-enum-types.h>
|
||||||
|
|
||||||
G_DEFINE_TYPE (MetaBarrier, meta_barrier, G_TYPE_OBJECT)
|
G_DEFINE_TYPE (MetaBarrier, meta_barrier, G_TYPE_OBJECT)
|
||||||
G_DEFINE_TYPE (MetaBarrierImpl, meta_barrier_impl, G_TYPE_OBJECT)
|
G_DEFINE_TYPE (MetaBarrierImpl, meta_barrier_impl, G_TYPE_OBJECT)
|
||||||
@@ -61,19 +61,20 @@ meta_barrier_get_property (GObject *object,
|
|||||||
g_value_set_object (value, priv->display);
|
g_value_set_object (value, priv->display);
|
||||||
break;
|
break;
|
||||||
case PROP_X1:
|
case PROP_X1:
|
||||||
g_value_set_int (value, priv->x1);
|
g_value_set_int (value, priv->border.line.a.x);
|
||||||
break;
|
break;
|
||||||
case PROP_Y1:
|
case PROP_Y1:
|
||||||
g_value_set_int (value, priv->y1);
|
g_value_set_int (value, priv->border.line.a.y);
|
||||||
break;
|
break;
|
||||||
case PROP_X2:
|
case PROP_X2:
|
||||||
g_value_set_int (value, priv->x2);
|
g_value_set_int (value, priv->border.line.b.x);
|
||||||
break;
|
break;
|
||||||
case PROP_Y2:
|
case PROP_Y2:
|
||||||
g_value_set_int (value, priv->y2);
|
g_value_set_int (value, priv->border.line.b.y);
|
||||||
break;
|
break;
|
||||||
case PROP_DIRECTIONS:
|
case PROP_DIRECTIONS:
|
||||||
g_value_set_flags (value, priv->directions);
|
g_value_set_flags (value,
|
||||||
|
meta_border_get_allows_directions (&priv->border));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
@@ -95,19 +96,20 @@ meta_barrier_set_property (GObject *object,
|
|||||||
priv->display = g_value_get_object (value);
|
priv->display = g_value_get_object (value);
|
||||||
break;
|
break;
|
||||||
case PROP_X1:
|
case PROP_X1:
|
||||||
priv->x1 = g_value_get_int (value);
|
priv->border.line.a.x = g_value_get_int (value);
|
||||||
break;
|
break;
|
||||||
case PROP_Y1:
|
case PROP_Y1:
|
||||||
priv->y1 = g_value_get_int (value);
|
priv->border.line.a.y = g_value_get_int (value);
|
||||||
break;
|
break;
|
||||||
case PROP_X2:
|
case PROP_X2:
|
||||||
priv->x2 = g_value_get_int (value);
|
priv->border.line.b.x = g_value_get_int (value);
|
||||||
break;
|
break;
|
||||||
case PROP_Y2:
|
case PROP_Y2:
|
||||||
priv->y2 = g_value_get_int (value);
|
priv->border.line.b.y = g_value_get_int (value);
|
||||||
break;
|
break;
|
||||||
case PROP_DIRECTIONS:
|
case PROP_DIRECTIONS:
|
||||||
priv->directions = g_value_get_flags (value);
|
meta_border_set_allows_directions (&priv->border,
|
||||||
|
g_value_get_flags (value));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
@@ -166,7 +168,8 @@ meta_barrier_constructed (GObject *object)
|
|||||||
MetaBarrier *barrier = META_BARRIER (object);
|
MetaBarrier *barrier = META_BARRIER (object);
|
||||||
MetaBarrierPrivate *priv = barrier->priv;
|
MetaBarrierPrivate *priv = barrier->priv;
|
||||||
|
|
||||||
g_return_if_fail (priv->x1 == priv->x2 || priv->y1 == priv->y2);
|
g_return_if_fail (priv->border.line.a.x == priv->border.line.b.x ||
|
||||||
|
priv->border.line.a.y == priv->border.line.b.y);
|
||||||
|
|
||||||
#if defined(HAVE_NATIVE_BACKEND)
|
#if defined(HAVE_NATIVE_BACKEND)
|
||||||
if (META_IS_BACKEND_NATIVE (meta_get_backend ()))
|
if (META_IS_BACKEND_NATIVE (meta_get_backend ()))
|
||||||
|
|||||||
@@ -1,59 +0,0 @@
|
|||||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright 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, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
* Author: Giovanni Campagna <gcampagn@redhat.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef META_CURSOR_PRIVATE_H
|
|
||||||
#define META_CURSOR_PRIVATE_H
|
|
||||||
|
|
||||||
#include "meta-cursor.h"
|
|
||||||
|
|
||||||
#include <cogl/cogl.h>
|
|
||||||
|
|
||||||
#ifdef HAVE_NATIVE_BACKEND
|
|
||||||
#include <gbm.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
CoglTexture2D *texture;
|
|
||||||
int hot_x, hot_y;
|
|
||||||
|
|
||||||
#ifdef HAVE_NATIVE_BACKEND
|
|
||||||
struct gbm_bo *bo;
|
|
||||||
#endif
|
|
||||||
} MetaCursorImage;
|
|
||||||
|
|
||||||
struct _MetaCursorReference {
|
|
||||||
int ref_count;
|
|
||||||
|
|
||||||
MetaCursor cursor;
|
|
||||||
MetaCursorImage image;
|
|
||||||
};
|
|
||||||
|
|
||||||
CoglTexture *meta_cursor_reference_get_cogl_texture (MetaCursorReference *cursor,
|
|
||||||
int *hot_x,
|
|
||||||
int *hot_y);
|
|
||||||
|
|
||||||
#ifdef HAVE_NATIVE_BACKEND
|
|
||||||
struct gbm_bo *meta_cursor_reference_get_gbm_bo (MetaCursorReference *cursor,
|
|
||||||
int *hot_x,
|
|
||||||
int *hot_y);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* META_CURSOR_PRIVATE_H */
|
|
||||||
@@ -25,9 +25,10 @@
|
|||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
#include "meta-cursor-renderer.h"
|
#include "meta-cursor-renderer.h"
|
||||||
#include "meta-cursor-private.h"
|
|
||||||
|
|
||||||
#include <meta/meta-backend.h>
|
#include <meta/meta-backend.h>
|
||||||
|
#include <backends/meta-backend-private.h>
|
||||||
|
#include <backends/meta-monitor-manager-private.h>
|
||||||
#include <meta/util.h>
|
#include <meta/util.h>
|
||||||
|
|
||||||
#include <cogl/cogl.h>
|
#include <cogl/cogl.h>
|
||||||
@@ -38,9 +39,8 @@
|
|||||||
struct _MetaCursorRendererPrivate
|
struct _MetaCursorRendererPrivate
|
||||||
{
|
{
|
||||||
int current_x, current_y;
|
int current_x, current_y;
|
||||||
MetaRectangle current_rect;
|
|
||||||
|
|
||||||
MetaCursorReference *displayed_cursor;
|
MetaCursorSprite *displayed_cursor;
|
||||||
gboolean handled_by_backend;
|
gboolean handled_by_backend;
|
||||||
};
|
};
|
||||||
typedef struct _MetaCursorRendererPrivate MetaCursorRendererPrivate;
|
typedef struct _MetaCursorRendererPrivate MetaCursorRendererPrivate;
|
||||||
@@ -48,27 +48,33 @@ typedef struct _MetaCursorRendererPrivate MetaCursorRendererPrivate;
|
|||||||
G_DEFINE_TYPE_WITH_PRIVATE (MetaCursorRenderer, meta_cursor_renderer, G_TYPE_OBJECT);
|
G_DEFINE_TYPE_WITH_PRIVATE (MetaCursorRenderer, meta_cursor_renderer, G_TYPE_OBJECT);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
queue_redraw (MetaCursorRenderer *renderer)
|
queue_redraw (MetaCursorRenderer *renderer,
|
||||||
|
MetaCursorSprite *cursor_sprite)
|
||||||
{
|
{
|
||||||
MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer);
|
MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer);
|
||||||
MetaBackend *backend = meta_get_backend ();
|
MetaBackend *backend = meta_get_backend ();
|
||||||
ClutterActor *stage = meta_backend_get_stage (backend);
|
ClutterActor *stage = meta_backend_get_stage (backend);
|
||||||
CoglTexture *texture;
|
CoglTexture *texture;
|
||||||
|
MetaRectangle rect = { 0 };
|
||||||
|
|
||||||
|
if (cursor_sprite)
|
||||||
|
rect = meta_cursor_renderer_calculate_rect (renderer, cursor_sprite);
|
||||||
|
|
||||||
/* During early initialization, we can have no stage */
|
/* During early initialization, we can have no stage */
|
||||||
if (!stage)
|
if (!stage)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (priv->displayed_cursor && !priv->handled_by_backend)
|
if (cursor_sprite && !priv->handled_by_backend)
|
||||||
texture = meta_cursor_reference_get_cogl_texture (priv->displayed_cursor, NULL, NULL);
|
texture = meta_cursor_sprite_get_cogl_texture (cursor_sprite);
|
||||||
else
|
else
|
||||||
texture = NULL;
|
texture = NULL;
|
||||||
|
|
||||||
meta_stage_set_cursor (META_STAGE (stage), texture, &priv->current_rect);
|
meta_stage_set_cursor (META_STAGE (stage), texture, &rect);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
meta_cursor_renderer_real_update_cursor (MetaCursorRenderer *renderer)
|
meta_cursor_renderer_real_update_cursor (MetaCursorRenderer *renderer,
|
||||||
|
MetaCursorSprite *cursor_sprite)
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
@@ -84,34 +90,63 @@ meta_cursor_renderer_init (MetaCursorRenderer *renderer)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MetaRectangle
|
||||||
|
meta_cursor_renderer_calculate_rect (MetaCursorRenderer *renderer,
|
||||||
|
MetaCursorSprite *cursor_sprite)
|
||||||
|
{
|
||||||
|
MetaCursorRendererPrivate *priv =
|
||||||
|
meta_cursor_renderer_get_instance_private (renderer);
|
||||||
|
CoglTexture *texture;
|
||||||
|
int hot_x, hot_y;
|
||||||
|
int width, height;
|
||||||
|
float texture_scale;
|
||||||
|
|
||||||
|
texture = meta_cursor_sprite_get_cogl_texture (cursor_sprite);
|
||||||
|
if (!texture)
|
||||||
|
return (MetaRectangle) { 0 };
|
||||||
|
|
||||||
|
meta_cursor_sprite_get_hotspot (cursor_sprite, &hot_x, &hot_y);
|
||||||
|
texture_scale = meta_cursor_sprite_get_texture_scale (cursor_sprite);
|
||||||
|
width = cogl_texture_get_width (texture);
|
||||||
|
height = cogl_texture_get_height (texture);
|
||||||
|
|
||||||
|
return (MetaRectangle) {
|
||||||
|
.x = (int)roundf (priv->current_x - (hot_x * texture_scale)),
|
||||||
|
.y = (int)roundf (priv->current_y - (hot_y * texture_scale)),
|
||||||
|
.width = (int)roundf (width * texture_scale),
|
||||||
|
.height = (int)roundf (height * texture_scale),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
is_cursor_in_monitors_area (int x, int y)
|
||||||
|
{
|
||||||
|
MetaMonitorManager *monitor_manager = meta_backend_get_monitor_manager (meta_get_backend ());
|
||||||
|
return meta_monitor_manager_get_monitor_at_point (monitor_manager,
|
||||||
|
(gfloat) x, (gfloat) y) >= 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
update_cursor (MetaCursorRenderer *renderer)
|
update_cursor (MetaCursorRenderer *renderer,
|
||||||
|
MetaCursorSprite *cursor_sprite)
|
||||||
{
|
{
|
||||||
MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer);
|
MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer);
|
||||||
gboolean handled_by_backend;
|
gboolean handled_by_backend;
|
||||||
gboolean should_redraw = FALSE;
|
gboolean should_redraw = FALSE;
|
||||||
|
|
||||||
if (priv->displayed_cursor)
|
/* do not render cursor if it is not on any monitor. Such situation
|
||||||
{
|
* can occur e. g. after monitor hot-plug */
|
||||||
CoglTexture *texture;
|
if (!is_cursor_in_monitors_area (priv->current_x, priv->current_y))
|
||||||
int hot_x, hot_y;
|
return;
|
||||||
|
|
||||||
texture = meta_cursor_reference_get_cogl_texture (priv->displayed_cursor, &hot_x, &hot_y);
|
if (cursor_sprite)
|
||||||
|
meta_cursor_sprite_prepare_at (cursor_sprite,
|
||||||
|
priv->current_x,
|
||||||
|
priv->current_y);
|
||||||
|
|
||||||
priv->current_rect.x = priv->current_x - hot_x;
|
handled_by_backend =
|
||||||
priv->current_rect.y = priv->current_y - hot_y;
|
META_CURSOR_RENDERER_GET_CLASS (renderer)->update_cursor (renderer,
|
||||||
priv->current_rect.width = cogl_texture_get_width (COGL_TEXTURE (texture));
|
cursor_sprite);
|
||||||
priv->current_rect.height = cogl_texture_get_height (COGL_TEXTURE (texture));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
priv->current_rect.x = 0;
|
|
||||||
priv->current_rect.y = 0;
|
|
||||||
priv->current_rect.width = 0;
|
|
||||||
priv->current_rect.height = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
handled_by_backend = META_CURSOR_RENDERER_GET_CLASS (renderer)->update_cursor (renderer);
|
|
||||||
if (handled_by_backend != priv->handled_by_backend)
|
if (handled_by_backend != priv->handled_by_backend)
|
||||||
{
|
{
|
||||||
priv->handled_by_backend = handled_by_backend;
|
priv->handled_by_backend = handled_by_backend;
|
||||||
@@ -122,7 +157,7 @@ update_cursor (MetaCursorRenderer *renderer)
|
|||||||
should_redraw = TRUE;
|
should_redraw = TRUE;
|
||||||
|
|
||||||
if (should_redraw)
|
if (should_redraw)
|
||||||
queue_redraw (renderer);
|
queue_redraw (renderer, cursor_sprite);
|
||||||
}
|
}
|
||||||
|
|
||||||
MetaCursorRenderer *
|
MetaCursorRenderer *
|
||||||
@@ -133,15 +168,24 @@ meta_cursor_renderer_new (void)
|
|||||||
|
|
||||||
void
|
void
|
||||||
meta_cursor_renderer_set_cursor (MetaCursorRenderer *renderer,
|
meta_cursor_renderer_set_cursor (MetaCursorRenderer *renderer,
|
||||||
MetaCursorReference *cursor)
|
MetaCursorSprite *cursor_sprite)
|
||||||
{
|
{
|
||||||
MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer);
|
MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer);
|
||||||
|
|
||||||
if (priv->displayed_cursor == cursor)
|
if (priv->displayed_cursor == cursor_sprite)
|
||||||
return;
|
return;
|
||||||
|
priv->displayed_cursor = cursor_sprite;
|
||||||
|
|
||||||
priv->displayed_cursor = cursor;
|
update_cursor (renderer, cursor_sprite);
|
||||||
update_cursor (renderer);
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_cursor_renderer_force_update (MetaCursorRenderer *renderer)
|
||||||
|
{
|
||||||
|
MetaCursorRendererPrivate *priv =
|
||||||
|
meta_cursor_renderer_get_instance_private (renderer);
|
||||||
|
|
||||||
|
update_cursor (renderer, priv->displayed_cursor);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -155,10 +199,10 @@ meta_cursor_renderer_set_position (MetaCursorRenderer *renderer,
|
|||||||
priv->current_x = x;
|
priv->current_x = x;
|
||||||
priv->current_y = y;
|
priv->current_y = y;
|
||||||
|
|
||||||
update_cursor (renderer);
|
update_cursor (renderer, priv->displayed_cursor);
|
||||||
}
|
}
|
||||||
|
|
||||||
MetaCursorReference *
|
MetaCursorSprite *
|
||||||
meta_cursor_renderer_get_cursor (MetaCursorRenderer *renderer)
|
meta_cursor_renderer_get_cursor (MetaCursorRenderer *renderer)
|
||||||
{
|
{
|
||||||
MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer);
|
MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer);
|
||||||
@@ -166,10 +210,27 @@ meta_cursor_renderer_get_cursor (MetaCursorRenderer *renderer)
|
|||||||
return priv->displayed_cursor;
|
return priv->displayed_cursor;
|
||||||
}
|
}
|
||||||
|
|
||||||
const MetaRectangle *
|
#ifdef HAVE_WAYLAND
|
||||||
meta_cursor_renderer_get_rect (MetaCursorRenderer *renderer)
|
void
|
||||||
|
meta_cursor_renderer_realize_cursor_from_wl_buffer (MetaCursorRenderer *renderer,
|
||||||
|
MetaCursorSprite *cursor_sprite,
|
||||||
|
struct wl_resource *buffer)
|
||||||
{
|
{
|
||||||
MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer);
|
|
||||||
|
|
||||||
return &priv->current_rect;
|
MetaCursorRendererClass *renderer_class = META_CURSOR_RENDERER_GET_CLASS (renderer);
|
||||||
|
|
||||||
|
if (renderer_class->realize_cursor_from_wl_buffer)
|
||||||
|
renderer_class->realize_cursor_from_wl_buffer (renderer, cursor_sprite, buffer);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_cursor_renderer_realize_cursor_from_xcursor (MetaCursorRenderer *renderer,
|
||||||
|
MetaCursorSprite *cursor_sprite,
|
||||||
|
XcursorImage *xc_image)
|
||||||
|
{
|
||||||
|
MetaCursorRendererClass *renderer_class = META_CURSOR_RENDERER_GET_CLASS (renderer);
|
||||||
|
|
||||||
|
if (renderer_class->realize_cursor_from_xcursor)
|
||||||
|
renderer_class->realize_cursor_from_xcursor (renderer, cursor_sprite, xc_image);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,43 +26,56 @@
|
|||||||
#define META_CURSOR_RENDERER_H
|
#define META_CURSOR_RENDERER_H
|
||||||
|
|
||||||
#include <glib-object.h>
|
#include <glib-object.h>
|
||||||
|
#include <X11/Xcursor/Xcursor.h>
|
||||||
|
#ifdef HAVE_WAYLAND
|
||||||
|
#include <wayland-server.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <meta/screen.h>
|
#include <meta/screen.h>
|
||||||
#include "meta-cursor.h"
|
#include "meta-cursor.h"
|
||||||
|
|
||||||
#define META_TYPE_CURSOR_RENDERER (meta_cursor_renderer_get_type ())
|
#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))
|
G_DECLARE_DERIVABLE_TYPE (MetaCursorRenderer, meta_cursor_renderer,
|
||||||
#define META_CURSOR_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_CURSOR_RENDERER, MetaCursorRendererClass))
|
META, CURSOR_RENDERER, GObject);
|
||||||
#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
|
struct _MetaCursorRendererClass
|
||||||
{
|
{
|
||||||
GObjectClass parent_class;
|
GObjectClass parent_class;
|
||||||
|
|
||||||
gboolean (* update_cursor) (MetaCursorRenderer *renderer);
|
gboolean (* update_cursor) (MetaCursorRenderer *renderer,
|
||||||
|
MetaCursorSprite *cursor_sprite);
|
||||||
|
#ifdef HAVE_WAYLAND
|
||||||
|
void (* realize_cursor_from_wl_buffer) (MetaCursorRenderer *renderer,
|
||||||
|
MetaCursorSprite *cursor_sprite,
|
||||||
|
struct wl_resource *buffer);
|
||||||
|
#endif
|
||||||
|
void (* realize_cursor_from_xcursor) (MetaCursorRenderer *renderer,
|
||||||
|
MetaCursorSprite *cursor_sprite,
|
||||||
|
XcursorImage *xc_image);
|
||||||
};
|
};
|
||||||
|
|
||||||
GType meta_cursor_renderer_get_type (void) G_GNUC_CONST;
|
|
||||||
|
|
||||||
MetaCursorRenderer * meta_cursor_renderer_new (void);
|
MetaCursorRenderer * meta_cursor_renderer_new (void);
|
||||||
|
|
||||||
void meta_cursor_renderer_set_cursor (MetaCursorRenderer *renderer,
|
void meta_cursor_renderer_set_cursor (MetaCursorRenderer *renderer,
|
||||||
MetaCursorReference *cursor);
|
MetaCursorSprite *cursor_sprite);
|
||||||
|
|
||||||
void meta_cursor_renderer_set_position (MetaCursorRenderer *renderer,
|
void meta_cursor_renderer_set_position (MetaCursorRenderer *renderer,
|
||||||
int x, int y);
|
int x, int y);
|
||||||
|
void meta_cursor_renderer_force_update (MetaCursorRenderer *renderer);
|
||||||
|
|
||||||
MetaCursorReference * meta_cursor_renderer_get_cursor (MetaCursorRenderer *renderer);
|
MetaCursorSprite * meta_cursor_renderer_get_cursor (MetaCursorRenderer *renderer);
|
||||||
const MetaRectangle * meta_cursor_renderer_get_rect (MetaCursorRenderer *renderer);
|
|
||||||
|
MetaRectangle meta_cursor_renderer_calculate_rect (MetaCursorRenderer *renderer,
|
||||||
|
MetaCursorSprite *cursor_sprite);
|
||||||
|
|
||||||
|
#ifdef HAVE_WAYLAND
|
||||||
|
void meta_cursor_renderer_realize_cursor_from_wl_buffer (MetaCursorRenderer *renderer,
|
||||||
|
MetaCursorSprite *cursor_sprite,
|
||||||
|
struct wl_resource *buffer);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void meta_cursor_renderer_realize_cursor_from_xcursor (MetaCursorRenderer *renderer,
|
||||||
|
MetaCursorSprite *cursor_sprite,
|
||||||
|
XcursorImage *xc_image);
|
||||||
|
|
||||||
#endif /* META_CURSOR_RENDERER_H */
|
#endif /* META_CURSOR_RENDERER_H */
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ struct _MetaCursorTracker {
|
|||||||
|
|
||||||
gboolean is_showing;
|
gboolean is_showing;
|
||||||
|
|
||||||
MetaCursorReference *displayed_cursor;
|
MetaCursorSprite *displayed_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.
|
||||||
@@ -42,12 +42,12 @@ struct _MetaCursorTracker {
|
|||||||
* determine an unset window cursor; we need an extra boolean.
|
* determine an unset window cursor; we need an extra boolean.
|
||||||
*/
|
*/
|
||||||
gboolean has_window_cursor;
|
gboolean has_window_cursor;
|
||||||
MetaCursorReference *window_cursor;
|
MetaCursorSprite *window_cursor;
|
||||||
|
|
||||||
MetaCursorReference *root_cursor;
|
MetaCursorSprite *root_cursor;
|
||||||
|
|
||||||
/* The cursor from the X11 server. */
|
/* The cursor from the X11 server. */
|
||||||
MetaCursorReference *xfixes_cursor;
|
MetaCursorSprite *xfixes_cursor;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _MetaCursorTrackerClass {
|
struct _MetaCursorTrackerClass {
|
||||||
@@ -58,15 +58,15 @@ gboolean meta_cursor_tracker_handle_xevent (MetaCursorTracker *tracker,
|
|||||||
XEvent *xevent);
|
XEvent *xevent);
|
||||||
|
|
||||||
void meta_cursor_tracker_set_window_cursor (MetaCursorTracker *tracker,
|
void meta_cursor_tracker_set_window_cursor (MetaCursorTracker *tracker,
|
||||||
MetaCursorReference *cursor);
|
MetaCursorSprite *cursor_sprite);
|
||||||
void meta_cursor_tracker_unset_window_cursor (MetaCursorTracker *tracker);
|
void meta_cursor_tracker_unset_window_cursor (MetaCursorTracker *tracker);
|
||||||
void meta_cursor_tracker_set_root_cursor (MetaCursorTracker *tracker,
|
void meta_cursor_tracker_set_root_cursor (MetaCursorTracker *tracker,
|
||||||
MetaCursorReference *cursor);
|
MetaCursorSprite *cursor_sprite);
|
||||||
|
|
||||||
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);
|
||||||
|
|
||||||
MetaCursorReference * meta_cursor_tracker_get_displayed_cursor (MetaCursorTracker *tracker);
|
MetaCursorSprite * meta_cursor_tracker_get_displayed_cursor (MetaCursorTracker *tracker);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -43,7 +43,6 @@
|
|||||||
#include <X11/extensions/Xfixes.h>
|
#include <X11/extensions/Xfixes.h>
|
||||||
|
|
||||||
#include "meta-backend-private.h"
|
#include "meta-backend-private.h"
|
||||||
#include "meta-cursor-private.h"
|
|
||||||
|
|
||||||
G_DEFINE_TYPE (MetaCursorTracker, meta_cursor_tracker, G_TYPE_OBJECT);
|
G_DEFINE_TYPE (MetaCursorTracker, meta_cursor_tracker, G_TYPE_OBJECT);
|
||||||
|
|
||||||
@@ -54,7 +53,7 @@ enum {
|
|||||||
|
|
||||||
static guint signals[LAST_SIGNAL];
|
static guint signals[LAST_SIGNAL];
|
||||||
|
|
||||||
static MetaCursorReference *
|
static MetaCursorSprite *
|
||||||
get_displayed_cursor (MetaCursorTracker *tracker)
|
get_displayed_cursor (MetaCursorTracker *tracker)
|
||||||
{
|
{
|
||||||
MetaDisplay *display = meta_get_display ();
|
MetaDisplay *display = meta_get_display ();
|
||||||
@@ -80,14 +79,14 @@ update_displayed_cursor (MetaCursorTracker *tracker)
|
|||||||
static void
|
static void
|
||||||
sync_cursor (MetaCursorTracker *tracker)
|
sync_cursor (MetaCursorTracker *tracker)
|
||||||
{
|
{
|
||||||
MetaCursorReference *displayed_cursor = get_displayed_cursor (tracker);
|
MetaCursorSprite *displayed_cursor = get_displayed_cursor (tracker);
|
||||||
|
|
||||||
if (tracker->displayed_cursor == displayed_cursor)
|
if (tracker->displayed_cursor == displayed_cursor)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
g_clear_pointer (&tracker->displayed_cursor, meta_cursor_reference_unref);
|
g_clear_object (&tracker->displayed_cursor);
|
||||||
if (displayed_cursor)
|
if (displayed_cursor)
|
||||||
tracker->displayed_cursor = meta_cursor_reference_ref (displayed_cursor);
|
tracker->displayed_cursor = g_object_ref (displayed_cursor);
|
||||||
|
|
||||||
update_displayed_cursor (tracker);
|
update_displayed_cursor (tracker);
|
||||||
g_signal_emit (tracker, signals[CURSOR_CHANGED], 0);
|
g_signal_emit (tracker, signals[CURSOR_CHANGED], 0);
|
||||||
@@ -108,9 +107,9 @@ meta_cursor_tracker_finalize (GObject *object)
|
|||||||
MetaCursorTracker *self = META_CURSOR_TRACKER (object);
|
MetaCursorTracker *self = META_CURSOR_TRACKER (object);
|
||||||
|
|
||||||
if (self->displayed_cursor)
|
if (self->displayed_cursor)
|
||||||
meta_cursor_reference_unref (self->displayed_cursor);
|
g_object_unref (self->displayed_cursor);
|
||||||
if (self->root_cursor)
|
if (self->root_cursor)
|
||||||
meta_cursor_reference_unref (self->root_cursor);
|
g_object_unref (self->root_cursor);
|
||||||
|
|
||||||
G_OBJECT_CLASS (meta_cursor_tracker_parent_class)->finalize (object);
|
G_OBJECT_CLASS (meta_cursor_tracker_parent_class)->finalize (object);
|
||||||
}
|
}
|
||||||
@@ -158,11 +157,11 @@ meta_cursor_tracker_get_for_screen (MetaScreen *screen)
|
|||||||
static void
|
static void
|
||||||
set_window_cursor (MetaCursorTracker *tracker,
|
set_window_cursor (MetaCursorTracker *tracker,
|
||||||
gboolean has_cursor,
|
gboolean has_cursor,
|
||||||
MetaCursorReference *cursor)
|
MetaCursorSprite *cursor_sprite)
|
||||||
{
|
{
|
||||||
g_clear_pointer (&tracker->window_cursor, meta_cursor_reference_unref);
|
g_clear_object (&tracker->window_cursor);
|
||||||
if (cursor)
|
if (cursor_sprite)
|
||||||
tracker->window_cursor = meta_cursor_reference_ref (cursor);
|
tracker->window_cursor = g_object_ref (cursor_sprite);
|
||||||
tracker->has_window_cursor = has_cursor;
|
tracker->has_window_cursor = has_cursor;
|
||||||
sync_cursor (tracker);
|
sync_cursor (tracker);
|
||||||
}
|
}
|
||||||
@@ -184,27 +183,12 @@ meta_cursor_tracker_handle_xevent (MetaCursorTracker *tracker,
|
|||||||
if (notify_event->subtype != XFixesDisplayCursorNotify)
|
if (notify_event->subtype != XFixesDisplayCursorNotify)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
g_clear_pointer (&tracker->xfixes_cursor, meta_cursor_reference_unref);
|
g_clear_object (&tracker->xfixes_cursor);
|
||||||
|
g_signal_emit (tracker, signals[CURSOR_CHANGED], 0);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static MetaCursorReference *
|
|
||||||
meta_cursor_reference_take_texture (CoglTexture2D *texture,
|
|
||||||
int hot_x,
|
|
||||||
int hot_y)
|
|
||||||
{
|
|
||||||
MetaCursorReference *self;
|
|
||||||
|
|
||||||
self = g_slice_new0 (MetaCursorReference);
|
|
||||||
self->ref_count = 1;
|
|
||||||
self->image.texture = texture;
|
|
||||||
self->image.hot_x = hot_x;
|
|
||||||
self->image.hot_y = hot_y;
|
|
||||||
|
|
||||||
return self;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ensure_xfixes_cursor (MetaCursorTracker *tracker)
|
ensure_xfixes_cursor (MetaCursorTracker *tracker)
|
||||||
{
|
{
|
||||||
@@ -262,10 +246,13 @@ ensure_xfixes_cursor (MetaCursorTracker *tracker)
|
|||||||
|
|
||||||
if (sprite != NULL)
|
if (sprite != NULL)
|
||||||
{
|
{
|
||||||
MetaCursorReference *cursor = meta_cursor_reference_take_texture (sprite,
|
MetaCursorSprite *cursor_sprite = meta_cursor_sprite_new ();
|
||||||
|
meta_cursor_sprite_set_texture (cursor_sprite,
|
||||||
|
sprite,
|
||||||
cursor_image->xhot,
|
cursor_image->xhot,
|
||||||
cursor_image->yhot);
|
cursor_image->yhot);
|
||||||
tracker->xfixes_cursor = cursor;
|
cogl_object_unref (sprite);
|
||||||
|
tracker->xfixes_cursor = cursor_sprite;
|
||||||
}
|
}
|
||||||
XFree (cursor_image);
|
XFree (cursor_image);
|
||||||
}
|
}
|
||||||
@@ -278,22 +265,22 @@ ensure_xfixes_cursor (MetaCursorTracker *tracker)
|
|||||||
CoglTexture *
|
CoglTexture *
|
||||||
meta_cursor_tracker_get_sprite (MetaCursorTracker *tracker)
|
meta_cursor_tracker_get_sprite (MetaCursorTracker *tracker)
|
||||||
{
|
{
|
||||||
MetaCursorReference *cursor;
|
MetaCursorSprite *cursor_sprite;
|
||||||
|
|
||||||
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 ())
|
||||||
{
|
{
|
||||||
cursor = tracker->displayed_cursor;
|
cursor_sprite = tracker->displayed_cursor;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ensure_xfixes_cursor (tracker);
|
ensure_xfixes_cursor (tracker);
|
||||||
cursor = tracker->xfixes_cursor;
|
cursor_sprite = tracker->xfixes_cursor;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cursor)
|
if (cursor_sprite)
|
||||||
return meta_cursor_reference_get_cogl_texture (cursor, NULL, NULL);
|
return meta_cursor_sprite_get_cogl_texture (cursor_sprite);
|
||||||
else
|
else
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -310,22 +297,22 @@ meta_cursor_tracker_get_hot (MetaCursorTracker *tracker,
|
|||||||
int *x,
|
int *x,
|
||||||
int *y)
|
int *y)
|
||||||
{
|
{
|
||||||
MetaCursorReference *cursor;
|
MetaCursorSprite *cursor_sprite;
|
||||||
|
|
||||||
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 ())
|
||||||
{
|
{
|
||||||
cursor = tracker->displayed_cursor;
|
cursor_sprite = tracker->displayed_cursor;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ensure_xfixes_cursor (tracker);
|
ensure_xfixes_cursor (tracker);
|
||||||
cursor = tracker->xfixes_cursor;
|
cursor_sprite = tracker->xfixes_cursor;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cursor)
|
if (cursor_sprite)
|
||||||
meta_cursor_reference_get_cogl_texture (cursor, x, y);
|
meta_cursor_sprite_get_hotspot (cursor_sprite, x, y);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (x)
|
if (x)
|
||||||
@@ -337,9 +324,9 @@ meta_cursor_tracker_get_hot (MetaCursorTracker *tracker,
|
|||||||
|
|
||||||
void
|
void
|
||||||
meta_cursor_tracker_set_window_cursor (MetaCursorTracker *tracker,
|
meta_cursor_tracker_set_window_cursor (MetaCursorTracker *tracker,
|
||||||
MetaCursorReference *cursor)
|
MetaCursorSprite *cursor_sprite)
|
||||||
{
|
{
|
||||||
set_window_cursor (tracker, TRUE, cursor);
|
set_window_cursor (tracker, TRUE, cursor_sprite);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -350,11 +337,11 @@ meta_cursor_tracker_unset_window_cursor (MetaCursorTracker *tracker)
|
|||||||
|
|
||||||
void
|
void
|
||||||
meta_cursor_tracker_set_root_cursor (MetaCursorTracker *tracker,
|
meta_cursor_tracker_set_root_cursor (MetaCursorTracker *tracker,
|
||||||
MetaCursorReference *cursor)
|
MetaCursorSprite *cursor_sprite)
|
||||||
{
|
{
|
||||||
g_clear_pointer (&tracker->root_cursor, meta_cursor_reference_unref);
|
g_clear_object (&tracker->root_cursor);
|
||||||
if (cursor)
|
if (cursor_sprite)
|
||||||
tracker->root_cursor = meta_cursor_reference_ref (cursor);
|
tracker->root_cursor = g_object_ref (cursor_sprite);
|
||||||
|
|
||||||
sync_cursor (tracker);
|
sync_cursor (tracker);
|
||||||
}
|
}
|
||||||
@@ -374,12 +361,12 @@ get_pointer_position_gdk (int *x,
|
|||||||
int *y,
|
int *y,
|
||||||
int *mods)
|
int *mods)
|
||||||
{
|
{
|
||||||
GdkDeviceManager *gmanager;
|
GdkSeat *gseat;
|
||||||
GdkDevice *gdevice;
|
GdkDevice *gdevice;
|
||||||
GdkScreen *gscreen;
|
GdkScreen *gscreen;
|
||||||
|
|
||||||
gmanager = gdk_display_get_device_manager (gdk_display_get_default ());
|
gseat = gdk_display_get_default_seat (gdk_display_get_default ());
|
||||||
gdevice = gdk_x11_device_manager_lookup (gmanager, META_VIRTUAL_CORE_POINTER_ID);
|
gdevice = gdk_seat_get_pointer (gseat);
|
||||||
|
|
||||||
gdk_device_get_position (gdevice, &gscreen, x, y);
|
gdk_device_get_position (gdevice, &gscreen, x, y);
|
||||||
if (mods)
|
if (mods)
|
||||||
@@ -437,7 +424,7 @@ meta_cursor_tracker_set_pointer_visible (MetaCursorTracker *tracker,
|
|||||||
sync_cursor (tracker);
|
sync_cursor (tracker);
|
||||||
}
|
}
|
||||||
|
|
||||||
MetaCursorReference *
|
MetaCursorSprite *
|
||||||
meta_cursor_tracker_get_displayed_cursor (MetaCursorTracker *tracker)
|
meta_cursor_tracker_get_displayed_cursor (MetaCursorTracker *tracker)
|
||||||
{
|
{
|
||||||
return tracker->displayed_cursor;
|
return tracker->displayed_cursor;
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
#include "meta-cursor-private.h"
|
#include "meta-cursor.h"
|
||||||
|
|
||||||
#include <meta/errors.h>
|
#include <meta/errors.h>
|
||||||
|
|
||||||
@@ -29,56 +29,38 @@
|
|||||||
#include "screen-private.h"
|
#include "screen-private.h"
|
||||||
#include "meta-backend-private.h"
|
#include "meta-backend-private.h"
|
||||||
|
|
||||||
#ifdef HAVE_NATIVE_BACKEND
|
|
||||||
#include "backends/native/meta-cursor-renderer-native.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include <X11/cursorfont.h>
|
#include <X11/cursorfont.h>
|
||||||
#include <X11/extensions/Xfixes.h>
|
#include <X11/extensions/Xfixes.h>
|
||||||
#include <X11/Xcursor/Xcursor.h>
|
#include <X11/Xcursor/Xcursor.h>
|
||||||
|
|
||||||
#ifdef HAVE_WAYLAND
|
enum {
|
||||||
#include <cogl/cogl-wayland-server.h>
|
PREPARE_AT,
|
||||||
#endif
|
|
||||||
|
|
||||||
MetaCursorReference *
|
LAST_SIGNAL
|
||||||
meta_cursor_reference_ref (MetaCursorReference *self)
|
};
|
||||||
|
|
||||||
|
static guint signals[LAST_SIGNAL];
|
||||||
|
|
||||||
|
struct _MetaCursorSprite
|
||||||
{
|
{
|
||||||
g_assert (self->ref_count > 0);
|
GObject parent;
|
||||||
self->ref_count++;
|
|
||||||
|
|
||||||
return self;
|
MetaCursor cursor;
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
CoglTexture2D *texture;
|
||||||
meta_cursor_image_free (MetaCursorImage *image)
|
float texture_scale;
|
||||||
{
|
int hot_x, hot_y;
|
||||||
if (image->texture)
|
|
||||||
cogl_object_unref (image->texture);
|
|
||||||
|
|
||||||
#ifdef HAVE_NATIVE_BACKEND
|
int current_frame;
|
||||||
if (image->bo)
|
XcursorImages *xcursor_images;
|
||||||
gbm_bo_destroy (image->bo);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
int theme_scale;
|
||||||
meta_cursor_reference_free (MetaCursorReference *self)
|
gboolean theme_dirty;
|
||||||
{
|
};
|
||||||
meta_cursor_image_free (&self->image);
|
|
||||||
g_slice_free (MetaCursorReference, self);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
G_DEFINE_TYPE (MetaCursorSprite, meta_cursor_sprite, G_TYPE_OBJECT)
|
||||||
meta_cursor_reference_unref (MetaCursorReference *self)
|
|
||||||
{
|
|
||||||
self->ref_count--;
|
|
||||||
|
|
||||||
if (self->ref_count == 0)
|
|
||||||
meta_cursor_reference_free (self);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char *
|
static const char *
|
||||||
translate_meta_cursor (MetaCursor cursor)
|
translate_meta_cursor (MetaCursor cursor)
|
||||||
@@ -135,93 +117,27 @@ meta_cursor_create_x_cursor (Display *xdisplay,
|
|||||||
return XcursorLibraryLoadCursor (xdisplay, translate_meta_cursor (cursor));
|
return XcursorLibraryLoadCursor (xdisplay, translate_meta_cursor (cursor));
|
||||||
}
|
}
|
||||||
|
|
||||||
static XcursorImage *
|
static XcursorImages *
|
||||||
load_cursor_on_client (MetaCursor cursor)
|
load_cursor_on_client (MetaCursor cursor, int scale)
|
||||||
{
|
{
|
||||||
return XcursorLibraryLoadImage (translate_meta_cursor (cursor),
|
return XcursorLibraryLoadImages (translate_meta_cursor (cursor),
|
||||||
meta_prefs_get_cursor_theme (),
|
meta_prefs_get_cursor_theme (),
|
||||||
meta_prefs_get_cursor_size ());
|
meta_prefs_get_cursor_size () * scale);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_NATIVE_BACKEND
|
|
||||||
static void
|
|
||||||
get_hardware_cursor_size (uint64_t *cursor_width, uint64_t *cursor_height)
|
|
||||||
{
|
|
||||||
MetaBackend *meta_backend = meta_get_backend ();
|
|
||||||
MetaCursorRenderer *renderer = meta_backend_get_cursor_renderer (meta_backend);
|
|
||||||
|
|
||||||
if (META_IS_CURSOR_RENDERER_NATIVE (renderer))
|
|
||||||
{
|
|
||||||
meta_cursor_renderer_native_get_cursor_size (META_CURSOR_RENDERER_NATIVE (renderer), cursor_width, cursor_height);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
g_assert_not_reached ();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAVE_NATIVE_BACKEND
|
|
||||||
static void
|
|
||||||
meta_cursor_image_load_gbm_buffer (struct gbm_device *gbm,
|
|
||||||
MetaCursorImage *image,
|
|
||||||
uint8_t *pixels,
|
|
||||||
uint width,
|
|
||||||
uint height,
|
|
||||||
int rowstride,
|
|
||||||
uint32_t gbm_format)
|
|
||||||
{
|
|
||||||
uint64_t cursor_width, cursor_height;
|
|
||||||
get_hardware_cursor_size (&cursor_width, &cursor_height);
|
|
||||||
|
|
||||||
if (width > cursor_width || height > cursor_height)
|
|
||||||
{
|
|
||||||
meta_warning ("Invalid theme cursor size (must be at most %ux%u)\n",
|
|
||||||
(unsigned int)cursor_width, (unsigned int)cursor_height);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (gbm_device_is_format_supported (gbm, gbm_format,
|
|
||||||
GBM_BO_USE_CURSOR | GBM_BO_USE_WRITE))
|
|
||||||
{
|
|
||||||
uint8_t buf[4 * cursor_width * cursor_height];
|
|
||||||
uint i;
|
|
||||||
|
|
||||||
image->bo = gbm_bo_create (gbm, cursor_width, cursor_height,
|
|
||||||
gbm_format, GBM_BO_USE_CURSOR | GBM_BO_USE_WRITE);
|
|
||||||
|
|
||||||
memset (buf, 0, sizeof(buf));
|
|
||||||
for (i = 0; i < height; i++)
|
|
||||||
memcpy (buf + i * 4 * cursor_width, pixels + i * rowstride, width * 4);
|
|
||||||
|
|
||||||
gbm_bo_write (image->bo, buf, cursor_width * cursor_height * 4);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
meta_warning ("HW cursor for format %d not supported\n", gbm_format);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAVE_NATIVE_BACKEND
|
|
||||||
static struct gbm_device *
|
|
||||||
get_gbm_device (void)
|
|
||||||
{
|
|
||||||
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));
|
|
||||||
else
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_cursor_image_load_from_xcursor_image (MetaCursorImage *image,
|
meta_cursor_sprite_load_from_xcursor_image (MetaCursorSprite *self,
|
||||||
XcursorImage *xc_image)
|
XcursorImage *xc_image)
|
||||||
{
|
{
|
||||||
|
MetaBackend *meta_backend = meta_get_backend ();
|
||||||
|
MetaCursorRenderer *renderer = meta_backend_get_cursor_renderer (meta_backend);
|
||||||
uint width, height, rowstride;
|
uint width, height, rowstride;
|
||||||
CoglPixelFormat cogl_format;
|
CoglPixelFormat cogl_format;
|
||||||
ClutterBackend *clutter_backend;
|
ClutterBackend *clutter_backend;
|
||||||
CoglContext *cogl_context;
|
CoglContext *cogl_context;
|
||||||
|
CoglTexture *texture;
|
||||||
|
|
||||||
|
g_assert (self->texture == NULL);
|
||||||
|
|
||||||
width = xc_image->width;
|
width = xc_image->width;
|
||||||
height = xc_image->height;
|
height = xc_image->height;
|
||||||
@@ -233,196 +149,210 @@ meta_cursor_image_load_from_xcursor_image (MetaCursorImage *image,
|
|||||||
cogl_format = COGL_PIXEL_FORMAT_ARGB_8888;
|
cogl_format = COGL_PIXEL_FORMAT_ARGB_8888;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
image->hot_x = xc_image->xhot;
|
|
||||||
image->hot_y = xc_image->yhot;
|
|
||||||
|
|
||||||
clutter_backend = clutter_get_default_backend ();
|
clutter_backend = clutter_get_default_backend ();
|
||||||
cogl_context = clutter_backend_get_cogl_context (clutter_backend);
|
cogl_context = clutter_backend_get_cogl_context (clutter_backend);
|
||||||
image->texture = cogl_texture_2d_new_from_data (cogl_context,
|
texture = cogl_texture_2d_new_from_data (cogl_context,
|
||||||
width, height,
|
width, height,
|
||||||
cogl_format,
|
cogl_format,
|
||||||
rowstride,
|
rowstride,
|
||||||
(uint8_t *) xc_image->pixels,
|
(uint8_t *) xc_image->pixels,
|
||||||
NULL);
|
NULL);
|
||||||
|
meta_cursor_sprite_set_texture (self, texture,
|
||||||
|
xc_image->xhot, xc_image->yhot);
|
||||||
|
cogl_object_unref (texture);
|
||||||
|
|
||||||
#ifdef HAVE_NATIVE_BACKEND
|
meta_cursor_renderer_realize_cursor_from_xcursor (renderer, self, xc_image);
|
||||||
struct gbm_device *gbm = get_gbm_device ();
|
|
||||||
if (gbm)
|
|
||||||
meta_cursor_image_load_gbm_buffer (gbm,
|
|
||||||
image,
|
|
||||||
(uint8_t *) xc_image->pixels,
|
|
||||||
width, height, rowstride,
|
|
||||||
GBM_FORMAT_ARGB8888);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static XcursorImage *
|
||||||
load_cursor_image (MetaCursorReference *cursor)
|
meta_cursor_sprite_get_current_frame_image (MetaCursorSprite *self)
|
||||||
|
{
|
||||||
|
return self->xcursor_images->images[self->current_frame];
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_cursor_sprite_tick_frame (MetaCursorSprite *self)
|
||||||
{
|
{
|
||||||
XcursorImage *image;
|
XcursorImage *image;
|
||||||
|
|
||||||
/* Either cursors are loaded from X cursors or buffers. Since
|
if (!meta_cursor_sprite_is_animated (self))
|
||||||
* buffers are converted over immediately, we can make sure to
|
|
||||||
* load this directly. */
|
|
||||||
g_assert (cursor->cursor != META_CURSOR_NONE);
|
|
||||||
|
|
||||||
image = load_cursor_on_client (cursor->cursor);
|
|
||||||
if (!image)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
meta_cursor_image_load_from_xcursor_image (&cursor->image, image);
|
self->current_frame++;
|
||||||
XcursorImageDestroy (image);
|
|
||||||
|
if (self->current_frame >= self->xcursor_images->nimage)
|
||||||
|
self->current_frame = 0;
|
||||||
|
|
||||||
|
image = meta_cursor_sprite_get_current_frame_image (self);
|
||||||
|
|
||||||
|
g_clear_pointer (&self->texture, cogl_object_unref);
|
||||||
|
meta_cursor_sprite_load_from_xcursor_image (self, image);
|
||||||
}
|
}
|
||||||
|
|
||||||
MetaCursorReference *
|
guint
|
||||||
meta_cursor_reference_from_theme (MetaCursor cursor)
|
meta_cursor_sprite_get_current_frame_time (MetaCursorSprite *self)
|
||||||
{
|
{
|
||||||
MetaCursorReference *self = g_slice_new0 (MetaCursorReference);
|
if (!meta_cursor_sprite_is_animated (self))
|
||||||
self->ref_count = 1;
|
return 0;
|
||||||
self->cursor = cursor;
|
|
||||||
return self;
|
return self->xcursor_images->images[self->current_frame]->delay;
|
||||||
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
meta_cursor_sprite_is_animated (MetaCursorSprite *self)
|
||||||
|
{
|
||||||
|
return (self->xcursor_images &&
|
||||||
|
self->xcursor_images->nimage > 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
MetaCursorSprite *
|
||||||
|
meta_cursor_sprite_new (void)
|
||||||
|
{
|
||||||
|
return g_object_new (META_TYPE_CURSOR_SPRITE, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_WAYLAND
|
|
||||||
static void
|
static void
|
||||||
meta_cursor_image_load_from_buffer (MetaCursorImage *image,
|
meta_cursor_sprite_load_from_theme (MetaCursorSprite *self)
|
||||||
struct wl_resource *buffer,
|
|
||||||
int hot_x,
|
|
||||||
int hot_y)
|
|
||||||
{
|
{
|
||||||
ClutterBackend *backend;
|
XcursorImage *image;
|
||||||
CoglContext *cogl_context;
|
|
||||||
|
|
||||||
image->hot_x = hot_x;
|
g_assert (self->cursor != META_CURSOR_NONE);
|
||||||
image->hot_y = hot_y;
|
|
||||||
|
|
||||||
backend = clutter_get_default_backend ();
|
/* We might be reloading with a different scale. If so clear the old data. */
|
||||||
cogl_context = clutter_backend_get_cogl_context (backend);
|
if (self->xcursor_images)
|
||||||
|
|
||||||
image->texture = cogl_wayland_texture_2d_new_from_buffer (cogl_context, buffer, NULL);
|
|
||||||
|
|
||||||
#ifdef HAVE_NATIVE_BACKEND
|
|
||||||
struct gbm_device *gbm = get_gbm_device ();
|
|
||||||
if (gbm)
|
|
||||||
{
|
{
|
||||||
uint32_t gbm_format;
|
g_clear_pointer (&self->texture, cogl_object_unref);
|
||||||
uint64_t cursor_width, cursor_height;
|
XcursorImagesDestroy (self->xcursor_images);
|
||||||
uint width, height;
|
|
||||||
|
|
||||||
width = cogl_texture_get_width (COGL_TEXTURE (image->texture));
|
|
||||||
height = cogl_texture_get_height (COGL_TEXTURE (image->texture));
|
|
||||||
|
|
||||||
struct wl_shm_buffer *shm_buffer = wl_shm_buffer_get (buffer);
|
|
||||||
if (shm_buffer)
|
|
||||||
{
|
|
||||||
int rowstride = wl_shm_buffer_get_stride (shm_buffer);
|
|
||||||
|
|
||||||
wl_shm_buffer_begin_access (shm_buffer);
|
|
||||||
|
|
||||||
switch (wl_shm_buffer_get_format (shm_buffer))
|
|
||||||
{
|
|
||||||
#if G_BYTE_ORDER == G_BIG_ENDIAN
|
|
||||||
case WL_SHM_FORMAT_ARGB8888:
|
|
||||||
gbm_format = GBM_FORMAT_ARGB8888;
|
|
||||||
break;
|
|
||||||
case WL_SHM_FORMAT_XRGB8888:
|
|
||||||
gbm_format = GBM_FORMAT_XRGB8888;
|
|
||||||
break;
|
|
||||||
#else
|
|
||||||
case WL_SHM_FORMAT_ARGB8888:
|
|
||||||
gbm_format = GBM_FORMAT_ARGB8888;
|
|
||||||
break;
|
|
||||||
case WL_SHM_FORMAT_XRGB8888:
|
|
||||||
gbm_format = GBM_FORMAT_XRGB8888;
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
default:
|
|
||||||
g_warn_if_reached ();
|
|
||||||
gbm_format = GBM_FORMAT_ARGB8888;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
meta_cursor_image_load_gbm_buffer (gbm,
|
self->current_frame = 0;
|
||||||
image,
|
self->xcursor_images = load_cursor_on_client (self->cursor,
|
||||||
(uint8_t *) wl_shm_buffer_get_data (shm_buffer),
|
self->theme_scale);
|
||||||
width, height, rowstride,
|
if (!self->xcursor_images)
|
||||||
gbm_format);
|
meta_fatal ("Could not find cursor. Perhaps set XCURSOR_PATH?");
|
||||||
|
|
||||||
wl_shm_buffer_end_access (shm_buffer);
|
image = meta_cursor_sprite_get_current_frame_image (self);
|
||||||
|
meta_cursor_sprite_load_from_xcursor_image (self, image);
|
||||||
|
|
||||||
|
self->theme_dirty = FALSE;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
MetaCursorSprite *
|
||||||
|
meta_cursor_sprite_from_theme (MetaCursor cursor)
|
||||||
{
|
{
|
||||||
/* HW cursors have a predefined size (at least 64x64), which usually is bigger than cursor theme
|
MetaCursorSprite *self;
|
||||||
size, so themed cursors must be padded with transparent pixels to fill the
|
|
||||||
overlay. This is trivial if we have CPU access to the data, but it's not
|
|
||||||
possible if the buffer is in GPU memory (and possibly tiled too), so if we
|
|
||||||
don't get the right size, we fallback to GL.
|
|
||||||
*/
|
|
||||||
get_hardware_cursor_size (&cursor_width, &cursor_height);
|
|
||||||
|
|
||||||
if (width != cursor_width || height != cursor_height)
|
self = meta_cursor_sprite_new ();
|
||||||
{
|
|
||||||
meta_warning ("Invalid cursor size (must be 64x64), falling back to software (GL) cursors\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
image->bo = gbm_bo_import (gbm, GBM_BO_IMPORT_WL_BUFFER, buffer, GBM_BO_USE_CURSOR);
|
self->cursor = cursor;
|
||||||
if (!image->bo)
|
self->theme_dirty = TRUE;
|
||||||
meta_warning ("Importing HW cursor from wl_buffer failed\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
MetaCursorReference *
|
|
||||||
meta_cursor_reference_from_buffer (struct wl_resource *buffer,
|
|
||||||
int hot_x,
|
|
||||||
int hot_y)
|
|
||||||
{
|
|
||||||
MetaCursorReference *self;
|
|
||||||
|
|
||||||
self = g_slice_new0 (MetaCursorReference);
|
|
||||||
self->ref_count = 1;
|
|
||||||
meta_cursor_image_load_from_buffer (&self->image, buffer, hot_x, hot_y);
|
|
||||||
|
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
void
|
||||||
|
meta_cursor_sprite_set_texture (MetaCursorSprite *self,
|
||||||
|
CoglTexture *texture,
|
||||||
|
int hot_x,
|
||||||
|
int hot_y)
|
||||||
|
{
|
||||||
|
g_clear_pointer (&self->texture, cogl_object_unref);
|
||||||
|
if (texture)
|
||||||
|
self->texture = cogl_object_ref (texture);
|
||||||
|
self->hot_x = hot_x;
|
||||||
|
self->hot_y = hot_y;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_cursor_sprite_set_texture_scale (MetaCursorSprite *self,
|
||||||
|
float scale)
|
||||||
|
{
|
||||||
|
self->texture_scale = scale;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_cursor_sprite_set_theme_scale (MetaCursorSprite *self,
|
||||||
|
int theme_scale)
|
||||||
|
{
|
||||||
|
if (self->theme_scale != theme_scale)
|
||||||
|
self->theme_dirty = TRUE;
|
||||||
|
self->theme_scale = theme_scale;
|
||||||
|
}
|
||||||
|
|
||||||
CoglTexture *
|
CoglTexture *
|
||||||
meta_cursor_reference_get_cogl_texture (MetaCursorReference *cursor,
|
meta_cursor_sprite_get_cogl_texture (MetaCursorSprite *self)
|
||||||
int *hot_x,
|
|
||||||
int *hot_y)
|
|
||||||
{
|
{
|
||||||
if (!cursor->image.texture)
|
return COGL_TEXTURE (self->texture);
|
||||||
load_cursor_image (cursor);
|
|
||||||
|
|
||||||
if (hot_x)
|
|
||||||
*hot_x = cursor->image.hot_x;
|
|
||||||
if (hot_y)
|
|
||||||
*hot_y = cursor->image.hot_y;
|
|
||||||
|
|
||||||
return COGL_TEXTURE (cursor->image.texture);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_NATIVE_BACKEND
|
|
||||||
struct gbm_bo *
|
|
||||||
meta_cursor_reference_get_gbm_bo (MetaCursorReference *cursor,
|
|
||||||
int *hot_x,
|
|
||||||
int *hot_y)
|
|
||||||
{
|
|
||||||
if (!cursor->image.bo)
|
|
||||||
load_cursor_image (cursor);
|
|
||||||
|
|
||||||
if (hot_x)
|
|
||||||
*hot_x = cursor->image.hot_x;
|
|
||||||
if (hot_y)
|
|
||||||
*hot_y = cursor->image.hot_y;
|
|
||||||
return cursor->image.bo;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
MetaCursor
|
MetaCursor
|
||||||
meta_cursor_reference_get_meta_cursor (MetaCursorReference *cursor)
|
meta_cursor_sprite_get_meta_cursor (MetaCursorSprite *self)
|
||||||
{
|
{
|
||||||
return cursor->cursor;
|
return self->cursor;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_cursor_sprite_get_hotspot (MetaCursorSprite *self,
|
||||||
|
int *hot_x,
|
||||||
|
int *hot_y)
|
||||||
|
{
|
||||||
|
*hot_x = self->hot_x;
|
||||||
|
*hot_y = self->hot_y;
|
||||||
|
}
|
||||||
|
|
||||||
|
float
|
||||||
|
meta_cursor_sprite_get_texture_scale (MetaCursorSprite *self)
|
||||||
|
{
|
||||||
|
return self->texture_scale;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_cursor_sprite_prepare_at (MetaCursorSprite *self,
|
||||||
|
int x,
|
||||||
|
int y)
|
||||||
|
{
|
||||||
|
g_signal_emit (self, signals[PREPARE_AT], 0, x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_cursor_sprite_realize_texture (MetaCursorSprite *self)
|
||||||
|
{
|
||||||
|
if (self->theme_dirty)
|
||||||
|
meta_cursor_sprite_load_from_theme (self);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_cursor_sprite_init (MetaCursorSprite *self)
|
||||||
|
{
|
||||||
|
self->texture_scale = 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_cursor_sprite_finalize (GObject *object)
|
||||||
|
{
|
||||||
|
MetaCursorSprite *self = META_CURSOR_SPRITE (object);
|
||||||
|
|
||||||
|
if (self->xcursor_images)
|
||||||
|
XcursorImagesDestroy (self->xcursor_images);
|
||||||
|
|
||||||
|
g_clear_pointer (&self->texture, cogl_object_unref);
|
||||||
|
|
||||||
|
G_OBJECT_CLASS (meta_cursor_sprite_parent_class)->finalize (object);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_cursor_sprite_class_init (MetaCursorSpriteClass *klass)
|
||||||
|
{
|
||||||
|
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||||
|
|
||||||
|
object_class->finalize = meta_cursor_sprite_finalize;
|
||||||
|
|
||||||
|
signals[PREPARE_AT] = g_signal_new ("prepare-at",
|
||||||
|
G_TYPE_FROM_CLASS (object_class),
|
||||||
|
G_SIGNAL_RUN_LAST,
|
||||||
|
0,
|
||||||
|
NULL, NULL, NULL,
|
||||||
|
G_TYPE_NONE, 2,
|
||||||
|
G_TYPE_INT,
|
||||||
|
G_TYPE_INT);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,25 +22,54 @@
|
|||||||
#ifndef META_CURSOR_H
|
#ifndef META_CURSOR_H
|
||||||
#define META_CURSOR_H
|
#define META_CURSOR_H
|
||||||
|
|
||||||
typedef struct _MetaCursorReference MetaCursorReference;
|
|
||||||
|
|
||||||
MetaCursorReference * meta_cursor_reference_ref (MetaCursorReference *cursor);
|
|
||||||
void meta_cursor_reference_unref (MetaCursorReference *cursor);
|
|
||||||
|
|
||||||
#include <meta/common.h>
|
#include <meta/common.h>
|
||||||
|
#include <meta/boxes.h>
|
||||||
|
|
||||||
MetaCursorReference * meta_cursor_reference_from_theme (MetaCursor cursor);
|
typedef struct _MetaCursorSprite MetaCursorSprite;
|
||||||
|
|
||||||
#ifdef HAVE_WAYLAND
|
#define META_TYPE_CURSOR_SPRITE (meta_cursor_sprite_get_type ())
|
||||||
#include <wayland-server.h>
|
G_DECLARE_FINAL_TYPE (MetaCursorSprite,
|
||||||
MetaCursorReference * meta_cursor_reference_from_buffer (struct wl_resource *buffer,
|
meta_cursor_sprite,
|
||||||
int hot_x,
|
META, CURSOR_SPRITE,
|
||||||
int hot_y);
|
GObject);
|
||||||
#endif
|
|
||||||
|
|
||||||
MetaCursor meta_cursor_reference_get_meta_cursor (MetaCursorReference *cursor);
|
MetaCursorSprite * meta_cursor_sprite_new (void);
|
||||||
|
|
||||||
|
MetaCursorSprite * meta_cursor_sprite_from_theme (MetaCursor cursor);
|
||||||
|
|
||||||
|
|
||||||
|
void meta_cursor_sprite_set_theme_scale (MetaCursorSprite *self,
|
||||||
|
int scale);
|
||||||
|
|
||||||
|
MetaCursor meta_cursor_sprite_get_meta_cursor (MetaCursorSprite *self);
|
||||||
|
|
||||||
Cursor meta_cursor_create_x_cursor (Display *xdisplay,
|
Cursor meta_cursor_create_x_cursor (Display *xdisplay,
|
||||||
MetaCursor cursor);
|
MetaCursor cursor);
|
||||||
|
|
||||||
|
void meta_cursor_sprite_prepare_at (MetaCursorSprite *self,
|
||||||
|
int x,
|
||||||
|
int y);
|
||||||
|
|
||||||
|
void meta_cursor_sprite_realize_texture (MetaCursorSprite *self);
|
||||||
|
|
||||||
|
void meta_cursor_sprite_set_texture (MetaCursorSprite *self,
|
||||||
|
CoglTexture *texture,
|
||||||
|
int hot_x,
|
||||||
|
int hot_y);
|
||||||
|
|
||||||
|
void meta_cursor_sprite_set_texture_scale (MetaCursorSprite *self,
|
||||||
|
float scale);
|
||||||
|
|
||||||
|
CoglTexture *meta_cursor_sprite_get_cogl_texture (MetaCursorSprite *self);
|
||||||
|
|
||||||
|
void meta_cursor_sprite_get_hotspot (MetaCursorSprite *self,
|
||||||
|
int *hot_x,
|
||||||
|
int *hot_y);
|
||||||
|
|
||||||
|
float meta_cursor_sprite_get_texture_scale (MetaCursorSprite *self);
|
||||||
|
|
||||||
|
gboolean meta_cursor_sprite_is_animated (MetaCursorSprite *self);
|
||||||
|
void meta_cursor_sprite_tick_frame (MetaCursorSprite *self);
|
||||||
|
guint meta_cursor_sprite_get_current_frame_time (MetaCursorSprite *self);
|
||||||
|
|
||||||
#endif /* META_CURSOR_H */
|
#endif /* META_CURSOR_H */
|
||||||
|
|||||||
@@ -63,13 +63,17 @@ struct _MetaInputSettingsClass
|
|||||||
void (* set_invert_scroll) (MetaInputSettings *settings,
|
void (* set_invert_scroll) (MetaInputSettings *settings,
|
||||||
ClutterInputDevice *device,
|
ClutterInputDevice *device,
|
||||||
gboolean inverted);
|
gboolean inverted);
|
||||||
void (* set_scroll_method) (MetaInputSettings *settings,
|
void (* set_edge_scroll) (MetaInputSettings *settings,
|
||||||
ClutterInputDevice *device,
|
ClutterInputDevice *device,
|
||||||
GDesktopTouchpadScrollMethod mode);
|
gboolean enabled);
|
||||||
void (* set_scroll_button) (MetaInputSettings *settings,
|
void (* set_scroll_button) (MetaInputSettings *settings,
|
||||||
ClutterInputDevice *device,
|
ClutterInputDevice *device,
|
||||||
guint button);
|
guint button);
|
||||||
|
|
||||||
|
void (* set_click_method) (MetaInputSettings *settings,
|
||||||
|
ClutterInputDevice *device,
|
||||||
|
GDesktopTouchpadClickMethod mode);
|
||||||
|
|
||||||
void (* set_keyboard_repeat) (MetaInputSettings *settings,
|
void (* set_keyboard_repeat) (MetaInputSettings *settings,
|
||||||
gboolean repeat,
|
gboolean repeat,
|
||||||
guint delay,
|
guint delay,
|
||||||
|
|||||||
@@ -209,6 +209,10 @@ update_touchpad_left_handed (MetaInputSettings *input_settings,
|
|||||||
MetaInputSettingsPrivate *priv;
|
MetaInputSettingsPrivate *priv;
|
||||||
gboolean enabled = FALSE;
|
gboolean enabled = FALSE;
|
||||||
|
|
||||||
|
if (device &&
|
||||||
|
clutter_input_device_get_device_type (device) != CLUTTER_TOUCHPAD_DEVICE)
|
||||||
|
return;
|
||||||
|
|
||||||
priv = meta_input_settings_get_instance_private (input_settings);
|
priv = meta_input_settings_get_instance_private (input_settings);
|
||||||
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
|
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
|
||||||
handedness = g_settings_get_enum (priv->touchpad_settings, "left-handed");
|
handedness = g_settings_get_enum (priv->touchpad_settings, "left-handed");
|
||||||
@@ -230,7 +234,6 @@ update_touchpad_left_handed (MetaInputSettings *input_settings,
|
|||||||
|
|
||||||
if (device)
|
if (device)
|
||||||
{
|
{
|
||||||
g_assert (clutter_input_device_get_device_type (device) == CLUTTER_TOUCHPAD_DEVICE);
|
|
||||||
settings_device_set_bool_setting (input_settings, device,
|
settings_device_set_bool_setting (input_settings, device,
|
||||||
input_settings_class->set_left_handed,
|
input_settings_class->set_left_handed,
|
||||||
enabled);
|
enabled);
|
||||||
@@ -251,13 +254,16 @@ update_mouse_left_handed (MetaInputSettings *input_settings,
|
|||||||
MetaInputSettingsPrivate *priv;
|
MetaInputSettingsPrivate *priv;
|
||||||
gboolean enabled;
|
gboolean enabled;
|
||||||
|
|
||||||
|
if (device &&
|
||||||
|
clutter_input_device_get_device_type (device) != CLUTTER_POINTER_DEVICE)
|
||||||
|
return;
|
||||||
|
|
||||||
priv = meta_input_settings_get_instance_private (input_settings);
|
priv = meta_input_settings_get_instance_private (input_settings);
|
||||||
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
|
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
|
||||||
enabled = g_settings_get_boolean (priv->mouse_settings, "left-handed");
|
enabled = g_settings_get_boolean (priv->mouse_settings, "left-handed");
|
||||||
|
|
||||||
if (device)
|
if (device)
|
||||||
{
|
{
|
||||||
g_assert (clutter_input_device_get_device_type (device) == CLUTTER_POINTER_DEVICE);
|
|
||||||
settings_device_set_bool_setting (input_settings, device,
|
settings_device_set_bool_setting (input_settings, device,
|
||||||
input_settings_class->set_left_handed,
|
input_settings_class->set_left_handed,
|
||||||
enabled);
|
enabled);
|
||||||
@@ -279,51 +285,82 @@ update_mouse_left_handed (MetaInputSettings *input_settings,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static GSettings *
|
||||||
update_device_speed (MetaInputSettings *input_settings,
|
get_settings_for_device_type (MetaInputSettings *input_settings,
|
||||||
GSettings *settings,
|
|
||||||
ClutterInputDevice *device,
|
|
||||||
ClutterInputDeviceType type)
|
ClutterInputDeviceType type)
|
||||||
{
|
{
|
||||||
MetaInputSettingsClass *input_settings_class;
|
MetaInputSettingsPrivate *priv;
|
||||||
gdouble speed;
|
priv = meta_input_settings_get_instance_private (input_settings);
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case CLUTTER_POINTER_DEVICE:
|
||||||
|
return priv->mouse_settings;
|
||||||
|
case CLUTTER_TOUCHPAD_DEVICE:
|
||||||
|
return priv->touchpad_settings;
|
||||||
|
default:
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
|
static void
|
||||||
speed = g_settings_get_double (settings, "speed");
|
update_device_speed (MetaInputSettings *input_settings,
|
||||||
|
ClutterInputDevice *device)
|
||||||
|
{
|
||||||
|
GSettings *settings;
|
||||||
|
ConfigDoubleFunc func;
|
||||||
|
const gchar *key = "speed";
|
||||||
|
|
||||||
|
func = META_INPUT_SETTINGS_GET_CLASS (input_settings)->set_speed;
|
||||||
|
|
||||||
if (device)
|
if (device)
|
||||||
settings_device_set_double_setting (input_settings, device,
|
{
|
||||||
input_settings_class->set_speed,
|
settings = get_settings_for_device_type (input_settings,
|
||||||
speed);
|
clutter_input_device_get_device_type (device));
|
||||||
|
if (!settings)
|
||||||
|
return;
|
||||||
|
|
||||||
|
settings_device_set_double_setting (input_settings, device, func,
|
||||||
|
g_settings_get_double (settings, key));
|
||||||
|
}
|
||||||
else
|
else
|
||||||
settings_set_double_setting (input_settings, type,
|
{
|
||||||
input_settings_class->set_speed,
|
settings = get_settings_for_device_type (input_settings, CLUTTER_POINTER_DEVICE);
|
||||||
speed);
|
settings_set_double_setting (input_settings, CLUTTER_POINTER_DEVICE, func,
|
||||||
|
g_settings_get_double (settings, key));
|
||||||
|
settings = get_settings_for_device_type (input_settings, CLUTTER_TOUCHPAD_DEVICE);
|
||||||
|
settings_set_double_setting (input_settings, CLUTTER_TOUCHPAD_DEVICE, func,
|
||||||
|
g_settings_get_double (settings, key));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
update_device_natural_scroll (MetaInputSettings *input_settings,
|
update_device_natural_scroll (MetaInputSettings *input_settings,
|
||||||
GSettings *settings,
|
ClutterInputDevice *device)
|
||||||
ClutterInputDevice *device,
|
|
||||||
ClutterInputDeviceType type)
|
|
||||||
{
|
{
|
||||||
MetaInputSettingsClass *input_settings_class;
|
GSettings *settings;
|
||||||
gboolean enabled;
|
ConfigBoolFunc func;
|
||||||
|
const gchar *key = "natural-scroll";
|
||||||
|
|
||||||
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
|
func = META_INPUT_SETTINGS_GET_CLASS (input_settings)->set_invert_scroll;
|
||||||
enabled = g_settings_get_boolean (settings, "natural-scroll");
|
|
||||||
|
|
||||||
if (device)
|
if (device)
|
||||||
{
|
{
|
||||||
settings_device_set_bool_setting (input_settings, device,
|
settings = get_settings_for_device_type (input_settings,
|
||||||
input_settings_class->set_invert_scroll,
|
clutter_input_device_get_device_type (device));
|
||||||
enabled);
|
if (!settings)
|
||||||
|
return;
|
||||||
|
|
||||||
|
settings_device_set_bool_setting (input_settings, device, func,
|
||||||
|
g_settings_get_boolean (settings, key));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
settings_set_bool_setting (input_settings, type,
|
settings = get_settings_for_device_type (input_settings, CLUTTER_POINTER_DEVICE);
|
||||||
input_settings_class->set_invert_scroll,
|
settings_set_bool_setting (input_settings, CLUTTER_POINTER_DEVICE, func,
|
||||||
enabled);
|
g_settings_get_boolean (settings, key));
|
||||||
|
settings = get_settings_for_device_type (input_settings, CLUTTER_TOUCHPAD_DEVICE);
|
||||||
|
settings_set_bool_setting (input_settings, CLUTTER_TOUCHPAD_DEVICE, func,
|
||||||
|
g_settings_get_boolean (settings, key));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -335,6 +372,10 @@ update_touchpad_tap_enabled (MetaInputSettings *input_settings,
|
|||||||
MetaInputSettingsPrivate *priv;
|
MetaInputSettingsPrivate *priv;
|
||||||
gboolean enabled;
|
gboolean enabled;
|
||||||
|
|
||||||
|
if (device &&
|
||||||
|
clutter_input_device_get_device_type (device) != CLUTTER_TOUCHPAD_DEVICE)
|
||||||
|
return;
|
||||||
|
|
||||||
priv = meta_input_settings_get_instance_private (input_settings);
|
priv = meta_input_settings_get_instance_private (input_settings);
|
||||||
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
|
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
|
||||||
enabled = g_settings_get_boolean (priv->touchpad_settings, "tap-to-click");
|
enabled = g_settings_get_boolean (priv->touchpad_settings, "tap-to-click");
|
||||||
@@ -354,27 +395,61 @@ update_touchpad_tap_enabled (MetaInputSettings *input_settings,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
update_touchpad_scroll_method (MetaInputSettings *input_settings,
|
update_touchpad_edge_scroll (MetaInputSettings *input_settings,
|
||||||
ClutterInputDevice *device)
|
ClutterInputDevice *device)
|
||||||
{
|
{
|
||||||
MetaInputSettingsClass *input_settings_class;
|
MetaInputSettingsClass *input_settings_class;
|
||||||
GDesktopTouchpadScrollMethod method;
|
gboolean edge_scroll_enabled;
|
||||||
MetaInputSettingsPrivate *priv;
|
MetaInputSettingsPrivate *priv;
|
||||||
|
|
||||||
|
if (device &&
|
||||||
|
clutter_input_device_get_device_type (device) != CLUTTER_TOUCHPAD_DEVICE)
|
||||||
|
return;
|
||||||
|
|
||||||
priv = meta_input_settings_get_instance_private (input_settings);
|
priv = meta_input_settings_get_instance_private (input_settings);
|
||||||
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
|
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
|
||||||
method = g_settings_get_enum (priv->touchpad_settings, "scroll-method");
|
edge_scroll_enabled = g_settings_get_boolean (priv->touchpad_settings, "edge-scrolling-enabled");
|
||||||
|
|
||||||
|
if (device)
|
||||||
|
{
|
||||||
|
settings_device_set_bool_setting (input_settings, device,
|
||||||
|
input_settings_class->set_edge_scroll,
|
||||||
|
edge_scroll_enabled);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
settings_set_bool_setting (input_settings, CLUTTER_TOUCHPAD_DEVICE,
|
||||||
|
(ConfigBoolFunc) input_settings_class->set_edge_scroll,
|
||||||
|
edge_scroll_enabled);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
update_touchpad_click_method (MetaInputSettings *input_settings,
|
||||||
|
ClutterInputDevice *device)
|
||||||
|
{
|
||||||
|
MetaInputSettingsClass *input_settings_class;
|
||||||
|
GDesktopTouchpadClickMethod method;
|
||||||
|
MetaInputSettingsPrivate *priv;
|
||||||
|
|
||||||
|
if (device &&
|
||||||
|
clutter_input_device_get_device_type (device) != CLUTTER_TOUCHPAD_DEVICE)
|
||||||
|
return;
|
||||||
|
|
||||||
|
priv = meta_input_settings_get_instance_private (input_settings);
|
||||||
|
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
|
||||||
|
method = g_settings_get_enum (priv->touchpad_settings, "click-method");
|
||||||
|
|
||||||
if (device)
|
if (device)
|
||||||
{
|
{
|
||||||
settings_device_set_uint_setting (input_settings, device,
|
settings_device_set_uint_setting (input_settings, device,
|
||||||
input_settings_class->set_scroll_method,
|
input_settings_class->set_click_method,
|
||||||
method);
|
method);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
settings_set_uint_setting (input_settings, CLUTTER_TOUCHPAD_DEVICE,
|
settings_set_uint_setting (input_settings, CLUTTER_TOUCHPAD_DEVICE,
|
||||||
(ConfigUintFunc) input_settings_class->set_scroll_method,
|
(ConfigUintFunc) input_settings_class->set_click_method,
|
||||||
method);
|
method);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -387,6 +462,10 @@ update_touchpad_send_events (MetaInputSettings *input_settings,
|
|||||||
MetaInputSettingsPrivate *priv;
|
MetaInputSettingsPrivate *priv;
|
||||||
GDesktopDeviceSendEvents mode;
|
GDesktopDeviceSendEvents mode;
|
||||||
|
|
||||||
|
if (device &&
|
||||||
|
clutter_input_device_get_device_type (device) != CLUTTER_TOUCHPAD_DEVICE)
|
||||||
|
return;
|
||||||
|
|
||||||
priv = meta_input_settings_get_instance_private (input_settings);
|
priv = meta_input_settings_get_instance_private (input_settings);
|
||||||
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
|
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
|
||||||
mode = g_settings_get_enum (priv->touchpad_settings, "send-events");
|
mode = g_settings_get_enum (priv->touchpad_settings, "send-events");
|
||||||
@@ -429,25 +508,28 @@ update_trackball_scroll_button (MetaInputSettings *input_settings,
|
|||||||
MetaInputSettingsPrivate *priv;
|
MetaInputSettingsPrivate *priv;
|
||||||
guint button;
|
guint button;
|
||||||
|
|
||||||
|
if (device && !device_is_trackball (device))
|
||||||
|
return;
|
||||||
|
|
||||||
priv = meta_input_settings_get_instance_private (input_settings);
|
priv = meta_input_settings_get_instance_private (input_settings);
|
||||||
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
|
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
|
||||||
button = g_settings_get_uint (priv->trackball_settings, "scroll-wheel-emulation-button");
|
/* This key is 'i' in the schema but it also specifies a minimum
|
||||||
|
* range of 0 so the cast here is safe. */
|
||||||
|
button = (guint) g_settings_get_int (priv->trackball_settings, "scroll-wheel-emulation-button");
|
||||||
|
|
||||||
if (device && device_is_trackball (device))
|
if (device)
|
||||||
{
|
{
|
||||||
input_settings_class->set_scroll_button (input_settings, device, button);
|
input_settings_class->set_scroll_button (input_settings, device, button);
|
||||||
}
|
}
|
||||||
else if (!device)
|
else if (!device)
|
||||||
{
|
{
|
||||||
MetaInputSettingsPrivate *priv;
|
|
||||||
const GSList *devices;
|
const GSList *devices;
|
||||||
|
|
||||||
priv = meta_input_settings_get_instance_private (input_settings);
|
|
||||||
devices = clutter_device_manager_peek_devices (priv->device_manager);
|
devices = clutter_device_manager_peek_devices (priv->device_manager);
|
||||||
|
|
||||||
while (devices)
|
while (devices)
|
||||||
{
|
{
|
||||||
ClutterInputDevice *device = devices->data;
|
device = devices->data;
|
||||||
|
|
||||||
if (device_is_trackball (device))
|
if (device_is_trackball (device))
|
||||||
input_settings_class->set_scroll_button (input_settings, device, button);
|
input_settings_class->set_scroll_button (input_settings, device, button);
|
||||||
@@ -547,28 +629,26 @@ meta_input_settings_changed_cb (GSettings *settings,
|
|||||||
if (strcmp (key, "left-handed") == 0)
|
if (strcmp (key, "left-handed") == 0)
|
||||||
update_mouse_left_handed (input_settings, NULL);
|
update_mouse_left_handed (input_settings, NULL);
|
||||||
else if (strcmp (key, "speed") == 0)
|
else if (strcmp (key, "speed") == 0)
|
||||||
update_device_speed (input_settings, settings, NULL,
|
update_device_speed (input_settings, NULL);
|
||||||
CLUTTER_POINTER_DEVICE);
|
|
||||||
else if (strcmp (key, "natural-scroll") == 0)
|
else if (strcmp (key, "natural-scroll") == 0)
|
||||||
update_device_natural_scroll (input_settings, settings,
|
update_device_natural_scroll (input_settings, NULL);
|
||||||
NULL, CLUTTER_POINTER_DEVICE);
|
|
||||||
}
|
}
|
||||||
else if (settings == priv->touchpad_settings)
|
else if (settings == priv->touchpad_settings)
|
||||||
{
|
{
|
||||||
if (strcmp (key, "left-handed") == 0)
|
if (strcmp (key, "left-handed") == 0)
|
||||||
update_touchpad_left_handed (input_settings, NULL);
|
update_touchpad_left_handed (input_settings, NULL);
|
||||||
else if (strcmp (key, "speed") == 0)
|
else if (strcmp (key, "speed") == 0)
|
||||||
update_device_speed (input_settings, settings, NULL,
|
update_device_speed (input_settings, NULL);
|
||||||
CLUTTER_TOUCHPAD_DEVICE);
|
|
||||||
else if (strcmp (key, "natural-scroll") == 0)
|
else if (strcmp (key, "natural-scroll") == 0)
|
||||||
update_device_natural_scroll (input_settings, settings,
|
update_device_natural_scroll (input_settings, NULL);
|
||||||
NULL, CLUTTER_TOUCHPAD_DEVICE);
|
|
||||||
else if (strcmp (key, "tap-to-click") == 0)
|
else if (strcmp (key, "tap-to-click") == 0)
|
||||||
update_touchpad_tap_enabled (input_settings, NULL);
|
update_touchpad_tap_enabled (input_settings, NULL);
|
||||||
else if (strcmp (key, "send-events") == 0)
|
else if (strcmp (key, "send-events") == 0)
|
||||||
update_touchpad_send_events (input_settings, NULL);
|
update_touchpad_send_events (input_settings, NULL);
|
||||||
else if (strcmp (key, "scroll-method") == 0)
|
else if (strcmp (key, "edge-scrolling-enabled") == 0)
|
||||||
update_touchpad_scroll_method (input_settings, NULL);
|
update_touchpad_edge_scroll (input_settings, NULL);
|
||||||
|
else if (strcmp (key, "click-method") == 0)
|
||||||
|
update_touchpad_click_method (input_settings, NULL);
|
||||||
}
|
}
|
||||||
else if (settings == priv->trackball_settings)
|
else if (settings == priv->trackball_settings)
|
||||||
{
|
{
|
||||||
@@ -678,45 +758,36 @@ check_add_mappable_device (MetaInputSettings *input_settings,
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
apply_device_settings (MetaInputSettings *input_settings,
|
||||||
|
ClutterInputDevice *device)
|
||||||
|
{
|
||||||
|
update_mouse_left_handed (input_settings, device);
|
||||||
|
update_device_speed (input_settings, device);
|
||||||
|
update_device_natural_scroll (input_settings, device);
|
||||||
|
|
||||||
|
update_touchpad_left_handed (input_settings, device);
|
||||||
|
update_device_speed (input_settings, device);
|
||||||
|
update_device_natural_scroll (input_settings, device);
|
||||||
|
update_touchpad_tap_enabled (input_settings, device);
|
||||||
|
update_touchpad_send_events (input_settings, device);
|
||||||
|
update_touchpad_edge_scroll (input_settings, device);
|
||||||
|
update_touchpad_click_method (input_settings, device);
|
||||||
|
|
||||||
|
update_trackball_scroll_button (input_settings, device);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_input_settings_device_added (ClutterDeviceManager *device_manager,
|
meta_input_settings_device_added (ClutterDeviceManager *device_manager,
|
||||||
ClutterInputDevice *device,
|
ClutterInputDevice *device,
|
||||||
MetaInputSettings *input_settings)
|
MetaInputSettings *input_settings)
|
||||||
{
|
{
|
||||||
ClutterInputDeviceType type;
|
|
||||||
MetaInputSettingsPrivate *priv;
|
|
||||||
|
|
||||||
if (clutter_input_device_get_device_mode (device) == CLUTTER_INPUT_MODE_MASTER)
|
if (clutter_input_device_get_device_mode (device) == CLUTTER_INPUT_MODE_MASTER)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
priv = meta_input_settings_get_instance_private (input_settings);
|
apply_device_settings (input_settings, device);
|
||||||
type = clutter_input_device_get_device_type (device);
|
|
||||||
|
|
||||||
if (type == CLUTTER_POINTER_DEVICE)
|
|
||||||
{
|
|
||||||
update_mouse_left_handed (input_settings, device);
|
|
||||||
update_device_speed (input_settings, priv->mouse_settings, device, type);
|
|
||||||
|
|
||||||
if (device_is_trackball (device))
|
|
||||||
update_trackball_scroll_button (input_settings, device);
|
|
||||||
}
|
|
||||||
else if (type == CLUTTER_TOUCHPAD_DEVICE)
|
|
||||||
{
|
|
||||||
update_touchpad_left_handed (input_settings, device);
|
|
||||||
update_touchpad_tap_enabled (input_settings, device);
|
|
||||||
update_touchpad_scroll_method (input_settings, device);
|
|
||||||
update_touchpad_send_events (input_settings, device);
|
|
||||||
|
|
||||||
update_device_speed (input_settings, priv->touchpad_settings,
|
|
||||||
device, type);
|
|
||||||
update_device_natural_scroll (input_settings, priv->touchpad_settings,
|
|
||||||
device, type);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
check_add_mappable_device (input_settings, device);
|
check_add_mappable_device (input_settings, device);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_input_settings_device_removed (ClutterDeviceManager *device_manager,
|
meta_input_settings_device_removed (ClutterDeviceManager *device_manager,
|
||||||
@@ -753,25 +824,9 @@ static void
|
|||||||
meta_input_settings_constructed (GObject *object)
|
meta_input_settings_constructed (GObject *object)
|
||||||
{
|
{
|
||||||
MetaInputSettings *input_settings = META_INPUT_SETTINGS (object);
|
MetaInputSettings *input_settings = META_INPUT_SETTINGS (object);
|
||||||
MetaInputSettingsPrivate *priv;
|
|
||||||
|
|
||||||
priv = meta_input_settings_get_instance_private (input_settings);
|
|
||||||
|
|
||||||
update_mouse_left_handed (input_settings, NULL);
|
|
||||||
|
|
||||||
update_touchpad_left_handed (input_settings, NULL);
|
|
||||||
update_touchpad_tap_enabled (input_settings, NULL);
|
|
||||||
update_touchpad_send_events (input_settings, NULL);
|
|
||||||
|
|
||||||
update_device_natural_scroll (input_settings, priv->touchpad_settings,
|
|
||||||
NULL, CLUTTER_TOUCHPAD_DEVICE);
|
|
||||||
update_device_speed (input_settings, priv->touchpad_settings, NULL,
|
|
||||||
CLUTTER_TOUCHPAD_DEVICE);
|
|
||||||
update_device_speed (input_settings, priv->mouse_settings, NULL,
|
|
||||||
CLUTTER_POINTER_DEVICE);
|
|
||||||
|
|
||||||
|
apply_device_settings (input_settings, NULL);
|
||||||
update_keyboard_repeat (input_settings);
|
update_keyboard_repeat (input_settings);
|
||||||
|
|
||||||
check_mappable_devices (input_settings);
|
check_mappable_devices (input_settings);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -65,6 +65,7 @@ typedef struct {
|
|||||||
|
|
||||||
gboolean is_primary;
|
gboolean is_primary;
|
||||||
gboolean is_presentation;
|
gboolean is_presentation;
|
||||||
|
gboolean is_underscanning;
|
||||||
} MetaOutputConfig;
|
} MetaOutputConfig;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@@ -82,7 +83,8 @@ struct _MetaMonitorConfig {
|
|||||||
gboolean current_is_for_laptop_lid;
|
gboolean current_is_for_laptop_lid;
|
||||||
MetaConfiguration *previous;
|
MetaConfiguration *previous;
|
||||||
|
|
||||||
GFile *file;
|
GFile *user_file;
|
||||||
|
GFile *system_file;
|
||||||
GCancellable *save_cancellable;
|
GCancellable *save_cancellable;
|
||||||
|
|
||||||
UpClient *up_client;
|
UpClient *up_client;
|
||||||
@@ -238,6 +240,7 @@ meta_monitor_config_init (MetaMonitorConfig *self)
|
|||||||
{
|
{
|
||||||
const char *filename;
|
const char *filename;
|
||||||
char *path;
|
char *path;
|
||||||
|
const char * const *system_dirs;
|
||||||
|
|
||||||
self->configs = g_hash_table_new_full (config_hash, config_equal, NULL, (GDestroyNotify) config_unref);
|
self->configs = g_hash_table_new_full (config_hash, config_equal, NULL, (GDestroyNotify) config_unref);
|
||||||
|
|
||||||
@@ -246,9 +249,17 @@ meta_monitor_config_init (MetaMonitorConfig *self)
|
|||||||
filename = "monitors.xml";
|
filename = "monitors.xml";
|
||||||
|
|
||||||
path = g_build_filename (g_get_user_config_dir (), filename, NULL);
|
path = g_build_filename (g_get_user_config_dir (), filename, NULL);
|
||||||
self->file = g_file_new_for_path (path);
|
self->user_file = g_file_new_for_path (path);
|
||||||
g_free (path);
|
g_free (path);
|
||||||
|
|
||||||
|
for (system_dirs = g_get_system_config_dirs (); !self->system_file && *system_dirs; system_dirs++)
|
||||||
|
{
|
||||||
|
path = g_build_filename (*system_dirs, filename, NULL);
|
||||||
|
if (g_file_test (path, G_FILE_TEST_EXISTS))
|
||||||
|
self->system_file = g_file_new_for_path (path);
|
||||||
|
g_free (path);
|
||||||
|
}
|
||||||
|
|
||||||
self->up_client = up_client_new ();
|
self->up_client = up_client_new ();
|
||||||
self->lid_is_closed = up_client_get_lid_is_closed (self->up_client);
|
self->lid_is_closed = up_client_get_lid_is_closed (self->up_client);
|
||||||
|
|
||||||
@@ -393,7 +404,8 @@ handle_start_element (GMarkupParseContext *context,
|
|||||||
strcmp (element_name, "reflect_x") == 0 ||
|
strcmp (element_name, "reflect_x") == 0 ||
|
||||||
strcmp (element_name, "reflect_y") == 0 ||
|
strcmp (element_name, "reflect_y") == 0 ||
|
||||||
strcmp (element_name, "primary") == 0 ||
|
strcmp (element_name, "primary") == 0 ||
|
||||||
strcmp (element_name, "presentation") == 0) && parser->unknown_count == 0)
|
strcmp (element_name, "presentation") == 0 ||
|
||||||
|
strcmp (element_name, "underscanning") == 0) && parser->unknown_count == 0)
|
||||||
{
|
{
|
||||||
parser->state = STATE_OUTPUT_FIELD;
|
parser->state = STATE_OUTPUT_FIELD;
|
||||||
|
|
||||||
@@ -477,8 +489,8 @@ handle_end_element (GMarkupParseContext *context,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (parser->output.rect.width == 0 &&
|
if (parser->output.rect.width == 0 ||
|
||||||
parser->output.rect.width == 0)
|
parser->output.rect.height == 0)
|
||||||
parser->output.enabled = FALSE;
|
parser->output.enabled = FALSE;
|
||||||
else
|
else
|
||||||
parser->output.enabled = TRUE;
|
parser->output.enabled = TRUE;
|
||||||
@@ -700,6 +712,8 @@ handle_text (GMarkupParseContext *context,
|
|||||||
parser->output.is_primary = read_bool (text, text_len, error);
|
parser->output.is_primary = read_bool (text, text_len, error);
|
||||||
else if (strcmp (parser->output_field, "presentation") == 0)
|
else if (strcmp (parser->output_field, "presentation") == 0)
|
||||||
parser->output.is_presentation = read_bool (text, text_len, error);
|
parser->output.is_presentation = read_bool (text, text_len, error);
|
||||||
|
else if (strcmp (parser->output_field, "underscanning") == 0)
|
||||||
|
parser->output.is_underscanning = read_bool (text, text_len, error);
|
||||||
else
|
else
|
||||||
g_assert_not_reached ();
|
g_assert_not_reached ();
|
||||||
return;
|
return;
|
||||||
@@ -717,8 +731,8 @@ static const GMarkupParser config_parser = {
|
|||||||
.text = handle_text,
|
.text = handle_text,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static gboolean
|
||||||
meta_monitor_config_load (MetaMonitorConfig *self)
|
load_config_file (MetaMonitorConfig *self, GFile *file)
|
||||||
{
|
{
|
||||||
char *contents;
|
char *contents;
|
||||||
gsize size;
|
gsize size;
|
||||||
@@ -736,14 +750,12 @@ meta_monitor_config_load (MetaMonitorConfig *self)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
error = NULL;
|
error = NULL;
|
||||||
ok = g_file_load_contents (self->file, NULL, &contents, &size, NULL, &error);
|
ok = g_file_load_contents (file, NULL, &contents, &size, NULL, &error);
|
||||||
if (!ok)
|
if (!ok)
|
||||||
{
|
{
|
||||||
if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND))
|
|
||||||
meta_warning ("Failed to load stored monitor configuration: %s\n", error->message);
|
|
||||||
|
|
||||||
g_error_free (error);
|
g_error_free (error);
|
||||||
return;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
memset (&parser, 0, sizeof (ConfigParser));
|
memset (&parser, 0, sizeof (ConfigParser));
|
||||||
@@ -772,6 +784,17 @@ meta_monitor_config_load (MetaMonitorConfig *self)
|
|||||||
|
|
||||||
g_markup_parse_context_free (context);
|
g_markup_parse_context_free (context);
|
||||||
g_free (contents);
|
g_free (contents);
|
||||||
|
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_monitor_config_load (MetaMonitorConfig *self)
|
||||||
|
{
|
||||||
|
if (self->user_file && load_config_file (self, self->user_file))
|
||||||
|
return;
|
||||||
|
if (self->system_file && load_config_file (self, self->system_file))
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
MetaMonitorConfig *
|
MetaMonitorConfig *
|
||||||
@@ -863,14 +886,14 @@ apply_configuration (MetaMonitorConfig *self,
|
|||||||
MetaConfiguration *config,
|
MetaConfiguration *config,
|
||||||
MetaMonitorManager *manager)
|
MetaMonitorManager *manager)
|
||||||
{
|
{
|
||||||
GPtrArray *crtcs, *outputs;
|
g_autoptr(GPtrArray) crtcs = NULL;
|
||||||
gboolean ret = FALSE;
|
g_autoptr(GPtrArray) outputs = NULL;
|
||||||
|
|
||||||
crtcs = g_ptr_array_new_full (config->n_outputs, (GDestroyNotify)meta_crtc_info_free);
|
crtcs = g_ptr_array_new_full (config->n_outputs, (GDestroyNotify)meta_crtc_info_free);
|
||||||
outputs = g_ptr_array_new_full (config->n_outputs, (GDestroyNotify)meta_output_info_free);
|
outputs = g_ptr_array_new_full (config->n_outputs, (GDestroyNotify)meta_output_info_free);
|
||||||
|
|
||||||
if (!meta_monitor_config_assign_crtcs (config, manager, crtcs, outputs))
|
if (!meta_monitor_config_assign_crtcs (config, manager, crtcs, outputs))
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
meta_monitor_manager_apply_configuration (manager,
|
meta_monitor_manager_apply_configuration (manager,
|
||||||
(MetaCRTCInfo**)crtcs->pdata, crtcs->len,
|
(MetaCRTCInfo**)crtcs->pdata, crtcs->len,
|
||||||
@@ -882,12 +905,7 @@ apply_configuration (MetaMonitorConfig *self,
|
|||||||
* inside turn_off_laptop_display / apply_configuration_with_lid */
|
* inside turn_off_laptop_display / apply_configuration_with_lid */
|
||||||
self->current_is_for_laptop_lid = FALSE;
|
self->current_is_for_laptop_lid = FALSE;
|
||||||
|
|
||||||
ret = TRUE;
|
return TRUE;
|
||||||
|
|
||||||
out:
|
|
||||||
g_ptr_array_unref (crtcs);
|
|
||||||
g_ptr_array_unref (outputs);
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
@@ -1056,12 +1074,12 @@ meta_monitor_config_apply_stored (MetaMonitorConfig *self,
|
|||||||
* which are internal monitors), or failing that, the one with the
|
* which are internal monitors), or failing that, the one with the
|
||||||
* best resolution
|
* best resolution
|
||||||
*/
|
*/
|
||||||
static MetaOutput *
|
static int
|
||||||
find_primary_output (MetaOutput *outputs,
|
find_primary_output (MetaOutput *outputs,
|
||||||
unsigned n_outputs)
|
unsigned n_outputs)
|
||||||
{
|
{
|
||||||
unsigned i;
|
unsigned i;
|
||||||
MetaOutput *best;
|
int best;
|
||||||
int best_width, best_height;
|
int best_width, best_height;
|
||||||
|
|
||||||
g_assert (n_outputs >= 1);
|
g_assert (n_outputs >= 1);
|
||||||
@@ -1069,23 +1087,23 @@ find_primary_output (MetaOutput *outputs,
|
|||||||
for (i = 0; i < n_outputs; i++)
|
for (i = 0; i < n_outputs; i++)
|
||||||
{
|
{
|
||||||
if (outputs[i].is_primary)
|
if (outputs[i].is_primary)
|
||||||
return &outputs[i];
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < n_outputs; i++)
|
for (i = 0; i < n_outputs; i++)
|
||||||
{
|
{
|
||||||
if (output_is_laptop (&outputs[i]))
|
if (output_is_laptop (&outputs[i]))
|
||||||
return &outputs[i];
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
best = NULL;
|
best = -1;
|
||||||
best_width = 0; best_height = 0;
|
best_width = 0; best_height = 0;
|
||||||
for (i = 0; i < n_outputs; i++)
|
for (i = 0; i < n_outputs; i++)
|
||||||
{
|
{
|
||||||
if (outputs[i].preferred_mode->width * outputs[i].preferred_mode->height >
|
if (outputs[i].preferred_mode->width * outputs[i].preferred_mode->height >
|
||||||
best_width * best_height)
|
best_width * best_height)
|
||||||
{
|
{
|
||||||
best = &outputs[i];
|
best = i;
|
||||||
best_width = outputs[i].preferred_mode->width;
|
best_width = outputs[i].preferred_mode->width;
|
||||||
best_height = outputs[i].preferred_mode->height;
|
best_height = outputs[i].preferred_mode->height;
|
||||||
}
|
}
|
||||||
@@ -1123,7 +1141,7 @@ make_suggested_config (MetaMonitorConfig *self,
|
|||||||
MetaConfiguration *config)
|
MetaConfiguration *config)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
MetaOutput *primary;
|
int primary;
|
||||||
GList *region = NULL;
|
GList *region = NULL;
|
||||||
|
|
||||||
g_return_val_if_fail (config != NULL, FALSE);
|
g_return_val_if_fail (config != NULL, FALSE);
|
||||||
@@ -1131,7 +1149,7 @@ make_suggested_config (MetaMonitorConfig *self,
|
|||||||
|
|
||||||
for (i = 0; i < n_outputs; i++)
|
for (i = 0; i < n_outputs; i++)
|
||||||
{
|
{
|
||||||
gboolean is_primary = (&outputs[i] == primary);
|
gboolean is_primary = ((int)i == primary);
|
||||||
|
|
||||||
if (outputs[i].suggested_x < 0 || outputs[i].suggested_y < 0)
|
if (outputs[i].suggested_x < 0 || outputs[i].suggested_y < 0)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@@ -1158,6 +1176,81 @@ make_suggested_config (MetaMonitorConfig *self,
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
config_one_untiled_output (MetaOutput *outputs,
|
||||||
|
MetaConfiguration *config,
|
||||||
|
int idx, gboolean is_primary,
|
||||||
|
int *x, unsigned long *output_configured_bitmap)
|
||||||
|
{
|
||||||
|
MetaOutput *output = &outputs[idx];
|
||||||
|
|
||||||
|
if (*output_configured_bitmap & (1 << idx))
|
||||||
|
return;
|
||||||
|
|
||||||
|
init_config_from_preferred_mode (&config->outputs[idx], output);
|
||||||
|
config->outputs[idx].is_primary = is_primary;
|
||||||
|
config->outputs[idx].rect.x = *x;
|
||||||
|
*x += config->outputs[idx].rect.width;
|
||||||
|
*output_configured_bitmap |= (1 << idx);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
config_one_tiled_group (MetaOutput *outputs,
|
||||||
|
MetaConfiguration *config,
|
||||||
|
int base_idx, gboolean is_primary,
|
||||||
|
int n_outputs,
|
||||||
|
int *x, unsigned long *output_configured_bitmap)
|
||||||
|
{
|
||||||
|
guint32 num_h_tile, num_v_tile, ht, vt;
|
||||||
|
int j;
|
||||||
|
int cur_x, cur_y, addx = 0;
|
||||||
|
|
||||||
|
if (*output_configured_bitmap & (1 << base_idx))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (outputs[base_idx].tile_info.group_id == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
cur_x = cur_y = 0;
|
||||||
|
num_h_tile = outputs[base_idx].tile_info.max_h_tiles;
|
||||||
|
num_v_tile = outputs[base_idx].tile_info.max_v_tiles;
|
||||||
|
|
||||||
|
/* iterate over horizontal tiles */
|
||||||
|
cur_x = *x;
|
||||||
|
for (ht = 0; ht < num_h_tile; ht++)
|
||||||
|
{
|
||||||
|
cur_y = 0;
|
||||||
|
addx = 0;
|
||||||
|
for (vt = 0; vt < num_v_tile; vt++)
|
||||||
|
{
|
||||||
|
for (j = 0; j < n_outputs; j++)
|
||||||
|
{
|
||||||
|
if (outputs[j].tile_info.group_id != outputs[base_idx].tile_info.group_id)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (outputs[j].tile_info.loc_h_tile != ht ||
|
||||||
|
outputs[j].tile_info.loc_v_tile != vt)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (ht == 0 && vt == 0 && is_primary)
|
||||||
|
config->outputs[j].is_primary = TRUE;
|
||||||
|
|
||||||
|
init_config_from_preferred_mode (&config->outputs[j], &outputs[j]);
|
||||||
|
config->outputs[j].rect.x = cur_x;
|
||||||
|
config->outputs[j].rect.y = cur_y;
|
||||||
|
|
||||||
|
*output_configured_bitmap |= (1 << j);
|
||||||
|
cur_y += outputs[j].tile_info.tile_h;
|
||||||
|
if (vt == 0)
|
||||||
|
addx += outputs[j].tile_info.tile_w;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cur_x += addx;
|
||||||
|
}
|
||||||
|
*x = cur_x;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
make_linear_config (MetaMonitorConfig *self,
|
make_linear_config (MetaMonitorConfig *self,
|
||||||
MetaOutput *outputs,
|
MetaOutput *outputs,
|
||||||
@@ -1166,31 +1259,41 @@ make_linear_config (MetaMonitorConfig *self,
|
|||||||
int max_height,
|
int max_height,
|
||||||
MetaConfiguration *config)
|
MetaConfiguration *config)
|
||||||
{
|
{
|
||||||
MetaOutput *primary;
|
unsigned long output_configured_bitmap = 0;
|
||||||
unsigned i;
|
unsigned i;
|
||||||
int x;
|
int x;
|
||||||
|
int primary;
|
||||||
|
|
||||||
g_return_if_fail (config != NULL);
|
g_return_if_fail (config != NULL);
|
||||||
|
|
||||||
primary = find_primary_output (outputs, n_outputs);
|
primary = find_primary_output (outputs, n_outputs);
|
||||||
|
|
||||||
x = primary->preferred_mode->width;
|
x = 0;
|
||||||
for (i = 0; i < n_outputs; i++)
|
/* set the primary up first at 0 */
|
||||||
|
if (outputs[primary].tile_info.group_id)
|
||||||
{
|
{
|
||||||
gboolean is_primary = (&outputs[i] == primary);
|
config_one_tiled_group (outputs, config, primary, TRUE, n_outputs,
|
||||||
|
&x, &output_configured_bitmap);
|
||||||
init_config_from_preferred_mode (&config->outputs[i], &outputs[i]);
|
|
||||||
config->outputs[i].is_primary = is_primary;
|
|
||||||
|
|
||||||
if (is_primary)
|
|
||||||
{
|
|
||||||
config->outputs[i].rect.x = 0;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
config->outputs[i].rect.x = x;
|
config_one_untiled_output (outputs, config, primary, TRUE,
|
||||||
x += config->outputs[i].rect.width;
|
&x, &output_configured_bitmap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* then add other tiled monitors */
|
||||||
|
for (i = 0; i < n_outputs; i++)
|
||||||
|
{
|
||||||
|
config_one_tiled_group (outputs, config, i, FALSE, n_outputs,
|
||||||
|
&x, &output_configured_bitmap);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* then add remaining monitors */
|
||||||
|
for (i = 0; i < n_outputs; i++)
|
||||||
|
{
|
||||||
|
config_one_untiled_output (outputs, config, i, FALSE,
|
||||||
|
&x, &output_configured_bitmap);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1314,7 +1417,7 @@ ensure_at_least_one_output (MetaMonitorConfig *self,
|
|||||||
unsigned n_outputs)
|
unsigned n_outputs)
|
||||||
{
|
{
|
||||||
MetaConfiguration *config;
|
MetaConfiguration *config;
|
||||||
MetaOutput *primary;
|
int primary;
|
||||||
unsigned i;
|
unsigned i;
|
||||||
|
|
||||||
/* Check that we have at least one active output */
|
/* Check that we have at least one active output */
|
||||||
@@ -1332,7 +1435,7 @@ ensure_at_least_one_output (MetaMonitorConfig *self,
|
|||||||
|
|
||||||
for (i = 0; i < n_outputs; i++)
|
for (i = 0; i < n_outputs; i++)
|
||||||
{
|
{
|
||||||
gboolean is_primary = (&outputs[i] == primary);
|
gboolean is_primary = ((int)i == primary);
|
||||||
|
|
||||||
if (is_primary)
|
if (is_primary)
|
||||||
{
|
{
|
||||||
@@ -1408,6 +1511,7 @@ init_config_from_output (MetaOutputConfig *config,
|
|||||||
config->transform = output->crtc->transform;
|
config->transform = output->crtc->transform;
|
||||||
config->is_primary = output->is_primary;
|
config->is_primary = output->is_primary;
|
||||||
config->is_presentation = output->is_presentation;
|
config->is_presentation = output->is_presentation;
|
||||||
|
config->is_underscanning = output->is_underscanning;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -1598,7 +1702,8 @@ meta_monitor_config_save (MetaMonitorConfig *self)
|
|||||||
" <reflect_x>%s</reflect_x>\n"
|
" <reflect_x>%s</reflect_x>\n"
|
||||||
" <reflect_y>no</reflect_y>\n"
|
" <reflect_y>no</reflect_y>\n"
|
||||||
" <primary>%s</primary>\n"
|
" <primary>%s</primary>\n"
|
||||||
" <presentation>%s</presentation>\n",
|
" <presentation>%s</presentation>\n"
|
||||||
|
" <underscanning>%s</underscanning>\n",
|
||||||
output->rect.width,
|
output->rect.width,
|
||||||
output->rect.height,
|
output->rect.height,
|
||||||
refresh_rate,
|
refresh_rate,
|
||||||
@@ -1607,7 +1712,8 @@ meta_monitor_config_save (MetaMonitorConfig *self)
|
|||||||
rotation_map[output->transform & 0x3],
|
rotation_map[output->transform & 0x3],
|
||||||
output->transform >= META_MONITOR_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",
|
||||||
|
output->is_underscanning ? "yes" : "no");
|
||||||
}
|
}
|
||||||
|
|
||||||
g_string_append (buffer, " </output>\n");
|
g_string_append (buffer, " </output>\n");
|
||||||
@@ -1622,7 +1728,7 @@ meta_monitor_config_save (MetaMonitorConfig *self)
|
|||||||
closure->config = g_object_ref (self);
|
closure->config = g_object_ref (self);
|
||||||
closure->buffer = buffer;
|
closure->buffer = buffer;
|
||||||
|
|
||||||
g_file_replace_contents_async (self->file,
|
g_file_replace_contents_async (self->user_file,
|
||||||
buffer->str, buffer->len,
|
buffer->str, buffer->len,
|
||||||
NULL, /* etag */
|
NULL, /* etag */
|
||||||
TRUE,
|
TRUE,
|
||||||
@@ -1740,7 +1846,7 @@ crtc_assignment_assign (CrtcAssignment *assign,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
MetaCRTCInfo *info = g_slice_new0 (MetaCRTCInfo);
|
info = g_slice_new0 (MetaCRTCInfo);
|
||||||
|
|
||||||
info->crtc = crtc;
|
info->crtc = crtc;
|
||||||
info->mode = mode;
|
info->mode = mode;
|
||||||
@@ -1814,7 +1920,6 @@ real_assign_crtcs (CrtcAssignment *assignment,
|
|||||||
MetaOutputKey *output_key;
|
MetaOutputKey *output_key;
|
||||||
MetaOutputConfig *output_config;
|
MetaOutputConfig *output_config;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
gboolean success;
|
|
||||||
|
|
||||||
if (output_num == assignment->config->n_outputs)
|
if (output_num == assignment->config->n_outputs)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@@ -1831,8 +1936,6 @@ real_assign_crtcs (CrtcAssignment *assignment,
|
|||||||
&crtcs, &n_crtcs,
|
&crtcs, &n_crtcs,
|
||||||
&outputs, &n_outputs);
|
&outputs, &n_outputs);
|
||||||
|
|
||||||
success = FALSE;
|
|
||||||
|
|
||||||
for (i = 0; i < n_crtcs; i++)
|
for (i = 0; i < n_crtcs; i++)
|
||||||
{
|
{
|
||||||
MetaCRTC *crtc = &crtcs[i];
|
MetaCRTC *crtc = &crtcs[i];
|
||||||
@@ -1879,10 +1982,7 @@ real_assign_crtcs (CrtcAssignment *assignment,
|
|||||||
output))
|
output))
|
||||||
{
|
{
|
||||||
if (real_assign_crtcs (assignment, output_num + 1))
|
if (real_assign_crtcs (assignment, output_num + 1))
|
||||||
{
|
return TRUE;
|
||||||
success = TRUE;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
crtc_assignment_unassign (assignment, crtc, output);
|
crtc_assignment_unassign (assignment, crtc, output);
|
||||||
}
|
}
|
||||||
@@ -1891,8 +1991,7 @@ real_assign_crtcs (CrtcAssignment *assignment,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
out:
|
return FALSE;
|
||||||
return success;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
@@ -1941,6 +2040,7 @@ meta_monitor_config_assign_crtcs (MetaConfiguration *config,
|
|||||||
&config->keys[i]);
|
&config->keys[i]);
|
||||||
output_info->is_primary = output_config->is_primary;
|
output_info->is_primary = output_config->is_primary;
|
||||||
output_info->is_presentation = output_config->is_presentation;
|
output_info->is_presentation = output_config->is_presentation;
|
||||||
|
output_info->is_underscanning = output_config->is_underscanning;
|
||||||
|
|
||||||
g_ptr_array_add (outputs, output_info);
|
g_ptr_array_add (outputs, output_info);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
#ifndef META_MONITOR_CONFIG_H
|
#ifndef META_MONITOR_CONFIG_H
|
||||||
#define META_MONITOR_CONFIG_H
|
#define META_MONITOR_CONFIG_H
|
||||||
|
|
||||||
#include "meta-monitor-manager.h"
|
#include "meta-monitor-manager-private.h"
|
||||||
|
|
||||||
#define META_TYPE_MONITOR_CONFIG (meta_monitor_config_get_type ())
|
#define META_TYPE_MONITOR_CONFIG (meta_monitor_config_get_type ())
|
||||||
#define META_MONITOR_CONFIG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_MONITOR_CONFIG, MetaMonitorConfig))
|
#define META_MONITOR_CONFIG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_MONITOR_CONFIG, MetaMonitorConfig))
|
||||||
|
|||||||
@@ -27,6 +27,10 @@
|
|||||||
|
|
||||||
#include "meta-monitor-manager-dummy.h"
|
#include "meta-monitor-manager-dummy.h"
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <meta/util.h>
|
||||||
|
|
||||||
#define ALL_TRANSFORMS ((1 << (META_MONITOR_TRANSFORM_FLIPPED_270 + 1)) - 1)
|
#define ALL_TRANSFORMS ((1 << (META_MONITOR_TRANSFORM_FLIPPED_270 + 1)) - 1)
|
||||||
|
|
||||||
struct _MetaMonitorManagerDummy
|
struct _MetaMonitorManagerDummy
|
||||||
@@ -44,9 +48,69 @@ G_DEFINE_TYPE (MetaMonitorManagerDummy, meta_monitor_manager_dummy, META_TYPE_MO
|
|||||||
static void
|
static void
|
||||||
meta_monitor_manager_dummy_read_current (MetaMonitorManager *manager)
|
meta_monitor_manager_dummy_read_current (MetaMonitorManager *manager)
|
||||||
{
|
{
|
||||||
|
unsigned int num_monitors = 1;
|
||||||
|
int *monitor_scales = NULL;
|
||||||
|
const char *num_monitors_str;
|
||||||
|
const char *monitor_scales_str;
|
||||||
|
unsigned int i;
|
||||||
|
int current_x = 0;
|
||||||
|
|
||||||
|
/* To control what monitor configuration is generated, there are two available
|
||||||
|
* environmental variables that can be used:
|
||||||
|
*
|
||||||
|
* MUTTER_DEBUG_NUM_DUMMY_MONITORS
|
||||||
|
*
|
||||||
|
* Specifies the number of dummy monitors to include in the stage. Every
|
||||||
|
* monitor is 1024x786 pixels and they are placed on a horizontal row.
|
||||||
|
*
|
||||||
|
* MUTTER_DEBUG_DUMMY_MONITOR_SCALES
|
||||||
|
*
|
||||||
|
* A comma separated list that specifies the scales of the dummy monitors.
|
||||||
|
*
|
||||||
|
* For example the following configuration results in two monitors, where the
|
||||||
|
* first one has the monitor scale 1, and the other the monitor scale 2.
|
||||||
|
*
|
||||||
|
* MUTTER_DEBUG_NUM_DUMMY_MONITORS=2
|
||||||
|
* MUTTER_DEBUG_DUMMY_MONITOR_SCALES=1,2
|
||||||
|
*/
|
||||||
|
num_monitors_str = getenv ("MUTTER_DEBUG_NUM_DUMMY_MONITORS");
|
||||||
|
if (num_monitors_str)
|
||||||
|
{
|
||||||
|
num_monitors = g_ascii_strtoll (num_monitors_str, NULL, 10);
|
||||||
|
if (num_monitors <= 0)
|
||||||
|
{
|
||||||
|
meta_warning ("Invalid number of dummy monitors");
|
||||||
|
num_monitors = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
monitor_scales = g_newa (int, num_monitors);
|
||||||
|
for (i = 0; i < num_monitors; i++)
|
||||||
|
monitor_scales[i] = 1;
|
||||||
|
|
||||||
|
monitor_scales_str = getenv ("MUTTER_DEBUG_DUMMY_MONITOR_SCALES");
|
||||||
|
if (monitor_scales_str)
|
||||||
|
{
|
||||||
|
gchar **scales_str_list;
|
||||||
|
|
||||||
|
scales_str_list = g_strsplit (monitor_scales_str, ",", -1);
|
||||||
|
if (g_strv_length (scales_str_list) != num_monitors)
|
||||||
|
meta_warning ("Number of specified monitor scales differ from number "
|
||||||
|
"of monitors (defaults to 1).\n");
|
||||||
|
for (i = 0; i < num_monitors && scales_str_list[i]; i++)
|
||||||
|
{
|
||||||
|
int scale = g_ascii_strtoll (scales_str_list[i], NULL, 10);
|
||||||
|
if (scale == 1 || scale == 2)
|
||||||
|
monitor_scales[i] = scale;
|
||||||
|
else
|
||||||
|
meta_warning ("Invalid dummy monitor scale");
|
||||||
|
}
|
||||||
|
g_strfreev (scales_str_list);
|
||||||
|
}
|
||||||
|
|
||||||
manager->max_screen_width = 65535;
|
manager->max_screen_width = 65535;
|
||||||
manager->max_screen_height = 65535;
|
manager->max_screen_height = 65535;
|
||||||
manager->screen_width = 1024;
|
manager->screen_width = 1024 * num_monitors;
|
||||||
manager->screen_height = 768;
|
manager->screen_height = 768;
|
||||||
|
|
||||||
manager->modes = g_new0 (MetaMonitorMode, 1);
|
manager->modes = g_new0 (MetaMonitorMode, 1);
|
||||||
@@ -57,45 +121,52 @@ meta_monitor_manager_dummy_read_current (MetaMonitorManager *manager)
|
|||||||
manager->modes[0].height = 768;
|
manager->modes[0].height = 768;
|
||||||
manager->modes[0].refresh_rate = 60.0;
|
manager->modes[0].refresh_rate = 60.0;
|
||||||
|
|
||||||
manager->crtcs = g_new0 (MetaCRTC, 1);
|
manager->crtcs = g_new0 (MetaCRTC, num_monitors);
|
||||||
manager->n_crtcs = 1;
|
manager->n_crtcs = num_monitors;
|
||||||
|
manager->outputs = g_new0 (MetaOutput, num_monitors);
|
||||||
|
manager->n_outputs = num_monitors;
|
||||||
|
|
||||||
manager->crtcs[0].crtc_id = 1;
|
for (i = 0; i < num_monitors; i++)
|
||||||
manager->crtcs[0].rect.x = 0;
|
{
|
||||||
manager->crtcs[0].rect.y = 0;
|
manager->crtcs[i].crtc_id = i + 1;
|
||||||
manager->crtcs[0].rect.width = manager->modes[0].width;
|
manager->crtcs[i].rect.x = current_x;
|
||||||
manager->crtcs[0].rect.height = manager->modes[0].height;
|
manager->crtcs[i].rect.y = 0;
|
||||||
manager->crtcs[0].current_mode = &manager->modes[0];
|
manager->crtcs[i].rect.width = manager->modes[0].width;
|
||||||
manager->crtcs[0].transform = META_MONITOR_TRANSFORM_NORMAL;
|
manager->crtcs[i].rect.height = manager->modes[0].height;
|
||||||
manager->crtcs[0].all_transforms = ALL_TRANSFORMS;
|
manager->crtcs[i].current_mode = &manager->modes[0];
|
||||||
manager->crtcs[0].is_dirty = FALSE;
|
manager->crtcs[i].transform = META_MONITOR_TRANSFORM_NORMAL;
|
||||||
manager->crtcs[0].logical_monitor = NULL;
|
manager->crtcs[i].all_transforms = ALL_TRANSFORMS;
|
||||||
|
manager->crtcs[i].is_dirty = FALSE;
|
||||||
|
manager->crtcs[i].logical_monitor = NULL;
|
||||||
|
|
||||||
manager->outputs = g_new0 (MetaOutput, 1);
|
current_x += manager->crtcs[i].rect.width;
|
||||||
manager->n_outputs = 1;
|
|
||||||
|
|
||||||
manager->outputs[0].crtc = &manager->crtcs[0];
|
manager->outputs[i].crtc = &manager->crtcs[i];
|
||||||
manager->outputs[0].winsys_id = 1;
|
manager->outputs[i].winsys_id = i + 1;
|
||||||
manager->outputs[0].name = g_strdup ("LVDS");
|
manager->outputs[i].name = g_strdup_printf ("LVDS%d", i + 1);
|
||||||
manager->outputs[0].vendor = g_strdup ("MetaProducts Inc.");
|
manager->outputs[i].vendor = g_strdup ("MetaProducts Inc.");
|
||||||
manager->outputs[0].product = g_strdup ("unknown");
|
manager->outputs[i].product = g_strdup ("unknown");
|
||||||
manager->outputs[0].serial = g_strdup ("0xC0FFEE");
|
manager->outputs[i].serial = g_strdup ("0xC0FFEE");
|
||||||
manager->outputs[0].width_mm = 222;
|
manager->outputs[i].suggested_x = -1;
|
||||||
manager->outputs[0].height_mm = 125;
|
manager->outputs[i].suggested_y = -1;
|
||||||
manager->outputs[0].subpixel_order = COGL_SUBPIXEL_ORDER_UNKNOWN;
|
manager->outputs[i].width_mm = 222;
|
||||||
manager->outputs[0].preferred_mode = &manager->modes[0];
|
manager->outputs[i].height_mm = 125;
|
||||||
manager->outputs[0].n_modes = 1;
|
manager->outputs[i].subpixel_order = COGL_SUBPIXEL_ORDER_UNKNOWN;
|
||||||
manager->outputs[0].modes = g_new0 (MetaMonitorMode *, 1);
|
manager->outputs[i].preferred_mode = &manager->modes[0];
|
||||||
manager->outputs[0].modes[0] = &manager->modes[0];
|
manager->outputs[i].n_modes = 1;
|
||||||
manager->outputs[0].n_possible_crtcs = 1;
|
manager->outputs[i].modes = g_new0 (MetaMonitorMode *, 1);
|
||||||
manager->outputs[0].possible_crtcs = g_new0 (MetaCRTC *, 1);
|
manager->outputs[i].modes[0] = &manager->modes[0];
|
||||||
manager->outputs[0].possible_crtcs[0] = &manager->crtcs[0];
|
manager->outputs[i].n_possible_crtcs = 1;
|
||||||
manager->outputs[0].n_possible_clones = 0;
|
manager->outputs[i].possible_crtcs = g_new0 (MetaCRTC *, 1);
|
||||||
manager->outputs[0].possible_clones = g_new0 (MetaOutput *, 0);
|
manager->outputs[i].possible_crtcs[0] = &manager->crtcs[i];
|
||||||
manager->outputs[0].backlight = -1;
|
manager->outputs[i].n_possible_clones = 0;
|
||||||
manager->outputs[0].backlight_min = 0;
|
manager->outputs[i].possible_clones = g_new0 (MetaOutput *, 0);
|
||||||
manager->outputs[0].backlight_max = 0;
|
manager->outputs[i].backlight = -1;
|
||||||
manager->outputs[0].connector_type = META_CONNECTOR_TYPE_LVDS;
|
manager->outputs[i].backlight_min = 0;
|
||||||
|
manager->outputs[i].backlight_max = 0;
|
||||||
|
manager->outputs[i].connector_type = META_CONNECTOR_TYPE_LVDS;
|
||||||
|
manager->outputs[i].scale = monitor_scales[i];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -126,7 +197,7 @@ meta_monitor_manager_dummy_apply_config (MetaMonitorManager *manager,
|
|||||||
{
|
{
|
||||||
MetaMonitorMode *mode;
|
MetaMonitorMode *mode;
|
||||||
MetaOutput *output;
|
MetaOutput *output;
|
||||||
int i, n_outputs;
|
unsigned int j;
|
||||||
int width, height;
|
int width, height;
|
||||||
|
|
||||||
mode = crtc_info->mode;
|
mode = crtc_info->mode;
|
||||||
@@ -152,10 +223,9 @@ meta_monitor_manager_dummy_apply_config (MetaMonitorManager *manager,
|
|||||||
screen_width = MAX (screen_width, crtc_info->x + width);
|
screen_width = MAX (screen_width, crtc_info->x + width);
|
||||||
screen_height = MAX (screen_height, crtc_info->y + height);
|
screen_height = MAX (screen_height, crtc_info->y + height);
|
||||||
|
|
||||||
n_outputs = crtc_info->outputs->len;
|
for (j = 0; j < crtc_info->outputs->len; j++)
|
||||||
for (i = 0; i < n_outputs; i++)
|
|
||||||
{
|
{
|
||||||
output = ((MetaOutput**)crtc_info->outputs->pdata)[i];
|
output = ((MetaOutput**)crtc_info->outputs->pdata)[j];
|
||||||
|
|
||||||
output->is_dirty = TRUE;
|
output->is_dirty = TRUE;
|
||||||
output->crtc = crtc;
|
output->crtc = crtc;
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
#ifndef META_MONITOR_MANAGER_DUMMY_H
|
#ifndef META_MONITOR_MANAGER_DUMMY_H
|
||||||
#define META_MONITOR_MANAGER_DUMMY_H
|
#define META_MONITOR_MANAGER_DUMMY_H
|
||||||
|
|
||||||
#include "meta-monitor-manager.h"
|
#include "meta-monitor-manager-private.h"
|
||||||
|
|
||||||
#define META_TYPE_MONITOR_MANAGER_DUMMY (meta_monitor_manager_dummy_get_type ())
|
#define META_TYPE_MONITOR_MANAGER_DUMMY (meta_monitor_manager_dummy_get_type ())
|
||||||
#define META_MONITOR_MANAGER_DUMMY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_MONITOR_MANAGER_DUMMY, MetaMonitorManagerDummy))
|
#define META_MONITOR_MANAGER_DUMMY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_MONITOR_MANAGER_DUMMY, MetaMonitorManagerDummy))
|
||||||
|
|||||||
@@ -41,22 +41,22 @@
|
|||||||
#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 <meta/meta-monitor-manager.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"
|
#include "meta-cursor.h"
|
||||||
|
|
||||||
typedef struct _MetaMonitorManagerClass MetaMonitorManagerClass;
|
|
||||||
typedef struct _MetaMonitorManager MetaMonitorManager;
|
|
||||||
typedef struct _MetaMonitorConfigClass MetaMonitorConfigClass;
|
typedef struct _MetaMonitorConfigClass MetaMonitorConfigClass;
|
||||||
typedef struct _MetaMonitorConfig MetaMonitorConfig;
|
typedef struct _MetaMonitorConfig MetaMonitorConfig;
|
||||||
|
|
||||||
typedef struct _MetaOutput MetaOutput;
|
|
||||||
typedef struct _MetaCRTC MetaCRTC;
|
typedef struct _MetaCRTC MetaCRTC;
|
||||||
|
typedef struct _MetaOutput MetaOutput;
|
||||||
typedef struct _MetaMonitorMode MetaMonitorMode;
|
typedef struct _MetaMonitorMode MetaMonitorMode;
|
||||||
typedef struct _MetaMonitorInfo MetaMonitorInfo;
|
typedef struct _MetaMonitorInfo MetaMonitorInfo;
|
||||||
typedef struct _MetaCRTCInfo MetaCRTCInfo;
|
typedef struct _MetaCRTCInfo MetaCRTCInfo;
|
||||||
typedef struct _MetaOutputInfo MetaOutputInfo;
|
typedef struct _MetaOutputInfo MetaOutputInfo;
|
||||||
|
typedef struct _MetaTileInfo MetaTileInfo;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
META_MONITOR_TRANSFORM_NORMAL,
|
META_MONITOR_TRANSFORM_NORMAL,
|
||||||
@@ -90,6 +90,17 @@ typedef enum {
|
|||||||
META_CONNECTOR_TYPE_DSI = 16,
|
META_CONNECTOR_TYPE_DSI = 16,
|
||||||
} MetaConnectorType;
|
} MetaConnectorType;
|
||||||
|
|
||||||
|
struct _MetaTileInfo {
|
||||||
|
guint32 group_id;
|
||||||
|
guint32 flags;
|
||||||
|
guint32 max_h_tiles;
|
||||||
|
guint32 max_v_tiles;
|
||||||
|
guint32 loc_h_tile;
|
||||||
|
guint32 loc_v_tile;
|
||||||
|
guint32 tile_w;
|
||||||
|
guint32 tile_h;
|
||||||
|
};
|
||||||
|
|
||||||
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 */
|
||||||
@@ -133,6 +144,8 @@ struct _MetaOutput
|
|||||||
*/
|
*/
|
||||||
gboolean is_primary;
|
gboolean is_primary;
|
||||||
gboolean is_presentation;
|
gboolean is_presentation;
|
||||||
|
gboolean is_underscanning;
|
||||||
|
gboolean supports_underscanning;
|
||||||
|
|
||||||
gpointer driver_private;
|
gpointer driver_private;
|
||||||
GDestroyNotify driver_notify;
|
GDestroyNotify driver_notify;
|
||||||
@@ -141,6 +154,8 @@ struct _MetaOutput
|
|||||||
gboolean hotplug_mode_update;
|
gboolean hotplug_mode_update;
|
||||||
gint suggested_x;
|
gint suggested_x;
|
||||||
gint suggested_y;
|
gint suggested_y;
|
||||||
|
|
||||||
|
MetaTileInfo tile_info;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _MetaCRTC
|
struct _MetaCRTC
|
||||||
@@ -159,7 +174,11 @@ struct _MetaCRTC
|
|||||||
/* Used when changing configuration */
|
/* Used when changing configuration */
|
||||||
gboolean is_dirty;
|
gboolean is_dirty;
|
||||||
|
|
||||||
MetaCursorReference *cursor;
|
/* Used by cursor renderer backend */
|
||||||
|
void *cursor_renderer_private;
|
||||||
|
|
||||||
|
gpointer driver_private;
|
||||||
|
GDestroyNotify driver_notify;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _MetaMonitorMode
|
struct _MetaMonitorMode
|
||||||
@@ -176,6 +195,7 @@ struct _MetaMonitorMode
|
|||||||
GDestroyNotify driver_notify;
|
GDestroyNotify driver_notify;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define META_MAX_OUTPUTS_PER_MONITOR 4
|
||||||
/**
|
/**
|
||||||
* MetaMonitorInfo:
|
* MetaMonitorInfo:
|
||||||
*
|
*
|
||||||
@@ -191,9 +211,14 @@ struct _MetaMonitorInfo
|
|||||||
int number;
|
int number;
|
||||||
int xinerama_index;
|
int xinerama_index;
|
||||||
MetaRectangle rect;
|
MetaRectangle rect;
|
||||||
|
/* for tiled monitors these are calculated, from untiled just copied */
|
||||||
|
float refresh_rate;
|
||||||
|
int width_mm;
|
||||||
|
int height_mm;
|
||||||
gboolean is_primary;
|
gboolean is_primary;
|
||||||
gboolean is_presentation; /* XXX: not yet used */
|
gboolean is_presentation; /* XXX: not yet used */
|
||||||
gboolean in_fullscreen;
|
gboolean in_fullscreen;
|
||||||
|
int scale;
|
||||||
|
|
||||||
/* 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 a winsys_id of a MetaOutput.
|
It can be matched to a winsys_id of a MetaOutput.
|
||||||
@@ -204,6 +229,12 @@ struct _MetaMonitorInfo
|
|||||||
the primary one).
|
the primary one).
|
||||||
*/
|
*/
|
||||||
glong winsys_id;
|
glong winsys_id;
|
||||||
|
|
||||||
|
guint32 tile_group_id;
|
||||||
|
|
||||||
|
int monitor_winsys_xid;
|
||||||
|
int n_outputs;
|
||||||
|
MetaOutput *outputs[META_MAX_OUTPUTS_PER_MONITOR];
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -225,12 +256,13 @@ struct _MetaCRTCInfo {
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* MetaOutputInfo:
|
* MetaOutputInfo:
|
||||||
* this is the same as MetaOutputInfo, but for CRTCs
|
* this is the same as MetaCRTCInfo, but for outputs
|
||||||
*/
|
*/
|
||||||
struct _MetaOutputInfo {
|
struct _MetaOutputInfo {
|
||||||
MetaOutput *output;
|
MetaOutput *output;
|
||||||
gboolean is_primary;
|
gboolean is_primary;
|
||||||
gboolean is_presentation;
|
gboolean is_presentation;
|
||||||
|
gboolean is_underscanning;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define META_TYPE_MONITOR_MANAGER (meta_monitor_manager_get_type ())
|
#define META_TYPE_MONITOR_MANAGER (meta_monitor_manager_get_type ())
|
||||||
@@ -320,12 +352,15 @@ struct _MetaMonitorManagerClass
|
|||||||
unsigned short *,
|
unsigned short *,
|
||||||
unsigned short *,
|
unsigned short *,
|
||||||
unsigned short *);
|
unsigned short *);
|
||||||
|
|
||||||
|
void (*add_monitor) (MetaMonitorManager *,
|
||||||
|
MetaMonitorInfo *);
|
||||||
|
|
||||||
|
void (*delete_monitor) (MetaMonitorManager *,
|
||||||
|
int monitor_winsys_xid);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
GType meta_monitor_manager_get_type (void);
|
|
||||||
|
|
||||||
MetaMonitorManager *meta_monitor_manager_get (void);
|
|
||||||
|
|
||||||
void meta_monitor_manager_rebuild_derived (MetaMonitorManager *manager);
|
void meta_monitor_manager_rebuild_derived (MetaMonitorManager *manager);
|
||||||
|
|
||||||
MetaMonitorInfo *meta_monitor_manager_get_monitor_infos (MetaMonitorManager *manager,
|
MetaMonitorInfo *meta_monitor_manager_get_monitor_infos (MetaMonitorManager *manager,
|
||||||
@@ -375,6 +410,14 @@ gboolean meta_monitor_manager_get_monitor_matrix (MetaMonitorManager *
|
|||||||
MetaOutput *output,
|
MetaOutput *output,
|
||||||
gfloat matrix[6]);
|
gfloat matrix[6]);
|
||||||
|
|
||||||
|
gint meta_monitor_manager_get_monitor_at_point (MetaMonitorManager *manager,
|
||||||
|
gfloat x,
|
||||||
|
gfloat y);
|
||||||
|
|
||||||
|
void meta_monitor_manager_clear_output (MetaOutput *output);
|
||||||
|
void meta_monitor_manager_clear_mode (MetaMonitorMode *mode);
|
||||||
|
void meta_monitor_manager_clear_crtc (MetaCRTC *crtc);
|
||||||
|
|
||||||
/* 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
|
||||||
@@ -25,7 +25,7 @@
|
|||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
#include "meta-monitor-manager.h"
|
#include "meta-monitor-manager-private.h"
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
@@ -71,6 +71,98 @@ meta_monitor_manager_init (MetaMonitorManager *manager)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* rules for constructing a tiled monitor
|
||||||
|
* 1. find a tile_group_id
|
||||||
|
* 2. iterate over all outputs for that tile group id
|
||||||
|
* 3. see if output has a crtc and if it is configured for the tile size
|
||||||
|
* 4. calculate the total tile size
|
||||||
|
* 5. set tile finished size
|
||||||
|
* 6. check for more tile_group_id
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
construct_tile_monitor (MetaMonitorManager *manager,
|
||||||
|
GArray *monitor_infos,
|
||||||
|
guint32 tile_group_id)
|
||||||
|
{
|
||||||
|
MetaMonitorInfo info;
|
||||||
|
unsigned i;
|
||||||
|
|
||||||
|
for (i = 0; i < monitor_infos->len; i++)
|
||||||
|
{
|
||||||
|
MetaMonitorInfo *pinfo = &g_array_index (monitor_infos, MetaMonitorInfo, i);
|
||||||
|
|
||||||
|
if (pinfo->tile_group_id == tile_group_id)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* didn't find it */
|
||||||
|
info.number = monitor_infos->len;
|
||||||
|
info.tile_group_id = tile_group_id;
|
||||||
|
info.is_presentation = FALSE;
|
||||||
|
info.refresh_rate = 0.0;
|
||||||
|
info.width_mm = 0;
|
||||||
|
info.height_mm = 0;
|
||||||
|
info.is_primary = FALSE;
|
||||||
|
info.rect.x = INT_MAX;
|
||||||
|
info.rect.y = INT_MAX;
|
||||||
|
info.rect.width = 0;
|
||||||
|
info.rect.height = 0;
|
||||||
|
info.winsys_id = 0;
|
||||||
|
info.n_outputs = 0;
|
||||||
|
info.monitor_winsys_xid = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < manager->n_outputs; i++)
|
||||||
|
{
|
||||||
|
MetaOutput *output = &manager->outputs[i];
|
||||||
|
|
||||||
|
if (!output->tile_info.group_id)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (output->tile_info.group_id != tile_group_id)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!output->crtc)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (output->crtc->rect.width != (int)output->tile_info.tile_w ||
|
||||||
|
output->crtc->rect.height != (int)output->tile_info.tile_h)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (output->tile_info.loc_h_tile == 0 && output->tile_info.loc_v_tile == 0)
|
||||||
|
{
|
||||||
|
info.refresh_rate = output->crtc->current_mode->refresh_rate;
|
||||||
|
info.width_mm = output->width_mm;
|
||||||
|
info.height_mm = output->height_mm;
|
||||||
|
info.winsys_id = output->winsys_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* hack */
|
||||||
|
if (output->crtc->rect.x < info.rect.x)
|
||||||
|
info.rect.x = output->crtc->rect.x;
|
||||||
|
if (output->crtc->rect.y < info.rect.y)
|
||||||
|
info.rect.y = output->crtc->rect.y;
|
||||||
|
|
||||||
|
if (output->tile_info.loc_h_tile == 0)
|
||||||
|
info.rect.height += output->tile_info.tile_h;
|
||||||
|
|
||||||
|
if (output->tile_info.loc_v_tile == 0)
|
||||||
|
info.rect.width += output->tile_info.tile_w;
|
||||||
|
|
||||||
|
if (info.n_outputs > META_MAX_OUTPUTS_PER_MONITOR)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
info.outputs[info.n_outputs++] = output;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* if we don't have a winsys id, i.e. we haven't found tile 0,0
|
||||||
|
don't try and add this to the monitor infos */
|
||||||
|
if (!info.winsys_id)
|
||||||
|
return;
|
||||||
|
|
||||||
|
g_array_append_val (monitor_infos, info);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* make_logical_config:
|
* make_logical_config:
|
||||||
*
|
*
|
||||||
@@ -81,16 +173,26 @@ meta_monitor_manager_init (MetaMonitorManager *manager)
|
|||||||
static void
|
static void
|
||||||
make_logical_config (MetaMonitorManager *manager)
|
make_logical_config (MetaMonitorManager *manager)
|
||||||
{
|
{
|
||||||
|
MetaMonitorManagerClass *manager_class = META_MONITOR_MANAGER_GET_CLASS (manager);
|
||||||
GArray *monitor_infos;
|
GArray *monitor_infos;
|
||||||
unsigned int i, j;
|
unsigned int i, j;
|
||||||
|
|
||||||
monitor_infos = g_array_sized_new (FALSE, TRUE, sizeof (MetaMonitorInfo),
|
monitor_infos = g_array_sized_new (FALSE, TRUE, sizeof (MetaMonitorInfo),
|
||||||
manager->n_outputs);
|
manager->n_crtcs);
|
||||||
|
|
||||||
/* Walk the list of MetaCRTCs, and build a MetaMonitorInfo
|
/* Walk the list of MetaCRTCs, and build a MetaMonitorInfo
|
||||||
for each of them, unless they reference a rectangle that
|
for each of them, unless they reference a rectangle that
|
||||||
is already there.
|
is already there.
|
||||||
*/
|
*/
|
||||||
|
/* for tiling we need to work out how many tiled outputs there are */
|
||||||
|
for (i = 0; i < manager->n_outputs; i++)
|
||||||
|
{
|
||||||
|
MetaOutput *output = &manager->outputs[i];
|
||||||
|
|
||||||
|
if (output->tile_info.group_id)
|
||||||
|
construct_tile_monitor (manager, monitor_infos, output->tile_info.group_id);
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < manager->n_crtcs; i++)
|
for (i = 0; i < manager->n_crtcs; i++)
|
||||||
{
|
{
|
||||||
MetaCRTC *crtc = &manager->crtcs[i];
|
MetaCRTC *crtc = &manager->crtcs[i];
|
||||||
@@ -102,8 +204,8 @@ make_logical_config (MetaMonitorManager *manager)
|
|||||||
for (j = 0; j < monitor_infos->len; j++)
|
for (j = 0; j < monitor_infos->len; j++)
|
||||||
{
|
{
|
||||||
MetaMonitorInfo *info = &g_array_index (monitor_infos, MetaMonitorInfo, j);
|
MetaMonitorInfo *info = &g_array_index (monitor_infos, MetaMonitorInfo, j);
|
||||||
if (meta_rectangle_equal (&crtc->rect,
|
if (meta_rectangle_contains_rect (&info->rect,
|
||||||
&info->rect))
|
&crtc->rect))
|
||||||
{
|
{
|
||||||
crtc->logical_monitor = info;
|
crtc->logical_monitor = info;
|
||||||
break;
|
break;
|
||||||
@@ -115,7 +217,10 @@ make_logical_config (MetaMonitorManager *manager)
|
|||||||
MetaMonitorInfo info;
|
MetaMonitorInfo info;
|
||||||
|
|
||||||
info.number = monitor_infos->len;
|
info.number = monitor_infos->len;
|
||||||
|
info.tile_group_id = 0;
|
||||||
info.rect = crtc->rect;
|
info.rect = crtc->rect;
|
||||||
|
info.refresh_rate = crtc->current_mode->refresh_rate;
|
||||||
|
info.scale = 1;
|
||||||
info.is_primary = FALSE;
|
info.is_primary = FALSE;
|
||||||
/* This starts true because we want
|
/* This starts true because we want
|
||||||
is_presentation only if all outputs are
|
is_presentation only if all outputs are
|
||||||
@@ -125,7 +230,8 @@ make_logical_config (MetaMonitorManager *manager)
|
|||||||
info.is_presentation = TRUE;
|
info.is_presentation = TRUE;
|
||||||
info.in_fullscreen = -1;
|
info.in_fullscreen = -1;
|
||||||
info.winsys_id = 0;
|
info.winsys_id = 0;
|
||||||
|
info.n_outputs = 0;
|
||||||
|
info.monitor_winsys_xid = 0;
|
||||||
g_array_append_val (monitor_infos, info);
|
g_array_append_val (monitor_infos, info);
|
||||||
|
|
||||||
crtc->logical_monitor = &g_array_index (monitor_infos, MetaMonitorInfo,
|
crtc->logical_monitor = &g_array_index (monitor_infos, MetaMonitorInfo,
|
||||||
@@ -147,6 +253,9 @@ make_logical_config (MetaMonitorManager *manager)
|
|||||||
if (output->crtc == NULL)
|
if (output->crtc == NULL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (output->tile_info.group_id)
|
||||||
|
continue;
|
||||||
|
|
||||||
/* We must have a logical monitor on every CRTC at this point */
|
/* We must have a logical monitor on every CRTC at this point */
|
||||||
g_assert (output->crtc->logical_monitor != NULL);
|
g_assert (output->crtc->logical_monitor != NULL);
|
||||||
|
|
||||||
@@ -155,8 +264,17 @@ 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;
|
||||||
|
|
||||||
|
info->width_mm = output->width_mm;
|
||||||
|
info->height_mm = output->height_mm;
|
||||||
|
|
||||||
|
info->outputs[0] = output;
|
||||||
|
info->n_outputs = 1;
|
||||||
|
|
||||||
if (output->is_primary || info->winsys_id == 0)
|
if (output->is_primary || info->winsys_id == 0)
|
||||||
|
{
|
||||||
|
info->scale = output->scale;
|
||||||
info->winsys_id = output->winsys_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;
|
||||||
@@ -164,6 +282,10 @@ make_logical_config (MetaMonitorManager *manager)
|
|||||||
|
|
||||||
manager->n_monitor_infos = monitor_infos->len;
|
manager->n_monitor_infos = monitor_infos->len;
|
||||||
manager->monitor_infos = (void*)g_array_free (monitor_infos, FALSE);
|
manager->monitor_infos = (void*)g_array_free (monitor_infos, FALSE);
|
||||||
|
|
||||||
|
if (manager_class->add_monitor)
|
||||||
|
for (i = 0; i < manager->n_monitor_infos; i++)
|
||||||
|
manager_class->add_monitor (manager, &manager->monitor_infos[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -224,6 +346,23 @@ meta_monitor_manager_constructed (GObject *object)
|
|||||||
manager->in_init = FALSE;
|
manager->in_init = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_monitor_manager_clear_output (MetaOutput *output)
|
||||||
|
{
|
||||||
|
g_free (output->name);
|
||||||
|
g_free (output->vendor);
|
||||||
|
g_free (output->product);
|
||||||
|
g_free (output->serial);
|
||||||
|
g_free (output->modes);
|
||||||
|
g_free (output->possible_crtcs);
|
||||||
|
g_free (output->possible_clones);
|
||||||
|
|
||||||
|
if (output->driver_notify)
|
||||||
|
output->driver_notify (output);
|
||||||
|
|
||||||
|
memset (output, 0, sizeof (*output));
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_monitor_manager_free_output_array (MetaOutput *old_outputs,
|
meta_monitor_manager_free_output_array (MetaOutput *old_outputs,
|
||||||
int n_old_outputs)
|
int n_old_outputs)
|
||||||
@@ -231,22 +370,22 @@ meta_monitor_manager_free_output_array (MetaOutput *old_outputs,
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < n_old_outputs; i++)
|
for (i = 0; i < n_old_outputs; i++)
|
||||||
{
|
meta_monitor_manager_clear_output (&old_outputs[i]);
|
||||||
g_free (old_outputs[i].name);
|
|
||||||
g_free (old_outputs[i].vendor);
|
|
||||||
g_free (old_outputs[i].product);
|
|
||||||
g_free (old_outputs[i].serial);
|
|
||||||
g_free (old_outputs[i].modes);
|
|
||||||
g_free (old_outputs[i].possible_crtcs);
|
|
||||||
g_free (old_outputs[i].possible_clones);
|
|
||||||
|
|
||||||
if (old_outputs[i].driver_notify)
|
|
||||||
old_outputs[i].driver_notify (&old_outputs[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
g_free (old_outputs);
|
g_free (old_outputs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_monitor_manager_clear_mode (MetaMonitorMode *mode)
|
||||||
|
{
|
||||||
|
g_free (mode->name);
|
||||||
|
|
||||||
|
if (mode->driver_notify)
|
||||||
|
mode->driver_notify (mode);
|
||||||
|
|
||||||
|
memset (mode, 0, sizeof (*mode));
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_monitor_manager_free_mode_array (MetaMonitorMode *old_modes,
|
meta_monitor_manager_free_mode_array (MetaMonitorMode *old_modes,
|
||||||
int n_old_modes)
|
int n_old_modes)
|
||||||
@@ -254,16 +393,32 @@ meta_monitor_manager_free_mode_array (MetaMonitorMode *old_modes,
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < n_old_modes; i++)
|
for (i = 0; i < n_old_modes; i++)
|
||||||
{
|
meta_monitor_manager_clear_mode (&old_modes[i]);
|
||||||
g_free (old_modes[i].name);
|
|
||||||
|
|
||||||
if (old_modes[i].driver_notify)
|
|
||||||
old_modes[i].driver_notify (&old_modes[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
g_free (old_modes);
|
g_free (old_modes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_monitor_manager_clear_crtc (MetaCRTC *crtc)
|
||||||
|
{
|
||||||
|
if (crtc->driver_notify)
|
||||||
|
crtc->driver_notify (crtc);
|
||||||
|
|
||||||
|
memset (crtc, 0, sizeof (*crtc));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_monitor_manager_free_crtc_array (MetaCRTC *old_crtcs,
|
||||||
|
int n_old_crtcs)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < n_old_crtcs; i++)
|
||||||
|
meta_monitor_manager_clear_crtc (&old_crtcs[i]);
|
||||||
|
|
||||||
|
g_free (old_crtcs);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_monitor_manager_finalize (GObject *object)
|
meta_monitor_manager_finalize (GObject *object)
|
||||||
{
|
{
|
||||||
@@ -271,8 +426,8 @@ meta_monitor_manager_finalize (GObject *object)
|
|||||||
|
|
||||||
meta_monitor_manager_free_output_array (manager->outputs, manager->n_outputs);
|
meta_monitor_manager_free_output_array (manager->outputs, manager->n_outputs);
|
||||||
meta_monitor_manager_free_mode_array (manager->modes, manager->n_modes);
|
meta_monitor_manager_free_mode_array (manager->modes, manager->n_modes);
|
||||||
|
meta_monitor_manager_free_crtc_array (manager->crtcs, manager->n_crtcs);
|
||||||
g_free (manager->monitor_infos);
|
g_free (manager->monitor_infos);
|
||||||
g_free (manager->crtcs);
|
|
||||||
|
|
||||||
G_OBJECT_CLASS (meta_monitor_manager_parent_class)->finalize (object);
|
G_OBJECT_CLASS (meta_monitor_manager_parent_class)->finalize (object);
|
||||||
}
|
}
|
||||||
@@ -353,16 +508,14 @@ static char *
|
|||||||
make_display_name (MetaMonitorManager *manager,
|
make_display_name (MetaMonitorManager *manager,
|
||||||
MetaOutput *output)
|
MetaOutput *output)
|
||||||
{
|
{
|
||||||
char *inches = NULL;
|
g_autofree char *inches = NULL;
|
||||||
char *vendor_name = NULL;
|
g_autofree char *vendor_name = NULL;
|
||||||
char *ret;
|
|
||||||
|
|
||||||
switch (output->connector_type)
|
switch (output->connector_type)
|
||||||
{
|
{
|
||||||
case META_CONNECTOR_TYPE_LVDS:
|
case META_CONNECTOR_TYPE_LVDS:
|
||||||
case META_CONNECTOR_TYPE_eDP:
|
case META_CONNECTOR_TYPE_eDP:
|
||||||
ret = g_strdup (_("Built-in display"));
|
return g_strdup (_("Built-in display"));
|
||||||
goto out;
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -398,18 +551,12 @@ make_display_name (MetaMonitorManager *manager,
|
|||||||
/* TRANSLATORS: this is a monitor vendor name, followed by a
|
/* TRANSLATORS: this is a monitor vendor name, followed by a
|
||||||
* size in inches, like 'Dell 15"'
|
* size in inches, like 'Dell 15"'
|
||||||
*/
|
*/
|
||||||
ret = g_strdup_printf (_("%s %s"), vendor_name, inches);
|
return g_strdup_printf (_("%s %s"), vendor_name, inches);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ret = g_strdup (vendor_name);
|
return g_strdup (vendor_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
out:
|
|
||||||
g_free (inches);
|
|
||||||
g_free (vendor_name);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *
|
static const char *
|
||||||
@@ -520,6 +667,10 @@ meta_monitor_manager_handle_get_resources (MetaDBusDisplayConfig *skeleton,
|
|||||||
g_variant_new_boolean (output->is_presentation));
|
g_variant_new_boolean (output->is_presentation));
|
||||||
g_variant_builder_add (&properties, "{sv}", "connector-type",
|
g_variant_builder_add (&properties, "{sv}", "connector-type",
|
||||||
g_variant_new_string (get_connector_type_name (output->connector_type)));
|
g_variant_new_string (get_connector_type_name (output->connector_type)));
|
||||||
|
g_variant_builder_add (&properties, "{sv}", "underscanning",
|
||||||
|
g_variant_new_boolean (output->is_underscanning));
|
||||||
|
g_variant_builder_add (&properties, "{sv}", "supports-underscanning",
|
||||||
|
g_variant_new_boolean (output->supports_underscanning));
|
||||||
|
|
||||||
edid_file = manager_class->get_edid_file (manager, output);
|
edid_file = manager_class->get_edid_file (manager, output);
|
||||||
if (edid_file)
|
if (edid_file)
|
||||||
@@ -540,6 +691,20 @@ meta_monitor_manager_handle_get_resources (MetaDBusDisplayConfig *skeleton,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (output->tile_info.group_id)
|
||||||
|
{
|
||||||
|
g_variant_builder_add (&properties, "{sv}", "tile",
|
||||||
|
g_variant_new ("(uuuuuuuu)",
|
||||||
|
output->tile_info.group_id,
|
||||||
|
output->tile_info.flags,
|
||||||
|
output->tile_info.max_h_tiles,
|
||||||
|
output->tile_info.max_v_tiles,
|
||||||
|
output->tile_info.loc_h_tile,
|
||||||
|
output->tile_info.loc_v_tile,
|
||||||
|
output->tile_info.tile_w,
|
||||||
|
output->tile_info.tile_h));
|
||||||
|
}
|
||||||
|
|
||||||
g_variant_builder_add (&output_builder, "(uxiausauaua{sv})",
|
g_variant_builder_add (&output_builder, "(uxiausauaua{sv})",
|
||||||
i, /* ID */
|
i, /* ID */
|
||||||
(gint64)output->winsys_id,
|
(gint64)output->winsys_id,
|
||||||
@@ -737,8 +902,7 @@ meta_monitor_manager_handle_apply_configuration (MetaDBusDisplayConfig *skeleto
|
|||||||
crtc_info->y = 0;
|
crtc_info->y = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (transform < META_MONITOR_TRANSFORM_NORMAL ||
|
if (transform > META_MONITOR_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,
|
||||||
@@ -808,7 +972,7 @@ meta_monitor_manager_handle_apply_configuration (MetaDBusDisplayConfig *skeleto
|
|||||||
while (g_variant_iter_loop (&output_iter, "(u@a{sv})", &output_index, &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, underscanning;
|
||||||
|
|
||||||
if (output_index >= manager->n_outputs)
|
if (output_index >= manager->n_outputs)
|
||||||
{
|
{
|
||||||
@@ -827,6 +991,9 @@ meta_monitor_manager_handle_apply_configuration (MetaDBusDisplayConfig *skeleto
|
|||||||
if (g_variant_lookup (properties, "presentation", "b", &presentation))
|
if (g_variant_lookup (properties, "presentation", "b", &presentation))
|
||||||
output_info->is_presentation = presentation;
|
output_info->is_presentation = presentation;
|
||||||
|
|
||||||
|
if (g_variant_lookup (properties, "underscanning", "b", &underscanning))
|
||||||
|
output_info->is_underscanning = underscanning;
|
||||||
|
|
||||||
g_ptr_array_add (output_infos, output_info);
|
g_ptr_array_add (output_infos, output_info);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1107,6 +1274,13 @@ initialize_dbus_interface (MetaMonitorManager *manager)
|
|||||||
g_object_unref);
|
g_object_unref);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* meta_monitor_manager_get:
|
||||||
|
*
|
||||||
|
* Accessor for the singleton MetaMonitorManager.
|
||||||
|
*
|
||||||
|
* Returns: (transfer none): The only #MetaMonitorManager there is.
|
||||||
|
*/
|
||||||
MetaMonitorManager *
|
MetaMonitorManager *
|
||||||
meta_monitor_manager_get (void)
|
meta_monitor_manager_get (void)
|
||||||
{
|
{
|
||||||
@@ -1187,37 +1361,58 @@ meta_monitor_manager_read_current_config (MetaMonitorManager *manager)
|
|||||||
MetaOutput *old_outputs;
|
MetaOutput *old_outputs;
|
||||||
MetaCRTC *old_crtcs;
|
MetaCRTC *old_crtcs;
|
||||||
MetaMonitorMode *old_modes;
|
MetaMonitorMode *old_modes;
|
||||||
unsigned int n_old_outputs, n_old_modes;
|
unsigned int n_old_outputs, n_old_crtcs, n_old_modes;
|
||||||
|
|
||||||
/* Some implementations of read_current use the existing information
|
/* Some implementations of read_current use the existing information
|
||||||
* we have available, so don't free the old configuration until after
|
* we have available, so don't free the old configuration until after
|
||||||
* read_current finishes. */
|
* read_current finishes. */
|
||||||
old_outputs = manager->outputs;
|
old_outputs = manager->outputs;
|
||||||
n_old_outputs = manager->n_outputs;
|
n_old_outputs = manager->n_outputs;
|
||||||
|
old_crtcs = manager->crtcs;
|
||||||
|
n_old_crtcs = manager->n_crtcs;
|
||||||
old_modes = manager->modes;
|
old_modes = manager->modes;
|
||||||
n_old_modes = manager->n_modes;
|
n_old_modes = manager->n_modes;
|
||||||
old_crtcs = manager->crtcs;
|
|
||||||
|
|
||||||
manager->serial++;
|
manager->serial++;
|
||||||
META_MONITOR_MANAGER_GET_CLASS (manager)->read_current (manager);
|
META_MONITOR_MANAGER_GET_CLASS (manager)->read_current (manager);
|
||||||
|
|
||||||
meta_monitor_manager_free_output_array (old_outputs, n_old_outputs);
|
meta_monitor_manager_free_output_array (old_outputs, n_old_outputs);
|
||||||
meta_monitor_manager_free_mode_array (old_modes, n_old_modes);
|
meta_monitor_manager_free_mode_array (old_modes, n_old_modes);
|
||||||
g_free (old_crtcs);
|
meta_monitor_manager_free_crtc_array (old_crtcs, n_old_crtcs);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_monitor_manager_rebuild_derived (MetaMonitorManager *manager)
|
meta_monitor_manager_rebuild_derived (MetaMonitorManager *manager)
|
||||||
{
|
{
|
||||||
|
MetaMonitorManagerClass *manager_class = META_MONITOR_MANAGER_GET_CLASS (manager);
|
||||||
MetaMonitorInfo *old_monitor_infos;
|
MetaMonitorInfo *old_monitor_infos;
|
||||||
|
unsigned old_n_monitor_infos;
|
||||||
|
unsigned i, j;
|
||||||
old_monitor_infos = manager->monitor_infos;
|
old_monitor_infos = manager->monitor_infos;
|
||||||
|
old_n_monitor_infos = manager->n_monitor_infos;
|
||||||
|
|
||||||
if (manager->in_init)
|
if (manager->in_init)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
make_logical_config (manager);
|
make_logical_config (manager);
|
||||||
|
|
||||||
|
if (manager_class->delete_monitor)
|
||||||
|
{
|
||||||
|
for (i = 0; i < old_n_monitor_infos; i++)
|
||||||
|
{
|
||||||
|
gboolean delete_mon = TRUE;
|
||||||
|
for (j = 0; j < manager->n_monitor_infos; j++)
|
||||||
|
{
|
||||||
|
if (manager->monitor_infos[j].monitor_winsys_xid == old_monitor_infos[i].monitor_winsys_xid)
|
||||||
|
{
|
||||||
|
delete_mon = FALSE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (delete_mon)
|
||||||
|
manager_class->delete_monitor (manager, old_monitor_infos[i].monitor_winsys_xid);
|
||||||
|
}
|
||||||
|
}
|
||||||
g_signal_emit_by_name (manager, "monitors-changed");
|
g_signal_emit_by_name (manager, "monitors-changed");
|
||||||
|
|
||||||
g_free (old_monitor_infos);
|
g_free (old_monitor_infos);
|
||||||
@@ -1230,30 +1425,44 @@ meta_output_parse_edid (MetaOutput *meta_output,
|
|||||||
MonitorInfo *parsed_edid;
|
MonitorInfo *parsed_edid;
|
||||||
gsize len;
|
gsize len;
|
||||||
|
|
||||||
|
if (!edid)
|
||||||
|
goto out;
|
||||||
|
|
||||||
parsed_edid = decode_edid (g_bytes_get_data (edid, &len));
|
parsed_edid = decode_edid (g_bytes_get_data (edid, &len));
|
||||||
|
|
||||||
if (parsed_edid)
|
if (parsed_edid)
|
||||||
{
|
{
|
||||||
meta_output->vendor = g_strndup (parsed_edid->manufacturer_code, 4);
|
meta_output->vendor = g_strndup (parsed_edid->manufacturer_code, 4);
|
||||||
if (parsed_edid->dsc_product_name[0])
|
if (!g_utf8_validate (meta_output->vendor, -1, NULL))
|
||||||
|
g_clear_pointer (&meta_output->vendor, g_free);
|
||||||
|
|
||||||
meta_output->product = g_strndup (parsed_edid->dsc_product_name, 14);
|
meta_output->product = g_strndup (parsed_edid->dsc_product_name, 14);
|
||||||
else
|
if (!g_utf8_validate (meta_output->product, -1, NULL) ||
|
||||||
|
meta_output->product[0] == '\0')
|
||||||
|
{
|
||||||
|
g_clear_pointer (&meta_output->product, g_free);
|
||||||
meta_output->product = g_strdup_printf ("0x%04x", (unsigned) parsed_edid->product_code);
|
meta_output->product = g_strdup_printf ("0x%04x", (unsigned) parsed_edid->product_code);
|
||||||
if (parsed_edid->dsc_serial_number[0])
|
}
|
||||||
|
|
||||||
meta_output->serial = g_strndup (parsed_edid->dsc_serial_number, 14);
|
meta_output->serial = g_strndup (parsed_edid->dsc_serial_number, 14);
|
||||||
else
|
if (!g_utf8_validate (meta_output->serial, -1, NULL) ||
|
||||||
|
meta_output->serial[0] == '\0')
|
||||||
|
{
|
||||||
|
g_clear_pointer (&meta_output->serial, g_free);
|
||||||
meta_output->serial = g_strdup_printf ("0x%08x", parsed_edid->serial_number);
|
meta_output->serial = g_strdup_printf ("0x%08x", parsed_edid->serial_number);
|
||||||
|
}
|
||||||
|
|
||||||
g_free (parsed_edid);
|
g_free (parsed_edid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
if (!meta_output->vendor)
|
if (!meta_output->vendor)
|
||||||
{
|
|
||||||
meta_output->vendor = g_strdup ("unknown");
|
meta_output->vendor = g_strdup ("unknown");
|
||||||
|
if (!meta_output->product)
|
||||||
meta_output->product = g_strdup ("unknown");
|
meta_output->product = g_strdup ("unknown");
|
||||||
|
if (!meta_output->serial)
|
||||||
meta_output->serial = g_strdup ("unknown");
|
meta_output->serial = g_strdup ("unknown");
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_monitor_manager_on_hotplug (MetaMonitorManager *manager)
|
meta_monitor_manager_on_hotplug (MetaMonitorManager *manager)
|
||||||
@@ -1327,3 +1536,57 @@ meta_monitor_manager_get_monitor_matrix (MetaMonitorManager *manager,
|
|||||||
matrix);
|
matrix);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* meta_monitor_manager_get_output_geometry:
|
||||||
|
* @manager: A #MetaMonitorManager
|
||||||
|
* @id: A valid #MetaOutput id
|
||||||
|
*
|
||||||
|
* Returns: The monitor index or -1 if @id isn't valid or the output
|
||||||
|
* isn't associated with a logical monitor.
|
||||||
|
*/
|
||||||
|
gint
|
||||||
|
meta_monitor_manager_get_monitor_for_output (MetaMonitorManager *manager,
|
||||||
|
guint id)
|
||||||
|
{
|
||||||
|
MetaOutput *output;
|
||||||
|
guint i;
|
||||||
|
|
||||||
|
g_return_val_if_fail (META_IS_MONITOR_MANAGER (manager), -1);
|
||||||
|
g_return_val_if_fail (id < manager->n_outputs, -1);
|
||||||
|
|
||||||
|
output = &manager->outputs[id];
|
||||||
|
if (!output || !output->crtc)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
for (i = 0; i < manager->n_monitor_infos; i++)
|
||||||
|
if (meta_rectangle_contains_rect (&manager->monitor_infos[i].rect,
|
||||||
|
&output->crtc->rect))
|
||||||
|
return i;
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
gint
|
||||||
|
meta_monitor_manager_get_monitor_at_point (MetaMonitorManager *manager,
|
||||||
|
gfloat x,
|
||||||
|
gfloat y)
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
for (i = 0; i < manager->n_monitor_infos; i++)
|
||||||
|
{
|
||||||
|
MetaMonitorInfo *monitor = &manager->monitor_infos[i];
|
||||||
|
int left, right, top, bottom;
|
||||||
|
|
||||||
|
left = monitor->rect.x;
|
||||||
|
right = left + monitor->rect.width;
|
||||||
|
top = monitor->rect.y;
|
||||||
|
bottom = top + monitor->rect.height;
|
||||||
|
|
||||||
|
if ((x >= left) && (x < right) && (y >= top) && (y < bottom))
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|||||||
57
src/backends/meta-pointer-constraint.c
Normal file
57
src/backends/meta-pointer-constraint.c
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2015 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:
|
||||||
|
* Jonas Ådahl <jadahl@gmail.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#include "backends/meta-pointer-constraint.h"
|
||||||
|
|
||||||
|
#include <glib-object.h>
|
||||||
|
|
||||||
|
G_DEFINE_TYPE (MetaPointerConstraint, meta_pointer_constraint, G_TYPE_OBJECT);
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_pointer_constraint_init (MetaPointerConstraint *constraint)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_pointer_constraint_class_init (MetaPointerConstraintClass *klass)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_pointer_constraint_constrain (MetaPointerConstraint *constraint,
|
||||||
|
ClutterInputDevice *device,
|
||||||
|
guint32 time,
|
||||||
|
float prev_x,
|
||||||
|
float prev_y,
|
||||||
|
float *x,
|
||||||
|
float *y)
|
||||||
|
{
|
||||||
|
META_POINTER_CONSTRAINT_GET_CLASS (constraint)->constrain (constraint,
|
||||||
|
device,
|
||||||
|
time,
|
||||||
|
prev_x, prev_y,
|
||||||
|
x, y);
|
||||||
|
}
|
||||||
60
src/backends/meta-pointer-constraint.h
Normal file
60
src/backends/meta-pointer-constraint.h
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2015 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:
|
||||||
|
* Jonas Ådahl <jadahl@gmail.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef META_POINTER_CONSTRAINT_H
|
||||||
|
#define META_POINTER_CONSTRAINT_H
|
||||||
|
|
||||||
|
#include <glib-object.h>
|
||||||
|
#include <clutter/clutter.h>
|
||||||
|
|
||||||
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
|
#define META_TYPE_POINTER_CONSTRAINT (meta_pointer_constraint_get_type ())
|
||||||
|
G_DECLARE_DERIVABLE_TYPE (MetaPointerConstraint, meta_pointer_constraint,
|
||||||
|
META, POINTER_CONSTRAINT, GObject);
|
||||||
|
|
||||||
|
struct _MetaPointerConstraintClass
|
||||||
|
{
|
||||||
|
GObjectClass parent_class;
|
||||||
|
|
||||||
|
void (*constrain) (MetaPointerConstraint *constraint,
|
||||||
|
ClutterInputDevice *device,
|
||||||
|
guint32 time,
|
||||||
|
float prev_x,
|
||||||
|
float prev_y,
|
||||||
|
float *x,
|
||||||
|
float *y);
|
||||||
|
};
|
||||||
|
|
||||||
|
void meta_pointer_constraint_constrain (MetaPointerConstraint *constraint,
|
||||||
|
ClutterInputDevice *device,
|
||||||
|
guint32 time,
|
||||||
|
float prev_x,
|
||||||
|
float prev_y,
|
||||||
|
float *x,
|
||||||
|
float *y);
|
||||||
|
|
||||||
|
G_END_DECLS
|
||||||
|
|
||||||
|
#endif /* META_POINTER_CONSTRAINT_H */
|
||||||
@@ -24,7 +24,6 @@
|
|||||||
|
|
||||||
#include "meta-stage.h"
|
#include "meta-stage.h"
|
||||||
|
|
||||||
#include "meta-cursor-private.h"
|
|
||||||
#include <meta/meta-backend.h>
|
#include <meta/meta-backend.h>
|
||||||
#include <meta/util.h>
|
#include <meta/util.h>
|
||||||
|
|
||||||
@@ -41,6 +40,7 @@ typedef struct {
|
|||||||
|
|
||||||
struct _MetaStagePrivate {
|
struct _MetaStagePrivate {
|
||||||
MetaOverlay cursor_overlay;
|
MetaOverlay cursor_overlay;
|
||||||
|
gboolean is_active;
|
||||||
};
|
};
|
||||||
typedef struct _MetaStagePrivate MetaStagePrivate;
|
typedef struct _MetaStagePrivate MetaStagePrivate;
|
||||||
|
|
||||||
@@ -126,15 +126,41 @@ meta_stage_paint (ClutterActor *actor)
|
|||||||
meta_overlay_paint (&priv->cursor_overlay);
|
meta_overlay_paint (&priv->cursor_overlay);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_stage_activate (ClutterStage *actor)
|
||||||
|
{
|
||||||
|
MetaStage *stage = META_STAGE (actor);
|
||||||
|
MetaStagePrivate *priv = meta_stage_get_instance_private (stage);
|
||||||
|
|
||||||
|
CLUTTER_STAGE_CLASS (meta_stage_parent_class)->activate (actor);
|
||||||
|
|
||||||
|
priv->is_active = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_stage_deactivate (ClutterStage *actor)
|
||||||
|
{
|
||||||
|
MetaStage *stage = META_STAGE (actor);
|
||||||
|
MetaStagePrivate *priv = meta_stage_get_instance_private (stage);
|
||||||
|
|
||||||
|
CLUTTER_STAGE_CLASS (meta_stage_parent_class)->deactivate (actor);
|
||||||
|
|
||||||
|
priv->is_active = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_stage_class_init (MetaStageClass *klass)
|
meta_stage_class_init (MetaStageClass *klass)
|
||||||
{
|
{
|
||||||
|
ClutterStageClass *stage_class = (ClutterStageClass *) klass;
|
||||||
ClutterActorClass *actor_class = (ClutterActorClass *) klass;
|
ClutterActorClass *actor_class = (ClutterActorClass *) klass;
|
||||||
GObjectClass *object_class = (GObjectClass *) klass;
|
GObjectClass *object_class = (GObjectClass *) klass;
|
||||||
|
|
||||||
object_class->finalize = meta_stage_finalize;
|
object_class->finalize = meta_stage_finalize;
|
||||||
|
|
||||||
actor_class->paint = meta_stage_paint;
|
actor_class->paint = meta_stage_paint;
|
||||||
|
|
||||||
|
stage_class->activate = meta_stage_activate;
|
||||||
|
stage_class->deactivate = meta_stage_deactivate;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -195,3 +221,43 @@ meta_stage_set_cursor (MetaStage *stage,
|
|||||||
meta_overlay_set (&priv->cursor_overlay, texture, rect);
|
meta_overlay_set (&priv->cursor_overlay, texture, rect);
|
||||||
queue_redraw_for_overlay (stage, &priv->cursor_overlay);
|
queue_redraw_for_overlay (stage, &priv->cursor_overlay);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_stage_set_active (MetaStage *stage,
|
||||||
|
gboolean is_active)
|
||||||
|
{
|
||||||
|
MetaStagePrivate *priv = meta_stage_get_instance_private (stage);
|
||||||
|
ClutterEvent event = { 0 };
|
||||||
|
|
||||||
|
/* Used by the native backend to inform accessibility technologies
|
||||||
|
* about when the stage loses and gains input focus.
|
||||||
|
*
|
||||||
|
* For the X11 backend, clutter transparently takes care of this
|
||||||
|
* for us.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (priv->is_active == is_active)
|
||||||
|
return;
|
||||||
|
|
||||||
|
event.type = CLUTTER_STAGE_STATE;
|
||||||
|
clutter_event_set_stage (&event, CLUTTER_STAGE (stage));
|
||||||
|
event.stage_state.changed_mask = CLUTTER_STAGE_STATE_ACTIVATED;
|
||||||
|
|
||||||
|
if (is_active)
|
||||||
|
event.stage_state.new_state = CLUTTER_STAGE_STATE_ACTIVATED;
|
||||||
|
|
||||||
|
/* Emitting this StageState event will result in the stage getting
|
||||||
|
* activated or deactivated (with the activated or deactivated signal
|
||||||
|
* getting emitted from the stage)
|
||||||
|
*
|
||||||
|
* FIXME: This won't update ClutterStage's own notion of its
|
||||||
|
* activeness. For that we would need to somehow trigger a
|
||||||
|
* _clutter_stage_update_state call, which will probably
|
||||||
|
* require new API in clutter. In practice, nothing relies
|
||||||
|
* on the ClutterStage's own notion of activeness when using
|
||||||
|
* the EGL backend.
|
||||||
|
*
|
||||||
|
* See http://bugzilla.gnome.org/746670
|
||||||
|
*/
|
||||||
|
clutter_stage_event (CLUTTER_STAGE (stage), &event);
|
||||||
|
}
|
||||||
|
|||||||
@@ -54,6 +54,9 @@ ClutterActor *meta_stage_new (void);
|
|||||||
void meta_stage_set_cursor (MetaStage *stage,
|
void meta_stage_set_cursor (MetaStage *stage,
|
||||||
CoglTexture *texture,
|
CoglTexture *texture,
|
||||||
MetaRectangle *rect);
|
MetaRectangle *rect);
|
||||||
|
|
||||||
|
void meta_stage_set_active (MetaStage *stage,
|
||||||
|
gboolean is_active);
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
#endif /* META_STAGE_H */
|
#endif /* META_STAGE_H */
|
||||||
|
|||||||
@@ -29,20 +29,26 @@
|
|||||||
|
|
||||||
#include <meta/main.h>
|
#include <meta/main.h>
|
||||||
#include <clutter/evdev/clutter-evdev.h>
|
#include <clutter/evdev/clutter-evdev.h>
|
||||||
|
#include <libupower-glib/upower.h>
|
||||||
|
|
||||||
#include "meta-barrier-native.h"
|
#include "meta-barrier-native.h"
|
||||||
#include "meta-idle-monitor-native.h"
|
#include "meta-idle-monitor-native.h"
|
||||||
#include "meta-monitor-manager-kms.h"
|
#include "meta-monitor-manager-kms.h"
|
||||||
#include "meta-cursor-renderer-native.h"
|
#include "meta-cursor-renderer-native.h"
|
||||||
#include "meta-launcher.h"
|
#include "meta-launcher.h"
|
||||||
|
#include "backends/meta-cursor-tracker-private.h"
|
||||||
|
#include "backends/meta-pointer-constraint.h"
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
struct _MetaBackendNativePrivate
|
struct _MetaBackendNativePrivate
|
||||||
{
|
{
|
||||||
MetaLauncher *launcher;
|
MetaLauncher *launcher;
|
||||||
|
|
||||||
MetaBarrierManagerNative *barrier_manager;
|
MetaBarrierManagerNative *barrier_manager;
|
||||||
|
UpClient *up_client;
|
||||||
GSettings *keyboard_settings;
|
guint sleep_signal_id;
|
||||||
|
GCancellable *cancellable;
|
||||||
|
GDBusConnection *system_bus;
|
||||||
};
|
};
|
||||||
typedef struct _MetaBackendNativePrivate MetaBackendNativePrivate;
|
typedef struct _MetaBackendNativePrivate MetaBackendNativePrivate;
|
||||||
|
|
||||||
@@ -56,9 +62,69 @@ meta_backend_native_finalize (GObject *object)
|
|||||||
|
|
||||||
meta_launcher_free (priv->launcher);
|
meta_launcher_free (priv->launcher);
|
||||||
|
|
||||||
|
g_object_unref (priv->up_client);
|
||||||
|
if (priv->sleep_signal_id)
|
||||||
|
g_dbus_connection_signal_unsubscribe (priv->system_bus, priv->sleep_signal_id);
|
||||||
|
g_cancellable_cancel (priv->cancellable);
|
||||||
|
g_clear_object (&priv->cancellable);
|
||||||
|
g_clear_object (&priv->system_bus);
|
||||||
|
|
||||||
G_OBJECT_CLASS (meta_backend_native_parent_class)->finalize (object);
|
G_OBJECT_CLASS (meta_backend_native_parent_class)->finalize (object);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
prepare_for_sleep_cb (GDBusConnection *connection,
|
||||||
|
const gchar *sender_name,
|
||||||
|
const gchar *object_path,
|
||||||
|
const gchar *interface_name,
|
||||||
|
const gchar *signal_name,
|
||||||
|
GVariant *parameters,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
gboolean suspending;
|
||||||
|
g_variant_get (parameters, "(b)", &suspending);
|
||||||
|
if (suspending)
|
||||||
|
return;
|
||||||
|
meta_idle_monitor_native_reset_idletime (meta_idle_monitor_get_core ());
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
system_bus_gotten_cb (GObject *object,
|
||||||
|
GAsyncResult *res,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
MetaBackendNativePrivate *priv;
|
||||||
|
GDBusConnection *bus;
|
||||||
|
|
||||||
|
bus = g_bus_get_finish (res, NULL);
|
||||||
|
if (!bus)
|
||||||
|
return;
|
||||||
|
|
||||||
|
priv = meta_backend_native_get_instance_private (META_BACKEND_NATIVE (user_data));
|
||||||
|
priv->system_bus = bus;
|
||||||
|
priv->sleep_signal_id = g_dbus_connection_signal_subscribe (priv->system_bus,
|
||||||
|
"org.freedesktop.login1",
|
||||||
|
"org.freedesktop.login1.Manager",
|
||||||
|
"PrepareForSleep",
|
||||||
|
"/org/freedesktop/login1",
|
||||||
|
NULL,
|
||||||
|
G_DBUS_SIGNAL_FLAGS_NONE,
|
||||||
|
prepare_for_sleep_cb,
|
||||||
|
NULL,
|
||||||
|
NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
lid_is_closed_changed_cb (UpClient *client,
|
||||||
|
GParamSpec *pspec,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
if (up_client_get_lid_is_closed (client))
|
||||||
|
return;
|
||||||
|
|
||||||
|
meta_idle_monitor_native_reset_idletime (meta_idle_monitor_get_core ());
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
constrain_to_barriers (ClutterInputDevice *device,
|
constrain_to_barriers (ClutterInputDevice *device,
|
||||||
guint32 time,
|
guint32 time,
|
||||||
@@ -75,6 +141,24 @@ constrain_to_barriers (ClutterInputDevice *device,
|
|||||||
new_x, new_y);
|
new_x, new_y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
constrain_to_client_constraint (ClutterInputDevice *device,
|
||||||
|
guint32 time,
|
||||||
|
float prev_x,
|
||||||
|
float prev_y,
|
||||||
|
float *x,
|
||||||
|
float *y)
|
||||||
|
{
|
||||||
|
MetaBackend *backend = meta_get_backend ();
|
||||||
|
MetaPointerConstraint *constraint = backend->client_pointer_constraint;
|
||||||
|
|
||||||
|
if (!constraint)
|
||||||
|
return;
|
||||||
|
|
||||||
|
meta_pointer_constraint_constrain (constraint, device,
|
||||||
|
time, prev_x, prev_y, x, y);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The pointer constrain code is mostly a rip-off of the XRandR code from Xorg.
|
* The pointer constrain code is mostly a rip-off of the XRandR code from Xorg.
|
||||||
* (from xserver/randr/rrcrtc.c, RRConstrainCursorHarder)
|
* (from xserver/randr/rrcrtc.c, RRConstrainCursorHarder)
|
||||||
@@ -84,31 +168,6 @@ constrain_to_barriers (ClutterInputDevice *device,
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
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
|
static void
|
||||||
constrain_all_screen_monitors (ClutterInputDevice *device,
|
constrain_all_screen_monitors (ClutterInputDevice *device,
|
||||||
MetaMonitorInfo *monitors,
|
MetaMonitorInfo *monitors,
|
||||||
@@ -118,25 +177,25 @@ constrain_all_screen_monitors (ClutterInputDevice *device,
|
|||||||
{
|
{
|
||||||
ClutterPoint current;
|
ClutterPoint current;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
float cx, cy;
|
||||||
|
|
||||||
clutter_input_device_get_coords (device, NULL, ¤t);
|
clutter_input_device_get_coords (device, NULL, ¤t);
|
||||||
|
|
||||||
|
cx = current.x;
|
||||||
|
cy = current.y;
|
||||||
|
|
||||||
/* if we're trying to escape, clamp to the CRTC we're coming from */
|
/* if we're trying to escape, clamp to the CRTC we're coming from */
|
||||||
for (i = 0; i < n_monitors; i++)
|
for (i = 0; i < n_monitors; i++)
|
||||||
{
|
{
|
||||||
MetaMonitorInfo *monitor = &monitors[i];
|
MetaMonitorInfo *monitor = &monitors[i];
|
||||||
int left, right, top, bottom;
|
int left, right, top, bottom;
|
||||||
float nx, ny;
|
|
||||||
|
|
||||||
left = monitor->rect.x;
|
left = monitor->rect.x;
|
||||||
right = left + monitor->rect.width;
|
right = left + monitor->rect.width;
|
||||||
top = monitor->rect.y;
|
top = monitor->rect.y;
|
||||||
bottom = left + monitor->rect.height;
|
bottom = top + monitor->rect.height;
|
||||||
|
|
||||||
nx = current.x;
|
if ((cx >= left) && (cx < right) && (cy >= top) && (cy < bottom))
|
||||||
ny = current.y;
|
|
||||||
|
|
||||||
if ((nx >= left) && (nx < right) && (ny >= top) && (ny < bottom))
|
|
||||||
{
|
{
|
||||||
if (*x < left)
|
if (*x < left)
|
||||||
*x = left;
|
*x = left;
|
||||||
@@ -155,6 +214,8 @@ constrain_all_screen_monitors (ClutterInputDevice *device,
|
|||||||
static void
|
static void
|
||||||
pointer_constrain_callback (ClutterInputDevice *device,
|
pointer_constrain_callback (ClutterInputDevice *device,
|
||||||
guint32 time,
|
guint32 time,
|
||||||
|
float prev_x,
|
||||||
|
float prev_y,
|
||||||
float *new_x,
|
float *new_x,
|
||||||
float *new_y,
|
float *new_y,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
@@ -162,17 +223,18 @@ pointer_constrain_callback (ClutterInputDevice *device,
|
|||||||
MetaMonitorManager *monitor_manager;
|
MetaMonitorManager *monitor_manager;
|
||||||
MetaMonitorInfo *monitors;
|
MetaMonitorInfo *monitors;
|
||||||
unsigned int n_monitors;
|
unsigned int n_monitors;
|
||||||
gboolean ret;
|
|
||||||
|
|
||||||
/* Constrain to barriers */
|
/* Constrain to barriers */
|
||||||
constrain_to_barriers (device, time, new_x, new_y);
|
constrain_to_barriers (device, time, new_x, new_y);
|
||||||
|
|
||||||
|
/* Constrain to pointer lock */
|
||||||
|
constrain_to_client_constraint (device, time, prev_x, prev_y, new_x, new_y);
|
||||||
|
|
||||||
monitor_manager = meta_monitor_manager_get ();
|
monitor_manager = meta_monitor_manager_get ();
|
||||||
monitors = meta_monitor_manager_get_monitor_infos (monitor_manager, &n_monitors);
|
monitors = meta_monitor_manager_get_monitor_infos (monitor_manager, &n_monitors);
|
||||||
|
|
||||||
/* if we're moving inside a monitor, we're fine */
|
/* if we're moving inside a monitor, we're fine */
|
||||||
ret = check_all_screen_monitors(monitors, n_monitors, *new_x, *new_y);
|
if (meta_monitor_manager_get_monitor_at_point (monitor_manager, *new_x, *new_y) >= 0)
|
||||||
if (ret == TRUE)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* if we're trying to escape, clamp to the CRTC we're coming from */
|
/* if we're trying to escape, clamp to the CRTC we're coming from */
|
||||||
@@ -218,11 +280,16 @@ meta_backend_native_warp_pointer (MetaBackend *backend,
|
|||||||
{
|
{
|
||||||
ClutterDeviceManager *manager = clutter_device_manager_get_default ();
|
ClutterDeviceManager *manager = clutter_device_manager_get_default ();
|
||||||
ClutterInputDevice *device = clutter_device_manager_get_core_device (manager, CLUTTER_POINTER_DEVICE);
|
ClutterInputDevice *device = clutter_device_manager_get_core_device (manager, CLUTTER_POINTER_DEVICE);
|
||||||
|
MetaCursorTracker *tracker = meta_cursor_tracker_get_for_screen (NULL);
|
||||||
|
|
||||||
/* XXX */
|
/* XXX */
|
||||||
guint32 time_ = 0;
|
guint32 time_ = 0;
|
||||||
|
|
||||||
|
/* Warp the input device pointer state. */
|
||||||
clutter_evdev_warp_pointer (device, time_, x, y);
|
clutter_evdev_warp_pointer (device, time_, x, y);
|
||||||
|
|
||||||
|
/* Warp displayed pointer cursor. */
|
||||||
|
meta_cursor_tracker_update_position (tracker, x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -269,6 +336,19 @@ meta_backend_native_lock_layout_group (MetaBackend *backend,
|
|||||||
g_signal_emit_by_name (backend, "keymap-layout-group-changed", idx, 0);
|
g_signal_emit_by_name (backend, "keymap-layout-group-changed", idx, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
meta_backend_native_get_relative_motion_deltas (MetaBackend *backend,
|
||||||
|
const ClutterEvent *event,
|
||||||
|
double *dx,
|
||||||
|
double *dy,
|
||||||
|
double *dx_unaccel,
|
||||||
|
double *dy_unaccel)
|
||||||
|
{
|
||||||
|
return clutter_evdev_event_get_relative_motion (event,
|
||||||
|
dx, dy,
|
||||||
|
dx_unaccel, dy_unaccel);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_backend_native_class_init (MetaBackendNativeClass *klass)
|
meta_backend_native_class_init (MetaBackendNativeClass *klass)
|
||||||
{
|
{
|
||||||
@@ -286,17 +366,33 @@ meta_backend_native_class_init (MetaBackendNativeClass *klass)
|
|||||||
backend_class->set_keymap = meta_backend_native_set_keymap;
|
backend_class->set_keymap = meta_backend_native_set_keymap;
|
||||||
backend_class->get_keymap = meta_backend_native_get_keymap;
|
backend_class->get_keymap = meta_backend_native_get_keymap;
|
||||||
backend_class->lock_layout_group = meta_backend_native_lock_layout_group;
|
backend_class->lock_layout_group = meta_backend_native_lock_layout_group;
|
||||||
|
backend_class->get_relative_motion_deltas = meta_backend_native_get_relative_motion_deltas;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_backend_native_init (MetaBackendNative *native)
|
meta_backend_native_init (MetaBackendNative *native)
|
||||||
{
|
{
|
||||||
MetaBackendNativePrivate *priv = meta_backend_native_get_instance_private (native);
|
MetaBackendNativePrivate *priv = meta_backend_native_get_instance_private (native);
|
||||||
|
GError *error = NULL;
|
||||||
|
|
||||||
/* We're a display server, so start talking to weston-launch. */
|
priv->launcher = meta_launcher_new (&error);
|
||||||
priv->launcher = meta_launcher_new ();
|
if (priv->launcher == NULL)
|
||||||
|
{
|
||||||
|
g_warning ("Can't initialize KMS backend: %s\n", error->message);
|
||||||
|
exit (1);
|
||||||
|
}
|
||||||
|
|
||||||
priv->barrier_manager = meta_barrier_manager_native_new ();
|
priv->barrier_manager = meta_barrier_manager_native_new ();
|
||||||
|
|
||||||
|
priv->up_client = up_client_new ();
|
||||||
|
g_signal_connect (priv->up_client, "notify::lid-is-closed",
|
||||||
|
G_CALLBACK (lid_is_closed_changed_cb), NULL);
|
||||||
|
|
||||||
|
priv->cancellable = g_cancellable_new ();
|
||||||
|
g_bus_get (G_BUS_TYPE_SYSTEM,
|
||||||
|
priv->cancellable,
|
||||||
|
system_bus_gotten_cb,
|
||||||
|
native);
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
|
|||||||
@@ -93,126 +93,18 @@ next_serial (void)
|
|||||||
return barrier_serial;
|
return barrier_serial;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct _Vector2
|
|
||||||
{
|
|
||||||
float x, y;
|
|
||||||
} Vector2;
|
|
||||||
|
|
||||||
static float
|
|
||||||
vector2_cross_product (Vector2 a, Vector2 b)
|
|
||||||
{
|
|
||||||
return a.x * b.y - a.y * b.x;
|
|
||||||
}
|
|
||||||
|
|
||||||
static Vector2
|
|
||||||
vector2_add (Vector2 a, Vector2 b)
|
|
||||||
{
|
|
||||||
return (Vector2) {
|
|
||||||
.x = a.x + b.x,
|
|
||||||
.y = a.y + b.y,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
static Vector2
|
|
||||||
vector2_subtract (Vector2 a, Vector2 b)
|
|
||||||
{
|
|
||||||
return (Vector2) {
|
|
||||||
.x = a.x - b.x,
|
|
||||||
.y = a.y - b.y,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
static Vector2
|
|
||||||
vector2_multiply_constant (float c, Vector2 a)
|
|
||||||
{
|
|
||||||
return (Vector2) {
|
|
||||||
.x = c * a.x,
|
|
||||||
.y = c * a.y,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef struct _Line2
|
|
||||||
{
|
|
||||||
Vector2 a;
|
|
||||||
Vector2 b;
|
|
||||||
} Line2;
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
lines_intersect (Line2 *line1, Line2 *line2, Vector2 *intersection)
|
|
||||||
{
|
|
||||||
Vector2 p = line1->a;
|
|
||||||
Vector2 r = vector2_subtract (line1->b, line1->a);
|
|
||||||
Vector2 q = line2->a;
|
|
||||||
Vector2 s = vector2_subtract (line2->b, line2->a);
|
|
||||||
float rxs;
|
|
||||||
float sxr;
|
|
||||||
float t;
|
|
||||||
float u;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The line (p, r) and (q, s) intersects where
|
|
||||||
*
|
|
||||||
* p + t r = q + u s
|
|
||||||
*
|
|
||||||
* Calculate t:
|
|
||||||
*
|
|
||||||
* (p + t r) × s = (q + u s) × s
|
|
||||||
* p × s + t (r × s) = q × s + u (s × s)
|
|
||||||
* p × s + t (r × s) = q × s
|
|
||||||
* t (r × s) = q × s - p × s
|
|
||||||
* t (r × s) = (q - p) × s
|
|
||||||
* t = ((q - p) × s) / (r × s)
|
|
||||||
*
|
|
||||||
* Using the same method, for u we get:
|
|
||||||
*
|
|
||||||
* u = ((p - q) × r) / (s × r)
|
|
||||||
*/
|
|
||||||
|
|
||||||
rxs = vector2_cross_product (r, s);
|
|
||||||
sxr = vector2_cross_product (s, r);
|
|
||||||
|
|
||||||
/* If r × s = 0 then the lines are either parallel or collinear. */
|
|
||||||
if (fabs ( rxs) < DBL_MIN)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
t = vector2_cross_product (vector2_subtract (q, p), s) / rxs;
|
|
||||||
u = vector2_cross_product (vector2_subtract (p, q), r) / sxr;
|
|
||||||
|
|
||||||
|
|
||||||
/* The lines only intersect if 0 ≤ t ≤ 1 and 0 ≤ u ≤ 1. */
|
|
||||||
if (t < 0.0 || t > 1.0 || u < 0.0 || u > 1.0)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
*intersection = vector2_add (p, vector2_multiply_constant (t, r));
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
is_barrier_horizontal (MetaBarrier *barrier)
|
is_barrier_horizontal (MetaBarrier *barrier)
|
||||||
{
|
{
|
||||||
return barrier->priv->y1 == barrier->priv->y2;
|
return meta_border_is_horizontal (&barrier->priv->border);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
is_barrier_blocking_directions (MetaBarrier *barrier,
|
is_barrier_blocking_directions (MetaBarrier *barrier,
|
||||||
MetaBarrierDirection directions)
|
MetaBarrierDirection directions)
|
||||||
{
|
{
|
||||||
/* Barriers doesn't block parallel motions. */
|
return meta_border_is_blocking_directions (&barrier->priv->border,
|
||||||
if (is_barrier_horizontal (barrier))
|
directions);
|
||||||
{
|
|
||||||
if ((directions & (META_BARRIER_DIRECTION_POSITIVE_Y |
|
|
||||||
META_BARRIER_DIRECTION_NEGATIVE_Y)) == 0)
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if ((directions & (META_BARRIER_DIRECTION_POSITIVE_X |
|
|
||||||
META_BARRIER_DIRECTION_NEGATIVE_X)) == 0)
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (barrier->priv->directions & directions) != directions;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -224,31 +116,16 @@ dismiss_pointer (MetaBarrierImplNative *self)
|
|||||||
priv->state = META_BARRIER_STATE_LEFT;
|
priv->state = META_BARRIER_STATE_LEFT;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Line2
|
|
||||||
barrier_to_line (MetaBarrier *barrier)
|
|
||||||
{
|
|
||||||
return (Line2) {
|
|
||||||
.a = (Vector2) {
|
|
||||||
.x = MIN (barrier->priv->x1, barrier->priv->x2),
|
|
||||||
.y = MIN (barrier->priv->y1, barrier->priv->y2),
|
|
||||||
},
|
|
||||||
.b = (Vector2) {
|
|
||||||
.x = MAX (barrier->priv->x1, barrier->priv->x2),
|
|
||||||
.y = MAX (barrier->priv->y1, barrier->priv->y2),
|
|
||||||
},
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Calculate the hit box for a held motion. The hit box is a 2 px wide region
|
* Calculate the hit box for a held motion. The hit box is a 2 px wide region
|
||||||
* in the opposite direction of every direction the barrier blocks. The purpose
|
* in the opposite direction of every direction the barrier blocks. The purpose
|
||||||
* of this is to allow small movements without receiving a "left" signal. This
|
* of this is to allow small movements without receiving a "left" signal. This
|
||||||
* heuristic comes from the X.org pointer barrier implementation.
|
* heuristic comes from the X.org pointer barrier implementation.
|
||||||
*/
|
*/
|
||||||
static Line2
|
static MetaLine2
|
||||||
calculate_barrier_hit_box (MetaBarrier *barrier)
|
calculate_barrier_hit_box (MetaBarrier *barrier)
|
||||||
{
|
{
|
||||||
Line2 hit_box = barrier_to_line (barrier);
|
MetaLine2 hit_box = barrier->priv->border.line;
|
||||||
|
|
||||||
if (is_barrier_horizontal (barrier))
|
if (is_barrier_horizontal (barrier))
|
||||||
{
|
{
|
||||||
@@ -273,7 +150,8 @@ calculate_barrier_hit_box (MetaBarrier *barrier)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
is_within_box (Line2 box, Vector2 point)
|
is_within_box (MetaLine2 box,
|
||||||
|
MetaVector2 point)
|
||||||
{
|
{
|
||||||
return (point.x >= box.a.x && point.x < box.b.x &&
|
return (point.x >= box.a.x && point.x < box.b.x &&
|
||||||
point.y >= box.a.y && point.y < box.b.y);
|
point.y >= box.a.y && point.y < box.b.y);
|
||||||
@@ -288,8 +166,8 @@ maybe_release_barrier (gpointer key,
|
|||||||
MetaBarrierImplNativePrivate *priv =
|
MetaBarrierImplNativePrivate *priv =
|
||||||
meta_barrier_impl_native_get_instance_private (self);
|
meta_barrier_impl_native_get_instance_private (self);
|
||||||
MetaBarrier *barrier = priv->barrier;
|
MetaBarrier *barrier = priv->barrier;
|
||||||
Line2 *motion = user_data;
|
MetaLine2 *motion = user_data;
|
||||||
Line2 hit_box;
|
MetaLine2 hit_box;
|
||||||
|
|
||||||
if (priv->state != META_BARRIER_STATE_HELD)
|
if (priv->state != META_BARRIER_STATE_HELD)
|
||||||
return;
|
return;
|
||||||
@@ -297,8 +175,10 @@ maybe_release_barrier (gpointer key,
|
|||||||
/* Release if we end up outside barrier end points. */
|
/* Release if we end up outside barrier end points. */
|
||||||
if (is_barrier_horizontal (barrier))
|
if (is_barrier_horizontal (barrier))
|
||||||
{
|
{
|
||||||
if (motion->b.x > MAX (barrier->priv->x1, barrier->priv->x2) ||
|
if (motion->b.x > MAX (barrier->priv->border.line.a.x,
|
||||||
motion->b.x < MIN (barrier->priv->x1, barrier->priv->x2))
|
barrier->priv->border.line.b.x) ||
|
||||||
|
motion->b.x < MIN (barrier->priv->border.line.a.x,
|
||||||
|
barrier->priv->border.line.b.x))
|
||||||
{
|
{
|
||||||
dismiss_pointer (self);
|
dismiss_pointer (self);
|
||||||
return;
|
return;
|
||||||
@@ -306,8 +186,10 @@ maybe_release_barrier (gpointer key,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (motion->b.y > MAX (barrier->priv->y1, barrier->priv->y2) ||
|
if (motion->b.y > MAX (barrier->priv->border.line.a.y,
|
||||||
motion->b.y < MIN (barrier->priv->y1, barrier->priv->y2))
|
barrier->priv->border.line.b.y) ||
|
||||||
|
motion->b.y < MIN (barrier->priv->border.line.a.y,
|
||||||
|
barrier->priv->border.line.b.y))
|
||||||
{
|
{
|
||||||
dismiss_pointer (self);
|
dismiss_pointer (self);
|
||||||
return;
|
return;
|
||||||
@@ -330,7 +212,7 @@ maybe_release_barriers (MetaBarrierManagerNative *manager,
|
|||||||
float x,
|
float x,
|
||||||
float y)
|
float y)
|
||||||
{
|
{
|
||||||
Line2 motion = {
|
MetaLine2 motion = {
|
||||||
.a = {
|
.a = {
|
||||||
.x = prev_x,
|
.x = prev_x,
|
||||||
.y = prev_y,
|
.y = prev_y,
|
||||||
@@ -350,7 +232,7 @@ typedef struct _MetaClosestBarrierData
|
|||||||
{
|
{
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
Line2 motion;
|
MetaLine2 motion;
|
||||||
MetaBarrierDirection directions;
|
MetaBarrierDirection directions;
|
||||||
} in;
|
} in;
|
||||||
|
|
||||||
@@ -371,8 +253,7 @@ update_closest_barrier (gpointer key,
|
|||||||
meta_barrier_impl_native_get_instance_private (self);
|
meta_barrier_impl_native_get_instance_private (self);
|
||||||
MetaBarrier *barrier = priv->barrier;
|
MetaBarrier *barrier = priv->barrier;
|
||||||
MetaClosestBarrierData *data = user_data;
|
MetaClosestBarrierData *data = user_data;
|
||||||
Line2 barrier_line;
|
MetaVector2 intersection;
|
||||||
Vector2 intersection;
|
|
||||||
float dx, dy;
|
float dx, dy;
|
||||||
float distance_2;
|
float distance_2;
|
||||||
|
|
||||||
@@ -391,17 +272,9 @@ update_closest_barrier (gpointer key,
|
|||||||
|
|
||||||
/* Check if the motion intersects with the barrier, and retrieve the
|
/* Check if the motion intersects with the barrier, and retrieve the
|
||||||
* intersection point if any. */
|
* intersection point if any. */
|
||||||
barrier_line = (Line2) {
|
if (!meta_line2_intersects_with (&barrier->priv->border.line,
|
||||||
.a = {
|
&data->in.motion,
|
||||||
.x = barrier->priv->x1,
|
&intersection))
|
||||||
.y = barrier->priv->y1
|
|
||||||
},
|
|
||||||
.b = {
|
|
||||||
.x = barrier->priv->x2,
|
|
||||||
.y = barrier->priv->y2
|
|
||||||
},
|
|
||||||
};
|
|
||||||
if (!lines_intersect (&barrier_line, &data->in.motion, &intersection))
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* Calculate the distance to the barrier and keep track of the closest
|
/* Calculate the distance to the barrier and keep track of the closest
|
||||||
@@ -570,9 +443,9 @@ clamp_to_barrier (MetaBarrierImplNative *self,
|
|||||||
if (is_barrier_horizontal (barrier))
|
if (is_barrier_horizontal (barrier))
|
||||||
{
|
{
|
||||||
if (*motion_dir & META_BARRIER_DIRECTION_POSITIVE_Y)
|
if (*motion_dir & META_BARRIER_DIRECTION_POSITIVE_Y)
|
||||||
*y = barrier->priv->y1;
|
*y = barrier->priv->border.line.a.y;
|
||||||
else if (*motion_dir & META_BARRIER_DIRECTION_NEGATIVE_Y)
|
else if (*motion_dir & META_BARRIER_DIRECTION_NEGATIVE_Y)
|
||||||
*y = barrier->priv->y1;
|
*y = barrier->priv->border.line.a.y;
|
||||||
|
|
||||||
priv->blocked_dir = *motion_dir & (META_BARRIER_DIRECTION_POSITIVE_Y |
|
priv->blocked_dir = *motion_dir & (META_BARRIER_DIRECTION_POSITIVE_Y |
|
||||||
META_BARRIER_DIRECTION_NEGATIVE_Y);
|
META_BARRIER_DIRECTION_NEGATIVE_Y);
|
||||||
@@ -582,9 +455,9 @@ clamp_to_barrier (MetaBarrierImplNative *self,
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (*motion_dir & META_BARRIER_DIRECTION_POSITIVE_X)
|
if (*motion_dir & META_BARRIER_DIRECTION_POSITIVE_X)
|
||||||
*x = barrier->priv->x1;
|
*x = barrier->priv->border.line.a.x;
|
||||||
else if (*motion_dir & META_BARRIER_DIRECTION_NEGATIVE_X)
|
else if (*motion_dir & META_BARRIER_DIRECTION_NEGATIVE_X)
|
||||||
*x = barrier->priv->x1;
|
*x = barrier->priv->border.line.a.x;
|
||||||
|
|
||||||
priv->blocked_dir = *motion_dir & (META_BARRIER_DIRECTION_POSITIVE_X |
|
priv->blocked_dir = *motion_dir & (META_BARRIER_DIRECTION_POSITIVE_X |
|
||||||
META_BARRIER_DIRECTION_NEGATIVE_X);
|
META_BARRIER_DIRECTION_NEGATIVE_X);
|
||||||
|
|||||||
@@ -26,11 +26,16 @@
|
|||||||
|
|
||||||
#include "meta-cursor-renderer-native.h"
|
#include "meta-cursor-renderer-native.h"
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
#include <gbm.h>
|
#include <gbm.h>
|
||||||
#include <xf86drm.h>
|
#include <xf86drm.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
#include "meta-cursor-private.h"
|
#include <meta/util.h>
|
||||||
#include "meta-monitor-manager.h"
|
#include <meta/meta-backend.h>
|
||||||
|
|
||||||
|
#include "meta-monitor-manager-private.h"
|
||||||
|
#include "meta/boxes.h"
|
||||||
|
|
||||||
#ifndef DRM_CAP_CURSOR_WIDTH
|
#ifndef DRM_CAP_CURSOR_WIDTH
|
||||||
#define DRM_CAP_CURSOR_WIDTH 0x8
|
#define DRM_CAP_CURSOR_WIDTH 0x8
|
||||||
@@ -39,10 +44,28 @@
|
|||||||
#define DRM_CAP_CURSOR_HEIGHT 0x9
|
#define DRM_CAP_CURSOR_HEIGHT 0x9
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* When animating a cursor, we usually call drmModeSetCursor2 once per frame.
|
||||||
|
* Though, testing shows that we need to triple buffer the cursor buffer in
|
||||||
|
* order to avoid glitches when animating the cursor, at least when running on
|
||||||
|
* Intel. The reason for this might be (but is not confirmed to be) due to
|
||||||
|
* the user space gbm_bo cache, making us reuse and overwrite the kernel side
|
||||||
|
* buffer content before it was scanned out. To avoid this, we keep a user space
|
||||||
|
* reference to each buffer we set until at least one frame after it was drawn.
|
||||||
|
* In effect, this means we three active cursor gbm_bo's: one that that just has
|
||||||
|
* been set, one that was previously set and may or may not have been scanned
|
||||||
|
* out, and one pending that will be replaced if the cursor sprite changes.
|
||||||
|
*/
|
||||||
|
#define HW_CURSOR_BUFFER_COUNT 3
|
||||||
|
|
||||||
|
static GQuark quark_cursor_sprite = 0;
|
||||||
|
|
||||||
struct _MetaCursorRendererNativePrivate
|
struct _MetaCursorRendererNativePrivate
|
||||||
{
|
{
|
||||||
gboolean has_hw_cursor;
|
gboolean has_hw_cursor;
|
||||||
|
|
||||||
|
MetaCursorSprite *last_cursor;
|
||||||
|
guint animation_timeout_id;
|
||||||
|
|
||||||
int drm_fd;
|
int drm_fd;
|
||||||
struct gbm_device *gbm;
|
struct gbm_device *gbm;
|
||||||
|
|
||||||
@@ -51,77 +74,167 @@ struct _MetaCursorRendererNativePrivate
|
|||||||
};
|
};
|
||||||
typedef struct _MetaCursorRendererNativePrivate MetaCursorRendererNativePrivate;
|
typedef struct _MetaCursorRendererNativePrivate MetaCursorRendererNativePrivate;
|
||||||
|
|
||||||
|
typedef enum _MetaCursorGbmBoState
|
||||||
|
{
|
||||||
|
META_CURSOR_GBM_BO_STATE_NONE,
|
||||||
|
META_CURSOR_GBM_BO_STATE_SET,
|
||||||
|
META_CURSOR_GBM_BO_STATE_INVALIDATED,
|
||||||
|
} MetaCursorGbmBoState;
|
||||||
|
|
||||||
|
typedef struct _MetaCursorNativePrivate
|
||||||
|
{
|
||||||
|
guint active_bo;
|
||||||
|
MetaCursorGbmBoState pending_bo_state;
|
||||||
|
struct gbm_bo *bos[HW_CURSOR_BUFFER_COUNT];
|
||||||
|
} MetaCursorNativePrivate;
|
||||||
|
|
||||||
G_DEFINE_TYPE_WITH_PRIVATE (MetaCursorRendererNative, meta_cursor_renderer_native, META_TYPE_CURSOR_RENDERER);
|
G_DEFINE_TYPE_WITH_PRIVATE (MetaCursorRendererNative, meta_cursor_renderer_native, META_TYPE_CURSOR_RENDERER);
|
||||||
|
|
||||||
|
static MetaCursorNativePrivate *
|
||||||
|
ensure_cursor_priv (MetaCursorSprite *cursor_sprite);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_cursor_renderer_native_finalize (GObject *object)
|
meta_cursor_renderer_native_finalize (GObject *object)
|
||||||
{
|
{
|
||||||
MetaCursorRendererNative *renderer = META_CURSOR_RENDERER_NATIVE (object);
|
MetaCursorRendererNative *renderer = META_CURSOR_RENDERER_NATIVE (object);
|
||||||
MetaCursorRendererNativePrivate *priv = meta_cursor_renderer_native_get_instance_private (renderer);
|
MetaCursorRendererNativePrivate *priv = meta_cursor_renderer_native_get_instance_private (renderer);
|
||||||
|
|
||||||
if (priv->gbm)
|
if (priv->animation_timeout_id)
|
||||||
gbm_device_destroy (priv->gbm);
|
g_source_remove (priv->animation_timeout_id);
|
||||||
|
|
||||||
G_OBJECT_CLASS (meta_cursor_renderer_native_parent_class)->finalize (object);
|
G_OBJECT_CLASS (meta_cursor_renderer_native_parent_class)->finalize (object);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static guint
|
||||||
|
get_pending_cursor_sprite_gbm_bo_index (MetaCursorSprite *cursor_sprite)
|
||||||
|
{
|
||||||
|
MetaCursorNativePrivate *cursor_priv =
|
||||||
|
g_object_get_qdata (G_OBJECT (cursor_sprite), quark_cursor_sprite);
|
||||||
|
|
||||||
|
return (cursor_priv->active_bo + 1) % HW_CURSOR_BUFFER_COUNT;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct gbm_bo *
|
||||||
|
get_pending_cursor_sprite_gbm_bo (MetaCursorSprite *cursor_sprite)
|
||||||
|
{
|
||||||
|
MetaCursorNativePrivate *cursor_priv =
|
||||||
|
g_object_get_qdata (G_OBJECT (cursor_sprite), quark_cursor_sprite);
|
||||||
|
guint pending_bo;
|
||||||
|
|
||||||
|
if (!cursor_priv)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
pending_bo = get_pending_cursor_sprite_gbm_bo_index (cursor_sprite);
|
||||||
|
return cursor_priv->bos[pending_bo];
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct gbm_bo *
|
||||||
|
get_active_cursor_sprite_gbm_bo (MetaCursorSprite *cursor_sprite)
|
||||||
|
{
|
||||||
|
MetaCursorNativePrivate *cursor_priv =
|
||||||
|
g_object_get_qdata (G_OBJECT (cursor_sprite), quark_cursor_sprite);
|
||||||
|
|
||||||
|
if (!cursor_priv)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return cursor_priv->bos[cursor_priv->active_bo];
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_pending_cursor_sprite_gbm_bo (MetaCursorSprite *cursor_sprite,
|
||||||
|
struct gbm_bo *bo)
|
||||||
|
{
|
||||||
|
MetaCursorNativePrivate *cursor_priv;
|
||||||
|
guint pending_bo;
|
||||||
|
|
||||||
|
cursor_priv = ensure_cursor_priv (cursor_sprite);
|
||||||
|
|
||||||
|
pending_bo = get_pending_cursor_sprite_gbm_bo_index (cursor_sprite);
|
||||||
|
cursor_priv->bos[pending_bo] = bo;
|
||||||
|
cursor_priv->pending_bo_state = META_CURSOR_GBM_BO_STATE_SET;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
set_crtc_cursor (MetaCursorRendererNative *native,
|
set_crtc_cursor (MetaCursorRendererNative *native,
|
||||||
MetaCRTC *crtc,
|
MetaCRTC *crtc,
|
||||||
MetaCursorReference *cursor,
|
MetaCursorSprite *cursor_sprite,
|
||||||
gboolean force)
|
gboolean force)
|
||||||
{
|
{
|
||||||
MetaCursorRendererNativePrivate *priv = meta_cursor_renderer_native_get_instance_private (native);
|
MetaCursorRendererNativePrivate *priv = meta_cursor_renderer_native_get_instance_private (native);
|
||||||
|
|
||||||
if (crtc->cursor == cursor && !force)
|
if (cursor_sprite)
|
||||||
return;
|
|
||||||
|
|
||||||
crtc->cursor = cursor;
|
|
||||||
|
|
||||||
if (cursor)
|
|
||||||
{
|
{
|
||||||
|
MetaCursorNativePrivate *cursor_priv =
|
||||||
|
g_object_get_qdata (G_OBJECT (cursor_sprite), quark_cursor_sprite);
|
||||||
struct gbm_bo *bo;
|
struct gbm_bo *bo;
|
||||||
union gbm_bo_handle handle;
|
union gbm_bo_handle handle;
|
||||||
int hot_x, hot_y;
|
int hot_x, hot_y;
|
||||||
|
|
||||||
bo = meta_cursor_reference_get_gbm_bo (cursor, &hot_x, &hot_y);
|
if (cursor_priv->pending_bo_state == META_CURSOR_GBM_BO_STATE_SET)
|
||||||
|
bo = get_pending_cursor_sprite_gbm_bo (cursor_sprite);
|
||||||
|
else
|
||||||
|
bo = get_active_cursor_sprite_gbm_bo (cursor_sprite);
|
||||||
|
|
||||||
|
if (!force && bo == crtc->cursor_renderer_private)
|
||||||
|
return;
|
||||||
|
|
||||||
|
crtc->cursor_renderer_private = bo;
|
||||||
|
|
||||||
handle = gbm_bo_get_handle (bo);
|
handle = gbm_bo_get_handle (bo);
|
||||||
|
meta_cursor_sprite_get_hotspot (cursor_sprite, &hot_x, &hot_y);
|
||||||
|
|
||||||
drmModeSetCursor2 (priv->drm_fd, crtc->crtc_id, handle.u32,
|
drmModeSetCursor2 (priv->drm_fd, crtc->crtc_id, handle.u32,
|
||||||
priv->cursor_width, priv->cursor_height, hot_x, hot_y);
|
priv->cursor_width, priv->cursor_height, hot_x, hot_y);
|
||||||
|
|
||||||
|
if (cursor_priv->pending_bo_state == META_CURSOR_GBM_BO_STATE_SET)
|
||||||
|
{
|
||||||
|
cursor_priv->active_bo =
|
||||||
|
(cursor_priv->active_bo + 1) % HW_CURSOR_BUFFER_COUNT;
|
||||||
|
cursor_priv->pending_bo_state = META_CURSOR_GBM_BO_STATE_NONE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
if (force || crtc->cursor_renderer_private != NULL)
|
||||||
{
|
{
|
||||||
drmModeSetCursor2 (priv->drm_fd, crtc->crtc_id, 0, 0, 0, 0, 0);
|
drmModeSetCursor2 (priv->drm_fd, crtc->crtc_id, 0, 0, 0, 0, 0);
|
||||||
|
crtc->cursor_renderer_private = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
update_hw_cursor (MetaCursorRendererNative *native,
|
update_hw_cursor (MetaCursorRendererNative *native,
|
||||||
|
MetaCursorSprite *cursor_sprite,
|
||||||
gboolean force)
|
gboolean force)
|
||||||
{
|
{
|
||||||
MetaCursorRendererNativePrivate *priv = meta_cursor_renderer_native_get_instance_private (native);
|
MetaCursorRendererNativePrivate *priv = meta_cursor_renderer_native_get_instance_private (native);
|
||||||
MetaCursorRenderer *renderer = META_CURSOR_RENDERER (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;
|
MetaMonitorManager *monitors;
|
||||||
MetaCRTC *crtcs;
|
MetaCRTC *crtcs;
|
||||||
unsigned int i, n_crtcs;
|
unsigned int i, n_crtcs;
|
||||||
|
MetaRectangle rect;
|
||||||
|
|
||||||
monitors = meta_monitor_manager_get ();
|
monitors = meta_monitor_manager_get ();
|
||||||
meta_monitor_manager_get_resources (monitors, NULL, NULL, &crtcs, &n_crtcs, NULL, NULL);
|
meta_monitor_manager_get_resources (monitors, NULL, NULL, &crtcs, &n_crtcs, NULL, NULL);
|
||||||
|
|
||||||
|
if (cursor_sprite)
|
||||||
|
rect = meta_cursor_renderer_calculate_rect (renderer, cursor_sprite);
|
||||||
|
else
|
||||||
|
rect = (MetaRectangle) { 0 };
|
||||||
|
|
||||||
for (i = 0; i < n_crtcs; i++)
|
for (i = 0; i < n_crtcs; i++)
|
||||||
{
|
{
|
||||||
gboolean crtc_should_have_cursor;
|
gboolean crtc_should_use_cursor;
|
||||||
MetaCursorReference *crtc_cursor;
|
MetaCursorSprite *crtc_cursor;
|
||||||
MetaRectangle *crtc_rect;
|
MetaRectangle *crtc_rect;
|
||||||
|
|
||||||
crtc_rect = &crtcs[i].rect;
|
crtc_rect = &crtcs[i].rect;
|
||||||
|
|
||||||
crtc_should_have_cursor = (priv->has_hw_cursor && meta_rectangle_overlap (cursor_rect, crtc_rect));
|
crtc_should_use_cursor = (priv->has_hw_cursor &&
|
||||||
if (crtc_should_have_cursor)
|
meta_rectangle_overlap (&rect, crtc_rect));
|
||||||
crtc_cursor = cursor;
|
if (crtc_should_use_cursor)
|
||||||
|
crtc_cursor = cursor_sprite;
|
||||||
else
|
else
|
||||||
crtc_cursor = NULL;
|
crtc_cursor = NULL;
|
||||||
|
|
||||||
@@ -130,34 +243,382 @@ update_hw_cursor (MetaCursorRendererNative *native,
|
|||||||
if (crtc_cursor)
|
if (crtc_cursor)
|
||||||
{
|
{
|
||||||
drmModeMoveCursor (priv->drm_fd, crtcs[i].crtc_id,
|
drmModeMoveCursor (priv->drm_fd, crtcs[i].crtc_id,
|
||||||
cursor_rect->x - crtc_rect->x,
|
rect.x - crtc_rect->x,
|
||||||
cursor_rect->y - crtc_rect->y);
|
rect.y - crtc_rect->y);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
should_have_hw_cursor (MetaCursorRenderer *renderer)
|
has_valid_cursor_sprite_gbm_bo (MetaCursorSprite *cursor_sprite)
|
||||||
{
|
{
|
||||||
MetaCursorReference *cursor = meta_cursor_renderer_get_cursor (renderer);
|
MetaCursorNativePrivate *cursor_priv =
|
||||||
|
g_object_get_qdata (G_OBJECT (cursor_sprite), quark_cursor_sprite);
|
||||||
|
|
||||||
|
if (!cursor_priv)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
switch (cursor_priv->pending_bo_state)
|
||||||
|
{
|
||||||
|
case META_CURSOR_GBM_BO_STATE_NONE:
|
||||||
|
return get_active_cursor_sprite_gbm_bo (cursor_sprite) != NULL;
|
||||||
|
case META_CURSOR_GBM_BO_STATE_SET:
|
||||||
|
return TRUE;
|
||||||
|
case META_CURSOR_GBM_BO_STATE_INVALIDATED:
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_assert_not_reached ();
|
||||||
|
|
||||||
if (cursor)
|
|
||||||
return (meta_cursor_reference_get_gbm_bo (cursor, NULL, NULL) != NULL);
|
|
||||||
else
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
meta_cursor_renderer_native_update_cursor (MetaCursorRenderer *renderer)
|
cursor_over_transformed_crtc (MetaCursorRenderer *renderer,
|
||||||
|
MetaCursorSprite *cursor_sprite)
|
||||||
|
{
|
||||||
|
MetaMonitorManager *monitors;
|
||||||
|
MetaCRTC *crtcs;
|
||||||
|
unsigned int i, n_crtcs;
|
||||||
|
MetaRectangle rect;
|
||||||
|
|
||||||
|
monitors = meta_monitor_manager_get ();
|
||||||
|
meta_monitor_manager_get_resources (monitors, NULL, NULL,
|
||||||
|
&crtcs, &n_crtcs, NULL, NULL);
|
||||||
|
rect = meta_cursor_renderer_calculate_rect (renderer, cursor_sprite);
|
||||||
|
|
||||||
|
for (i = 0; i < n_crtcs; i++)
|
||||||
|
{
|
||||||
|
if (!meta_rectangle_overlap (&rect, &crtcs[i].rect))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (crtcs[i].transform != META_MONITOR_TRANSFORM_NORMAL)
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
should_have_hw_cursor (MetaCursorRenderer *renderer,
|
||||||
|
MetaCursorSprite *cursor_sprite)
|
||||||
|
{
|
||||||
|
CoglTexture *texture;
|
||||||
|
|
||||||
|
if (!cursor_sprite)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (cursor_over_transformed_crtc (renderer, cursor_sprite))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
texture = meta_cursor_sprite_get_cogl_texture (cursor_sprite);
|
||||||
|
if (!texture)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (meta_cursor_sprite_get_texture_scale (cursor_sprite) != 1)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (!has_valid_cursor_sprite_gbm_bo (cursor_sprite))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
meta_cursor_renderer_native_update_animation (MetaCursorRendererNative *native)
|
||||||
|
{
|
||||||
|
MetaCursorRendererNativePrivate *priv = meta_cursor_renderer_native_get_instance_private (native);
|
||||||
|
MetaCursorRenderer *renderer = META_CURSOR_RENDERER (native);
|
||||||
|
MetaCursorSprite *cursor_sprite = meta_cursor_renderer_get_cursor (renderer);
|
||||||
|
|
||||||
|
priv->animation_timeout_id = 0;
|
||||||
|
meta_cursor_sprite_tick_frame (cursor_sprite);
|
||||||
|
meta_cursor_renderer_force_update (renderer);
|
||||||
|
|
||||||
|
return G_SOURCE_REMOVE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_cursor_renderer_native_trigger_frame (MetaCursorRendererNative *native,
|
||||||
|
MetaCursorSprite *cursor_sprite)
|
||||||
|
{
|
||||||
|
MetaCursorRendererNativePrivate *priv = meta_cursor_renderer_native_get_instance_private (native);
|
||||||
|
gboolean cursor_change;
|
||||||
|
guint delay;
|
||||||
|
|
||||||
|
cursor_change = cursor_sprite != priv->last_cursor;
|
||||||
|
priv->last_cursor = cursor_sprite;
|
||||||
|
|
||||||
|
if (!cursor_change && priv->animation_timeout_id)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (priv->animation_timeout_id)
|
||||||
|
{
|
||||||
|
g_source_remove (priv->animation_timeout_id);
|
||||||
|
priv->animation_timeout_id = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cursor_sprite && meta_cursor_sprite_is_animated (cursor_sprite))
|
||||||
|
{
|
||||||
|
delay = meta_cursor_sprite_get_current_frame_time (cursor_sprite);
|
||||||
|
|
||||||
|
if (delay == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
priv->animation_timeout_id =
|
||||||
|
g_timeout_add (delay,
|
||||||
|
(GSourceFunc) meta_cursor_renderer_native_update_animation,
|
||||||
|
native);
|
||||||
|
g_source_set_name_by_id (priv->animation_timeout_id,
|
||||||
|
"[mutter] meta_cursor_renderer_native_update_animation");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
meta_cursor_renderer_native_update_cursor (MetaCursorRenderer *renderer,
|
||||||
|
MetaCursorSprite *cursor_sprite)
|
||||||
{
|
{
|
||||||
MetaCursorRendererNative *native = META_CURSOR_RENDERER_NATIVE (renderer);
|
MetaCursorRendererNative *native = META_CURSOR_RENDERER_NATIVE (renderer);
|
||||||
MetaCursorRendererNativePrivate *priv = meta_cursor_renderer_native_get_instance_private (native);
|
MetaCursorRendererNativePrivate *priv = meta_cursor_renderer_native_get_instance_private (native);
|
||||||
|
|
||||||
priv->has_hw_cursor = should_have_hw_cursor (renderer);
|
if (cursor_sprite)
|
||||||
update_hw_cursor (native, FALSE);
|
meta_cursor_sprite_realize_texture (cursor_sprite);
|
||||||
|
|
||||||
|
meta_cursor_renderer_native_trigger_frame (native, cursor_sprite);
|
||||||
|
|
||||||
|
priv->has_hw_cursor = should_have_hw_cursor (renderer, cursor_sprite);
|
||||||
|
update_hw_cursor (native, cursor_sprite, FALSE);
|
||||||
return priv->has_hw_cursor;
|
return priv->has_hw_cursor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
get_hardware_cursor_size (MetaCursorRendererNative *native,
|
||||||
|
uint64_t *width, uint64_t *height)
|
||||||
|
{
|
||||||
|
MetaCursorRendererNativePrivate *priv =
|
||||||
|
meta_cursor_renderer_native_get_instance_private (native);
|
||||||
|
|
||||||
|
*width = priv->cursor_width;
|
||||||
|
*height = priv->cursor_height;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
cursor_priv_free (gpointer data)
|
||||||
|
{
|
||||||
|
MetaCursorNativePrivate *cursor_priv = data;
|
||||||
|
guint i;
|
||||||
|
|
||||||
|
if (!data)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (i = 0; i < HW_CURSOR_BUFFER_COUNT; i++)
|
||||||
|
g_clear_pointer (&cursor_priv->bos[0], (GDestroyNotify) gbm_bo_destroy);
|
||||||
|
g_slice_free (MetaCursorNativePrivate, cursor_priv);
|
||||||
|
}
|
||||||
|
|
||||||
|
static MetaCursorNativePrivate *
|
||||||
|
ensure_cursor_priv (MetaCursorSprite *cursor_sprite)
|
||||||
|
{
|
||||||
|
MetaCursorNativePrivate *cursor_priv =
|
||||||
|
g_object_get_qdata (G_OBJECT (cursor_sprite), quark_cursor_sprite);
|
||||||
|
|
||||||
|
if (!cursor_priv)
|
||||||
|
{
|
||||||
|
cursor_priv = g_slice_new0 (MetaCursorNativePrivate);
|
||||||
|
g_object_set_qdata_full (G_OBJECT (cursor_sprite),
|
||||||
|
quark_cursor_sprite,
|
||||||
|
cursor_priv,
|
||||||
|
cursor_priv_free);
|
||||||
|
}
|
||||||
|
|
||||||
|
return cursor_priv;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
load_cursor_sprite_gbm_buffer (MetaCursorRendererNative *native,
|
||||||
|
MetaCursorSprite *cursor_sprite,
|
||||||
|
uint8_t *pixels,
|
||||||
|
uint width,
|
||||||
|
uint height,
|
||||||
|
int rowstride,
|
||||||
|
uint32_t gbm_format)
|
||||||
|
{
|
||||||
|
MetaCursorRendererNativePrivate *priv =
|
||||||
|
meta_cursor_renderer_native_get_instance_private (native);
|
||||||
|
uint64_t cursor_width, cursor_height;
|
||||||
|
|
||||||
|
get_hardware_cursor_size (native, &cursor_width, &cursor_height);
|
||||||
|
|
||||||
|
if (width > cursor_width || height > cursor_height)
|
||||||
|
{
|
||||||
|
meta_warning ("Invalid theme cursor size (must be at most %ux%u)\n",
|
||||||
|
(unsigned int)cursor_width, (unsigned int)cursor_height);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gbm_device_is_format_supported (priv->gbm, gbm_format,
|
||||||
|
GBM_BO_USE_CURSOR | GBM_BO_USE_WRITE))
|
||||||
|
{
|
||||||
|
struct gbm_bo *bo;
|
||||||
|
uint8_t buf[4 * cursor_width * cursor_height];
|
||||||
|
uint i;
|
||||||
|
|
||||||
|
bo = gbm_bo_create (priv->gbm, cursor_width, cursor_height,
|
||||||
|
gbm_format, GBM_BO_USE_CURSOR | GBM_BO_USE_WRITE);
|
||||||
|
if (!bo)
|
||||||
|
{
|
||||||
|
meta_warning ("Failed to allocate HW cursor buffer\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset (buf, 0, sizeof(buf));
|
||||||
|
for (i = 0; i < height; i++)
|
||||||
|
memcpy (buf + i * 4 * cursor_width, pixels + i * rowstride, width * 4);
|
||||||
|
if (gbm_bo_write (bo, buf, cursor_width * cursor_height * 4) != 0)
|
||||||
|
{
|
||||||
|
meta_warning ("Failed to write cursors buffer data: %s",
|
||||||
|
g_strerror (errno));
|
||||||
|
gbm_bo_destroy (bo);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
set_pending_cursor_sprite_gbm_bo (cursor_sprite, bo);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
meta_warning ("HW cursor for format %d not supported\n", gbm_format);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
invalidate_pending_cursor_sprite_gbm_bo (MetaCursorSprite *cursor_sprite)
|
||||||
|
{
|
||||||
|
MetaCursorNativePrivate *cursor_priv =
|
||||||
|
g_object_get_qdata (G_OBJECT (cursor_sprite), quark_cursor_sprite);
|
||||||
|
guint pending_bo;
|
||||||
|
|
||||||
|
if (!cursor_priv)
|
||||||
|
return;
|
||||||
|
|
||||||
|
pending_bo = get_pending_cursor_sprite_gbm_bo_index (cursor_sprite);
|
||||||
|
g_clear_pointer (&cursor_priv->bos[pending_bo],
|
||||||
|
(GDestroyNotify) gbm_bo_destroy);
|
||||||
|
cursor_priv->pending_bo_state = META_CURSOR_GBM_BO_STATE_INVALIDATED;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_WAYLAND
|
||||||
|
static void
|
||||||
|
meta_cursor_renderer_native_realize_cursor_from_wl_buffer (MetaCursorRenderer *renderer,
|
||||||
|
MetaCursorSprite *cursor_sprite,
|
||||||
|
struct wl_resource *buffer)
|
||||||
|
{
|
||||||
|
MetaCursorRendererNative *native = META_CURSOR_RENDERER_NATIVE (renderer);
|
||||||
|
MetaCursorRendererNativePrivate *priv =
|
||||||
|
meta_cursor_renderer_native_get_instance_private (native);
|
||||||
|
uint32_t gbm_format;
|
||||||
|
uint64_t cursor_width, cursor_height;
|
||||||
|
CoglTexture *texture;
|
||||||
|
uint width, height;
|
||||||
|
|
||||||
|
/* Destroy any previous pending cursor buffer; we'll always either fail (which
|
||||||
|
* should unset, or succeed, which will set new buffer.
|
||||||
|
*/
|
||||||
|
invalidate_pending_cursor_sprite_gbm_bo (cursor_sprite);
|
||||||
|
|
||||||
|
texture = meta_cursor_sprite_get_cogl_texture (cursor_sprite);
|
||||||
|
width = cogl_texture_get_width (texture);
|
||||||
|
height = cogl_texture_get_height (texture);
|
||||||
|
|
||||||
|
struct wl_shm_buffer *shm_buffer = wl_shm_buffer_get (buffer);
|
||||||
|
if (shm_buffer)
|
||||||
|
{
|
||||||
|
int rowstride = wl_shm_buffer_get_stride (shm_buffer);
|
||||||
|
uint8_t *buffer_data;
|
||||||
|
|
||||||
|
wl_shm_buffer_begin_access (shm_buffer);
|
||||||
|
|
||||||
|
switch (wl_shm_buffer_get_format (shm_buffer))
|
||||||
|
{
|
||||||
|
#if G_BYTE_ORDER == G_BIG_ENDIAN
|
||||||
|
case WL_SHM_FORMAT_ARGB8888:
|
||||||
|
gbm_format = GBM_FORMAT_ARGB8888;
|
||||||
|
break;
|
||||||
|
case WL_SHM_FORMAT_XRGB8888:
|
||||||
|
gbm_format = GBM_FORMAT_XRGB8888;
|
||||||
|
break;
|
||||||
|
#else
|
||||||
|
case WL_SHM_FORMAT_ARGB8888:
|
||||||
|
gbm_format = GBM_FORMAT_ARGB8888;
|
||||||
|
break;
|
||||||
|
case WL_SHM_FORMAT_XRGB8888:
|
||||||
|
gbm_format = GBM_FORMAT_XRGB8888;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
default:
|
||||||
|
g_warn_if_reached ();
|
||||||
|
gbm_format = GBM_FORMAT_ARGB8888;
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer_data = wl_shm_buffer_get_data (shm_buffer);
|
||||||
|
load_cursor_sprite_gbm_buffer (native,
|
||||||
|
cursor_sprite,
|
||||||
|
buffer_data,
|
||||||
|
width, height, rowstride,
|
||||||
|
gbm_format);
|
||||||
|
|
||||||
|
wl_shm_buffer_end_access (shm_buffer);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
struct gbm_bo *bo;
|
||||||
|
|
||||||
|
/* HW cursors have a predefined size (at least 64x64), which usually is
|
||||||
|
* bigger than cursor theme size, so themed cursors must be padded with
|
||||||
|
* transparent pixels to fill the overlay. This is trivial if we have CPU
|
||||||
|
* access to the data, but it's not possible if the buffer is in GPU
|
||||||
|
* memory (and possibly tiled too), so if we don't get the right size, we
|
||||||
|
* fallback to GL. */
|
||||||
|
get_hardware_cursor_size (native, &cursor_width, &cursor_height);
|
||||||
|
|
||||||
|
if (width != cursor_width || height != cursor_height)
|
||||||
|
{
|
||||||
|
meta_warning ("Invalid cursor size (must be 64x64), falling back to software (GL) cursors\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
bo = gbm_bo_import (priv->gbm,
|
||||||
|
GBM_BO_IMPORT_WL_BUFFER,
|
||||||
|
buffer,
|
||||||
|
GBM_BO_USE_CURSOR);
|
||||||
|
if (!bo)
|
||||||
|
{
|
||||||
|
meta_warning ("Importing HW cursor from wl_buffer failed\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
set_pending_cursor_sprite_gbm_bo (cursor_sprite, bo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_cursor_renderer_native_realize_cursor_from_xcursor (MetaCursorRenderer *renderer,
|
||||||
|
MetaCursorSprite *cursor_sprite,
|
||||||
|
XcursorImage *xc_image)
|
||||||
|
{
|
||||||
|
MetaCursorRendererNative *native = META_CURSOR_RENDERER_NATIVE (renderer);
|
||||||
|
|
||||||
|
invalidate_pending_cursor_sprite_gbm_bo (cursor_sprite);
|
||||||
|
|
||||||
|
load_cursor_sprite_gbm_buffer (native,
|
||||||
|
cursor_sprite,
|
||||||
|
(uint8_t *) xc_image->pixels,
|
||||||
|
xc_image->width,
|
||||||
|
xc_image->height,
|
||||||
|
xc_image->width * 4,
|
||||||
|
GBM_FORMAT_ARGB8888);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_cursor_renderer_native_class_init (MetaCursorRendererNativeClass *klass)
|
meta_cursor_renderer_native_class_init (MetaCursorRendererNativeClass *klass)
|
||||||
{
|
{
|
||||||
@@ -166,6 +627,22 @@ meta_cursor_renderer_native_class_init (MetaCursorRendererNativeClass *klass)
|
|||||||
|
|
||||||
object_class->finalize = meta_cursor_renderer_native_finalize;
|
object_class->finalize = meta_cursor_renderer_native_finalize;
|
||||||
renderer_class->update_cursor = meta_cursor_renderer_native_update_cursor;
|
renderer_class->update_cursor = meta_cursor_renderer_native_update_cursor;
|
||||||
|
#ifdef HAVE_WAYLAND
|
||||||
|
renderer_class->realize_cursor_from_wl_buffer =
|
||||||
|
meta_cursor_renderer_native_realize_cursor_from_wl_buffer;
|
||||||
|
#endif
|
||||||
|
renderer_class->realize_cursor_from_xcursor =
|
||||||
|
meta_cursor_renderer_native_realize_cursor_from_xcursor;
|
||||||
|
|
||||||
|
quark_cursor_sprite = g_quark_from_static_string ("-meta-cursor-native");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
force_update_hw_cursor (MetaCursorRendererNative *native)
|
||||||
|
{
|
||||||
|
MetaCursorRenderer *renderer = META_CURSOR_RENDERER (native);
|
||||||
|
|
||||||
|
update_hw_cursor (native, meta_cursor_renderer_get_cursor (renderer), TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -173,7 +650,7 @@ on_monitors_changed (MetaMonitorManager *monitors,
|
|||||||
MetaCursorRendererNative *native)
|
MetaCursorRendererNative *native)
|
||||||
{
|
{
|
||||||
/* Our tracking is all messed up, so force an update. */
|
/* Our tracking is all messed up, so force an update. */
|
||||||
update_hw_cursor (native, TRUE);
|
force_update_hw_cursor (native);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -192,7 +669,7 @@ meta_cursor_renderer_native_init (MetaCursorRendererNative *native)
|
|||||||
{
|
{
|
||||||
CoglRenderer *cogl_renderer = cogl_display_get_renderer (cogl_context_get_display (ctx));
|
CoglRenderer *cogl_renderer = cogl_display_get_renderer (cogl_context_get_display (ctx));
|
||||||
priv->drm_fd = cogl_kms_renderer_get_kms_fd (cogl_renderer);
|
priv->drm_fd = cogl_kms_renderer_get_kms_fd (cogl_renderer);
|
||||||
priv->gbm = gbm_create_device (priv->drm_fd);
|
priv->gbm = cogl_kms_renderer_get_gbm (cogl_renderer);
|
||||||
|
|
||||||
uint64_t width, height;
|
uint64_t width, height;
|
||||||
if (drmGetCap (priv->drm_fd, DRM_CAP_CURSOR_WIDTH, &width) == 0 &&
|
if (drmGetCap (priv->drm_fd, DRM_CAP_CURSOR_WIDTH, &width) == 0 &&
|
||||||
@@ -218,18 +695,8 @@ meta_cursor_renderer_native_get_gbm_device (MetaCursorRendererNative *native)
|
|||||||
return priv->gbm;
|
return priv->gbm;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
meta_cursor_renderer_native_get_cursor_size (MetaCursorRendererNative *native,
|
|
||||||
uint64_t *width, uint64_t *height)
|
|
||||||
{
|
|
||||||
MetaCursorRendererNativePrivate *priv = meta_cursor_renderer_native_get_instance_private (native);
|
|
||||||
|
|
||||||
*width = priv->cursor_width;
|
|
||||||
*height = priv->cursor_height;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_cursor_renderer_native_force_update (MetaCursorRendererNative *native)
|
meta_cursor_renderer_native_force_update (MetaCursorRendererNative *native)
|
||||||
{
|
{
|
||||||
update_hw_cursor (native, TRUE);
|
force_update_hw_cursor (native);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -164,56 +164,36 @@ meta_idle_monitor_native_init (MetaIdleMonitorNative *monitor_native)
|
|||||||
monitor->watches = g_hash_table_new_full (NULL, NULL, NULL, free_watch);
|
monitor->watches = g_hash_table_new_full (NULL, NULL, NULL, free_watch);
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
MetaIdleMonitorNative *monitor_native;
|
|
||||||
GList *fired_watches;
|
|
||||||
} CheckNativeClosure;
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
check_native_watch (gpointer key,
|
|
||||||
gpointer value,
|
|
||||||
gpointer user_data)
|
|
||||||
{
|
|
||||||
MetaIdleMonitorWatchNative *watch_native = value;
|
|
||||||
MetaIdleMonitorWatch *watch = (MetaIdleMonitorWatch *) watch_native;
|
|
||||||
CheckNativeClosure *closure = user_data;
|
|
||||||
gboolean steal;
|
|
||||||
|
|
||||||
if (watch->timeout_msec == 0)
|
|
||||||
{
|
|
||||||
closure->fired_watches = g_list_prepend (closure->fired_watches, watch);
|
|
||||||
steal = TRUE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
g_source_set_ready_time (watch_native->timeout_source,
|
|
||||||
closure->monitor_native->last_event_time +
|
|
||||||
watch->timeout_msec * 1000);
|
|
||||||
steal = FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return steal;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
fire_native_watch (gpointer watch,
|
|
||||||
gpointer data)
|
|
||||||
{
|
|
||||||
_meta_idle_monitor_watch_fire (watch);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_idle_monitor_native_reset_idletime (MetaIdleMonitor *monitor)
|
meta_idle_monitor_native_reset_idletime (MetaIdleMonitor *monitor)
|
||||||
{
|
{
|
||||||
MetaIdleMonitorNative *monitor_native = META_IDLE_MONITOR_NATIVE (monitor);
|
MetaIdleMonitorNative *monitor_native = META_IDLE_MONITOR_NATIVE (monitor);
|
||||||
CheckNativeClosure closure;
|
GList *node, *watch_ids;
|
||||||
|
|
||||||
monitor_native->last_event_time = g_get_monotonic_time ();
|
monitor_native->last_event_time = g_get_monotonic_time ();
|
||||||
|
|
||||||
closure.monitor_native = monitor_native;
|
watch_ids = g_hash_table_get_keys (monitor->watches);
|
||||||
closure.fired_watches = NULL;
|
|
||||||
g_hash_table_foreach_steal (monitor->watches, check_native_watch, &closure);
|
|
||||||
|
|
||||||
g_list_foreach (closure.fired_watches, fire_native_watch, NULL);
|
for (node = watch_ids; node != NULL; node = node->next)
|
||||||
g_list_free (closure.fired_watches);
|
{
|
||||||
|
guint watch_id = GPOINTER_TO_UINT (node->data);
|
||||||
|
MetaIdleMonitorWatchNative *watch;
|
||||||
|
|
||||||
|
watch = g_hash_table_lookup (monitor->watches, GUINT_TO_POINTER (watch_id));
|
||||||
|
if (!watch)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (watch->base.timeout_msec == 0)
|
||||||
|
{
|
||||||
|
_meta_idle_monitor_watch_fire ((MetaIdleMonitorWatch *) watch);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
g_source_set_ready_time (watch->timeout_source,
|
||||||
|
monitor_native->last_event_time +
|
||||||
|
watch->base.timeout_msec * 1000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
g_list_free (watch_ids);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -139,30 +139,44 @@ device_set_scroll_method (struct libinput_device *libinput_device,
|
|||||||
return (method & supported) != 0;
|
return (method & supported) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
device_set_click_method (struct libinput_device *libinput_device,
|
||||||
|
enum libinput_config_click_method method)
|
||||||
|
{
|
||||||
|
enum libinput_config_click_method supported;
|
||||||
|
|
||||||
|
supported = libinput_device_config_click_get_methods (libinput_device);
|
||||||
|
|
||||||
|
if (method & supported)
|
||||||
|
libinput_device_config_click_set_method (libinput_device, method);
|
||||||
|
|
||||||
|
return (method & supported) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_input_settings_native_set_scroll_method (MetaInputSettings *settings,
|
meta_input_settings_native_set_edge_scroll (MetaInputSettings *settings,
|
||||||
ClutterInputDevice *device,
|
ClutterInputDevice *device,
|
||||||
GDesktopTouchpadScrollMethod mode)
|
gboolean edge_scrolling_enabled)
|
||||||
{
|
{
|
||||||
enum libinput_config_scroll_method scroll_method = 0;
|
enum libinput_config_scroll_method scroll_method = 0;
|
||||||
struct libinput_device *libinput_device;
|
struct libinput_device *libinput_device;
|
||||||
|
enum libinput_config_scroll_method supported;
|
||||||
|
|
||||||
libinput_device = clutter_evdev_input_device_get_libinput_device (device);
|
libinput_device = clutter_evdev_input_device_get_libinput_device (device);
|
||||||
|
supported = libinput_device_config_scroll_get_methods (libinput_device);
|
||||||
|
|
||||||
switch (mode)
|
if (supported & LIBINPUT_CONFIG_SCROLL_2FG)
|
||||||
{
|
{
|
||||||
case G_DESKTOP_TOUCHPAD_SCROLL_METHOD_DISABLED:
|
|
||||||
scroll_method = LIBINPUT_CONFIG_SCROLL_NO_SCROLL;
|
|
||||||
break;
|
|
||||||
case G_DESKTOP_TOUCHPAD_SCROLL_METHOD_EDGE_SCROLLING:
|
|
||||||
scroll_method = LIBINPUT_CONFIG_SCROLL_2FG;
|
scroll_method = LIBINPUT_CONFIG_SCROLL_2FG;
|
||||||
break;
|
}
|
||||||
case G_DESKTOP_TOUCHPAD_SCROLL_METHOD_TWO_FINGER_SCROLLING:
|
else if (supported & LIBINPUT_CONFIG_SCROLL_EDGE &&
|
||||||
|
edge_scrolling_enabled)
|
||||||
|
{
|
||||||
scroll_method = LIBINPUT_CONFIG_SCROLL_EDGE;
|
scroll_method = LIBINPUT_CONFIG_SCROLL_EDGE;
|
||||||
break;
|
}
|
||||||
default:
|
else
|
||||||
g_assert_not_reached ();
|
{
|
||||||
return;
|
scroll_method = LIBINPUT_CONFIG_SCROLL_NO_SCROLL;
|
||||||
}
|
}
|
||||||
|
|
||||||
device_set_scroll_method (libinput_device, scroll_method);
|
device_set_scroll_method (libinput_device, scroll_method);
|
||||||
@@ -184,6 +198,38 @@ meta_input_settings_native_set_scroll_button (MetaInputSettings *settings,
|
|||||||
libinput_device_config_scroll_set_button (libinput_device, button);
|
libinput_device_config_scroll_set_button (libinput_device, button);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_input_settings_native_set_click_method (MetaInputSettings *settings,
|
||||||
|
ClutterInputDevice *device,
|
||||||
|
GDesktopTouchpadClickMethod mode)
|
||||||
|
{
|
||||||
|
enum libinput_config_click_method click_method = 0;
|
||||||
|
struct libinput_device *libinput_device;
|
||||||
|
|
||||||
|
libinput_device = clutter_evdev_input_device_get_libinput_device (device);
|
||||||
|
|
||||||
|
switch (mode)
|
||||||
|
{
|
||||||
|
case G_DESKTOP_TOUCHPAD_CLICK_METHOD_DEFAULT:
|
||||||
|
click_method = libinput_device_config_click_get_default_method (libinput_device);
|
||||||
|
break;
|
||||||
|
case G_DESKTOP_TOUCHPAD_CLICK_METHOD_NONE:
|
||||||
|
click_method = LIBINPUT_CONFIG_CLICK_METHOD_NONE;
|
||||||
|
break;
|
||||||
|
case G_DESKTOP_TOUCHPAD_CLICK_METHOD_AREAS:
|
||||||
|
click_method = LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS;
|
||||||
|
break;
|
||||||
|
case G_DESKTOP_TOUCHPAD_CLICK_METHOD_FINGERS:
|
||||||
|
click_method = LIBINPUT_CONFIG_CLICK_METHOD_CLICKFINGER;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
g_assert_not_reached ();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
device_set_click_method (libinput_device, click_method);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_input_settings_native_set_keyboard_repeat (MetaInputSettings *settings,
|
meta_input_settings_native_set_keyboard_repeat (MetaInputSettings *settings,
|
||||||
gboolean enabled,
|
gboolean enabled,
|
||||||
@@ -206,8 +252,9 @@ meta_input_settings_native_class_init (MetaInputSettingsNativeClass *klass)
|
|||||||
input_settings_class->set_left_handed = meta_input_settings_native_set_left_handed;
|
input_settings_class->set_left_handed = meta_input_settings_native_set_left_handed;
|
||||||
input_settings_class->set_tap_enabled = meta_input_settings_native_set_tap_enabled;
|
input_settings_class->set_tap_enabled = meta_input_settings_native_set_tap_enabled;
|
||||||
input_settings_class->set_invert_scroll = meta_input_settings_native_set_invert_scroll;
|
input_settings_class->set_invert_scroll = meta_input_settings_native_set_invert_scroll;
|
||||||
input_settings_class->set_scroll_method = meta_input_settings_native_set_scroll_method;
|
input_settings_class->set_edge_scroll = meta_input_settings_native_set_edge_scroll;
|
||||||
input_settings_class->set_scroll_button = meta_input_settings_native_set_scroll_button;
|
input_settings_class->set_scroll_button = meta_input_settings_native_set_scroll_button;
|
||||||
|
input_settings_class->set_click_method = meta_input_settings_native_set_click_method;
|
||||||
input_settings_class->set_keyboard_repeat = meta_input_settings_native_set_keyboard_repeat;
|
input_settings_class->set_keyboard_repeat = meta_input_settings_native_set_keyboard_repeat;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -37,12 +37,20 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
#include <systemd/sd-login.h>
|
#include <systemd/sd-login.h>
|
||||||
|
#include <gudev/gudev.h>
|
||||||
|
|
||||||
#include "dbus-utils.h"
|
#include "dbus-utils.h"
|
||||||
#include "meta-dbus-login1.h"
|
#include "meta-dbus-login1.h"
|
||||||
|
|
||||||
#include "backends/meta-backend-private.h"
|
#include "backends/meta-backend-private.h"
|
||||||
#include "meta-cursor-renderer-native.h"
|
#include "meta-cursor-renderer-native.h"
|
||||||
|
#include "meta-idle-monitor-native.h"
|
||||||
|
|
||||||
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GUdevDevice, g_object_unref)
|
||||||
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GUdevClient, g_object_unref)
|
||||||
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GUdevEnumerator, g_object_unref)
|
||||||
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(Login1Session, g_object_unref)
|
||||||
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(Login1Seat, g_object_unref)
|
||||||
|
|
||||||
struct _MetaLauncher
|
struct _MetaLauncher
|
||||||
{
|
{
|
||||||
@@ -53,14 +61,21 @@ struct _MetaLauncher
|
|||||||
};
|
};
|
||||||
|
|
||||||
static Login1Session *
|
static Login1Session *
|
||||||
get_session_proxy (GCancellable *cancellable)
|
get_session_proxy (GCancellable *cancellable,
|
||||||
|
GError **error)
|
||||||
{
|
{
|
||||||
char *proxy_path;
|
g_autofree char *proxy_path = NULL;
|
||||||
char *session_id;
|
g_autofree char *session_id = NULL;
|
||||||
Login1Session *session_proxy;
|
Login1Session *session_proxy;
|
||||||
|
|
||||||
if (sd_pid_get_session (getpid (), &session_id) < 0)
|
if (sd_pid_get_session (getpid (), &session_id) < 0)
|
||||||
|
{
|
||||||
|
g_set_error (error,
|
||||||
|
G_IO_ERROR,
|
||||||
|
G_IO_ERROR_NOT_FOUND,
|
||||||
|
"Could not get session ID: %m");
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
proxy_path = get_escaped_dbus_path ("/org/freedesktop/login1/session", session_id);
|
proxy_path = get_escaped_dbus_path ("/org/freedesktop/login1/session", session_id);
|
||||||
|
|
||||||
@@ -68,31 +83,37 @@ get_session_proxy (GCancellable *cancellable)
|
|||||||
G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
|
G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
|
||||||
"org.freedesktop.login1",
|
"org.freedesktop.login1",
|
||||||
proxy_path,
|
proxy_path,
|
||||||
cancellable, NULL);
|
cancellable, error);
|
||||||
free (proxy_path);
|
if (!session_proxy)
|
||||||
|
g_prefix_error(error, "Could not get session proxy: ");
|
||||||
|
|
||||||
return session_proxy;
|
return session_proxy;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Login1Seat *
|
static Login1Seat *
|
||||||
get_seat_proxy (GCancellable *cancellable)
|
get_seat_proxy (GCancellable *cancellable,
|
||||||
|
GError **error)
|
||||||
{
|
{
|
||||||
return login1_seat_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
|
Login1Seat *seat = login1_seat_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
|
||||||
G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
|
G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
|
||||||
"org.freedesktop.login1",
|
"org.freedesktop.login1",
|
||||||
"/org/freedesktop/login1/seat/self",
|
"/org/freedesktop/login1/seat/self",
|
||||||
cancellable, NULL);
|
cancellable, error);
|
||||||
|
if (!seat)
|
||||||
|
g_prefix_error(error, "Could not get seat proxy: ");
|
||||||
|
|
||||||
|
return seat;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
session_unpause (void)
|
session_unpause (void)
|
||||||
{
|
{
|
||||||
ClutterBackend *backend;
|
ClutterBackend *clutter_backend;
|
||||||
CoglContext *cogl_context;
|
CoglContext *cogl_context;
|
||||||
CoglDisplay *cogl_display;
|
CoglDisplay *cogl_display;
|
||||||
|
|
||||||
backend = clutter_get_default_backend ();
|
clutter_backend = clutter_get_default_backend ();
|
||||||
cogl_context = clutter_backend_get_cogl_context (backend);
|
cogl_context = clutter_backend_get_cogl_context (clutter_backend);
|
||||||
cogl_display = cogl_context_get_display (cogl_context);
|
cogl_display = cogl_context_get_display (cogl_context);
|
||||||
cogl_kms_display_queue_modes_reset (cogl_display);
|
cogl_kms_display_queue_modes_reset (cogl_display);
|
||||||
|
|
||||||
@@ -110,6 +131,7 @@ session_unpause (void)
|
|||||||
|
|
||||||
clutter_actor_queue_redraw (stage);
|
clutter_actor_queue_redraw (stage);
|
||||||
meta_cursor_renderer_native_force_update (META_CURSOR_RENDERER_NATIVE (renderer));
|
meta_cursor_renderer_native_force_update (META_CURSOR_RENDERER_NATIVE (renderer));
|
||||||
|
meta_idle_monitor_native_reset_idletime (meta_idle_monitor_get_core ());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -128,9 +150,8 @@ take_device (Login1Session *session_proxy,
|
|||||||
GCancellable *cancellable,
|
GCancellable *cancellable,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
gboolean ret = FALSE;
|
g_autoptr (GVariant) fd_variant = NULL;
|
||||||
GVariant *fd_variant = NULL;
|
g_autoptr (GUnixFDList) fd_list = NULL;
|
||||||
GUnixFDList *fd_list = NULL;
|
|
||||||
int fd = -1;
|
int fd = -1;
|
||||||
|
|
||||||
if (!login1_session_call_take_device_sync (session_proxy,
|
if (!login1_session_call_take_device_sync (session_proxy,
|
||||||
@@ -142,21 +163,14 @@ take_device (Login1Session *session_proxy,
|
|||||||
&fd_list,
|
&fd_list,
|
||||||
cancellable,
|
cancellable,
|
||||||
error))
|
error))
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
fd = g_unix_fd_list_get (fd_list, g_variant_get_handle (fd_variant), error);
|
fd = g_unix_fd_list_get (fd_list, g_variant_get_handle (fd_variant), error);
|
||||||
if (fd == -1)
|
if (fd == -1)
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
*out_fd = fd;
|
*out_fd = fd;
|
||||||
ret = TRUE;
|
return TRUE;
|
||||||
|
|
||||||
out:
|
|
||||||
if (fd_variant)
|
|
||||||
g_variant_unref (fd_variant);
|
|
||||||
if (fd_list)
|
|
||||||
g_object_unref (fd_list);
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
@@ -164,22 +178,16 @@ get_device_info_from_path (const char *path,
|
|||||||
int *out_major,
|
int *out_major,
|
||||||
int *out_minor)
|
int *out_minor)
|
||||||
{
|
{
|
||||||
gboolean ret = FALSE;
|
|
||||||
int r;
|
int r;
|
||||||
struct stat st;
|
struct stat st;
|
||||||
|
|
||||||
r = stat (path, &st);
|
r = stat (path, &st);
|
||||||
if (r < 0)
|
if (r < 0 || !S_ISCHR (st.st_mode))
|
||||||
goto out;
|
return FALSE;
|
||||||
if (!S_ISCHR (st.st_mode))
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
*out_major = major (st.st_rdev);
|
*out_major = major (st.st_rdev);
|
||||||
*out_minor = minor (st.st_rdev);
|
*out_minor = minor (st.st_rdev);
|
||||||
ret = TRUE;
|
return TRUE;
|
||||||
|
|
||||||
out:
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
@@ -187,22 +195,16 @@ get_device_info_from_fd (int fd,
|
|||||||
int *out_major,
|
int *out_major,
|
||||||
int *out_minor)
|
int *out_minor)
|
||||||
{
|
{
|
||||||
gboolean ret = FALSE;
|
|
||||||
int r;
|
int r;
|
||||||
struct stat st;
|
struct stat st;
|
||||||
|
|
||||||
r = fstat (fd, &st);
|
r = fstat (fd, &st);
|
||||||
if (r < 0)
|
if (r < 0 || !S_ISCHR (st.st_mode))
|
||||||
goto out;
|
return FALSE;
|
||||||
if (!S_ISCHR (st.st_mode))
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
*out_major = major (st.st_rdev);
|
*out_major = major (st.st_rdev);
|
||||||
*out_minor = minor (st.st_rdev);
|
*out_minor = minor (st.st_rdev);
|
||||||
ret = TRUE;
|
return TRUE;
|
||||||
|
|
||||||
out:
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
@@ -241,7 +243,7 @@ on_evdev_device_close (int fd,
|
|||||||
if (!get_device_info_from_fd (fd, &major, &minor))
|
if (!get_device_info_from_fd (fd, &major, &minor))
|
||||||
{
|
{
|
||||||
g_warning ("Could not get device info for fd %d: %m", fd);
|
g_warning ("Could not get device info for fd %d: %m", fd);
|
||||||
return;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!login1_session_call_release_device_sync (self->session_proxy,
|
if (!login1_session_call_release_device_sync (self->session_proxy,
|
||||||
@@ -250,6 +252,9 @@ on_evdev_device_close (int fd,
|
|||||||
{
|
{
|
||||||
g_warning ("Could not release device %d,%d: %s", major, minor, error->message);
|
g_warning ("Could not release device %d,%d: %s", major, minor, error->message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
|
close (fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -277,25 +282,111 @@ on_active_changed (Login1Session *session,
|
|||||||
sync_active (self);
|
sync_active (self);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gchar *
|
||||||
|
get_primary_gpu_path (const gchar *seat_name)
|
||||||
|
{
|
||||||
|
const gchar *subsystems[] = {"drm", NULL};
|
||||||
|
gchar *path = NULL;
|
||||||
|
GList *devices, *tmp;
|
||||||
|
|
||||||
|
g_autoptr (GUdevClient) gudev_client = g_udev_client_new (subsystems);
|
||||||
|
g_autoptr (GUdevEnumerator) enumerator = g_udev_enumerator_new (gudev_client);
|
||||||
|
|
||||||
|
g_udev_enumerator_add_match_name (enumerator, "card*");
|
||||||
|
g_udev_enumerator_add_match_tag (enumerator, "seat");
|
||||||
|
|
||||||
|
devices = g_udev_enumerator_execute (enumerator);
|
||||||
|
if (!devices)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
for (tmp = devices; tmp != NULL; tmp = tmp->next)
|
||||||
|
{
|
||||||
|
g_autoptr (GUdevDevice) platform_device = NULL;
|
||||||
|
g_autoptr (GUdevDevice) pci_device = NULL;
|
||||||
|
GUdevDevice *dev = tmp->data;
|
||||||
|
gint boot_vga;
|
||||||
|
const gchar *device_seat;
|
||||||
|
|
||||||
|
/* filter out devices that are not character device, like card0-VGA-1 */
|
||||||
|
if (g_udev_device_get_device_type (dev) != G_UDEV_DEVICE_TYPE_CHAR)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
device_seat = g_udev_device_get_property (dev, "ID_SEAT");
|
||||||
|
if (!device_seat)
|
||||||
|
{
|
||||||
|
/* when ID_SEAT is not set, it means seat0 */
|
||||||
|
device_seat = "seat0";
|
||||||
|
}
|
||||||
|
else if (g_strcmp0 (device_seat, "seat0") != 0)
|
||||||
|
{
|
||||||
|
/* if the device has been explicitly assigned other seat
|
||||||
|
* than seat0, it is probably the right device to use */
|
||||||
|
path = g_strdup (g_udev_device_get_device_file (dev));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* skip devices that do not belong to our seat */
|
||||||
|
if (g_strcmp0 (seat_name, device_seat))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
platform_device = g_udev_device_get_parent_with_subsystem (dev, "platform", NULL);
|
||||||
|
if (platform_device != NULL)
|
||||||
|
{
|
||||||
|
path = g_strdup (g_udev_device_get_device_file (dev));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
pci_device = g_udev_device_get_parent_with_subsystem (dev, "pci", NULL);
|
||||||
|
if (pci_device != NULL)
|
||||||
|
{
|
||||||
|
/* get value of boot_vga attribute or 0 if the device has no boot_vga */
|
||||||
|
boot_vga = g_udev_device_get_sysfs_attr_as_int (pci_device, "boot_vga");
|
||||||
|
if (boot_vga == 1)
|
||||||
|
{
|
||||||
|
/* found the boot_vga device */
|
||||||
|
path = g_strdup (g_udev_device_get_device_file (dev));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
g_list_free_full (devices, g_object_unref);
|
||||||
|
|
||||||
|
out:
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
get_kms_fd (Login1Session *session_proxy,
|
get_kms_fd (Login1Session *session_proxy,
|
||||||
int *fd_out)
|
const gchar *seat_id,
|
||||||
|
int *fd_out,
|
||||||
|
GError **error)
|
||||||
{
|
{
|
||||||
int major, minor;
|
int major, minor;
|
||||||
int fd;
|
int fd;
|
||||||
GError *error = NULL;
|
|
||||||
|
|
||||||
/* XXX -- use udev to find the DRM master device */
|
g_autofree gchar *path = get_primary_gpu_path (seat_id);
|
||||||
if (!get_device_info_from_path ("/dev/dri/card0", &major, &minor))
|
if (!path)
|
||||||
{
|
{
|
||||||
g_warning ("Could not stat /dev/dri/card0: %m");
|
g_set_error (error,
|
||||||
|
G_IO_ERROR,
|
||||||
|
G_IO_ERROR_NOT_FOUND,
|
||||||
|
"could not find drm kms device");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!take_device (session_proxy, major, minor, &fd, NULL, &error))
|
if (!get_device_info_from_path (path, &major, &minor))
|
||||||
{
|
{
|
||||||
g_warning ("Could not open DRM device: %s\n", error->message);
|
g_set_error (error,
|
||||||
g_error_free (error);
|
G_IO_ERROR,
|
||||||
|
G_IO_ERROR_NOT_FOUND,
|
||||||
|
"Could not get device info for path %s: %m", path);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!take_device (session_proxy, major, minor, &fd, NULL, error))
|
||||||
|
{
|
||||||
|
g_prefix_error (error, "Could not open DRM device: ");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -304,28 +395,72 @@ get_kms_fd (Login1Session *session_proxy,
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
MetaLauncher *
|
static gchar *
|
||||||
meta_launcher_new (void)
|
get_seat_id (GError **error)
|
||||||
{
|
{
|
||||||
MetaLauncher *self;
|
g_autofree char *session_id = NULL;
|
||||||
Login1Session *session_proxy;
|
char *seat_id = NULL;
|
||||||
GError *error = NULL;
|
int r;
|
||||||
int kms_fd;
|
|
||||||
|
|
||||||
session_proxy = get_session_proxy (NULL);
|
r = sd_pid_get_session (0, &session_id);
|
||||||
if (!login1_session_call_take_control_sync (session_proxy, FALSE, NULL, &error))
|
if (r < 0)
|
||||||
{
|
{
|
||||||
g_warning ("Could not take control: %s", error->message);
|
g_set_error (error,
|
||||||
g_error_free (error);
|
G_IO_ERROR,
|
||||||
|
G_IO_ERROR_NOT_FOUND,
|
||||||
|
"Could not get session for PID: %s", g_strerror (-r));
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!get_kms_fd (session_proxy, &kms_fd))
|
r = sd_session_get_seat (session_id, &seat_id);
|
||||||
|
if (r < 0)
|
||||||
|
{
|
||||||
|
g_set_error (error,
|
||||||
|
G_IO_ERROR,
|
||||||
|
G_IO_ERROR_NOT_FOUND,
|
||||||
|
"Could not get seat for session: %s", g_strerror (-r));
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return seat_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
MetaLauncher *
|
||||||
|
meta_launcher_new (GError **error)
|
||||||
|
{
|
||||||
|
MetaLauncher *self = NULL;
|
||||||
|
g_autoptr (Login1Session) session_proxy = NULL;
|
||||||
|
g_autoptr (Login1Seat) seat_proxy = NULL;
|
||||||
|
g_autofree char *seat_id = NULL;
|
||||||
|
gboolean have_control = FALSE;
|
||||||
|
int kms_fd;
|
||||||
|
|
||||||
|
session_proxy = get_session_proxy (NULL, error);
|
||||||
|
if (!session_proxy)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
if (!login1_session_call_take_control_sync (session_proxy, FALSE, NULL, error))
|
||||||
|
{
|
||||||
|
g_prefix_error (error, "Could not take control: ");
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
have_control = TRUE;
|
||||||
|
|
||||||
|
seat_id = get_seat_id (error);
|
||||||
|
if (!seat_id)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
seat_proxy = get_seat_proxy (NULL, error);
|
||||||
|
if (!seat_proxy)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
if (!get_kms_fd (session_proxy, seat_id, &kms_fd, error))
|
||||||
|
goto fail;
|
||||||
|
|
||||||
self = g_slice_new0 (MetaLauncher);
|
self = g_slice_new0 (MetaLauncher);
|
||||||
self->session_proxy = session_proxy;
|
self->session_proxy = g_object_ref (session_proxy);
|
||||||
self->seat_proxy = get_seat_proxy (NULL);
|
self->seat_proxy = g_object_ref (seat_proxy);
|
||||||
|
|
||||||
self->session_active = TRUE;
|
self->session_active = TRUE;
|
||||||
|
|
||||||
@@ -335,8 +470,12 @@ meta_launcher_new (void)
|
|||||||
self);
|
self);
|
||||||
|
|
||||||
g_signal_connect (self->session_proxy, "notify::active", G_CALLBACK (on_active_changed), self);
|
g_signal_connect (self->session_proxy, "notify::active", G_CALLBACK (on_active_changed), self);
|
||||||
|
|
||||||
return self;
|
return self;
|
||||||
|
|
||||||
|
fail:
|
||||||
|
if (have_control)
|
||||||
|
login1_session_call_release_control_sync (session_proxy, NULL, NULL);
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
|
|
||||||
typedef struct _MetaLauncher MetaLauncher;
|
typedef struct _MetaLauncher MetaLauncher;
|
||||||
|
|
||||||
MetaLauncher *meta_launcher_new (void);
|
MetaLauncher *meta_launcher_new (GError **error);
|
||||||
void meta_launcher_free (MetaLauncher *self);
|
void meta_launcher_free (MetaLauncher *self);
|
||||||
|
|
||||||
gboolean meta_launcher_activate_session (MetaLauncher *self,
|
gboolean meta_launcher_activate_session (MetaLauncher *self,
|
||||||
|
|||||||
@@ -42,6 +42,8 @@
|
|||||||
|
|
||||||
#include <gudev/gudev.h>
|
#include <gudev/gudev.h>
|
||||||
|
|
||||||
|
#define ALL_TRANSFORMS (META_MONITOR_TRANSFORM_FLIPPED_270 + 1)
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
drmModeConnector *connector;
|
drmModeConnector *connector;
|
||||||
|
|
||||||
@@ -55,8 +57,22 @@ typedef struct {
|
|||||||
|
|
||||||
uint32_t dpms_prop_id;
|
uint32_t dpms_prop_id;
|
||||||
uint32_t edid_blob_id;
|
uint32_t edid_blob_id;
|
||||||
|
uint32_t tile_blob_id;
|
||||||
|
|
||||||
|
int suggested_x;
|
||||||
|
int suggested_y;
|
||||||
|
uint32_t hotplug_mode_update;
|
||||||
} MetaOutputKms;
|
} MetaOutputKms;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32_t underscan_prop_id;
|
||||||
|
uint32_t underscan_hborder_prop_id;
|
||||||
|
uint32_t underscan_vborder_prop_id;
|
||||||
|
uint32_t primary_plane_id;
|
||||||
|
uint32_t rotation_prop_id;
|
||||||
|
uint32_t rotation_map[ALL_TRANSFORMS];
|
||||||
|
} MetaCRTCKms;
|
||||||
|
|
||||||
struct _MetaMonitorManagerKms
|
struct _MetaMonitorManagerKms
|
||||||
{
|
{
|
||||||
MetaMonitorManager parent_instance;
|
MetaMonitorManager parent_instance;
|
||||||
@@ -66,12 +82,9 @@ struct _MetaMonitorManagerKms
|
|||||||
drmModeConnector **connectors;
|
drmModeConnector **connectors;
|
||||||
unsigned int n_connectors;
|
unsigned int n_connectors;
|
||||||
|
|
||||||
drmModeEncoder **encoders;
|
|
||||||
unsigned int n_encoders;
|
|
||||||
|
|
||||||
drmModeEncoder *current_encoder;
|
|
||||||
|
|
||||||
GUdevClient *udev;
|
GUdevClient *udev;
|
||||||
|
|
||||||
|
GSettings *desktop_settings;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _MetaMonitorManagerKmsClass
|
struct _MetaMonitorManagerKmsClass
|
||||||
@@ -86,12 +99,9 @@ free_resources (MetaMonitorManagerKms *manager_kms)
|
|||||||
{
|
{
|
||||||
unsigned i;
|
unsigned i;
|
||||||
|
|
||||||
for (i = 0; i < manager_kms->n_encoders; i++)
|
|
||||||
drmModeFreeEncoder (manager_kms->encoders[i]);
|
|
||||||
for (i = 0; i < manager_kms->n_connectors; i++)
|
for (i = 0; i < manager_kms->n_connectors; i++)
|
||||||
drmModeFreeConnector (manager_kms->connectors[i]);
|
drmModeFreeConnector (manager_kms->connectors[i]);
|
||||||
|
|
||||||
g_free (manager_kms->encoders);
|
|
||||||
g_free (manager_kms->connectors);
|
g_free (manager_kms->connectors);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -110,7 +120,7 @@ make_output_name (drmModeConnector *connector)
|
|||||||
static const char * const connector_type_names[] = {
|
static const char * const connector_type_names[] = {
|
||||||
"unknown", "VGA", "DVII", "DVID", "DVID", "Composite",
|
"unknown", "VGA", "DVII", "DVID", "DVID", "Composite",
|
||||||
"SVIDEO", "LVDS", "Component", "9PinDIN", "DisplayPort",
|
"SVIDEO", "LVDS", "Component", "9PinDIN", "DisplayPort",
|
||||||
"HDMIA", "HDMIB", "TV", "eDP"
|
"HDMIA", "HDMIB", "TV", "eDP", "Virtual", "DSI"
|
||||||
};
|
};
|
||||||
const char *connector_type_name;
|
const char *connector_type_name;
|
||||||
|
|
||||||
@@ -143,6 +153,12 @@ meta_monitor_mode_destroy_notify (MetaMonitorMode *output)
|
|||||||
g_slice_free (drmModeModeInfo, output->driver_private);
|
g_slice_free (drmModeModeInfo, output->driver_private);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_crtc_destroy_notify (MetaCRTC *crtc)
|
||||||
|
{
|
||||||
|
g_free (crtc->driver_private);
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
drm_mode_equal (gconstpointer one,
|
drm_mode_equal (gconstpointer one,
|
||||||
gconstpointer two)
|
gconstpointer two)
|
||||||
@@ -187,24 +203,67 @@ drm_mode_hash (gconstpointer ptr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
find_properties (MetaMonitorManagerKms *manager_kms,
|
find_connector_properties (MetaMonitorManagerKms *manager_kms,
|
||||||
MetaOutputKms *output_kms)
|
MetaOutputKms *output_kms)
|
||||||
{
|
{
|
||||||
drmModePropertyPtr prop;
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
output_kms->hotplug_mode_update = 0;
|
||||||
|
output_kms->suggested_x = -1;
|
||||||
|
output_kms->suggested_y = -1;
|
||||||
for (i = 0; i < output_kms->connector->count_props; i++)
|
for (i = 0; i < output_kms->connector->count_props; i++)
|
||||||
{
|
{
|
||||||
prop = drmModeGetProperty (manager_kms->fd, output_kms->connector->props[i]);
|
drmModePropertyPtr prop = drmModeGetProperty (manager_kms->fd, output_kms->connector->props[i]);
|
||||||
if (!prop)
|
if (!prop)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if ((prop->flags & DRM_MODE_PROP_ENUM) &&
|
if ((prop->flags & DRM_MODE_PROP_ENUM) && strcmp (prop->name, "DPMS") == 0)
|
||||||
strcmp(prop->name, "DPMS") == 0)
|
|
||||||
output_kms->dpms_prop_id = prop->prop_id;
|
output_kms->dpms_prop_id = prop->prop_id;
|
||||||
else if ((prop->flags & DRM_MODE_PROP_BLOB) &&
|
else if ((prop->flags & DRM_MODE_PROP_BLOB) && strcmp (prop->name, "EDID") == 0)
|
||||||
strcmp (prop->name, "EDID") == 0)
|
|
||||||
output_kms->edid_blob_id = output_kms->connector->prop_values[i];
|
output_kms->edid_blob_id = output_kms->connector->prop_values[i];
|
||||||
|
else if ((prop->flags & DRM_MODE_PROP_BLOB) &&
|
||||||
|
strcmp (prop->name, "TILE") == 0)
|
||||||
|
output_kms->tile_blob_id = output_kms->connector->prop_values[i];
|
||||||
|
else if ((prop->flags & DRM_MODE_PROP_RANGE) &&
|
||||||
|
strcmp (prop->name, "suggested X") == 0)
|
||||||
|
output_kms->suggested_x = output_kms->connector->prop_values[i];
|
||||||
|
else if ((prop->flags & DRM_MODE_PROP_RANGE) &&
|
||||||
|
strcmp (prop->name, "suggested Y") == 0)
|
||||||
|
output_kms->suggested_y = output_kms->connector->prop_values[i];
|
||||||
|
else if ((prop->flags & DRM_MODE_PROP_RANGE) &&
|
||||||
|
strcmp (prop->name, "hotplug_mode_update") == 0)
|
||||||
|
output_kms->hotplug_mode_update = output_kms->connector->prop_values[i];
|
||||||
|
|
||||||
|
drmModeFreeProperty (prop);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
find_crtc_properties (MetaMonitorManagerKms *manager_kms,
|
||||||
|
MetaCRTC *meta_crtc)
|
||||||
|
{
|
||||||
|
MetaCRTCKms *crtc_kms;
|
||||||
|
drmModeObjectPropertiesPtr props;
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
crtc_kms = meta_crtc->driver_private;
|
||||||
|
|
||||||
|
props = drmModeObjectGetProperties (manager_kms->fd, meta_crtc->crtc_id, DRM_MODE_OBJECT_CRTC);
|
||||||
|
if (!props)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (i = 0; i < props->count_props; i++)
|
||||||
|
{
|
||||||
|
drmModePropertyPtr prop = drmModeGetProperty (manager_kms->fd, props->props[i]);
|
||||||
|
if (!prop)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if ((prop->flags & DRM_MODE_PROP_ENUM) && strcmp (prop->name, "underscan") == 0)
|
||||||
|
crtc_kms->underscan_prop_id = prop->prop_id;
|
||||||
|
else if ((prop->flags & DRM_MODE_PROP_RANGE) && strcmp (prop->name, "underscan hborder") == 0)
|
||||||
|
crtc_kms->underscan_hborder_prop_id = prop->prop_id;
|
||||||
|
else if ((prop->flags & DRM_MODE_PROP_RANGE) && strcmp (prop->name, "underscan vborder") == 0)
|
||||||
|
crtc_kms->underscan_vborder_prop_id = prop->prop_id;
|
||||||
|
|
||||||
drmModeFreeProperty (prop);
|
drmModeFreeProperty (prop);
|
||||||
}
|
}
|
||||||
@@ -239,6 +298,47 @@ read_output_edid (MetaMonitorManagerKms *manager_kms,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
output_get_tile_info (MetaMonitorManagerKms *manager_kms,
|
||||||
|
MetaOutput *output)
|
||||||
|
{
|
||||||
|
MetaOutputKms *output_kms = output->driver_private;
|
||||||
|
drmModePropertyBlobPtr tile_blob = NULL;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (output_kms->tile_blob_id == 0)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
tile_blob = drmModeGetPropertyBlob (manager_kms->fd, output_kms->tile_blob_id);
|
||||||
|
if (!tile_blob)
|
||||||
|
{
|
||||||
|
meta_warning ("Failed to read TILE of output %s: %s\n", output->name, strerror(errno));
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tile_blob->length > 0)
|
||||||
|
{
|
||||||
|
ret = sscanf ((char *)tile_blob->data, "%d:%d:%d:%d:%d:%d:%d:%d",
|
||||||
|
&output->tile_info.group_id,
|
||||||
|
&output->tile_info.flags,
|
||||||
|
&output->tile_info.max_h_tiles,
|
||||||
|
&output->tile_info.max_v_tiles,
|
||||||
|
&output->tile_info.loc_h_tile,
|
||||||
|
&output->tile_info.loc_v_tile,
|
||||||
|
&output->tile_info.tile_w,
|
||||||
|
&output->tile_info.tile_h);
|
||||||
|
|
||||||
|
if (ret != 8)
|
||||||
|
return FALSE;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
drmModeFreePropertyBlob (tile_blob);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static MetaMonitorMode *
|
static MetaMonitorMode *
|
||||||
find_meta_mode (MetaMonitorManager *manager,
|
find_meta_mode (MetaMonitorManager *manager,
|
||||||
const drmModeModeInfo *drm_mode)
|
const drmModeModeInfo *drm_mode)
|
||||||
@@ -269,11 +369,208 @@ find_output_by_id (MetaOutput *outputs,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* The minimum resolution at which we turn on a window-scale of 2 */
|
||||||
|
#define HIDPI_LIMIT 192
|
||||||
|
|
||||||
|
/* The minimum screen height at which we turn on a window-scale of 2;
|
||||||
|
* below this there just isn't enough vertical real estate for GNOME
|
||||||
|
* apps to work, and it's better to just be tiny */
|
||||||
|
#define HIDPI_MIN_HEIGHT 1200
|
||||||
|
|
||||||
|
/* From http://en.wikipedia.org/wiki/4K_resolution#Resolutions_of_common_formats */
|
||||||
|
#define SMALLEST_4K_WIDTH 3656
|
||||||
|
|
||||||
|
/* Based on code from gnome-settings-daemon */
|
||||||
|
static int
|
||||||
|
compute_scale (MetaOutput *output)
|
||||||
|
{
|
||||||
|
int scale = 1;
|
||||||
|
|
||||||
|
if (!output->crtc)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
/* Scaling makes no sense */
|
||||||
|
if (output->crtc->rect.width < HIDPI_MIN_HEIGHT)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
/* 4K TV */
|
||||||
|
if (output->name != NULL && strstr(output->name, "HDMI") != NULL &&
|
||||||
|
output->crtc->rect.width >= SMALLEST_4K_WIDTH)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
/* Somebody encoded the aspect ratio (16/9 or 16/10)
|
||||||
|
* instead of the physical size */
|
||||||
|
if ((output->width_mm == 160 && output->height_mm == 90) ||
|
||||||
|
(output->width_mm == 160 && output->height_mm == 100) ||
|
||||||
|
(output->width_mm == 16 && output->height_mm == 9) ||
|
||||||
|
(output->width_mm == 16 && output->height_mm == 10))
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
if (output->width_mm > 0 && output->height_mm > 0)
|
||||||
|
{
|
||||||
|
double dpi_x, dpi_y;
|
||||||
|
dpi_x = (double)output->crtc->rect.width / (output->width_mm / 25.4);
|
||||||
|
dpi_y = (double)output->crtc->rect.height / (output->height_mm / 25.4);
|
||||||
|
/* We don't completely trust these values so both
|
||||||
|
must be high, and never pick higher ratio than
|
||||||
|
2 automatically */
|
||||||
|
if (dpi_x > HIDPI_LIMIT && dpi_y > HIDPI_LIMIT)
|
||||||
|
scale = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
|
return scale;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
get_output_scale (MetaMonitorManager *manager,
|
||||||
|
MetaOutput *output)
|
||||||
|
{
|
||||||
|
MetaMonitorManagerKms *manager_kms = META_MONITOR_MANAGER_KMS (manager);
|
||||||
|
int scale = g_settings_get_uint (manager_kms->desktop_settings, "scaling-factor");
|
||||||
|
if (scale > 0)
|
||||||
|
return scale;
|
||||||
|
else
|
||||||
|
return compute_scale (output);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
find_property_index (MetaMonitorManager *manager,
|
||||||
|
drmModeObjectPropertiesPtr props,
|
||||||
|
const gchar *prop_name,
|
||||||
|
drmModePropertyPtr *found)
|
||||||
|
{
|
||||||
|
MetaMonitorManagerKms *manager_kms = META_MONITOR_MANAGER_KMS (manager);
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
for (i = 0; i < props->count_props; i++)
|
||||||
|
{
|
||||||
|
drmModePropertyPtr prop;
|
||||||
|
|
||||||
|
prop = drmModeGetProperty (manager_kms->fd, props->props[i]);
|
||||||
|
if (!prop)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (strcmp (prop->name, prop_name) == 0)
|
||||||
|
{
|
||||||
|
*found = prop;
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
drmModeFreeProperty (prop);
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
parse_transforms (MetaMonitorManager *manager,
|
||||||
|
drmModePropertyPtr prop,
|
||||||
|
MetaCRTC *crtc)
|
||||||
|
{
|
||||||
|
MetaCRTCKms *crtc_kms = crtc->driver_private;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < prop->count_enums; i++)
|
||||||
|
{
|
||||||
|
int cur = -1;
|
||||||
|
|
||||||
|
if (strcmp (prop->enums[i].name, "rotate-0") == 0)
|
||||||
|
cur = META_MONITOR_TRANSFORM_NORMAL;
|
||||||
|
else if (strcmp (prop->enums[i].name, "rotate-90") == 0)
|
||||||
|
cur = META_MONITOR_TRANSFORM_90;
|
||||||
|
else if (strcmp (prop->enums[i].name, "rotate-180") == 0)
|
||||||
|
cur = META_MONITOR_TRANSFORM_180;
|
||||||
|
else if (strcmp (prop->enums[i].name, "rotate-270") == 0)
|
||||||
|
cur = META_MONITOR_TRANSFORM_270;
|
||||||
|
|
||||||
|
if (cur != -1)
|
||||||
|
{
|
||||||
|
crtc->all_transforms |= 1 << cur;
|
||||||
|
crtc_kms->rotation_map[cur] = 1 << prop->enums[i].value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
is_primary_plane (MetaMonitorManager *manager,
|
||||||
|
drmModeObjectPropertiesPtr props)
|
||||||
|
{
|
||||||
|
drmModePropertyPtr prop;
|
||||||
|
int idx;
|
||||||
|
|
||||||
|
idx = find_property_index (manager, props, "type", &prop);
|
||||||
|
if (idx < 0)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
drmModeFreeProperty (prop);
|
||||||
|
return props->prop_values[idx] == DRM_PLANE_TYPE_PRIMARY;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
init_crtc_rotations (MetaMonitorManager *manager,
|
||||||
|
MetaCRTC *crtc,
|
||||||
|
unsigned int idx)
|
||||||
|
{
|
||||||
|
MetaMonitorManagerKms *manager_kms = META_MONITOR_MANAGER_KMS (manager);
|
||||||
|
drmModeObjectPropertiesPtr props;
|
||||||
|
drmModePlaneRes *planes;
|
||||||
|
drmModePlane *drm_plane;
|
||||||
|
MetaCRTCKms *crtc_kms;
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
crtc_kms = crtc->driver_private;
|
||||||
|
|
||||||
|
planes = drmModeGetPlaneResources(manager_kms->fd);
|
||||||
|
if (planes == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (i = 0; i < planes->count_planes; i++)
|
||||||
|
{
|
||||||
|
drmModePropertyPtr prop;
|
||||||
|
|
||||||
|
drm_plane = drmModeGetPlane (manager_kms->fd, planes->planes[i]);
|
||||||
|
|
||||||
|
if (!drm_plane)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if ((drm_plane->possible_crtcs & (1 << idx)))
|
||||||
|
{
|
||||||
|
props = drmModeObjectGetProperties (manager_kms->fd,
|
||||||
|
drm_plane->plane_id,
|
||||||
|
DRM_MODE_OBJECT_PLANE);
|
||||||
|
|
||||||
|
if (props && is_primary_plane (manager, props))
|
||||||
|
{
|
||||||
|
int rotation_idx;
|
||||||
|
|
||||||
|
crtc_kms->primary_plane_id = drm_plane->plane_id;
|
||||||
|
rotation_idx = find_property_index (manager, props, "rotation", &prop);
|
||||||
|
|
||||||
|
if (rotation_idx >= 0)
|
||||||
|
{
|
||||||
|
crtc_kms->rotation_prop_id = props->props[rotation_idx];
|
||||||
|
parse_transforms (manager, prop, crtc);
|
||||||
|
drmModeFreeProperty (prop);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (props)
|
||||||
|
drmModeFreeObjectProperties (props);
|
||||||
|
}
|
||||||
|
|
||||||
|
drmModeFreePlane (drm_plane);
|
||||||
|
}
|
||||||
|
|
||||||
|
drmModeFreePlaneResources (planes);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_monitor_manager_kms_read_current (MetaMonitorManager *manager)
|
meta_monitor_manager_kms_read_current (MetaMonitorManager *manager)
|
||||||
{
|
{
|
||||||
MetaMonitorManagerKms *manager_kms = META_MONITOR_MANAGER_KMS (manager);
|
MetaMonitorManagerKms *manager_kms = META_MONITOR_MANAGER_KMS (manager);
|
||||||
drmModeRes *resources;
|
drmModeRes *resources;
|
||||||
|
drmModeEncoder **encoders;
|
||||||
GHashTable *modes;
|
GHashTable *modes;
|
||||||
GHashTableIter iter;
|
GHashTableIter iter;
|
||||||
drmModeModeInfo *mode;
|
drmModeModeInfo *mode;
|
||||||
@@ -309,7 +606,7 @@ meta_monitor_manager_kms_read_current (MetaMonitorManager *manager)
|
|||||||
connector = drmModeGetConnector (manager_kms->fd, resources->connectors[i]);
|
connector = drmModeGetConnector (manager_kms->fd, resources->connectors[i]);
|
||||||
manager_kms->connectors[i] = connector;
|
manager_kms->connectors[i] = connector;
|
||||||
|
|
||||||
if (connector->connection == DRM_MODE_CONNECTED)
|
if (connector && connector->connection == DRM_MODE_CONNECTED)
|
||||||
{
|
{
|
||||||
/* Collect all modes for this connector */
|
/* Collect all modes for this connector */
|
||||||
for (j = 0; j < (unsigned)connector->count_modes; j++)
|
for (j = 0; j < (unsigned)connector->count_modes; j++)
|
||||||
@@ -317,13 +614,9 @@ meta_monitor_manager_kms_read_current (MetaMonitorManager *manager)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
manager_kms->n_encoders = resources->count_encoders;
|
encoders = g_new (drmModeEncoder *, resources->count_encoders);
|
||||||
manager_kms->encoders = g_new (drmModeEncoder *, manager_kms->n_encoders);
|
for (i = 0; i < (unsigned)resources->count_encoders; i++)
|
||||||
for (i = 0; i < manager_kms->n_encoders; i++)
|
encoders[i] = drmModeGetEncoder (manager_kms->fd, resources->encoders[i]);
|
||||||
{
|
|
||||||
manager_kms->encoders[i] = drmModeGetEncoder (manager_kms->fd,
|
|
||||||
resources->encoders[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
manager->n_modes = g_hash_table_size (modes);
|
manager->n_modes = g_hash_table_size (modes);
|
||||||
manager->modes = g_new0 (MetaMonitorMode, manager->n_modes);
|
manager->modes = g_new0 (MetaMonitorMode, manager->n_modes);
|
||||||
@@ -339,8 +632,18 @@ meta_monitor_manager_kms_read_current (MetaMonitorManager *manager)
|
|||||||
meta_mode->name = g_strndup (mode->name, DRM_DISPLAY_MODE_LEN);
|
meta_mode->name = g_strndup (mode->name, DRM_DISPLAY_MODE_LEN);
|
||||||
meta_mode->width = mode->hdisplay;
|
meta_mode->width = mode->hdisplay;
|
||||||
meta_mode->height = mode->vdisplay;
|
meta_mode->height = mode->vdisplay;
|
||||||
meta_mode->refresh_rate = (1000 * mode->clock /
|
|
||||||
((float)mode->htotal * mode->vtotal));
|
/* Calculate refresh rate in milliHz first for extra precision. */
|
||||||
|
meta_mode->refresh_rate = (mode->clock * 1000000LL) / mode->htotal;
|
||||||
|
meta_mode->refresh_rate += (mode->vtotal / 2);
|
||||||
|
meta_mode->refresh_rate /= mode->vtotal;
|
||||||
|
if (mode->flags & DRM_MODE_FLAG_INTERLACE)
|
||||||
|
meta_mode->refresh_rate *= 2;
|
||||||
|
if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
|
||||||
|
meta_mode->refresh_rate /= 2;
|
||||||
|
if (mode->vscan > 1)
|
||||||
|
meta_mode->refresh_rate /= mode->vscan;
|
||||||
|
meta_mode->refresh_rate /= 1000.0;
|
||||||
|
|
||||||
meta_mode->driver_private = g_slice_dup (drmModeModeInfo, mode);
|
meta_mode->driver_private = g_slice_dup (drmModeModeInfo, mode);
|
||||||
meta_mode->driver_notify = (GDestroyNotify)meta_monitor_mode_destroy_notify;
|
meta_mode->driver_notify = (GDestroyNotify)meta_monitor_mode_destroy_notify;
|
||||||
@@ -386,6 +689,11 @@ meta_monitor_manager_kms_read_current (MetaMonitorManager *manager)
|
|||||||
height = MAX (height, meta_crtc->rect.y + meta_crtc->rect.height);
|
height = MAX (height, meta_crtc->rect.y + meta_crtc->rect.height);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
meta_crtc->driver_private = g_new0 (MetaCRTCKms, 1);
|
||||||
|
meta_crtc->driver_notify = (GDestroyNotify) meta_crtc_destroy_notify;
|
||||||
|
find_crtc_properties (manager_kms, meta_crtc);
|
||||||
|
init_crtc_rotations (manager, meta_crtc, i);
|
||||||
|
|
||||||
drmModeFreeCrtc (crtc);
|
drmModeFreeCrtc (crtc);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -407,7 +715,7 @@ meta_monitor_manager_kms_read_current (MetaMonitorManager *manager)
|
|||||||
connector = manager_kms->connectors[i];
|
connector = manager_kms->connectors[i];
|
||||||
meta_output = &manager->outputs[n_actual_outputs];
|
meta_output = &manager->outputs[n_actual_outputs];
|
||||||
|
|
||||||
if (connector->connection == DRM_MODE_CONNECTED)
|
if (connector && connector->connection == DRM_MODE_CONNECTED)
|
||||||
{
|
{
|
||||||
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;
|
||||||
@@ -416,8 +724,6 @@ meta_monitor_manager_kms_read_current (MetaMonitorManager *manager)
|
|||||||
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;
|
||||||
meta_output->suggested_x = -1;
|
|
||||||
meta_output->suggested_y = -1;
|
|
||||||
|
|
||||||
switch (connector->subpixel)
|
switch (connector->subpixel)
|
||||||
{
|
{
|
||||||
@@ -442,10 +748,16 @@ meta_monitor_manager_kms_read_current (MetaMonitorManager *manager)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
meta_output->preferred_mode = NULL;
|
||||||
meta_output->n_modes = connector->count_modes;
|
meta_output->n_modes = connector->count_modes;
|
||||||
meta_output->modes = g_new0 (MetaMonitorMode *, meta_output->n_modes);
|
meta_output->modes = g_new0 (MetaMonitorMode *, meta_output->n_modes);
|
||||||
for (j = 0; j < meta_output->n_modes; j++)
|
for (j = 0; j < meta_output->n_modes; j++) {
|
||||||
meta_output->modes[j] = find_meta_mode (manager, &connector->modes[j]);
|
meta_output->modes[j] = find_meta_mode (manager, &connector->modes[j]);
|
||||||
|
if (connector->modes[j].type & DRM_MODE_TYPE_PREFERRED)
|
||||||
|
meta_output->preferred_mode = meta_output->modes[j];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!meta_output->preferred_mode)
|
||||||
meta_output->preferred_mode = meta_output->modes[0];
|
meta_output->preferred_mode = meta_output->modes[0];
|
||||||
|
|
||||||
output_kms->connector = connector;
|
output_kms->connector = connector;
|
||||||
@@ -456,6 +768,8 @@ meta_monitor_manager_kms_read_current (MetaMonitorManager *manager)
|
|||||||
for (j = 0; j < output_kms->n_encoders; j++)
|
for (j = 0; j < output_kms->n_encoders; j++)
|
||||||
{
|
{
|
||||||
output_kms->encoders[j] = drmModeGetEncoder (manager_kms->fd, connector->encoders[j]);
|
output_kms->encoders[j] = drmModeGetEncoder (manager_kms->fd, connector->encoders[j]);
|
||||||
|
if (!output_kms->encoders[j])
|
||||||
|
continue;
|
||||||
|
|
||||||
/* We only list CRTCs as supported if they are supported by all encoders
|
/* We only list CRTCs as supported if they are supported by all encoders
|
||||||
for this connectors.
|
for this connectors.
|
||||||
@@ -509,18 +823,22 @@ meta_monitor_manager_kms_read_current (MetaMonitorManager *manager)
|
|||||||
meta_output->is_presentation = FALSE;
|
meta_output->is_presentation = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
find_properties (manager_kms, output_kms);
|
find_connector_properties (manager_kms, output_kms);
|
||||||
|
meta_output->suggested_x = output_kms->suggested_x;
|
||||||
|
meta_output->suggested_y = output_kms->suggested_y;
|
||||||
|
meta_output->hotplug_mode_update = output_kms->hotplug_mode_update;
|
||||||
|
|
||||||
edid = read_output_edid (manager_kms, meta_output);
|
edid = read_output_edid (manager_kms, meta_output);
|
||||||
if (edid)
|
|
||||||
{
|
|
||||||
meta_output_parse_edid (meta_output, edid);
|
meta_output_parse_edid (meta_output, edid);
|
||||||
g_bytes_unref (edid);
|
g_bytes_unref (edid);
|
||||||
}
|
|
||||||
|
|
||||||
/* MetaConnectorType matches DRM's connector types */
|
/* MetaConnectorType matches DRM's connector types */
|
||||||
meta_output->connector_type = (MetaConnectorType) connector->connector_type;
|
meta_output->connector_type = (MetaConnectorType) connector->connector_type;
|
||||||
|
|
||||||
|
meta_output->scale = get_output_scale (manager, meta_output);
|
||||||
|
|
||||||
|
output_get_tile_info (manager_kms, meta_output);
|
||||||
|
|
||||||
/* FIXME: backlight is a very driver specific thing unfortunately,
|
/* FIXME: backlight is a very driver specific thing unfortunately,
|
||||||
every DDX does its own thing, and the dumb KMS API does not include it.
|
every DDX does its own thing, and the dumb KMS API does not include it.
|
||||||
|
|
||||||
@@ -562,9 +880,10 @@ meta_monitor_manager_kms_read_current (MetaMonitorManager *manager)
|
|||||||
|
|
||||||
for (j = 0; j < output_kms->n_encoders; j++)
|
for (j = 0; j < output_kms->n_encoders; j++)
|
||||||
{
|
{
|
||||||
for (k = 0; k < manager_kms->n_encoders; k++)
|
for (k = 0; k < (unsigned)resources->count_encoders; k++)
|
||||||
{
|
{
|
||||||
if (output_kms->encoders[j]->encoder_id == manager_kms->encoders[k]->encoder_id)
|
if (output_kms->encoders[j] && encoders[k] &&
|
||||||
|
output_kms->encoders[j]->encoder_id == encoders[k]->encoder_id)
|
||||||
{
|
{
|
||||||
output_kms->encoder_mask |= (1 << k);
|
output_kms->encoder_mask |= (1 << k);
|
||||||
break;
|
break;
|
||||||
@@ -611,6 +930,10 @@ meta_monitor_manager_kms_read_current (MetaMonitorManager *manager)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < (unsigned)resources->count_encoders; i++)
|
||||||
|
drmModeFreeEncoder (encoders[i]);
|
||||||
|
g_free (encoders);
|
||||||
|
|
||||||
drmModeFreeResources (resources);
|
drmModeFreeResources (resources);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -628,6 +951,9 @@ meta_monitor_manager_kms_set_power_save_mode (MetaMonitorManager *manager,
|
|||||||
MetaPowerSave mode)
|
MetaPowerSave mode)
|
||||||
{
|
{
|
||||||
MetaMonitorManagerKms *manager_kms = META_MONITOR_MANAGER_KMS (manager);
|
MetaMonitorManagerKms *manager_kms = META_MONITOR_MANAGER_KMS (manager);
|
||||||
|
ClutterBackend *backend;
|
||||||
|
CoglContext *cogl_context;
|
||||||
|
CoglDisplay *cogl_display;
|
||||||
uint64_t state;
|
uint64_t state;
|
||||||
unsigned i;
|
unsigned i;
|
||||||
|
|
||||||
@@ -658,7 +984,8 @@ 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->winsys_id,
|
int ok = drmModeObjectSetProperty (manager_kms->fd, meta_output->winsys_id,
|
||||||
|
DRM_MODE_OBJECT_CONNECTOR,
|
||||||
output_kms->dpms_prop_id, state);
|
output_kms->dpms_prop_id, state);
|
||||||
|
|
||||||
if (ok < 0)
|
if (ok < 0)
|
||||||
@@ -666,6 +993,14 @@ meta_monitor_manager_kms_set_power_save_mode (MetaMonitorManager *manager,
|
|||||||
meta_output->name, strerror (errno));
|
meta_output->name, strerror (errno));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
backend = clutter_get_default_backend ();
|
||||||
|
cogl_context = clutter_backend_get_cogl_context (backend);
|
||||||
|
cogl_display = cogl_context_get_display (cogl_context);
|
||||||
|
|
||||||
|
for (i = 0; i < manager->n_crtcs; i++)
|
||||||
|
cogl_kms_display_set_ignore_crtc (cogl_display, manager->crtcs[i].crtc_id,
|
||||||
|
mode != META_POWER_SAVE_ON);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -675,6 +1010,48 @@ crtc_free (CoglKmsCrtc *crtc)
|
|||||||
g_slice_free (CoglKmsCrtc, crtc);
|
g_slice_free (CoglKmsCrtc, crtc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_underscan (MetaMonitorManagerKms *manager_kms,
|
||||||
|
MetaOutput *output)
|
||||||
|
{
|
||||||
|
if (!output->crtc)
|
||||||
|
return;
|
||||||
|
|
||||||
|
MetaCRTC *crtc = output->crtc;
|
||||||
|
MetaCRTCKms *crtc_kms = crtc->driver_private;
|
||||||
|
if (!crtc_kms->underscan_prop_id)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (output->is_underscanning)
|
||||||
|
{
|
||||||
|
drmModeObjectSetProperty (manager_kms->fd, crtc->crtc_id,
|
||||||
|
DRM_MODE_OBJECT_CRTC,
|
||||||
|
crtc_kms->underscan_prop_id, (uint64_t) 1);
|
||||||
|
|
||||||
|
if (crtc_kms->underscan_hborder_prop_id)
|
||||||
|
{
|
||||||
|
uint64_t value = crtc->current_mode->width * 0.05;
|
||||||
|
drmModeObjectSetProperty (manager_kms->fd, crtc->crtc_id,
|
||||||
|
DRM_MODE_OBJECT_CRTC,
|
||||||
|
crtc_kms->underscan_hborder_prop_id, value);
|
||||||
|
}
|
||||||
|
if (crtc_kms->underscan_vborder_prop_id)
|
||||||
|
{
|
||||||
|
uint64_t value = crtc->current_mode->height * 0.05;
|
||||||
|
drmModeObjectSetProperty (manager_kms->fd, crtc->crtc_id,
|
||||||
|
DRM_MODE_OBJECT_CRTC,
|
||||||
|
crtc_kms->underscan_vborder_prop_id, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
drmModeObjectSetProperty (manager_kms->fd, crtc->crtc_id,
|
||||||
|
DRM_MODE_OBJECT_CRTC,
|
||||||
|
crtc_kms->underscan_prop_id, (uint64_t) 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_monitor_manager_kms_apply_configuration (MetaMonitorManager *manager,
|
meta_monitor_manager_kms_apply_configuration (MetaMonitorManager *manager,
|
||||||
MetaCRTCInfo **crtcs,
|
MetaCRTCInfo **crtcs,
|
||||||
@@ -682,6 +1059,7 @@ meta_monitor_manager_kms_apply_configuration (MetaMonitorManager *manager,
|
|||||||
MetaOutputInfo **outputs,
|
MetaOutputInfo **outputs,
|
||||||
unsigned int n_outputs)
|
unsigned int n_outputs)
|
||||||
{
|
{
|
||||||
|
MetaMonitorManagerKms *manager_kms = META_MONITOR_MANAGER_KMS (manager);
|
||||||
ClutterBackend *backend;
|
ClutterBackend *backend;
|
||||||
CoglContext *cogl_context;
|
CoglContext *cogl_context;
|
||||||
CoglDisplay *cogl_display;
|
CoglDisplay *cogl_display;
|
||||||
@@ -697,6 +1075,7 @@ meta_monitor_manager_kms_apply_configuration (MetaMonitorManager *manager,
|
|||||||
{
|
{
|
||||||
MetaCRTCInfo *crtc_info = crtcs[i];
|
MetaCRTCInfo *crtc_info = crtcs[i];
|
||||||
MetaCRTC *crtc = crtc_info->crtc;
|
MetaCRTC *crtc = crtc_info->crtc;
|
||||||
|
MetaCRTCKms *crtc_kms = crtc->driver_private;
|
||||||
CoglKmsCrtc *cogl_crtc;
|
CoglKmsCrtc *cogl_crtc;
|
||||||
|
|
||||||
crtc->is_dirty = TRUE;
|
crtc->is_dirty = TRUE;
|
||||||
@@ -769,6 +1148,13 @@ meta_monitor_manager_kms_apply_configuration (MetaMonitorManager *manager,
|
|||||||
crtc->current_mode = mode;
|
crtc->current_mode = mode;
|
||||||
crtc->transform = crtc_info->transform;
|
crtc->transform = crtc_info->transform;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (crtc->all_transforms & (1 << crtc->transform))
|
||||||
|
drmModeObjectSetProperty (manager_kms->fd,
|
||||||
|
crtc_kms->primary_plane_id,
|
||||||
|
DRM_MODE_OBJECT_PLANE,
|
||||||
|
crtc_kms->rotation_prop_id,
|
||||||
|
crtc_kms->rotation_map[crtc->transform]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Disable CRTCs not mentioned in the list (they have is_dirty == FALSE,
|
/* Disable CRTCs not mentioned in the list (they have is_dirty == FALSE,
|
||||||
@@ -827,6 +1213,9 @@ meta_monitor_manager_kms_apply_configuration (MetaMonitorManager *manager,
|
|||||||
|
|
||||||
output->is_primary = output_info->is_primary;
|
output->is_primary = output_info->is_primary;
|
||||||
output->is_presentation = output_info->is_presentation;
|
output->is_presentation = output_info->is_presentation;
|
||||||
|
output->is_underscanning = output_info->is_underscanning;
|
||||||
|
|
||||||
|
set_underscan (manager_kms, output);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Disable outputs not mentioned in the list */
|
/* Disable outputs not mentioned in the list */
|
||||||
@@ -918,10 +1307,14 @@ meta_monitor_manager_kms_init (MetaMonitorManagerKms *manager_kms)
|
|||||||
|
|
||||||
manager_kms->fd = cogl_kms_renderer_get_kms_fd (cogl_renderer);
|
manager_kms->fd = cogl_kms_renderer_get_kms_fd (cogl_renderer);
|
||||||
|
|
||||||
|
drmSetClientCap (manager_kms->fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1);
|
||||||
|
|
||||||
const char *subsystems[2] = { "drm", NULL };
|
const char *subsystems[2] = { "drm", NULL };
|
||||||
manager_kms->udev = g_udev_client_new (subsystems);
|
manager_kms->udev = g_udev_client_new (subsystems);
|
||||||
g_signal_connect (manager_kms->udev, "uevent",
|
g_signal_connect (manager_kms->udev, "uevent",
|
||||||
G_CALLBACK (on_uevent), manager_kms);
|
G_CALLBACK (on_uevent), manager_kms);
|
||||||
|
|
||||||
|
manager_kms->desktop_settings = g_settings_new ("org.gnome.desktop.interface");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -930,6 +1323,7 @@ meta_monitor_manager_kms_dispose (GObject *object)
|
|||||||
MetaMonitorManagerKms *manager_kms = META_MONITOR_MANAGER_KMS (object);
|
MetaMonitorManagerKms *manager_kms = META_MONITOR_MANAGER_KMS (object);
|
||||||
|
|
||||||
g_clear_object (&manager_kms->udev);
|
g_clear_object (&manager_kms->udev);
|
||||||
|
g_clear_object (&manager_kms->desktop_settings);
|
||||||
|
|
||||||
G_OBJECT_CLASS (meta_monitor_manager_kms_parent_class)->dispose (object);
|
G_OBJECT_CLASS (meta_monitor_manager_kms_parent_class)->dispose (object);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
#ifndef META_MONITOR_MANAGER_KMS_H
|
#ifndef META_MONITOR_MANAGER_KMS_H
|
||||||
#define META_MONITOR_MANAGER_KMS_H
|
#define META_MONITOR_MANAGER_KMS_H
|
||||||
|
|
||||||
#include "meta-monitor-manager.h"
|
#include "meta-monitor-manager-private.h"
|
||||||
|
|
||||||
#define META_TYPE_MONITOR_MANAGER_KMS (meta_monitor_manager_kms_get_type ())
|
#define META_TYPE_MONITOR_MANAGER_KMS (meta_monitor_manager_kms_get_type ())
|
||||||
#define META_MONITOR_MANAGER_KMS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_MONITOR_MANAGER_KMS, MetaMonitorManagerKms))
|
#define META_MONITOR_MANAGER_KMS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_MONITOR_MANAGER_KMS, MetaMonitorManagerKms))
|
||||||
|
|||||||
@@ -40,12 +40,24 @@
|
|||||||
#include "meta-idle-monitor-xsync.h"
|
#include "meta-idle-monitor-xsync.h"
|
||||||
#include "meta-monitor-manager-xrandr.h"
|
#include "meta-monitor-manager-xrandr.h"
|
||||||
#include "backends/meta-monitor-manager-dummy.h"
|
#include "backends/meta-monitor-manager-dummy.h"
|
||||||
|
#include "backends/x11/nested/meta-cursor-renderer-x11-nested.h"
|
||||||
#include "meta-cursor-renderer-x11.h"
|
#include "meta-cursor-renderer-x11.h"
|
||||||
|
#ifdef HAVE_WAYLAND
|
||||||
|
#include "wayland/meta-wayland.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <meta/util.h>
|
#include <meta/util.h>
|
||||||
#include "display-private.h"
|
#include "display-private.h"
|
||||||
#include "compositor/compositor-private.h"
|
#include "compositor/compositor-private.h"
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
/* We're a traditional CM running under the host. */
|
||||||
|
META_BACKEND_X11_MODE_COMPOSITOR,
|
||||||
|
|
||||||
|
/* We're a nested X11 client */
|
||||||
|
META_BACKEND_X11_MODE_NESTED,
|
||||||
|
} MetaBackendX11Mode;
|
||||||
|
|
||||||
struct _MetaBackendX11Private
|
struct _MetaBackendX11Private
|
||||||
{
|
{
|
||||||
/* The host X11 display */
|
/* The host X11 display */
|
||||||
@@ -53,6 +65,8 @@ struct _MetaBackendX11Private
|
|||||||
xcb_connection_t *xcb;
|
xcb_connection_t *xcb;
|
||||||
GSource *source;
|
GSource *source;
|
||||||
|
|
||||||
|
MetaBackendX11Mode mode;
|
||||||
|
|
||||||
int xsync_event_base;
|
int xsync_event_base;
|
||||||
int xsync_error_base;
|
int xsync_error_base;
|
||||||
|
|
||||||
@@ -68,6 +82,7 @@ struct _MetaBackendX11Private
|
|||||||
gchar *keymap_layouts;
|
gchar *keymap_layouts;
|
||||||
gchar *keymap_variants;
|
gchar *keymap_variants;
|
||||||
gchar *keymap_options;
|
gchar *keymap_options;
|
||||||
|
int locked_group;
|
||||||
};
|
};
|
||||||
typedef struct _MetaBackendX11Private MetaBackendX11Private;
|
typedef struct _MetaBackendX11Private MetaBackendX11Private;
|
||||||
|
|
||||||
@@ -102,7 +117,7 @@ translate_device_event (MetaBackendX11 *x11,
|
|||||||
/* This codepath should only ever trigger as an X11 compositor,
|
/* This codepath should only ever trigger as an X11 compositor,
|
||||||
* and never under nested, as under nested all backend events
|
* and never under nested, as under nested all backend events
|
||||||
* should be reported with respect to the stage window. */
|
* should be reported with respect to the stage window. */
|
||||||
g_assert (!meta_is_wayland_compositor ());
|
g_assert (priv->mode == META_BACKEND_X11_MODE_COMPOSITOR);
|
||||||
|
|
||||||
device_event->event = stage_window;
|
device_event->event = stage_window;
|
||||||
|
|
||||||
@@ -133,6 +148,8 @@ static void
|
|||||||
translate_crossing_event (MetaBackendX11 *x11,
|
translate_crossing_event (MetaBackendX11 *x11,
|
||||||
XIEnterEvent *enter_event)
|
XIEnterEvent *enter_event)
|
||||||
{
|
{
|
||||||
|
MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
|
||||||
|
|
||||||
/* Throw out weird events generated by grabs. */
|
/* Throw out weird events generated by grabs. */
|
||||||
if (enter_event->mode == XINotifyGrab ||
|
if (enter_event->mode == XINotifyGrab ||
|
||||||
enter_event->mode == XINotifyUngrab)
|
enter_event->mode == XINotifyUngrab)
|
||||||
@@ -141,7 +158,32 @@ translate_crossing_event (MetaBackendX11 *x11,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Window stage_window = meta_backend_x11_get_xwindow (x11);
|
||||||
|
if (enter_event->event != stage_window &&
|
||||||
|
priv->mode == META_BACKEND_X11_MODE_COMPOSITOR)
|
||||||
|
{
|
||||||
enter_event->event = meta_backend_x11_get_xwindow (x11);
|
enter_event->event = meta_backend_x11_get_xwindow (x11);
|
||||||
|
enter_event->event_x = enter_event->root_x;
|
||||||
|
enter_event->event_y = enter_event->root_y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
handle_device_change (MetaBackendX11 *x11,
|
||||||
|
XIEvent *event)
|
||||||
|
{
|
||||||
|
XIDeviceChangedEvent *device_changed;
|
||||||
|
|
||||||
|
if (event->evtype != XI_DeviceChanged)
|
||||||
|
return;
|
||||||
|
|
||||||
|
device_changed = (XIDeviceChangedEvent *) event;
|
||||||
|
|
||||||
|
if (device_changed->reason != XISlaveSwitch)
|
||||||
|
return;
|
||||||
|
|
||||||
|
meta_backend_update_last_device (META_BACKEND (x11),
|
||||||
|
device_changed->sourceid);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Clutter makes the assumption that there is only one X window
|
/* Clutter makes the assumption that there is only one X window
|
||||||
@@ -155,15 +197,8 @@ translate_crossing_event (MetaBackendX11 *x11,
|
|||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
maybe_spoof_event_as_stage_event (MetaBackendX11 *x11,
|
maybe_spoof_event_as_stage_event (MetaBackendX11 *x11,
|
||||||
XEvent *event)
|
XIEvent *input_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)
|
switch (input_event->evtype)
|
||||||
{
|
{
|
||||||
case XI_Motion:
|
case XI_Motion:
|
||||||
@@ -184,6 +219,23 @@ maybe_spoof_event_as_stage_event (MetaBackendX11 *x11,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
handle_input_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;
|
||||||
|
|
||||||
|
if (input_event->evtype == XI_DeviceChanged)
|
||||||
|
handle_device_change (x11, input_event);
|
||||||
|
else
|
||||||
|
maybe_spoof_event_as_stage_event (x11, input_event);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -222,20 +274,47 @@ handle_host_xevent (MetaBackend *backend,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (priv->mode == META_BACKEND_X11_MODE_NESTED && event->type == FocusIn)
|
||||||
|
{
|
||||||
|
#ifdef HAVE_WAYLAND
|
||||||
|
Window xwin = meta_backend_x11_get_xwindow(x11);
|
||||||
|
XEvent xev;
|
||||||
|
|
||||||
|
if (event->xfocus.window == xwin)
|
||||||
|
{
|
||||||
|
/* Since we've selected for KeymapStateMask, every FocusIn is followed immediately
|
||||||
|
* by a KeymapNotify event */
|
||||||
|
XMaskEvent(priv->xdisplay, KeymapStateMask, &xev);
|
||||||
|
MetaWaylandCompositor *compositor = meta_wayland_compositor_get_default ();
|
||||||
|
meta_wayland_compositor_update_key_state (compositor, xev.xkeymap.key_vector, 32, 8);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
g_assert_not_reached ();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
if (event->type == (priv->xsync_event_base + XSyncAlarmNotify))
|
if (event->type == (priv->xsync_event_base + XSyncAlarmNotify))
|
||||||
handle_alarm_notify (backend, event);
|
handle_alarm_notify (backend, event);
|
||||||
|
|
||||||
if (event->type == priv->xkb_event_base)
|
if (event->type == priv->xkb_event_base)
|
||||||
{
|
{
|
||||||
XkbAnyEvent *xkb_ev = (XkbAnyEvent *) event;
|
XkbEvent *xkb_ev = (XkbEvent *) event;
|
||||||
|
|
||||||
if (xkb_ev->device == META_VIRTUAL_CORE_KEYBOARD_ID)
|
if (xkb_ev->any.device == META_VIRTUAL_CORE_KEYBOARD_ID)
|
||||||
{
|
{
|
||||||
switch (xkb_ev->xkb_type)
|
switch (xkb_ev->any.xkb_type)
|
||||||
{
|
{
|
||||||
case XkbNewKeyboardNotify:
|
case XkbNewKeyboardNotify:
|
||||||
case XkbMapNotify:
|
case XkbMapNotify:
|
||||||
keymap_changed (backend);
|
keymap_changed (backend);
|
||||||
|
break;
|
||||||
|
case XkbStateNotify:
|
||||||
|
if (xkb_ev->state.changed & XkbGroupLockMask)
|
||||||
|
{
|
||||||
|
if (priv->locked_group != xkb_ev->state.locked_group)
|
||||||
|
XkbLockGroup (priv->xdisplay, XkbUseCoreKbd, priv->locked_group);
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -251,7 +330,7 @@ handle_host_xevent (MetaBackend *backend,
|
|||||||
|
|
||||||
if (!bypass_clutter)
|
if (!bypass_clutter)
|
||||||
{
|
{
|
||||||
maybe_spoof_event_as_stage_event (x11, event);
|
handle_input_event (x11, event);
|
||||||
clutter_x11_handle_event (event);
|
clutter_x11_handle_event (event);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -371,6 +450,7 @@ meta_backend_x11_post_init (MetaBackend *backend)
|
|||||||
MetaBackendX11 *x11 = META_BACKEND_X11 (backend);
|
MetaBackendX11 *x11 = META_BACKEND_X11 (backend);
|
||||||
MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
|
MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
|
||||||
int major, minor;
|
int major, minor;
|
||||||
|
gboolean has_xi = FALSE;
|
||||||
|
|
||||||
priv->xdisplay = clutter_x11_get_default_display ();
|
priv->xdisplay = clutter_x11_get_default_display ();
|
||||||
|
|
||||||
@@ -380,16 +460,13 @@ meta_backend_x11_post_init (MetaBackend *backend)
|
|||||||
!XSyncInitialize (priv->xdisplay, &major, &minor))
|
!XSyncInitialize (priv->xdisplay, &major, &minor))
|
||||||
meta_fatal ("Could not initialize XSync");
|
meta_fatal ("Could not initialize XSync");
|
||||||
|
|
||||||
{
|
|
||||||
int major = 2, minor = 3;
|
|
||||||
gboolean has_xi = FALSE;
|
|
||||||
|
|
||||||
if (XQueryExtension (priv->xdisplay,
|
if (XQueryExtension (priv->xdisplay,
|
||||||
"XInputExtension",
|
"XInputExtension",
|
||||||
&priv->xinput_opcode,
|
&priv->xinput_opcode,
|
||||||
&priv->xinput_error_base,
|
&priv->xinput_error_base,
|
||||||
&priv->xinput_event_base))
|
&priv->xinput_event_base))
|
||||||
{
|
{
|
||||||
|
major = 2; minor = 3;
|
||||||
if (XIQueryVersion (priv->xdisplay, &major, &minor) == Success)
|
if (XIQueryVersion (priv->xdisplay, &major, &minor) == Success)
|
||||||
{
|
{
|
||||||
int version = (major * 10) + minor;
|
int version = (major * 10) + minor;
|
||||||
@@ -400,8 +477,9 @@ meta_backend_x11_post_init (MetaBackend *backend)
|
|||||||
|
|
||||||
if (!has_xi)
|
if (!has_xi)
|
||||||
meta_fatal ("X server doesn't have the XInput extension, version 2.2 or newer\n");
|
meta_fatal ("X server doesn't have the XInput extension, version 2.2 or newer\n");
|
||||||
}
|
|
||||||
|
|
||||||
|
/* We only take the passive touch grab if we are a X11 compositor */
|
||||||
|
if (priv->mode == META_BACKEND_X11_MODE_COMPOSITOR)
|
||||||
take_touch_grab (backend);
|
take_touch_grab (backend);
|
||||||
|
|
||||||
priv->xcb = XGetXCBConnection (priv->xdisplay);
|
priv->xcb = XGetXCBConnection (priv->xdisplay);
|
||||||
@@ -433,19 +511,37 @@ meta_backend_x11_create_idle_monitor (MetaBackend *backend,
|
|||||||
static MetaMonitorManager *
|
static MetaMonitorManager *
|
||||||
meta_backend_x11_create_monitor_manager (MetaBackend *backend)
|
meta_backend_x11_create_monitor_manager (MetaBackend *backend)
|
||||||
{
|
{
|
||||||
/* If we're a Wayland compositor using the X11 backend,
|
MetaBackendX11 *x11 = META_BACKEND_X11 (backend);
|
||||||
* we're a nested configuration, so return the dummy
|
MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
|
||||||
* monitor setup. */
|
|
||||||
if (meta_is_wayland_compositor ())
|
|
||||||
return g_object_new (META_TYPE_MONITOR_MANAGER_DUMMY, NULL);
|
|
||||||
|
|
||||||
|
switch (priv->mode)
|
||||||
|
{
|
||||||
|
case META_BACKEND_X11_MODE_COMPOSITOR:
|
||||||
return g_object_new (META_TYPE_MONITOR_MANAGER_XRANDR, NULL);
|
return g_object_new (META_TYPE_MONITOR_MANAGER_XRANDR, NULL);
|
||||||
|
case META_BACKEND_X11_MODE_NESTED:
|
||||||
|
return g_object_new (META_TYPE_MONITOR_MANAGER_DUMMY, NULL);
|
||||||
|
default:
|
||||||
|
g_assert_not_reached ();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static MetaCursorRenderer *
|
static MetaCursorRenderer *
|
||||||
meta_backend_x11_create_cursor_renderer (MetaBackend *backend)
|
meta_backend_x11_create_cursor_renderer (MetaBackend *backend)
|
||||||
{
|
{
|
||||||
|
MetaBackendX11 *x11 = META_BACKEND_X11 (backend);
|
||||||
|
MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
|
||||||
|
|
||||||
|
switch (priv->mode)
|
||||||
|
{
|
||||||
|
case META_BACKEND_X11_MODE_COMPOSITOR:
|
||||||
return g_object_new (META_TYPE_CURSOR_RENDERER_X11, NULL);
|
return g_object_new (META_TYPE_CURSOR_RENDERER_X11, NULL);
|
||||||
|
break;
|
||||||
|
case META_BACKEND_X11_MODE_NESTED:
|
||||||
|
return g_object_new (META_TYPE_CURSOR_RENDERER_X11_NESTED, NULL);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
g_assert_not_reached ();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
@@ -673,6 +769,9 @@ meta_backend_x11_get_keymap (MetaBackend *backend)
|
|||||||
priv->xcb,
|
priv->xcb,
|
||||||
xkb_x11_get_core_keyboard_device_id (priv->xcb),
|
xkb_x11_get_core_keyboard_device_id (priv->xcb),
|
||||||
XKB_KEYMAP_COMPILE_NO_FLAGS);
|
XKB_KEYMAP_COMPILE_NO_FLAGS);
|
||||||
|
if (priv->keymap == NULL)
|
||||||
|
priv->keymap = xkb_keymap_new_from_names (context, NULL, XKB_KEYMAP_COMPILE_NO_FLAGS);
|
||||||
|
|
||||||
xkb_context_unref (context);
|
xkb_context_unref (context);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -686,6 +785,7 @@ meta_backend_x11_lock_layout_group (MetaBackend *backend,
|
|||||||
MetaBackendX11 *x11 = META_BACKEND_X11 (backend);
|
MetaBackendX11 *x11 = META_BACKEND_X11 (backend);
|
||||||
MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
|
MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
|
||||||
|
|
||||||
|
priv->locked_group = idx;
|
||||||
XkbLockGroup (priv->xdisplay, XkbUseCoreKbd, idx);
|
XkbLockGroup (priv->xdisplay, XkbUseCoreKbd, idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -693,7 +793,10 @@ static void
|
|||||||
meta_backend_x11_update_screen_size (MetaBackend *backend,
|
meta_backend_x11_update_screen_size (MetaBackend *backend,
|
||||||
int width, int height)
|
int width, int height)
|
||||||
{
|
{
|
||||||
if (meta_is_wayland_compositor ())
|
MetaBackendX11 *x11 = META_BACKEND_X11 (backend);
|
||||||
|
MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
|
||||||
|
|
||||||
|
if (priv->mode == META_BACKEND_X11_MODE_NESTED)
|
||||||
{
|
{
|
||||||
/* For a nested wayland session, we want to go through Clutter to update the
|
/* For a nested wayland session, we want to go through Clutter to update the
|
||||||
* toplevel window size, rather than doing it directly.
|
* toplevel window size, rather than doing it directly.
|
||||||
@@ -702,8 +805,6 @@ meta_backend_x11_update_screen_size (MetaBackend *backend,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
MetaBackendX11 *x11 = META_BACKEND_X11 (backend);
|
|
||||||
MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
|
|
||||||
Window xwin = meta_backend_x11_get_xwindow (x11);
|
Window xwin = meta_backend_x11_get_xwindow (x11);
|
||||||
XResizeWindow (priv->xdisplay, xwin, width, height);
|
XResizeWindow (priv->xdisplay, xwin, width, height);
|
||||||
}
|
}
|
||||||
@@ -727,10 +828,36 @@ meta_backend_x11_select_stage_events (MetaBackend *backend)
|
|||||||
XISetMask (mask.mask, XI_FocusIn);
|
XISetMask (mask.mask, XI_FocusIn);
|
||||||
XISetMask (mask.mask, XI_FocusOut);
|
XISetMask (mask.mask, XI_FocusOut);
|
||||||
XISetMask (mask.mask, XI_Motion);
|
XISetMask (mask.mask, XI_Motion);
|
||||||
XIClearMask (mask.mask, XI_TouchBegin);
|
|
||||||
XIClearMask (mask.mask, XI_TouchEnd);
|
if (priv->mode == META_BACKEND_X11_MODE_NESTED)
|
||||||
XIClearMask (mask.mask, XI_TouchUpdate);
|
{
|
||||||
|
/* When we're an X11 compositor, we can't take these events or else
|
||||||
|
* replaying events from our passive root window grab will cause
|
||||||
|
* them to come back to us.
|
||||||
|
*
|
||||||
|
* When we're a nested application, we want to behave like any other
|
||||||
|
* application, so select these events like normal apps do.
|
||||||
|
*/
|
||||||
|
XISetMask (mask.mask, XI_TouchBegin);
|
||||||
|
XISetMask (mask.mask, XI_TouchEnd);
|
||||||
|
XISetMask (mask.mask, XI_TouchUpdate);
|
||||||
|
}
|
||||||
|
|
||||||
XISelectEvents (priv->xdisplay, xwin, &mask, 1);
|
XISelectEvents (priv->xdisplay, xwin, &mask, 1);
|
||||||
|
|
||||||
|
if (priv->mode == META_BACKEND_X11_MODE_NESTED)
|
||||||
|
{
|
||||||
|
/* We have no way of tracking key changes when the stage doesn't have
|
||||||
|
* focus, so we select for KeymapStateMask so that we get a complete
|
||||||
|
* dump of the keyboard state in a KeymapNotify event that immediately
|
||||||
|
* follows each FocusIn (and EnterNotify, but we ignore that.)
|
||||||
|
*/
|
||||||
|
XWindowAttributes xwa;
|
||||||
|
|
||||||
|
XGetWindowAttributes(priv->xdisplay, xwin, &xwa);
|
||||||
|
XSelectInput(priv->xdisplay, xwin,
|
||||||
|
xwa.your_event_mask | FocusChangeMask | KeymapStateMask);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -755,8 +882,15 @@ meta_backend_x11_class_init (MetaBackendX11Class *klass)
|
|||||||
static void
|
static void
|
||||||
meta_backend_x11_init (MetaBackendX11 *x11)
|
meta_backend_x11_init (MetaBackendX11 *x11)
|
||||||
{
|
{
|
||||||
|
MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
|
||||||
|
|
||||||
/* We do X11 event retrieval ourselves */
|
/* We do X11 event retrieval ourselves */
|
||||||
clutter_x11_disable_event_retrieval ();
|
clutter_x11_disable_event_retrieval ();
|
||||||
|
|
||||||
|
if (meta_is_wayland_compositor ())
|
||||||
|
priv->mode = META_BACKEND_X11_MODE_NESTED;
|
||||||
|
else
|
||||||
|
priv->mode = META_BACKEND_X11_MODE_COMPOSITOR;
|
||||||
}
|
}
|
||||||
|
|
||||||
Display *
|
Display *
|
||||||
|
|||||||
@@ -107,6 +107,7 @@ meta_barrier_impl_x11_new (MetaBarrier *barrier)
|
|||||||
MetaDisplay *display = barrier->priv->display;
|
MetaDisplay *display = barrier->priv->display;
|
||||||
Display *dpy;
|
Display *dpy;
|
||||||
Window root;
|
Window root;
|
||||||
|
unsigned int allowed_motion_dirs;
|
||||||
|
|
||||||
if (display == NULL)
|
if (display == NULL)
|
||||||
{
|
{
|
||||||
@@ -121,12 +122,14 @@ meta_barrier_impl_x11_new (MetaBarrier *barrier)
|
|||||||
dpy = display->xdisplay;
|
dpy = display->xdisplay;
|
||||||
root = DefaultRootWindow (dpy);
|
root = DefaultRootWindow (dpy);
|
||||||
|
|
||||||
|
allowed_motion_dirs =
|
||||||
|
meta_border_get_allows_directions (&barrier->priv->border);
|
||||||
priv->xbarrier = XFixesCreatePointerBarrier (dpy, root,
|
priv->xbarrier = XFixesCreatePointerBarrier (dpy, root,
|
||||||
barrier->priv->x1,
|
barrier->priv->border.line.a.x,
|
||||||
barrier->priv->y1,
|
barrier->priv->border.line.a.y,
|
||||||
barrier->priv->x2,
|
barrier->priv->border.line.b.x,
|
||||||
barrier->priv->y2,
|
barrier->priv->border.line.b.y,
|
||||||
barrier->priv->directions,
|
allowed_motion_dirs,
|
||||||
0, NULL);
|
0, NULL);
|
||||||
|
|
||||||
g_hash_table_insert (display->xids, &priv->xbarrier, barrier);
|
g_hash_table_insert (display->xids, &priv->xbarrier, barrier);
|
||||||
|
|||||||
@@ -40,25 +40,29 @@ typedef struct _MetaCursorRendererX11Private MetaCursorRendererX11Private;
|
|||||||
G_DEFINE_TYPE_WITH_PRIVATE (MetaCursorRendererX11, meta_cursor_renderer_x11, META_TYPE_CURSOR_RENDERER);
|
G_DEFINE_TYPE_WITH_PRIVATE (MetaCursorRendererX11, meta_cursor_renderer_x11, META_TYPE_CURSOR_RENDERER);
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
meta_cursor_renderer_x11_update_cursor (MetaCursorRenderer *renderer)
|
meta_cursor_renderer_x11_update_cursor (MetaCursorRenderer *renderer,
|
||||||
|
MetaCursorSprite *cursor_sprite)
|
||||||
{
|
{
|
||||||
MetaCursorRendererX11 *x11 = META_CURSOR_RENDERER_X11 (renderer);
|
MetaCursorRendererX11 *x11 = META_CURSOR_RENDERER_X11 (renderer);
|
||||||
MetaCursorRendererX11Private *priv = meta_cursor_renderer_x11_get_instance_private (x11);
|
MetaCursorRendererX11Private *priv = meta_cursor_renderer_x11_get_instance_private (x11);
|
||||||
|
|
||||||
MetaBackendX11 *backend = META_BACKEND_X11 (meta_get_backend ());
|
MetaBackendX11 *backend = META_BACKEND_X11 (meta_get_backend ());
|
||||||
Window xwindow = meta_backend_x11_get_xwindow (backend);
|
Window xwindow = meta_backend_x11_get_xwindow (backend);
|
||||||
|
|
||||||
if (xwindow == None)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
Display *xdisplay = meta_backend_x11_get_xdisplay (backend);
|
Display *xdisplay = meta_backend_x11_get_xdisplay (backend);
|
||||||
|
|
||||||
MetaCursorReference *cursor_ref = meta_cursor_renderer_get_cursor (renderer);
|
if (xwindow == None)
|
||||||
|
{
|
||||||
|
if (cursor_sprite)
|
||||||
|
meta_cursor_sprite_realize_texture (cursor_sprite);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
gboolean has_server_cursor = FALSE;
|
gboolean has_server_cursor = FALSE;
|
||||||
|
|
||||||
if (cursor_ref)
|
if (cursor_sprite)
|
||||||
{
|
{
|
||||||
MetaCursor cursor = meta_cursor_reference_get_meta_cursor (cursor_ref);
|
MetaCursor cursor = meta_cursor_sprite_get_meta_cursor (cursor_sprite);
|
||||||
|
|
||||||
if (cursor != META_CURSOR_NONE)
|
if (cursor != META_CURSOR_NONE)
|
||||||
{
|
{
|
||||||
Cursor xcursor = meta_cursor_create_x_cursor (xdisplay, cursor);
|
Cursor xcursor = meta_cursor_create_x_cursor (xdisplay, cursor);
|
||||||
@@ -80,6 +84,9 @@ meta_cursor_renderer_x11_update_cursor (MetaCursorRenderer *renderer)
|
|||||||
priv->server_cursor_visible = has_server_cursor;
|
priv->server_cursor_visible = has_server_cursor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!priv->server_cursor_visible && cursor_sprite)
|
||||||
|
meta_cursor_sprite_realize_texture (cursor_sprite);
|
||||||
|
|
||||||
return priv->server_cursor_visible;
|
return priv->server_cursor_visible;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -107,20 +107,6 @@ set_alarm_enabled (Display *dpy,
|
|||||||
XSyncChangeAlarm (dpy, alarm, XSyncCAEvents, &attr);
|
XSyncChangeAlarm (dpy, alarm, XSyncCAEvents, &attr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
check_x11_watch (gpointer data,
|
|
||||||
gpointer user_data)
|
|
||||||
{
|
|
||||||
MetaIdleMonitorWatchXSync *watch_xsync = data;
|
|
||||||
MetaIdleMonitorWatch *watch = (MetaIdleMonitorWatch *) watch_xsync;
|
|
||||||
XSyncAlarm alarm = (XSyncAlarm) user_data;
|
|
||||||
|
|
||||||
if (watch_xsync->xalarm != alarm)
|
|
||||||
return;
|
|
||||||
|
|
||||||
_meta_idle_monitor_watch_fire (watch);
|
|
||||||
}
|
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
counter_name_for_device (int device_id)
|
counter_name_for_device (int device_id)
|
||||||
{
|
{
|
||||||
@@ -327,13 +313,38 @@ meta_idle_monitor_xsync_init (MetaIdleMonitorXSync *monitor_xsync)
|
|||||||
monitor_xsync->alarms = g_hash_table_new (NULL, NULL);
|
monitor_xsync->alarms = g_hash_table_new (NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
check_x11_watches (MetaIdleMonitor *monitor,
|
||||||
|
XSyncAlarm alarm)
|
||||||
|
{
|
||||||
|
GList *node, *watch_ids;
|
||||||
|
|
||||||
|
/* we get the keys and do explicit look ups in case
|
||||||
|
* an early iteration of the loop ends up leading
|
||||||
|
* to watches from later iterations getting invalidated
|
||||||
|
*/
|
||||||
|
watch_ids = g_hash_table_get_keys (monitor->watches);
|
||||||
|
|
||||||
|
for (node = watch_ids; node != NULL; node = node->next)
|
||||||
|
{
|
||||||
|
guint watch_id = GPOINTER_TO_UINT (node->data);
|
||||||
|
MetaIdleMonitorWatchXSync *watch;
|
||||||
|
|
||||||
|
watch = g_hash_table_lookup (monitor->watches, GUINT_TO_POINTER (watch_id));
|
||||||
|
|
||||||
|
if (watch && watch->xalarm == alarm)
|
||||||
|
_meta_idle_monitor_watch_fire ((MetaIdleMonitorWatch *) watch);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_list_free (watch_ids);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_idle_monitor_xsync_handle_xevent (MetaIdleMonitor *monitor,
|
meta_idle_monitor_xsync_handle_xevent (MetaIdleMonitor *monitor,
|
||||||
XSyncAlarmNotifyEvent *alarm_event)
|
XSyncAlarmNotifyEvent *alarm_event)
|
||||||
{
|
{
|
||||||
MetaIdleMonitorXSync *monitor_xsync = META_IDLE_MONITOR_XSYNC (monitor);
|
MetaIdleMonitorXSync *monitor_xsync = META_IDLE_MONITOR_XSYNC (monitor);
|
||||||
XSyncAlarm alarm;
|
XSyncAlarm alarm;
|
||||||
GList *watches;
|
|
||||||
gboolean has_alarm;
|
gboolean has_alarm;
|
||||||
|
|
||||||
if (alarm_event->state != XSyncAlarmActive)
|
if (alarm_event->state != XSyncAlarmActive)
|
||||||
@@ -358,10 +369,5 @@ meta_idle_monitor_xsync_handle_xevent (MetaIdleMonitor *monitor,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (has_alarm)
|
if (has_alarm)
|
||||||
{
|
check_x11_watches (monitor, alarm);
|
||||||
watches = g_hash_table_get_values (monitor->watches);
|
|
||||||
|
|
||||||
g_list_foreach (watches, check_x11_watch, (gpointer) alarm);
|
|
||||||
g_list_free (watches);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,6 +26,7 @@
|
|||||||
#include "meta-backend-x11.h"
|
#include "meta-backend-x11.h"
|
||||||
#include "meta-input-settings-x11.h"
|
#include "meta-input-settings-x11.h"
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
#include <gdk/gdkx.h>
|
#include <gdk/gdkx.h>
|
||||||
#include <X11/Xatom.h>
|
#include <X11/Xatom.h>
|
||||||
#include <X11/extensions/XInput2.h>
|
#include <X11/extensions/XInput2.h>
|
||||||
@@ -35,6 +36,41 @@
|
|||||||
|
|
||||||
G_DEFINE_TYPE (MetaInputSettingsX11, meta_input_settings_x11, META_TYPE_INPUT_SETTINGS)
|
G_DEFINE_TYPE (MetaInputSettingsX11, meta_input_settings_x11, META_TYPE_INPUT_SETTINGS)
|
||||||
|
|
||||||
|
static void *
|
||||||
|
get_property (ClutterInputDevice *device,
|
||||||
|
const gchar *property,
|
||||||
|
Atom type,
|
||||||
|
int format,
|
||||||
|
gulong nitems)
|
||||||
|
{
|
||||||
|
MetaBackend *backend = meta_get_backend ();
|
||||||
|
Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
|
||||||
|
gulong nitems_ret, bytes_after_ret;
|
||||||
|
int rc, device_id, format_ret;
|
||||||
|
Atom property_atom, type_ret;
|
||||||
|
guchar *data_ret = NULL;
|
||||||
|
|
||||||
|
property_atom = XInternAtom (xdisplay, property, True);
|
||||||
|
if (!property_atom)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
device_id = clutter_input_device_get_device_id (device);
|
||||||
|
|
||||||
|
rc = XIGetProperty (xdisplay, device_id, property_atom,
|
||||||
|
0, 10, False, type, &type_ret, &format_ret,
|
||||||
|
&nitems_ret, &bytes_after_ret, &data_ret);
|
||||||
|
if (rc == Success && type_ret == type && format_ret == format && nitems_ret >= nitems)
|
||||||
|
{
|
||||||
|
if (nitems_ret > nitems)
|
||||||
|
g_warning ("Property '%s' for device '%s' returned %lu items, expected %lu",
|
||||||
|
property, clutter_input_device_get_device_name (device), nitems_ret, nitems);
|
||||||
|
return data_ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
meta_XFree (data_ret);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
change_property (ClutterInputDevice *device,
|
change_property (ClutterInputDevice *device,
|
||||||
const gchar *property,
|
const gchar *property,
|
||||||
@@ -45,23 +81,23 @@ change_property (ClutterInputDevice *device,
|
|||||||
{
|
{
|
||||||
MetaBackend *backend = meta_get_backend ();
|
MetaBackend *backend = meta_get_backend ();
|
||||||
Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
|
Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
|
||||||
gulong nitems_ret, bytes_after_ret;
|
int device_id;
|
||||||
int rc, device_id, format_ret;
|
Atom property_atom;
|
||||||
Atom property_atom, type_ret;
|
|
||||||
guchar *data_ret;
|
guchar *data_ret;
|
||||||
|
|
||||||
property_atom = XInternAtom (xdisplay, property, False);
|
property_atom = XInternAtom (xdisplay, property, True);
|
||||||
|
if (!property_atom)
|
||||||
|
return;
|
||||||
|
|
||||||
device_id = clutter_input_device_get_device_id (device);
|
device_id = clutter_input_device_get_device_id (device);
|
||||||
|
|
||||||
rc = XIGetProperty (xdisplay, device_id, property_atom,
|
data_ret = get_property (device, property, type, format, nitems);
|
||||||
0, 0, False, type, &type_ret, &format_ret,
|
if (!data_ret)
|
||||||
&nitems_ret, &bytes_after_ret, &data_ret);
|
return;
|
||||||
|
|
||||||
meta_XFree (data_ret);
|
|
||||||
|
|
||||||
if (rc == Success && type_ret == type && format_ret == format)
|
|
||||||
XIChangeProperty (xdisplay, device_id, property_atom, type,
|
XIChangeProperty (xdisplay, device_id, property_atom, type,
|
||||||
format, XIPropModeReplace, data, nitems);
|
format, XIPropModeReplace, data, nitems);
|
||||||
|
meta_XFree (data_ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -70,6 +106,12 @@ meta_input_settings_x11_set_send_events (MetaInputSettings *settings,
|
|||||||
GDesktopDeviceSendEvents mode)
|
GDesktopDeviceSendEvents mode)
|
||||||
{
|
{
|
||||||
guchar values[2] = { 0 }; /* disabled, disabled-on-external-mouse */
|
guchar values[2] = { 0 }; /* disabled, disabled-on-external-mouse */
|
||||||
|
guchar *available;
|
||||||
|
|
||||||
|
available = get_property (device, "libinput Send Events Modes Available",
|
||||||
|
XA_INTEGER, 8, 2);
|
||||||
|
if (!available)
|
||||||
|
return;
|
||||||
|
|
||||||
switch (mode)
|
switch (mode)
|
||||||
{
|
{
|
||||||
@@ -83,8 +125,14 @@ meta_input_settings_x11_set_send_events (MetaInputSettings *settings,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((values[0] && !available[0]) || (values[1] && !available[1]))
|
||||||
|
g_warning ("Device '%s' does not support sendevents mode %d\n",
|
||||||
|
clutter_input_device_get_device_name (device), mode);
|
||||||
|
else
|
||||||
change_property (device, "libinput Send Events Mode Enabled",
|
change_property (device, "libinput Send Events Mode Enabled",
|
||||||
XA_INTEGER, 8, &values, 2);
|
XA_INTEGER, 8, &values, 2);
|
||||||
|
|
||||||
|
meta_XFree (available);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -151,28 +199,35 @@ meta_input_settings_x11_set_invert_scroll (MetaInputSettings *settings,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_input_settings_x11_set_scroll_method (MetaInputSettings *settings,
|
meta_input_settings_x11_set_edge_scroll (MetaInputSettings *settings,
|
||||||
ClutterInputDevice *device,
|
ClutterInputDevice *device,
|
||||||
GDesktopTouchpadScrollMethod mode)
|
gboolean edge_scroll_enabled)
|
||||||
{
|
{
|
||||||
guchar values[3] = { 0 }; /* 2fg, edge, button. The last value is unused */
|
guchar values[3] = { 0 }; /* 2fg, edge, button. The last value is unused */
|
||||||
|
guchar *available;
|
||||||
|
|
||||||
switch (mode)
|
available = get_property (device, "libinput Scroll Methods Available",
|
||||||
|
XA_INTEGER, 8, 3);
|
||||||
|
if (!available)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (available[0])
|
||||||
{
|
{
|
||||||
case G_DESKTOP_TOUCHPAD_SCROLL_METHOD_DISABLED:
|
|
||||||
break;
|
|
||||||
case G_DESKTOP_TOUCHPAD_SCROLL_METHOD_EDGE_SCROLLING:
|
|
||||||
values[1] = 1;
|
|
||||||
break;
|
|
||||||
case G_DESKTOP_TOUCHPAD_SCROLL_METHOD_TWO_FINGER_SCROLLING:
|
|
||||||
values[0] = 1;
|
values[0] = 1;
|
||||||
break;
|
}
|
||||||
default:
|
else if (available[1] && edge_scroll_enabled)
|
||||||
g_assert_not_reached ();
|
{
|
||||||
|
values[1] = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Disabled */
|
||||||
}
|
}
|
||||||
|
|
||||||
change_property (device, "libinput Scroll Method Enabled",
|
change_property (device, "libinput Scroll Method Enabled",
|
||||||
XA_INTEGER, 8, &values, 3);
|
XA_INTEGER, 8, &values, 3);
|
||||||
|
|
||||||
|
meta_XFree (available);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -180,10 +235,56 @@ meta_input_settings_x11_set_scroll_button (MetaInputSettings *settings,
|
|||||||
ClutterInputDevice *device,
|
ClutterInputDevice *device,
|
||||||
guint button)
|
guint button)
|
||||||
{
|
{
|
||||||
change_property (device, "libinput Scroll Method Enabled",
|
change_property (device, "libinput Button Scrolling Button",
|
||||||
XA_INTEGER, 32, &button, 1);
|
XA_INTEGER, 32, &button, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_input_settings_x11_set_click_method (MetaInputSettings *settings,
|
||||||
|
ClutterInputDevice *device,
|
||||||
|
GDesktopTouchpadClickMethod mode)
|
||||||
|
{
|
||||||
|
guchar values[2] = { 0 }; /* buttonareas, clickfinger */
|
||||||
|
guchar *defaults, *available;
|
||||||
|
|
||||||
|
available = get_property (device, "libinput Click Methods Available",
|
||||||
|
XA_INTEGER, 8, 2);
|
||||||
|
if (!available)
|
||||||
|
return;
|
||||||
|
|
||||||
|
switch (mode)
|
||||||
|
{
|
||||||
|
case G_DESKTOP_TOUCHPAD_CLICK_METHOD_DEFAULT:
|
||||||
|
defaults = get_property (device, "libinput Click Method Enabled Default",
|
||||||
|
XA_INTEGER, 8, 2);
|
||||||
|
if (!defaults)
|
||||||
|
break;
|
||||||
|
memcpy (values, defaults, 2);
|
||||||
|
meta_XFree (defaults);
|
||||||
|
break;
|
||||||
|
case G_DESKTOP_TOUCHPAD_CLICK_METHOD_NONE:
|
||||||
|
break;
|
||||||
|
case G_DESKTOP_TOUCHPAD_CLICK_METHOD_AREAS:
|
||||||
|
values[0] = 1;
|
||||||
|
break;
|
||||||
|
case G_DESKTOP_TOUCHPAD_CLICK_METHOD_FINGERS:
|
||||||
|
values[1] = 1;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
g_assert_not_reached ();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((values[0] && !available[0]) || (values[1] && !available[1]))
|
||||||
|
g_warning ("Device '%s' does not support click method %d\n",
|
||||||
|
clutter_input_device_get_device_name (device), mode);
|
||||||
|
else
|
||||||
|
change_property (device, "libinput Click Method Enabled",
|
||||||
|
XA_INTEGER, 8, &values, 2);
|
||||||
|
|
||||||
|
meta_XFree(available);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_input_settings_x11_set_keyboard_repeat (MetaInputSettings *settings,
|
meta_input_settings_x11_set_keyboard_repeat (MetaInputSettings *settings,
|
||||||
gboolean enabled,
|
gboolean enabled,
|
||||||
@@ -215,8 +316,9 @@ meta_input_settings_x11_class_init (MetaInputSettingsX11Class *klass)
|
|||||||
input_settings_class->set_left_handed = meta_input_settings_x11_set_left_handed;
|
input_settings_class->set_left_handed = meta_input_settings_x11_set_left_handed;
|
||||||
input_settings_class->set_tap_enabled = meta_input_settings_x11_set_tap_enabled;
|
input_settings_class->set_tap_enabled = meta_input_settings_x11_set_tap_enabled;
|
||||||
input_settings_class->set_invert_scroll = meta_input_settings_x11_set_invert_scroll;
|
input_settings_class->set_invert_scroll = meta_input_settings_x11_set_invert_scroll;
|
||||||
input_settings_class->set_scroll_method = meta_input_settings_x11_set_scroll_method;
|
input_settings_class->set_edge_scroll = meta_input_settings_x11_set_edge_scroll;
|
||||||
input_settings_class->set_scroll_button = meta_input_settings_x11_set_scroll_button;
|
input_settings_class->set_scroll_button = meta_input_settings_x11_set_scroll_button;
|
||||||
|
input_settings_class->set_click_method = meta_input_settings_x11_set_click_method;
|
||||||
input_settings_class->set_keyboard_repeat = meta_input_settings_x11_set_keyboard_repeat;
|
input_settings_class->set_keyboard_repeat = meta_input_settings_x11_set_keyboard_repeat;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -58,6 +58,7 @@ struct _MetaMonitorManagerXrandr
|
|||||||
XRRScreenResources *resources;
|
XRRScreenResources *resources;
|
||||||
int rr_event_base;
|
int rr_event_base;
|
||||||
int rr_error_base;
|
int rr_error_base;
|
||||||
|
gboolean has_randr15;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _MetaMonitorManagerXrandrClass
|
struct _MetaMonitorManagerXrandrClass
|
||||||
@@ -194,11 +195,10 @@ static gboolean
|
|||||||
output_get_boolean_property (MetaMonitorManagerXrandr *manager_xrandr,
|
output_get_boolean_property (MetaMonitorManagerXrandr *manager_xrandr,
|
||||||
MetaOutput *output, const char *propname)
|
MetaOutput *output, const char *propname)
|
||||||
{
|
{
|
||||||
gboolean value = FALSE;
|
|
||||||
Atom 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;
|
g_autofree unsigned char *buffer = NULL;
|
||||||
|
|
||||||
atom = XInternAtom (manager_xrandr->xdisplay, propname, False);
|
atom = XInternAtom (manager_xrandr->xdisplay, propname, False);
|
||||||
XRRGetOutputProperty (manager_xrandr->xdisplay,
|
XRRGetOutputProperty (manager_xrandr->xdisplay,
|
||||||
@@ -209,13 +209,9 @@ output_get_boolean_property (MetaMonitorManagerXrandr *manager_xrandr,
|
|||||||
&nitems, &bytes_after, &buffer);
|
&nitems, &bytes_after, &buffer);
|
||||||
|
|
||||||
if (actual_type != XA_CARDINAL || actual_format != 32 || nitems < 1)
|
if (actual_type != XA_CARDINAL || actual_format != 32 || nitems < 1)
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
value = ((int*)buffer)[0];
|
return ((int*)buffer)[0];
|
||||||
|
|
||||||
out:
|
|
||||||
XFree (buffer);
|
|
||||||
return value;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
@@ -225,6 +221,76 @@ output_get_presentation_xrandr (MetaMonitorManagerXrandr *manager_xrandr,
|
|||||||
return output_get_boolean_property (manager_xrandr, output, "_MUTTER_PRESENTATION_OUTPUT");
|
return output_get_boolean_property (manager_xrandr, output, "_MUTTER_PRESENTATION_OUTPUT");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
output_get_underscanning_xrandr (MetaMonitorManagerXrandr *manager_xrandr,
|
||||||
|
MetaOutput *output)
|
||||||
|
{
|
||||||
|
Atom atom, actual_type;
|
||||||
|
int actual_format;
|
||||||
|
unsigned long nitems, bytes_after;
|
||||||
|
g_autofree unsigned char *buffer = NULL;
|
||||||
|
g_autofree char *str = NULL;
|
||||||
|
|
||||||
|
atom = XInternAtom (manager_xrandr->xdisplay, "underscan", False);
|
||||||
|
XRRGetOutputProperty (manager_xrandr->xdisplay,
|
||||||
|
(XID)output->winsys_id,
|
||||||
|
atom,
|
||||||
|
0, G_MAXLONG, False, False, XA_ATOM,
|
||||||
|
&actual_type, &actual_format,
|
||||||
|
&nitems, &bytes_after, &buffer);
|
||||||
|
|
||||||
|
if (actual_type != XA_ATOM || actual_format != 32 || nitems < 1)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
str = XGetAtomName (manager_xrandr->xdisplay, *(Atom *)buffer);
|
||||||
|
return (strcmp (str, "on") == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
output_get_supports_underscanning_xrandr (MetaMonitorManagerXrandr *manager_xrandr,
|
||||||
|
MetaOutput *output)
|
||||||
|
{
|
||||||
|
Atom atom, actual_type;
|
||||||
|
int actual_format, i;
|
||||||
|
unsigned long nitems, bytes_after;
|
||||||
|
g_autofree unsigned char *buffer = NULL;
|
||||||
|
XRRPropertyInfo *property_info;
|
||||||
|
Atom *values;
|
||||||
|
gboolean supports_underscanning = FALSE;
|
||||||
|
|
||||||
|
atom = XInternAtom (manager_xrandr->xdisplay, "underscan", False);
|
||||||
|
XRRGetOutputProperty (manager_xrandr->xdisplay,
|
||||||
|
(XID)output->winsys_id,
|
||||||
|
atom,
|
||||||
|
0, G_MAXLONG, False, False, XA_ATOM,
|
||||||
|
&actual_type, &actual_format,
|
||||||
|
&nitems, &bytes_after, &buffer);
|
||||||
|
|
||||||
|
if (actual_type != XA_ATOM || actual_format != 32 || nitems < 1)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
property_info = XRRQueryOutputProperty (manager_xrandr->xdisplay,
|
||||||
|
(XID) output->winsys_id,
|
||||||
|
atom);
|
||||||
|
values = (Atom *) property_info->values;
|
||||||
|
|
||||||
|
for (i = 0; i < property_info->num_values; i++)
|
||||||
|
{
|
||||||
|
/* The output supports underscanning if "on" is a valid value
|
||||||
|
* for the underscan property.
|
||||||
|
*/
|
||||||
|
char *name = XGetAtomName (manager_xrandr->xdisplay, values[i]);
|
||||||
|
if (strcmp (name, "on") == 0)
|
||||||
|
supports_underscanning = TRUE;
|
||||||
|
|
||||||
|
XFree (name);
|
||||||
|
}
|
||||||
|
|
||||||
|
XFree (property_info);
|
||||||
|
|
||||||
|
return supports_underscanning;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
normalize_backlight (MetaOutput *output,
|
normalize_backlight (MetaOutput *output,
|
||||||
int hw_value)
|
int hw_value)
|
||||||
@@ -241,7 +307,7 @@ output_get_backlight_xrandr (MetaMonitorManagerXrandr *manager_xrandr,
|
|||||||
Atom 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;
|
g_autofree unsigned char *buffer = NULL;
|
||||||
|
|
||||||
atom = XInternAtom (manager_xrandr->xdisplay, "Backlight", False);
|
atom = XInternAtom (manager_xrandr->xdisplay, "Backlight", False);
|
||||||
XRRGetOutputProperty (manager_xrandr->xdisplay,
|
XRRGetOutputProperty (manager_xrandr->xdisplay,
|
||||||
@@ -252,12 +318,9 @@ output_get_backlight_xrandr (MetaMonitorManagerXrandr *manager_xrandr,
|
|||||||
&nitems, &bytes_after, &buffer);
|
&nitems, &bytes_after, &buffer);
|
||||||
|
|
||||||
if (actual_type != XA_INTEGER || actual_format != 32 || nitems < 1)
|
if (actual_type != XA_INTEGER || actual_format != 32 || nitems < 1)
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
value = ((int*)buffer)[0];
|
value = ((int*)buffer)[0];
|
||||||
|
|
||||||
out:
|
|
||||||
XFree (buffer);
|
|
||||||
if (value > 0)
|
if (value > 0)
|
||||||
return normalize_backlight (output, value);
|
return normalize_backlight (output, value);
|
||||||
else
|
else
|
||||||
@@ -270,7 +333,7 @@ output_get_backlight_limits_xrandr (MetaMonitorManagerXrandr *manager_xrandr,
|
|||||||
{
|
{
|
||||||
Atom atom;
|
Atom atom;
|
||||||
xcb_connection_t *xcb_conn;
|
xcb_connection_t *xcb_conn;
|
||||||
xcb_randr_query_output_property_reply_t *reply;
|
g_autofree xcb_randr_query_output_property_reply_t *reply;
|
||||||
|
|
||||||
atom = XInternAtom (manager_xrandr->xdisplay, "Backlight", False);
|
atom = XInternAtom (manager_xrandr->xdisplay, "Backlight", False);
|
||||||
|
|
||||||
@@ -288,15 +351,12 @@ output_get_backlight_limits_xrandr (MetaMonitorManagerXrandr *manager_xrandr,
|
|||||||
if (!reply->range || reply->length != 2)
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t *values = xcb_randr_query_output_property_valid_values (reply);
|
int32_t *values = xcb_randr_query_output_property_valid_values (reply);
|
||||||
output->backlight_min = values[0];
|
output->backlight_min = values[0];
|
||||||
output->backlight_max = values[1];
|
output->backlight_max = values[1];
|
||||||
|
|
||||||
out:
|
|
||||||
free (reply);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
@@ -359,12 +419,6 @@ read_output_edid (MetaMonitorManagerXrandr *manager_xrandr,
|
|||||||
result = get_edid_property (manager_xrandr->xdisplay, winsys_id, edid_atom, &len);
|
result = get_edid_property (manager_xrandr->xdisplay, winsys_id, edid_atom, &len);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!result)
|
|
||||||
{
|
|
||||||
edid_atom = XInternAtom (manager_xrandr->xdisplay, "XFree86_DDC_EDID1_RAWDATA", FALSE);
|
|
||||||
result = get_edid_property (manager_xrandr->xdisplay, winsys_id, edid_atom, &len);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (result)
|
if (result)
|
||||||
{
|
{
|
||||||
if (len > 0 && len % 128 == 0)
|
if (len > 0 && len % 128 == 0)
|
||||||
@@ -376,6 +430,42 @@ read_output_edid (MetaMonitorManagerXrandr *manager_xrandr,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
output_get_tile_info (MetaMonitorManagerXrandr *manager_xrandr,
|
||||||
|
MetaOutput *output)
|
||||||
|
{
|
||||||
|
Atom tile_atom;
|
||||||
|
unsigned char *prop;
|
||||||
|
unsigned long nitems, bytes_after;
|
||||||
|
int actual_format;
|
||||||
|
Atom actual_type;
|
||||||
|
|
||||||
|
if (manager_xrandr->has_randr15 == FALSE)
|
||||||
|
return;
|
||||||
|
|
||||||
|
tile_atom = XInternAtom (manager_xrandr->xdisplay, "TILE", FALSE);
|
||||||
|
XRRGetOutputProperty (manager_xrandr->xdisplay,
|
||||||
|
output->winsys_id,
|
||||||
|
tile_atom, 0, 100, False,
|
||||||
|
False, AnyPropertyType,
|
||||||
|
&actual_type, &actual_format,
|
||||||
|
&nitems, &bytes_after, &prop);
|
||||||
|
|
||||||
|
if (actual_type == XA_INTEGER && actual_format == 32 && nitems == 8)
|
||||||
|
{
|
||||||
|
long *values = (long *)prop;
|
||||||
|
output->tile_info.group_id = values[0];
|
||||||
|
output->tile_info.flags = values[1];
|
||||||
|
output->tile_info.max_h_tiles = values[2];
|
||||||
|
output->tile_info.max_v_tiles = values[3];
|
||||||
|
output->tile_info.loc_h_tile = values[4];
|
||||||
|
output->tile_info.loc_v_tile = values[5];
|
||||||
|
output->tile_info.tile_w = values[6];
|
||||||
|
output->tile_info.tile_h = values[7];
|
||||||
|
}
|
||||||
|
XFree (prop);
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
output_get_hotplug_mode_update (MetaMonitorManagerXrandr *manager_xrandr,
|
output_get_hotplug_mode_update (MetaMonitorManagerXrandr *manager_xrandr,
|
||||||
MetaOutput *output)
|
MetaOutput *output)
|
||||||
@@ -447,11 +537,10 @@ static MetaConnectorType
|
|||||||
output_get_connector_type_from_prop (MetaMonitorManagerXrandr *manager_xrandr,
|
output_get_connector_type_from_prop (MetaMonitorManagerXrandr *manager_xrandr,
|
||||||
MetaOutput *output)
|
MetaOutput *output)
|
||||||
{
|
{
|
||||||
MetaConnectorType ret = META_CONNECTOR_TYPE_Unknown;
|
|
||||||
Atom atom, actual_type, connector_type_atom;
|
Atom atom, actual_type, connector_type_atom;
|
||||||
int actual_format;
|
int actual_format;
|
||||||
unsigned long nitems, bytes_after;
|
unsigned long nitems, bytes_after;
|
||||||
unsigned char *buffer;
|
g_autofree unsigned char *buffer = NULL;
|
||||||
|
|
||||||
atom = XInternAtom (manager_xrandr->xdisplay, "ConnectorType", False);
|
atom = XInternAtom (manager_xrandr->xdisplay, "ConnectorType", False);
|
||||||
XRRGetOutputProperty (manager_xrandr->xdisplay,
|
XRRGetOutputProperty (manager_xrandr->xdisplay,
|
||||||
@@ -462,14 +551,10 @@ output_get_connector_type_from_prop (MetaMonitorManagerXrandr *manager_xrandr,
|
|||||||
&nitems, &bytes_after, &buffer);
|
&nitems, &bytes_after, &buffer);
|
||||||
|
|
||||||
if (actual_type != XA_ATOM || actual_format != 32 || nitems < 1)
|
if (actual_type != XA_ATOM || actual_format != 32 || nitems < 1)
|
||||||
goto out;
|
return META_CONNECTOR_TYPE_Unknown;
|
||||||
|
|
||||||
connector_type_atom = ((Atom *) buffer)[0];
|
connector_type_atom = ((Atom *) buffer)[0];
|
||||||
ret = connector_type_from_atom (manager_xrandr, connector_type_atom);
|
return connector_type_from_atom (manager_xrandr, connector_type_atom);
|
||||||
|
|
||||||
out:
|
|
||||||
meta_XFree (buffer);
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static MetaConnectorType
|
static MetaConnectorType
|
||||||
@@ -506,7 +591,7 @@ output_get_connector_type_from_name (MetaMonitorManagerXrandr *manager_xrandr,
|
|||||||
if (g_str_has_prefix (name, "Virtual"))
|
if (g_str_has_prefix (name, "Virtual"))
|
||||||
return META_CONNECTOR_TYPE_VIRTUAL;
|
return META_CONNECTOR_TYPE_VIRTUAL;
|
||||||
if (g_str_has_prefix (name, "Composite"))
|
if (g_str_has_prefix (name, "Composite"))
|
||||||
return META_CONNECTOR_TYPE_VGA;
|
return META_CONNECTOR_TYPE_Composite;
|
||||||
if (g_str_has_prefix (name, "S-video"))
|
if (g_str_has_prefix (name, "S-video"))
|
||||||
return META_CONNECTOR_TYPE_SVIDEO;
|
return META_CONNECTOR_TYPE_SVIDEO;
|
||||||
if (g_str_has_prefix (name, "TV"))
|
if (g_str_has_prefix (name, "TV"))
|
||||||
@@ -546,6 +631,70 @@ output_get_connector_type (MetaMonitorManagerXrandr *manager_xrandr,
|
|||||||
return META_CONNECTOR_TYPE_Unknown;
|
return META_CONNECTOR_TYPE_Unknown;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
output_get_modes (MetaMonitorManager *manager,
|
||||||
|
MetaOutput *meta_output,
|
||||||
|
XRROutputInfo *output)
|
||||||
|
{
|
||||||
|
guint j, k;
|
||||||
|
guint n_actual_modes;
|
||||||
|
|
||||||
|
meta_output->modes = g_new0 (MetaMonitorMode *, output->nmode);
|
||||||
|
|
||||||
|
n_actual_modes = 0;
|
||||||
|
for (j = 0; j < (guint)output->nmode; j++)
|
||||||
|
{
|
||||||
|
for (k = 0; k < manager->n_modes; k++)
|
||||||
|
{
|
||||||
|
if (output->modes[j] == (XID)manager->modes[k].mode_id)
|
||||||
|
{
|
||||||
|
meta_output->modes[n_actual_modes] = &manager->modes[k];
|
||||||
|
n_actual_modes += 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
meta_output->n_modes = n_actual_modes;
|
||||||
|
if (n_actual_modes > 0)
|
||||||
|
meta_output->preferred_mode = meta_output->modes[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
output_get_crtcs (MetaMonitorManager *manager,
|
||||||
|
MetaOutput *meta_output,
|
||||||
|
XRROutputInfo *output)
|
||||||
|
{
|
||||||
|
guint j, k;
|
||||||
|
guint n_actual_crtcs;
|
||||||
|
|
||||||
|
meta_output->possible_crtcs = g_new0 (MetaCRTC *, output->ncrtc);
|
||||||
|
|
||||||
|
n_actual_crtcs = 0;
|
||||||
|
for (j = 0; j < (unsigned)output->ncrtc; j++)
|
||||||
|
{
|
||||||
|
for (k = 0; k < manager->n_crtcs; k++)
|
||||||
|
{
|
||||||
|
if ((XID)manager->crtcs[k].crtc_id == output->crtcs[j])
|
||||||
|
{
|
||||||
|
meta_output->possible_crtcs[n_actual_crtcs] = &manager->crtcs[k];
|
||||||
|
n_actual_crtcs += 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
meta_output->n_possible_crtcs = n_actual_crtcs;
|
||||||
|
|
||||||
|
meta_output->crtc = NULL;
|
||||||
|
for (j = 0; j < manager->n_crtcs; j++)
|
||||||
|
{
|
||||||
|
if ((XID)manager->crtcs[j].crtc_id == output->crtc)
|
||||||
|
{
|
||||||
|
meta_output->crtc = &manager->crtcs[j];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
get_xmode_name (XRRModeInfo *xmode)
|
get_xmode_name (XRRModeInfo *xmode)
|
||||||
{
|
{
|
||||||
@@ -682,6 +831,8 @@ meta_monitor_manager_xrandr_read_current (MetaMonitorManager *manager)
|
|||||||
MetaOutput *meta_output;
|
MetaOutput *meta_output;
|
||||||
|
|
||||||
output = XRRGetOutputInfo (manager_xrandr->xdisplay, resources, resources->outputs[i]);
|
output = XRRGetOutputInfo (manager_xrandr->xdisplay, resources, resources->outputs[i]);
|
||||||
|
if (!output)
|
||||||
|
continue;
|
||||||
|
|
||||||
meta_output = &manager->outputs[n_actual_outputs];
|
meta_output = &manager->outputs[n_actual_outputs];
|
||||||
|
|
||||||
@@ -693,11 +844,8 @@ meta_monitor_manager_xrandr_read_current (MetaMonitorManager *manager)
|
|||||||
meta_output->name = g_strdup (output->name);
|
meta_output->name = g_strdup (output->name);
|
||||||
|
|
||||||
edid = read_output_edid (manager_xrandr, meta_output->winsys_id);
|
edid = read_output_edid (manager_xrandr, meta_output->winsys_id);
|
||||||
if (edid)
|
|
||||||
{
|
|
||||||
meta_output_parse_edid (meta_output, edid);
|
meta_output_parse_edid (meta_output, edid);
|
||||||
g_bytes_unref (edid);
|
g_bytes_unref (edid);
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
||||||
@@ -707,44 +855,9 @@ meta_monitor_manager_xrandr_read_current (MetaMonitorManager *manager)
|
|||||||
meta_output->suggested_y = output_get_suggested_y (manager_xrandr, meta_output);
|
meta_output->suggested_y = output_get_suggested_y (manager_xrandr, meta_output);
|
||||||
meta_output->connector_type = output_get_connector_type (manager_xrandr, meta_output);
|
meta_output->connector_type = output_get_connector_type (manager_xrandr, meta_output);
|
||||||
|
|
||||||
meta_output->n_modes = output->nmode;
|
output_get_tile_info (manager_xrandr, meta_output);
|
||||||
meta_output->modes = g_new0 (MetaMonitorMode *, meta_output->n_modes);
|
output_get_modes (manager, meta_output, output);
|
||||||
for (j = 0; j < meta_output->n_modes; j++)
|
output_get_crtcs (manager, meta_output, output);
|
||||||
{
|
|
||||||
for (k = 0; k < manager->n_modes; k++)
|
|
||||||
{
|
|
||||||
if (output->modes[j] == (XID)manager->modes[k].mode_id)
|
|
||||||
{
|
|
||||||
meta_output->modes[j] = &manager->modes[k];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
meta_output->preferred_mode = meta_output->modes[0];
|
|
||||||
|
|
||||||
meta_output->n_possible_crtcs = output->ncrtc;
|
|
||||||
meta_output->possible_crtcs = g_new0 (MetaCRTC *, meta_output->n_possible_crtcs);
|
|
||||||
for (j = 0; j < (unsigned)output->ncrtc; j++)
|
|
||||||
{
|
|
||||||
for (k = 0; k < manager->n_crtcs; k++)
|
|
||||||
{
|
|
||||||
if ((XID)manager->crtcs[k].crtc_id == output->crtcs[j])
|
|
||||||
{
|
|
||||||
meta_output->possible_crtcs[j] = &manager->crtcs[k];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
meta_output->crtc = NULL;
|
|
||||||
for (j = 0; j < manager->n_crtcs; j++)
|
|
||||||
{
|
|
||||||
if ((XID)manager->crtcs[j].crtc_id == output->crtc)
|
|
||||||
{
|
|
||||||
meta_output->crtc = &manager->crtcs[j];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
meta_output->n_possible_clones = output->nclone;
|
meta_output->n_possible_clones = output->nclone;
|
||||||
meta_output->possible_clones = g_new0 (MetaOutput *, meta_output->n_possible_clones);
|
meta_output->possible_clones = g_new0 (MetaOutput *, meta_output->n_possible_clones);
|
||||||
@@ -759,6 +872,8 @@ meta_monitor_manager_xrandr_read_current (MetaMonitorManager *manager)
|
|||||||
|
|
||||||
meta_output->is_primary = ((XID)meta_output->winsys_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);
|
||||||
|
meta_output->is_underscanning = output_get_underscanning_xrandr (manager_xrandr, meta_output);
|
||||||
|
meta_output->supports_underscanning = output_get_supports_underscanning_xrandr (manager_xrandr, meta_output);
|
||||||
output_get_backlight_limits_xrandr (manager_xrandr, meta_output);
|
output_get_backlight_limits_xrandr (manager_xrandr, meta_output);
|
||||||
|
|
||||||
if (!(meta_output->backlight_min == 0 && meta_output->backlight_max == 0))
|
if (!(meta_output->backlight_min == 0 && meta_output->backlight_max == 0))
|
||||||
@@ -766,6 +881,9 @@ meta_monitor_manager_xrandr_read_current (MetaMonitorManager *manager)
|
|||||||
else
|
else
|
||||||
meta_output->backlight = -1;
|
meta_output->backlight = -1;
|
||||||
|
|
||||||
|
if (meta_output->n_modes == 0 || meta_output->n_possible_crtcs == 0)
|
||||||
|
meta_monitor_manager_clear_output (meta_output);
|
||||||
|
else
|
||||||
n_actual_outputs++;
|
n_actual_outputs++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -872,11 +990,58 @@ output_set_presentation_xrandr (MetaMonitorManagerXrandr *manager_xrandr,
|
|||||||
int value = presentation;
|
int value = presentation;
|
||||||
|
|
||||||
atom = XInternAtom (manager_xrandr->xdisplay, "_MUTTER_PRESENTATION_OUTPUT", False);
|
atom = XInternAtom (manager_xrandr->xdisplay, "_MUTTER_PRESENTATION_OUTPUT", False);
|
||||||
XRRChangeOutputProperty (manager_xrandr->xdisplay,
|
|
||||||
|
xcb_randr_change_output_property (XGetXCBConnection (manager_xrandr->xdisplay),
|
||||||
(XID)output->winsys_id,
|
(XID)output->winsys_id,
|
||||||
atom,
|
atom, XCB_ATOM_CARDINAL, 32,
|
||||||
XA_CARDINAL, 32, PropModeReplace,
|
XCB_PROP_MODE_REPLACE,
|
||||||
(unsigned char*) &value, 1);
|
1, &value);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
output_set_underscanning_xrandr (MetaMonitorManagerXrandr *manager_xrandr,
|
||||||
|
MetaOutput *output,
|
||||||
|
gboolean underscanning)
|
||||||
|
{
|
||||||
|
Atom prop, valueatom;
|
||||||
|
const char *value;
|
||||||
|
|
||||||
|
prop = XInternAtom (manager_xrandr->xdisplay, "underscan", False);
|
||||||
|
|
||||||
|
value = underscanning ? "on" : "off";
|
||||||
|
valueatom = XInternAtom (manager_xrandr->xdisplay, value, False);
|
||||||
|
|
||||||
|
xcb_randr_change_output_property (XGetXCBConnection (manager_xrandr->xdisplay),
|
||||||
|
(XID)output->winsys_id,
|
||||||
|
prop, XCB_ATOM_ATOM, 32,
|
||||||
|
XCB_PROP_MODE_REPLACE,
|
||||||
|
1, &valueatom);
|
||||||
|
|
||||||
|
/* Configure the border at the same time. Currently, we use a
|
||||||
|
* 5% of the width/height of the mode. In the future, we should
|
||||||
|
* make the border configurable. */
|
||||||
|
if (underscanning)
|
||||||
|
{
|
||||||
|
uint32_t border_value;
|
||||||
|
|
||||||
|
prop = XInternAtom (manager_xrandr->xdisplay, "underscan hborder", False);
|
||||||
|
border_value = output->crtc->current_mode->width * 0.05;
|
||||||
|
|
||||||
|
xcb_randr_change_output_property (XGetXCBConnection (manager_xrandr->xdisplay),
|
||||||
|
(XID)output->winsys_id,
|
||||||
|
prop, XCB_ATOM_INTEGER, 32,
|
||||||
|
XCB_PROP_MODE_REPLACE,
|
||||||
|
1, &border_value);
|
||||||
|
|
||||||
|
prop = XInternAtom (manager_xrandr->xdisplay, "underscan vborder", False);
|
||||||
|
border_value = output->crtc->current_mode->height * 0.05;
|
||||||
|
|
||||||
|
xcb_randr_change_output_property (XGetXCBConnection (manager_xrandr->xdisplay),
|
||||||
|
(XID)output->winsys_id,
|
||||||
|
prop, XCB_ATOM_INTEGER, 32,
|
||||||
|
XCB_PROP_MODE_REPLACE,
|
||||||
|
1, &border_value);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -995,17 +1160,16 @@ meta_monitor_manager_xrandr_apply_configuration (MetaMonitorManager *manager,
|
|||||||
if (crtc_info->mode != NULL)
|
if (crtc_info->mode != NULL)
|
||||||
{
|
{
|
||||||
MetaMonitorMode *mode;
|
MetaMonitorMode *mode;
|
||||||
XID *outputs;
|
g_autofree XID *output_ids = NULL;
|
||||||
unsigned int j, n_outputs;
|
unsigned int j, n_output_ids;
|
||||||
int width, height;
|
|
||||||
Status ok;
|
Status ok;
|
||||||
|
|
||||||
mode = crtc_info->mode;
|
mode = crtc_info->mode;
|
||||||
|
|
||||||
n_outputs = crtc_info->outputs->len;
|
n_output_ids = crtc_info->outputs->len;
|
||||||
outputs = g_new (XID, n_outputs);
|
output_ids = g_new (XID, n_output_ids);
|
||||||
|
|
||||||
for (j = 0; j < n_outputs; j++)
|
for (j = 0; j < n_output_ids; j++)
|
||||||
{
|
{
|
||||||
MetaOutput *output;
|
MetaOutput *output;
|
||||||
|
|
||||||
@@ -1014,7 +1178,7 @@ meta_monitor_manager_xrandr_apply_configuration (MetaMonitorManager *manager,
|
|||||||
output->is_dirty = TRUE;
|
output->is_dirty = TRUE;
|
||||||
output->crtc = crtc;
|
output->crtc = crtc;
|
||||||
|
|
||||||
outputs[j] = output->winsys_id;
|
output_ids[j] = output->winsys_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
ok = XRRSetCrtcConfig (manager_xrandr->xdisplay,
|
ok = XRRSetCrtcConfig (manager_xrandr->xdisplay,
|
||||||
@@ -1024,7 +1188,7 @@ meta_monitor_manager_xrandr_apply_configuration (MetaMonitorManager *manager,
|
|||||||
crtc_info->x, crtc_info->y,
|
crtc_info->x, crtc_info->y,
|
||||||
(XID)mode->mode_id,
|
(XID)mode->mode_id,
|
||||||
meta_monitor_transform_to_xrandr (crtc_info->transform),
|
meta_monitor_transform_to_xrandr (crtc_info->transform),
|
||||||
outputs, n_outputs);
|
output_ids, n_output_ids);
|
||||||
|
|
||||||
if (ok != Success)
|
if (ok != Success)
|
||||||
{
|
{
|
||||||
@@ -1032,7 +1196,7 @@ meta_monitor_manager_xrandr_apply_configuration (MetaMonitorManager *manager,
|
|||||||
(unsigned)(crtc->crtc_id), (unsigned)(mode->mode_id),
|
(unsigned)(crtc->crtc_id), (unsigned)(mode->mode_id),
|
||||||
mode->width, mode->height, (float)mode->refresh_rate,
|
mode->width, mode->height, (float)mode->refresh_rate,
|
||||||
crtc_info->x, crtc_info->y, crtc_info->transform);
|
crtc_info->x, crtc_info->y, crtc_info->transform);
|
||||||
goto next;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (meta_monitor_transform_is_rotated (crtc_info->transform))
|
if (meta_monitor_transform_is_rotated (crtc_info->transform))
|
||||||
@@ -1052,9 +1216,6 @@ meta_monitor_manager_xrandr_apply_configuration (MetaMonitorManager *manager,
|
|||||||
crtc->rect.height = height;
|
crtc->rect.height = height;
|
||||||
crtc->current_mode = mode;
|
crtc->current_mode = mode;
|
||||||
crtc->transform = crtc_info->transform;
|
crtc->transform = crtc_info->transform;
|
||||||
|
|
||||||
next:
|
|
||||||
g_free (outputs);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1074,8 +1235,14 @@ meta_monitor_manager_xrandr_apply_configuration (MetaMonitorManager *manager,
|
|||||||
output_info->output,
|
output_info->output,
|
||||||
output_info->is_presentation);
|
output_info->is_presentation);
|
||||||
|
|
||||||
|
if (output_get_supports_underscanning_xrandr (manager_xrandr, output_info->output))
|
||||||
|
output_set_underscanning_xrandr (manager_xrandr,
|
||||||
|
output_info->output,
|
||||||
|
output_info->is_underscanning);
|
||||||
|
|
||||||
output->is_primary = output_info->is_primary;
|
output->is_primary = output_info->is_primary;
|
||||||
output->is_presentation = output_info->is_presentation;
|
output->is_presentation = output_info->is_presentation;
|
||||||
|
output->is_underscanning = output_info->is_underscanning;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Disable outputs not mentioned in the list */
|
/* Disable outputs not mentioned in the list */
|
||||||
@@ -1109,11 +1276,12 @@ meta_monitor_manager_xrandr_change_backlight (MetaMonitorManager *manager,
|
|||||||
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);
|
||||||
|
|
||||||
atom = XInternAtom (manager_xrandr->xdisplay, "Backlight", False);
|
atom = XInternAtom (manager_xrandr->xdisplay, "Backlight", False);
|
||||||
XRRChangeOutputProperty (manager_xrandr->xdisplay,
|
|
||||||
|
xcb_randr_change_output_property (XGetXCBConnection (manager_xrandr->xdisplay),
|
||||||
(XID)output->winsys_id,
|
(XID)output->winsys_id,
|
||||||
atom,
|
atom, XCB_ATOM_INTEGER, 32,
|
||||||
XA_INTEGER, 32, PropModeReplace,
|
XCB_PROP_MODE_REPLACE,
|
||||||
(unsigned char *) &hw_value, 1);
|
1, &hw_value);
|
||||||
|
|
||||||
/* 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);
|
||||||
@@ -1161,6 +1329,88 @@ meta_monitor_manager_xrandr_set_crtc_gamma (MetaMonitorManager *manager,
|
|||||||
XRRFreeGamma (gamma);
|
XRRFreeGamma (gamma);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_XRANDR15
|
||||||
|
static void
|
||||||
|
meta_monitor_manager_xrandr_add_monitor(MetaMonitorManager *manager,
|
||||||
|
MetaMonitorInfo *monitor)
|
||||||
|
{
|
||||||
|
MetaMonitorManagerXrandr *manager_xrandr = META_MONITOR_MANAGER_XRANDR (manager);
|
||||||
|
XRRMonitorInfo *m;
|
||||||
|
int o;
|
||||||
|
Atom name;
|
||||||
|
char name_buf[40];
|
||||||
|
|
||||||
|
if (manager_xrandr->has_randr15 == FALSE)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (monitor->n_outputs <= 1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (monitor->outputs[0]->product)
|
||||||
|
snprintf (name_buf, 40, "%s-%d", monitor->outputs[0]->product, monitor->outputs[0]->tile_info.group_id);
|
||||||
|
else
|
||||||
|
snprintf (name_buf, 40, "Tiled-%d", monitor->outputs[0]->tile_info.group_id);
|
||||||
|
|
||||||
|
name = XInternAtom (manager_xrandr->xdisplay, name_buf, False);
|
||||||
|
monitor->monitor_winsys_xid = name;
|
||||||
|
m = XRRAllocateMonitor (manager_xrandr->xdisplay, monitor->n_outputs);
|
||||||
|
if (!m)
|
||||||
|
return;
|
||||||
|
m->name = name;
|
||||||
|
m->primary = monitor->is_primary;
|
||||||
|
m->automatic = True;
|
||||||
|
|
||||||
|
for (o = 0; o < monitor->n_outputs; o++) {
|
||||||
|
MetaOutput *output = monitor->outputs[o];
|
||||||
|
m->outputs[o] = output->winsys_id;
|
||||||
|
}
|
||||||
|
XRRSetMonitor (manager_xrandr->xdisplay,
|
||||||
|
DefaultRootWindow (manager_xrandr->xdisplay),
|
||||||
|
m);
|
||||||
|
XRRFreeMonitors (m);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_monitor_manager_xrandr_delete_monitor(MetaMonitorManager *manager,
|
||||||
|
int monitor_winsys_xid)
|
||||||
|
{
|
||||||
|
MetaMonitorManagerXrandr *manager_xrandr = META_MONITOR_MANAGER_XRANDR (manager);
|
||||||
|
|
||||||
|
if (manager_xrandr->has_randr15 == FALSE)
|
||||||
|
return;
|
||||||
|
XRRDeleteMonitor (manager_xrandr->xdisplay,
|
||||||
|
DefaultRootWindow (manager_xrandr->xdisplay),
|
||||||
|
monitor_winsys_xid);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_monitor_manager_xrandr_init_monitors(MetaMonitorManagerXrandr *manager_xrandr)
|
||||||
|
{
|
||||||
|
XRRMonitorInfo *m;
|
||||||
|
int n, i;
|
||||||
|
|
||||||
|
if (manager_xrandr->has_randr15 == FALSE)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* delete any tiled monitors setup, as mutter will want to recreate
|
||||||
|
things in its image */
|
||||||
|
m = XRRGetMonitors (manager_xrandr->xdisplay,
|
||||||
|
DefaultRootWindow (manager_xrandr->xdisplay),
|
||||||
|
FALSE, &n);
|
||||||
|
if (n == -1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (i = 0; i < n; i++)
|
||||||
|
{
|
||||||
|
if (m[i].noutput > 1)
|
||||||
|
XRRDeleteMonitor (manager_xrandr->xdisplay,
|
||||||
|
DefaultRootWindow (manager_xrandr->xdisplay),
|
||||||
|
m[i].name);
|
||||||
|
}
|
||||||
|
XRRFreeMonitors (m);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_monitor_manager_xrandr_init (MetaMonitorManagerXrandr *manager_xrandr)
|
meta_monitor_manager_xrandr_init (MetaMonitorManagerXrandr *manager_xrandr)
|
||||||
{
|
{
|
||||||
@@ -1176,6 +1426,7 @@ meta_monitor_manager_xrandr_init (MetaMonitorManagerXrandr *manager_xrandr)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
int major_version, minor_version;
|
||||||
/* We only use ScreenChangeNotify, but GDK uses the others,
|
/* We only use ScreenChangeNotify, but GDK uses the others,
|
||||||
and we don't want to step on its toes */
|
and we don't want to step on its toes */
|
||||||
XRRSelectInput (manager_xrandr->xdisplay,
|
XRRSelectInput (manager_xrandr->xdisplay,
|
||||||
@@ -1183,6 +1434,17 @@ meta_monitor_manager_xrandr_init (MetaMonitorManagerXrandr *manager_xrandr)
|
|||||||
RRScreenChangeNotifyMask
|
RRScreenChangeNotifyMask
|
||||||
| RRCrtcChangeNotifyMask
|
| RRCrtcChangeNotifyMask
|
||||||
| RROutputPropertyNotifyMask);
|
| RROutputPropertyNotifyMask);
|
||||||
|
|
||||||
|
manager_xrandr->has_randr15 = FALSE;
|
||||||
|
XRRQueryVersion (manager_xrandr->xdisplay, &major_version,
|
||||||
|
&minor_version);
|
||||||
|
#ifdef HAVE_XRANDR15
|
||||||
|
if (major_version > 1 ||
|
||||||
|
(major_version == 1 &&
|
||||||
|
minor_version >= 5))
|
||||||
|
manager_xrandr->has_randr15 = TRUE;
|
||||||
|
meta_monitor_manager_xrandr_init_monitors (manager_xrandr);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1213,6 +1475,10 @@ meta_monitor_manager_xrandr_class_init (MetaMonitorManagerXrandrClass *klass)
|
|||||||
manager_class->change_backlight = meta_monitor_manager_xrandr_change_backlight;
|
manager_class->change_backlight = meta_monitor_manager_xrandr_change_backlight;
|
||||||
manager_class->get_crtc_gamma = meta_monitor_manager_xrandr_get_crtc_gamma;
|
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->set_crtc_gamma = meta_monitor_manager_xrandr_set_crtc_gamma;
|
||||||
|
#ifdef HAVE_XRANDR15
|
||||||
|
manager_class->add_monitor = meta_monitor_manager_xrandr_add_monitor;
|
||||||
|
manager_class->delete_monitor = meta_monitor_manager_xrandr_delete_monitor;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
#ifndef META_MONITOR_MANAGER_XRANDR_H
|
#ifndef META_MONITOR_MANAGER_XRANDR_H
|
||||||
#define META_MONITOR_MANAGER_XRANDR_H
|
#define META_MONITOR_MANAGER_XRANDR_H
|
||||||
|
|
||||||
#include "meta-monitor-manager.h"
|
#include "meta-monitor-manager-private.h"
|
||||||
|
|
||||||
#define META_TYPE_MONITOR_MANAGER_XRANDR (meta_monitor_manager_xrandr_get_type ())
|
#define META_TYPE_MONITOR_MANAGER_XRANDR (meta_monitor_manager_xrandr_get_type ())
|
||||||
#define META_MONITOR_MANAGER_XRANDR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_MONITOR_MANAGER_XRANDR, MetaMonitorManagerXrandr))
|
#define META_MONITOR_MANAGER_XRANDR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_MONITOR_MANAGER_XRANDR, MetaMonitorManagerXrandr))
|
||||||
|
|||||||
89
src/backends/x11/nested/meta-cursor-renderer-x11-nested.c
Normal file
89
src/backends/x11/nested/meta-cursor-renderer-x11-nested.c
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2015 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:
|
||||||
|
* Jonas Ådahl <jadahl@gmail.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#include "backends/x11/nested/meta-cursor-renderer-x11-nested.h"
|
||||||
|
|
||||||
|
#include "backends/x11/meta-backend-x11.h"
|
||||||
|
|
||||||
|
struct _MetaCursorRendererX11Nested
|
||||||
|
{
|
||||||
|
MetaCursorRenderer parent;
|
||||||
|
};
|
||||||
|
|
||||||
|
G_DEFINE_TYPE (MetaCursorRendererX11Nested, meta_cursor_renderer_x11_nested,
|
||||||
|
META_TYPE_CURSOR_RENDERER);
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
meta_cursor_renderer_x11_nested_update_cursor (MetaCursorRenderer *renderer,
|
||||||
|
MetaCursorSprite *cursor_sprite)
|
||||||
|
{
|
||||||
|
if (cursor_sprite)
|
||||||
|
meta_cursor_sprite_realize_texture (cursor_sprite);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static Cursor
|
||||||
|
create_empty_cursor (Display *xdisplay)
|
||||||
|
{
|
||||||
|
XcursorImage *image;
|
||||||
|
XcursorPixel *pixels;
|
||||||
|
Cursor xcursor;
|
||||||
|
|
||||||
|
image = XcursorImageCreate (1, 1);
|
||||||
|
if (image == NULL)
|
||||||
|
return None;
|
||||||
|
|
||||||
|
image->xhot = 0;
|
||||||
|
image->yhot = 0;
|
||||||
|
|
||||||
|
pixels = image->pixels;
|
||||||
|
pixels[0] = 0;
|
||||||
|
|
||||||
|
xcursor = XcursorImageLoadCursor (xdisplay, image);
|
||||||
|
XcursorImageDestroy (image);
|
||||||
|
|
||||||
|
return xcursor;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_cursor_renderer_x11_nested_init (MetaCursorRendererX11Nested *x11_nested)
|
||||||
|
{
|
||||||
|
MetaBackendX11 *backend = META_BACKEND_X11 (meta_get_backend ());
|
||||||
|
Window xwindow = meta_backend_x11_get_xwindow (backend);
|
||||||
|
Display *xdisplay = meta_backend_x11_get_xdisplay (backend);
|
||||||
|
|
||||||
|
Cursor empty_xcursor = create_empty_cursor (xdisplay);
|
||||||
|
XDefineCursor (xdisplay, xwindow, empty_xcursor);
|
||||||
|
XFreeCursor (xdisplay, empty_xcursor);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_cursor_renderer_x11_nested_class_init (MetaCursorRendererX11NestedClass *klass)
|
||||||
|
{
|
||||||
|
MetaCursorRendererClass *renderer_class = META_CURSOR_RENDERER_CLASS (klass);
|
||||||
|
|
||||||
|
renderer_class->update_cursor = meta_cursor_renderer_x11_nested_update_cursor;
|
||||||
|
}
|
||||||
38
src/backends/x11/nested/meta-cursor-renderer-x11-nested.h
Normal file
38
src/backends/x11/nested/meta-cursor-renderer-x11-nested.h
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2015 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:
|
||||||
|
* Jonas Ådahl <jadahl@gmail.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef META_CURSOR_RENDERER_X11_NESTED_NESTED_H
|
||||||
|
#define META_CURSOR_RENDERER_X11_NESTED_NESTED_H
|
||||||
|
|
||||||
|
#include <glib-object.h>
|
||||||
|
|
||||||
|
#include "backends/meta-cursor-renderer.h"
|
||||||
|
|
||||||
|
#define META_TYPE_CURSOR_RENDERER_X11_NESTED (meta_cursor_renderer_x11_nested_get_type ())
|
||||||
|
G_DECLARE_FINAL_TYPE (MetaCursorRendererX11Nested,
|
||||||
|
meta_cursor_renderer_x11_nested,
|
||||||
|
META, CURSOR_RENDERER_X11_NESTED,
|
||||||
|
MetaCursorRenderer);
|
||||||
|
|
||||||
|
#endif /* META_CURSOR_RENDERER_X11_NESTED_NESTED_H */
|
||||||
@@ -15,7 +15,8 @@ struct _MetaCompositor
|
|||||||
{
|
{
|
||||||
MetaDisplay *display;
|
MetaDisplay *display;
|
||||||
|
|
||||||
guint repaint_func_id;
|
guint pre_paint_func_id;
|
||||||
|
guint post_paint_func_id;
|
||||||
|
|
||||||
gint64 server_time_query_time;
|
gint64 server_time_query_time;
|
||||||
gint64 server_time_offset;
|
gint64 server_time_offset;
|
||||||
@@ -40,6 +41,7 @@ struct _MetaCompositor
|
|||||||
MetaPluginManager *plugin_mgr;
|
MetaPluginManager *plugin_mgr;
|
||||||
|
|
||||||
gboolean frame_has_updated_xsurfaces;
|
gboolean frame_has_updated_xsurfaces;
|
||||||
|
gboolean have_x11_sync_object;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Wait 2ms after vblank before starting to draw next frame */
|
/* Wait 2ms after vblank before starting to draw next frame */
|
||||||
|
|||||||
@@ -37,11 +37,6 @@
|
|||||||
* compositor needs to delay hiding the windows until the switch
|
* compositor needs to delay hiding the windows until the switch
|
||||||
* workspace animation completes.
|
* workspace animation completes.
|
||||||
*
|
*
|
||||||
* meta_compositor_maximize_window() and meta_compositor_unmaximize_window()
|
|
||||||
* are transitions within the visible state. The window is resized __before__
|
|
||||||
* the call, so it may be necessary to readjust the display based on the
|
|
||||||
* old_rect to start the animation.
|
|
||||||
*
|
|
||||||
* # Containers #
|
* # Containers #
|
||||||
*
|
*
|
||||||
* There's two containers in the stage that are used to place window actors, here
|
* There's two containers in the stage that are used to place window actors, here
|
||||||
@@ -79,6 +74,7 @@
|
|||||||
#include "frame.h"
|
#include "frame.h"
|
||||||
#include <X11/extensions/shape.h>
|
#include <X11/extensions/shape.h>
|
||||||
#include <X11/extensions/Xcomposite.h>
|
#include <X11/extensions/Xcomposite.h>
|
||||||
|
#include "meta-sync-ring.h"
|
||||||
|
|
||||||
#include "backends/x11/meta-backend-x11.h"
|
#include "backends/x11/meta-backend-x11.h"
|
||||||
|
|
||||||
@@ -125,7 +121,11 @@ meta_switch_workspace_completed (MetaCompositor *compositor)
|
|||||||
void
|
void
|
||||||
meta_compositor_destroy (MetaCompositor *compositor)
|
meta_compositor_destroy (MetaCompositor *compositor)
|
||||||
{
|
{
|
||||||
clutter_threads_remove_repaint_func (compositor->repaint_func_id);
|
clutter_threads_remove_repaint_func (compositor->pre_paint_func_id);
|
||||||
|
clutter_threads_remove_repaint_func (compositor->post_paint_func_id);
|
||||||
|
|
||||||
|
if (compositor->have_x11_sync_object)
|
||||||
|
meta_sync_ring_destroy ();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -468,13 +468,11 @@ meta_compositor_manage (MetaCompositor *compositor)
|
|||||||
MetaDisplay *display = compositor->display;
|
MetaDisplay *display = compositor->display;
|
||||||
Display *xdisplay = display->xdisplay;
|
Display *xdisplay = display->xdisplay;
|
||||||
MetaScreen *screen = display->screen;
|
MetaScreen *screen = display->screen;
|
||||||
|
MetaBackend *backend = meta_get_backend ();
|
||||||
|
|
||||||
meta_screen_set_cm_selection (display->screen);
|
meta_screen_set_cm_selection (display->screen);
|
||||||
|
|
||||||
{
|
|
||||||
MetaBackend *backend = meta_get_backend ();
|
|
||||||
compositor->stage = meta_backend_get_stage (backend);
|
compositor->stage = meta_backend_get_stage (backend);
|
||||||
}
|
|
||||||
|
|
||||||
/* We use connect_after() here to accomodate code in GNOME Shell that,
|
/* We use connect_after() here to accomodate code in GNOME Shell that,
|
||||||
* when benchmarking drawing performance, connects to ::after-paint
|
* when benchmarking drawing performance, connects to ::after-paint
|
||||||
@@ -510,7 +508,7 @@ meta_compositor_manage (MetaCompositor *compositor)
|
|||||||
|
|
||||||
compositor->output = screen->composite_overlay_window;
|
compositor->output = screen->composite_overlay_window;
|
||||||
|
|
||||||
xwin = meta_backend_x11_get_xwindow (META_BACKEND_X11 (meta_get_backend ()));
|
xwin = meta_backend_x11_get_xwindow (META_BACKEND_X11 (backend));
|
||||||
|
|
||||||
XReparentWindow (xdisplay, xwin, compositor->output, 0, 0);
|
XReparentWindow (xdisplay, xwin, compositor->output, 0, 0);
|
||||||
|
|
||||||
@@ -530,6 +528,8 @@ meta_compositor_manage (MetaCompositor *compositor)
|
|||||||
* contents until we show the stage.
|
* contents until we show the stage.
|
||||||
*/
|
*/
|
||||||
XMapWindow (xdisplay, compositor->output);
|
XMapWindow (xdisplay, compositor->output);
|
||||||
|
|
||||||
|
compositor->have_x11_sync_object = meta_sync_ring_init (xdisplay);
|
||||||
}
|
}
|
||||||
|
|
||||||
redirect_windows (display->screen);
|
redirect_windows (display->screen);
|
||||||
@@ -614,6 +614,7 @@ set_unredirected_window (MetaCompositor *compositor,
|
|||||||
meta_window_actor_set_unredirected (window_actor, FALSE);
|
meta_window_actor_set_unredirected (window_actor, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
meta_shape_cow_for_window (compositor, window);
|
||||||
compositor->unredirected_window = window;
|
compositor->unredirected_window = window;
|
||||||
|
|
||||||
if (compositor->unredirected_window != NULL)
|
if (compositor->unredirected_window != NULL)
|
||||||
@@ -621,8 +622,6 @@ set_unredirected_window (MetaCompositor *compositor,
|
|||||||
MetaWindowActor *window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (compositor->unredirected_window));
|
MetaWindowActor *window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (compositor->unredirected_window));
|
||||||
meta_window_actor_set_unredirected (window_actor, TRUE);
|
meta_window_actor_set_unredirected (window_actor, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
meta_shape_cow_for_window (compositor, compositor->unredirected_window);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -732,6 +731,9 @@ meta_compositor_process_event (MetaCompositor *compositor,
|
|||||||
process_damage (compositor, (XDamageNotifyEvent *) event, window);
|
process_damage (compositor, (XDamageNotifyEvent *) event, window);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (compositor->have_x11_sync_object)
|
||||||
|
meta_sync_ring_handle_event (event);
|
||||||
|
|
||||||
/* Clutter needs to know about MapNotify events otherwise it will
|
/* Clutter needs to know about MapNotify events otherwise it will
|
||||||
think the stage is invisible */
|
think the stage is invisible */
|
||||||
if (!meta_is_wayland_compositor () && event->type == MapNotify)
|
if (!meta_is_wayland_compositor () && event->type == MapNotify)
|
||||||
@@ -770,23 +772,14 @@ meta_compositor_hide_window (MetaCompositor *compositor,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_compositor_maximize_window (MetaCompositor *compositor,
|
meta_compositor_size_change_window (MetaCompositor *compositor,
|
||||||
MetaWindow *window,
|
MetaWindow *window,
|
||||||
MetaRectangle *old_rect,
|
MetaSizeChange which_change,
|
||||||
MetaRectangle *new_rect)
|
MetaRectangle *old_frame_rect,
|
||||||
|
MetaRectangle *old_buffer_rect)
|
||||||
{
|
{
|
||||||
MetaWindowActor *window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (window));
|
MetaWindowActor *window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (window));
|
||||||
meta_window_actor_maximize (window_actor, old_rect, new_rect);
|
meta_window_actor_size_change (window_actor, which_change, old_frame_rect, old_buffer_rect);
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
meta_compositor_unmaximize_window (MetaCompositor *compositor,
|
|
||||||
MetaWindow *window,
|
|
||||||
MetaRectangle *old_rect,
|
|
||||||
MetaRectangle *new_rect)
|
|
||||||
{
|
|
||||||
MetaWindowActor *window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (window));
|
|
||||||
meta_window_actor_unmaximize (window_actor, old_rect, new_rect);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -1045,11 +1038,12 @@ frame_callback (CoglOnscreen *onscreen,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static gboolean
|
||||||
pre_paint_windows (MetaCompositor *compositor)
|
meta_pre_paint_func (gpointer data)
|
||||||
{
|
{
|
||||||
GList *l;
|
GList *l;
|
||||||
MetaWindowActor *top_window;
|
MetaWindowActor *top_window;
|
||||||
|
MetaCompositor *compositor = data;
|
||||||
|
|
||||||
if (compositor->onscreen == NULL)
|
if (compositor->onscreen == NULL)
|
||||||
{
|
{
|
||||||
@@ -1061,7 +1055,7 @@ pre_paint_windows (MetaCompositor *compositor)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (compositor->windows == NULL)
|
if (compositor->windows == NULL)
|
||||||
return;
|
return TRUE;
|
||||||
|
|
||||||
top_window = g_list_last (compositor->windows)->data;
|
top_window = g_list_last (compositor->windows)->data;
|
||||||
|
|
||||||
@@ -1078,10 +1072,12 @@ pre_paint_windows (MetaCompositor *compositor)
|
|||||||
{
|
{
|
||||||
/* We need to make sure that any X drawing that happens before
|
/* We need to make sure that any X drawing that happens before
|
||||||
* the XDamageSubtract() for each window above is visible to
|
* the XDamageSubtract() for each window above is visible to
|
||||||
* subsequent GL rendering; the only standardized way to do this
|
* subsequent GL rendering; the standardized way to do this is
|
||||||
* is EXT_x11_sync_object, which isn't yet widely available. For
|
* GL_EXT_X11_sync_object. Since this isn't implemented yet in
|
||||||
* now, we count on details of Xorg and the open source drivers,
|
* mesa, we also have a path that relies on the implementation
|
||||||
* and hope for the best otherwise.
|
* of the open source drivers.
|
||||||
|
*
|
||||||
|
* Anything else, we just hope for the best.
|
||||||
*
|
*
|
||||||
* Xorg and open source driver specifics:
|
* Xorg and open source driver specifics:
|
||||||
*
|
*
|
||||||
@@ -1096,17 +1092,28 @@ pre_paint_windows (MetaCompositor *compositor)
|
|||||||
* round trip request at this point is sufficient to flush the
|
* round trip request at this point is sufficient to flush the
|
||||||
* GLX buffers.
|
* GLX buffers.
|
||||||
*/
|
*/
|
||||||
|
if (compositor->have_x11_sync_object)
|
||||||
|
compositor->have_x11_sync_object = meta_sync_ring_insert_wait ();
|
||||||
|
else
|
||||||
XSync (compositor->display->xdisplay, False);
|
XSync (compositor->display->xdisplay, False);
|
||||||
|
|
||||||
compositor->frame_has_updated_xsurfaces = FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
meta_repaint_func (gpointer data)
|
meta_post_paint_func (gpointer data)
|
||||||
{
|
{
|
||||||
MetaCompositor *compositor = data;
|
MetaCompositor *compositor = data;
|
||||||
pre_paint_windows (compositor);
|
|
||||||
|
if (compositor->frame_has_updated_xsurfaces)
|
||||||
|
{
|
||||||
|
if (compositor->have_x11_sync_object)
|
||||||
|
compositor->have_x11_sync_object = meta_sync_ring_after_frame ();
|
||||||
|
|
||||||
|
compositor->frame_has_updated_xsurfaces = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1141,10 +1148,16 @@ meta_compositor_new (MetaDisplay *display)
|
|||||||
G_CALLBACK (on_shadow_factory_changed),
|
G_CALLBACK (on_shadow_factory_changed),
|
||||||
compositor);
|
compositor);
|
||||||
|
|
||||||
compositor->repaint_func_id = clutter_threads_add_repaint_func (meta_repaint_func,
|
compositor->pre_paint_func_id =
|
||||||
|
clutter_threads_add_repaint_func_full (CLUTTER_REPAINT_FLAGS_PRE_PAINT,
|
||||||
|
meta_pre_paint_func,
|
||||||
|
compositor,
|
||||||
|
NULL);
|
||||||
|
compositor->post_paint_func_id =
|
||||||
|
clutter_threads_add_repaint_func_full (CLUTTER_REPAINT_FLAGS_POST_PAINT,
|
||||||
|
meta_post_paint_func,
|
||||||
compositor,
|
compositor,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
return compositor;
|
return compositor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -115,7 +115,7 @@ typedef enum {
|
|||||||
#define FRAGMENT_SHADER_CODE \
|
#define FRAGMENT_SHADER_CODE \
|
||||||
"float t = 2.0 * length(position);\n" \
|
"float t = 2.0 * length(position);\n" \
|
||||||
"t = min(t, 1.0);\n" \
|
"t = min(t, 1.0);\n" \
|
||||||
"float pixel_brightness = 1 - t * vignette_sharpness;\n" \
|
"float pixel_brightness = 1.0 - t * vignette_sharpness;\n" \
|
||||||
"cogl_color_out.rgb = cogl_color_out.rgb * pixel_brightness;\n" \
|
"cogl_color_out.rgb = cogl_color_out.rgb * pixel_brightness;\n" \
|
||||||
|
|
||||||
typedef struct _MetaBackgroundLayer MetaBackgroundLayer;
|
typedef struct _MetaBackgroundLayer MetaBackgroundLayer;
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user