Compare commits
465 Commits
wip/waylan
...
wip/xdg-sh
Author | SHA1 | Date | |
---|---|---|---|
![]() |
c9e225822c | ||
![]() |
1689de7015 | ||
![]() |
47f4c9db7b | ||
![]() |
4c621cc30f | ||
![]() |
756a412436 | ||
![]() |
be16c2fe71 | ||
![]() |
a364c2a96b | ||
![]() |
414259a7f8 | ||
![]() |
283a81eac0 | ||
![]() |
2a145262c7 | ||
![]() |
57728b4322 | ||
![]() |
ef24fb6296 | ||
![]() |
86f057a712 | ||
![]() |
dcd628d289 | ||
![]() |
6038877c4c | ||
![]() |
4e6321c239 | ||
![]() |
304a525744 | ||
![]() |
f26de405dd | ||
![]() |
ed18580118 | ||
![]() |
b65649186d | ||
![]() |
515dc08a97 | ||
![]() |
2e7a56a28f | ||
![]() |
c485637a61 | ||
![]() |
f9f2a82e18 | ||
![]() |
2f4563132a | ||
![]() |
e3a0f2c546 | ||
![]() |
d39baeb8ad | ||
![]() |
f27f6aab78 | ||
![]() |
a66060e21a | ||
![]() |
11aa3c030b | ||
![]() |
bd1bec5617 | ||
![]() |
d9659d4b36 | ||
![]() |
d043d9943b | ||
![]() |
a0ef7c7142 | ||
![]() |
4efe4483fb | ||
![]() |
aec3edb1cc | ||
![]() |
0c5a6ad775 | ||
![]() |
2be5401b1e | ||
![]() |
f16e9b2ee7 | ||
![]() |
06380938d4 | ||
![]() |
87b20d7f2a | ||
![]() |
593db0baee | ||
![]() |
6b66553493 | ||
![]() |
ddaae9c923 | ||
![]() |
0c7a7d7527 | ||
![]() |
6561b53346 | ||
![]() |
def5e86673 | ||
![]() |
0c213c8fee | ||
![]() |
912a0abd26 | ||
![]() |
d694260ad2 | ||
![]() |
8566566451 | ||
![]() |
0ce64e46e8 | ||
![]() |
a8336669a3 | ||
![]() |
f6db756326 | ||
![]() |
27ab516f41 | ||
![]() |
9542b464bf | ||
![]() |
1ebaaa1950 | ||
![]() |
71efbf0330 | ||
![]() |
a6539463be | ||
![]() |
b8e096db82 | ||
![]() |
3e98ffaf99 | ||
![]() |
0a9754f305 | ||
![]() |
965a784c8a | ||
![]() |
2db9f55669 | ||
![]() |
3e73babaf7 | ||
![]() |
66c4555dc7 | ||
![]() |
183ad75603 | ||
![]() |
66fc32ee14 | ||
![]() |
d6396cf2c4 | ||
![]() |
c9b7104117 | ||
![]() |
6bf1a66b7c | ||
![]() |
7e7b671b8e | ||
![]() |
e04a55d1a2 | ||
![]() |
8905bd2280 | ||
![]() |
b09e1399c0 | ||
![]() |
59c8b949ad | ||
![]() |
6dbb3fddce | ||
![]() |
f166240225 | ||
![]() |
91b789c707 | ||
![]() |
14db280fab | ||
![]() |
f7097e6f66 | ||
![]() |
ff89f1e271 | ||
![]() |
6a8a4bfdcd | ||
![]() |
cd35982d4e | ||
![]() |
2f6f0f252c | ||
![]() |
13651949ed | ||
![]() |
fdeb72224c | ||
![]() |
92e36e7076 | ||
![]() |
d74796ee80 | ||
![]() |
3e35cac67a | ||
![]() |
1f7a6bf845 | ||
![]() |
365442c1ff | ||
![]() |
c8d185fc74 | ||
![]() |
9567fa9c6a | ||
![]() |
7a8de0c0af | ||
![]() |
10fead9ba1 | ||
![]() |
d5d5c2167a | ||
![]() |
b9755ea725 | ||
![]() |
39fee9f5a2 | ||
![]() |
d6282716b2 | ||
![]() |
60d9bee3bf | ||
![]() |
a09fa3b0e4 | ||
![]() |
9edff6f250 | ||
![]() |
7d3012fd67 | ||
![]() |
225e20a898 | ||
![]() |
1a62ac9276 | ||
![]() |
45cb151443 | ||
![]() |
55b18f9671 | ||
![]() |
4f4b1bfc37 | ||
![]() |
9348c9bd4b | ||
![]() |
16de7f66fb | ||
![]() |
799c27484d | ||
![]() |
c3b0faec82 | ||
![]() |
9c876722a0 | ||
![]() |
96fc93d744 | ||
![]() |
20545941fa | ||
![]() |
59f79e8294 | ||
![]() |
ac32b9ef95 | ||
![]() |
ba484be754 | ||
![]() |
a318198ab4 | ||
![]() |
e6391c2896 | ||
![]() |
7ea537fad7 | ||
![]() |
03146c2967 | ||
![]() |
0a81314337 | ||
![]() |
fa7a5782c6 | ||
![]() |
e3b64912b6 | ||
![]() |
a0fe392665 | ||
![]() |
0e5f365d55 | ||
![]() |
bfc906cbc4 | ||
![]() |
8e6f8087e8 | ||
![]() |
56207ddb6a | ||
![]() |
8cb9cfb7b8 | ||
![]() |
be698b597b | ||
![]() |
1d61a0f9b5 | ||
![]() |
788bd59857 | ||
![]() |
2391606cc5 | ||
![]() |
7155d7e043 | ||
![]() |
419dfd333a | ||
![]() |
b4535f2622 | ||
![]() |
9b21346427 | ||
![]() |
7b15d21e40 | ||
![]() |
7b597b8c62 | ||
![]() |
7a4adce44f | ||
![]() |
a5f0db5ecb | ||
![]() |
577624adef | ||
![]() |
af46ef3b96 | ||
![]() |
39d26be941 | ||
![]() |
7bfc9109f7 | ||
![]() |
becbad56ef | ||
![]() |
384a34c27d | ||
![]() |
002c5b8f87 | ||
![]() |
1d3dbea20c | ||
![]() |
ebe6e3180e | ||
![]() |
a3de799939 | ||
![]() |
0caf7381bb | ||
![]() |
a42305edab | ||
![]() |
732c059235 | ||
![]() |
ef2b6e7d00 | ||
![]() |
9c1b972ca1 | ||
![]() |
cb33e1942a | ||
![]() |
7009d1e470 | ||
![]() |
c54a19825b | ||
![]() |
8131f34eb6 | ||
![]() |
f29241d90e | ||
![]() |
bad48ea815 | ||
![]() |
66af41f4a9 | ||
![]() |
e30be380dd | ||
![]() |
65f2e29375 | ||
![]() |
98dbba1e17 | ||
![]() |
422648e2eb | ||
![]() |
f0fa4d831a | ||
![]() |
1b600f5867 | ||
![]() |
fd8cc9b7a8 | ||
![]() |
ca5b5e6bc4 | ||
![]() |
ee683ff187 | ||
![]() |
57602adfe7 | ||
![]() |
1481836ed6 | ||
![]() |
309f78ff52 | ||
![]() |
6436459381 | ||
![]() |
65b39212d5 | ||
![]() |
283649b8d7 | ||
![]() |
fa65c380db | ||
![]() |
58b39233f5 | ||
![]() |
82066e02c5 | ||
![]() |
c36aa5e696 | ||
![]() |
29197d40c6 | ||
![]() |
8d5ab6b5b3 | ||
![]() |
a796938b39 | ||
![]() |
3813113f1a | ||
![]() |
1be117e430 | ||
![]() |
622c7a021b | ||
![]() |
4d2d2f285b | ||
![]() |
0924c7d61b | ||
![]() |
2746608eb2 | ||
![]() |
fe26cb5989 | ||
![]() |
602307e694 | ||
![]() |
b2c18c4a78 | ||
![]() |
1e211722c7 | ||
![]() |
461f74ef18 | ||
![]() |
3f022ca963 | ||
![]() |
20e92c5a72 | ||
![]() |
0850da44d7 | ||
![]() |
37ba264190 | ||
![]() |
6c12c928df | ||
![]() |
9c5733caf0 | ||
![]() |
21d8b8310a | ||
![]() |
c46af91d54 | ||
![]() |
d44574f738 | ||
![]() |
a9424255a5 | ||
![]() |
5089a63d76 | ||
![]() |
f9a2c64460 | ||
![]() |
7841042a85 | ||
![]() |
ea1b8cdc22 | ||
![]() |
52b48cfbef | ||
![]() |
644f3e1275 | ||
![]() |
304005e04f | ||
![]() |
025ab35af7 | ||
![]() |
a27744503b | ||
![]() |
1011331caf | ||
![]() |
0ccef81789 | ||
![]() |
4780f74a40 | ||
![]() |
57866fb267 | ||
![]() |
d3bc7570d0 | ||
![]() |
74e43a4702 | ||
![]() |
0764b2058a | ||
![]() |
7a787d7946 | ||
![]() |
eec0f5df47 | ||
![]() |
ba3968a822 | ||
![]() |
762fa0e116 | ||
![]() |
0be57b621b | ||
![]() |
7d88b3593b | ||
![]() |
858db7081a | ||
![]() |
5af7f619c8 | ||
![]() |
e5e35e5a7f | ||
![]() |
6d639ac528 | ||
![]() |
aa3643cdde | ||
![]() |
8a3501ffe1 | ||
![]() |
5ea443eb4b | ||
![]() |
a37a8c6497 | ||
![]() |
ebf6862a10 | ||
![]() |
6c0e16c482 | ||
![]() |
40b1e7312d | ||
![]() |
1c0e6f26e2 | ||
![]() |
f4fc498e65 | ||
![]() |
a8632c2546 | ||
![]() |
600a0f836f | ||
![]() |
0ac142d39e | ||
![]() |
abd368be00 | ||
![]() |
a8ac2cc275 | ||
![]() |
2f14b5cc3f | ||
![]() |
2930612e64 | ||
![]() |
2952d3671d | ||
![]() |
1b5ace8256 | ||
![]() |
2ebecc5370 | ||
![]() |
02144d17e9 | ||
![]() |
71496c8909 | ||
![]() |
594b15abf1 | ||
![]() |
bbe3641844 | ||
![]() |
0cc5cf940b | ||
![]() |
153d8efcf5 | ||
![]() |
be744775c1 | ||
![]() |
5959457c73 | ||
![]() |
0824eb7c96 | ||
![]() |
d945501be6 | ||
![]() |
ca342c4573 | ||
![]() |
4326d0bf3a | ||
![]() |
a6ebc70170 | ||
![]() |
3025cb7c48 | ||
![]() |
17f48baf3a | ||
![]() |
333661a9d8 | ||
![]() |
b9da43b753 | ||
![]() |
097ee776c7 | ||
![]() |
a4a8f1f863 | ||
![]() |
f36a627330 | ||
![]() |
a1087c3f30 | ||
![]() |
aad275b9a2 | ||
![]() |
f0397eab94 | ||
![]() |
392e224831 | ||
![]() |
6867d44573 | ||
![]() |
a841fff2ac | ||
![]() |
26aa10a974 | ||
![]() |
f6144082b1 | ||
![]() |
957513242c | ||
![]() |
17fd25e216 | ||
![]() |
e91268a250 | ||
![]() |
82cb4e8267 | ||
![]() |
68eb87cc58 | ||
![]() |
f3e52d5b18 | ||
![]() |
2b2b2d3191 | ||
![]() |
9461c612de | ||
![]() |
f0280a8868 | ||
![]() |
c749f7b6fb | ||
![]() |
74462133ca | ||
![]() |
7c45d6594c | ||
![]() |
ea916b6c49 | ||
![]() |
a02d734243 | ||
![]() |
735b736110 | ||
![]() |
bbbb9ac53c | ||
![]() |
8dd97b4998 | ||
![]() |
73a9082062 | ||
![]() |
4091f5493d | ||
![]() |
d96b053c9d | ||
![]() |
1f569bef76 | ||
![]() |
1a88176cc0 | ||
![]() |
662c9729bc | ||
![]() |
56a0dd6b2c | ||
![]() |
9dc6028b3d | ||
![]() |
932e913d88 | ||
![]() |
b72315e27a | ||
![]() |
3c7cd1f38c | ||
![]() |
1946c548bf | ||
![]() |
cf181fe109 | ||
![]() |
63b9110f93 | ||
![]() |
ae44bff0b1 | ||
![]() |
23ba3e527f | ||
![]() |
08df9bf559 | ||
![]() |
648639fffe | ||
![]() |
6cc014a941 | ||
![]() |
b7b95123ed | ||
![]() |
153463790a | ||
![]() |
875bbec949 | ||
![]() |
666e5f1f98 | ||
![]() |
e6790038dd | ||
![]() |
e86c53230f | ||
![]() |
4ea4658abf | ||
![]() |
58f6ab0a27 | ||
![]() |
9c0cc664d1 | ||
![]() |
84d26e31f1 | ||
![]() |
64a848fcb7 | ||
![]() |
429583ae8b | ||
![]() |
93ae868987 | ||
![]() |
72a900787f | ||
![]() |
7186841db0 | ||
![]() |
ab080e3e6b | ||
![]() |
ad84aef766 | ||
![]() |
7908eca579 | ||
![]() |
237d990dea | ||
![]() |
78fcfec5c1 | ||
![]() |
1bd3a162f8 | ||
![]() |
918cfdcbda | ||
![]() |
cd76313297 | ||
![]() |
dc8231c2cf | ||
![]() |
4d01eb3a23 | ||
![]() |
35f47b211d | ||
![]() |
77046edf21 | ||
![]() |
488df061c7 | ||
![]() |
21d511e50f | ||
![]() |
15e83f0c2f | ||
![]() |
a23830fd13 | ||
![]() |
c8bf8c17be | ||
![]() |
d82e24981b | ||
![]() |
01b8ffac5d | ||
![]() |
1fa56bd7e0 | ||
![]() |
c3f28b9cdb | ||
![]() |
dc4e1d4cd1 | ||
![]() |
d69553e8f5 | ||
![]() |
0ead0d945a | ||
![]() |
c24d9bf142 | ||
![]() |
a6bf340ff8 | ||
![]() |
35ef7c95b2 | ||
![]() |
348f3007d9 | ||
![]() |
52e2a1226e | ||
![]() |
58622c0515 | ||
![]() |
cb5e1e2776 | ||
![]() |
e965cf32d4 | ||
![]() |
ce5e0b20b5 | ||
![]() |
90854a0f80 | ||
![]() |
2d9dc143fc | ||
![]() |
1e52d2aa9c | ||
![]() |
2734c8547f | ||
![]() |
cc0b093f7a | ||
![]() |
d25275fa8d | ||
![]() |
389e04c715 | ||
![]() |
24074a81d0 | ||
![]() |
c0e7f6d9bf | ||
![]() |
9a13b857f4 | ||
![]() |
776a86a65f | ||
![]() |
76e2455d1b | ||
![]() |
81d9797544 | ||
![]() |
12d6c70000 | ||
![]() |
a7eaf43e18 | ||
![]() |
514fec7275 | ||
![]() |
42a5f4f479 | ||
![]() |
6c1feedbdf | ||
![]() |
2d21fbbd35 | ||
![]() |
7baf687499 | ||
![]() |
a3e44d13d1 | ||
![]() |
65db8efbe8 | ||
![]() |
e48a5cd5f2 | ||
![]() |
698bb24848 | ||
![]() |
67fff237e6 | ||
![]() |
b9247b4b2f | ||
![]() |
0394b4a82b | ||
![]() |
ff7c85c599 | ||
![]() |
c316ad17a4 | ||
![]() |
fc108d5052 | ||
![]() |
8c0d38a1a1 | ||
![]() |
2f9c6c4146 | ||
![]() |
72ca2b218d | ||
![]() |
7360aece74 | ||
![]() |
b5f3238f6f | ||
![]() |
227fb56103 | ||
![]() |
5ae52473c9 | ||
![]() |
7b537d6b8f | ||
![]() |
4494888b82 | ||
![]() |
004ee2d3b5 | ||
![]() |
168ea64a45 | ||
![]() |
73ee491281 | ||
![]() |
95a9655412 | ||
![]() |
72b6699efb | ||
![]() |
3e341e83d9 | ||
![]() |
5b3340e585 | ||
![]() |
6f4f611ba8 | ||
![]() |
450afbaf51 | ||
![]() |
28708e4317 | ||
![]() |
9f64f2cf4f | ||
![]() |
2b1eb206d3 | ||
![]() |
a6dc454c49 | ||
![]() |
c2bf44fa19 | ||
![]() |
2d67b01c3a | ||
![]() |
6014d31dea | ||
![]() |
bf78f067a2 | ||
![]() |
ddb9929dad | ||
![]() |
2098ec2d16 | ||
![]() |
97eece6607 | ||
![]() |
7ac9a6e241 | ||
![]() |
b53bf0e8c2 | ||
![]() |
a26ded47d9 | ||
![]() |
cad9e14463 | ||
![]() |
806d5939e3 | ||
![]() |
0f0c23fbab | ||
![]() |
5d1fcc26c0 | ||
![]() |
cbe5b6b3bc | ||
![]() |
590cf4e832 | ||
![]() |
22ca820c44 | ||
![]() |
b1206ceb66 | ||
![]() |
ad4053ab84 | ||
![]() |
7bd4e6ecb0 | ||
![]() |
deeb1db1ac | ||
![]() |
7eb4bfbea3 | ||
![]() |
59b274f12f | ||
![]() |
e311cef013 | ||
![]() |
e72f81c24f | ||
![]() |
96fa518576 | ||
![]() |
e263b3624c | ||
![]() |
1c34f0b342 | ||
![]() |
2d27873f98 | ||
![]() |
fd40a12213 | ||
![]() |
57406e0a9e | ||
![]() |
1987cbb764 | ||
![]() |
705978405b | ||
![]() |
daba05f6a7 | ||
![]() |
1a7984be43 | ||
![]() |
1b3c77d53a | ||
![]() |
5b0f0d9e5b | ||
![]() |
9816659fa9 | ||
![]() |
3b1b611634 | ||
![]() |
f08921bd0c | ||
![]() |
0089b5769c | ||
![]() |
452be05ea0 | ||
![]() |
69f038f7c7 | ||
![]() |
2d35e07fae | ||
![]() |
95e2d26d03 | ||
![]() |
f506e090ea | ||
![]() |
0697b53826 |
11
.gitignore
vendored
11
.gitignore
vendored
@@ -48,10 +48,11 @@ po/*.pot
|
|||||||
50-metacity-key.xml
|
50-metacity-key.xml
|
||||||
libmutter-wayland.pc
|
libmutter-wayland.pc
|
||||||
mutter-wayland
|
mutter-wayland
|
||||||
mutter-theme-viewer
|
mutter-launch
|
||||||
mutter-wayland.desktop
|
|
||||||
org.gnome.mutter.gschema.valid
|
org.gnome.mutter.gschema.valid
|
||||||
org.gnome.mutter.gschema.xml
|
org.gnome.mutter.gschema.xml
|
||||||
|
org.gnome.mutter.wayland.gschema.valid
|
||||||
|
org.gnome.mutter.wayland.gschema.xml
|
||||||
testasyncgetprop
|
testasyncgetprop
|
||||||
testboxes
|
testboxes
|
||||||
testgradient
|
testgradient
|
||||||
@@ -77,6 +78,12 @@ src/stamp-mutter-marshal.h
|
|||||||
src/meta-dbus-xrandr.[ch]
|
src/meta-dbus-xrandr.[ch]
|
||||||
src/meta-dbus-idle-monitor.[ch]
|
src/meta-dbus-idle-monitor.[ch]
|
||||||
src/mutter-plugins.pc
|
src/mutter-plugins.pc
|
||||||
|
src/wayland/gtk-shell-protocol.c
|
||||||
|
src/wayland/gtk-shell-server-protocol.h
|
||||||
|
src/wayland/xdg-shell-protocol.c
|
||||||
|
src/wayland/xdg-shell-server-protocol.h
|
||||||
|
src/wayland/xserver-protocol.c
|
||||||
|
src/wayland/xserver-server-protocol.h
|
||||||
doc/reference/*.args
|
doc/reference/*.args
|
||||||
doc/reference/*.bak
|
doc/reference/*.bak
|
||||||
doc/reference/*.hierarchy
|
doc/reference/*.hierarchy
|
||||||
|
41
COPYING
41
COPYING
@@ -1,12 +1,12 @@
|
|||||||
GNU GENERAL PUBLIC LICENSE
|
GNU GENERAL PUBLIC LICENSE
|
||||||
Version 2, June 1991
|
Version 2, June 1991
|
||||||
|
|
||||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
||||||
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
of this license document, but changing it is not allowed.
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
Preamble
|
Preamble
|
||||||
|
|
||||||
The licenses for most software are designed to take away your
|
The licenses for most software are designed to take away your
|
||||||
freedom to share and change it. By contrast, the GNU General Public
|
freedom to share and change it. By contrast, the GNU General Public
|
||||||
@@ -15,7 +15,7 @@ software--to make sure the software is free for all its users. This
|
|||||||
General Public License applies to most of the Free Software
|
General Public License applies to most of the Free Software
|
||||||
Foundation's software and to any other program whose authors commit to
|
Foundation's software and to any other program whose authors commit to
|
||||||
using it. (Some other Free Software Foundation software is covered by
|
using it. (Some other Free Software Foundation software is covered by
|
||||||
the GNU Library General Public License instead.) You can apply it to
|
the GNU Lesser General Public License instead.) You can apply it to
|
||||||
your programs, too.
|
your programs, too.
|
||||||
|
|
||||||
When we speak of free software, we are referring to freedom, not
|
When we speak of free software, we are referring to freedom, not
|
||||||
@@ -55,8 +55,8 @@ patent must be licensed for everyone's free use or not licensed at all.
|
|||||||
|
|
||||||
The precise terms and conditions for copying, distribution and
|
The precise terms and conditions for copying, distribution and
|
||||||
modification follow.
|
modification follow.
|
||||||
|
|
||||||
GNU GENERAL PUBLIC LICENSE
|
GNU GENERAL PUBLIC LICENSE
|
||||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
|
|
||||||
0. This License applies to any program or other work which contains
|
0. This License applies to any program or other work which contains
|
||||||
@@ -110,7 +110,7 @@ above, provided that you also meet all of these conditions:
|
|||||||
License. (Exception: if the Program itself is interactive but
|
License. (Exception: if the Program itself is interactive but
|
||||||
does not normally print such an announcement, your work based on
|
does not normally print such an announcement, your work based on
|
||||||
the Program is not required to print an announcement.)
|
the Program is not required to print an announcement.)
|
||||||
|
|
||||||
These requirements apply to the modified work as a whole. If
|
These requirements apply to the modified work as a whole. If
|
||||||
identifiable sections of that work are not derived from the Program,
|
identifiable sections of that work are not derived from the Program,
|
||||||
and can be reasonably considered independent and separate works in
|
and can be reasonably considered independent and separate works in
|
||||||
@@ -168,7 +168,7 @@ access to copy from a designated place, then offering equivalent
|
|||||||
access to copy the source code from the same place counts as
|
access to copy the source code from the same place counts as
|
||||||
distribution of the source code, even though third parties are not
|
distribution of the source code, even though third parties are not
|
||||||
compelled to copy the source along with the object code.
|
compelled to copy the source along with the object code.
|
||||||
|
|
||||||
4. You may not copy, modify, sublicense, or distribute the Program
|
4. You may not copy, modify, sublicense, or distribute the Program
|
||||||
except as expressly provided under this License. Any attempt
|
except as expressly provided under this License. Any attempt
|
||||||
otherwise to copy, modify, sublicense or distribute the Program is
|
otherwise to copy, modify, sublicense or distribute the Program is
|
||||||
@@ -225,7 +225,7 @@ impose that choice.
|
|||||||
|
|
||||||
This section is intended to make thoroughly clear what is believed to
|
This section is intended to make thoroughly clear what is believed to
|
||||||
be a consequence of the rest of this License.
|
be a consequence of the rest of this License.
|
||||||
|
|
||||||
8. If the distribution and/or use of the Program is restricted in
|
8. If the distribution and/or use of the Program is restricted in
|
||||||
certain countries either by patents or by copyrighted interfaces, the
|
certain countries either by patents or by copyrighted interfaces, the
|
||||||
original copyright holder who places the Program under this License
|
original copyright holder who places the Program under this License
|
||||||
@@ -255,7 +255,7 @@ make exceptions for this. Our decision will be guided by the two goals
|
|||||||
of preserving the free status of all derivatives of our free software and
|
of preserving the free status of all derivatives of our free software and
|
||||||
of promoting the sharing and reuse of software generally.
|
of promoting the sharing and reuse of software generally.
|
||||||
|
|
||||||
NO WARRANTY
|
NO WARRANTY
|
||||||
|
|
||||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||||
@@ -277,9 +277,9 @@ YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
|||||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||||
POSSIBILITY OF SUCH DAMAGES.
|
POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
How to Apply These Terms to Your New Programs
|
How to Apply These Terms to Your New Programs
|
||||||
|
|
||||||
If you develop a new program, and you want it to be of the greatest
|
If you develop a new program, and you want it to be of the greatest
|
||||||
possible use to the public, the best way to achieve this is to make it
|
possible use to the public, the best way to achieve this is to make it
|
||||||
@@ -303,17 +303,16 @@ the "copyright" line and a pointer to where the full notice is found.
|
|||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License along
|
||||||
along with this program; if not, write to the Free Software
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
If the program is interactive, make it output a short notice like this
|
If the program is interactive, make it output a short notice like this
|
||||||
when it starts in an interactive mode:
|
when it starts in an interactive mode:
|
||||||
|
|
||||||
Gnomovision version 69, Copyright (C) year name of author
|
Gnomovision version 69, Copyright (C) year name of author
|
||||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||||
This is free software, and you are welcome to redistribute it
|
This is free software, and you are welcome to redistribute it
|
||||||
under certain conditions; type `show c' for details.
|
under certain conditions; type `show c' for details.
|
||||||
@@ -336,5 +335,5 @@ necessary. Here is a sample; alter the names:
|
|||||||
This General Public License does not permit incorporating your program into
|
This General Public License does not permit incorporating your program into
|
||||||
proprietary programs. If your program is a subroutine library, you may
|
proprietary programs. If your program is a subroutine library, you may
|
||||||
consider it more useful to permit linking proprietary applications with the
|
consider it more useful to permit linking proprietary applications with the
|
||||||
library. If this is what you want to do, use the GNU Library General
|
library. If this is what you want to do, use the GNU Lesser General
|
||||||
Public License instead of this License.
|
Public License instead of this License.
|
||||||
|
@@ -1,8 +1,10 @@
|
|||||||
|
|
||||||
SUBDIRS=src protocol data po doc
|
SUBDIRS=src protocol po doc
|
||||||
|
|
||||||
EXTRA_DIST = HACKING MAINTAINERS rationales.txt
|
EXTRA_DIST = HACKING MAINTAINERS rationales.txt
|
||||||
|
|
||||||
DISTCLEANFILES = intltool-extract intltool-merge intltool-update po/stamp-it po/.intltool-merge-cache
|
DISTCLEANFILES = intltool-extract intltool-merge intltool-update po/stamp-it po/.intltool-merge-cache
|
||||||
|
|
||||||
DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc
|
DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc
|
||||||
|
|
||||||
|
ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS}
|
||||||
|
158
NEWS
158
NEWS
@@ -1,3 +1,161 @@
|
|||||||
|
3.11.5
|
||||||
|
======
|
||||||
|
* Fix CSD titlebars being placed off-screen [Jasper; #719772]
|
||||||
|
* Add support for subsurfaces [Jonas; #705502]
|
||||||
|
* Expose MetaWindow:skip-taskbar property [Florian; #723307]
|
||||||
|
* Fix legacy tray icons showing up blank [Adel; #721596]
|
||||||
|
* Fix configuration of cloned monitors [Adel; #710610]
|
||||||
|
* Misc bug fixes and cleanups [Jasper, Adel, Marek, Jonas; #720631, #723468,
|
||||||
|
#720818, #723563, #723564]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Jonas Ådahl, Marek Ch, Adel Gadllah, Florian Müllner, Jasper St. Pierre
|
||||||
|
|
||||||
|
3.11.4
|
||||||
|
======
|
||||||
|
* Don't leave focus on windows that are being unmanaged [Owen; #711618]
|
||||||
|
* Reduce server grabs [Daniel Drake; #721345, #721709]
|
||||||
|
* Improve heuristic to determine display output name [Cosimo Cecchi; #721674]
|
||||||
|
* Atomically unmaximize both directions [Jasper; #722108]
|
||||||
|
* Misc bug fixes [Debarshi, Andika, Florian; #721517, #721674, #722347]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Cosimo Cecchi, Daniel Drake, Florian Müllner, Debarshi Ray, Jasper St. Pierre,
|
||||||
|
Andika Triwidada, Owen W. Taylor
|
||||||
|
|
||||||
|
3.11.3
|
||||||
|
======
|
||||||
|
* Fix focus issues with external OSKs[Jasper; #715030]
|
||||||
|
* Add a MetaCullable interface [Jasper; #714706]
|
||||||
|
* Fix window keybindings [Rui; #719724]
|
||||||
|
* Fix settings keyboard/pointer focus for new clients [Rui; #719725]
|
||||||
|
* Fix window group paint volume [Owen; #719669]
|
||||||
|
* Fix frame extents problems [Owen; #714707]
|
||||||
|
* Add shortcut to move windows between monitors [Florian; #671054]
|
||||||
|
* Fix problems with focus tracking [Owen; #720558]
|
||||||
|
* Misc. bug fixes and cleanups: [Rui, Colin, Lionel, Jasper, Owen; #712833,
|
||||||
|
#719557, #719695, #719833, #678989, #720417, #720630]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Lionel Landwerlin, Rui Matos, Alberto Milone, Florian Müllner,
|
||||||
|
Jasper St. Pierre, Rico Tzschichholz, Owen W. Taylor, Colin Walters
|
||||||
|
|
||||||
|
3.11.2
|
||||||
|
======
|
||||||
|
* Support setting a NULL opaque region [Andreas; #711518]
|
||||||
|
* Sync keymap from X to wayland [Giovanni; #707446]
|
||||||
|
* Implement support for subsurfaces [Jonas; #705502]
|
||||||
|
* Don't focus the no-focus-window for globally active windows [Jasper; #710296]
|
||||||
|
* Support "hotplug_mode_update" property [Marc-André; #711216]
|
||||||
|
* Fix resize operations using mouse-button-modifier [Lionel; #710251]
|
||||||
|
* Fix position of attached modals for CSD windows [Giovanni, Owen; #707194]
|
||||||
|
* Misc. bug fixes [Rui, Jasper, Neil, Florian; #712247, #711731]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Giovanni Campagna, Andreas Heider, Lionel Landwerlin, Marc-André Lureau,
|
||||||
|
Rui Matos, Florian Müllner, Neil Roberts, Sindhu S, Jasper St. Pierre,
|
||||||
|
Rico Tzschichholz, Owen W. Taylor, Jonas Ådahl
|
||||||
|
|
||||||
|
3.11.1
|
||||||
|
======
|
||||||
|
* Fix tile previews getting stuck on right click during drags [Lionel; #704759]
|
||||||
|
* Use new UPower API [Bastien]
|
||||||
|
* Set hot spot when cursor set from wl_buffer [Jonas; #709593]
|
||||||
|
* Expose min-backlight-step [Asad; #710380]
|
||||||
|
* Misc. bug fixes and cleanups [Jasper, Olav, Magdalen; #709776]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Magdalen Berns, Lionel Landwerlin, Asad Mehmood, Bastien Nocera,
|
||||||
|
Jasper St. Pierre, Olav Vitters, Jonas Ådahl
|
||||||
|
|
||||||
|
3.10.1
|
||||||
|
======
|
||||||
|
* Don't apply fullscreen workarounds to CSD windows [Giovanni; #708718]
|
||||||
|
* Fix hangs during DND operations [Adel; #709340]
|
||||||
|
* Misc bug fixes [Dan, Giovanni, Jasper; #708813, #708420]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Giovanni Campagna, Adel Gadllah, Dan Horák, Hans Petter Jansson,
|
||||||
|
Jasper St. Pierre
|
||||||
|
|
||||||
|
3.10.0.1
|
||||||
|
========
|
||||||
|
* Fix bug when a window changed size twice in a single frame - this
|
||||||
|
can happen with GTK+ client-side decorations [Giovanni, Owen; #708367]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Giovanni Campagna, Owen Taylor
|
||||||
|
|
||||||
|
3.10.0
|
||||||
|
======
|
||||||
|
* Update dependencies [Giovanni; #708210]
|
||||||
|
|
||||||
|
3.9.92
|
||||||
|
======
|
||||||
|
* Constrain the pointer position onto visible monitors [Giovanni; #706655]
|
||||||
|
* Fix keyboard state handling in face of event compression [Giovanni; #706963]
|
||||||
|
* Extend the MetaCursorTracker API with query pointer and cursor visibility [Giovanni; #707474]
|
||||||
|
* Be stricter in checking and exposing the wayland protocol version [#707851]
|
||||||
|
* Don't require plugins to pass event to Clutter [Giovanni; #707482]
|
||||||
|
* Move the --wayland option from the binary to the library [Giovanni; #707897]
|
||||||
|
* Implement running from gnome-session (environment variable setting, process group
|
||||||
|
handling, Clutter backend variables) [Giovanni; #706421]
|
||||||
|
* Add support for more cursor types [Giovanni; #707919]
|
||||||
|
* Drop man pages for removed utilities [Kalev; #706579]
|
||||||
|
* Implement monitor configuration on KMS [Giovanni; #706308]
|
||||||
|
* Implement HW cursors [Giovanni; #707573]
|
||||||
|
* Implement minimal support for resizing and maximizing wayland clients [Giovanni; #707401]
|
||||||
|
* Implement transient hints for wayland clients [Giovanni; #707401]
|
||||||
|
* Implement popup menu surfaces and grabs [Giovanni; #707863]
|
||||||
|
* Immediately fire idle watches that are already expired [Giovanni; #707302]
|
||||||
|
* Remove holes generated by disabling the laptop lid [Giovanni; #707473]
|
||||||
|
* Misc bug fixes [Giovanni, Pavel, Adel; #707649, #706124, #707584, #707851, #707929,
|
||||||
|
#708070]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Adel Gadllah, Giovanni Campagna, Kalev Lember, Pavel Vasin
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Мирослав Николић po/sr, sr@latin.po, Мирослав Николић [sr, sr@latin],
|
||||||
|
Chao-Hsiung Liao [zh_HK, zh_TW], Yuri Myasoedov [ru],
|
||||||
|
Ville-Pekka Vainio [fi], Changwoo Ryu [ko], A S Alam [pa],
|
||||||
|
Mattias Põldaru [et], Rūdolfs Mazurs [lv], Ihar Hrachyshka [be],
|
||||||
|
Nilamdyuti Goswami [as], Andika Triwidada [id], Baurzhan Muftakhidinov [kk],
|
||||||
|
Benjamin Steinwender [de]
|
||||||
|
|
||||||
|
3.9.91
|
||||||
|
======
|
||||||
|
* Drop man pages for removed utilities [Kalev; #706579]
|
||||||
|
* Add support for idle tracking [Giovanni, Cosimo; #706005, #707250]
|
||||||
|
* Skip CRTC reconfigurations that have no effect [Giovanni; #706672]
|
||||||
|
* Ignore skip-taskbar hints on parentless dialogs [Giovanni; #673399]
|
||||||
|
* Don't save pixbuf data in user data [Tim; #706777]
|
||||||
|
* Don't queue redraws for obscured regions [Adel; #703332]
|
||||||
|
* Suppor the opaque region hints for wayland clients [Jasper; #707019]
|
||||||
|
* Turn blending off when drawing entirely opaque regions [Jasper; #707019]
|
||||||
|
* Check event timestamps before reconfiguring [Giovanni; #706735]
|
||||||
|
* Merge the DBus API for display configuration in the wayland branch [Giovanni]
|
||||||
|
* Install an X IO error handler for XWayland [Giovanni; #706962]
|
||||||
|
* Use the clutter xkbcommon integration for the wayland keyboard [Giovanni; #705862]
|
||||||
|
* Add a setuid helper for running on KMS+evdev [Giovanni, Colin; #705861]
|
||||||
|
* Add keybindings for switching VT [Giovanni; #705861]
|
||||||
|
* Implement plugin modality when running as a wayland compositor [Giovanni; #705917]
|
||||||
|
* Add support for the application menu for wayland clients [Giovanni; #707128]
|
||||||
|
* Several Coverity spotted fixes [Jasper]
|
||||||
|
* Don't create a dummy texture for the texture template [Neil; #707458]
|
||||||
|
* Use a more conservative paint volume for obscured windows [Adel]
|
||||||
|
* Misc bug fixes [Giovanni, Colin, Seán, Jasper, Cosimo; #706582, #706598,
|
||||||
|
#706787, #706729, #706825, #707081, #707090, #707267, #706982, #706289]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Giovanni Campagna, Cosimo Cecchi, Adel Gadllah, Colin Guthrie, Kalev Lember,
|
||||||
|
Tim Lunn, Jasper St. Pierre, Neil Roberts, Rico Tzschichholz, Seán de Búrca
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Piotr Drąg [pl], Alexandre Franke [fr], Kjartan Maraas [nb],
|
||||||
|
Milo Casagrande [it], Balázs Úr [hu], Seán de Búrca [ga], Fran Diéguez [gl],
|
||||||
|
Daniel Mustieles [es], Aurimas Černius [lt], Gil Forcada [ca]
|
||||||
|
|
||||||
3.9.90
|
3.9.90
|
||||||
======
|
======
|
||||||
* First release from the wayland branch, includes basic support for running
|
* First release from the wayland branch, includes basic support for running
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
#!/bin/bash
|
#!/bin/sh
|
||||||
# Run this to generate all the initial makefiles, etc.
|
# Run this to generate all the initial makefiles, etc.
|
||||||
|
|
||||||
srcdir=`dirname $0`
|
srcdir=`dirname $0`
|
||||||
|
37
configure.ac
37
configure.ac
@@ -1,8 +1,9 @@
|
|||||||
AC_PREREQ(2.50)
|
AC_PREREQ(2.50)
|
||||||
|
AC_CONFIG_MACRO_DIR([m4])
|
||||||
|
|
||||||
m4_define([mutter_major_version], [3])
|
m4_define([mutter_major_version], [3])
|
||||||
m4_define([mutter_minor_version], [9])
|
m4_define([mutter_minor_version], [11])
|
||||||
m4_define([mutter_micro_version], [90])
|
m4_define([mutter_micro_version], [5])
|
||||||
|
|
||||||
m4_define([mutter_version],
|
m4_define([mutter_version],
|
||||||
[mutter_major_version.mutter_minor_version.mutter_micro_version])
|
[mutter_major_version.mutter_minor_version.mutter_micro_version])
|
||||||
@@ -77,9 +78,9 @@ MUTTER_PC_MODULES="
|
|||||||
cairo >= 1.10.0
|
cairo >= 1.10.0
|
||||||
gsettings-desktop-schemas >= 3.7.3
|
gsettings-desktop-schemas >= 3.7.3
|
||||||
xcomposite >= 0.2 xfixes xrender xdamage xi >= 1.6.0
|
xcomposite >= 0.2 xfixes xrender xdamage xi >= 1.6.0
|
||||||
$CLUTTER_PACKAGE >= 1.14.3
|
$CLUTTER_PACKAGE >= 1.17.1
|
||||||
cogl-1.0 >= 1.13.3
|
cogl-1.0 >= 1.17.1
|
||||||
upower-glib > 0.9.11
|
upower-glib >= 0.99.0
|
||||||
gnome-desktop-3.0
|
gnome-desktop-3.0
|
||||||
"
|
"
|
||||||
|
|
||||||
@@ -139,6 +140,12 @@ AM_GLIB_GNU_GETTEXT
|
|||||||
## here we get the flags we'll actually use
|
## here we get the flags we'll actually use
|
||||||
# GRegex requires Glib-2.14.0
|
# GRegex requires Glib-2.14.0
|
||||||
PKG_CHECK_MODULES(ALL, glib-2.0 >= 2.14.0)
|
PKG_CHECK_MODULES(ALL, glib-2.0 >= 2.14.0)
|
||||||
|
PKG_CHECK_MODULES(MUTTER_LAUNCH, libdrm libsystemd-login)
|
||||||
|
|
||||||
|
saved_LIBS="$LIBS"
|
||||||
|
LIBS="$LIBS $MUTTER_LAUNCH"
|
||||||
|
AC_CHECK_FUNCS([sd_session_get_vt])
|
||||||
|
LIBS="$saved_LIBS"
|
||||||
|
|
||||||
# Unconditionally use this dir to avoid a circular dep with gnomecc
|
# Unconditionally use this dir to avoid a circular dep with gnomecc
|
||||||
GNOME_KEYBINDINGS_KEYSDIR="${datadir}/gnome-control-center/keybindings"
|
GNOME_KEYBINDINGS_KEYSDIR="${datadir}/gnome-control-center/keybindings"
|
||||||
@@ -203,22 +210,7 @@ if test x$found_introspection != xno; then
|
|||||||
AC_SUBST(META_GIR)
|
AC_SUBST(META_GIR)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
AC_MSG_CHECKING([Xcursor])
|
MUTTER_PC_MODULES="$MUTTER_PC_MODULES xcursor"
|
||||||
if $PKG_CONFIG xcursor; then
|
|
||||||
have_xcursor=yes
|
|
||||||
else
|
|
||||||
have_xcursor=no
|
|
||||||
fi
|
|
||||||
AC_MSG_RESULT($have_xcursor)
|
|
||||||
|
|
||||||
if test x$have_xcursor = xyes; then
|
|
||||||
echo "Building with Xcursor"
|
|
||||||
MUTTER_PC_MODULES="$MUTTER_PC_MODULES xcursor"
|
|
||||||
AC_DEFINE(HAVE_XCURSOR, , [Building with Xcursor support])
|
|
||||||
fi
|
|
||||||
|
|
||||||
# We always build with wayland enabled
|
|
||||||
AC_DEFINE(HAVE_WAYLAND, , [Building with Wayland support])
|
|
||||||
|
|
||||||
AC_PATH_PROG([WAYLAND_SCANNER],[wayland-scanner],[no])
|
AC_PATH_PROG([WAYLAND_SCANNER],[wayland-scanner],[no])
|
||||||
AS_IF([test "x$WAYLAND_SCANNER" = "xno"],
|
AS_IF([test "x$WAYLAND_SCANNER" = "xno"],
|
||||||
@@ -226,7 +218,7 @@ AS_IF([test "x$WAYLAND_SCANNER" = "xno"],
|
|||||||
AC_SUBST([WAYLAND_SCANNER])
|
AC_SUBST([WAYLAND_SCANNER])
|
||||||
AC_SUBST(XWAYLAND_PATH)
|
AC_SUBST(XWAYLAND_PATH)
|
||||||
|
|
||||||
MUTTER_PC_MODULES="$MUTTER_PC_MODULES wayland-server"
|
MUTTER_PC_MODULES="$MUTTER_PC_MODULES clutter-wayland-1.0 clutter-wayland-compositor-1.0 clutter-egl-1.0 wayland-server libdrm"
|
||||||
PKG_CHECK_MODULES(MUTTER, $MUTTER_PC_MODULES)
|
PKG_CHECK_MODULES(MUTTER, $MUTTER_PC_MODULES)
|
||||||
|
|
||||||
PKG_CHECK_EXISTS([xi >= 1.6.99.1],
|
PKG_CHECK_EXISTS([xi >= 1.6.99.1],
|
||||||
@@ -467,7 +459,6 @@ src/Makefile
|
|||||||
src/libmutter-wayland.pc
|
src/libmutter-wayland.pc
|
||||||
src/compositor/plugins/Makefile
|
src/compositor/plugins/Makefile
|
||||||
protocol/Makefile
|
protocol/Makefile
|
||||||
data/Makefile
|
|
||||||
po/Makefile.in
|
po/Makefile.in
|
||||||
])
|
])
|
||||||
|
|
||||||
|
@@ -1,3 +0,0 @@
|
|||||||
defaultcursordir = $(pkgdatadir)/cursors
|
|
||||||
|
|
||||||
dist_defaultcursor_DATA = left_ptr.png
|
|
Binary file not shown.
Before Width: | Height: | Size: 736 B |
@@ -1,4 +1,3 @@
|
|||||||
man_MANS = mutter.1 mutter-theme-viewer.1 \
|
man_MANS = mutter.1
|
||||||
mutter-window-demo.1 mutter-message.1
|
|
||||||
|
|
||||||
EXTRA_DIST = $(man_MANS)
|
EXTRA_DIST = $(man_MANS)
|
||||||
|
@@ -1,60 +0,0 @@
|
|||||||
.\" Hey, EMACS: -*- nroff -*-
|
|
||||||
.\" First parameter, NAME, should be all caps
|
|
||||||
.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
|
|
||||||
.\" other parameters are allowed: see man(7), man(1)
|
|
||||||
.\" -----
|
|
||||||
.\" This file was confirmed to be licenced under the GPL
|
|
||||||
.\" by its author and copyright holder, Akira TAGOH, on June 1st 2008:
|
|
||||||
.\"
|
|
||||||
.\" > I'm comfortable with DFSG-free. that sounds great if you think it's
|
|
||||||
.\" > useful and worth containing it in upstream.
|
|
||||||
.\" ...
|
|
||||||
.\" > Right I know. any licenses that is DFSG-free, I'm ok with whatever,
|
|
||||||
.\" > since I have contributed that for Debian. so GPL is no problem for me.
|
|
||||||
.\" -----
|
|
||||||
.TH MUTTER\-MESSAGE 1 "28 August 2002"
|
|
||||||
.\" Please adjust this date whenever revising the manpage.
|
|
||||||
.\"
|
|
||||||
.\" Some roff macros, for reference:
|
|
||||||
.\" .nh disable hyphenation
|
|
||||||
.\" .hy enable hyphenation
|
|
||||||
.\" .ad l left justify
|
|
||||||
.\" .ad b justify to both left and right margins
|
|
||||||
.\" .nf disable filling
|
|
||||||
.\" .fi enable filling
|
|
||||||
.\" .br insert line break
|
|
||||||
.\" .sp <n> insert n+1 empty lines
|
|
||||||
.\" for manpage-specific macros, see man(7)
|
|
||||||
.SH NAME
|
|
||||||
MUTTER\-MESSAGE \- a command to send a message to Mutter
|
|
||||||
.SH SYNOPSIS
|
|
||||||
.B MUTTER\-MESSAGE
|
|
||||||
[restart|reload\-theme|enable\-keybindings|disable\-keybindings]
|
|
||||||
.SH DESCRIPTION
|
|
||||||
This manual page documents briefly the
|
|
||||||
.B mutter\-message\fP.
|
|
||||||
This manual page was written for the Debian distribution
|
|
||||||
because the original program does not have a manual page.
|
|
||||||
.PP
|
|
||||||
.\" TeX users may be more comfortable with the \fB<whatever>\fP and
|
|
||||||
.\" \fI<whatever>\fP escape sequences to invode bold face and italics,
|
|
||||||
.\" respectively.
|
|
||||||
\fBmutter\-message\fP send a specified message to \fBmutter\fP(1).
|
|
||||||
.SH OPTIONS
|
|
||||||
.TP
|
|
||||||
.B restart
|
|
||||||
Restart \fBmutter\fP(1) which is running.
|
|
||||||
.TP
|
|
||||||
.B reload-theme
|
|
||||||
Reload a theme which is specified on gsettings database.
|
|
||||||
.TP
|
|
||||||
.B enable-keybindings
|
|
||||||
Enable all of keybindings which is specified on gsettings database.
|
|
||||||
.TP
|
|
||||||
.B disable-keybindings
|
|
||||||
Disable all of keybindings which is specified on gsettings database.
|
|
||||||
.SH SEE ALSO
|
|
||||||
.BR mutter (1)
|
|
||||||
.SH AUTHOR
|
|
||||||
This manual page was written by Akira TAGOH <tagoh@debian.org>,
|
|
||||||
for the Debian GNU/Linux system (but may be used by others).
|
|
@@ -1,43 +0,0 @@
|
|||||||
.\" In .TH, FOO should be all caps, SECTION should be 1-8, maybe w/ subsection
|
|
||||||
.\" other parms are allowed: see man(7), man(1)
|
|
||||||
.\"
|
|
||||||
.\" Based on template provided by Tom Christiansen <tchrist@jhereg.perl.com>.
|
|
||||||
.\"
|
|
||||||
.TH MUTTER-THEME-VIEWER 1 "1 June 2004"
|
|
||||||
.SH NAME
|
|
||||||
mutter-theme-viewer \- view mutter themes
|
|
||||||
.SH SYNOPSIS
|
|
||||||
.B mutter-theme-viewer
|
|
||||||
[
|
|
||||||
.I THEMENAME
|
|
||||||
]
|
|
||||||
.SH DESCRIPTION
|
|
||||||
.\" Putting a newline after each sentence can generate better output.
|
|
||||||
.B mutter-theme-viewer
|
|
||||||
allows you to preview any installed Mutter theme.
|
|
||||||
.PP
|
|
||||||
When designing a new Mutter theme, you can use
|
|
||||||
.B mutter-theme-viewer
|
|
||||||
to measure the performance of a window frame option, and to preview
|
|
||||||
the option.
|
|
||||||
.SH OPTIONS
|
|
||||||
.TP
|
|
||||||
.I THEMENAME
|
|
||||||
Name of the theme to be shown (\fIAtlanta\fR by default).
|
|
||||||
It is case-sensitive.
|
|
||||||
.SH FILES
|
|
||||||
.br
|
|
||||||
.nf
|
|
||||||
.TP
|
|
||||||
.I /usr/share/themes
|
|
||||||
system themes directory
|
|
||||||
.TP
|
|
||||||
.I /usr/share/themes/*/mutter-1/mutter-theme-1.xml
|
|
||||||
theme specification file
|
|
||||||
.SH AUTHOR
|
|
||||||
This manual page was written by Jose M. Moya <josem@die.upm.es>, for
|
|
||||||
the Debian GNU/Linux system (but may be used by others).
|
|
||||||
.SH "SEE ALSO"
|
|
||||||
.\" Always quote multiple words for .SH
|
|
||||||
.BR mutter (1),
|
|
||||||
.BR mutter-window-demo (1).
|
|
@@ -1,25 +0,0 @@
|
|||||||
.\" In .TH, FOO should be all caps, SECTION should be 1-8, maybe w/ subsection
|
|
||||||
.\" other parms are allowed: see man(7), man(1)
|
|
||||||
.\"
|
|
||||||
.\" Based on template provided by Tom Christiansen <tchrist@jhereg.perl.com>.
|
|
||||||
.\"
|
|
||||||
.TH MUTTER-WINDOW-DEMO 1 "1 June 2004"
|
|
||||||
.SH NAME
|
|
||||||
mutter-window-demo \- demo of window features
|
|
||||||
.SH SYNOPSIS
|
|
||||||
.B mutter-window-demo
|
|
||||||
.SH DESCRIPTION
|
|
||||||
.\" Putting a newline after each sentence can generate better output.
|
|
||||||
This program demonstrates various kinds of windows that window
|
|
||||||
managers and window manager themes should handle.
|
|
||||||
.PP
|
|
||||||
Be sure to tear off the menu and toolbar, those are also a special
|
|
||||||
kind of window.
|
|
||||||
.SH AUTHOR
|
|
||||||
This manual page was written by Jose M. Moya <josem@die.upm.es>, for
|
|
||||||
the Debian GNU/Linux system (but may be used by others).
|
|
||||||
.SH "SEE ALSO"
|
|
||||||
.\" Always quote multiple words for .SH
|
|
||||||
.BR x-window-manager (1),
|
|
||||||
.BR mutter (1),
|
|
||||||
.BR mutter-theme-viewer (1).
|
|
@@ -49,8 +49,8 @@ FIXXREF_OPTIONS=
|
|||||||
# Used for dependencies. The docs will be rebuilt if any of these change.
|
# Used for dependencies. The docs will be rebuilt if any of these change.
|
||||||
# e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h
|
# e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h
|
||||||
# e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c
|
# e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c
|
||||||
HFILE_GLOB=$(top_srcdir)/src/*.h
|
HFILE_GLOB=$(top_srcdir)/src/*/*.h
|
||||||
CFILE_GLOB=$(top_srcdir)/src/*.c
|
CFILE_GLOB=$(top_srcdir)/src/*/*.c
|
||||||
|
|
||||||
# Extra header to include when scanning, which are not under DOC_SOURCE_DIR
|
# Extra header to include when scanning, which are not under DOC_SOURCE_DIR
|
||||||
# e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h
|
# e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h
|
||||||
|
@@ -96,8 +96,6 @@ meta_compositor_hide_window
|
|||||||
meta_compositor_switch_workspace
|
meta_compositor_switch_workspace
|
||||||
meta_compositor_maximize_window
|
meta_compositor_maximize_window
|
||||||
meta_compositor_unmaximize_window
|
meta_compositor_unmaximize_window
|
||||||
meta_compositor_window_mapped
|
|
||||||
meta_compositor_window_unmapped
|
|
||||||
meta_compositor_sync_window_geometry
|
meta_compositor_sync_window_geometry
|
||||||
meta_compositor_set_updates_frozen
|
meta_compositor_set_updates_frozen
|
||||||
meta_compositor_queue_frame_drawn
|
meta_compositor_queue_frame_drawn
|
||||||
@@ -207,7 +205,6 @@ meta_key_binding_get_modifiers
|
|||||||
meta_key_binding_get_mask
|
meta_key_binding_get_mask
|
||||||
meta_key_binding_is_builtin
|
meta_key_binding_is_builtin
|
||||||
meta_keybindings_set_custom_handler
|
meta_keybindings_set_custom_handler
|
||||||
meta_keybindings_switch_window
|
|
||||||
meta_screen_ungrab_all_keys
|
meta_screen_ungrab_all_keys
|
||||||
meta_screen_grab_all_keys
|
meta_screen_grab_all_keys
|
||||||
</SECTION>
|
</SECTION>
|
||||||
@@ -389,6 +386,23 @@ MetaWindowActorPrivate
|
|||||||
meta_window_actor_get_type
|
meta_window_actor_get_type
|
||||||
</SECTION>
|
</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>
|
<SECTION>
|
||||||
<FILE>prefs</FILE>
|
<FILE>prefs</FILE>
|
||||||
MetaPreference
|
MetaPreference
|
||||||
@@ -542,7 +556,10 @@ meta_window_is_override_redirect
|
|||||||
meta_window_is_skip_taskbar
|
meta_window_is_skip_taskbar
|
||||||
meta_window_get_rect
|
meta_window_get_rect
|
||||||
meta_window_get_input_rect
|
meta_window_get_input_rect
|
||||||
|
meta_window_get_frame_rect
|
||||||
meta_window_get_outer_rect
|
meta_window_get_outer_rect
|
||||||
|
meta_window_client_rect_to_frame_rect
|
||||||
|
meta_window_frame_rect_to_client_rect
|
||||||
meta_window_get_screen
|
meta_window_get_screen
|
||||||
meta_window_get_display
|
meta_window_get_display
|
||||||
meta_window_get_xwindow
|
meta_window_get_xwindow
|
||||||
|
@@ -21,6 +21,7 @@ environment.</description>
|
|||||||
-->
|
-->
|
||||||
<mailing-list rdf:resource="http://mail.gnome.org/mailman/listinfo/gnome-shell-list" />
|
<mailing-list rdf:resource="http://mail.gnome.org/mailman/listinfo/gnome-shell-list" />
|
||||||
<download-page rdf:resource="http://download.gnome.org/sources/mutter/" />
|
<download-page rdf:resource="http://download.gnome.org/sources/mutter/" />
|
||||||
|
<download-page rdf:resource="http://download.gnome.org/sources/mutter-wayland/" />
|
||||||
<bug-database rdf:resource="http://bugzilla.gnome.org/browse.cgi?product=mutter" />
|
<bug-database rdf:resource="http://bugzilla.gnome.org/browse.cgi?product=mutter" />
|
||||||
|
|
||||||
<category rdf:resource="http://api.gnome.org/doap-extensions#desktop" />
|
<category rdf:resource="http://api.gnome.org/doap-extensions#desktop" />
|
||||||
|
@@ -44,6 +44,7 @@ is
|
|||||||
it
|
it
|
||||||
ja
|
ja
|
||||||
ka
|
ka
|
||||||
|
kk
|
||||||
kn
|
kn
|
||||||
ko
|
ko
|
||||||
ku
|
ku
|
||||||
|
@@ -21,9 +21,9 @@ src/core/util.c
|
|||||||
src/core/window.c
|
src/core/window.c
|
||||||
src/core/window-props.c
|
src/core/window-props.c
|
||||||
src/core/xprops.c
|
src/core/xprops.c
|
||||||
src/mutter.desktop.in
|
src/mutter-wayland.desktop.in
|
||||||
src/mutter-wm.desktop.in
|
|
||||||
src/org.gnome.mutter.gschema.xml.in
|
src/org.gnome.mutter.gschema.xml.in
|
||||||
|
src/org.gnome.mutter.wayland.gschema.xml.in
|
||||||
src/ui/frames.c
|
src/ui/frames.c
|
||||||
src/ui/menu.c
|
src/ui/menu.c
|
||||||
src/ui/metaaccellabel.c
|
src/ui/metaaccellabel.c
|
||||||
|
441
po/be.po
441
po/be.po
@@ -1,10 +1,10 @@
|
|||||||
# Ihar Hrachyshka <ihar.hrachyshka@gmail.com>, 2011.
|
# Ihar Hrachyshka <ihar.hrachyshka@gmail.com>, 2011, 2013.
|
||||||
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: 2013-03-01 15:50+0000\n"
|
"POT-Creation-Date: 2013-08-18 20:03+0000\n"
|
||||||
"PO-Revision-Date: 2012-10-13 17:44+0300\n"
|
"PO-Revision-Date: 2012-10-13 17:44+0300\n"
|
||||||
"Last-Translator: Ігар Грачышка <ihar.hrachyshka@gmail.com>\n"
|
"Last-Translator: Ігар Грачышка <ihar.hrachyshka@gmail.com>\n"
|
||||||
"Language-Team: Belarusian <i18n-bel-gnome@googlegroups.com>\n"
|
"Language-Team: Belarusian <i18n-bel-gnome@googlegroups.com>\n"
|
||||||
@@ -206,7 +206,7 @@ msgstr "Падзяліць прагляд справа"
|
|||||||
|
|
||||||
#. 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:507
|
#: ../src/compositor/compositor.c:589
|
||||||
#, 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"
|
||||||
@@ -214,11 +214,11 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Іншы кампазітны кіраўнік вокнаў ужо абслугоўвае экран %i дысплея \"%s\"."
|
"Іншы кампазітны кіраўнік вокнаў ужо абслугоўвае экран %i дысплея \"%s\"."
|
||||||
|
|
||||||
#: ../src/compositor/meta-background.c:1111
|
#: ../src/compositor/meta-background.c:1076
|
||||||
msgid "background texture could not be created from file"
|
msgid "background texture could not be created from file"
|
||||||
msgstr "не ўдалося стварыць фонавую тэкстуру з файла"
|
msgstr "не ўдалося стварыць фонавую тэкстуру з файла"
|
||||||
|
|
||||||
#: ../src/core/bell.c:320
|
#: ../src/core/bell.c:322
|
||||||
msgid "Bell event"
|
msgid "Bell event"
|
||||||
msgstr "Падзея з сігналам"
|
msgstr "Падзея з сігналам"
|
||||||
|
|
||||||
@@ -251,18 +251,18 @@ msgstr "_Пачакаць"
|
|||||||
msgid "_Force Quit"
|
msgid "_Force Quit"
|
||||||
msgstr "_Змусіць да выхаду"
|
msgstr "_Змусіць да выхаду"
|
||||||
|
|
||||||
#: ../src/core/display.c:401
|
#: ../src/core/display.c:421
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Missing %s extension required for compositing"
|
msgid "Missing %s extension required for compositing"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Адсутнічае пашырэнне \"%s\", патрэбнае для ажыццяўлення кампазітнага вываду"
|
"Адсутнічае пашырэнне \"%s\", патрэбнае для ажыццяўлення кампазітнага вываду"
|
||||||
|
|
||||||
#: ../src/core/display.c:493
|
#: ../src/core/display.c:513
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to open X Window System display '%s'\n"
|
msgid "Failed to open X Window System display '%s'\n"
|
||||||
msgstr "Не ўдалося адкрыць X-дысплей аконнай сістэмы \"%s\"\n"
|
msgstr "Не ўдалося адкрыць X-дысплей аконнай сістэмы \"%s\"\n"
|
||||||
|
|
||||||
#: ../src/core/keybindings.c:929
|
#: ../src/core/keybindings.c:1136
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Some other program is already using the key %s with modifiers %x as a "
|
"Some other program is already using the key %s with modifiers %x as a "
|
||||||
@@ -271,41 +271,41 @@ msgstr ""
|
|||||||
"Нейкая іншая праграма ўжо выкарыстоўвае як скарот клавішу %s з "
|
"Нейкая іншая праграма ўжо выкарыстоўвае як скарот клавішу %s з "
|
||||||
"мадыфікатарамі %x\n"
|
"мадыфікатарамі %x\n"
|
||||||
|
|
||||||
#: ../src/core/keybindings.c:1129
|
#: ../src/core/keybindings.c:1333
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "\"%s\" is not a valid accelerator\n"
|
msgid "\"%s\" is not a valid accelerator\n"
|
||||||
msgstr "\"%s\" - гэта хібны клавіятурны скарот\n"
|
msgstr "\"%s\" - гэта хібны клавіятурны скарот\n"
|
||||||
|
|
||||||
#: ../src/core/main.c:196
|
#: ../src/core/main.c:197
|
||||||
msgid "Disable connection to session manager"
|
msgid "Disable connection to session manager"
|
||||||
msgstr "Выключыць злучэнне з кіраўніком сеансаў"
|
msgstr "Выключыць злучэнне з кіраўніком сеансаў"
|
||||||
|
|
||||||
#: ../src/core/main.c:202
|
#: ../src/core/main.c:203
|
||||||
msgid "Replace the running window manager"
|
msgid "Replace the running window manager"
|
||||||
msgstr "Замяніць дзейнага кіраўніка вокнаў"
|
msgstr "Замяніць дзейнага кіраўніка вокнаў"
|
||||||
|
|
||||||
#: ../src/core/main.c:208
|
#: ../src/core/main.c:209
|
||||||
msgid "Specify session management ID"
|
msgid "Specify session management ID"
|
||||||
msgstr "Вызначыць ідэнтыфікатар для кіравання сеансам"
|
msgstr "Вызначыць ідэнтыфікатар для кіравання сеансам"
|
||||||
|
|
||||||
#: ../src/core/main.c:213
|
#: ../src/core/main.c:214
|
||||||
msgid "X Display to use"
|
msgid "X Display to use"
|
||||||
msgstr "Патрэбны X-дысплей"
|
msgstr "Патрэбны X-дысплей"
|
||||||
|
|
||||||
#: ../src/core/main.c:219
|
#: ../src/core/main.c:220
|
||||||
msgid "Initialize session from savefile"
|
msgid "Initialize session from savefile"
|
||||||
msgstr "Ініцыяваць сеанс з файла"
|
msgstr "Ініцыяваць сеанс з файла"
|
||||||
|
|
||||||
#: ../src/core/main.c:225
|
#: ../src/core/main.c:226
|
||||||
msgid "Make X calls synchronous"
|
msgid "Make X calls synchronous"
|
||||||
msgstr "Сінхронна выконваць выклікі X-сістэмы"
|
msgstr "Сінхронна выконваць выклікі X-сістэмы"
|
||||||
|
|
||||||
#: ../src/core/main.c:494
|
#: ../src/core/main.c:534
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to scan themes directory: %s\n"
|
msgid "Failed to scan themes directory: %s\n"
|
||||||
msgstr "Не ўдалося праглядзець каталог з матывамі аздаблення: %s\n"
|
msgstr "Не ўдалося праглядзець каталог з матывамі аздаблення: %s\n"
|
||||||
|
|
||||||
#: ../src/core/main.c:510
|
#: ../src/core/main.c:550
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Could not find a theme! Be sure %s exists and contains the usual themes.\n"
|
"Could not find a theme! Be sure %s exists and contains the usual themes.\n"
|
||||||
@@ -313,6 +313,19 @@ msgstr ""
|
|||||||
"Не ўдалося адшукаць матыў аздаблення! Праверце, каб каталог %s існаваў і "
|
"Не ўдалося адшукаць матыў аздаблення! Праверце, каб каталог %s існаваў і "
|
||||||
"змяшчаў звычайныя матывы.\n"
|
"змяшчаў звычайныя матывы.\n"
|
||||||
|
|
||||||
|
#: ../src/core/monitor.c:711
|
||||||
|
msgid "Built-in display"
|
||||||
|
msgstr "Убудаваны дысплей"
|
||||||
|
|
||||||
|
#. TRANSLATORS: this is a monitor name (in case we don't know
|
||||||
|
#. the vendor), it's Unknown followed by a size in inches,
|
||||||
|
#. like 'Unknown 15"'
|
||||||
|
#.
|
||||||
|
#: ../src/core/monitor.c:739
|
||||||
|
#, c-format
|
||||||
|
msgid "Unknown %s"
|
||||||
|
msgstr "Невядомы %s"
|
||||||
|
|
||||||
#: ../src/core/mutter.c:40
|
#: ../src/core/mutter.c:40
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -337,7 +350,7 @@ msgstr "Вывесці нумар версіі праграмы"
|
|||||||
msgid "Mutter plugin to use"
|
msgid "Mutter plugin to use"
|
||||||
msgstr "Патрэбны плугін Mutter"
|
msgstr "Патрэбны плугін Mutter"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:1087
|
#: ../src/core/prefs.c:1202
|
||||||
msgid ""
|
msgid ""
|
||||||
"Workarounds for broken applications disabled. Some applications may not "
|
"Workarounds for broken applications disabled. Some applications may not "
|
||||||
"behave properly.\n"
|
"behave properly.\n"
|
||||||
@@ -345,12 +358,12 @@ msgstr ""
|
|||||||
"Асаблівыя паводзіны для некаторых хібных праграм выключаныя. Некаторыя "
|
"Асаблівыя паводзіны для некаторых хібных праграм выключаныя. Некаторыя "
|
||||||
"праграмы могуць перастаць працаваць, як мае быць.\n"
|
"праграмы могуць перастаць працаваць, як мае быць.\n"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:1162
|
#: ../src/core/prefs.c:1277
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Could not parse font description \"%s\" from GSettings key %s\n"
|
msgid "Could not parse font description \"%s\" from GSettings key %s\n"
|
||||||
msgstr "Не ўдалося разабраць азначэнне шрыфту \"%s\" з GSettings-ключа %s\n"
|
msgstr "Не ўдалося разабраць азначэнне шрыфту \"%s\" з GSettings-ключа %s\n"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:1228
|
#: ../src/core/prefs.c:1343
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"\"%s\" found in configuration database is not a valid value for mouse button "
|
"\"%s\" found in configuration database is not a valid value for mouse button "
|
||||||
@@ -359,7 +372,7 @@ msgstr ""
|
|||||||
"Значэнне \"%s\", знойдзенае ў базе канфігурацыйных даных, не азначае "
|
"Значэнне \"%s\", знойдзенае ў базе канфігурацыйных даных, не азначае "
|
||||||
"мадыфікатар мышынай кнопкі\n"
|
"мадыфікатар мышынай кнопкі\n"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:1780
|
#: ../src/core/prefs.c:1909
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"\"%s\" found in configuration database is not a valid value for keybinding "
|
"\"%s\" found in configuration database is not a valid value for keybinding "
|
||||||
@@ -368,17 +381,17 @@ msgstr ""
|
|||||||
"Значэнне \"%s\", знойдзенае ў базе канфігурацыйных даных, не азначае "
|
"Значэнне \"%s\", знойдзенае ў базе канфігурацыйных даных, не азначае "
|
||||||
"клавіятурны скарот \"%s\"\n"
|
"клавіятурны скарот \"%s\"\n"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:1879
|
#: ../src/core/prefs.c:1999
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Workspace %d"
|
msgid "Workspace %d"
|
||||||
msgstr "Прастора працы %d"
|
msgstr "Прастора працы %d"
|
||||||
|
|
||||||
#: ../src/core/screen.c:673
|
#: ../src/core/screen.c:534
|
||||||
#, 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:689
|
#: ../src/core/screen.c:550
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Screen %d on display \"%s\" already has a window manager; try using the --"
|
"Screen %d on display \"%s\" already has a window manager; try using the --"
|
||||||
@@ -387,19 +400,19 @@ msgstr ""
|
|||||||
"Экран %d на дысплеі \"%s\" ужо мае аконнага кіраўніка. Каб замяніць яго "
|
"Экран %d на дысплеі \"%s\" ужо мае аконнага кіраўніка. Каб замяніць яго "
|
||||||
"новым, дадайце опцыю --replace.\n"
|
"новым, дадайце опцыю --replace.\n"
|
||||||
|
|
||||||
#: ../src/core/screen.c:716
|
#: ../src/core/screen.c:577
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Could not acquire window manager selection on screen %d display \"%s\"\n"
|
"Could not acquire window manager selection on screen %d display \"%s\"\n"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Не ўдалося пераняць вылучэнне кіраўніка вокнаў для экрана %d дысплея \"%s\"\n"
|
"Не ўдалося пераняць вылучэнне кіраўніка вокнаў для экрана %d дысплея \"%s\"\n"
|
||||||
|
|
||||||
#: ../src/core/screen.c:794
|
#: ../src/core/screen.c:655
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Screen %d on display \"%s\" already has a window manager\n"
|
msgid "Screen %d on display \"%s\" already has a window manager\n"
|
||||||
msgstr "Экран %d на дысплеі \"%s\" ужо мае кіраўніка вокнаў\n"
|
msgstr "Экран %d на дысплеі \"%s\" ужо мае кіраўніка вокнаў\n"
|
||||||
|
|
||||||
#: ../src/core/screen.c:979
|
#: ../src/core/screen.c:846
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Could not release screen %d on display \"%s\"\n"
|
msgid "Could not release screen %d on display \"%s\"\n"
|
||||||
msgstr "Не ўдалося вызваліць экран %d на дысплеі \"%s\"\n"
|
msgstr "Не ўдалося вызваліць экран %d на дысплеі \"%s\"\n"
|
||||||
@@ -460,46 +473,45 @@ msgstr ""
|
|||||||
"Гэтыя вокны не падтрымліваюць функцыі захавання дзейнага ладу працы, і таму "
|
"Гэтыя вокны не падтрымліваюць функцыі захавання дзейнага ладу працы, і таму "
|
||||||
"іх прыйдзецца запусціць уручную пасля наступнага ўваходу ў сістэму."
|
"іх прыйдзецца запусціць уручную пасля наступнага ўваходу ў сістэму."
|
||||||
|
|
||||||
#: ../src/core/util.c:80
|
#: ../src/core/util.c:84
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to open debug log: %s\n"
|
msgid "Failed to open debug log: %s\n"
|
||||||
msgstr "Не ўдалося адкрыць адладачны журнал: %s\n"
|
msgstr "Не ўдалося адкрыць адладачны журнал: %s\n"
|
||||||
|
|
||||||
#: ../src/core/util.c:90
|
#: ../src/core/util.c:94
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to fdopen() log file %s: %s\n"
|
msgid "Failed to fdopen() log file %s: %s\n"
|
||||||
msgstr "Не ўдалося выканаць fdopen() для журнальнага файла %s: %s\n"
|
msgstr "Не ўдалося выканаць fdopen() для журнальнага файла %s: %s\n"
|
||||||
|
|
||||||
#: ../src/core/util.c:96
|
#: ../src/core/util.c:100
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Opened log file %s\n"
|
msgid "Opened log file %s\n"
|
||||||
msgstr "Журнальны файл %s адкрыты\n"
|
msgstr "Журнальны файл %s адкрыты\n"
|
||||||
|
|
||||||
#: ../src/core/util.c:115 ../src/tools/mutter-message.c:149
|
#: ../src/core/util.c:119
|
||||||
#, c-format
|
|
||||||
msgid "Mutter was compiled without support for verbose mode\n"
|
msgid "Mutter was compiled without support for verbose mode\n"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Праграма \"Mutter\" была скампіляваная без падтрымкі падрабязнага "
|
"Праграма \"Mutter\" была скампіляваная без падтрымкі падрабязнага "
|
||||||
"пратакаліравання\n"
|
"пратакаліравання\n"
|
||||||
|
|
||||||
#: ../src/core/util.c:259
|
#: ../src/core/util.c:264
|
||||||
msgid "Window manager: "
|
msgid "Window manager: "
|
||||||
msgstr "Кіраўнік вокнаў: "
|
msgstr "Кіраўнік вокнаў: "
|
||||||
|
|
||||||
#: ../src/core/util.c:407
|
#: ../src/core/util.c:414
|
||||||
msgid "Bug in window manager: "
|
msgid "Bug in window manager: "
|
||||||
msgstr "Хіба ў кіраўніку вокнаў: "
|
msgstr "Хіба ў кіраўніку вокнаў: "
|
||||||
|
|
||||||
#: ../src/core/util.c:438
|
#: ../src/core/util.c:445
|
||||||
msgid "Window manager warning: "
|
msgid "Window manager warning: "
|
||||||
msgstr "Перасцярога ад кіраўніка вокнаў: "
|
msgstr "Перасцярога ад кіраўніка вокнаў: "
|
||||||
|
|
||||||
#: ../src/core/util.c:466
|
#: ../src/core/util.c:473
|
||||||
msgid "Window manager error: "
|
msgid "Window manager error: "
|
||||||
msgstr "Памылка кіраўніка вокнаў: "
|
msgstr "Памылка кіраўніка вокнаў: "
|
||||||
|
|
||||||
#. first time through
|
#. first time through
|
||||||
#: ../src/core/window.c:7539
|
#: ../src/core/window.c:7533
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER "
|
"Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER "
|
||||||
@@ -515,7 +527,7 @@ msgstr ""
|
|||||||
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
|
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
|
||||||
#. * about these apps but make them work.
|
#. * about these apps but make them work.
|
||||||
#.
|
#.
|
||||||
#: ../src/core/window.c:8263
|
#: ../src/core/window.c:8257
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Window %s sets an MWM hint indicating it isn't resizable, but sets min size "
|
"Window %s sets an MWM hint indicating it isn't resizable, but sets min size "
|
||||||
@@ -525,22 +537,22 @@ msgstr ""
|
|||||||
"памеру, але разам з гэтым прызначыла для сябе мінімальны памер %d x %d і "
|
"памеру, але разам з гэтым прызначыла для сябе мінімальны памер %d x %d і "
|
||||||
"максімальны памер %d x %d. Такія паводзіны не маюць сэнсу.\n"
|
"максімальны памер %d x %d. Такія паводзіны не маюць сэнсу.\n"
|
||||||
|
|
||||||
#: ../src/core/window-props.c:318
|
#: ../src/core/window-props.c:347
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Application set a bogus _NET_WM_PID %lu\n"
|
msgid "Application set a bogus _NET_WM_PID %lu\n"
|
||||||
msgstr "Праграма прызначыла памылковае значэнне _NET_WM_PID %lu\n"
|
msgstr "Праграма прызначыла памылковае значэнне _NET_WM_PID %lu\n"
|
||||||
|
|
||||||
#: ../src/core/window-props.c:434
|
#: ../src/core/window-props.c:463
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s (on %s)"
|
msgid "%s (on %s)"
|
||||||
msgstr "%s (на %s)"
|
msgstr "%s (на %s)"
|
||||||
|
|
||||||
#: ../src/core/window-props.c:1517
|
#: ../src/core/window-props.c:1546
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
|
msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
|
||||||
msgstr "Для %2$s вызначана хібнае акно WM_TRANSIENT_FOR 0x%1$lx.\n"
|
msgstr "Для %2$s вызначана хібнае акно WM_TRANSIENT_FOR 0x%1$lx.\n"
|
||||||
|
|
||||||
#: ../src/core/window-props.c:1528
|
#: ../src/core/window-props.c:1557
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "WM_TRANSIENT_FOR window 0x%lx for %s would create loop.\n"
|
msgid "WM_TRANSIENT_FOR window 0x%lx for %s would create loop.\n"
|
||||||
msgstr "WM_TRANSIENT_FOR акно 0x%lx для %s стварыла б цыкл.\n"
|
msgstr "WM_TRANSIENT_FOR акно 0x%lx для %s стварыла б цыкл.\n"
|
||||||
@@ -689,7 +701,8 @@ msgstr ""
|
|||||||
|
|
||||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:17
|
#: ../src/org.gnome.mutter.gschema.xml.in.h:17
|
||||||
msgid "Auto maximize nearly monitor sized windows"
|
msgid "Auto maximize nearly monitor sized windows"
|
||||||
msgstr "Аўтаматычна максімалізаваць вокны, якія расцягнутыя амаль на ўвесь экран"
|
msgstr ""
|
||||||
|
"Аўтаматычна максімалізаваць вокны, якія расцягнутыя амаль на ўвесь экран"
|
||||||
|
|
||||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:18
|
#: ../src/org.gnome.mutter.gschema.xml.in.h:18
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -707,109 +720,104 @@ msgstr "Выбраць акно з выплыўнога акенца"
|
|||||||
msgid "Cancel tab popup"
|
msgid "Cancel tab popup"
|
||||||
msgstr "Закрыць выплыўное акенца"
|
msgstr "Закрыць выплыўное акенца"
|
||||||
|
|
||||||
#: ../src/tools/mutter-message.c:123
|
|
||||||
#, c-format
|
|
||||||
msgid "Usage: %s\n"
|
|
||||||
msgstr "Правілы выкарыстання: %s\n"
|
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:69
|
#: ../src/ui/menu.c:67
|
||||||
msgid "Mi_nimize"
|
msgid "Mi_nimize"
|
||||||
msgstr "_Мінімалізаваць"
|
msgstr "_Мінімалізаваць"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:71
|
#: ../src/ui/menu.c:69
|
||||||
msgid "Ma_ximize"
|
msgid "Ma_ximize"
|
||||||
msgstr "Ма_ксімалізаваць"
|
msgstr "Ма_ксімалізаваць"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:73
|
#: ../src/ui/menu.c:71
|
||||||
msgid "Unma_ximize"
|
msgid "Unma_ximize"
|
||||||
msgstr "Скасаваць ма_ксімалізацыю"
|
msgstr "Скасаваць ма_ксімалізацыю"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:75
|
#: ../src/ui/menu.c:73
|
||||||
msgid "Roll _Up"
|
msgid "Roll _Up"
|
||||||
msgstr "_Скруціць акно ў загаловак"
|
msgstr "_Скруціць акно ў загаловак"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:77
|
#: ../src/ui/menu.c:75
|
||||||
msgid "_Unroll"
|
msgid "_Unroll"
|
||||||
msgstr "Рас_круціць акно з загалоўка"
|
msgstr "Рас_круціць акно з загалоўка"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:79
|
#: ../src/ui/menu.c:77
|
||||||
msgid "_Move"
|
msgid "_Move"
|
||||||
msgstr "_Перамясціць акно"
|
msgstr "_Перамясціць акно"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:81
|
#: ../src/ui/menu.c:79
|
||||||
msgid "_Resize"
|
msgid "_Resize"
|
||||||
msgstr "_Змяніць памер акна"
|
msgstr "_Змяніць памер акна"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:83
|
#: ../src/ui/menu.c:81
|
||||||
msgid "Move Titlebar On_screen"
|
msgid "Move Titlebar On_screen"
|
||||||
msgstr "Перамясціць загаловак акна па _экране"
|
msgstr "Перамясціць загаловак акна па _экране"
|
||||||
|
|
||||||
#. separator
|
#. separator
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:86 ../src/ui/menu.c:88
|
#: ../src/ui/menu.c:84 ../src/ui/menu.c:86
|
||||||
msgid "Always on _Top"
|
msgid "Always on _Top"
|
||||||
msgstr "Заўсёды _наверсе"
|
msgstr "Заўсёды _наверсе"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:90
|
#: ../src/ui/menu.c:88
|
||||||
msgid "_Always on Visible Workspace"
|
msgid "_Always on Visible Workspace"
|
||||||
msgstr "Заўсёды на _бачнай прасторы працы"
|
msgstr "Заўсёды на _бачнай прасторы працы"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:92
|
#: ../src/ui/menu.c:90
|
||||||
msgid "_Only on This Workspace"
|
msgid "_Only on This Workspace"
|
||||||
msgstr "_Толькі на гэтай прасторы працы"
|
msgstr "_Толькі на гэтай прасторы працы"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:94
|
#: ../src/ui/menu.c:92
|
||||||
msgid "Move to Workspace _Left"
|
msgid "Move to Workspace _Left"
|
||||||
msgstr "Перамясціць на прастору працы з_лева"
|
msgstr "Перамясціць на прастору працы з_лева"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:96
|
#: ../src/ui/menu.c:94
|
||||||
msgid "Move to Workspace R_ight"
|
msgid "Move to Workspace R_ight"
|
||||||
msgstr "Перамясціць на прастору працы с_права"
|
msgstr "Перамясціць на прастору працы с_права"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:98
|
#: ../src/ui/menu.c:96
|
||||||
msgid "Move to Workspace _Up"
|
msgid "Move to Workspace _Up"
|
||||||
msgstr "Перамясціць на прастору працы з_верху"
|
msgstr "Перамясціць на прастору працы з_верху"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:100
|
#: ../src/ui/menu.c:98
|
||||||
msgid "Move to Workspace _Down"
|
msgid "Move to Workspace _Down"
|
||||||
msgstr "Перамясціць на прастору працы з_нізу"
|
msgstr "Перамясціць на прастору працы з_нізу"
|
||||||
|
|
||||||
#. separator
|
#. separator
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:104
|
#: ../src/ui/menu.c:102
|
||||||
msgid "_Close"
|
msgid "_Close"
|
||||||
msgstr "_Закрыць акно"
|
msgstr "_Закрыць акно"
|
||||||
|
|
||||||
#: ../src/ui/menu.c:204
|
#: ../src/ui/menu.c:202
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Workspace %d%n"
|
msgid "Workspace %d%n"
|
||||||
msgstr "Прастора працы %d%n"
|
msgstr "Прастора працы %d%n"
|
||||||
|
|
||||||
#: ../src/ui/menu.c:214
|
#: ../src/ui/menu.c:212
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Workspace 1_0"
|
msgid "Workspace 1_0"
|
||||||
msgstr "Прастора працы 1_0"
|
msgstr "Прастора працы 1_0"
|
||||||
|
|
||||||
#: ../src/ui/menu.c:216
|
#: ../src/ui/menu.c:214
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Workspace %s%d"
|
msgid "Workspace %s%d"
|
||||||
msgstr "Прастора працы %s%d"
|
msgstr "Прастора працы %s%d"
|
||||||
|
|
||||||
#: ../src/ui/menu.c:397
|
#: ../src/ui/menu.c:384
|
||||||
msgid "Move to Another _Workspace"
|
msgid "Move to Another _Workspace"
|
||||||
msgstr "П_ерамясціць на іншую прастору працы"
|
msgstr "П_ерамясціць на іншую прастору працы"
|
||||||
|
|
||||||
@@ -911,49 +919,49 @@ msgstr "Mod5"
|
|||||||
msgid "%d x %d"
|
msgid "%d x %d"
|
||||||
msgstr "%d x %d"
|
msgstr "%d x %d"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:235
|
#: ../src/ui/theme.c:236
|
||||||
msgid "top"
|
msgid "top"
|
||||||
msgstr "верхнюю"
|
msgstr "верхнюю"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:237
|
#: ../src/ui/theme.c:238
|
||||||
msgid "bottom"
|
msgid "bottom"
|
||||||
msgstr "ніжнюю"
|
msgstr "ніжнюю"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:239
|
#: ../src/ui/theme.c:240
|
||||||
msgid "left"
|
msgid "left"
|
||||||
msgstr "левую"
|
msgstr "левую"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:241
|
#: ../src/ui/theme.c:242
|
||||||
msgid "right"
|
msgid "right"
|
||||||
msgstr "правую"
|
msgstr "правую"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:269
|
#: ../src/ui/theme.c:270
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "frame geometry does not specify \"%s\" dimension"
|
msgid "frame geometry does not specify \"%s\" dimension"
|
||||||
msgstr "апісанне геаметрыі рамкі акна не вызначае %s граніцу"
|
msgstr "апісанне геаметрыі рамкі акна не вызначае %s граніцу"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:288
|
#: ../src/ui/theme.c:289
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "frame geometry does not specify dimension \"%s\" for border \"%s\""
|
msgid "frame geometry does not specify dimension \"%s\" for border \"%s\""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"апісанне геаметрыі рамкі акна не вызначае %s граніцу для аблямоўкі \"%s\""
|
"апісанне геаметрыі рамкі акна не вызначае %s граніцу для аблямоўкі \"%s\""
|
||||||
|
|
||||||
#: ../src/ui/theme.c:325
|
#: ../src/ui/theme.c:326
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Button aspect ratio %g is not reasonable"
|
msgid "Button aspect ratio %g is not reasonable"
|
||||||
msgstr "Прапорцыі кнопкі %g не маюць сэнсу"
|
msgstr "Прапорцыі кнопкі %g не маюць сэнсу"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:337
|
#: ../src/ui/theme.c:338
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Frame geometry does not specify size of buttons"
|
msgid "Frame geometry does not specify size of buttons"
|
||||||
msgstr "Апісанне геаметрыі рамкі акна не вызначае памер кнопак"
|
msgstr "Апісанне геаметрыі рамкі акна не вызначае памер кнопак"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1050
|
#: ../src/ui/theme.c:1051
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Gradients should have at least two colors"
|
msgid "Gradients should have at least two colors"
|
||||||
msgstr "Градыент мусіць мець прынамсі два колеры"
|
msgstr "Градыент мусіць мець прынамсі два колеры"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1202
|
#: ../src/ui/theme.c:1203
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"GTK custom color specification must have color name and fallback in "
|
"GTK custom color specification must have color name and fallback in "
|
||||||
@@ -962,7 +970,7 @@ msgstr ""
|
|||||||
"Уласная спецыфікацыя колеру GTK мусіць змяшчаць назвы асноўнага і запаснога "
|
"Уласная спецыфікацыя колеру GTK мусіць змяшчаць назвы асноўнага і запаснога "
|
||||||
"колераў у дужках, напрыклад, gtk:custom(foo,bar). Не ўдалося разабраць \"%s\""
|
"колераў у дужках, напрыклад, gtk:custom(foo,bar). Не ўдалося разабраць \"%s\""
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1218
|
#: ../src/ui/theme.c:1219
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Invalid character '%c' in color_name parameter of gtk:custom, only A-Za-z0-9-"
|
"Invalid character '%c' in color_name parameter of gtk:custom, only A-Za-z0-9-"
|
||||||
@@ -971,7 +979,7 @@ msgstr ""
|
|||||||
"Хібны знак \"%c\" у параметры color_name спецыфікацыі gtk:custom, дазволеныя "
|
"Хібны знак \"%c\" у параметры color_name спецыфікацыі gtk:custom, дазволеныя "
|
||||||
"толькі A-Za-z0-9-_"
|
"толькі A-Za-z0-9-_"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1232
|
#: ../src/ui/theme.c:1233
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Gtk:custom format is \"gtk:custom(color_name,fallback)\", \"%s\" does not "
|
"Gtk:custom format is \"gtk:custom(color_name,fallback)\", \"%s\" does not "
|
||||||
@@ -980,7 +988,7 @@ msgstr ""
|
|||||||
"Фармат gtk:custom: \"gtk:custom(назва_колеру,запасны_колер)\"; \"%s\" не "
|
"Фармат gtk:custom: \"gtk:custom(назва_колеру,запасны_колер)\"; \"%s\" не "
|
||||||
"адпавядае фармату"
|
"адпавядае фармату"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1277
|
#: ../src/ui/theme.c:1278
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"GTK color specification must have the state in brackets, e.g. gtk:fg[NORMAL] "
|
"GTK color specification must have the state in brackets, e.g. gtk:fg[NORMAL] "
|
||||||
@@ -989,7 +997,7 @@ msgstr ""
|
|||||||
"Спецыфікацыя колеру GTK мусіць мець стан у квадратных дужках, напрыклад, gtk:"
|
"Спецыфікацыя колеру GTK мусіць мець стан у квадратных дужках, напрыклад, gtk:"
|
||||||
"fg[NORMAL], дзе NORMAL - гэта стан. Не ўдалося разабраць \"%s\""
|
"fg[NORMAL], дзе NORMAL - гэта стан. Не ўдалося разабраць \"%s\""
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1291
|
#: ../src/ui/theme.c:1292
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"GTK color specification must have a close bracket after the state, e.g. gtk:"
|
"GTK color specification must have a close bracket after the state, e.g. gtk:"
|
||||||
@@ -999,17 +1007,17 @@ msgstr ""
|
|||||||
"напрыклад, gtk:fg[NORMAL], дзе NORMAL - гэта стан. Не ўдалося разабраць \"%s"
|
"напрыклад, gtk:fg[NORMAL], дзе NORMAL - гэта стан. Не ўдалося разабраць \"%s"
|
||||||
"\""
|
"\""
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1302
|
#: ../src/ui/theme.c:1303
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Did not understand state \"%s\" in color specification"
|
msgid "Did not understand state \"%s\" in color specification"
|
||||||
msgstr "Незразумелы стан \"%s\" у спецыфікацыі колеру"
|
msgstr "Незразумелы стан \"%s\" у спецыфікацыі колеру"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1315
|
#: ../src/ui/theme.c:1316
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Did not understand color component \"%s\" in color specification"
|
msgid "Did not understand color component \"%s\" in color specification"
|
||||||
msgstr "Незразумелы складнік колеру \"%s\" у спецыфікацыі колеру"
|
msgstr "Незразумелы складнік колеру \"%s\" у спецыфікацыі колеру"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1344
|
#: ../src/ui/theme.c:1345
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Blend format is \"blend/bg_color/fg_color/alpha\", \"%s\" does not fit the "
|
"Blend format is \"blend/bg_color/fg_color/alpha\", \"%s\" does not fit the "
|
||||||
@@ -1018,58 +1026,58 @@ msgstr ""
|
|||||||
"Фармат змяшанага колеру - \"blend/bg_color/fg_color/alpha\". \"%s\" не "
|
"Фармат змяшанага колеру - \"blend/bg_color/fg_color/alpha\". \"%s\" не "
|
||||||
"адпавядае фармату."
|
"адпавядае фармату."
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1355
|
#: ../src/ui/theme.c:1356
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Could not parse alpha value \"%s\" in blended color"
|
msgid "Could not parse alpha value \"%s\" in blended color"
|
||||||
msgstr "Не ўдалося разабраць значэнне альфа \"%s\" ў змяшаным колеры"
|
msgstr "Не ўдалося разабраць значэнне альфа \"%s\" ў змяшаным колеры"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1365
|
#: ../src/ui/theme.c:1366
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Alpha value \"%s\" in blended color is not between 0.0 and 1.0"
|
msgid "Alpha value \"%s\" in blended color is not between 0.0 and 1.0"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Значэнне альфа \"%s\" у змяшаным колеры не ўваходзіць у дыяпазон ад 0.0 да "
|
"Значэнне альфа \"%s\" у змяшаным колеры не ўваходзіць у дыяпазон ад 0.0 да "
|
||||||
"1.0"
|
"1.0"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1412
|
#: ../src/ui/theme.c:1413
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Shade format is \"shade/base_color/factor\", \"%s\" does not fit the format"
|
"Shade format is \"shade/base_color/factor\", \"%s\" does not fit the format"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Фармат ценю - \"shade/base_color/factor\". \"%s\" не адпавядае фармату."
|
"Фармат ценю - \"shade/base_color/factor\". \"%s\" не адпавядае фармату."
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1423
|
#: ../src/ui/theme.c:1424
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Could not parse shade factor \"%s\" in shaded color"
|
msgid "Could not parse shade factor \"%s\" in shaded color"
|
||||||
msgstr "Не ўдалося разабраць каэфіцыент ценю \"%s\" у зацененым колеры"
|
msgstr "Не ўдалося разабраць каэфіцыент ценю \"%s\" у зацененым колеры"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1433
|
#: ../src/ui/theme.c:1434
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Shade factor \"%s\" in shaded color is negative"
|
msgid "Shade factor \"%s\" in shaded color is negative"
|
||||||
msgstr "Каэфіцыент ценю \"%s\" у зацененым колеры адмоўны"
|
msgstr "Каэфіцыент ценю \"%s\" у зацененым колеры адмоўны"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1462
|
#: ../src/ui/theme.c:1463
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Could not parse color \"%s\""
|
msgid "Could not parse color \"%s\""
|
||||||
msgstr "Не ўдалося разабраць колер \"%s\""
|
msgstr "Не ўдалося разабраць колер \"%s\""
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1779
|
#: ../src/ui/theme.c:1780
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Coordinate expression contains character '%s' which is not allowed"
|
msgid "Coordinate expression contains character '%s' which is not allowed"
|
||||||
msgstr "Каардынатны выраз змяшчае забаронены знак \"%s\""
|
msgstr "Каардынатны выраз змяшчае забаронены знак \"%s\""
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1806
|
#: ../src/ui/theme.c:1807
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Coordinate expression contains floating point number '%s' which could not be "
|
"Coordinate expression contains floating point number '%s' which could not be "
|
||||||
"parsed"
|
"parsed"
|
||||||
msgstr "Каардынатны выраз змяшчае незразумелы лік з нефіксаванай коскай \"%s\""
|
msgstr "Каардынатны выраз змяшчае незразумелы лік з нефіксаванай коскай \"%s\""
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1820
|
#: ../src/ui/theme.c:1821
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Coordinate expression contains integer '%s' which could not be parsed"
|
msgid "Coordinate expression contains integer '%s' which could not be parsed"
|
||||||
msgstr "Каардынатны выраз змяшчае незразумелы цэлы лік \"%s\""
|
msgstr "Каардынатны выраз змяшчае незразумелы цэлы лік \"%s\""
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1941
|
#: ../src/ui/theme.c:1942
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Coordinate expression contained unknown operator at the start of this text: "
|
"Coordinate expression contained unknown operator at the start of this text: "
|
||||||
@@ -1077,17 +1085,17 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Каардынатны выраз змяшчае невядомы аператар у пачатку гэтага тэксту: \"%s\""
|
"Каардынатны выраз змяшчае невядомы аператар у пачатку гэтага тэксту: \"%s\""
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1998
|
#: ../src/ui/theme.c:1999
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Coordinate expression was empty or not understood"
|
msgid "Coordinate expression was empty or not understood"
|
||||||
msgstr "Каардынатны выраз пусты ці незразумелы"
|
msgstr "Каардынатны выраз пусты ці незразумелы"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2111 ../src/ui/theme.c:2121 ../src/ui/theme.c:2155
|
#: ../src/ui/theme.c:2112 ../src/ui/theme.c:2122 ../src/ui/theme.c:2156
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Coordinate expression results in division by zero"
|
msgid "Coordinate expression results in division by zero"
|
||||||
msgstr "Каардынатны выраз вымагае дзялення на нуль"
|
msgstr "Каардынатны выраз вымагае дзялення на нуль"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2163
|
#: ../src/ui/theme.c:2164
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Coordinate expression tries to use mod operator on a floating-point number"
|
"Coordinate expression tries to use mod operator on a floating-point number"
|
||||||
@@ -1095,24 +1103,24 @@ msgstr ""
|
|||||||
"Каардынатны выраз спрабуе ўжыць аператар дзялення па модулі для ліку з "
|
"Каардынатны выраз спрабуе ўжыць аператар дзялення па модулі для ліку з "
|
||||||
"нефіксаванай коскай"
|
"нефіксаванай коскай"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2219
|
#: ../src/ui/theme.c:2220
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Coordinate expression has an operator \"%s\" where an operand was expected"
|
"Coordinate expression has an operator \"%s\" where an operand was expected"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"У каардынатным выразе ўжыты аператар \"%s\" там, дзе мусіў быць аперанд"
|
"У каардынатным выразе ўжыты аператар \"%s\" там, дзе мусіў быць аперанд"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2228
|
#: ../src/ui/theme.c:2229
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Coordinate expression had an operand where an operator was expected"
|
msgid "Coordinate expression had an operand where an operator was expected"
|
||||||
msgstr "У каардынатным выразе ўжыты аперанд там, дзе мусіў быць аператар"
|
msgstr "У каардынатным выразе ўжыты аперанд там, дзе мусіў быць аператар"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2236
|
#: ../src/ui/theme.c:2237
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Coordinate expression ended with an operator instead of an operand"
|
msgid "Coordinate expression ended with an operator instead of an operand"
|
||||||
msgstr "Каардынатны выраз заканчваецца аператарам, а не аперандам"
|
msgstr "Каардынатны выраз заканчваецца аператарам, а не аперандам"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2246
|
#: ../src/ui/theme.c:2247
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Coordinate expression has operator \"%c\" following operator \"%c\" with no "
|
"Coordinate expression has operator \"%c\" following operator \"%c\" with no "
|
||||||
@@ -1121,41 +1129,41 @@ msgstr ""
|
|||||||
"У каардынатным выразе за аператарам \"%c\" ідзе аператар \"%c\", але паміж "
|
"У каардынатным выразе за аператарам \"%c\" ідзе аператар \"%c\", але паміж "
|
||||||
"імі няма аперанда"
|
"імі няма аперанда"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2397 ../src/ui/theme.c:2442
|
#: ../src/ui/theme.c:2398 ../src/ui/theme.c:2443
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Coordinate expression had unknown variable or constant \"%s\""
|
msgid "Coordinate expression had unknown variable or constant \"%s\""
|
||||||
msgstr "У каардынатным выразе невядомая зменная альбо канстанта \"%s\""
|
msgstr "У каардынатным выразе невядомая зменная альбо канстанта \"%s\""
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2496
|
#: ../src/ui/theme.c:2497
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Coordinate expression parser overflowed its buffer."
|
msgid "Coordinate expression parser overflowed its buffer."
|
||||||
msgstr "Прылада для разбору каардынатных выразаў перапоўніла свой буфер."
|
msgstr "Прылада для разбору каардынатных выразаў перапоўніла свой буфер."
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2525
|
#: ../src/ui/theme.c:2526
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Coordinate expression had a close parenthesis with no open parenthesis"
|
msgid "Coordinate expression had a close parenthesis with no open parenthesis"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"У каардынатным выразе ўжытыя дужкі, якія закрываюцца, але няма тых, якія б "
|
"У каардынатным выразе ўжытыя дужкі, якія закрываюцца, але няма тых, якія б "
|
||||||
"адкрываліся"
|
"адкрываліся"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2589
|
#: ../src/ui/theme.c:2590
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Coordinate expression had an open parenthesis with no close parenthesis"
|
msgid "Coordinate expression had an open parenthesis with no close parenthesis"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"У каардынатным выразе ўжытыя дужкі, якія адкрываюцца, але няма тых, якія б "
|
"У каардынатным выразе ўжытыя дужкі, якія адкрываюцца, але няма тых, якія б "
|
||||||
"закрываліся"
|
"закрываліся"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2600
|
#: ../src/ui/theme.c:2601
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Coordinate expression doesn't seem to have any operators or operands"
|
msgid "Coordinate expression doesn't seem to have any operators or operands"
|
||||||
msgstr "У каардынатным выразе няма ні аператараў, ні аперандаў"
|
msgstr "У каардынатным выразе няма ні аператараў, ні аперандаў"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2813 ../src/ui/theme.c:2833 ../src/ui/theme.c:2853
|
#: ../src/ui/theme.c:2814 ../src/ui/theme.c:2834 ../src/ui/theme.c:2854
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Theme contained an expression that resulted in an error: %s\n"
|
msgid "Theme contained an expression that resulted in an error: %s\n"
|
||||||
msgstr "Матыў аздаблення змяшчае выраз, які стаў прычынай памылкі: %s\n"
|
msgstr "Матыў аздаблення змяшчае выраз, які стаў прычынай памылкі: %s\n"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:4499
|
#: ../src/ui/theme.c:4500
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"<button function=\"%s\" state=\"%s\" draw_ops=\"whatever\"/> must be "
|
"<button function=\"%s\" state=\"%s\" draw_ops=\"whatever\"/> must be "
|
||||||
@@ -1164,25 +1172,25 @@ msgstr ""
|
|||||||
"Для гэтага стылю рамкі трэба вызначыць <button function=\"%s\" state=\"%s\" "
|
"Для гэтага стылю рамкі трэба вызначыць <button function=\"%s\" state=\"%s\" "
|
||||||
"draw_ops=\"whatever\"/>"
|
"draw_ops=\"whatever\"/>"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5010 ../src/ui/theme.c:5035
|
#: ../src/ui/theme.c:5011 ../src/ui/theme.c:5036
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Missing <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/>"
|
"Missing <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/>"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Няма <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"што-небудзь\"/>"
|
"Няма <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"што-небудзь\"/>"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5083
|
#: ../src/ui/theme.c:5082
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to load theme \"%s\": %s\n"
|
msgid "Failed to load theme \"%s\": %s\n"
|
||||||
msgstr "Не ўдалося загрузіць матыў аздаблення \"%s\": %s\n"
|
msgstr "Не ўдалося загрузіць матыў аздаблення \"%s\": %s\n"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5219 ../src/ui/theme.c:5226 ../src/ui/theme.c:5233
|
#: ../src/ui/theme.c:5218 ../src/ui/theme.c:5225 ../src/ui/theme.c:5232
|
||||||
#: ../src/ui/theme.c:5240 ../src/ui/theme.c:5247
|
#: ../src/ui/theme.c:5239 ../src/ui/theme.c:5246
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "No <%s> set for theme \"%s\""
|
msgid "No <%s> set for theme \"%s\""
|
||||||
msgstr "Для матыву аздаблення \"%2$s\" не прызначана <%1$s>"
|
msgstr "Для матыву аздаблення \"%2$s\" не прызначана <%1$s>"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5255
|
#: ../src/ui/theme.c:5254
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"No frame style set for window type \"%s\" in theme \"%s\", add a <window "
|
"No frame style set for window type \"%s\" in theme \"%s\", add a <window "
|
||||||
@@ -1191,7 +1199,7 @@ msgstr ""
|
|||||||
"Стыль рамкі не вызначаны для вокнаў тыпу \"%s\" для матыву аздаблення \"%s"
|
"Стыль рамкі не вызначаны для вокнаў тыпу \"%s\" для матыву аздаблення \"%s"
|
||||||
"\". Дадайце <window type=\"%s\" style_set=\"штосьці\"/>."
|
"\". Дадайце <window type=\"%s\" style_set=\"штосьці\"/>."
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5662 ../src/ui/theme.c:5724 ../src/ui/theme.c:5787
|
#: ../src/ui/theme.c:5661 ../src/ui/theme.c:5723 ../src/ui/theme.c:5786
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"User-defined constants must begin with a capital letter; \"%s\" does not"
|
"User-defined constants must begin with a capital letter; \"%s\" does not"
|
||||||
@@ -1199,7 +1207,7 @@ msgstr ""
|
|||||||
"Назвы канстантаў, вызначаных карыстальнікам, мусяць пачынацца з вялікай "
|
"Назвы канстантаў, вызначаных карыстальнікам, мусяць пачынацца з вялікай "
|
||||||
"літары. \"%s\" не адпавядае гэтаму патрабаванню."
|
"літары. \"%s\" не адпавядае гэтаму патрабаванню."
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5670 ../src/ui/theme.c:5732 ../src/ui/theme.c:5795
|
#: ../src/ui/theme.c:5669 ../src/ui/theme.c:5731 ../src/ui/theme.c:5794
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Constant \"%s\" has already been defined"
|
msgid "Constant \"%s\" has already been defined"
|
||||||
msgstr "Канстанта \"%s\" ужо азначана"
|
msgstr "Канстанта \"%s\" ужо азначана"
|
||||||
@@ -1585,207 +1593,8 @@ msgstr "Выкарыстанне тэксту ўнутры элемента <%s>
|
|||||||
msgid "<%s> specified twice for this theme"
|
msgid "<%s> specified twice for this theme"
|
||||||
msgstr "<%s> двойчы вызначаны для гэтага матыву аздаблення"
|
msgstr "<%s> двойчы вызначаны для гэтага матыву аздаблення"
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:4334
|
#: ../src/ui/theme-parser.c:4336
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to find a valid file for theme %s\n"
|
msgid "Failed to find a valid file for theme %s\n"
|
||||||
msgstr "Памылка пошуку правільнага файла для матыву аздаблення %s\n"
|
msgstr "Памылка пошуку правільнага файла для матыву аздаблення %s\n"
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:99
|
|
||||||
msgid "_Windows"
|
|
||||||
msgstr "_Вокны"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:100
|
|
||||||
msgid "_Dialog"
|
|
||||||
msgstr "_Дыялогавае акенца"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:101
|
|
||||||
msgid "_Modal dialog"
|
|
||||||
msgstr "_Мадальнае дыялогавае акенца"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:102
|
|
||||||
msgid "_Utility"
|
|
||||||
msgstr "_Дапаможная праграма"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:103
|
|
||||||
msgid "_Splashscreen"
|
|
||||||
msgstr "_Экранная застаўка"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:104
|
|
||||||
msgid "_Top dock"
|
|
||||||
msgstr "_Верхняя ўбудова"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:105
|
|
||||||
msgid "_Bottom dock"
|
|
||||||
msgstr "_Ніжняя ўбудова"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:106
|
|
||||||
msgid "_Left dock"
|
|
||||||
msgstr "_Левая ўбудова"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:107
|
|
||||||
msgid "_Right dock"
|
|
||||||
msgstr "_Правая ўбудова"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:108
|
|
||||||
msgid "_All docks"
|
|
||||||
msgstr "_Усе ўбудовы"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:109
|
|
||||||
msgid "Des_ktop"
|
|
||||||
msgstr "_Стол"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:115
|
|
||||||
msgid "Open another one of these windows"
|
|
||||||
msgstr "Адкрыць чарговае з гэтых вокнаў"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:117
|
|
||||||
msgid "This is a demo button with an 'open' icon"
|
|
||||||
msgstr "Гэта дэманстрацыйная кнопка са значком \"Адкрыць\""
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:119
|
|
||||||
msgid "This is a demo button with a 'quit' icon"
|
|
||||||
msgstr "Гэта дэманстрацыйная кнопка са значком \"Выйсці\""
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:248
|
|
||||||
msgid "This is a sample message in a sample dialog"
|
|
||||||
msgstr "Гэта ўзорнае паведамленне ва ўзорным дыялогавым акенцы"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:328
|
|
||||||
#, c-format
|
|
||||||
msgid "Fake menu item %d\n"
|
|
||||||
msgstr "Несапраўдны пункт меню %d\n"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:363
|
|
||||||
msgid "Border-only window"
|
|
||||||
msgstr "Акно толькі з аблямоўкай"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:365
|
|
||||||
msgid "Bar"
|
|
||||||
msgstr "Стужка"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:382
|
|
||||||
msgid "Normal Application Window"
|
|
||||||
msgstr "Звычайнае акно праграмы"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:386
|
|
||||||
msgid "Dialog Box"
|
|
||||||
msgstr "Дыялогавае акенца"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:390
|
|
||||||
msgid "Modal Dialog Box"
|
|
||||||
msgstr "Мадальнае дыялогавае акенца"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:394
|
|
||||||
msgid "Utility Palette"
|
|
||||||
msgstr "Дапаможная палітра"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:398
|
|
||||||
msgid "Torn-off Menu"
|
|
||||||
msgstr "Адчэпленае меню"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:402
|
|
||||||
msgid "Border"
|
|
||||||
msgstr "Аблямоўка"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:406
|
|
||||||
msgid "Attached Modal Dialog"
|
|
||||||
msgstr "Прычапленае мадальнае дыялогавае акенца"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:737
|
|
||||||
#, c-format
|
|
||||||
msgid "Button layout test %d"
|
|
||||||
msgstr "Выпрабаванне размяшчэння кнопак %d"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:766
|
|
||||||
#, c-format
|
|
||||||
msgid "%g milliseconds to draw one window frame"
|
|
||||||
msgstr "%g мілісекунд, каб намаляваць адну рамку акна"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:811
|
|
||||||
#, c-format
|
|
||||||
msgid "Usage: metacity-theme-viewer [THEMENAME]\n"
|
|
||||||
msgstr "Правілы карыстання: metacity-theme-viewer [НАЗВА_МАТЫВУ]\n"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:818
|
|
||||||
#, c-format
|
|
||||||
msgid "Error loading theme: %s\n"
|
|
||||||
msgstr "Памылка загрузкі матыву аздаблення: %s\n"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:824
|
|
||||||
#, c-format
|
|
||||||
msgid "Loaded theme \"%s\" in %g seconds\n"
|
|
||||||
msgstr "Матыў аздаблення \"%s\" загружаны за %g секунд\n"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:869
|
|
||||||
msgid "Normal Title Font"
|
|
||||||
msgstr "Звычайны шрыфт загалоўка"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:875
|
|
||||||
msgid "Small Title Font"
|
|
||||||
msgstr "Маленькі шрыфт загалоўка"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:881
|
|
||||||
msgid "Large Title Font"
|
|
||||||
msgstr "Вялікі шрыфт загалоўка"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:886
|
|
||||||
msgid "Button Layouts"
|
|
||||||
msgstr "Размяшчэнне кнопак"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:891
|
|
||||||
msgid "Benchmark"
|
|
||||||
msgstr "Выпрабаванне"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:947
|
|
||||||
msgid "Window Title Goes Here"
|
|
||||||
msgstr "Месца для загалоўка акна"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:1053
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Drew %d frames in %g client-side seconds (%g milliseconds per frame) and %g "
|
|
||||||
"seconds wall clock time including X server resources (%g milliseconds per "
|
|
||||||
"frame)\n"
|
|
||||||
msgstr ""
|
|
||||||
"Намалявана %d рамак цягам %g секунд кліенцкага часу (%g мілісекунд на рамку) "
|
|
||||||
"і %g секунд каляндарнага часу, уключна з рэсурсамі X-сервера (%g мілісекунд "
|
|
||||||
"на рамку)\n"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:1273
|
|
||||||
msgid "position expression test returned TRUE but set error"
|
|
||||||
msgstr "выпрабаванне выразу пазіцыі вярнула TRUE, але паведаміла аб памылцы"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:1275
|
|
||||||
msgid "position expression test returned FALSE but didn't set error"
|
|
||||||
msgstr ""
|
|
||||||
"выпрабаванне выразу пазіцыі вярнула FALSE, але не паведаміла аб памылцы"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:1279
|
|
||||||
msgid "Error was expected but none given"
|
|
||||||
msgstr "Чакалася памылка, але звесткі не атрыманыя"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:1281
|
|
||||||
#, c-format
|
|
||||||
msgid "Error %d was expected but %d given"
|
|
||||||
msgstr "Чакалася памылка %d, але атрымана %d"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:1287
|
|
||||||
#, c-format
|
|
||||||
msgid "Error not expected but one was returned: %s"
|
|
||||||
msgstr "Атрымана нечаканая памылка: %s"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:1291
|
|
||||||
#, c-format
|
|
||||||
msgid "x value was %d, %d was expected"
|
|
||||||
msgstr "X-значэнне было %d, а чакалася %d"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:1294
|
|
||||||
#, c-format
|
|
||||||
msgid "y value was %d, %d was expected"
|
|
||||||
msgstr "Y-значэнне было %d, а чакалася %d"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:1359
|
|
||||||
#, c-format
|
|
||||||
msgid "%d coordinate expressions parsed in %g seconds (%g seconds average)\n"
|
|
||||||
msgstr ""
|
|
||||||
"%d каардынатных выразаў разабраныя за %g секунд (у сярэднім %g секунд)\n"
|
|
||||||
|
231
po/et.po
231
po/et.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: 2013-03-12 18:53+0000\n"
|
"POT-Creation-Date: 2013-09-10 15:25+0000\n"
|
||||||
"PO-Revision-Date: 2013-03-12 20:55+0300\n"
|
"PO-Revision-Date: 2013-09-11 23:20+0300\n"
|
||||||
"Last-Translator: Mattias Põldaru <mahfiaz@gmail.com>\n"
|
"Last-Translator: Mattias Põldaru <mahfiaz@gmail.com>\n"
|
||||||
"Language-Team: Estonian <>\n"
|
"Language-Team: Estonian <>\n"
|
||||||
"Language: et\n"
|
"Language: et\n"
|
||||||
@@ -23,6 +23,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.5.4\n"
|
||||||
|
|
||||||
msgid "Navigation"
|
msgid "Navigation"
|
||||||
msgstr "Navigeerimine"
|
msgstr "Navigeerimine"
|
||||||
@@ -249,6 +250,17 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Teemat ei leitud! Veendu, et %s on olemas ja sisaldab harilikke teemasid.\n"
|
"Teemat ei leitud! Veendu, et %s on olemas ja sisaldab harilikke teemasid.\n"
|
||||||
|
|
||||||
|
msgid "Built-in display"
|
||||||
|
msgstr "Sisseehitatud kuva"
|
||||||
|
|
||||||
|
#. TRANSLATORS: this is a monitor name (in case we don't know
|
||||||
|
#. the vendor), it's Unknown followed by a size in inches,
|
||||||
|
#. like 'Unknown 15"'
|
||||||
|
#.
|
||||||
|
#, c-format
|
||||||
|
msgid "Unknown %s"
|
||||||
|
msgstr "Tundmatu %s"
|
||||||
|
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"mutter %s\n"
|
"mutter %s\n"
|
||||||
@@ -381,7 +393,6 @@ msgstr "Tõrge logifaili %s avamisel funktsiooniga fdopen(): %s\n"
|
|||||||
msgid "Opened log file %s\n"
|
msgid "Opened log file %s\n"
|
||||||
msgstr "Avati logifail %s\n"
|
msgstr "Avati logifail %s\n"
|
||||||
|
|
||||||
#, c-format
|
|
||||||
msgid "Mutter was compiled without support for verbose mode\n"
|
msgid "Mutter was compiled without support for verbose mode\n"
|
||||||
msgstr "Mutter kompileeriti ilma jutuka režiimi toeta\n"
|
msgstr "Mutter kompileeriti ilma jutuka režiimi toeta\n"
|
||||||
|
|
||||||
@@ -572,10 +583,6 @@ msgstr "Akna valimine tabulaatori hüpikaknalt"
|
|||||||
msgid "Cancel tab popup"
|
msgid "Cancel tab popup"
|
||||||
msgstr "Tabulaatori hüpikakna katkestamine"
|
msgstr "Tabulaatori hüpikakna katkestamine"
|
||||||
|
|
||||||
#, c-format
|
|
||||||
msgid "Usage: %s\n"
|
|
||||||
msgstr "Kasutamine: %s\n"
|
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
msgid "Mi_nimize"
|
msgid "Mi_nimize"
|
||||||
msgstr "_Minimeeri"
|
msgstr "_Minimeeri"
|
||||||
@@ -1281,159 +1288,151 @@ msgstr "Selle teema jaoks on <%s> määratud kaks korda"
|
|||||||
msgid "Failed to find a valid file for theme %s\n"
|
msgid "Failed to find a valid file for theme %s\n"
|
||||||
msgstr "Tõrge %s teema jaoks korrektse faili leidmisel\n"
|
msgstr "Tõrge %s teema jaoks korrektse faili leidmisel\n"
|
||||||
|
|
||||||
msgid "_Windows"
|
#~ msgid "Usage: %s\n"
|
||||||
msgstr "_Aknad"
|
#~ msgstr "Kasutamine: %s\n"
|
||||||
|
|
||||||
msgid "_Dialog"
|
#~ msgid "_Windows"
|
||||||
msgstr "_Dialoog"
|
#~ msgstr "_Aknad"
|
||||||
|
|
||||||
msgid "_Modal dialog"
|
#~ msgid "_Dialog"
|
||||||
msgstr "_Modaaldialoog"
|
#~ msgstr "_Dialoog"
|
||||||
|
|
||||||
msgid "_Utility"
|
#~ msgid "_Modal dialog"
|
||||||
msgstr "_Utiliit"
|
#~ msgstr "_Modaaldialoog"
|
||||||
|
|
||||||
msgid "_Splashscreen"
|
#~ msgid "_Utility"
|
||||||
msgstr "_Käivitusekraan"
|
#~ msgstr "_Utiliit"
|
||||||
|
|
||||||
msgid "_Top dock"
|
#~ msgid "_Splashscreen"
|
||||||
msgstr "Ü_lemine dokk"
|
#~ msgstr "_Käivitusekraan"
|
||||||
|
|
||||||
msgid "_Bottom dock"
|
#~ msgid "_Top dock"
|
||||||
msgstr "_Alumine dokk"
|
#~ msgstr "Ü_lemine dokk"
|
||||||
|
|
||||||
msgid "_Left dock"
|
#~ msgid "_Bottom dock"
|
||||||
msgstr "_Vasak dokk"
|
#~ msgstr "_Alumine dokk"
|
||||||
|
|
||||||
msgid "_Right dock"
|
#~ msgid "_Left dock"
|
||||||
msgstr "_Parem dokk"
|
#~ msgstr "_Vasak dokk"
|
||||||
|
|
||||||
msgid "_All docks"
|
#~ msgid "_Right dock"
|
||||||
msgstr "_Kõik dokid"
|
#~ msgstr "_Parem dokk"
|
||||||
|
|
||||||
msgid "Des_ktop"
|
#~ msgid "_All docks"
|
||||||
msgstr "_Töölaud"
|
#~ msgstr "_Kõik dokid"
|
||||||
|
|
||||||
msgid "Open another one of these windows"
|
#~ msgid "Des_ktop"
|
||||||
msgstr "Ava neist akendest järgmine"
|
#~ msgstr "_Töölaud"
|
||||||
|
|
||||||
msgid "This is a demo button with an 'open' icon"
|
#~ msgid "Open another one of these windows"
|
||||||
msgstr "See on näidisnupp koos 'ava' ikooniga"
|
#~ msgstr "Ava neist akendest järgmine"
|
||||||
|
|
||||||
msgid "This is a demo button with a 'quit' icon"
|
#~ msgid "This is a demo button with an 'open' icon"
|
||||||
msgstr "See on näidisnupp koos 'lõpeta' ikooniga"
|
#~ msgstr "See on näidisnupp koos 'ava' ikooniga"
|
||||||
|
|
||||||
msgid "This is a sample message in a sample dialog"
|
#~ msgid "This is a demo button with a 'quit' icon"
|
||||||
msgstr "See on näidisteade näidisdialoogis"
|
#~ msgstr "See on näidisnupp koos 'lõpeta' ikooniga"
|
||||||
|
|
||||||
#, c-format
|
#~ msgid "This is a sample message in a sample dialog"
|
||||||
msgid "Fake menu item %d\n"
|
#~ msgstr "See on näidisteade näidisdialoogis"
|
||||||
msgstr "Võltsitud menüüpunkt %d\n"
|
|
||||||
|
|
||||||
msgid "Border-only window"
|
#~ msgid "Fake menu item %d\n"
|
||||||
msgstr "Ainult raamiga aken"
|
#~ msgstr "Võltsitud menüüpunkt %d\n"
|
||||||
|
|
||||||
msgid "Bar"
|
#~ msgid "Border-only window"
|
||||||
msgstr "Riba"
|
#~ msgstr "Ainult raamiga aken"
|
||||||
|
|
||||||
msgid "Normal Application Window"
|
#~ msgid "Bar"
|
||||||
msgstr "Tavaline rakenduseaken"
|
#~ msgstr "Riba"
|
||||||
|
|
||||||
msgid "Dialog Box"
|
#~ msgid "Normal Application Window"
|
||||||
msgstr "Dialoogikast"
|
#~ msgstr "Tavaline rakenduseaken"
|
||||||
|
|
||||||
msgid "Modal Dialog Box"
|
#~ msgid "Dialog Box"
|
||||||
msgstr "Modaalne dialoogikast"
|
#~ msgstr "Dialoogikast"
|
||||||
|
|
||||||
msgid "Utility Palette"
|
#~ msgid "Modal Dialog Box"
|
||||||
msgstr "Rakendite palett"
|
#~ msgstr "Modaalne dialoogikast"
|
||||||
|
|
||||||
msgid "Torn-off Menu"
|
#~ msgid "Utility Palette"
|
||||||
msgstr "Ärarebitav menüü"
|
#~ msgstr "Rakendite palett"
|
||||||
|
|
||||||
msgid "Border"
|
#~ msgid "Torn-off Menu"
|
||||||
msgstr "Raam"
|
#~ msgstr "Ärarebitav menüü"
|
||||||
|
|
||||||
msgid "Attached Modal Dialog"
|
#~ msgid "Border"
|
||||||
msgstr "Kinnistatud modaaldialoog"
|
#~ msgstr "Raam"
|
||||||
|
|
||||||
#, c-format
|
#~ msgid "Attached Modal Dialog"
|
||||||
msgid "Button layout test %d"
|
#~ msgstr "Kinnistatud modaaldialoog"
|
||||||
msgstr "Nuppude paigutuse test %d"
|
|
||||||
|
|
||||||
#, c-format
|
#~ msgid "Button layout test %d"
|
||||||
msgid "%g milliseconds to draw one window frame"
|
#~ msgstr "Nuppude paigutuse test %d"
|
||||||
msgstr "%g millisekundit kulub ühe akna raami joonistamiseks"
|
|
||||||
|
|
||||||
#, c-format
|
#~ msgid "%g milliseconds to draw one window frame"
|
||||||
msgid "Usage: metacity-theme-viewer [THEMENAME]\n"
|
#~ msgstr "%g millisekundit kulub ühe akna raami joonistamiseks"
|
||||||
msgstr "Kasutamine: metacity-theme-viewer [TEEMANIMI]\n"
|
|
||||||
|
|
||||||
#, c-format
|
#~ msgid "Usage: metacity-theme-viewer [THEMENAME]\n"
|
||||||
msgid "Error loading theme: %s\n"
|
#~ msgstr "Kasutamine: metacity-theme-viewer [TEEMANIMI]\n"
|
||||||
msgstr "Viga teema laadimisel: %s\n"
|
|
||||||
|
|
||||||
#, c-format
|
#~ msgid "Error loading theme: %s\n"
|
||||||
msgid "Loaded theme \"%s\" in %g seconds\n"
|
#~ msgstr "Viga teema laadimisel: %s\n"
|
||||||
msgstr "Teema \"%s\" laaditi %g sekundiga\n"
|
|
||||||
|
|
||||||
msgid "Normal Title Font"
|
#~ msgid "Loaded theme \"%s\" in %g seconds\n"
|
||||||
msgstr "Tiitli tavasuurusega kirjatüüp"
|
#~ msgstr "Teema \"%s\" laaditi %g sekundiga\n"
|
||||||
|
|
||||||
msgid "Small Title Font"
|
#~ msgid "Normal Title Font"
|
||||||
msgstr "Tiitli väike kirjatüüp"
|
#~ msgstr "Tiitli tavasuurusega kirjatüüp"
|
||||||
|
|
||||||
msgid "Large Title Font"
|
#~ msgid "Small Title Font"
|
||||||
msgstr "Tiitli suur kirjatüüp"
|
#~ msgstr "Tiitli väike kirjatüüp"
|
||||||
|
|
||||||
msgid "Button Layouts"
|
#~ msgid "Large Title Font"
|
||||||
msgstr "Nuppude paigutus"
|
#~ msgstr "Tiitli suur kirjatüüp"
|
||||||
|
|
||||||
msgid "Benchmark"
|
#~ msgid "Button Layouts"
|
||||||
msgstr "Jõudlus"
|
#~ msgstr "Nuppude paigutus"
|
||||||
|
|
||||||
msgid "Window Title Goes Here"
|
#~ msgid "Benchmark"
|
||||||
msgstr "Siia tuleb akna pealkiri"
|
#~ msgstr "Jõudlus"
|
||||||
|
|
||||||
#, c-format
|
#~ msgid "Window Title Goes Here"
|
||||||
msgid ""
|
#~ msgstr "Siia tuleb akna pealkiri"
|
||||||
"Drew %d frames in %g client-side seconds (%g milliseconds per frame) and %g "
|
|
||||||
"seconds wall clock time including X server resources (%g milliseconds per "
|
|
||||||
"frame)\n"
|
|
||||||
msgstr ""
|
|
||||||
"Joonistati %d kaadrit %g kliendi-kella sekundiga (%g millisekundit kaadrile) "
|
|
||||||
"ja %g sekundiga seinakella järgi, millesse on kaasatud X-serveri "
|
|
||||||
"ressursikasutus (%g millisekundit kaadrile)\n"
|
|
||||||
|
|
||||||
msgid "position expression test returned TRUE but set error"
|
#~ msgid ""
|
||||||
msgstr "asukoha avaldise kontroll tagastas TÕENE, aga määras vea"
|
#~ "Drew %d frames in %g client-side seconds (%g milliseconds per frame) and "
|
||||||
|
#~ "%g seconds wall clock time including X server resources (%g milliseconds "
|
||||||
|
#~ "per frame)\n"
|
||||||
|
#~ msgstr ""
|
||||||
|
#~ "Joonistati %d kaadrit %g kliendi-kella sekundiga (%g millisekundit "
|
||||||
|
#~ "kaadrile) ja %g sekundiga seinakella järgi, millesse on kaasatud X-"
|
||||||
|
#~ "serveri ressursikasutus (%g millisekundit kaadrile)\n"
|
||||||
|
|
||||||
msgid "position expression test returned FALSE but didn't set error"
|
#~ msgid "position expression test returned TRUE but set error"
|
||||||
msgstr "asukoha avaldise kontroll tagastas VÄÄR, aga ei määranud viga"
|
#~ msgstr "asukoha avaldise kontroll tagastas TÕENE, aga määras vea"
|
||||||
|
|
||||||
msgid "Error was expected but none given"
|
#~ msgid "position expression test returned FALSE but didn't set error"
|
||||||
msgstr "Oodati viga, aga ühtegi ei edastatud"
|
#~ msgstr "asukoha avaldise kontroll tagastas VÄÄR, aga ei määranud viga"
|
||||||
|
|
||||||
#, c-format
|
#~ msgid "Error was expected but none given"
|
||||||
msgid "Error %d was expected but %d given"
|
#~ msgstr "Oodati viga, aga ühtegi ei edastatud"
|
||||||
msgstr "Oodati viga %d, aga edastati viga %d"
|
|
||||||
|
|
||||||
#, c-format
|
#~ msgid "Error %d was expected but %d given"
|
||||||
msgid "Error not expected but one was returned: %s"
|
#~ msgstr "Oodati viga %d, aga edastati viga %d"
|
||||||
msgstr "Viga ei oodatud, aga üks edastati: %s"
|
|
||||||
|
|
||||||
#, c-format
|
#~ msgid "Error not expected but one was returned: %s"
|
||||||
msgid "x value was %d, %d was expected"
|
#~ msgstr "Viga ei oodatud, aga üks edastati: %s"
|
||||||
msgstr "x väärtus oli %d, oodati väärtust %d"
|
|
||||||
|
|
||||||
#, c-format
|
#~ msgid "x value was %d, %d was expected"
|
||||||
msgid "y value was %d, %d was expected"
|
#~ msgstr "x väärtus oli %d, oodati väärtust %d"
|
||||||
msgstr "y väärtus oli %d, oodati väärtust %d"
|
|
||||||
|
|
||||||
#, c-format
|
#~ msgid "y value was %d, %d was expected"
|
||||||
msgid "%d coordinate expressions parsed in %g seconds (%g seconds average)\n"
|
#~ msgstr "y väärtus oli %d, oodati väärtust %d"
|
||||||
msgstr ""
|
|
||||||
"%d koordinaatide avaldis töödeldi %g sekundiga (keskmine %g sekundit)\n"
|
#~ msgid ""
|
||||||
|
#~ "%d coordinate expressions parsed in %g seconds (%g seconds average)\n"
|
||||||
|
#~ msgstr ""
|
||||||
|
#~ "%d koordinaatide avaldis töödeldi %g sekundiga (keskmine %g sekundit)\n"
|
||||||
|
|
||||||
#~ msgid "Minimize window"
|
#~ msgid "Minimize window"
|
||||||
#~ msgstr "Akna minimeerimine"
|
#~ msgstr "Akna minimeerimine"
|
||||||
|
327
po/id.po
327
po/id.po
@@ -11,15 +11,15 @@ 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: 2013-03-28 10:28+0000\n"
|
"POT-Creation-Date: 2013-08-18 20:03+0000\n"
|
||||||
"PO-Revision-Date: 2013-03-30 11:24+0700\n"
|
"PO-Revision-Date: 2013-09-14 15:44+0700\n"
|
||||||
"Last-Translator: Andika Triwidada <andika@gmail.com>\n"
|
"Last-Translator: Andika Triwidada <andika@gmail.com>\n"
|
||||||
"Language-Team: Indonesian <gnome@i15n.org>\n"
|
"Language-Team: Indonesian <gnome@i15n.org>\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.5.5\n"
|
"X-Generator: Poedit 1.5.7\n"
|
||||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||||
|
|
||||||
#: ../src/50-mutter-navigation.xml.in.h:1
|
#: ../src/50-mutter-navigation.xml.in.h:1
|
||||||
@@ -212,7 +212,7 @@ msgstr "Tampilan dipisah ke kanan"
|
|||||||
|
|
||||||
#. 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:568
|
#: ../src/compositor/compositor.c:589
|
||||||
#, 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"
|
||||||
@@ -220,7 +220,7 @@ 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:1065
|
#: ../src/compositor/meta-background.c:1076
|
||||||
msgid "background texture could not be created from file"
|
msgid "background texture could not be created from file"
|
||||||
msgstr "tekstur latar tak bisa dibuat dari berkas"
|
msgstr "tekstur latar tak bisa dibuat dari berkas"
|
||||||
|
|
||||||
@@ -257,24 +257,24 @@ msgstr "_Tunggu"
|
|||||||
msgid "_Force Quit"
|
msgid "_Force Quit"
|
||||||
msgstr "_Matikan Paksa"
|
msgstr "_Matikan Paksa"
|
||||||
|
|
||||||
#: ../src/core/display.c:401
|
#: ../src/core/display.c:421
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Missing %s extension required for compositing"
|
msgid "Missing %s extension required for compositing"
|
||||||
msgstr "Kehilangan ekstensi %s yang diperlukan untuk pengkomposisian"
|
msgstr "Kehilangan ekstensi %s yang diperlukan untuk pengkomposisian"
|
||||||
|
|
||||||
#: ../src/core/display.c:493
|
#: ../src/core/display.c:513
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to open X Window System display '%s'\n"
|
msgid "Failed to open X Window System display '%s'\n"
|
||||||
msgstr "Gagal membuka tampilan X Window System '%s'\n"
|
msgstr "Gagal membuka tampilan X Window System '%s'\n"
|
||||||
|
|
||||||
#: ../src/core/keybindings.c:935
|
#: ../src/core/keybindings.c:1136
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Some other program is already using the key %s with modifiers %x as a "
|
"Some other program is already using the key %s with modifiers %x as a "
|
||||||
"binding\n"
|
"binding\n"
|
||||||
msgstr "Ada program lain yang menggunakan tombol %s dengan kombinasi %x\n"
|
msgstr "Ada program lain yang menggunakan tombol %s dengan kombinasi %x\n"
|
||||||
|
|
||||||
#: ../src/core/keybindings.c:1135
|
#: ../src/core/keybindings.c:1333
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "\"%s\" is not a valid accelerator\n"
|
msgid "\"%s\" is not a valid accelerator\n"
|
||||||
msgstr "\"%s\" bukan akselerator yang valid\n"
|
msgstr "\"%s\" bukan akselerator yang valid\n"
|
||||||
@@ -314,6 +314,19 @@ msgid ""
|
|||||||
"Could not find a theme! Be sure %s exists and contains the usual themes.\n"
|
"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"
|
msgstr "Tak menemukan tema! Pastikan %s ada dan berisi tema yang biasa.\n"
|
||||||
|
|
||||||
|
#: ../src/core/monitor.c:711
|
||||||
|
msgid "Built-in display"
|
||||||
|
msgstr "Tampilan bawaan"
|
||||||
|
|
||||||
|
#. TRANSLATORS: this is a monitor name (in case we don't know
|
||||||
|
#. the vendor), it's Unknown followed by a size in inches,
|
||||||
|
#. like 'Unknown 15"'
|
||||||
|
#.
|
||||||
|
#: ../src/core/monitor.c:739
|
||||||
|
#, c-format
|
||||||
|
msgid "Unknown %s"
|
||||||
|
msgstr "%s tidak dikenal"
|
||||||
|
|
||||||
#: ../src/core/mutter.c:40
|
#: ../src/core/mutter.c:40
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -338,7 +351,7 @@ 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:1095
|
#: ../src/core/prefs.c:1202
|
||||||
msgid ""
|
msgid ""
|
||||||
"Workarounds for broken applications disabled. Some applications may not "
|
"Workarounds for broken applications disabled. Some applications may not "
|
||||||
"behave properly.\n"
|
"behave properly.\n"
|
||||||
@@ -346,12 +359,12 @@ msgstr ""
|
|||||||
"Pencegahan kesalahan bagi aplikasi yang rusak sedang dinonaktifkan. Mungkin "
|
"Pencegahan kesalahan bagi aplikasi yang rusak sedang dinonaktifkan. Mungkin "
|
||||||
"nanti ada beberapa aplikasi yang akan bertingkah aneh.\n"
|
"nanti ada beberapa aplikasi yang akan bertingkah aneh.\n"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:1170
|
#: ../src/core/prefs.c:1277
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Could not parse font description \"%s\" from GSettings key %s\n"
|
msgid "Could not parse font description \"%s\" from GSettings key %s\n"
|
||||||
msgstr "Tak dapat mengurai deskripsi fonta \"%s\" dari kunci GSettings %s\n"
|
msgstr "Tak dapat mengurai deskripsi fonta \"%s\" dari kunci GSettings %s\n"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:1236
|
#: ../src/core/prefs.c:1343
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"\"%s\" found in configuration database is not a valid value for mouse button "
|
"\"%s\" found in configuration database is not a valid value for mouse button "
|
||||||
@@ -360,7 +373,7 @@ msgstr ""
|
|||||||
"\"%s\" yang ada pada database konfigurasi bukanlah nilai yang benar untuk "
|
"\"%s\" yang ada pada database konfigurasi bukanlah nilai yang benar untuk "
|
||||||
"tombol mouse.\n"
|
"tombol mouse.\n"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:1788
|
#: ../src/core/prefs.c:1909
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"\"%s\" found in configuration database is not a valid value for keybinding "
|
"\"%s\" found in configuration database is not a valid value for keybinding "
|
||||||
@@ -369,17 +382,17 @@ msgstr ""
|
|||||||
"\"%s\" yang ada pada database konfigurasi bernilai tidak benar untuk "
|
"\"%s\" yang ada pada database konfigurasi bernilai tidak benar untuk "
|
||||||
"kombinasi tombol \"%s\"\n"
|
"kombinasi tombol \"%s\"\n"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:1887
|
#: ../src/core/prefs.c:1999
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Workspace %d"
|
msgid "Workspace %d"
|
||||||
msgstr "Area kerja %d"
|
msgstr "Area kerja %d"
|
||||||
|
|
||||||
#: ../src/core/screen.c:691
|
#: ../src/core/screen.c:534
|
||||||
#, 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:707
|
#: ../src/core/screen.c:550
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Screen %d on display \"%s\" already has a window manager; try using the --"
|
"Screen %d on display \"%s\" already has a window manager; try using the --"
|
||||||
@@ -388,7 +401,7 @@ msgstr ""
|
|||||||
"Layar %d pada tampilan \"%s\" sudah memiliki pengatur jendela. Cobalah "
|
"Layar %d pada tampilan \"%s\" sudah memiliki pengatur jendela. Cobalah "
|
||||||
"gunakan pilihan --replace untuk mengganti pengatur jendela yang aktif.\n"
|
"gunakan pilihan --replace untuk mengganti pengatur jendela yang aktif.\n"
|
||||||
|
|
||||||
#: ../src/core/screen.c:734
|
#: ../src/core/screen.c:577
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Could not acquire window manager selection on screen %d display \"%s\"\n"
|
"Could not acquire window manager selection on screen %d display \"%s\"\n"
|
||||||
@@ -396,12 +409,12 @@ msgstr ""
|
|||||||
"Tidak dapat mendapatkan pilihan pengatur jendela pada layar %d tampilan \"%s"
|
"Tidak dapat mendapatkan pilihan pengatur jendela pada layar %d tampilan \"%s"
|
||||||
"\"\n"
|
"\"\n"
|
||||||
|
|
||||||
#: ../src/core/screen.c:812
|
#: ../src/core/screen.c:655
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Screen %d on display \"%s\" already has a window manager\n"
|
msgid "Screen %d on display \"%s\" already has a window manager\n"
|
||||||
msgstr "Layar %d pada tampilan \"%s\" sudah ada pengatur jendelanya\n"
|
msgstr "Layar %d pada tampilan \"%s\" sudah ada pengatur jendelanya\n"
|
||||||
|
|
||||||
#: ../src/core/screen.c:998
|
#: ../src/core/screen.c:846
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Could not release screen %d on display \"%s\"\n"
|
msgid "Could not release screen %d on display \"%s\"\n"
|
||||||
msgstr "Layar %d pada tampilan \"%s\" tidak dapat dilepas\n"
|
msgstr "Layar %d pada tampilan \"%s\" tidak dapat dilepas\n"
|
||||||
@@ -476,8 +489,7 @@ msgstr "Gagal melakukan fdopen pada berkas log %s: %s\n"
|
|||||||
msgid "Opened log file %s\n"
|
msgid "Opened log file %s\n"
|
||||||
msgstr "Berkas log yang dibuka %s\n"
|
msgstr "Berkas log yang dibuka %s\n"
|
||||||
|
|
||||||
#: ../src/core/util.c:119 ../src/tools/mutter-message.c:149
|
#: ../src/core/util.c:119
|
||||||
#, c-format
|
|
||||||
msgid "Mutter was compiled without support for verbose mode\n"
|
msgid "Mutter was compiled without support for verbose mode\n"
|
||||||
msgstr "Muter dikompilasi tanpa dukungan mode riuh\n"
|
msgstr "Muter dikompilasi tanpa dukungan mode riuh\n"
|
||||||
|
|
||||||
@@ -485,20 +497,20 @@ msgstr "Muter dikompilasi tanpa dukungan mode riuh\n"
|
|||||||
msgid "Window manager: "
|
msgid "Window manager: "
|
||||||
msgstr "Pengatur jendela: "
|
msgstr "Pengatur jendela: "
|
||||||
|
|
||||||
#: ../src/core/util.c:412
|
#: ../src/core/util.c:414
|
||||||
msgid "Bug in window manager: "
|
msgid "Bug in window manager: "
|
||||||
msgstr "Bug pada pengatur jendela: "
|
msgstr "Bug pada pengatur jendela: "
|
||||||
|
|
||||||
#: ../src/core/util.c:443
|
#: ../src/core/util.c:445
|
||||||
msgid "Window manager warning: "
|
msgid "Window manager warning: "
|
||||||
msgstr "Peringatan pengatur jendela: "
|
msgstr "Peringatan pengatur jendela: "
|
||||||
|
|
||||||
#: ../src/core/util.c:471
|
#: ../src/core/util.c:473
|
||||||
msgid "Window manager error: "
|
msgid "Window manager error: "
|
||||||
msgstr "Eror pengatur jendela: "
|
msgstr "Eror pengatur jendela: "
|
||||||
|
|
||||||
#. first time through
|
#. first time through
|
||||||
#: ../src/core/window.c:7596
|
#: ../src/core/window.c:7533
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER "
|
"Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER "
|
||||||
@@ -514,7 +526,7 @@ msgstr ""
|
|||||||
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
|
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
|
||||||
#. * about these apps but make them work.
|
#. * about these apps but make them work.
|
||||||
#.
|
#.
|
||||||
#: ../src/core/window.c:8320
|
#: ../src/core/window.c:8257
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Window %s sets an MWM hint indicating it isn't resizable, but sets min size "
|
"Window %s sets an MWM hint indicating it isn't resizable, but sets min size "
|
||||||
@@ -524,22 +536,22 @@ msgstr ""
|
|||||||
"ukurannya, sedangkan ukuran minimalnya adalah %d x %d dan maksimal %d x %d "
|
"ukurannya, sedangkan ukuran minimalnya adalah %d x %d dan maksimal %d x %d "
|
||||||
"yang tidak masuk di akal.\n"
|
"yang tidak masuk di akal.\n"
|
||||||
|
|
||||||
#: ../src/core/window-props.c:318
|
#: ../src/core/window-props.c:347
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Application set a bogus _NET_WM_PID %lu\n"
|
msgid "Application set a bogus _NET_WM_PID %lu\n"
|
||||||
msgstr "Aplikasi telah membuat _NET_WM_PID %lu bohongan\n"
|
msgstr "Aplikasi telah membuat _NET_WM_PID %lu bohongan\n"
|
||||||
|
|
||||||
#: ../src/core/window-props.c:434
|
#: ../src/core/window-props.c:463
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s (on %s)"
|
msgid "%s (on %s)"
|
||||||
msgstr "%s (pada %s)"
|
msgstr "%s (pada %s)"
|
||||||
|
|
||||||
#: ../src/core/window-props.c:1517
|
#: ../src/core/window-props.c:1546
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
|
msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
|
||||||
msgstr "WM_TRANSIENT_FOR salah jendela 0x%lx ditentukan untuk %s.\n"
|
msgstr "WM_TRANSIENT_FOR salah jendela 0x%lx ditentukan untuk %s.\n"
|
||||||
|
|
||||||
#: ../src/core/window-props.c:1528
|
#: ../src/core/window-props.c:1557
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "WM_TRANSIENT_FOR window 0x%lx for %s would create loop.\n"
|
msgid "WM_TRANSIENT_FOR window 0x%lx for %s would create loop.\n"
|
||||||
msgstr "Jendela WM_TRANSIENT_FOR 0x%lx untuk %s akan membuat loop.\n"
|
msgstr "Jendela WM_TRANSIENT_FOR 0x%lx untuk %s akan membuat loop.\n"
|
||||||
@@ -703,109 +715,104 @@ msgstr "Pilih jendela dari popup tab"
|
|||||||
msgid "Cancel tab popup"
|
msgid "Cancel tab popup"
|
||||||
msgstr "Batalkan popup tab"
|
msgstr "Batalkan popup tab"
|
||||||
|
|
||||||
#: ../src/tools/mutter-message.c:123
|
|
||||||
#, c-format
|
|
||||||
msgid "Usage: %s\n"
|
|
||||||
msgstr "Cara pakai: %s\n"
|
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:69
|
#: ../src/ui/menu.c:67
|
||||||
msgid "Mi_nimize"
|
msgid "Mi_nimize"
|
||||||
msgstr "Kecilka_n"
|
msgstr "Kecilka_n"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:71
|
#: ../src/ui/menu.c:69
|
||||||
msgid "Ma_ximize"
|
msgid "Ma_ximize"
|
||||||
msgstr "Pe_rbesar"
|
msgstr "Pe_rbesar"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:73
|
#: ../src/ui/menu.c:71
|
||||||
msgid "Unma_ximize"
|
msgid "Unma_ximize"
|
||||||
msgstr "Kem_balikan"
|
msgstr "Kem_balikan"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:75
|
#: ../src/ui/menu.c:73
|
||||||
msgid "Roll _Up"
|
msgid "Roll _Up"
|
||||||
msgstr "G_ulung"
|
msgstr "G_ulung"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:77
|
#: ../src/ui/menu.c:75
|
||||||
msgid "_Unroll"
|
msgid "_Unroll"
|
||||||
msgstr "B_uka"
|
msgstr "B_uka"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:79
|
#: ../src/ui/menu.c:77
|
||||||
msgid "_Move"
|
msgid "_Move"
|
||||||
msgstr "_Pindahkan"
|
msgstr "_Pindahkan"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:81
|
#: ../src/ui/menu.c:79
|
||||||
msgid "_Resize"
|
msgid "_Resize"
|
||||||
msgstr "Ganti·Uku_ran"
|
msgstr "Ganti·Uku_ran"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:83
|
#: ../src/ui/menu.c:81
|
||||||
msgid "Move Titlebar On_screen"
|
msgid "Move Titlebar On_screen"
|
||||||
msgstr "Pindahkan Judul Pada _layar"
|
msgstr "Pindahkan Judul Pada _layar"
|
||||||
|
|
||||||
#. separator
|
#. separator
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:86 ../src/ui/menu.c:88
|
#: ../src/ui/menu.c:84 ../src/ui/menu.c:86
|
||||||
msgid "Always on _Top"
|
msgid "Always on _Top"
|
||||||
msgstr "Selalu di A_tas"
|
msgstr "Selalu di A_tas"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:90
|
#: ../src/ui/menu.c:88
|
||||||
msgid "_Always on Visible Workspace"
|
msgid "_Always on Visible Workspace"
|
||||||
msgstr "T_ampak pada Area Kerja Aktif"
|
msgstr "T_ampak pada Area Kerja Aktif"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:92
|
#: ../src/ui/menu.c:90
|
||||||
msgid "_Only on This Workspace"
|
msgid "_Only on This Workspace"
|
||||||
msgstr "_Tampak pada Area Kerja Ini Saja"
|
msgstr "_Tampak pada Area Kerja Ini Saja"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:94
|
#: ../src/ui/menu.c:92
|
||||||
msgid "Move to Workspace _Left"
|
msgid "Move to Workspace _Left"
|
||||||
msgstr "Pindahkan ke Area Kerja _Kiri"
|
msgstr "Pindahkan ke Area Kerja _Kiri"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:96
|
#: ../src/ui/menu.c:94
|
||||||
msgid "Move to Workspace R_ight"
|
msgid "Move to Workspace R_ight"
|
||||||
msgstr "Pindahkan ke A_rea Kerja Kanan"
|
msgstr "Pindahkan ke A_rea Kerja Kanan"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:98
|
#: ../src/ui/menu.c:96
|
||||||
msgid "Move to Workspace _Up"
|
msgid "Move to Workspace _Up"
|
||||||
msgstr "Pindahkan ke Area Kerja Ata_s"
|
msgstr "Pindahkan ke Area Kerja Ata_s"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:100
|
#: ../src/ui/menu.c:98
|
||||||
msgid "Move to Workspace _Down"
|
msgid "Move to Workspace _Down"
|
||||||
msgstr "Pindahkan ke Area Kerja _Bawah"
|
msgstr "Pindahkan ke Area Kerja _Bawah"
|
||||||
|
|
||||||
#. separator
|
#. separator
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:104
|
#: ../src/ui/menu.c:102
|
||||||
msgid "_Close"
|
msgid "_Close"
|
||||||
msgstr "_Tutup"
|
msgstr "_Tutup"
|
||||||
|
|
||||||
#: ../src/ui/menu.c:204
|
#: ../src/ui/menu.c:202
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Workspace %d%n"
|
msgid "Workspace %d%n"
|
||||||
msgstr "Area Kerja %d%n"
|
msgstr "Area Kerja %d%n"
|
||||||
|
|
||||||
#: ../src/ui/menu.c:214
|
#: ../src/ui/menu.c:212
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Workspace 1_0"
|
msgid "Workspace 1_0"
|
||||||
msgstr "Area Kerja 1_0"
|
msgstr "Area Kerja 1_0"
|
||||||
|
|
||||||
#: ../src/ui/menu.c:216
|
#: ../src/ui/menu.c:214
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Workspace %s%d"
|
msgid "Workspace %s%d"
|
||||||
msgstr "Area Kerja %s%d"
|
msgstr "Area Kerja %s%d"
|
||||||
|
|
||||||
#: ../src/ui/menu.c:397
|
#: ../src/ui/menu.c:384
|
||||||
msgid "Move to Another _Workspace"
|
msgid "Move to Another _Workspace"
|
||||||
msgstr "Pindahkan ke Area Kerja _Lain"
|
msgstr "Pindahkan ke Area Kerja _Lain"
|
||||||
|
|
||||||
@@ -1163,18 +1170,18 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"<frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/> tidak ada"
|
"<frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/> tidak ada"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5084
|
#: ../src/ui/theme.c:5082
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to load theme \"%s\": %s\n"
|
msgid "Failed to load theme \"%s\": %s\n"
|
||||||
msgstr "Gagal membuka tema \"%s\": %s\n"
|
msgstr "Gagal membuka tema \"%s\": %s\n"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5220 ../src/ui/theme.c:5227 ../src/ui/theme.c:5234
|
#: ../src/ui/theme.c:5218 ../src/ui/theme.c:5225 ../src/ui/theme.c:5232
|
||||||
#: ../src/ui/theme.c:5241 ../src/ui/theme.c:5248
|
#: ../src/ui/theme.c:5239 ../src/ui/theme.c:5246
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "No <%s> set for theme \"%s\""
|
msgid "No <%s> set for theme \"%s\""
|
||||||
msgstr "Tidak ada <%s> yang ditentukan untuk tema \"%s\""
|
msgstr "Tidak ada <%s> yang ditentukan untuk tema \"%s\""
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5256
|
#: ../src/ui/theme.c:5254
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"No frame style set for window type \"%s\" in theme \"%s\", add a <window "
|
"No frame style set for window type \"%s\" in theme \"%s\", add a <window "
|
||||||
@@ -1183,14 +1190,14 @@ msgstr ""
|
|||||||
"Tidak ada gaya frame untuk tipe window \"%s\" pada tema \"%s\". Tambah dulu "
|
"Tidak ada gaya frame untuk tipe window \"%s\" pada tema \"%s\". Tambah dulu "
|
||||||
"elemen <window type=\"%s\" style_set=\"whatever\"/>"
|
"elemen <window type=\"%s\" style_set=\"whatever\"/>"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5663 ../src/ui/theme.c:5725 ../src/ui/theme.c:5788
|
#: ../src/ui/theme.c:5661 ../src/ui/theme.c:5723 ../src/ui/theme.c:5786
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"User-defined constants must begin with a capital letter; \"%s\" does not"
|
"User-defined constants must begin with a capital letter; \"%s\" does not"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Konstanta buatan pengguna harus dimulai dengan huruf besar: \"%s\" tidak"
|
"Konstanta buatan pengguna harus dimulai dengan huruf besar: \"%s\" tidak"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5671 ../src/ui/theme.c:5733 ../src/ui/theme.c:5796
|
#: ../src/ui/theme.c:5669 ../src/ui/theme.c:5731 ../src/ui/theme.c:5794
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Constant \"%s\" has already been defined"
|
msgid "Constant \"%s\" has already been defined"
|
||||||
msgstr "Konstanta \"%s\" telah didefinisikan sebelumnya"
|
msgstr "Konstanta \"%s\" telah didefinisikan sebelumnya"
|
||||||
@@ -1578,201 +1585,3 @@ msgstr "<%s> disebutkan dua kali pada tema ini"
|
|||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to find a valid file for theme %s\n"
|
msgid "Failed to find a valid file for theme %s\n"
|
||||||
msgstr "Gagal menemukan berkas yang sah untuk tema %s\n"
|
msgstr "Gagal menemukan berkas yang sah untuk tema %s\n"
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:99
|
|
||||||
msgid "_Windows"
|
|
||||||
msgstr "_Jendela"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:100
|
|
||||||
msgid "_Dialog"
|
|
||||||
msgstr "_Dialog"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:101
|
|
||||||
msgid "_Modal dialog"
|
|
||||||
msgstr "Dialog _modal"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:102
|
|
||||||
msgid "_Utility"
|
|
||||||
msgstr "_Utilitas"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:103
|
|
||||||
msgid "_Splashscreen"
|
|
||||||
msgstr "Layar _pembuka"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:104
|
|
||||||
msgid "_Top dock"
|
|
||||||
msgstr "Dok a_tas"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:105
|
|
||||||
msgid "_Bottom dock"
|
|
||||||
msgstr "Dok _bawah"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:106
|
|
||||||
msgid "_Left dock"
|
|
||||||
msgstr "Dok k_iri"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:107
|
|
||||||
msgid "_Right dock"
|
|
||||||
msgstr "Dok kana_n"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:108
|
|
||||||
msgid "_All docks"
|
|
||||||
msgstr "Semu_a dok"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:109
|
|
||||||
msgid "Des_ktop"
|
|
||||||
msgstr "Des_ktop"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:115
|
|
||||||
msgid "Open another one of these windows"
|
|
||||||
msgstr "Buka lagi jendela semacam ini"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:117
|
|
||||||
msgid "This is a demo button with an 'open' icon"
|
|
||||||
msgstr "Ini contoh tombol dengan ikon 'open'"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:119
|
|
||||||
msgid "This is a demo button with a 'quit' icon"
|
|
||||||
msgstr "Ini contoh tombol dengan ikon 'quit'"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:248
|
|
||||||
msgid "This is a sample message in a sample dialog"
|
|
||||||
msgstr "Ini contoh pesan pada suatu dialog"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:328
|
|
||||||
#, c-format
|
|
||||||
msgid "Fake menu item %d\n"
|
|
||||||
msgstr "Item menu %d\n"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:363
|
|
||||||
msgid "Border-only window"
|
|
||||||
msgstr "Jendela dengan garis pembatas"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:365
|
|
||||||
msgid "Bar"
|
|
||||||
msgstr "Kotak"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:382
|
|
||||||
msgid "Normal Application Window"
|
|
||||||
msgstr "Jendela Aplikasi Normal"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:386
|
|
||||||
msgid "Dialog Box"
|
|
||||||
msgstr "Kotak Dialog"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:390
|
|
||||||
msgid "Modal Dialog Box"
|
|
||||||
msgstr "Kotak Dialog Modal"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:394
|
|
||||||
msgid "Utility Palette"
|
|
||||||
msgstr "Kotak Perkakas"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:398
|
|
||||||
msgid "Torn-off Menu"
|
|
||||||
msgstr "Menu Dapat Dilepas"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:402
|
|
||||||
msgid "Border"
|
|
||||||
msgstr "Batas"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:406
|
|
||||||
msgid "Attached Modal Dialog"
|
|
||||||
msgstr "Dialog Modal yang Dilampirkan"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:737
|
|
||||||
#, c-format
|
|
||||||
msgid "Button layout test %d"
|
|
||||||
msgstr "Tes komposisi tombol %d"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:766
|
|
||||||
#, c-format
|
|
||||||
msgid "%g milliseconds to draw one window frame"
|
|
||||||
msgstr "lama waktu menggambar satu bingkai jendela %g milidetik"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:811
|
|
||||||
#, c-format
|
|
||||||
msgid "Usage: metacity-theme-viewer [THEMENAME]\n"
|
|
||||||
msgstr "Cara pakai: metacity-theme-viewer [NAMA TEMA]\n"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:818
|
|
||||||
#, c-format
|
|
||||||
msgid "Error loading theme: %s\n"
|
|
||||||
msgstr "Ada error saat membaca tema: %s\n"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:824
|
|
||||||
#, c-format
|
|
||||||
msgid "Loaded theme \"%s\" in %g seconds\n"
|
|
||||||
msgstr "Tema \"%s\" dibuka dalam %g detik\n"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:869
|
|
||||||
msgid "Normal Title Font"
|
|
||||||
msgstr "Judul dengan huruf normal"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:875
|
|
||||||
msgid "Small Title Font"
|
|
||||||
msgstr "Judul dengan huruf ukuran kecil"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:881
|
|
||||||
msgid "Large Title Font"
|
|
||||||
msgstr "Judul Raksasa"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:886
|
|
||||||
msgid "Button Layouts"
|
|
||||||
msgstr "Komposisi Tombol"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:891
|
|
||||||
msgid "Benchmark"
|
|
||||||
msgstr "Pengukuran"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:947
|
|
||||||
msgid "Window Title Goes Here"
|
|
||||||
msgstr "Ini tempat judul jendela"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:1053
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Drew %d frames in %g client-side seconds (%g milliseconds per frame) and %g "
|
|
||||||
"seconds wall clock time including X server resources (%g milliseconds per "
|
|
||||||
"frame)\n"
|
|
||||||
msgstr ""
|
|
||||||
"%d frame dibuat dalam %g detik dalam waktu klien (%g milidetik per frame) "
|
|
||||||
"dan %g detik dalam waktu sebenarnya (%g milidetik per frame)\n"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:1273
|
|
||||||
msgid "position expression test returned TRUE but set error"
|
|
||||||
msgstr "tes ekspresi posisi berakhir TRUE tapi justru ada error"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:1275
|
|
||||||
msgid "position expression test returned FALSE but didn't set error"
|
|
||||||
msgstr "tes ekspresi posisi berakhir FALSE tapi tidak ada error"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:1279
|
|
||||||
msgid "Error was expected but none given"
|
|
||||||
msgstr "Seharusnya ada error, tapi ini kok tidak ada"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:1281
|
|
||||||
#, c-format
|
|
||||||
msgid "Error %d was expected but %d given"
|
|
||||||
msgstr "Seharunya ada error %d, tapi yang terjadi %d"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:1287
|
|
||||||
#, c-format
|
|
||||||
msgid "Error not expected but one was returned: %s"
|
|
||||||
msgstr "Seharusnya tidak ada error, tapi ini tiba-tiba ada error: %s"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:1291
|
|
||||||
#, c-format
|
|
||||||
msgid "x value was %d, %d was expected"
|
|
||||||
msgstr "nilai x sebelumnya %d, padahal seharusnya %d"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:1294
|
|
||||||
#, c-format
|
|
||||||
msgid "y value was %d, %d was expected"
|
|
||||||
msgstr "nilai y sebelumnya %d, padahal seharusnya %d"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:1359
|
|
||||||
#, c-format
|
|
||||||
msgid "%d coordinate expressions parsed in %g seconds (%g seconds average)\n"
|
|
||||||
msgstr "ekspresi koordinat %d diambil dalam %g detik (rata-rata %g detik)\n"
|
|
||||||
|
|
||||||
|
458
po/ko.po
458
po/ko.po
@@ -18,8 +18,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: 2013-03-01 15:50+0000\n"
|
"POT-Creation-Date: 2013-08-18 20:03+0000\n"
|
||||||
"PO-Revision-Date: 2013-03-13 03:52+0900\n"
|
"PO-Revision-Date: 2013-09-09 04:46+0900\n"
|
||||||
"Last-Translator: Changwoo Ryu <cwryu@debian.org>\n"
|
"Last-Translator: Changwoo Ryu <cwryu@debian.org>\n"
|
||||||
"Language-Team: GNOME Korea <gnome-kr@googlegroups.com>\n"
|
"Language-Team: GNOME Korea <gnome-kr@googlegroups.com>\n"
|
||||||
"Language: Korean\n"
|
"Language: Korean\n"
|
||||||
@@ -218,7 +218,7 @@ msgstr "오른쪽 절반 뷰"
|
|||||||
|
|
||||||
#. 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:507
|
#: ../src/compositor/compositor.c:589
|
||||||
#, 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"
|
||||||
@@ -227,11 +227,11 @@ msgstr ""
|
|||||||
"다른 창 구성 관리 프로그램이 이미 디스플레이 \"%2$s\" 화면 %1$i번에서 실행 중"
|
"다른 창 구성 관리 프로그램이 이미 디스플레이 \"%2$s\" 화면 %1$i번에서 실행 중"
|
||||||
"입니다."
|
"입니다."
|
||||||
|
|
||||||
#: ../src/compositor/meta-background.c:1111
|
#: ../src/compositor/meta-background.c:1076
|
||||||
msgid "background texture could not be created from file"
|
msgid "background texture could not be created from file"
|
||||||
msgstr "파일에서 배경 텍스처를 만들 수 없습니다"
|
msgstr "파일에서 배경 텍스처를 만들 수 없습니다"
|
||||||
|
|
||||||
#: ../src/core/bell.c:320
|
#: ../src/core/bell.c:322
|
||||||
msgid "Bell event"
|
msgid "Bell event"
|
||||||
msgstr "삑소리 이벤트"
|
msgstr "삑소리 이벤트"
|
||||||
|
|
||||||
@@ -263,17 +263,17 @@ msgstr "기다리기(_W)"
|
|||||||
msgid "_Force Quit"
|
msgid "_Force Quit"
|
||||||
msgstr "강제로 끝내기(_F)"
|
msgstr "강제로 끝내기(_F)"
|
||||||
|
|
||||||
#: ../src/core/display.c:401
|
#: ../src/core/display.c:421
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Missing %s extension required for compositing"
|
msgid "Missing %s extension required for compositing"
|
||||||
msgstr "콤포짓에 필요한 %s 확장 기능이 없습니다"
|
msgstr "콤포짓에 필요한 %s 확장 기능이 없습니다"
|
||||||
|
|
||||||
#: ../src/core/display.c:493
|
#: ../src/core/display.c:513
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to open X Window System display '%s'\n"
|
msgid "Failed to open X Window System display '%s'\n"
|
||||||
msgstr "X 윈도 시스템 디스플레이 '%s'을(를) 여는데 실패하였습니다\n"
|
msgstr "X 윈도 시스템 디스플레이 '%s'을(를) 여는데 실패하였습니다\n"
|
||||||
|
|
||||||
#: ../src/core/keybindings.c:929
|
#: ../src/core/keybindings.c:1136
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Some other program is already using the key %s with modifiers %x as a "
|
"Some other program is already using the key %s with modifiers %x as a "
|
||||||
@@ -282,41 +282,41 @@ msgstr ""
|
|||||||
"다른 프로그램에서 이미 단축키로 변경 키 %2$x와(과) 키 %1$s을(를) 사용하고 있"
|
"다른 프로그램에서 이미 단축키로 변경 키 %2$x와(과) 키 %1$s을(를) 사용하고 있"
|
||||||
"습니다\n"
|
"습니다\n"
|
||||||
|
|
||||||
#: ../src/core/keybindings.c:1129
|
#: ../src/core/keybindings.c:1333
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "\"%s\" is not a valid accelerator\n"
|
msgid "\"%s\" is not a valid accelerator\n"
|
||||||
msgstr "\"%s\"은(는) 올바른 단축키가 아닙니다\n"
|
msgstr "\"%s\"은(는) 올바른 단축키가 아닙니다\n"
|
||||||
|
|
||||||
#: ../src/core/main.c:196
|
#: ../src/core/main.c:197
|
||||||
msgid "Disable connection to session manager"
|
msgid "Disable connection to session manager"
|
||||||
msgstr "세션 관리자와 연결 하지 않습니다"
|
msgstr "세션 관리자와 연결 하지 않습니다"
|
||||||
|
|
||||||
#: ../src/core/main.c:202
|
#: ../src/core/main.c:203
|
||||||
msgid "Replace the running window manager"
|
msgid "Replace the running window manager"
|
||||||
msgstr "실행 중인 창 관리자를 바꿉니다"
|
msgstr "실행 중인 창 관리자를 바꿉니다"
|
||||||
|
|
||||||
#: ../src/core/main.c:208
|
#: ../src/core/main.c:209
|
||||||
msgid "Specify session management ID"
|
msgid "Specify session management ID"
|
||||||
msgstr "세션 관리 ID를 지정합니다"
|
msgstr "세션 관리 ID를 지정합니다"
|
||||||
|
|
||||||
#: ../src/core/main.c:213
|
#: ../src/core/main.c:214
|
||||||
msgid "X Display to use"
|
msgid "X Display to use"
|
||||||
msgstr "사용할 X 디스플레이"
|
msgstr "사용할 X 디스플레이"
|
||||||
|
|
||||||
#: ../src/core/main.c:219
|
#: ../src/core/main.c:220
|
||||||
msgid "Initialize session from savefile"
|
msgid "Initialize session from savefile"
|
||||||
msgstr "저장 파일에서 세션을 초기화 합니다"
|
msgstr "저장 파일에서 세션을 초기화 합니다"
|
||||||
|
|
||||||
#: ../src/core/main.c:225
|
#: ../src/core/main.c:226
|
||||||
msgid "Make X calls synchronous"
|
msgid "Make X calls synchronous"
|
||||||
msgstr "동기 X 호출을 합니다"
|
msgstr "동기 X 호출을 합니다"
|
||||||
|
|
||||||
#: ../src/core/main.c:494
|
#: ../src/core/main.c:534
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to scan themes directory: %s\n"
|
msgid "Failed to scan themes directory: %s\n"
|
||||||
msgstr "테마 디렉터리를 읽는 데 실패했습니다: %s\n"
|
msgstr "테마 디렉터리를 읽는 데 실패했습니다: %s\n"
|
||||||
|
|
||||||
#: ../src/core/main.c:510
|
#: ../src/core/main.c:550
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Could not find a theme! Be sure %s exists and contains the usual themes.\n"
|
"Could not find a theme! Be sure %s exists and contains the usual themes.\n"
|
||||||
@@ -324,6 +324,19 @@ msgstr ""
|
|||||||
"테마를 찾을 수 없습니다! %s이(가) 있고 올바른 테마가 들어 있는지 확인하십시"
|
"테마를 찾을 수 없습니다! %s이(가) 있고 올바른 테마가 들어 있는지 확인하십시"
|
||||||
"오.\n"
|
"오.\n"
|
||||||
|
|
||||||
|
#: ../src/core/monitor.c:711
|
||||||
|
msgid "Built-in display"
|
||||||
|
msgstr "내장 디스플레이"
|
||||||
|
|
||||||
|
#. TRANSLATORS: this is a monitor name (in case we don't know
|
||||||
|
#. the vendor), it's Unknown followed by a size in inches,
|
||||||
|
#. like 'Unknown 15"'
|
||||||
|
#.
|
||||||
|
#: ../src/core/monitor.c:739
|
||||||
|
#, c-format
|
||||||
|
msgid "Unknown %s"
|
||||||
|
msgstr "알 수 없는 %s인치"
|
||||||
|
|
||||||
#: ../src/core/mutter.c:40
|
#: ../src/core/mutter.c:40
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -347,18 +360,20 @@ msgstr "버전을 출력합니다"
|
|||||||
msgid "Mutter plugin to use"
|
msgid "Mutter plugin to use"
|
||||||
msgstr "사용할 머터 플러그인"
|
msgstr "사용할 머터 플러그인"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:1087
|
#: ../src/core/prefs.c:1202
|
||||||
msgid ""
|
msgid ""
|
||||||
"Workarounds for broken applications disabled. Some applications may not "
|
"Workarounds for broken applications disabled. Some applications may not "
|
||||||
"behave properly.\n"
|
"behave properly.\n"
|
||||||
msgstr "응용 프로그램에 대한 임시 방편을 막았습니다. 몇몇 응용 프로그램이 제대로 동작하지 않을것입니다.\n"
|
msgstr ""
|
||||||
|
"응용 프로그램에 대한 임시 방편을 막았습니다. 몇몇 응용 프로그램이 제대로 동작"
|
||||||
|
"하지 않을것입니다.\n"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:1162
|
#: ../src/core/prefs.c:1277
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Could not parse font description \"%s\" from GSettings key %s\n"
|
msgid "Could not parse font description \"%s\" from GSettings key %s\n"
|
||||||
msgstr "GSettings 키 %2$s에서 글꼴 지정 \"%1$s\"을(를) 분석할 수 없습니다\n"
|
msgstr "GSettings 키 %2$s에서 글꼴 지정 \"%1$s\"을(를) 분석할 수 없습니다\n"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:1228
|
#: ../src/core/prefs.c:1343
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"\"%s\" found in configuration database is not a valid value for mouse button "
|
"\"%s\" found in configuration database is not a valid value for mouse button "
|
||||||
@@ -367,7 +382,7 @@ msgstr ""
|
|||||||
"설정 데이터베이스에서 찾은 \"%s\"이(가) 마우스 단추 변경 키의 올바른 값이 아"
|
"설정 데이터베이스에서 찾은 \"%s\"이(가) 마우스 단추 변경 키의 올바른 값이 아"
|
||||||
"닙니다\n"
|
"닙니다\n"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:1780
|
#: ../src/core/prefs.c:1909
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"\"%s\" found in configuration database is not a valid value for keybinding "
|
"\"%s\" found in configuration database is not a valid value for keybinding "
|
||||||
@@ -376,17 +391,17 @@ msgstr ""
|
|||||||
"설정 데이터베이스에서 찾은 \"%s\"이(가) 단축키 \"%s\"에 대한 올바른 값이 아닙"
|
"설정 데이터베이스에서 찾은 \"%s\"이(가) 단축키 \"%s\"에 대한 올바른 값이 아닙"
|
||||||
"니다\n"
|
"니다\n"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:1879
|
#: ../src/core/prefs.c:1999
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Workspace %d"
|
msgid "Workspace %d"
|
||||||
msgstr "작업 공간 %d"
|
msgstr "작업 공간 %d"
|
||||||
|
|
||||||
#: ../src/core/screen.c:673
|
#: ../src/core/screen.c:534
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Screen %d on display '%s' is invalid\n"
|
msgid "Screen %d on display '%s' is invalid\n"
|
||||||
msgstr "디스플레이 '%2$s'의 화면 %1$d은(는) 잘못되었습니다\n"
|
msgstr "디스플레이 '%2$s'의 화면 %1$d은(는) 잘못되었습니다\n"
|
||||||
|
|
||||||
#: ../src/core/screen.c:689
|
#: ../src/core/screen.c:550
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Screen %d on display \"%s\" already has a window manager; try using the --"
|
"Screen %d on display \"%s\" already has a window manager; try using the --"
|
||||||
@@ -395,19 +410,19 @@ msgstr ""
|
|||||||
"디스플레이 \"%2$s\"의 화면 %1$d에 이미 창 관리자가 실행되고 있습니다. 현재 "
|
"디스플레이 \"%2$s\"의 화면 %1$d에 이미 창 관리자가 실행되고 있습니다. 현재 "
|
||||||
"창 관리자를 무시하는 --replace 옵션을 써보십시오.\n"
|
"창 관리자를 무시하는 --replace 옵션을 써보십시오.\n"
|
||||||
|
|
||||||
#: ../src/core/screen.c:716
|
#: ../src/core/screen.c:577
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Could not acquire window manager selection on screen %d display \"%s\"\n"
|
"Could not acquire window manager selection on screen %d display \"%s\"\n"
|
||||||
msgstr "디스플레이 \"%2$s\"의 화면 %1$d에 창 관리 선택을 가질 수 없습니다\n"
|
msgstr "디스플레이 \"%2$s\"의 화면 %1$d에 창 관리 선택을 가질 수 없습니다\n"
|
||||||
|
|
||||||
#: ../src/core/screen.c:794
|
#: ../src/core/screen.c:655
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Screen %d on display \"%s\" already has a window manager\n"
|
msgid "Screen %d on display \"%s\" already has a window manager\n"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"디스플레이 \"%2$s\"의 화면 %1$d은(는) 이미 창 관리자가 실행되고 있습니다\n"
|
"디스플레이 \"%2$s\"의 화면 %1$d은(는) 이미 창 관리자가 실행되고 있습니다\n"
|
||||||
|
|
||||||
#: ../src/core/screen.c:979
|
#: ../src/core/screen.c:846
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Could not release screen %d on display \"%s\"\n"
|
msgid "Could not release screen %d on display \"%s\"\n"
|
||||||
msgstr "디스플레이 \"%2$s\"의 화면 %1$d을(를) 떼어 놓을수 없습니다\n"
|
msgstr "디스플레이 \"%2$s\"의 화면 %1$d을(를) 떼어 놓을수 없습니다\n"
|
||||||
@@ -467,44 +482,43 @@ msgstr ""
|
|||||||
"이 창은 "현재 설정 저장"을 지원하지 않기 때문에 다음 번에 로그인 "
|
"이 창은 "현재 설정 저장"을 지원하지 않기 때문에 다음 번에 로그인 "
|
||||||
"할 때 수동으로 다시 시작해야 합니다."
|
"할 때 수동으로 다시 시작해야 합니다."
|
||||||
|
|
||||||
#: ../src/core/util.c:80
|
#: ../src/core/util.c:84
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to open debug log: %s\n"
|
msgid "Failed to open debug log: %s\n"
|
||||||
msgstr "디버그 로그 열기 실패: %s\n"
|
msgstr "디버그 로그 열기 실패: %s\n"
|
||||||
|
|
||||||
#: ../src/core/util.c:90
|
#: ../src/core/util.c:94
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to fdopen() log file %s: %s\n"
|
msgid "Failed to fdopen() log file %s: %s\n"
|
||||||
msgstr "로그 파일 %s을(를) fdopen()하기 실패: %s\n"
|
msgstr "로그 파일 %s을(를) fdopen()하기 실패: %s\n"
|
||||||
|
|
||||||
#: ../src/core/util.c:96
|
#: ../src/core/util.c:100
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Opened log file %s\n"
|
msgid "Opened log file %s\n"
|
||||||
msgstr "로그 파일 %s을(를) 엽니다\n"
|
msgstr "로그 파일 %s을(를) 엽니다\n"
|
||||||
|
|
||||||
#: ../src/core/util.c:115 ../src/tools/mutter-message.c:149
|
#: ../src/core/util.c:119
|
||||||
#, c-format
|
|
||||||
msgid "Mutter was compiled without support for verbose mode\n"
|
msgid "Mutter was compiled without support for verbose mode\n"
|
||||||
msgstr "머터가 자세한 모드 지원 없이 컴파일 되었습니다\n"
|
msgstr "머터가 자세한 모드 지원 없이 컴파일 되었습니다\n"
|
||||||
|
|
||||||
#: ../src/core/util.c:259
|
#: ../src/core/util.c:264
|
||||||
msgid "Window manager: "
|
msgid "Window manager: "
|
||||||
msgstr "창 관리자: "
|
msgstr "창 관리자: "
|
||||||
|
|
||||||
#: ../src/core/util.c:407
|
#: ../src/core/util.c:414
|
||||||
msgid "Bug in window manager: "
|
msgid "Bug in window manager: "
|
||||||
msgstr "창 관리자의 벌레: "
|
msgstr "창 관리자의 벌레: "
|
||||||
|
|
||||||
#: ../src/core/util.c:438
|
#: ../src/core/util.c:445
|
||||||
msgid "Window manager warning: "
|
msgid "Window manager warning: "
|
||||||
msgstr "창 관리자 주의: "
|
msgstr "창 관리자 주의: "
|
||||||
|
|
||||||
#: ../src/core/util.c:466
|
#: ../src/core/util.c:473
|
||||||
msgid "Window manager error: "
|
msgid "Window manager error: "
|
||||||
msgstr "장 관리자 오류: "
|
msgstr "장 관리자 오류: "
|
||||||
|
|
||||||
#. first time through
|
#. first time through
|
||||||
#: ../src/core/window.c:7539
|
#: ../src/core/window.c:7533
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER "
|
"Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER "
|
||||||
@@ -520,7 +534,7 @@ msgstr ""
|
|||||||
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
|
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
|
||||||
#. * about these apps but make them work.
|
#. * about these apps but make them work.
|
||||||
#.
|
#.
|
||||||
#: ../src/core/window.c:8263
|
#: ../src/core/window.c:8257
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Window %s sets an MWM hint indicating it isn't resizable, but sets min size "
|
"Window %s sets an MWM hint indicating it isn't resizable, but sets min size "
|
||||||
@@ -529,23 +543,23 @@ msgstr ""
|
|||||||
"%s 창에서 크기 변경이 불가능하다는 MWM 힌트를 설정했지만, 최소 크기 %d x %d "
|
"%s 창에서 크기 변경이 불가능하다는 MWM 힌트를 설정했지만, 최소 크기 %d x %d "
|
||||||
"및 최대 크기 %d x %d(으)로 설정했습니다. 앞뒤가 맞지 않습니다.\n"
|
"및 최대 크기 %d x %d(으)로 설정했습니다. 앞뒤가 맞지 않습니다.\n"
|
||||||
|
|
||||||
#: ../src/core/window-props.c:318
|
#: ../src/core/window-props.c:347
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Application set a bogus _NET_WM_PID %lu\n"
|
msgid "Application set a bogus _NET_WM_PID %lu\n"
|
||||||
msgstr "응용 프로그램이 가짜 _NET_WM_PID %lu을(를) 설정하였습니다\n"
|
msgstr "응용 프로그램이 가짜 _NET_WM_PID %lu을(를) 설정하였습니다\n"
|
||||||
|
|
||||||
# <창제목> (on <기계>)
|
# <창제목> (on <기계>)
|
||||||
#: ../src/core/window-props.c:434
|
#: ../src/core/window-props.c:463
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s (on %s)"
|
msgid "%s (on %s)"
|
||||||
msgstr "%s (%s에서)"
|
msgstr "%s (%s에서)"
|
||||||
|
|
||||||
#: ../src/core/window-props.c:1517
|
#: ../src/core/window-props.c:1546
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
|
msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
|
||||||
msgstr "%2$s에 대해 WM_TRANSIENT_FOR 0x%1$lx 창이 잘못되었습니다.\n"
|
msgstr "%2$s에 대해 WM_TRANSIENT_FOR 0x%1$lx 창이 잘못되었습니다.\n"
|
||||||
|
|
||||||
#: ../src/core/window-props.c:1528
|
#: ../src/core/window-props.c:1557
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "WM_TRANSIENT_FOR window 0x%lx for %s would create loop.\n"
|
msgid "WM_TRANSIENT_FOR window 0x%lx for %s would create loop.\n"
|
||||||
msgstr "%2$s에 대해 WM_TRANSIENT_FOR 0x%1$lx 창은 무한 반복입니다.\n"
|
msgstr "%2$s에 대해 WM_TRANSIENT_FOR 0x%1$lx 창은 무한 반복입니다.\n"
|
||||||
@@ -574,9 +588,7 @@ msgstr "창 0x%2$lx의 등록 정보 %1$s은(는) 잘못된 UTF-8이 들어 있
|
|||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Property %s on window 0x%lx contained invalid UTF-8 for item %d in the list\n"
|
"Property %s on window 0x%lx contained invalid UTF-8 for item %d in the list\n"
|
||||||
msgstr ""
|
msgstr "창 0x%2$lx의 등록 정보 %1$s은(는) 목록안의 항목 %3$d에 잘못된 UTF-8 문자가 들어 있습니다\n"
|
||||||
"창 0x%2$lx의 등록 정보 %1$s은(는) 목록안의 항목 %3$d에 잘못된 UTF-8을 포함하"
|
|
||||||
"고 있습니다\n"
|
|
||||||
|
|
||||||
#: ../src/mutter.desktop.in.h:1 ../src/mutter-wm.desktop.in.h:1
|
#: ../src/mutter.desktop.in.h:1 ../src/mutter-wm.desktop.in.h:1
|
||||||
msgid "Mutter"
|
msgid "Mutter"
|
||||||
@@ -705,109 +717,104 @@ msgstr "탭 팝업에서 창 선택"
|
|||||||
msgid "Cancel tab popup"
|
msgid "Cancel tab popup"
|
||||||
msgstr "탭 팝업 취소"
|
msgstr "탭 팝업 취소"
|
||||||
|
|
||||||
#: ../src/tools/mutter-message.c:123
|
|
||||||
#, c-format
|
|
||||||
msgid "Usage: %s\n"
|
|
||||||
msgstr "사용법: %s\n"
|
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:69
|
#: ../src/ui/menu.c:67
|
||||||
msgid "Mi_nimize"
|
msgid "Mi_nimize"
|
||||||
msgstr "최소화(_N)"
|
msgstr "최소화(_N)"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:71
|
#: ../src/ui/menu.c:69
|
||||||
msgid "Ma_ximize"
|
msgid "Ma_ximize"
|
||||||
msgstr "최대화(_X)"
|
msgstr "최대화(_X)"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:73
|
#: ../src/ui/menu.c:71
|
||||||
msgid "Unma_ximize"
|
msgid "Unma_ximize"
|
||||||
msgstr "최대화 취소(_X)"
|
msgstr "최대화 취소(_X)"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:75
|
#: ../src/ui/menu.c:73
|
||||||
msgid "Roll _Up"
|
msgid "Roll _Up"
|
||||||
msgstr "말아올리기(_U)"
|
msgstr "말아올리기(_U)"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:77
|
#: ../src/ui/menu.c:75
|
||||||
msgid "_Unroll"
|
msgid "_Unroll"
|
||||||
msgstr "펼치기(_U)"
|
msgstr "펼치기(_U)"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:79
|
#: ../src/ui/menu.c:77
|
||||||
msgid "_Move"
|
msgid "_Move"
|
||||||
msgstr "옮기기(_M)"
|
msgstr "옮기기(_M)"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:81
|
#: ../src/ui/menu.c:79
|
||||||
msgid "_Resize"
|
msgid "_Resize"
|
||||||
msgstr "크기 조정(_R)"
|
msgstr "크기 조정(_R)"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:83
|
#: ../src/ui/menu.c:81
|
||||||
msgid "Move Titlebar On_screen"
|
msgid "Move Titlebar On_screen"
|
||||||
msgstr "창 제목막대 화면에 표시(_S)"
|
msgstr "창 제목막대 화면에 표시(_S)"
|
||||||
|
|
||||||
#. separator
|
#. separator
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:86 ../src/ui/menu.c:88
|
#: ../src/ui/menu.c:84 ../src/ui/menu.c:86
|
||||||
msgid "Always on _Top"
|
msgid "Always on _Top"
|
||||||
msgstr "항상 위(_T)"
|
msgstr "항상 위(_T)"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:90
|
#: ../src/ui/menu.c:88
|
||||||
msgid "_Always on Visible Workspace"
|
msgid "_Always on Visible Workspace"
|
||||||
msgstr "항상 현재 작업 공간에 놓기(_A)"
|
msgstr "항상 현재 작업 공간에 놓기(_A)"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:92
|
#: ../src/ui/menu.c:90
|
||||||
msgid "_Only on This Workspace"
|
msgid "_Only on This Workspace"
|
||||||
msgstr "이 작업 공간에만 놓기(_O)"
|
msgstr "이 작업 공간에만 놓기(_O)"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:94
|
#: ../src/ui/menu.c:92
|
||||||
msgid "Move to Workspace _Left"
|
msgid "Move to Workspace _Left"
|
||||||
msgstr "왼쪽 작업 공간으로 옮기기(_L)"
|
msgstr "왼쪽 작업 공간으로 옮기기(_L)"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:96
|
#: ../src/ui/menu.c:94
|
||||||
msgid "Move to Workspace R_ight"
|
msgid "Move to Workspace R_ight"
|
||||||
msgstr "오른쪽 작업 공간으로 옮기기(_I)"
|
msgstr "오른쪽 작업 공간으로 옮기기(_I)"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:98
|
#: ../src/ui/menu.c:96
|
||||||
msgid "Move to Workspace _Up"
|
msgid "Move to Workspace _Up"
|
||||||
msgstr "위쪽 작업 공간으로 옮기기(_U)"
|
msgstr "위쪽 작업 공간으로 옮기기(_U)"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:100
|
#: ../src/ui/menu.c:98
|
||||||
msgid "Move to Workspace _Down"
|
msgid "Move to Workspace _Down"
|
||||||
msgstr "아래쪽 작업 공간으로 옮기기(_D)"
|
msgstr "아래쪽 작업 공간으로 옮기기(_D)"
|
||||||
|
|
||||||
#. separator
|
#. separator
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:104
|
#: ../src/ui/menu.c:102
|
||||||
msgid "_Close"
|
msgid "_Close"
|
||||||
msgstr "닫기(_C)"
|
msgstr "닫기(_C)"
|
||||||
|
|
||||||
#: ../src/ui/menu.c:204
|
#: ../src/ui/menu.c:202
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Workspace %d%n"
|
msgid "Workspace %d%n"
|
||||||
msgstr "작업 공간 %d%n"
|
msgstr "작업 공간 %d%n"
|
||||||
|
|
||||||
#: ../src/ui/menu.c:214
|
#: ../src/ui/menu.c:212
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Workspace 1_0"
|
msgid "Workspace 1_0"
|
||||||
msgstr "작업 공간 1_0"
|
msgstr "작업 공간 1_0"
|
||||||
|
|
||||||
#: ../src/ui/menu.c:216
|
#: ../src/ui/menu.c:214
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Workspace %s%d"
|
msgid "Workspace %s%d"
|
||||||
msgstr "작업 공간 %s%d"
|
msgstr "작업 공간 %s%d"
|
||||||
|
|
||||||
#: ../src/ui/menu.c:397
|
#: ../src/ui/menu.c:384
|
||||||
msgid "Move to Another _Workspace"
|
msgid "Move to Another _Workspace"
|
||||||
msgstr "다른 작업 공간으로 옮기기(_W)"
|
msgstr "다른 작업 공간으로 옮기기(_W)"
|
||||||
|
|
||||||
@@ -909,50 +916,50 @@ msgstr "Mod5"
|
|||||||
msgid "%d x %d"
|
msgid "%d x %d"
|
||||||
msgstr "%d x %d"
|
msgstr "%d x %d"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:235
|
#: ../src/ui/theme.c:236
|
||||||
msgid "top"
|
msgid "top"
|
||||||
msgstr "맨 위"
|
msgstr "맨 위"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:237
|
#: ../src/ui/theme.c:238
|
||||||
msgid "bottom"
|
msgid "bottom"
|
||||||
msgstr "맨 아래"
|
msgstr "맨 아래"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:239
|
#: ../src/ui/theme.c:240
|
||||||
msgid "left"
|
msgid "left"
|
||||||
msgstr "왼쪽"
|
msgstr "왼쪽"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:241
|
#: ../src/ui/theme.c:242
|
||||||
msgid "right"
|
msgid "right"
|
||||||
msgstr "오른쪽"
|
msgstr "오른쪽"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:269
|
#: ../src/ui/theme.c:270
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "frame geometry does not specify \"%s\" dimension"
|
msgid "frame geometry does not specify \"%s\" dimension"
|
||||||
msgstr "프레임 위치가 \"%s\"차원으로 지정되지 않았습니다"
|
msgstr "프레임 위치가 \"%s\"차원으로 지정되지 않았습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:288
|
#: ../src/ui/theme.c:289
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "frame geometry does not specify dimension \"%s\" for border \"%s\""
|
msgid "frame geometry does not specify dimension \"%s\" for border \"%s\""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"프레임 위치가 가장자리 \"%2$s\" 가장자리의 \"%1$s\"차원으로 지정되지 않았습니"
|
"프레임 위치가 가장자리 \"%2$s\" 가장자리의 \"%1$s\"차원으로 지정되지 않았습니"
|
||||||
"다."
|
"다."
|
||||||
|
|
||||||
#: ../src/ui/theme.c:325
|
#: ../src/ui/theme.c:326
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Button aspect ratio %g is not reasonable"
|
msgid "Button aspect ratio %g is not reasonable"
|
||||||
msgstr "단추의 가로세로 비 %g이(가) 적당하지 않습니다"
|
msgstr "단추의 가로세로 비 %g이(가) 적당하지 않습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:337
|
#: ../src/ui/theme.c:338
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Frame geometry does not specify size of buttons"
|
msgid "Frame geometry does not specify size of buttons"
|
||||||
msgstr "프레임 위치가 단추의 크기로 지정되지 않았습니다"
|
msgstr "프레임 위치가 단추의 크기로 지정되지 않았습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1050
|
#: ../src/ui/theme.c:1051
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Gradients should have at least two colors"
|
msgid "Gradients should have at least two colors"
|
||||||
msgstr "서서히 변하는 색으로 지정하려면 최소 2색이 필요합니다"
|
msgstr "서서히 변하는 색으로 지정하려면 최소 2색이 필요합니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1202
|
#: ../src/ui/theme.c:1203
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"GTK custom color specification must have color name and fallback in "
|
"GTK custom color specification must have color name and fallback in "
|
||||||
@@ -961,7 +968,7 @@ msgstr ""
|
|||||||
"GTK 사용자 지정 색상 지정은 색 이름과 대체할 색을 괄호 안에 써야 합니다. 예"
|
"GTK 사용자 지정 색상 지정은 색 이름과 대체할 색을 괄호 안에 써야 합니다. 예"
|
||||||
"를 들어: gtk:custom(foo,bar). \"%s\"을(를) 분석할 수 없습니다"
|
"를 들어: gtk:custom(foo,bar). \"%s\"을(를) 분석할 수 없습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1218
|
#: ../src/ui/theme.c:1219
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Invalid character '%c' in color_name parameter of gtk:custom, only A-Za-z0-9-"
|
"Invalid character '%c' in color_name parameter of gtk:custom, only A-Za-z0-9-"
|
||||||
@@ -970,7 +977,7 @@ msgstr ""
|
|||||||
"gtk:custom의 color_name 파라미터 안에 잘못된 문자 '%c'. A-Za-z0-9-_ 문자만 허"
|
"gtk:custom의 color_name 파라미터 안에 잘못된 문자 '%c'. A-Za-z0-9-_ 문자만 허"
|
||||||
"용합니다."
|
"용합니다."
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1232
|
#: ../src/ui/theme.c:1233
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Gtk:custom format is \"gtk:custom(color_name,fallback)\", \"%s\" does not "
|
"Gtk:custom format is \"gtk:custom(color_name,fallback)\", \"%s\" does not "
|
||||||
@@ -979,7 +986,7 @@ msgstr ""
|
|||||||
"gtk:custom 형식은 \"gtk:custom(색이름,대체색)\"입니다, \"%s\"(은)는 형식에 맞"
|
"gtk:custom 형식은 \"gtk:custom(색이름,대체색)\"입니다, \"%s\"(은)는 형식에 맞"
|
||||||
"지 않습니다"
|
"지 않습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1277
|
#: ../src/ui/theme.c:1278
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"GTK color specification must have the state in brackets, e.g. gtk:fg[NORMAL] "
|
"GTK color specification must have the state in brackets, e.g. gtk:fg[NORMAL] "
|
||||||
@@ -988,7 +995,7 @@ msgstr ""
|
|||||||
"GTK 색상 지정은 중괄호안에 있어야 합니다. 예를 들어: gtk:fg[NORMAL], 여기서 "
|
"GTK 색상 지정은 중괄호안에 있어야 합니다. 예를 들어: gtk:fg[NORMAL], 여기서 "
|
||||||
"NORMAL이 값입니다. \"%s\"을(를) 분석할 수 없습니다."
|
"NORMAL이 값입니다. \"%s\"을(를) 분석할 수 없습니다."
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1291
|
#: ../src/ui/theme.c:1292
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"GTK color specification must have a close bracket after the state, e.g. gtk:"
|
"GTK color specification must have a close bracket after the state, e.g. gtk:"
|
||||||
@@ -997,17 +1004,17 @@ msgstr ""
|
|||||||
"GTK 색상 지정은 값 뒤에 중괄호로 닫혀 있어야 합니다. 예를 들어: gtk:fg"
|
"GTK 색상 지정은 값 뒤에 중괄호로 닫혀 있어야 합니다. 예를 들어: gtk:fg"
|
||||||
"[NORMAL], 여기서 NORMAL은 값입니다. \"%s\"을(를) 분석할 수 없습니다."
|
"[NORMAL], 여기서 NORMAL은 값입니다. \"%s\"을(를) 분석할 수 없습니다."
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1302
|
#: ../src/ui/theme.c:1303
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Did not understand state \"%s\" in color specification"
|
msgid "Did not understand state \"%s\" in color specification"
|
||||||
msgstr "색상 지정의 \"%s\" 값을 이해할 수 없습니다"
|
msgstr "색상 지정의 \"%s\" 값을 이해할 수 없습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1315
|
#: ../src/ui/theme.c:1316
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Did not understand color component \"%s\" in color specification"
|
msgid "Did not understand color component \"%s\" in color specification"
|
||||||
msgstr "색상 지정의 색상 구성요소 \"%s\"을(를) 이해할 수 없습니다"
|
msgstr "색상 지정의 색상 구성요소 \"%s\"을(를) 이해할 수 없습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1344
|
#: ../src/ui/theme.c:1345
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Blend format is \"blend/bg_color/fg_color/alpha\", \"%s\" does not fit the "
|
"Blend format is \"blend/bg_color/fg_color/alpha\", \"%s\" does not fit the "
|
||||||
@@ -1016,17 +1023,17 @@ msgstr ""
|
|||||||
"섞기 형식은 \"blend/bg_color/fg_color/alpha\"입니다, \"%s\"은(는) 형식에 맞"
|
"섞기 형식은 \"blend/bg_color/fg_color/alpha\"입니다, \"%s\"은(는) 형식에 맞"
|
||||||
"지 않습니다"
|
"지 않습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1355
|
#: ../src/ui/theme.c:1356
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Could not parse alpha value \"%s\" in blended color"
|
msgid "Could not parse alpha value \"%s\" in blended color"
|
||||||
msgstr "색상 섞기에서 알파 값 \"%s\"을(를) 분석할 수 없습니다"
|
msgstr "색상 섞기에서 알파 값 \"%s\"을(를) 분석할 수 없습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1365
|
#: ../src/ui/theme.c:1366
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Alpha value \"%s\" in blended color is not between 0.0 and 1.0"
|
msgid "Alpha value \"%s\" in blended color is not between 0.0 and 1.0"
|
||||||
msgstr "색상 섞기에서 알파 값 \"%s\"은(는) 0.0 과 1.0사이의 값이 아닙니다"
|
msgstr "색상 섞기에서 알파 값 \"%s\"은(는) 0.0과 1.0 사이의 값이 아닙니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1412
|
#: ../src/ui/theme.c:1413
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Shade format is \"shade/base_color/factor\", \"%s\" does not fit the format"
|
"Shade format is \"shade/base_color/factor\", \"%s\" does not fit the format"
|
||||||
@@ -1034,79 +1041,78 @@ msgstr ""
|
|||||||
"그림자 형식은 \"shade/base_color/format\"입니다, \"%s\"(은)는 형식에 맞지 않"
|
"그림자 형식은 \"shade/base_color/format\"입니다, \"%s\"(은)는 형식에 맞지 않"
|
||||||
"습니다"
|
"습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1423
|
#: ../src/ui/theme.c:1424
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Could not parse shade factor \"%s\" in shaded color"
|
msgid "Could not parse shade factor \"%s\" in shaded color"
|
||||||
msgstr "그림자색에서 그림자 인자 \"%s\"(을)를 해석할 수 없습니다"
|
msgstr "그림자색에서 그림자 인자 \"%s\"(을)를 해석할 수 없습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1433
|
#: ../src/ui/theme.c:1434
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Shade factor \"%s\" in shaded color is negative"
|
msgid "Shade factor \"%s\" in shaded color is negative"
|
||||||
msgstr "그림자색에서 그림자 인자 \"%s\"(은)는 음수입니다"
|
msgstr "그림자색에서 그림자 인자 \"%s\"(은)는 음수입니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1462
|
#: ../src/ui/theme.c:1463
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Could not parse color \"%s\""
|
msgid "Could not parse color \"%s\""
|
||||||
msgstr "색상 \"%s\"을(를) 해석할 수 없습니다"
|
msgstr "색상 \"%s\"을(를) 해석할 수 없습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1779
|
#: ../src/ui/theme.c:1780
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Coordinate expression contains character '%s' which is not allowed"
|
msgid "Coordinate expression contains character '%s' which is not allowed"
|
||||||
msgstr "좌표식에 허용되지 않는 문자 '%s'(이)가 포함되어 있습니다"
|
msgstr "좌표식에 허용되지 않는 문자 '%s'(이)가 들어 있습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1806
|
#: ../src/ui/theme.c:1807
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Coordinate expression contains floating point number '%s' which could not be "
|
"Coordinate expression contains floating point number '%s' which could not be "
|
||||||
"parsed"
|
"parsed"
|
||||||
msgstr "좌표식에 분석할 수 없는 부동소수점 숫자 '%s'이(가) 포함되어 있습니다"
|
msgstr "좌표식에 분석할 수 없는 부동소수점 숫자 '%s'이(가) 포함되어 있습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1820
|
#: ../src/ui/theme.c:1821
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Coordinate expression contains integer '%s' which could not be parsed"
|
msgid "Coordinate expression contains integer '%s' which could not be parsed"
|
||||||
msgstr "좌표식에 분석할 수 없는 정수 '%s'이(가) 포함되어 있습니다"
|
msgstr "좌표식에 분석할 수 없는 정수 '%s'이(가) 포함되어 있습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1941
|
#: ../src/ui/theme.c:1942
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Coordinate expression contained unknown operator at the start of this text: "
|
"Coordinate expression contained unknown operator at the start of this text: "
|
||||||
"\"%s\""
|
"\"%s\""
|
||||||
msgstr ""
|
msgstr "좌표식에 이 글자 시작부분에 알 수 없는 연산자가 들어 있습니다: \"%s\""
|
||||||
"좌표식에 이 글자 시작부분에 알 수 없는 연산자가 포함되어 있습니다: \"%s\""
|
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1998
|
#: ../src/ui/theme.c:1999
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Coordinate expression was empty or not understood"
|
msgid "Coordinate expression was empty or not understood"
|
||||||
msgstr "좌표식이 비어있거나 이해할 수 없습니다"
|
msgstr "좌표식이 비어있거나 이해할 수 없습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2111 ../src/ui/theme.c:2121 ../src/ui/theme.c:2155
|
#: ../src/ui/theme.c:2112 ../src/ui/theme.c:2122 ../src/ui/theme.c:2156
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Coordinate expression results in division by zero"
|
msgid "Coordinate expression results in division by zero"
|
||||||
msgstr "좌표식의 결과 값이 0로 나누었습니다"
|
msgstr "좌표식의 결과 값이 0로 나누었습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2163
|
#: ../src/ui/theme.c:2164
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Coordinate expression tries to use mod operator on a floating-point number"
|
"Coordinate expression tries to use mod operator on a floating-point number"
|
||||||
msgstr "좌표식에서 부동소수점 수에 나머지 연산을 하려 합니다"
|
msgstr "좌표식에서 부동소수점 수에 나머지 연산을 하려 합니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2219
|
#: ../src/ui/theme.c:2220
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Coordinate expression has an operator \"%s\" where an operand was expected"
|
"Coordinate expression has an operator \"%s\" where an operand was expected"
|
||||||
msgstr "좌표식에서 피연산자가 들어갈 곳에 연산자 \"%s\"이(가) 있습니다"
|
msgstr "좌표식에서 피연산자가 들어갈 곳에 연산자 \"%s\"이(가) 있습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2228
|
#: ../src/ui/theme.c:2229
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Coordinate expression had an operand where an operator was expected"
|
msgid "Coordinate expression had an operand where an operator was expected"
|
||||||
msgstr "좌표식에서 연산자가 들어갈 곳에 피연산자가 있습니다"
|
msgstr "좌표식에서 연산자가 들어갈 곳에 피연산자가 있습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2236
|
#: ../src/ui/theme.c:2237
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Coordinate expression ended with an operator instead of an operand"
|
msgid "Coordinate expression ended with an operator instead of an operand"
|
||||||
msgstr "좌표식에서 피연산자 대신에 연산자로 끝나있습니다"
|
msgstr "좌표식에서 피연산자 대신에 연산자로 끝나있습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2246
|
#: ../src/ui/theme.c:2247
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Coordinate expression has operator \"%c\" following operator \"%c\" with no "
|
"Coordinate expression has operator \"%c\" following operator \"%c\" with no "
|
||||||
@@ -1115,37 +1121,37 @@ msgstr ""
|
|||||||
"좌표식에서 피연산자가 없는 연산자 \"%2$c\"다음에 연산자 \"%1$c\"이(가) 있습니"
|
"좌표식에서 피연산자가 없는 연산자 \"%2$c\"다음에 연산자 \"%1$c\"이(가) 있습니"
|
||||||
"다"
|
"다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2397 ../src/ui/theme.c:2442
|
#: ../src/ui/theme.c:2398 ../src/ui/theme.c:2443
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Coordinate expression had unknown variable or constant \"%s\""
|
msgid "Coordinate expression had unknown variable or constant \"%s\""
|
||||||
msgstr "좌표식에 알 수 없는 변수나 상수 \"%s\"이(가) 있습니다"
|
msgstr "좌표식에 알 수 없는 변수나 상수 \"%s\"이(가) 있습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2496
|
#: ../src/ui/theme.c:2497
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Coordinate expression parser overflowed its buffer."
|
msgid "Coordinate expression parser overflowed its buffer."
|
||||||
msgstr "좌표 계산 파서의 버퍼가 크기를 넘어갔습니다."
|
msgstr "좌표 계산 파서의 버퍼가 크기를 넘어갔습니다."
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2525
|
#: ../src/ui/theme.c:2526
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Coordinate expression had a close parenthesis with no open parenthesis"
|
msgid "Coordinate expression had a close parenthesis with no open parenthesis"
|
||||||
msgstr "좌표식에 닫는 괄호는 있지만 여는 괄호가 없습니다"
|
msgstr "좌표식에 닫는 괄호는 있지만 여는 괄호가 없습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2589
|
#: ../src/ui/theme.c:2590
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Coordinate expression had an open parenthesis with no close parenthesis"
|
msgid "Coordinate expression had an open parenthesis with no close parenthesis"
|
||||||
msgstr "좌표식에 여는 괄호는 있지만 닫는 괄호가 없습니다"
|
msgstr "좌표식에 여는 괄호는 있지만 닫는 괄호가 없습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2600
|
#: ../src/ui/theme.c:2601
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Coordinate expression doesn't seem to have any operators or operands"
|
msgid "Coordinate expression doesn't seem to have any operators or operands"
|
||||||
msgstr "좌표식에 어떠한 연산자나 피연산자가 없습니다"
|
msgstr "좌표식에 어떠한 연산자나 피연산자가 없습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2813 ../src/ui/theme.c:2833 ../src/ui/theme.c:2853
|
#: ../src/ui/theme.c:2814 ../src/ui/theme.c:2834 ../src/ui/theme.c:2854
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Theme contained an expression that resulted in an error: %s\n"
|
msgid "Theme contained an expression that resulted in an error: %s\n"
|
||||||
msgstr "테마가 오류 값을 내는 표현식이 들어 있습니다: %s\n"
|
msgstr "테마가 오류 값을 내는 표현식이 들어 있습니다: %s\n"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:4499
|
#: ../src/ui/theme.c:4500
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"<button function=\"%s\" state=\"%s\" draw_ops=\"whatever\"/> must be "
|
"<button function=\"%s\" state=\"%s\" draw_ops=\"whatever\"/> must be "
|
||||||
@@ -1154,7 +1160,7 @@ msgstr ""
|
|||||||
"이 프레임 스타일에는 <button function=\"%s\" style=\"%s\" draw_ops=\"whatever"
|
"이 프레임 스타일에는 <button function=\"%s\" style=\"%s\" draw_ops=\"whatever"
|
||||||
"\"/>가 지정되어야 합니다"
|
"\"/>가 지정되어야 합니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5010 ../src/ui/theme.c:5035
|
#: ../src/ui/theme.c:5011 ../src/ui/theme.c:5036
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Missing <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/>"
|
"Missing <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/>"
|
||||||
@@ -1162,18 +1168,18 @@ msgstr ""
|
|||||||
"<frame state=\"%s\" resize=\"%s\" focus=\"%s\" state=\"whatever\"/> 가 없습니"
|
"<frame state=\"%s\" resize=\"%s\" focus=\"%s\" state=\"whatever\"/> 가 없습니"
|
||||||
"다"
|
"다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5083
|
#: ../src/ui/theme.c:5082
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to load theme \"%s\": %s\n"
|
msgid "Failed to load theme \"%s\": %s\n"
|
||||||
msgstr "테마 \"%s\"을(를) 읽을 수 없습니다: %s\n"
|
msgstr "테마 \"%s\"을(를) 읽을 수 없습니다: %s\n"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5219 ../src/ui/theme.c:5226 ../src/ui/theme.c:5233
|
#: ../src/ui/theme.c:5218 ../src/ui/theme.c:5225 ../src/ui/theme.c:5232
|
||||||
#: ../src/ui/theme.c:5240 ../src/ui/theme.c:5247
|
#: ../src/ui/theme.c:5239 ../src/ui/theme.c:5246
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "No <%s> set for theme \"%s\""
|
msgid "No <%s> set for theme \"%s\""
|
||||||
msgstr "테마 \"%2$s\"의 <%1$s>(이)가 설정되지 않았습니다"
|
msgstr "테마 \"%2$s\"의 <%1$s>(이)가 설정되지 않았습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5255
|
#: ../src/ui/theme.c:5254
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"No frame style set for window type \"%s\" in theme \"%s\", add a <window "
|
"No frame style set for window type \"%s\" in theme \"%s\", add a <window "
|
||||||
@@ -1182,14 +1188,14 @@ msgstr ""
|
|||||||
"테마 \"%2$s\"의 창 형식 \"%1$s\"에 대한 프레임 스타일이 없습니다,<window "
|
"테마 \"%2$s\"의 창 형식 \"%1$s\"에 대한 프레임 스타일이 없습니다,<window "
|
||||||
"type=\"%3$s\" style_set=\"whatever\"/> 엘리먼트를 추가하십시오"
|
"type=\"%3$s\" style_set=\"whatever\"/> 엘리먼트를 추가하십시오"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5662 ../src/ui/theme.c:5724 ../src/ui/theme.c:5787
|
#: ../src/ui/theme.c:5661 ../src/ui/theme.c:5723 ../src/ui/theme.c:5786
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"User-defined constants must begin with a capital letter; \"%s\" does not"
|
"User-defined constants must begin with a capital letter; \"%s\" does not"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"사용자 정의 상수는 대문자로 시작되어야 합니다. \"%s\"은(는) 그렇지 않습니다."
|
"사용자 정의 상수는 대문자로 시작되어야 합니다. \"%s\"은(는) 그렇지 않습니다."
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5670 ../src/ui/theme.c:5732 ../src/ui/theme.c:5795
|
#: ../src/ui/theme.c:5669 ../src/ui/theme.c:5731 ../src/ui/theme.c:5794
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Constant \"%s\" has already been defined"
|
msgid "Constant \"%s\" has already been defined"
|
||||||
msgstr "상수 \"%s\"은(는) 이미 지정되어 있습니다"
|
msgstr "상수 \"%s\"은(는) 이미 지정되어 있습니다"
|
||||||
@@ -1324,9 +1330,7 @@ msgstr "<%s> 엘리먼트는 <%s> 아래에 허용되지 않습니다"
|
|||||||
msgid ""
|
msgid ""
|
||||||
"Cannot specify both \"button_width\"/\"button_height\" and \"aspect_ratio\" "
|
"Cannot specify both \"button_width\"/\"button_height\" and \"aspect_ratio\" "
|
||||||
"for buttons"
|
"for buttons"
|
||||||
msgstr ""
|
msgstr "단추의 \"button_width\"/\"button_height\"와 \"aspect_ratio\"를 한꺼번에 지정할 수 없습니다"
|
||||||
"단추의 button_width/button_height 와 \"aspect_ratio\"를 한꺼번에 지정할 수 없"
|
|
||||||
"습니다"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1450
|
#: ../src/ui/theme-parser.c:1450
|
||||||
#, c-format
|
#, c-format
|
||||||
@@ -1387,7 +1391,7 @@ msgstr "\"%s\"라 불리는 <draw_ops>는 정의되지 않았습니다"
|
|||||||
#: ../src/ui/theme-parser.c:2706 ../src/ui/theme-parser.c:2802
|
#: ../src/ui/theme-parser.c:2706 ../src/ui/theme-parser.c:2802
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Including draw_ops \"%s\" here would create a circular reference"
|
msgid "Including draw_ops \"%s\" here would create a circular reference"
|
||||||
msgstr "draw_ops를 포함하는 \"%s\"이(가) 자기 자신을 참조하고 있습니다"
|
msgstr "여기서 draw_ops \"%s\"을(를) 포함하면 순환 참조가 됩니다."
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2917
|
#: ../src/ui/theme-parser.c:2917
|
||||||
#, c-format
|
#, c-format
|
||||||
@@ -1569,205 +1573,7 @@ msgstr "<%s> 엘리먼트 안에 텍스트가 허용되지 않습니다"
|
|||||||
msgid "<%s> specified twice for this theme"
|
msgid "<%s> specified twice for this theme"
|
||||||
msgstr "이 테마에서 <%s> 태그가 두 번 지정되었습니다"
|
msgstr "이 테마에서 <%s> 태그가 두 번 지정되었습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:4334
|
#: ../src/ui/theme-parser.c:4336
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to find a valid file for theme %s\n"
|
msgid "Failed to find a valid file for theme %s\n"
|
||||||
msgstr "%s 테마의 올바른 파일을 찾는 데 실패했습니다\n"
|
msgstr "%s 테마의 올바른 파일을 찾는 데 실패했습니다\n"
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:99
|
|
||||||
msgid "_Windows"
|
|
||||||
msgstr "창(_W)"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:100
|
|
||||||
msgid "_Dialog"
|
|
||||||
msgstr "대화 상자(_D)"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:101
|
|
||||||
msgid "_Modal dialog"
|
|
||||||
msgstr "모달 대화 상자(_M)"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:102
|
|
||||||
msgid "_Utility"
|
|
||||||
msgstr "도구(_U)"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:103
|
|
||||||
msgid "_Splashscreen"
|
|
||||||
msgstr "스플래시 화면(_S)"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:104
|
|
||||||
msgid "_Top dock"
|
|
||||||
msgstr "위 도크(_T)"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:105
|
|
||||||
msgid "_Bottom dock"
|
|
||||||
msgstr "아래 도크(_B)"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:106
|
|
||||||
msgid "_Left dock"
|
|
||||||
msgstr "왼쪽 도크(_L)"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:107
|
|
||||||
msgid "_Right dock"
|
|
||||||
msgstr "오른쪽 도크(_R)"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:108
|
|
||||||
msgid "_All docks"
|
|
||||||
msgstr "모든 도크(_A)"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:109
|
|
||||||
msgid "Des_ktop"
|
|
||||||
msgstr "데스크톱(_K)"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:115
|
|
||||||
msgid "Open another one of these windows"
|
|
||||||
msgstr "이 창을 하나 더 엽니다"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:117
|
|
||||||
msgid "This is a demo button with an 'open' icon"
|
|
||||||
msgstr "'열기' 아이콘이 들어 있는 데모 단추입니다"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:119
|
|
||||||
msgid "This is a demo button with a 'quit' icon"
|
|
||||||
msgstr "'끝내기' 아이콘이 들어 있는 데모 단추입니다"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:248
|
|
||||||
msgid "This is a sample message in a sample dialog"
|
|
||||||
msgstr "예제 대화 상자의 예제 메시지입니다"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:328
|
|
||||||
#, c-format
|
|
||||||
msgid "Fake menu item %d\n"
|
|
||||||
msgstr "가짜 메뉴 항목 %d\n"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:363
|
|
||||||
msgid "Border-only window"
|
|
||||||
msgstr "테두리만 있는 창"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:365
|
|
||||||
msgid "Bar"
|
|
||||||
msgstr "모음"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:382
|
|
||||||
msgid "Normal Application Window"
|
|
||||||
msgstr "보통 프로그램 창"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:386
|
|
||||||
msgid "Dialog Box"
|
|
||||||
msgstr "대화 상자"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:390
|
|
||||||
msgid "Modal Dialog Box"
|
|
||||||
msgstr "모달 대화 상자"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:394
|
|
||||||
msgid "Utility Palette"
|
|
||||||
msgstr "도구 팔레트"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:398
|
|
||||||
msgid "Torn-off Menu"
|
|
||||||
msgstr "떼어내기 메뉴"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:402
|
|
||||||
msgid "Border"
|
|
||||||
msgstr "테두리"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:406
|
|
||||||
msgid "Attached Modal Dialog"
|
|
||||||
msgstr "부착한 모달 대화 상자"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:737
|
|
||||||
#, c-format
|
|
||||||
msgid "Button layout test %d"
|
|
||||||
msgstr "단추 배치 테스트 %d"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:766
|
|
||||||
#, c-format
|
|
||||||
msgid "%g milliseconds to draw one window frame"
|
|
||||||
msgstr "창 프레임 하나를 그리는 데 %g ms"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:811
|
|
||||||
#, c-format
|
|
||||||
msgid "Usage: metacity-theme-viewer [THEMENAME]\n"
|
|
||||||
msgstr "사용법: metacity-theme-viewer [테마이름]\n"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:818
|
|
||||||
#, c-format
|
|
||||||
msgid "Error loading theme: %s\n"
|
|
||||||
msgstr "테마를 읽어들이는 데 오류가 발생했습니다: %s\n"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:824
|
|
||||||
#, c-format
|
|
||||||
msgid "Loaded theme \"%s\" in %g seconds\n"
|
|
||||||
msgstr "\"%s\" 테마를 읽어들이는 데 %g초\n"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:869
|
|
||||||
msgid "Normal Title Font"
|
|
||||||
msgstr "보통 제목 글꼴"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:875
|
|
||||||
msgid "Small Title Font"
|
|
||||||
msgstr "작은 제목 글꼴"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:881
|
|
||||||
msgid "Large Title Font"
|
|
||||||
msgstr "큰 제목 글꼴"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:886
|
|
||||||
msgid "Button Layouts"
|
|
||||||
msgstr "단추 배치"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:891
|
|
||||||
msgid "Benchmark"
|
|
||||||
msgstr "벤치마크"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:947
|
|
||||||
msgid "Window Title Goes Here"
|
|
||||||
msgstr "창 제목이 여기에 들어갑니다"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:1053
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Drew %d frames in %g client-side seconds (%g milliseconds per frame) and %g "
|
|
||||||
"seconds wall clock time including X server resources (%g milliseconds per "
|
|
||||||
"frame)\n"
|
|
||||||
msgstr ""
|
|
||||||
"%d개 프레임을 그리는 데 클라이언트 입장에서 %g초가 걸렸습니다(한 프레임에 %g "
|
|
||||||
"ms). 그리고 X 서버 리소스까지 포함해 실제 시간으로 %g 초가 걸렸습니다(한 프레"
|
|
||||||
"임에 %g ms).\n"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:1273
|
|
||||||
msgid "position expression test returned TRUE but set error"
|
|
||||||
msgstr "위치 표현식 테스트가 참을 리턴했지만 오류가 발생했습니다"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:1275
|
|
||||||
msgid "position expression test returned FALSE but didn't set error"
|
|
||||||
msgstr "위치 표현식 테스트가 거짓을 리턴했지만 오류가 발생하지 않았습니다"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:1279
|
|
||||||
msgid "Error was expected but none given"
|
|
||||||
msgstr "오류가 발생해야 하지만 발생하지 않았습니다"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:1281
|
|
||||||
#, c-format
|
|
||||||
msgid "Error %d was expected but %d given"
|
|
||||||
msgstr "오류 %d번이 발생해야 하지만 오류 %d번이 발생했습니다"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:1287
|
|
||||||
#, c-format
|
|
||||||
msgid "Error not expected but one was returned: %s"
|
|
||||||
msgstr "오류가 발생하면 안 되지만 오류 한 개가 발생했습니다: %s"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:1291
|
|
||||||
#, c-format
|
|
||||||
msgid "x value was %d, %d was expected"
|
|
||||||
msgstr "가로값이 %d입니다. 와야 하는 값은 %d입니다"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:1294
|
|
||||||
#, c-format
|
|
||||||
msgid "y value was %d, %d was expected"
|
|
||||||
msgstr "세로값이 %d입니다. 와야 하는 값은 %d입니다"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:1359
|
|
||||||
#, c-format
|
|
||||||
msgid "%d coordinate expressions parsed in %g seconds (%g seconds average)\n"
|
|
||||||
msgstr "좌표 표현식 %d개를 %g초에 파싱했습니다(평균 %g초)\n"
|
|
||||||
|
18
po/sr.po
18
po/sr.po
@@ -10,8 +10,8 @@ msgstr ""
|
|||||||
"Project-Id-Version: mutter\n"
|
"Project-Id-Version: mutter\n"
|
||||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=mutter"
|
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=mutter"
|
||||||
"&keywords=I18N+L10N&component=general\n"
|
"&keywords=I18N+L10N&component=general\n"
|
||||||
"POT-Creation-Date: 2013-03-01 15:50+0000\n"
|
"POT-Creation-Date: 2013-08-18 20:03+0000\n"
|
||||||
"PO-Revision-Date: 2013-03-11 11:40+0200\n"
|
"PO-Revision-Date: 2013-09-06 09:19+0200\n"
|
||||||
"Last-Translator: Мирослав Николић <miroslavnikolic@rocketmail.com>\n"
|
"Last-Translator: Мирослав Николић <miroslavnikolic@rocketmail.com>\n"
|
||||||
"Language-Team: Serbian <gnom@prevod.org>\n"
|
"Language-Team: Serbian <gnom@prevod.org>\n"
|
||||||
"Language: sr\n"
|
"Language: sr\n"
|
||||||
@@ -320,6 +320,20 @@ msgstr ""
|
|||||||
"Не могу да пронађем тему! Проверите да „%s“ постоји и да садржи уобичајене "
|
"Не могу да пронађем тему! Проверите да „%s“ постоји и да садржи уобичајене "
|
||||||
"теме.\n"
|
"теме.\n"
|
||||||
|
|
||||||
|
#: ../src/core/monitor.c:711
|
||||||
|
msgid "Built-in display"
|
||||||
|
msgstr "Уграђени дисплеј"
|
||||||
|
|
||||||
|
#. TRANSLATORS: this is a monitor name (in case we don't know
|
||||||
|
#. the vendor), it's Unknown followed by a size in inches,
|
||||||
|
#. like 'Unknown 15"'
|
||||||
|
#.
|
||||||
|
#: ../src/core/monitor.c:739
|
||||||
|
#, c-format
|
||||||
|
#| msgid "Unknown element %s"
|
||||||
|
msgid "Unknown %s"
|
||||||
|
msgstr "Непознат %s"
|
||||||
|
|
||||||
#: ../src/core/mutter.c:40
|
#: ../src/core/mutter.c:40
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
|
@@ -10,8 +10,8 @@ msgstr ""
|
|||||||
"Project-Id-Version: mutter\n"
|
"Project-Id-Version: mutter\n"
|
||||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=mutter"
|
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=mutter"
|
||||||
"&keywords=I18N+L10N&component=general\n"
|
"&keywords=I18N+L10N&component=general\n"
|
||||||
"POT-Creation-Date: 2013-03-01 15:50+0000\n"
|
"POT-Creation-Date: 2013-08-18 20:03+0000\n"
|
||||||
"PO-Revision-Date: 2013-03-11 11:40+0200\n"
|
"PO-Revision-Date: 2013-09-06 09:19+0200\n"
|
||||||
"Last-Translator: Miroslav Nikolić <miroslavnikolic@rocketmail.com>\n"
|
"Last-Translator: Miroslav Nikolić <miroslavnikolic@rocketmail.com>\n"
|
||||||
"Language-Team: Serbian <gnom@prevod.org>\n"
|
"Language-Team: Serbian <gnom@prevod.org>\n"
|
||||||
"Language: sr\n"
|
"Language: sr\n"
|
||||||
@@ -320,6 +320,20 @@ msgstr ""
|
|||||||
"Ne mogu da pronađem temu! Proverite da „%s“ postoji i da sadrži uobičajene "
|
"Ne mogu da pronađem temu! Proverite da „%s“ postoji i da sadrži uobičajene "
|
||||||
"teme.\n"
|
"teme.\n"
|
||||||
|
|
||||||
|
#: ../src/core/monitor.c:711
|
||||||
|
msgid "Built-in display"
|
||||||
|
msgstr "Ugrađeni displej"
|
||||||
|
|
||||||
|
#. TRANSLATORS: this is a monitor name (in case we don't know
|
||||||
|
#. the vendor), it's Unknown followed by a size in inches,
|
||||||
|
#. like 'Unknown 15"'
|
||||||
|
#.
|
||||||
|
#: ../src/core/monitor.c:739
|
||||||
|
#, c-format
|
||||||
|
#| msgid "Unknown element %s"
|
||||||
|
msgid "Unknown %s"
|
||||||
|
msgstr "Nepoznat %s"
|
||||||
|
|
||||||
#: ../src/core/mutter.c:40
|
#: ../src/core/mutter.c:40
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
|
648
po/zh_HK.po
648
po/zh_HK.po
File diff suppressed because it is too large
Load Diff
648
po/zh_TW.po
648
po/zh_TW.po
File diff suppressed because it is too large
Load Diff
@@ -1 +1,7 @@
|
|||||||
EXTRA_DIST = xserver.xml
|
NULL =
|
||||||
|
|
||||||
|
EXTRA_DIST = \
|
||||||
|
gtk-shell.xml \
|
||||||
|
xdg-shell.xml \
|
||||||
|
xserver.xml \
|
||||||
|
$(NULL)
|
||||||
|
30
protocol/gtk-shell.xml
Normal file
30
protocol/gtk-shell.xml
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
<protocol name="gtk">
|
||||||
|
|
||||||
|
<interface name="gtk_shell" version="1">
|
||||||
|
<enum name="capability">
|
||||||
|
<entry name="global_app_menu" value="1"/>
|
||||||
|
<entry name="global_menu_bar" value="2"/>
|
||||||
|
</enum>
|
||||||
|
|
||||||
|
<event name="capabilities">
|
||||||
|
<arg name="capabilities" type="uint"/>
|
||||||
|
</event>
|
||||||
|
|
||||||
|
<request name="get_gtk_surface">
|
||||||
|
<arg name="gtk_surface" type="new_id" interface="gtk_surface"/>
|
||||||
|
<arg name="surface" type="object" interface="wl_surface"/>
|
||||||
|
</request>
|
||||||
|
</interface>
|
||||||
|
|
||||||
|
<interface name="gtk_surface" version="1">
|
||||||
|
<request name="set_dbus_properties">
|
||||||
|
<arg name="application_id" type="string" allow-null="true"/>
|
||||||
|
<arg name="app_menu_path" type="string" allow-null="true"/>
|
||||||
|
<arg name="menubar_path" type="string" allow-null="true"/>
|
||||||
|
<arg name="window_object_path" type="string" allow-null="true"/>
|
||||||
|
<arg name="application_object_path" type="string" allow-null="true"/>
|
||||||
|
<arg name="unique_bus_name" type="string" allow-null="true"/>
|
||||||
|
</request>
|
||||||
|
</interface>
|
||||||
|
|
||||||
|
</protocol>
|
441
protocol/xdg-shell.xml
Normal file
441
protocol/xdg-shell.xml
Normal file
@@ -0,0 +1,441 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<protocol name="xdg_shell">
|
||||||
|
|
||||||
|
<copyright>
|
||||||
|
Copyright © 2008-2013 Kristian Høgsberg
|
||||||
|
Copyright © 2013 Rafael Antognolli
|
||||||
|
Copyright © 2013 Jasper St. Pierre
|
||||||
|
Copyright © 2010-2013 Intel Corporation
|
||||||
|
|
||||||
|
Permission to use, copy, modify, distribute, and sell this
|
||||||
|
software and its documentation for any purpose is hereby granted
|
||||||
|
without fee, provided that the above copyright notice appear in
|
||||||
|
all copies and that both that copyright notice and this permission
|
||||||
|
notice appear in supporting documentation, and that the name of
|
||||||
|
the copyright holders not be used in advertising or publicity
|
||||||
|
pertaining to distribution of the software without specific,
|
||||||
|
written prior permission. The copyright holders make no
|
||||||
|
representations about the suitability of this software for any
|
||||||
|
purpose. It is provided "as is" without express or implied
|
||||||
|
warranty.
|
||||||
|
|
||||||
|
THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
|
||||||
|
SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||||
|
FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||||
|
SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
|
||||||
|
AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
||||||
|
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
|
||||||
|
THIS SOFTWARE.
|
||||||
|
</copyright>
|
||||||
|
|
||||||
|
<interface name="xdg_shell" version="1">
|
||||||
|
<description summary="create desktop-style surfaces">
|
||||||
|
This interface is implemented by servers that provide
|
||||||
|
desktop-style user interfaces.
|
||||||
|
|
||||||
|
It allows clients to associate a xdg_surface with
|
||||||
|
a basic surface.
|
||||||
|
</description>
|
||||||
|
|
||||||
|
<enum name="version">
|
||||||
|
<description summary="latest protocol version">
|
||||||
|
Use this enum to check the protocol version, and it will be updated
|
||||||
|
automatically.
|
||||||
|
</description>
|
||||||
|
<entry name="current" value="2" summary="Always the latest version"/>
|
||||||
|
</enum>
|
||||||
|
|
||||||
|
|
||||||
|
<request name="use_unstable_version">
|
||||||
|
<description summary="enable use of this unstable version">
|
||||||
|
Use this request in order to enable use of this interface.
|
||||||
|
|
||||||
|
Understand and agree that one is using an unstable interface,
|
||||||
|
that will likely change in the future, breaking the API.
|
||||||
|
</description>
|
||||||
|
<arg name="version" type="int"/>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<request name="get_xdg_surface">
|
||||||
|
<description summary="create a shell surface from a surface">
|
||||||
|
Create a shell surface for an existing surface.
|
||||||
|
|
||||||
|
Only one shell or popup surface can be associated with a given
|
||||||
|
surface.
|
||||||
|
</description>
|
||||||
|
<arg name="id" type="new_id" interface="xdg_surface"/>
|
||||||
|
<arg name="surface" type="object" interface="wl_surface"/>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<request name="get_xdg_popup">
|
||||||
|
<description summary="create a shell surface from a surface">
|
||||||
|
Create a popup surface for an existing surface.
|
||||||
|
|
||||||
|
Only one shell or popup surface can be associated with a given
|
||||||
|
surface.
|
||||||
|
</description>
|
||||||
|
<arg name="id" type="new_id" interface="xdg_popup"/>
|
||||||
|
<arg name="surface" type="object" interface="wl_surface"/>
|
||||||
|
<arg name="parent" type="object" interface="wl_surface"/>
|
||||||
|
<arg name="seat" type="object" interface="wl_seat" summary="the wl_seat whose pointer is used"/>
|
||||||
|
<arg name="serial" type="uint" summary="serial of the implicit grab on the pointer"/>
|
||||||
|
<arg name="x" type="int"/>
|
||||||
|
<arg name="y" type="int"/>
|
||||||
|
<arg name="flags" type="uint"/>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<event name="ping">
|
||||||
|
<description summary="check if the client is alive">
|
||||||
|
The ping event asks the client if it's still alive. Pass the
|
||||||
|
serial specified in the event back to the compositor by sending
|
||||||
|
a "pong" request back with the specified serial.
|
||||||
|
|
||||||
|
Compositors can use this to determine if the client is still
|
||||||
|
alive. It's unspecified what will happen if the client doesn't
|
||||||
|
respond to the ping request, or in what timeframe. Clients should
|
||||||
|
try to respond in a reasonable amount of time.
|
||||||
|
</description>
|
||||||
|
<arg name="serial" type="uint" summary="pass this to the callback"/>
|
||||||
|
</event>
|
||||||
|
|
||||||
|
<request name="pong">
|
||||||
|
<description summary="respond to a ping event">
|
||||||
|
A client must respond to a ping event with a pong request or
|
||||||
|
the client may be deemed unresponsive.
|
||||||
|
</description>
|
||||||
|
<arg name="serial" type="uint" summary="serial of the ping event"/>
|
||||||
|
</request>
|
||||||
|
</interface>
|
||||||
|
|
||||||
|
<interface name="xdg_surface" version="1">
|
||||||
|
|
||||||
|
<description summary="desktop-style metadata interface">
|
||||||
|
An interface that may be implemented by a wl_surface, for
|
||||||
|
implementations that provide a desktop-style user interface.
|
||||||
|
|
||||||
|
It provides requests to treat surfaces like windows, allowing to set
|
||||||
|
properties like maximized, fullscreen, minimized, and to move and resize
|
||||||
|
them, and associate metadata like title and app id.
|
||||||
|
|
||||||
|
On the server side the object is automatically destroyed when
|
||||||
|
the related wl_surface is destroyed. On client side,
|
||||||
|
xdg_surface.destroy() must be called before destroying
|
||||||
|
the wl_surface object.
|
||||||
|
</description>
|
||||||
|
|
||||||
|
<request name="destroy" type="destructor">
|
||||||
|
<description summary="remove xdg_surface interface">
|
||||||
|
The xdg_surface interface is removed from the wl_surface object
|
||||||
|
that was turned into a xdg_surface with
|
||||||
|
xdg_shell.get_xdg_surface request. The xdg_surface properties,
|
||||||
|
like maximized and fullscreen, are lost. The wl_surface loses
|
||||||
|
its role as a xdg_surface. The wl_surface is unmapped.
|
||||||
|
</description>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<request name="set_transient_for">
|
||||||
|
<description summary="surface is a child of another surface">
|
||||||
|
Setting a surface as transient of another means that it is child
|
||||||
|
of another surface.
|
||||||
|
|
||||||
|
Child surfaces are stacked above their parents, and will be
|
||||||
|
unmapped if the parent is unmapped too. They should not appear
|
||||||
|
on task bars and alt+tab.
|
||||||
|
</description>
|
||||||
|
<arg name="parent" type="object" interface="wl_surface" allow-null="true"/>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<request name="set_margin">
|
||||||
|
<description summary="set the visible frame boundaries">
|
||||||
|
This tells the compositor what the visible size of the window
|
||||||
|
should be, so it can use it to determine what borders to use for
|
||||||
|
constrainment and alignment.
|
||||||
|
|
||||||
|
CSD often has invisible areas for decoration purposes, like drop
|
||||||
|
shadows. These "shadow" drawings need to be subtracted out of the
|
||||||
|
normal boundaries of the window when computing where to place
|
||||||
|
windows (e.g. to set this window so it's centered on top of another,
|
||||||
|
or to put it to the left or right of the screen.)
|
||||||
|
|
||||||
|
This value should change as little as possible at runtime, to
|
||||||
|
prevent flicker.
|
||||||
|
|
||||||
|
This value is also ignored when the window is maximized or
|
||||||
|
fullscreen, and assumed to be 0.
|
||||||
|
|
||||||
|
If never called, this value is assumed to be 0.
|
||||||
|
</description>
|
||||||
|
<arg name="left_margin" type="int"/>
|
||||||
|
<arg name="right_margin" type="int"/>
|
||||||
|
<arg name="top_margin" type="int"/>
|
||||||
|
<arg name="bottom_margin" type="int"/>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<request name="set_title">
|
||||||
|
<description summary="set surface title">
|
||||||
|
Set a short title for the surface.
|
||||||
|
|
||||||
|
This string may be used to identify the surface in a task bar,
|
||||||
|
window list, or other user interface elements provided by the
|
||||||
|
compositor.
|
||||||
|
|
||||||
|
The string must be encoded in UTF-8.
|
||||||
|
</description>
|
||||||
|
<arg name="title" type="string"/>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<request name="set_app_id">
|
||||||
|
<description summary="set surface class">
|
||||||
|
Set an id for the surface.
|
||||||
|
|
||||||
|
The app id identifies the general class of applications to which
|
||||||
|
the surface belongs.
|
||||||
|
|
||||||
|
It should be the ID that appears in the new desktop entry
|
||||||
|
specification, the interface name.
|
||||||
|
</description>
|
||||||
|
<arg name="app_id" type="string"/>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<request name="move">
|
||||||
|
<description summary="start an interactive move">
|
||||||
|
Start a pointer-driven move of the surface.
|
||||||
|
|
||||||
|
This request must be used in response to a button press event.
|
||||||
|
The server may ignore move requests depending on the state of
|
||||||
|
the surface (e.g. fullscreen or maximized).
|
||||||
|
</description>
|
||||||
|
<arg name="seat" type="object" interface="wl_seat" summary="the wl_seat whose pointer is used"/>
|
||||||
|
<arg name="serial" type="uint" summary="serial of the implicit grab on the pointer"/>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<enum name="resize_edge">
|
||||||
|
<description summary="edge values for resizing">
|
||||||
|
These values are used to indicate which edge of a surface
|
||||||
|
is being dragged in a resize operation. The server may
|
||||||
|
use this information to adapt its behavior, e.g. choose
|
||||||
|
an appropriate cursor image.
|
||||||
|
</description>
|
||||||
|
<entry name="none" value="0"/>
|
||||||
|
<entry name="top" value="1"/>
|
||||||
|
<entry name="bottom" value="2"/>
|
||||||
|
<entry name="left" value="4"/>
|
||||||
|
<entry name="top_left" value="5"/>
|
||||||
|
<entry name="bottom_left" value="6"/>
|
||||||
|
<entry name="right" value="8"/>
|
||||||
|
<entry name="top_right" value="9"/>
|
||||||
|
<entry name="bottom_right" value="10"/>
|
||||||
|
</enum>
|
||||||
|
|
||||||
|
<request name="resize">
|
||||||
|
<description summary="start an interactive resize">
|
||||||
|
Start a pointer-driven resizing of the surface.
|
||||||
|
|
||||||
|
This request must be used in response to a button press event.
|
||||||
|
The server may ignore resize requests depending on the state of
|
||||||
|
the surface (e.g. fullscreen or maximized).
|
||||||
|
</description>
|
||||||
|
<arg name="seat" type="object" interface="wl_seat" summary="the wl_seat whose pointer is used"/>
|
||||||
|
<arg name="serial" type="uint" summary="serial of the implicit grab on the pointer"/>
|
||||||
|
<arg name="edges" type="uint" summary="which edge or corner is being dragged"/>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<event name="configure">
|
||||||
|
<description summary="suggest resize">
|
||||||
|
The configure event asks the client to resize its surface.
|
||||||
|
|
||||||
|
The size is a hint, in the sense that the client is free to
|
||||||
|
ignore it if it doesn't resize, pick a smaller size (to
|
||||||
|
satisfy aspect ratio or resize in steps of NxM pixels).
|
||||||
|
|
||||||
|
The client is free to dismiss all but the last configure
|
||||||
|
event it received.
|
||||||
|
|
||||||
|
The width and height arguments specify the size of the window
|
||||||
|
in surface local coordinates.
|
||||||
|
</description>
|
||||||
|
|
||||||
|
<arg name="width" type="int"/>
|
||||||
|
<arg name="height" type="int"/>
|
||||||
|
</event>
|
||||||
|
|
||||||
|
<request name="set_output">
|
||||||
|
<description summary="set the default output used by this surface">
|
||||||
|
Set the default output used by this surface when it is first mapped.
|
||||||
|
|
||||||
|
If this value is NULL (default), it's up to the compositor to choose
|
||||||
|
which display will be used to map this surface.
|
||||||
|
|
||||||
|
When fullscreen or maximized state are set on this surface, and it
|
||||||
|
wasn't mapped yet, the output set with this method will be used.
|
||||||
|
Otherwise, the output where the surface is currently mapped will be
|
||||||
|
used.
|
||||||
|
</description>
|
||||||
|
<arg name="output" type="object" interface="wl_output" allow-null="true"/>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<enum name="state_type">
|
||||||
|
<description summary="types of state on the surface">
|
||||||
|
The different state values used on the surface. This is designed for
|
||||||
|
state values like maximized, fullscreen. It is paired with the
|
||||||
|
request_change_state event to ensure that both the client and the
|
||||||
|
compositor setting the state can be synchronized.
|
||||||
|
|
||||||
|
States set in this way are double-buffered. They will get applied on
|
||||||
|
the next commit.
|
||||||
|
|
||||||
|
Desktop environments may extend this enum by taking up a range of
|
||||||
|
values and documenting the range they chose in this description.
|
||||||
|
They are not required to document the values for the range that they
|
||||||
|
chose. Ideally, any good extensions from a desktop environment should
|
||||||
|
make its way into standardization into this enum.
|
||||||
|
|
||||||
|
The current reserved ranges are:
|
||||||
|
|
||||||
|
0x0000 - 0x0FFF: xdg-shell core values, documented below.
|
||||||
|
0x1000 - 0x1FFF: GNOME
|
||||||
|
</description>
|
||||||
|
<entry name="maximized" value="1" summary="the surface is maximized">
|
||||||
|
A non-zero value indicates the surface is maximized. Otherwise,
|
||||||
|
the surface is unmaximized.
|
||||||
|
</entry>
|
||||||
|
<entry name="fullscreen" value="2" summary="the surface is fullscreen">
|
||||||
|
A non-zero value indicates the surface is fullscreen. Otherwise,
|
||||||
|
the surface is not fullscreen.
|
||||||
|
</entry>
|
||||||
|
</enum>
|
||||||
|
|
||||||
|
<request name="request_change_state">
|
||||||
|
<description summary="client requests to change a surface's state">
|
||||||
|
This asks the compositor to change the state. If the compositor wants
|
||||||
|
to change the state, it will send a change_state event with the same
|
||||||
|
state_type, value, and serial, and the event flow continues as if it
|
||||||
|
it was initiated by the compositor.
|
||||||
|
|
||||||
|
If the compositor does not want to change the state, it will send a
|
||||||
|
change_state to the client with the old value of the state.
|
||||||
|
</description>
|
||||||
|
<arg name="state_type" type="uint" summary="the state to set"/>
|
||||||
|
<arg name="value" type="uint" summary="the value to change the state to"/>
|
||||||
|
<arg name="serial" type="uint" summary="an event serial">
|
||||||
|
This serial is so the client can know which change_state event corresponds
|
||||||
|
to which request_change_state request it sent out.
|
||||||
|
</arg>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<event name="change_state">
|
||||||
|
<description summary="compositor wants to change a surface's state">
|
||||||
|
This event tells the client to change a surface's state. The client
|
||||||
|
should respond with an ack_change_state request to the compositor to
|
||||||
|
guarantee that the compositor knows that the client has seen it.
|
||||||
|
</description>
|
||||||
|
|
||||||
|
<arg name="state_type" type="uint" summary="the state to set"/>
|
||||||
|
<arg name="value" type="uint" summary="the value to change the state to"/>
|
||||||
|
<arg name="serial" type="uint" summary="a serial for the compositor's own tracking"/>
|
||||||
|
</event>
|
||||||
|
|
||||||
|
<request name="ack_change_state">
|
||||||
|
<description summary="ack a change_state event">
|
||||||
|
When a change_state event is received, a client should then ack it
|
||||||
|
using the ack_change_state request to ensure that the compositor
|
||||||
|
knows the client has seen the event.
|
||||||
|
|
||||||
|
By this point, the state is confirmed, and the next attach should
|
||||||
|
contain the buffer drawn for the new state value.
|
||||||
|
|
||||||
|
The values here need to be the same as the values in the cooresponding
|
||||||
|
change_state event.
|
||||||
|
</description>
|
||||||
|
<arg name="state_type" type="uint" summary="the state to set"/>
|
||||||
|
<arg name="value" type="uint" summary="the value to change the state to"/>
|
||||||
|
<arg name="serial" type="uint" summary="a serial to pass to change_state"/>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<request name="set_minimized">
|
||||||
|
<description summary="minimize the surface">
|
||||||
|
Minimize the surface.
|
||||||
|
</description>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<event name="activated">
|
||||||
|
<description summary="surface was activated">
|
||||||
|
The activated_set event is sent when this surface has been
|
||||||
|
activated, which means that the surface has user attention.
|
||||||
|
Window decorations should be updated accordingly. You should
|
||||||
|
not use this event for anything but the style of decorations
|
||||||
|
you display, use wl_keyboard.enter and wl_keyboard.leave for
|
||||||
|
determining keyboard focus.
|
||||||
|
</description>
|
||||||
|
</event>
|
||||||
|
|
||||||
|
<event name="deactivated">
|
||||||
|
<description summary="surface was deactivated">
|
||||||
|
The deactivate event is sent when this surface has been
|
||||||
|
deactivated, which means that the surface lost user attention.
|
||||||
|
Window decorations should be updated accordingly. You should
|
||||||
|
not use this event for anything but the style of decorations
|
||||||
|
you display, use wl_keyboard.enter and wl_keyboard.leave for
|
||||||
|
determining keyboard focus.
|
||||||
|
</description>
|
||||||
|
</event>
|
||||||
|
|
||||||
|
<event name="delete">
|
||||||
|
<description summary="surface wants to be closed">
|
||||||
|
The delete event is sent by the compositor when the user
|
||||||
|
wants the surface to be closed. This should be equivalent to
|
||||||
|
the user clicking the close button in client-side decorations,
|
||||||
|
if your application has any...
|
||||||
|
|
||||||
|
This is only a request that the user intends to close your
|
||||||
|
window. The client may choose to ignore this request, or show
|
||||||
|
a dialog to ask the user to save their data...
|
||||||
|
</description>
|
||||||
|
</event>
|
||||||
|
</interface>
|
||||||
|
|
||||||
|
<interface name="xdg_popup" version="1">
|
||||||
|
<description summary="desktop-style metadata interface">
|
||||||
|
An interface that may be implemented by a wl_surface, for
|
||||||
|
implementations that provide a desktop-style popups/menus. A popup
|
||||||
|
surface is a transient surface with an added pointer grab.
|
||||||
|
|
||||||
|
An existing implicit grab will be changed to owner-events mode,
|
||||||
|
and the popup grab will continue after the implicit grab ends
|
||||||
|
(i.e. releasing the mouse button does not cause the popup to be
|
||||||
|
unmapped).
|
||||||
|
|
||||||
|
The popup grab continues until the window is destroyed or a mouse
|
||||||
|
button is pressed in any other clients window. A click in any of
|
||||||
|
the clients surfaces is reported as normal, however, clicks in
|
||||||
|
other clients surfaces will be discarded and trigger the callback.
|
||||||
|
|
||||||
|
The x and y arguments specify the locations of the upper left
|
||||||
|
corner of the surface relative to the upper left corner of the
|
||||||
|
parent surface, in surface local coordinates.
|
||||||
|
|
||||||
|
xdg_popup surfaces are always transient for another surface.
|
||||||
|
</description>
|
||||||
|
|
||||||
|
<request name="destroy" type="destructor">
|
||||||
|
<description summary="remove xdg_surface interface">
|
||||||
|
The xdg_surface interface is removed from the wl_surface object
|
||||||
|
that was turned into a xdg_surface with
|
||||||
|
xdg_shell.get_xdg_surface request. The xdg_surface properties,
|
||||||
|
like maximized and fullscreen, are lost. The wl_surface loses
|
||||||
|
its role as a xdg_surface. The wl_surface is unmapped.
|
||||||
|
</description>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<event name="popup_done">
|
||||||
|
<description summary="popup interaction is done">
|
||||||
|
The popup_done event is sent out when a popup grab is broken,
|
||||||
|
that is, when the users clicks a surface that doesn't belong
|
||||||
|
to the client owning the popup surface.
|
||||||
|
</description>
|
||||||
|
<arg name="serial" type="uint" summary="serial of the implicit grab on the pointer"/>
|
||||||
|
</event>
|
||||||
|
|
||||||
|
</interface>
|
||||||
|
</protocol>
|
@@ -40,9 +40,12 @@ mutter_built_sources = \
|
|||||||
$(dbus_xrandr_built_sources) \
|
$(dbus_xrandr_built_sources) \
|
||||||
mutter-enum-types.h \
|
mutter-enum-types.h \
|
||||||
mutter-enum-types.c \
|
mutter-enum-types.c \
|
||||||
|
wayland/gtk-shell-protocol.c \
|
||||||
|
wayland/gtk-shell-server-protocol.h \
|
||||||
|
wayland/xdg-shell-protocol.c \
|
||||||
|
wayland/xdg-shell-server-protocol.h \
|
||||||
wayland/xserver-protocol.c \
|
wayland/xserver-protocol.c \
|
||||||
wayland/xserver-server-protocol.h \
|
wayland/xserver-server-protocol.h
|
||||||
wayland/xserver-client-protocol.h
|
|
||||||
|
|
||||||
libmutter_wayland_la_SOURCES = \
|
libmutter_wayland_la_SOURCES = \
|
||||||
core/async-getprop.c \
|
core/async-getprop.c \
|
||||||
@@ -64,7 +67,8 @@ libmutter_wayland_la_SOURCES = \
|
|||||||
compositor/meta-background-actor.c \
|
compositor/meta-background-actor.c \
|
||||||
compositor/meta-background-actor-private.h \
|
compositor/meta-background-actor-private.h \
|
||||||
compositor/meta-background-group.c \
|
compositor/meta-background-group.c \
|
||||||
compositor/meta-background-group-private.h \
|
compositor/meta-cullable.c \
|
||||||
|
compositor/meta-cullable.h \
|
||||||
compositor/meta-module.c \
|
compositor/meta-module.c \
|
||||||
compositor/meta-module.h \
|
compositor/meta-module.h \
|
||||||
compositor/meta-plugin.c \
|
compositor/meta-plugin.c \
|
||||||
@@ -74,6 +78,8 @@ libmutter_wayland_la_SOURCES = \
|
|||||||
compositor/meta-shadow-factory-private.h \
|
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.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 \
|
||||||
@@ -131,6 +137,7 @@ libmutter_wayland_la_SOURCES = \
|
|||||||
core/meta-xrandr-shared.h \
|
core/meta-xrandr-shared.h \
|
||||||
core/monitor.c \
|
core/monitor.c \
|
||||||
core/monitor-config.c \
|
core/monitor-config.c \
|
||||||
|
core/monitor-kms.c \
|
||||||
core/monitor-private.h \
|
core/monitor-private.h \
|
||||||
core/monitor-xrandr.c \
|
core/monitor-xrandr.c \
|
||||||
core/mutter-Xatomtype.h \
|
core/mutter-Xatomtype.h \
|
||||||
@@ -150,8 +157,11 @@ libmutter_wayland_la_SOURCES = \
|
|||||||
core/stack-tracker.h \
|
core/stack-tracker.h \
|
||||||
core/util.c \
|
core/util.c \
|
||||||
meta/util.h \
|
meta/util.h \
|
||||||
|
core/util-private.h \
|
||||||
core/window-props.c \
|
core/window-props.c \
|
||||||
core/window-props.h \
|
core/window-props.h \
|
||||||
|
core/window-x11.c \
|
||||||
|
core/window-x11.h \
|
||||||
core/window.c \
|
core/window.c \
|
||||||
core/window-private.h \
|
core/window-private.h \
|
||||||
meta/window.h \
|
meta/window.h \
|
||||||
@@ -179,9 +189,6 @@ libmutter_wayland_la_SOURCES = \
|
|||||||
meta/theme.h \
|
meta/theme.h \
|
||||||
ui/theme-private.h \
|
ui/theme-private.h \
|
||||||
ui/ui.c \
|
ui/ui.c \
|
||||||
$(mutter_built_sources)
|
|
||||||
|
|
||||||
libmutter_wayland_la_SOURCES += \
|
|
||||||
wayland/meta-wayland.c \
|
wayland/meta-wayland.c \
|
||||||
wayland/meta-wayland-private.h \
|
wayland/meta-wayland-private.h \
|
||||||
wayland/meta-xwayland-private.h \
|
wayland/meta-xwayland-private.h \
|
||||||
@@ -195,7 +202,16 @@ libmutter_wayland_la_SOURCES += \
|
|||||||
wayland/meta-wayland-seat.c \
|
wayland/meta-wayland-seat.c \
|
||||||
wayland/meta-wayland-seat.h \
|
wayland/meta-wayland-seat.h \
|
||||||
wayland/meta-wayland-stage.h \
|
wayland/meta-wayland-stage.h \
|
||||||
wayland/meta-wayland-stage.c
|
wayland/meta-wayland-stage.c \
|
||||||
|
wayland/meta-wayland-surface.c \
|
||||||
|
wayland/meta-wayland-surface.h \
|
||||||
|
wayland/meta-wayland-types.h \
|
||||||
|
wayland/meta-wayland-versions.h \
|
||||||
|
wayland/meta-weston-launch.c \
|
||||||
|
wayland/meta-weston-launch.h
|
||||||
|
|
||||||
|
nodist_libmutter_wayland_la_SOURCES = \
|
||||||
|
$(mutter_built_sources)
|
||||||
|
|
||||||
libmutter_wayland_la_LDFLAGS = -no-undefined
|
libmutter_wayland_la_LDFLAGS = -no-undefined
|
||||||
libmutter_wayland_la_LIBADD = $(MUTTER_LIBS)
|
libmutter_wayland_la_LIBADD = $(MUTTER_LIBS)
|
||||||
@@ -247,6 +263,17 @@ bin_PROGRAMS=mutter-wayland
|
|||||||
mutter_wayland_SOURCES = core/mutter.c
|
mutter_wayland_SOURCES = core/mutter.c
|
||||||
mutter_wayland_LDADD = $(MUTTER_LIBS) libmutter-wayland.la
|
mutter_wayland_LDADD = $(MUTTER_LIBS) libmutter-wayland.la
|
||||||
|
|
||||||
|
bin_PROGRAMS+=mutter-launch
|
||||||
|
|
||||||
|
mutter_launch_SOURCES = wayland/weston-launch.c wayland/weston-launch.h
|
||||||
|
|
||||||
|
mutter_launch_CFLAGS = $(MUTTER_LAUNCH_CFLAGS) -DLIBDIR=\"$(libdir)\"
|
||||||
|
mutter_launch_LDFLAGS = $(MUTTER_LAUNCH_LIBS) -lpam
|
||||||
|
|
||||||
|
install-exec-hook:
|
||||||
|
-chown root $(DESTDIR)$(bindir)/mutter-launch
|
||||||
|
-chmod u+s $(DESTDIR)$(bindir)/mutter-launch
|
||||||
|
|
||||||
if HAVE_INTROSPECTION
|
if HAVE_INTROSPECTION
|
||||||
include $(INTROSPECTION_MAKEFILE)
|
include $(INTROSPECTION_MAKEFILE)
|
||||||
|
|
||||||
@@ -275,7 +302,7 @@ Meta-$(api_version).gir: libmutter-wayland.la
|
|||||||
@META_GIR@_FILES = \
|
@META_GIR@_FILES = \
|
||||||
mutter-enum-types.h \
|
mutter-enum-types.h \
|
||||||
$(libmutterinclude_base_headers) \
|
$(libmutterinclude_base_headers) \
|
||||||
$(filter %.c,$(libmutter_wayland_la_SOURCES))
|
$(filter %.c,$(libmutter_wayland_la_SOURCES) $(nodist_libmutter_wayland_la_SOURCES))
|
||||||
@META_GIR@_SCANNERFLAGS = --warn-all --warn-error
|
@META_GIR@_SCANNERFLAGS = --warn-all --warn-error
|
||||||
|
|
||||||
endif
|
endif
|
||||||
@@ -306,7 +333,7 @@ xml_DATA = $(xml_in_files:.xml.in=.xml)
|
|||||||
|
|
||||||
dbus_idle_built_sources = meta-dbus-idle-monitor.c meta-dbus-idle-monitor.h
|
dbus_idle_built_sources = meta-dbus-idle-monitor.c meta-dbus-idle-monitor.h
|
||||||
|
|
||||||
gsettings_SCHEMAS = org.gnome.mutter.gschema.xml
|
gsettings_SCHEMAS = org.gnome.mutter.gschema.xml org.gnome.mutter.wayland.gschema.xml
|
||||||
@INTLTOOL_XML_NOMERGE_RULE@
|
@INTLTOOL_XML_NOMERGE_RULE@
|
||||||
@GSETTINGS_RULES@
|
@GSETTINGS_RULES@
|
||||||
|
|
||||||
@@ -317,6 +344,7 @@ CLEANFILES = \
|
|||||||
mutter-wayland.desktop \
|
mutter-wayland.desktop \
|
||||||
mutter-wm.desktop \
|
mutter-wm.desktop \
|
||||||
org.gnome.mutter.gschema.xml \
|
org.gnome.mutter.gschema.xml \
|
||||||
|
org.gnome.mutter.wayland.gschema.xml \
|
||||||
$(xml_DATA) \
|
$(xml_DATA) \
|
||||||
$(mutter_built_sources) \
|
$(mutter_built_sources) \
|
||||||
$(typelib_DATA) \
|
$(typelib_DATA) \
|
||||||
@@ -333,10 +361,12 @@ EXTRA_DIST=$(desktopfiles_files) \
|
|||||||
$(wmproperties_in_files) \
|
$(wmproperties_in_files) \
|
||||||
$(xml_in_files) \
|
$(xml_in_files) \
|
||||||
org.gnome.mutter.gschema.xml.in \
|
org.gnome.mutter.gschema.xml.in \
|
||||||
|
org.gnome.mutter.wayland.gschema.xml.in \
|
||||||
mutter-schemas.convert \
|
mutter-schemas.convert \
|
||||||
libmutter-wayland.pc.in \
|
libmutter-wayland.pc.in \
|
||||||
mutter-enum-types.h.in \
|
mutter-enum-types.h.in \
|
||||||
mutter-enum-types.c.in
|
mutter-enum-types.c.in \
|
||||||
|
xrandr.xml idle-monitor.xml
|
||||||
|
|
||||||
BUILT_SOURCES = $(mutter_built_sources)
|
BUILT_SOURCES = $(mutter_built_sources)
|
||||||
MUTTER_STAMP_FILES = stamp-mutter-enum-types.h
|
MUTTER_STAMP_FILES = stamp-mutter-enum-types.h
|
||||||
@@ -370,7 +400,6 @@ $(dbus_xrandr_built_sources) : Makefile.am xrandr.xml
|
|||||||
--generate-c-code meta-dbus-xrandr \
|
--generate-c-code meta-dbus-xrandr \
|
||||||
$(srcdir)/xrandr.xml
|
$(srcdir)/xrandr.xml
|
||||||
|
|
||||||
dbus_idle_built_sources = meta-dbus-idle-monitor.c meta-dbus-idle-monitor.h
|
|
||||||
|
|
||||||
$(dbus_idle_built_sources) : Makefile.am idle-monitor.xml
|
$(dbus_idle_built_sources) : Makefile.am idle-monitor.xml
|
||||||
$(AM_V_GEN)gdbus-codegen \
|
$(AM_V_GEN)gdbus-codegen \
|
||||||
@@ -386,6 +415,3 @@ wayland/%-protocol.c : $(top_builddir)/protocol/%.xml
|
|||||||
wayland/%-server-protocol.h : $(top_builddir)/protocol/%.xml
|
wayland/%-server-protocol.h : $(top_builddir)/protocol/%.xml
|
||||||
mkdir -p wayland
|
mkdir -p wayland
|
||||||
$(AM_V_GEN)$(WAYLAND_SCANNER) server-header < $< > $@
|
$(AM_V_GEN)$(WAYLAND_SCANNER) server-header < $< > $@
|
||||||
wayland/%-client-protocol.h : $(top_builddir)/protocol/%.xml
|
|
||||||
mkdir -p wayland
|
|
||||||
$(AM_V_GEN)$(WAYLAND_SCANNER) client-header < $< > $@
|
|
||||||
|
@@ -16,9 +16,7 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "clutter-utils.h"
|
#include "clutter-utils.h"
|
||||||
@@ -95,8 +93,10 @@ meta_actor_vertices_are_untransformed (ClutterVertex *verts,
|
|||||||
v3x != v1x || v3y != v2y)
|
v3x != v1x || v3y != v2y)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
*x_origin = x;
|
if (x_origin)
|
||||||
*y_origin = y;
|
*x_origin = x;
|
||||||
|
if (y_origin)
|
||||||
|
*y_origin = y;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@@ -15,9 +15,7 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __META_CLUTTER_UTILS_H__
|
#ifndef __META_CLUTTER_UTILS_H__
|
||||||
|
@@ -16,9 +16,7 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <clutter/clutter.h>
|
#include <clutter/clutter.h>
|
||||||
@@ -50,7 +48,7 @@ meta_create_color_texture_4ub (guint8 red,
|
|||||||
CoglColor color;
|
CoglColor color;
|
||||||
guint8 pixel[4];
|
guint8 pixel[4];
|
||||||
|
|
||||||
cogl_color_set_from_4ub (&color, red, green, blue, alpha);
|
cogl_color_init_from_4ub (&color, red, green, blue, alpha);
|
||||||
cogl_color_premultiply (&color);
|
cogl_color_premultiply (&color);
|
||||||
|
|
||||||
pixel[0] = cogl_color_get_red_byte (&color);
|
pixel[0] = cogl_color_get_red_byte (&color);
|
||||||
@@ -73,10 +71,8 @@ meta_create_color_texture_4ub (guint8 red,
|
|||||||
* @src_texture: (allow-none): texture to use initially for the layer
|
* @src_texture: (allow-none): texture to use initially for the layer
|
||||||
*
|
*
|
||||||
* Creates a pipeline with a single layer. Using a common template
|
* Creates a pipeline with a single layer. Using a common template
|
||||||
* allows sharing a shader for different uses in Mutter. To share the same
|
* makes it easier for Cogl to share a shader for different uses in
|
||||||
* shader with all other pipelines that are just texture plus opacity
|
* Mutter.
|
||||||
* would require Cogl fixes.
|
|
||||||
* (See http://bugzilla.clutter-project.org/show_bug.cgi?id=2425)
|
|
||||||
*
|
*
|
||||||
* Return value: (transfer full): a newly created #CoglPipeline
|
* Return value: (transfer full): a newly created #CoglPipeline
|
||||||
*/
|
*/
|
||||||
@@ -86,22 +82,21 @@ meta_create_texture_pipeline (CoglTexture *src_texture)
|
|||||||
static CoglPipeline *texture_pipeline_template = NULL;
|
static CoglPipeline *texture_pipeline_template = NULL;
|
||||||
CoglPipeline *pipeline;
|
CoglPipeline *pipeline;
|
||||||
|
|
||||||
/* We use a pipeline that has a dummy texture as a base for all
|
/* The only state used in the pipeline that would affect the shader
|
||||||
texture pipelines. The idea is that only the Cogl texture object
|
generation is the texture type on the layer. Therefore we create
|
||||||
would be different in the children so it is likely that Cogl will
|
a template pipeline which sets this state and all texture
|
||||||
be able to share GL programs between all the textures. */
|
pipelines are created as a copy of this. That way Cogl can find
|
||||||
|
the shader state for the pipeline more quickly by looking at the
|
||||||
|
pipeline ancestry instead of resorting to the shader cache. */
|
||||||
if (G_UNLIKELY (texture_pipeline_template == NULL))
|
if (G_UNLIKELY (texture_pipeline_template == NULL))
|
||||||
{
|
{
|
||||||
CoglTexture *dummy_texture;
|
CoglContext *ctx =
|
||||||
CoglContext *ctx = clutter_backend_get_cogl_context (clutter_get_default_backend ());
|
clutter_backend_get_cogl_context (clutter_get_default_backend ());
|
||||||
|
|
||||||
dummy_texture = meta_create_color_texture_4ub (0xff, 0xff, 0xff, 0xff,
|
|
||||||
COGL_TEXTURE_NONE);
|
|
||||||
|
|
||||||
|
|
||||||
texture_pipeline_template = cogl_pipeline_new (ctx);
|
texture_pipeline_template = cogl_pipeline_new (ctx);
|
||||||
cogl_pipeline_set_layer_texture (texture_pipeline_template, 0, dummy_texture);
|
cogl_pipeline_set_layer_null_texture (texture_pipeline_template,
|
||||||
cogl_object_unref (dummy_texture);
|
0, /* layer */
|
||||||
|
COGL_TEXTURE_TYPE_2D);
|
||||||
}
|
}
|
||||||
|
|
||||||
pipeline = cogl_pipeline_copy (texture_pipeline_template);
|
pipeline = cogl_pipeline_copy (texture_pipeline_template);
|
||||||
|
@@ -15,9 +15,7 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __META_COGL_UTILS_H__
|
#ifndef __META_COGL_UTILS_H__
|
||||||
|
@@ -17,8 +17,6 @@ struct _MetaCompositor
|
|||||||
{
|
{
|
||||||
MetaDisplay *display;
|
MetaDisplay *display;
|
||||||
|
|
||||||
Atom atom_x_root_pixmap;
|
|
||||||
Atom atom_net_wm_window_opacity;
|
|
||||||
guint repaint_func_id;
|
guint repaint_func_id;
|
||||||
|
|
||||||
ClutterActor *shadow_src;
|
ClutterActor *shadow_src;
|
||||||
@@ -48,11 +46,8 @@ struct _MetaCompScreen
|
|||||||
CoglFrameClosure *frame_closure;
|
CoglFrameClosure *frame_closure;
|
||||||
|
|
||||||
/* Used for unredirecting fullscreen windows */
|
/* Used for unredirecting fullscreen windows */
|
||||||
guint disable_unredirect_count;
|
guint disable_unredirect_count;
|
||||||
MetaWindowActor *unredirected_window;
|
MetaWindow *unredirected_window;
|
||||||
|
|
||||||
/* Before we create the output window */
|
|
||||||
XserverRegion pending_input_region;
|
|
||||||
|
|
||||||
gint switch_workspace_in_progress;
|
gint switch_workspace_in_progress;
|
||||||
|
|
||||||
|
@@ -42,15 +42,6 @@
|
|||||||
* the call, so it may be necessary to readjust the display based on the
|
* the call, so it may be necessary to readjust the display based on the
|
||||||
* old_rect to start the animation.
|
* old_rect to start the animation.
|
||||||
*
|
*
|
||||||
* meta_compositor_window_mapped() and meta_compositor_window_unmapped() are
|
|
||||||
* notifications when the toplevel window (frame or client window) is mapped or
|
|
||||||
* unmapped. That is, when the result of meta_window_toplevel_is_mapped()
|
|
||||||
* changes. The main use of this is to drop resources when a window is unmapped.
|
|
||||||
* A window will always be mapped before meta_compositor_show_window()
|
|
||||||
* is called and will not be unmapped until after meta_compositor_hide_window()
|
|
||||||
* is called. If the live_hidden_windows preference is set, windows will never
|
|
||||||
* be unmapped.
|
|
||||||
*
|
|
||||||
* # 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
|
||||||
@@ -84,7 +75,10 @@
|
|||||||
#include "meta-window-group.h"
|
#include "meta-window-group.h"
|
||||||
#include "window-private.h" /* to check window->hidden */
|
#include "window-private.h" /* to check window->hidden */
|
||||||
#include "display-private.h" /* for meta_display_lookup_x_window() */
|
#include "display-private.h" /* for meta_display_lookup_x_window() */
|
||||||
|
#include "util-private.h"
|
||||||
#include "meta-wayland-private.h"
|
#include "meta-wayland-private.h"
|
||||||
|
#include "meta-wayland-pointer.h"
|
||||||
|
#include "meta-wayland-keyboard.h"
|
||||||
#include <X11/extensions/shape.h>
|
#include <X11/extensions/shape.h>
|
||||||
#include <X11/extensions/Xcomposite.h>
|
#include <X11/extensions/Xcomposite.h>
|
||||||
|
|
||||||
@@ -146,19 +140,6 @@ meta_compositor_destroy (MetaCompositor *compositor)
|
|||||||
clutter_threads_remove_repaint_func (compositor->repaint_func_id);
|
clutter_threads_remove_repaint_func (compositor->repaint_func_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
add_win (MetaWindow *window)
|
|
||||||
{
|
|
||||||
MetaScreen *screen = meta_window_get_screen (window);
|
|
||||||
MetaCompScreen *info = meta_screen_get_compositor_data (screen);
|
|
||||||
|
|
||||||
g_return_if_fail (info != NULL);
|
|
||||||
|
|
||||||
meta_window_actor_new (window);
|
|
||||||
|
|
||||||
sync_actor_stacking (info);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
process_damage (MetaCompositor *compositor,
|
process_damage (MetaCompositor *compositor,
|
||||||
XDamageNotifyEvent *event,
|
XDamageNotifyEvent *event,
|
||||||
@@ -176,31 +157,6 @@ process_damage (MetaCompositor *compositor,
|
|||||||
meta_window_actor_process_x11_damage (window_actor, event);
|
meta_window_actor_process_x11_damage (window_actor, event);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
process_property_notify (MetaCompositor *compositor,
|
|
||||||
XPropertyEvent *event,
|
|
||||||
MetaWindow *window)
|
|
||||||
{
|
|
||||||
MetaWindowActor *window_actor;
|
|
||||||
|
|
||||||
if (window == NULL)
|
|
||||||
return;
|
|
||||||
|
|
||||||
window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (window));
|
|
||||||
if (window_actor == NULL)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* Check for the opacity changing */
|
|
||||||
if (event->atom == compositor->atom_net_wm_window_opacity)
|
|
||||||
{
|
|
||||||
meta_window_actor_update_opacity (window_actor);
|
|
||||||
DEBUG_TRACE ("process_property_notify: net_wm_window_opacity\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
DEBUG_TRACE ("process_property_notify: unknown\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
static Window
|
static Window
|
||||||
get_output_window (MetaScreen *screen)
|
get_output_window (MetaScreen *screen)
|
||||||
{
|
{
|
||||||
@@ -305,25 +261,6 @@ meta_get_window_actors (MetaScreen *screen)
|
|||||||
return info->windows;
|
return info->windows;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
do_set_stage_input_region (MetaScreen *screen,
|
|
||||||
XserverRegion region)
|
|
||||||
{
|
|
||||||
MetaCompScreen *info = meta_screen_get_compositor_data (screen);
|
|
||||||
MetaDisplay *display = meta_screen_get_display (screen);
|
|
||||||
Display *xdpy = meta_display_get_xdisplay (display);
|
|
||||||
Window xstage = clutter_x11_get_stage_window (CLUTTER_STAGE (info->stage));
|
|
||||||
|
|
||||||
XFixesSetWindowShapeRegion (xdpy, xstage, ShapeInput, 0, 0, region);
|
|
||||||
|
|
||||||
/* It's generally a good heuristic that when a crossing event is generated because
|
|
||||||
* we reshape the overlay, we don't want it to affect focus-follows-mouse focus -
|
|
||||||
* it's not the user doing something, it's the environment changing under the user.
|
|
||||||
*/
|
|
||||||
meta_display_add_ignored_crossing_serial (display, XNextRequest (xdpy));
|
|
||||||
XFixesSetWindowShapeRegion (xdpy, info->output, ShapeInput, 0, 0, region);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_set_stage_input_region (MetaScreen *screen,
|
meta_set_stage_input_region (MetaScreen *screen,
|
||||||
XserverRegion region)
|
XserverRegion region)
|
||||||
@@ -335,29 +272,19 @@ meta_set_stage_input_region (MetaScreen *screen,
|
|||||||
*/
|
*/
|
||||||
if (!meta_is_wayland_compositor ())
|
if (!meta_is_wayland_compositor ())
|
||||||
{
|
{
|
||||||
MetaCompScreen *info = meta_screen_get_compositor_data (screen);
|
MetaCompScreen *info = meta_screen_get_compositor_data (screen);
|
||||||
MetaDisplay *display = meta_screen_get_display (screen);
|
MetaDisplay *display = meta_screen_get_display (screen);
|
||||||
Display *xdpy = meta_display_get_xdisplay (display);
|
Display *xdpy = meta_display_get_xdisplay (display);
|
||||||
|
Window xstage = clutter_x11_get_stage_window (CLUTTER_STAGE (info->stage));
|
||||||
|
|
||||||
if (info->stage && info->output)
|
XFixesSetWindowShapeRegion (xdpy, xstage, ShapeInput, 0, 0, region);
|
||||||
{
|
|
||||||
do_set_stage_input_region (screen, region);
|
/* It's generally a good heuristic that when a crossing event is generated because
|
||||||
}
|
* we reshape the overlay, we don't want it to affect focus-follows-mouse focus -
|
||||||
else
|
* it's not the user doing something, it's the environment changing under the user.
|
||||||
{
|
*/
|
||||||
/* Reset info->pending_input_region if one existed before and set the new
|
meta_display_add_ignored_crossing_serial (display, XNextRequest (xdpy));
|
||||||
* one to use it later. */
|
XFixesSetWindowShapeRegion (xdpy, info->output, ShapeInput, 0, 0, region);
|
||||||
if (info->pending_input_region)
|
|
||||||
{
|
|
||||||
XFixesDestroyRegion (xdpy, info->pending_input_region);
|
|
||||||
info->pending_input_region = None;
|
|
||||||
}
|
|
||||||
if (region != None)
|
|
||||||
{
|
|
||||||
info->pending_input_region = XFixesCreateRegion (xdpy, NULL, 0);
|
|
||||||
XFixesCopyRegion (xdpy, info->pending_input_region, region);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -424,34 +351,20 @@ meta_stage_is_focused (MetaScreen *screen)
|
|||||||
return (screen->display->focus_type == META_FOCUS_STAGE);
|
return (screen->display->focus_type == META_FOCUS_STAGE);
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
static gboolean
|
||||||
meta_begin_modal_for_plugin (MetaScreen *screen,
|
begin_modal_x11 (MetaScreen *screen,
|
||||||
MetaPlugin *plugin,
|
MetaPlugin *plugin,
|
||||||
MetaModalOptions options,
|
MetaModalOptions options,
|
||||||
guint32 timestamp)
|
guint32 timestamp)
|
||||||
{
|
{
|
||||||
/* To some extent this duplicates code in meta_display_begin_grab_op(), but there
|
MetaDisplay *display = meta_screen_get_display (screen);
|
||||||
* are significant differences in how we handle grabs that make it difficult to
|
Display *xdpy = meta_display_get_xdisplay (display);
|
||||||
* merge the two.
|
MetaCompScreen *info = meta_screen_get_compositor_data (screen);
|
||||||
*/
|
Window grab_window = clutter_x11_get_stage_window (CLUTTER_STAGE (info->stage));
|
||||||
MetaDisplay *display = meta_screen_get_display (screen);
|
Cursor cursor = None;
|
||||||
Display *xdpy = meta_display_get_xdisplay (display);
|
int result;
|
||||||
MetaCompositor *compositor = display->compositor;
|
gboolean pointer_grabbed = FALSE;
|
||||||
ClutterStage *stage;
|
gboolean keyboard_grabbed = FALSE;
|
||||||
Window grab_window;
|
|
||||||
Cursor cursor = None;
|
|
||||||
gboolean pointer_grabbed = FALSE;
|
|
||||||
gboolean keyboard_grabbed = FALSE;
|
|
||||||
int result;
|
|
||||||
|
|
||||||
stage = CLUTTER_STAGE (meta_get_stage_for_screen (screen));
|
|
||||||
if (!stage)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
grab_window = clutter_x11_get_stage_window (stage);
|
|
||||||
|
|
||||||
if (compositor->modal_plugin != NULL || display->grab_op != META_GRAB_OP_NONE)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
if ((options & META_MODAL_POINTER_ALREADY_GRABBED) == 0)
|
if ((options & META_MODAL_POINTER_ALREADY_GRABBED) == 0)
|
||||||
{
|
{
|
||||||
@@ -501,14 +414,6 @@ meta_begin_modal_for_plugin (MetaScreen *screen,
|
|||||||
keyboard_grabbed = TRUE;
|
keyboard_grabbed = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
display->grab_op = META_GRAB_OP_COMPOSITOR;
|
|
||||||
display->grab_window = NULL;
|
|
||||||
display->grab_screen = screen;
|
|
||||||
display->grab_have_pointer = TRUE;
|
|
||||||
display->grab_have_keyboard = TRUE;
|
|
||||||
|
|
||||||
compositor->modal_plugin = plugin;
|
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
@@ -520,6 +425,80 @@ meta_begin_modal_for_plugin (MetaScreen *screen,
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
begin_modal_wayland (MetaScreen *screen,
|
||||||
|
MetaPlugin *plugin,
|
||||||
|
MetaModalOptions options,
|
||||||
|
guint32 timestamp)
|
||||||
|
{
|
||||||
|
MetaWaylandCompositor *compositor;
|
||||||
|
gboolean pointer_grabbed = FALSE;
|
||||||
|
gboolean keyboard_grabbed = FALSE;
|
||||||
|
|
||||||
|
compositor = meta_wayland_compositor_get_default ();
|
||||||
|
|
||||||
|
if ((options & META_MODAL_POINTER_ALREADY_GRABBED) == 0)
|
||||||
|
{
|
||||||
|
if (!meta_wayland_pointer_begin_modal (&compositor->seat->pointer))
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
pointer_grabbed = TRUE;
|
||||||
|
}
|
||||||
|
if ((options & META_MODAL_KEYBOARD_ALREADY_GRABBED) == 0)
|
||||||
|
{
|
||||||
|
if (!meta_wayland_keyboard_begin_modal (&compositor->seat->keyboard,
|
||||||
|
timestamp))
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
keyboard_grabbed = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
fail:
|
||||||
|
if (pointer_grabbed)
|
||||||
|
meta_wayland_pointer_end_modal (&compositor->seat->pointer);
|
||||||
|
if (keyboard_grabbed)
|
||||||
|
meta_wayland_keyboard_end_modal (&compositor->seat->keyboard, timestamp);
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
meta_begin_modal_for_plugin (MetaScreen *screen,
|
||||||
|
MetaPlugin *plugin,
|
||||||
|
MetaModalOptions options,
|
||||||
|
guint32 timestamp)
|
||||||
|
{
|
||||||
|
/* To some extent this duplicates code in meta_display_begin_grab_op(), but there
|
||||||
|
* are significant differences in how we handle grabs that make it difficult to
|
||||||
|
* merge the two.
|
||||||
|
*/
|
||||||
|
MetaDisplay *display = meta_screen_get_display (screen);
|
||||||
|
MetaCompositor *compositor = display->compositor;
|
||||||
|
gboolean ok;
|
||||||
|
|
||||||
|
if (compositor->modal_plugin != NULL || display->grab_op != META_GRAB_OP_NONE)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (meta_is_wayland_compositor ())
|
||||||
|
ok = begin_modal_wayland (screen, plugin, options, timestamp);
|
||||||
|
else
|
||||||
|
ok = begin_modal_x11 (screen, plugin, options, timestamp);
|
||||||
|
if (!ok)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
display->grab_op = META_GRAB_OP_COMPOSITOR;
|
||||||
|
display->grab_window = NULL;
|
||||||
|
display->grab_screen = screen;
|
||||||
|
display->grab_have_pointer = TRUE;
|
||||||
|
display->grab_have_keyboard = TRUE;
|
||||||
|
|
||||||
|
compositor->modal_plugin = plugin;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_end_modal_for_plugin (MetaScreen *screen,
|
meta_end_modal_for_plugin (MetaScreen *screen,
|
||||||
MetaPlugin *plugin,
|
MetaPlugin *plugin,
|
||||||
@@ -531,8 +510,19 @@ meta_end_modal_for_plugin (MetaScreen *screen,
|
|||||||
|
|
||||||
g_return_if_fail (compositor->modal_plugin == plugin);
|
g_return_if_fail (compositor->modal_plugin == plugin);
|
||||||
|
|
||||||
XIUngrabDevice (xdpy, META_VIRTUAL_CORE_POINTER_ID, timestamp);
|
if (meta_is_wayland_compositor ())
|
||||||
XIUngrabDevice (xdpy, META_VIRTUAL_CORE_KEYBOARD_ID, timestamp);
|
{
|
||||||
|
MetaWaylandCompositor *compositor = meta_wayland_compositor_get_default ();
|
||||||
|
|
||||||
|
meta_wayland_pointer_end_modal (&compositor->seat->pointer);
|
||||||
|
meta_wayland_keyboard_end_modal (&compositor->seat->keyboard,
|
||||||
|
timestamp);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
XIUngrabDevice (xdpy, META_VIRTUAL_CORE_POINTER_ID, timestamp);
|
||||||
|
XIUngrabDevice (xdpy, META_VIRTUAL_CORE_KEYBOARD_ID, timestamp);
|
||||||
|
}
|
||||||
|
|
||||||
display->grab_op = META_GRAB_OP_NONE;
|
display->grab_op = META_GRAB_OP_NONE;
|
||||||
display->grab_window = NULL;
|
display->grab_window = NULL;
|
||||||
@@ -571,6 +561,9 @@ after_stage_paint (ClutterStage *stage,
|
|||||||
|
|
||||||
for (l = info->windows; l; l = l->next)
|
for (l = info->windows; l; l = l->next)
|
||||||
meta_window_actor_post_paint (l->data);
|
meta_window_actor_post_paint (l->data);
|
||||||
|
|
||||||
|
if (meta_is_wayland_compositor ())
|
||||||
|
meta_wayland_compositor_paint_finished (meta_wayland_compositor_get_default ());
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -584,11 +577,6 @@ redirect_windows (MetaCompositor *compositor,
|
|||||||
guint n_retries;
|
guint n_retries;
|
||||||
guint max_retries;
|
guint max_retries;
|
||||||
|
|
||||||
/* If we're running with wayland, connected to a headless xwayland
|
|
||||||
* server then all the windows are implicitly redirected offscreen
|
|
||||||
* already and it would generate an error to try and explicitly
|
|
||||||
* redirect them via XCompositeRedirectSubwindows() */
|
|
||||||
|
|
||||||
if (meta_get_replace_current_wm ())
|
if (meta_get_replace_current_wm ())
|
||||||
max_retries = 5;
|
max_retries = 5;
|
||||||
else
|
else
|
||||||
@@ -629,7 +617,7 @@ meta_compositor_manage_screen (MetaCompositor *compositor,
|
|||||||
MetaCompScreen *info;
|
MetaCompScreen *info;
|
||||||
MetaDisplay *display = meta_screen_get_display (screen);
|
MetaDisplay *display = meta_screen_get_display (screen);
|
||||||
Display *xdisplay = meta_display_get_xdisplay (display);
|
Display *xdisplay = meta_display_get_xdisplay (display);
|
||||||
Window xwin;
|
Window xwin = None;
|
||||||
gint width, height;
|
gint width, height;
|
||||||
MetaWaylandCompositor *wayland_compositor;
|
MetaWaylandCompositor *wayland_compositor;
|
||||||
|
|
||||||
@@ -638,21 +626,6 @@ meta_compositor_manage_screen (MetaCompositor *compositor,
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
info = g_new0 (MetaCompScreen, 1);
|
info = g_new0 (MetaCompScreen, 1);
|
||||||
/*
|
|
||||||
* We use an empty input region for Clutter as a default because that allows
|
|
||||||
* the user to interact with all the windows displayed on the screen.
|
|
||||||
* We have to initialize info->pending_input_region to an empty region explicitly,
|
|
||||||
* because None value is used to mean that the whole screen is an input region.
|
|
||||||
*/
|
|
||||||
if (!meta_is_wayland_compositor ())
|
|
||||||
info->pending_input_region = XFixesCreateRegion (xdisplay, NULL, 0);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Stage input region trickery isn't needed when we're running as a
|
|
||||||
* wayland compositor. */
|
|
||||||
info->pending_input_region = None;
|
|
||||||
}
|
|
||||||
|
|
||||||
info->screen = screen;
|
info->screen = screen;
|
||||||
|
|
||||||
meta_screen_set_compositor_data (screen, info);
|
meta_screen_set_compositor_data (screen, info);
|
||||||
@@ -726,8 +699,6 @@ meta_compositor_manage_screen (MetaCompositor *compositor,
|
|||||||
clutter_actor_add_child (info->stage, info->window_group);
|
clutter_actor_add_child (info->stage, info->window_group);
|
||||||
clutter_actor_add_child (info->stage, info->top_window_group);
|
clutter_actor_add_child (info->stage, info->top_window_group);
|
||||||
|
|
||||||
info->plugin_mgr = meta_plugin_manager_new (screen);
|
|
||||||
|
|
||||||
if (meta_is_wayland_compositor ())
|
if (meta_is_wayland_compositor ())
|
||||||
{
|
{
|
||||||
/* NB: When running as a wayland compositor we don't need an X
|
/* NB: When running as a wayland compositor we don't need an X
|
||||||
@@ -737,16 +708,11 @@ meta_compositor_manage_screen (MetaCompositor *compositor,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
* Delay the creation of the overlay window as long as we can, to avoid
|
|
||||||
* blanking out the screen. This means that during the plugin loading, the
|
|
||||||
* overlay window is not accessible; if the plugin needs to access it
|
|
||||||
* directly, it should hook into the "show" signal on stage, and do
|
|
||||||
* its stuff there.
|
|
||||||
*/
|
|
||||||
info->output = get_output_window (screen);
|
info->output = get_output_window (screen);
|
||||||
XReparentWindow (xdisplay, xwin, info->output, 0, 0);
|
XReparentWindow (xdisplay, xwin, info->output, 0, 0);
|
||||||
|
|
||||||
|
meta_empty_stage_input_region (screen);
|
||||||
|
|
||||||
/* Make sure there isn't any left-over output shape on the
|
/* Make sure there isn't any left-over output shape on the
|
||||||
* overlay window by setting the whole screen to be an
|
* overlay window by setting the whole screen to be an
|
||||||
* output region.
|
* output region.
|
||||||
@@ -757,20 +723,15 @@ meta_compositor_manage_screen (MetaCompositor *compositor,
|
|||||||
*/
|
*/
|
||||||
XFixesSetWindowShapeRegion (xdisplay, info->output, ShapeBounding, 0, 0, None);
|
XFixesSetWindowShapeRegion (xdisplay, info->output, ShapeBounding, 0, 0, None);
|
||||||
|
|
||||||
do_set_stage_input_region (screen, info->pending_input_region);
|
|
||||||
if (info->pending_input_region != None)
|
|
||||||
{
|
|
||||||
XFixesDestroyRegion (xdisplay, info->pending_input_region);
|
|
||||||
info->pending_input_region = None;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Map overlay window before redirecting windows offscreen so we catch their
|
/* Map overlay window before redirecting windows offscreen so we catch their
|
||||||
* contents until we show the stage.
|
* contents until we show the stage.
|
||||||
*/
|
*/
|
||||||
XMapWindow (xdisplay, info->output);
|
XMapWindow (xdisplay, info->output);
|
||||||
|
|
||||||
redirect_windows (compositor, screen);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
redirect_windows (compositor, screen);
|
||||||
|
|
||||||
|
info->plugin_mgr = meta_plugin_manager_new (screen);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -810,7 +771,7 @@ meta_shape_cow_for_window (MetaScreen *screen,
|
|||||||
int width, height;
|
int width, height;
|
||||||
MetaRectangle rect;
|
MetaRectangle rect;
|
||||||
|
|
||||||
meta_window_get_outer_rect (metaWindow, &rect);
|
meta_window_get_frame_rect (metaWindow, &rect);
|
||||||
|
|
||||||
window_bounds.x = rect.x;
|
window_bounds.x = rect.x;
|
||||||
window_bounds.y = rect.y;
|
window_bounds.y = rect.y;
|
||||||
@@ -831,19 +792,50 @@ meta_shape_cow_for_window (MetaScreen *screen,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_unredirected_window (MetaCompScreen *info,
|
||||||
|
MetaWindow *window)
|
||||||
|
{
|
||||||
|
if (info->unredirected_window == window)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (info->unredirected_window != NULL)
|
||||||
|
{
|
||||||
|
MetaWindowActor *window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (info->unredirected_window));
|
||||||
|
meta_window_actor_set_unredirected (window_actor, FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
info->unredirected_window = window;
|
||||||
|
|
||||||
|
if (info->unredirected_window != NULL)
|
||||||
|
{
|
||||||
|
MetaWindowActor *window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (info->unredirected_window));
|
||||||
|
meta_window_actor_set_unredirected (window_actor, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
meta_shape_cow_for_window (info->screen, info->unredirected_window);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_compositor_add_window (MetaCompositor *compositor,
|
meta_compositor_add_window (MetaCompositor *compositor,
|
||||||
MetaWindow *window)
|
MetaWindow *window)
|
||||||
{
|
{
|
||||||
MetaScreen *screen = meta_window_get_screen (window);
|
MetaScreen *screen = meta_window_get_screen (window);
|
||||||
MetaDisplay *display = meta_screen_get_display (screen);
|
MetaDisplay *display = meta_screen_get_display (screen);
|
||||||
|
MetaCompScreen *info = meta_screen_get_compositor_data (screen);
|
||||||
|
|
||||||
|
g_return_if_fail (info != NULL);
|
||||||
|
|
||||||
|
/* Window was already added previously, probably coming
|
||||||
|
* back from hiding */
|
||||||
|
if (window->compositor_private != NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
DEBUG_TRACE ("meta_compositor_add_window\n");
|
|
||||||
meta_error_trap_push (display);
|
meta_error_trap_push (display);
|
||||||
|
meta_window_actor_new (window);
|
||||||
add_win (window);
|
|
||||||
|
|
||||||
meta_error_trap_pop (display);
|
meta_error_trap_pop (display);
|
||||||
|
|
||||||
|
sync_actor_stacking (info);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -859,19 +851,11 @@ meta_compositor_remove_window (MetaCompositor *compositor,
|
|||||||
if (!window_actor)
|
if (!window_actor)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!meta_is_wayland_compositor ())
|
screen = meta_window_get_screen (window);
|
||||||
{
|
info = meta_screen_get_compositor_data (screen);
|
||||||
screen = meta_window_get_screen (window);
|
|
||||||
info = meta_screen_get_compositor_data (screen);
|
|
||||||
|
|
||||||
if (window_actor == info->unredirected_window)
|
if (info->unredirected_window == window)
|
||||||
{
|
set_unredirected_window (info, NULL);
|
||||||
meta_window_actor_set_redirected (window_actor, TRUE);
|
|
||||||
meta_shape_cow_for_window (meta_window_get_screen (meta_window_actor_get_meta_window (info->unredirected_window)),
|
|
||||||
NULL);
|
|
||||||
info->unredirected_window = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
meta_window_actor_destroy (window_actor);
|
meta_window_actor_destroy (window_actor);
|
||||||
}
|
}
|
||||||
@@ -930,8 +914,8 @@ is_grabbed_event (MetaDisplay *display,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_compositor_window_x11_shape_changed (MetaCompositor *compositor,
|
meta_compositor_window_shape_changed (MetaCompositor *compositor,
|
||||||
MetaWindow *window)
|
MetaWindow *window)
|
||||||
{
|
{
|
||||||
MetaWindowActor *window_actor;
|
MetaWindowActor *window_actor;
|
||||||
window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (window));
|
window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (window));
|
||||||
@@ -941,23 +925,30 @@ meta_compositor_window_x11_shape_changed (MetaCompositor *compositor,
|
|||||||
meta_window_actor_update_shape (window_actor);
|
meta_window_actor_update_shape (window_actor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_compositor_window_opacity_changed (MetaCompositor *compositor,
|
||||||
|
MetaWindow *window)
|
||||||
|
{
|
||||||
|
MetaWindowActor *window_actor;
|
||||||
|
window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (window));
|
||||||
|
if (!window_actor)
|
||||||
|
return;
|
||||||
|
|
||||||
|
meta_window_actor_update_opacity (window_actor);
|
||||||
|
}
|
||||||
|
|
||||||
/* Clutter makes the assumption that there is only one X window
|
/* Clutter makes the assumption that there is only one X window
|
||||||
* per stage, which is a valid assumption to make for a generic
|
* per stage, which is a valid assumption to make for a generic
|
||||||
* application toolkit. As such, it will ignore any events sent
|
* application toolkit. As such, it will ignore any events sent
|
||||||
* to the a stage that isn't its X window.
|
* to the a stage that isn't its X window.
|
||||||
*
|
*
|
||||||
* When a user clicks on what she thinks is the wallpaper, she
|
* When running as an X window manager, we need to respond to
|
||||||
* is actually clicking on the guard window, which is an entirely
|
* events from lots of windows. Trick Clutter into translating
|
||||||
* separate top-level override-redirect window in the hierarchy.
|
* these events by pretending we got an event on the stage window.
|
||||||
* We want to recieve events on this guard window so that users
|
|
||||||
* can right-click on the background actor. We do this by telling
|
|
||||||
* Clutter a little white lie, by transforming clicks on the guard
|
|
||||||
* window to become clicks on the stage window, allowing Clutter
|
|
||||||
* to process the event normally.
|
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
maybe_spoof_guard_window_event_as_stage_event (MetaCompScreen *info,
|
maybe_spoof_event_as_stage_event (MetaCompScreen *info,
|
||||||
XEvent *event)
|
XEvent *event)
|
||||||
{
|
{
|
||||||
MetaDisplay *display = meta_screen_get_display (info->screen);
|
MetaDisplay *display = meta_screen_get_display (info->screen);
|
||||||
|
|
||||||
@@ -966,19 +957,22 @@ maybe_spoof_guard_window_event_as_stage_event (MetaCompScreen *info,
|
|||||||
{
|
{
|
||||||
XIEvent *input_event = (XIEvent *) event->xcookie.data;
|
XIEvent *input_event = (XIEvent *) event->xcookie.data;
|
||||||
|
|
||||||
/* Only care about pointer events for now. */
|
|
||||||
switch (input_event->evtype)
|
switch (input_event->evtype)
|
||||||
{
|
{
|
||||||
case XI_Motion:
|
case XI_Motion:
|
||||||
case XI_ButtonPress:
|
case XI_ButtonPress:
|
||||||
case XI_ButtonRelease:
|
case XI_ButtonRelease:
|
||||||
|
case XI_KeyPress:
|
||||||
|
case XI_KeyRelease:
|
||||||
{
|
{
|
||||||
XIDeviceEvent *device_event = ((XIDeviceEvent *) input_event);
|
XIDeviceEvent *device_event = ((XIDeviceEvent *) input_event);
|
||||||
if (device_event->event == info->screen->guard_window)
|
|
||||||
{
|
/* If this is a GTK+ widget, like a window menu, let GTK+ handle
|
||||||
Window xwin = clutter_x11_get_stage_window (CLUTTER_STAGE (info->stage));
|
* it as-is without mangling. */
|
||||||
device_event->event = xwin;
|
if (meta_ui_window_is_widget (info->screen->ui, device_event->event))
|
||||||
}
|
break;
|
||||||
|
|
||||||
|
device_event->event = clutter_x11_get_stage_window (CLUTTER_STAGE (info->stage));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@@ -1001,10 +995,7 @@ meta_compositor_process_event (MetaCompositor *compositor,
|
|||||||
{
|
{
|
||||||
if (compositor->modal_plugin && is_grabbed_event (compositor->display, event))
|
if (compositor->modal_plugin && is_grabbed_event (compositor->display, event))
|
||||||
{
|
{
|
||||||
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (compositor->modal_plugin);
|
_meta_plugin_xevent_filter (compositor->modal_plugin, event);
|
||||||
|
|
||||||
if (klass->xevent_filter)
|
|
||||||
klass->xevent_filter (compositor->modal_plugin, event);
|
|
||||||
|
|
||||||
/* We always consume events even if the plugin says it didn't handle them;
|
/* We always consume events even if the plugin says it didn't handle them;
|
||||||
* exclusive is exclusive */
|
* exclusive is exclusive */
|
||||||
@@ -1038,7 +1029,7 @@ meta_compositor_process_event (MetaCompositor *compositor,
|
|||||||
|
|
||||||
info = meta_screen_get_compositor_data (screen);
|
info = meta_screen_get_compositor_data (screen);
|
||||||
|
|
||||||
maybe_spoof_guard_window_event_as_stage_event (info, event);
|
maybe_spoof_event_as_stage_event (info, event);
|
||||||
|
|
||||||
if (meta_plugin_manager_xevent_filter (info->plugin_mgr, event))
|
if (meta_plugin_manager_xevent_filter (info->plugin_mgr, event))
|
||||||
{
|
{
|
||||||
@@ -1050,29 +1041,20 @@ meta_compositor_process_event (MetaCompositor *compositor,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (event->type)
|
if (!meta_is_wayland_compositor () &&
|
||||||
|
event->type == meta_display_get_damage_event_base (compositor->display) + XDamageNotify)
|
||||||
{
|
{
|
||||||
case PropertyNotify:
|
/* Core code doesn't handle damage events, so we need to extract the MetaWindow
|
||||||
process_property_notify (compositor, (XPropertyEvent *) event, window);
|
* ourselves
|
||||||
break;
|
*/
|
||||||
|
if (window == NULL)
|
||||||
default:
|
|
||||||
if (!meta_is_wayland_compositor () &&
|
|
||||||
event->type == meta_display_get_damage_event_base (compositor->display) + XDamageNotify)
|
|
||||||
{
|
{
|
||||||
/* Core code doesn't handle damage events, so we need to extract the MetaWindow
|
Window xwin = ((XDamageNotifyEvent *) event)->drawable;
|
||||||
* ourselves
|
window = meta_display_lookup_x_window (compositor->display, xwin);
|
||||||
*/
|
|
||||||
if (window == NULL)
|
|
||||||
{
|
|
||||||
Window xwin = ((XDamageNotifyEvent *) event)->drawable;
|
|
||||||
window = meta_display_lookup_x_window (compositor->display, xwin);
|
|
||||||
}
|
|
||||||
|
|
||||||
DEBUG_TRACE ("meta_compositor_process_event (process_damage)\n");
|
|
||||||
process_damage (compositor, (XDamageNotifyEvent *) event, window);
|
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
|
DEBUG_TRACE ("meta_compositor_process_event (process_damage)\n");
|
||||||
|
process_damage (compositor, (XDamageNotifyEvent *) event, window);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Clutter needs to know about MapNotify events otherwise it will
|
/* Clutter needs to know about MapNotify events otherwise it will
|
||||||
@@ -1210,6 +1192,7 @@ sync_actor_stacking (MetaCompScreen *info)
|
|||||||
* we go ahead and do it */
|
* we go ahead and do it */
|
||||||
|
|
||||||
children = clutter_actor_get_children (info->window_group);
|
children = clutter_actor_get_children (info->window_group);
|
||||||
|
has_windows = FALSE;
|
||||||
reordered = FALSE;
|
reordered = FALSE;
|
||||||
|
|
||||||
/* We allow for actors in the window group other than the actors we
|
/* We allow for actors in the window group other than the actors we
|
||||||
@@ -1371,30 +1354,6 @@ meta_compositor_sync_stack (MetaCompositor *compositor,
|
|||||||
sync_actor_stacking (info);
|
sync_actor_stacking (info);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
meta_compositor_window_mapped (MetaCompositor *compositor,
|
|
||||||
MetaWindow *window)
|
|
||||||
{
|
|
||||||
MetaWindowActor *window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (window));
|
|
||||||
DEBUG_TRACE ("meta_compositor_window_mapped\n");
|
|
||||||
if (!window_actor)
|
|
||||||
return;
|
|
||||||
|
|
||||||
meta_window_actor_mapped (window_actor);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
meta_compositor_window_unmapped (MetaCompositor *compositor,
|
|
||||||
MetaWindow *window)
|
|
||||||
{
|
|
||||||
MetaWindowActor *window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (window));
|
|
||||||
DEBUG_TRACE ("meta_compositor_window_unmapped\n");
|
|
||||||
if (!window_actor)
|
|
||||||
return;
|
|
||||||
|
|
||||||
meta_window_actor_unmapped (window_actor);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_compositor_sync_window_geometry (MetaCompositor *compositor,
|
meta_compositor_sync_window_geometry (MetaCompositor *compositor,
|
||||||
MetaWindow *window,
|
MetaWindow *window,
|
||||||
@@ -1502,7 +1461,6 @@ pre_paint_windows (MetaCompScreen *info)
|
|||||||
{
|
{
|
||||||
GList *l;
|
GList *l;
|
||||||
MetaWindowActor *top_window;
|
MetaWindowActor *top_window;
|
||||||
MetaWindowActor *expected_unredirected_window = NULL;
|
|
||||||
|
|
||||||
if (info->onscreen == NULL)
|
if (info->onscreen == NULL)
|
||||||
{
|
{
|
||||||
@@ -1516,33 +1474,13 @@ pre_paint_windows (MetaCompScreen *info)
|
|||||||
if (info->windows == NULL)
|
if (info->windows == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!meta_is_wayland_compositor ())
|
top_window = g_list_last (info->windows)->data;
|
||||||
{
|
|
||||||
top_window = g_list_last (info->windows)->data;
|
|
||||||
|
|
||||||
if (meta_window_actor_should_unredirect (top_window) &&
|
if (meta_window_actor_should_unredirect (top_window) &&
|
||||||
info->disable_unredirect_count == 0)
|
info->disable_unredirect_count == 0)
|
||||||
expected_unredirected_window = top_window;
|
set_unredirected_window (info, meta_window_actor_get_meta_window (top_window));
|
||||||
|
else
|
||||||
if (info->unredirected_window != expected_unredirected_window)
|
set_unredirected_window (info, NULL);
|
||||||
{
|
|
||||||
if (info->unredirected_window != NULL)
|
|
||||||
{
|
|
||||||
meta_window_actor_set_redirected (info->unredirected_window, TRUE);
|
|
||||||
meta_shape_cow_for_window (meta_window_get_screen (meta_window_actor_get_meta_window (info->unredirected_window)),
|
|
||||||
NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (expected_unredirected_window != NULL)
|
|
||||||
{
|
|
||||||
meta_shape_cow_for_window (meta_window_get_screen (meta_window_actor_get_meta_window (top_window)),
|
|
||||||
meta_window_actor_get_meta_window (top_window));
|
|
||||||
meta_window_actor_set_redirected (top_window, FALSE);
|
|
||||||
}
|
|
||||||
|
|
||||||
info->unredirected_window = expected_unredirected_window;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (l = info->windows; l; l = l->next)
|
for (l = info->windows; l; l = l->next)
|
||||||
meta_window_actor_pre_paint (l->data);
|
meta_window_actor_pre_paint (l->data);
|
||||||
@@ -1596,13 +1534,7 @@ on_shadow_factory_changed (MetaShadowFactory *factory,
|
|||||||
MetaCompositor *
|
MetaCompositor *
|
||||||
meta_compositor_new (MetaDisplay *display)
|
meta_compositor_new (MetaDisplay *display)
|
||||||
{
|
{
|
||||||
char *atom_names[] = {
|
|
||||||
"_XROOTPMAP_ID",
|
|
||||||
"_NET_WM_WINDOW_OPACITY",
|
|
||||||
};
|
|
||||||
Atom atoms[G_N_ELEMENTS(atom_names)];
|
|
||||||
MetaCompositor *compositor;
|
MetaCompositor *compositor;
|
||||||
Display *xdisplay = meta_display_get_xdisplay (display);
|
|
||||||
|
|
||||||
if (!composite_at_least_version (display, 0, 3))
|
if (!composite_at_least_version (display, 0, 3))
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -1614,18 +1546,11 @@ meta_compositor_new (MetaDisplay *display)
|
|||||||
if (g_getenv("META_DISABLE_MIPMAPS"))
|
if (g_getenv("META_DISABLE_MIPMAPS"))
|
||||||
compositor->no_mipmaps = TRUE;
|
compositor->no_mipmaps = TRUE;
|
||||||
|
|
||||||
meta_verbose ("Creating %d atoms\n", (int) G_N_ELEMENTS (atom_names));
|
|
||||||
XInternAtoms (xdisplay, atom_names, G_N_ELEMENTS (atom_names),
|
|
||||||
False, atoms);
|
|
||||||
|
|
||||||
g_signal_connect (meta_shadow_factory_get_default (),
|
g_signal_connect (meta_shadow_factory_get_default (),
|
||||||
"changed",
|
"changed",
|
||||||
G_CALLBACK (on_shadow_factory_changed),
|
G_CALLBACK (on_shadow_factory_changed),
|
||||||
compositor);
|
compositor);
|
||||||
|
|
||||||
compositor->atom_x_root_pixmap = atoms[0];
|
|
||||||
compositor->atom_net_wm_window_opacity = atoms[1];
|
|
||||||
|
|
||||||
compositor->repaint_func_id = clutter_threads_add_repaint_func (meta_repaint_func,
|
compositor->repaint_func_id = clutter_threads_add_repaint_func (meta_repaint_func,
|
||||||
compositor,
|
compositor,
|
||||||
NULL);
|
NULL);
|
||||||
|
@@ -6,9 +6,6 @@
|
|||||||
#include <meta/screen.h>
|
#include <meta/screen.h>
|
||||||
#include <meta/meta-background-actor.h>
|
#include <meta/meta-background-actor.h>
|
||||||
|
|
||||||
void meta_background_actor_set_visible_region (MetaBackgroundActor *self,
|
cairo_region_t *meta_background_actor_get_clip_region (MetaBackgroundActor *self);
|
||||||
cairo_region_t *visible_region);
|
|
||||||
|
|
||||||
cairo_region_t *meta_background_actor_get_visible_region (MetaBackgroundActor *self);
|
|
||||||
|
|
||||||
#endif /* META_BACKGROUND_ACTOR_PRIVATE_H */
|
#endif /* META_BACKGROUND_ACTOR_PRIVATE_H */
|
||||||
|
@@ -14,9 +14,7 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*
|
*
|
||||||
* Portions adapted from gnome-shell/src/shell-global.c
|
* Portions adapted from gnome-shell/src/shell-global.c
|
||||||
*/
|
*/
|
||||||
@@ -41,20 +39,35 @@
|
|||||||
#include <meta/errors.h>
|
#include <meta/errors.h>
|
||||||
#include <meta/meta-background.h>
|
#include <meta/meta-background.h>
|
||||||
#include "meta-background-actor-private.h"
|
#include "meta-background-actor-private.h"
|
||||||
|
#include "meta-cullable.h"
|
||||||
|
|
||||||
struct _MetaBackgroundActorPrivate
|
struct _MetaBackgroundActorPrivate
|
||||||
{
|
{
|
||||||
cairo_region_t *visible_region;
|
cairo_region_t *clip_region;
|
||||||
};
|
};
|
||||||
|
|
||||||
G_DEFINE_TYPE (MetaBackgroundActor, meta_background_actor, CLUTTER_TYPE_ACTOR);
|
static void cullable_iface_init (MetaCullableInterface *iface);
|
||||||
|
|
||||||
|
G_DEFINE_TYPE_WITH_CODE (MetaBackgroundActor, meta_background_actor, CLUTTER_TYPE_ACTOR,
|
||||||
|
G_IMPLEMENT_INTERFACE (META_TYPE_CULLABLE, cullable_iface_init));
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_clip_region (MetaBackgroundActor *self,
|
||||||
|
cairo_region_t *clip_region)
|
||||||
|
{
|
||||||
|
MetaBackgroundActorPrivate *priv = self->priv;
|
||||||
|
|
||||||
|
g_clear_pointer (&priv->clip_region, (GDestroyNotify) cairo_region_destroy);
|
||||||
|
if (clip_region)
|
||||||
|
priv->clip_region = cairo_region_copy (clip_region);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_background_actor_dispose (GObject *object)
|
meta_background_actor_dispose (GObject *object)
|
||||||
{
|
{
|
||||||
MetaBackgroundActor *self = META_BACKGROUND_ACTOR (object);
|
MetaBackgroundActor *self = META_BACKGROUND_ACTOR (object);
|
||||||
|
|
||||||
meta_background_actor_set_visible_region (self, NULL);
|
set_clip_region (self, NULL);
|
||||||
|
|
||||||
G_OBJECT_CLASS (meta_background_actor_parent_class)->dispose (object);
|
G_OBJECT_CLASS (meta_background_actor_parent_class)->dispose (object);
|
||||||
}
|
}
|
||||||
@@ -104,26 +117,6 @@ meta_background_actor_get_preferred_height (ClutterActor *actor,
|
|||||||
*natural_height_p = height;
|
*natural_height_p = height;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
|
||||||
meta_background_actor_get_paint_volume (ClutterActor *actor,
|
|
||||||
ClutterPaintVolume *volume)
|
|
||||||
{
|
|
||||||
ClutterContent *content;
|
|
||||||
gfloat width, height;
|
|
||||||
|
|
||||||
content = clutter_actor_get_content (actor);
|
|
||||||
|
|
||||||
if (!content)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
clutter_content_get_preferred_size (content, &width, &height);
|
|
||||||
|
|
||||||
clutter_paint_volume_set_width (volume, width);
|
|
||||||
clutter_paint_volume_set_height (volume, height);
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_background_actor_class_init (MetaBackgroundActorClass *klass)
|
meta_background_actor_class_init (MetaBackgroundActorClass *klass)
|
||||||
{
|
{
|
||||||
@@ -136,7 +129,6 @@ meta_background_actor_class_init (MetaBackgroundActorClass *klass)
|
|||||||
|
|
||||||
actor_class->get_preferred_width = meta_background_actor_get_preferred_width;
|
actor_class->get_preferred_width = meta_background_actor_get_preferred_width;
|
||||||
actor_class->get_preferred_height = meta_background_actor_get_preferred_height;
|
actor_class->get_preferred_height = meta_background_actor_get_preferred_height;
|
||||||
actor_class->get_paint_volume = meta_background_actor_get_paint_volume;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -166,35 +158,31 @@ meta_background_actor_new (void)
|
|||||||
return CLUTTER_ACTOR (self);
|
return CLUTTER_ACTOR (self);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
static void
|
||||||
* meta_background_actor_set_visible_region:
|
meta_background_actor_cull_out (MetaCullable *cullable,
|
||||||
* @self: a #MetaBackgroundActor
|
cairo_region_t *unobscured_region,
|
||||||
* @visible_region: (allow-none): the area of the actor (in allocate-relative
|
cairo_region_t *clip_region)
|
||||||
* coordinates) that is visible.
|
|
||||||
*
|
|
||||||
* Sets the area of the background that is unobscured by overlapping windows.
|
|
||||||
* This is used to optimize and only paint the visible portions.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
meta_background_actor_set_visible_region (MetaBackgroundActor *self,
|
|
||||||
cairo_region_t *visible_region)
|
|
||||||
{
|
{
|
||||||
MetaBackgroundActorPrivate *priv;
|
MetaBackgroundActor *self = META_BACKGROUND_ACTOR (cullable);
|
||||||
|
set_clip_region (self, clip_region);
|
||||||
|
}
|
||||||
|
|
||||||
g_return_if_fail (META_IS_BACKGROUND_ACTOR (self));
|
static void
|
||||||
|
meta_background_actor_reset_culling (MetaCullable *cullable)
|
||||||
|
{
|
||||||
|
MetaBackgroundActor *self = META_BACKGROUND_ACTOR (cullable);
|
||||||
|
set_clip_region (self, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
priv = self->priv;
|
static void
|
||||||
|
cullable_iface_init (MetaCullableInterface *iface)
|
||||||
g_clear_pointer (&priv->visible_region,
|
{
|
||||||
(GDestroyNotify)
|
iface->cull_out = meta_background_actor_cull_out;
|
||||||
cairo_region_destroy);
|
iface->reset_culling = meta_background_actor_reset_culling;
|
||||||
|
|
||||||
if (visible_region)
|
|
||||||
priv->visible_region = cairo_region_copy (visible_region);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* meta_background_actor_get_visible_region:
|
* meta_background_actor_get_clip_region:
|
||||||
* @self: a #MetaBackgroundActor
|
* @self: a #MetaBackgroundActor
|
||||||
*
|
*
|
||||||
* Return value (transfer full): a #cairo_region_t that represents the part of
|
* Return value (transfer full): a #cairo_region_t that represents the part of
|
||||||
@@ -202,16 +190,16 @@ meta_background_actor_set_visible_region (MetaBackgroundActor *self,
|
|||||||
* #MetaWindowActor objects.
|
* #MetaWindowActor objects.
|
||||||
*/
|
*/
|
||||||
cairo_region_t *
|
cairo_region_t *
|
||||||
meta_background_actor_get_visible_region (MetaBackgroundActor *self)
|
meta_background_actor_get_clip_region (MetaBackgroundActor *self)
|
||||||
{
|
{
|
||||||
MetaBackgroundActorPrivate *priv = self->priv;
|
MetaBackgroundActorPrivate *priv = self->priv;
|
||||||
ClutterActorBox content_box;
|
ClutterActorBox content_box;
|
||||||
cairo_rectangle_int_t content_area = { 0 };
|
cairo_rectangle_int_t content_area = { 0 };
|
||||||
cairo_region_t *visible_region;
|
cairo_region_t *clip_region;
|
||||||
|
|
||||||
g_return_val_if_fail (META_IS_BACKGROUND_ACTOR (self), NULL);
|
g_return_val_if_fail (META_IS_BACKGROUND_ACTOR (self), NULL);
|
||||||
|
|
||||||
if (!priv->visible_region)
|
if (!priv->clip_region)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
clutter_actor_get_content_box (CLUTTER_ACTOR (self), &content_box);
|
clutter_actor_get_content_box (CLUTTER_ACTOR (self), &content_box);
|
||||||
@@ -221,8 +209,8 @@ meta_background_actor_get_visible_region (MetaBackgroundActor *self)
|
|||||||
content_area.width = content_box.x2 - content_box.x1;
|
content_area.width = content_box.x2 - content_box.x1;
|
||||||
content_area.height = content_box.y2 - content_box.y1;
|
content_area.height = content_box.y2 - content_box.y1;
|
||||||
|
|
||||||
visible_region = cairo_region_create_rectangle (&content_area);
|
clip_region = cairo_region_create_rectangle (&content_area);
|
||||||
cairo_region_intersect (visible_region, priv->visible_region);
|
cairo_region_intersect (clip_region, priv->clip_region);
|
||||||
|
|
||||||
return visible_region;
|
return clip_region;
|
||||||
}
|
}
|
||||||
|
@@ -1,11 +0,0 @@
|
|||||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
|
||||||
|
|
||||||
#ifndef META_BACKGROUND_GROUP_PRIVATE_H
|
|
||||||
#define META_BACKGROUND_GROUP_PRIVATE_H
|
|
||||||
|
|
||||||
#include <meta/screen.h>
|
|
||||||
#include <meta/meta-background-group.h>
|
|
||||||
|
|
||||||
void meta_background_group_set_visible_region (MetaBackgroundGroup *self,
|
|
||||||
cairo_region_t *visible_region);
|
|
||||||
#endif /* META_BACKGROUND_GROUP_PRIVATE_H */
|
|
@@ -16,87 +16,43 @@
|
|||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
#include "compositor-private.h"
|
#include <meta/meta-background-group.h>
|
||||||
#include "clutter-utils.h"
|
#include "meta-cullable.h"
|
||||||
#include "meta-background-actor-private.h"
|
|
||||||
#include "meta-background-group-private.h"
|
|
||||||
|
|
||||||
G_DEFINE_TYPE (MetaBackgroundGroup, meta_background_group, CLUTTER_TYPE_ACTOR);
|
static void cullable_iface_init (MetaCullableInterface *iface);
|
||||||
|
|
||||||
struct _MetaBackgroundGroupPrivate
|
G_DEFINE_TYPE_WITH_CODE (MetaBackgroundGroup, meta_background_group, CLUTTER_TYPE_ACTOR,
|
||||||
{
|
G_IMPLEMENT_INTERFACE (META_TYPE_CULLABLE, cullable_iface_init));
|
||||||
gpointer dummy;
|
|
||||||
};
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_background_group_dispose (GObject *object)
|
|
||||||
{
|
|
||||||
G_OBJECT_CLASS (meta_background_group_parent_class)->dispose (object);
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
meta_background_group_get_paint_volume (ClutterActor *actor,
|
|
||||||
ClutterPaintVolume *volume)
|
|
||||||
{
|
|
||||||
return clutter_paint_volume_set_from_allocation (volume, actor);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_background_group_class_init (MetaBackgroundGroupClass *klass)
|
meta_background_group_class_init (MetaBackgroundGroupClass *klass)
|
||||||
{
|
{
|
||||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
}
|
||||||
ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass);
|
|
||||||
|
|
||||||
actor_class->get_paint_volume = meta_background_group_get_paint_volume;
|
static void
|
||||||
object_class->dispose = meta_background_group_dispose;
|
meta_background_group_cull_out (MetaCullable *cullable,
|
||||||
|
cairo_region_t *unobscured_region,
|
||||||
|
cairo_region_t *clip_region)
|
||||||
|
{
|
||||||
|
meta_cullable_cull_out_children (cullable, unobscured_region, clip_region);
|
||||||
|
}
|
||||||
|
|
||||||
g_type_class_add_private (klass, sizeof (MetaBackgroundGroupPrivate));
|
static void
|
||||||
|
meta_background_group_reset_culling (MetaCullable *cullable)
|
||||||
|
{
|
||||||
|
meta_cullable_reset_culling_children (cullable);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
cullable_iface_init (MetaCullableInterface *iface)
|
||||||
|
{
|
||||||
|
iface->cull_out = meta_background_group_cull_out;
|
||||||
|
iface->reset_culling = meta_background_group_reset_culling;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_background_group_init (MetaBackgroundGroup *self)
|
meta_background_group_init (MetaBackgroundGroup *self)
|
||||||
{
|
{
|
||||||
self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
|
|
||||||
META_TYPE_BACKGROUND_GROUP,
|
|
||||||
MetaBackgroundGroupPrivate);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* meta_background_group_set_visible_region:
|
|
||||||
* @self: a #MetaBackgroundGroup
|
|
||||||
* @visible_region: (allow-none): the parts of the background to paint
|
|
||||||
*
|
|
||||||
* Sets the area of the backgrounds that is unobscured by overlapping windows.
|
|
||||||
* This is used to optimize and only paint the visible portions.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
meta_background_group_set_visible_region (MetaBackgroundGroup *self,
|
|
||||||
cairo_region_t *region)
|
|
||||||
{
|
|
||||||
GList *children, *l;
|
|
||||||
|
|
||||||
children = clutter_actor_get_children (CLUTTER_ACTOR (self));
|
|
||||||
for (l = children; l; l = l->next)
|
|
||||||
{
|
|
||||||
ClutterActor *actor = l->data;
|
|
||||||
|
|
||||||
if (META_IS_BACKGROUND_ACTOR (actor))
|
|
||||||
{
|
|
||||||
meta_background_actor_set_visible_region (META_BACKGROUND_ACTOR (actor), region);
|
|
||||||
}
|
|
||||||
else if (META_IS_BACKGROUND_GROUP (actor))
|
|
||||||
{
|
|
||||||
int x, y;
|
|
||||||
|
|
||||||
if (!meta_actor_is_untransformed (actor, &x, &y))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
cairo_region_translate (region, -x, -y);
|
|
||||||
meta_background_group_set_visible_region (META_BACKGROUND_GROUP (actor), region);
|
|
||||||
cairo_region_translate (region, x, y);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
g_list_free (children);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ClutterActor *
|
ClutterActor *
|
||||||
|
@@ -14,9 +14,7 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -37,6 +35,7 @@
|
|||||||
#include "mutter-enum-types.h"
|
#include "mutter-enum-types.h"
|
||||||
#include <meta/errors.h>
|
#include <meta/errors.h>
|
||||||
#include <meta/meta-background.h>
|
#include <meta/meta-background.h>
|
||||||
|
#include "util-private.h"
|
||||||
#include "meta-background-actor-private.h"
|
#include "meta-background-actor-private.h"
|
||||||
|
|
||||||
#define FRAGMENT_SHADER_DECLARATIONS \
|
#define FRAGMENT_SHADER_DECLARATIONS \
|
||||||
@@ -412,13 +411,13 @@ meta_background_paint_content (ClutterContent *content,
|
|||||||
*/
|
*/
|
||||||
if (META_IS_BACKGROUND_ACTOR (actor))
|
if (META_IS_BACKGROUND_ACTOR (actor))
|
||||||
{
|
{
|
||||||
cairo_region_t *visible_region;
|
cairo_region_t *clip_region;
|
||||||
visible_region = meta_background_actor_get_visible_region (META_BACKGROUND_ACTOR (actor));
|
clip_region = meta_background_actor_get_clip_region (META_BACKGROUND_ACTOR (actor));
|
||||||
|
|
||||||
if (visible_region != NULL)
|
if (clip_region != NULL)
|
||||||
{
|
{
|
||||||
cairo_region_intersect (paintable_region, visible_region);
|
cairo_region_intersect (paintable_region, clip_region);
|
||||||
cairo_region_destroy (visible_region);
|
cairo_region_destroy (clip_region);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
201
src/compositor/meta-cullable.c
Normal file
201
src/compositor/meta-cullable.c
Normal file
@@ -0,0 +1,201 @@
|
|||||||
|
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2013 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, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Written by:
|
||||||
|
* Owen Taylor <otaylor@redhat.com>
|
||||||
|
* Ray Strode <rstrode@redhat.com>
|
||||||
|
* Jasper St. Pierre <jstpierre@mecheye.net>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
#include "meta-cullable.h"
|
||||||
|
#include "clutter-utils.h"
|
||||||
|
|
||||||
|
G_DEFINE_INTERFACE (MetaCullable, meta_cullable, CLUTTER_TYPE_ACTOR);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SECTION:meta-cullable
|
||||||
|
* @title: MetaCullable
|
||||||
|
* @short_description: CPU culling operations for efficient drawing
|
||||||
|
*
|
||||||
|
* When we are painting a stack of 5-10 large actors, the standard
|
||||||
|
* bottom-to-top method of drawing every actor results in a tremendous
|
||||||
|
* amount of overdraw. If these actors are painting textures like
|
||||||
|
* windows, it can easily max out the available memory bandwidth on a
|
||||||
|
* low-end graphics chipset. It's even worse if window textures are
|
||||||
|
* being accessed over the AGP bus.
|
||||||
|
*
|
||||||
|
* #MetaCullable is our solution. The basic technique applied here is to
|
||||||
|
* do a pre-pass before painting where we walk each actor from top to bottom
|
||||||
|
* and ask each actor to "cull itself out". We pass in a region it can copy
|
||||||
|
* to clip its drawing to, and the actor can subtract its fully opaque pixels
|
||||||
|
* so that actors underneath know not to draw there as well.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* meta_cullable_cull_out_children:
|
||||||
|
* @cullable: The #MetaCullable
|
||||||
|
* @unobscured_region: The unobscured region, as passed into cull_out()
|
||||||
|
* @clip_region: The clip region, as passed into cull_out()
|
||||||
|
*
|
||||||
|
* This is a helper method for actors that want to recurse over their
|
||||||
|
* child actors, and cull them out.
|
||||||
|
*
|
||||||
|
* See #MetaCullable and meta_cullable_cull_out() for more details.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
meta_cullable_cull_out_children (MetaCullable *cullable,
|
||||||
|
cairo_region_t *unobscured_region,
|
||||||
|
cairo_region_t *clip_region)
|
||||||
|
{
|
||||||
|
ClutterActor *actor = CLUTTER_ACTOR (cullable);
|
||||||
|
ClutterActor *child;
|
||||||
|
ClutterActorIter iter;
|
||||||
|
|
||||||
|
clutter_actor_iter_init (&iter, actor);
|
||||||
|
while (clutter_actor_iter_prev (&iter, &child))
|
||||||
|
{
|
||||||
|
float x, y;
|
||||||
|
gboolean needs_culling;
|
||||||
|
|
||||||
|
if (!META_IS_CULLABLE (child))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
needs_culling = (unobscured_region != NULL && clip_region != NULL);
|
||||||
|
|
||||||
|
if (needs_culling && !CLUTTER_ACTOR_IS_VISIBLE (child))
|
||||||
|
needs_culling = FALSE;
|
||||||
|
|
||||||
|
/* If an actor has effects applied, then that can change the area
|
||||||
|
* it paints and the opacity, so we no longer can figure out what
|
||||||
|
* portion of the actor is obscured and what portion of the screen
|
||||||
|
* it obscures, so we skip the actor.
|
||||||
|
*
|
||||||
|
* This has a secondary beneficial effect: if a ClutterOffscreenEffect
|
||||||
|
* is applied to an actor, then our clipped redraws interfere with the
|
||||||
|
* caching of the FBO - even if we only need to draw a small portion
|
||||||
|
* of the window right now, ClutterOffscreenEffect may use other portions
|
||||||
|
* of the FBO later. So, skipping actors with effects applied also
|
||||||
|
* prevents these bugs.
|
||||||
|
*
|
||||||
|
* Theoretically, we should check clutter_actor_get_offscreen_redirect()
|
||||||
|
* as well for the same reason, but omitted for simplicity in the
|
||||||
|
* hopes that no-one will do that.
|
||||||
|
*/
|
||||||
|
if (needs_culling && clutter_actor_has_effects (child))
|
||||||
|
needs_culling = FALSE;
|
||||||
|
|
||||||
|
if (needs_culling && !meta_actor_is_untransformed (child, NULL, NULL))
|
||||||
|
needs_culling = FALSE;
|
||||||
|
|
||||||
|
if (needs_culling)
|
||||||
|
{
|
||||||
|
clutter_actor_get_position (child, &x, &y);
|
||||||
|
|
||||||
|
/* Temporarily move to the coordinate system of the actor */
|
||||||
|
cairo_region_translate (unobscured_region, - x, - y);
|
||||||
|
cairo_region_translate (clip_region, - x, - y);
|
||||||
|
|
||||||
|
meta_cullable_cull_out (META_CULLABLE (child), unobscured_region, clip_region);
|
||||||
|
|
||||||
|
cairo_region_translate (unobscured_region, x, y);
|
||||||
|
cairo_region_translate (clip_region, x, y);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
meta_cullable_cull_out (META_CULLABLE (child), NULL, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* meta_cullable_reset_culling_children:
|
||||||
|
* @cullable: The #MetaCullable
|
||||||
|
*
|
||||||
|
* This is a helper method for actors that want to recurse over their
|
||||||
|
* child actors, and cull them out.
|
||||||
|
*
|
||||||
|
* See #MetaCullable and meta_cullable_reset_culling() for more details.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
meta_cullable_reset_culling_children (MetaCullable *cullable)
|
||||||
|
{
|
||||||
|
ClutterActor *actor = CLUTTER_ACTOR (cullable);
|
||||||
|
ClutterActor *child;
|
||||||
|
ClutterActorIter iter;
|
||||||
|
|
||||||
|
clutter_actor_iter_init (&iter, actor);
|
||||||
|
while (clutter_actor_iter_next (&iter, &child))
|
||||||
|
{
|
||||||
|
if (!META_IS_CULLABLE (child))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
meta_cullable_reset_culling (META_CULLABLE (child));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_cullable_default_init (MetaCullableInterface *iface)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* meta_cullable_cull_out:
|
||||||
|
* @cullable: The #MetaCullable
|
||||||
|
* @unobscured_region: The unobscured region, in @cullable's space.
|
||||||
|
* @clip_region: The clip region, in @cullable's space.
|
||||||
|
*
|
||||||
|
* When #MetaWindowGroup is painted, we walk over its direct cullable
|
||||||
|
* children from top to bottom and ask themselves to "cull out". Cullables
|
||||||
|
* can use @unobscured_region and @clip_region to clip their drawing. Actors
|
||||||
|
* interested in eliminating overdraw should copy the @clip_region and only
|
||||||
|
* paint those parts, as everything else has been obscured by actors above it.
|
||||||
|
*
|
||||||
|
* Actors that may have fully opaque parts should also subtract out a region
|
||||||
|
* that is fully opaque from @unobscured_region and @clip_region.
|
||||||
|
*
|
||||||
|
* @unobscured_region and @clip_region are extremely similar. The difference
|
||||||
|
* is that @clip_region starts off with the stage's clip, if Clutter detects
|
||||||
|
* that we're doing a clipped redraw. @unobscured_region, however, starts off
|
||||||
|
* with the full stage size, so actors that may want to record what parts of
|
||||||
|
* their window are unobscured for e.g. scheduling repaints can do so.
|
||||||
|
*
|
||||||
|
* Actors that have children can also use the meta_cullable_cull_out_children()
|
||||||
|
* helper method to do a simple cull across all their children.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
meta_cullable_cull_out (MetaCullable *cullable,
|
||||||
|
cairo_region_t *unobscured_region,
|
||||||
|
cairo_region_t *clip_region)
|
||||||
|
{
|
||||||
|
META_CULLABLE_GET_IFACE (cullable)->cull_out (cullable, unobscured_region, clip_region);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* meta_cullable_reset_culling:
|
||||||
|
* @cullable: The #MetaCullable
|
||||||
|
*
|
||||||
|
* Actors that copied data in their cull_out() implementation can now
|
||||||
|
* reset their data, as the paint is now over. Additional paints may be
|
||||||
|
* done by #ClutterClone or similar, and they should not be affected by
|
||||||
|
* the culling operation.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
meta_cullable_reset_culling (MetaCullable *cullable)
|
||||||
|
{
|
||||||
|
META_CULLABLE_GET_IFACE (cullable)->reset_culling (cullable);
|
||||||
|
}
|
66
src/compositor/meta-cullable.h
Normal file
66
src/compositor/meta-cullable.h
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2013 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, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Written by:
|
||||||
|
* Owen Taylor <otaylor@redhat.com>
|
||||||
|
* Ray Strode <rstrode@redhat.com>
|
||||||
|
* Jasper St. Pierre <jstpierre@mecheye.net>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __META_CULLABLE_H__
|
||||||
|
#define __META_CULLABLE_H__
|
||||||
|
|
||||||
|
#include <clutter/clutter.h>
|
||||||
|
|
||||||
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
|
#define META_TYPE_CULLABLE (meta_cullable_get_type ())
|
||||||
|
#define META_CULLABLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_CULLABLE, MetaCullable))
|
||||||
|
#define META_IS_CULLABLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_CULLABLE))
|
||||||
|
#define META_CULLABLE_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), META_TYPE_CULLABLE, MetaCullableInterface))
|
||||||
|
|
||||||
|
typedef struct _MetaCullable MetaCullable;
|
||||||
|
typedef struct _MetaCullableInterface MetaCullableInterface;
|
||||||
|
|
||||||
|
struct _MetaCullableInterface
|
||||||
|
{
|
||||||
|
GTypeInterface g_iface;
|
||||||
|
|
||||||
|
void (* cull_out) (MetaCullable *cullable,
|
||||||
|
cairo_region_t *unobscured_region,
|
||||||
|
cairo_region_t *clip_region);
|
||||||
|
void (* reset_culling) (MetaCullable *cullable);
|
||||||
|
};
|
||||||
|
|
||||||
|
GType meta_cullable_get_type (void);
|
||||||
|
|
||||||
|
void meta_cullable_cull_out (MetaCullable *cullable,
|
||||||
|
cairo_region_t *unobscured_region,
|
||||||
|
cairo_region_t *clip_region);
|
||||||
|
void meta_cullable_reset_culling (MetaCullable *cullable);
|
||||||
|
|
||||||
|
/* Utility methods for implementations */
|
||||||
|
void meta_cullable_cull_out_children (MetaCullable *cullable,
|
||||||
|
cairo_region_t *unobscured_region,
|
||||||
|
cairo_region_t *clip_region);
|
||||||
|
void meta_cullable_reset_culling_children (MetaCullable *cullable);
|
||||||
|
|
||||||
|
G_END_DECLS
|
||||||
|
|
||||||
|
#endif /* __META_CULLABLE_H__ */
|
||||||
|
|
@@ -16,9 +16,7 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <meta/meta-plugin.h>
|
#include <meta/meta-plugin.h>
|
||||||
@@ -192,10 +190,7 @@ meta_module_class_init (MetaModuleClass *klass)
|
|||||||
static void
|
static void
|
||||||
meta_module_init (MetaModule *self)
|
meta_module_init (MetaModule *self)
|
||||||
{
|
{
|
||||||
MetaModulePrivate *priv;
|
self->priv = META_MODULE_GET_PRIVATE (self);
|
||||||
|
|
||||||
self->priv = priv = META_MODULE_GET_PRIVATE (self);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GType
|
GType
|
||||||
|
@@ -16,9 +16,7 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef META_MODULE_H_
|
#ifndef META_MODULE_H_
|
||||||
|
@@ -16,9 +16,7 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
@@ -306,41 +304,13 @@ meta_plugin_manager_filter_keybinding (MetaPluginManager *plugin_mgr,
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* The public method that the compositor hooks into for desktop switching.
|
|
||||||
*
|
|
||||||
* Returns TRUE if the plugin handled the event type (i.e.,
|
|
||||||
* if the return value is FALSE, there will be no subsequent call to the
|
|
||||||
* manager completed() callback, and the compositor must ensure that any
|
|
||||||
* appropriate post-effect cleanup is carried out.
|
|
||||||
*/
|
|
||||||
gboolean
|
gboolean
|
||||||
meta_plugin_manager_xevent_filter (MetaPluginManager *plugin_mgr,
|
meta_plugin_manager_xevent_filter (MetaPluginManager *plugin_mgr,
|
||||||
XEvent *xev)
|
XEvent *xev)
|
||||||
{
|
{
|
||||||
MetaPlugin *plugin = plugin_mgr->plugin;
|
MetaPlugin *plugin = plugin_mgr->plugin;
|
||||||
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin);
|
|
||||||
|
|
||||||
/* We need to make sure that clutter gets certain events, like
|
return _meta_plugin_xevent_filter (plugin, xev);
|
||||||
* ConfigureNotify on the stage window. If there is a plugin that
|
|
||||||
* provides an xevent_filter function, then it's the responsibility
|
|
||||||
* of that plugin to pass events to Clutter. Otherwise, we send the
|
|
||||||
* event directly to Clutter ourselves.
|
|
||||||
*/
|
|
||||||
if (klass->xevent_filter)
|
|
||||||
return klass->xevent_filter (plugin, xev);
|
|
||||||
|
|
||||||
/* When mutter is running as a wayland compositor, things like input
|
|
||||||
* events just come directly from clutter so it won't have disabled
|
|
||||||
* clutter's event retrieval and won't need to forward it events (if
|
|
||||||
* it did it would lead to recursion). Also when running as a
|
|
||||||
* wayland compositor we shouldn't be assuming that we're running
|
|
||||||
* with the clutter x11 backend.
|
|
||||||
*/
|
|
||||||
if (meta_is_wayland_compositor ())
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
return clutter_x11_handle_event (xev) != CLUTTER_X11_FILTER_CONTINUE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@@ -16,9 +16,7 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef META_PLUGIN_MANAGER_H_
|
#ifndef META_PLUGIN_MANAGER_H_
|
||||||
@@ -72,6 +70,8 @@ gboolean meta_plugin_manager_filter_keybinding (MetaPluginManager *mgr,
|
|||||||
|
|
||||||
gboolean meta_plugin_manager_xevent_filter (MetaPluginManager *mgr,
|
gboolean meta_plugin_manager_xevent_filter (MetaPluginManager *mgr,
|
||||||
XEvent *xev);
|
XEvent *xev);
|
||||||
|
gboolean _meta_plugin_xevent_filter (MetaPlugin *plugin,
|
||||||
|
XEvent *xev);
|
||||||
|
|
||||||
void meta_plugin_manager_confirm_display_change (MetaPluginManager *mgr);
|
void meta_plugin_manager_confirm_display_change (MetaPluginManager *mgr);
|
||||||
|
|
||||||
|
@@ -16,9 +16,7 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -138,9 +136,7 @@ meta_plugin_class_init (MetaPluginClass *klass)
|
|||||||
static void
|
static void
|
||||||
meta_plugin_init (MetaPlugin *self)
|
meta_plugin_init (MetaPlugin *self)
|
||||||
{
|
{
|
||||||
MetaPluginPrivate *priv;
|
self->priv = META_PLUGIN_GET_PRIVATE (self);
|
||||||
|
|
||||||
self->priv = priv = META_PLUGIN_GET_PRIVATE (self);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
@@ -185,6 +181,28 @@ _meta_plugin_effect_started (MetaPlugin *plugin)
|
|||||||
priv->running++;
|
priv->running++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
_meta_plugin_xevent_filter (MetaPlugin *plugin,
|
||||||
|
XEvent *xev)
|
||||||
|
{
|
||||||
|
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin);
|
||||||
|
|
||||||
|
/* When mutter is running as a wayland compositor, things like input
|
||||||
|
* events just come directly from clutter so it won't have disabled
|
||||||
|
* clutter's event retrieval and won't need to forward it events (if
|
||||||
|
* it did it would lead to recursion). Also when running as a
|
||||||
|
* wayland compositor we shouldn't be assuming that we're running
|
||||||
|
* with the clutter x11 backend.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (klass->xevent_filter && klass->xevent_filter (plugin, xev))
|
||||||
|
return TRUE;
|
||||||
|
else if (!meta_is_wayland_compositor ())
|
||||||
|
return clutter_x11_handle_event (xev) != CLUTTER_X11_FILTER_CONTINUE;
|
||||||
|
else
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_plugin_switch_workspace_completed (MetaPlugin *plugin)
|
meta_plugin_switch_workspace_completed (MetaPlugin *plugin)
|
||||||
{
|
{
|
||||||
|
@@ -17,9 +17,7 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __META_SHADOW_FACTORY_PRIVATE_H__
|
#ifndef __META_SHADOW_FACTORY_PRIVATE_H__
|
||||||
|
@@ -13,9 +13,7 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -28,17 +28,12 @@
|
|||||||
#define __META_SHAPED_TEXTURE_PRIVATE_H__
|
#define __META_SHAPED_TEXTURE_PRIVATE_H__
|
||||||
|
|
||||||
#include <meta/meta-shaped-texture.h>
|
#include <meta/meta-shaped-texture.h>
|
||||||
#include "meta-wayland-private.h"
|
|
||||||
|
|
||||||
ClutterActor *meta_shaped_texture_new_with_xwindow (Window xwindow);
|
ClutterActor *meta_shaped_texture_new (void);
|
||||||
ClutterActor *meta_shaped_texture_new_with_wayland_surface (MetaWaylandSurface *surface);
|
void meta_shaped_texture_set_texture (MetaShapedTexture *stex,
|
||||||
void meta_shaped_texture_set_wayland_surface (MetaShapedTexture *stex,
|
CoglTexture *texture);
|
||||||
MetaWaylandSurface *surface);
|
gboolean meta_shaped_texture_get_unobscured_bounds (MetaShapedTexture *stex,
|
||||||
MetaWaylandSurface *meta_shaped_texture_get_wayland_surface (MetaShapedTexture *stex);
|
cairo_rectangle_int_t *unobscured_bounds);
|
||||||
|
gboolean meta_shaped_texture_is_obscured (MetaShapedTexture *self);
|
||||||
void meta_shaped_texture_set_pixmap (MetaShapedTexture *stex,
|
|
||||||
Pixmap pixmap);
|
|
||||||
void meta_shaped_texture_attach_wayland_buffer (MetaShapedTexture *stex,
|
|
||||||
MetaWaylandBuffer *buffer);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -16,9 +16,7 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -31,16 +29,15 @@
|
|||||||
|
|
||||||
#include <meta/meta-shaped-texture.h>
|
#include <meta/meta-shaped-texture.h>
|
||||||
#include <meta/util.h>
|
#include <meta/util.h>
|
||||||
|
#include "clutter-utils.h"
|
||||||
#include "meta-texture-tower.h"
|
#include "meta-texture-tower.h"
|
||||||
|
|
||||||
#include "meta-shaped-texture-private.h"
|
#include "meta-shaped-texture-private.h"
|
||||||
#include "meta-wayland-private.h"
|
|
||||||
#include <cogl/cogl-wayland-server.h>
|
|
||||||
|
|
||||||
#include <clutter/clutter.h>
|
#include <clutter/clutter.h>
|
||||||
#include <cogl/cogl.h>
|
#include <cogl/cogl.h>
|
||||||
#include <cogl/cogl-texture-pixmap-x11.h>
|
|
||||||
#include <gdk/gdk.h> /* for gdk_rectangle_intersect() */
|
#include <gdk/gdk.h> /* for gdk_rectangle_intersect() */
|
||||||
|
#include "meta-cullable.h"
|
||||||
|
|
||||||
static void meta_shaped_texture_dispose (GObject *object);
|
static void meta_shaped_texture_dispose (GObject *object);
|
||||||
|
|
||||||
@@ -60,15 +57,10 @@ static void meta_shaped_texture_get_preferred_height (ClutterActor *self,
|
|||||||
|
|
||||||
static gboolean meta_shaped_texture_get_paint_volume (ClutterActor *self, ClutterPaintVolume *volume);
|
static gboolean meta_shaped_texture_get_paint_volume (ClutterActor *self, ClutterPaintVolume *volume);
|
||||||
|
|
||||||
typedef enum _MetaShapedTextureType
|
static void cullable_iface_init (MetaCullableInterface *iface);
|
||||||
{
|
|
||||||
META_SHAPED_TEXTURE_TYPE_X11_PIXMAP,
|
|
||||||
META_SHAPED_TEXTURE_TYPE_WAYLAND_SURFACE,
|
|
||||||
} MetaShapedTextureType;
|
|
||||||
|
|
||||||
|
G_DEFINE_TYPE_WITH_CODE (MetaShapedTexture, meta_shaped_texture, CLUTTER_TYPE_ACTOR,
|
||||||
G_DEFINE_TYPE (MetaShapedTexture, meta_shaped_texture,
|
G_IMPLEMENT_INTERFACE (META_TYPE_CULLABLE, cullable_iface_init));
|
||||||
CLUTTER_TYPE_ACTOR);
|
|
||||||
|
|
||||||
#define META_SHAPED_TEXTURE_GET_PRIVATE(obj) \
|
#define META_SHAPED_TEXTURE_GET_PRIVATE(obj) \
|
||||||
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), META_TYPE_SHAPED_TEXTURE, \
|
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), META_TYPE_SHAPED_TEXTURE, \
|
||||||
@@ -78,25 +70,18 @@ struct _MetaShapedTexturePrivate
|
|||||||
{
|
{
|
||||||
MetaTextureTower *paint_tower;
|
MetaTextureTower *paint_tower;
|
||||||
|
|
||||||
MetaShapedTextureType type;
|
|
||||||
union {
|
|
||||||
struct {
|
|
||||||
Pixmap pixmap;
|
|
||||||
} x11;
|
|
||||||
struct {
|
|
||||||
MetaWaylandSurface *surface;
|
|
||||||
} wayland;
|
|
||||||
};
|
|
||||||
|
|
||||||
CoglTexture *texture;
|
CoglTexture *texture;
|
||||||
|
|
||||||
CoglTexture *mask_texture;
|
CoglTexture *mask_texture;
|
||||||
CoglPipeline *pipeline;
|
|
||||||
CoglPipeline *pipeline_unshaped;
|
|
||||||
|
|
||||||
cairo_region_t *clip_region;
|
|
||||||
cairo_region_t *input_shape_region;
|
cairo_region_t *input_shape_region;
|
||||||
|
|
||||||
|
/* The region containing only fully opaque pixels */
|
||||||
|
cairo_region_t *opaque_region;
|
||||||
|
|
||||||
|
/* MetaCullable regions, see that documentation for more details */
|
||||||
|
cairo_region_t *clip_region;
|
||||||
|
cairo_region_t *unobscured_region;
|
||||||
|
|
||||||
guint tex_width, tex_height;
|
guint tex_width, tex_height;
|
||||||
|
|
||||||
guint create_mipmaps : 1;
|
guint create_mipmaps : 1;
|
||||||
@@ -128,13 +113,37 @@ meta_shaped_texture_init (MetaShapedTexture *self)
|
|||||||
|
|
||||||
priv->paint_tower = meta_texture_tower_new ();
|
priv->paint_tower = meta_texture_tower_new ();
|
||||||
|
|
||||||
priv->type = META_SHAPED_TEXTURE_TYPE_X11_PIXMAP;
|
|
||||||
priv->texture = NULL;
|
priv->texture = NULL;
|
||||||
|
|
||||||
priv->mask_texture = NULL;
|
priv->mask_texture = NULL;
|
||||||
priv->create_mipmaps = TRUE;
|
priv->create_mipmaps = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_unobscured_region (MetaShapedTexture *self,
|
||||||
|
cairo_region_t *unobscured_region)
|
||||||
|
{
|
||||||
|
MetaShapedTexturePrivate *priv = self->priv;
|
||||||
|
|
||||||
|
g_clear_pointer (&priv->unobscured_region, (GDestroyNotify) cairo_region_destroy);
|
||||||
|
if (unobscured_region)
|
||||||
|
{
|
||||||
|
cairo_rectangle_int_t bounds = { 0, 0, priv->tex_width, priv->tex_height };
|
||||||
|
priv->unobscured_region = cairo_region_copy (unobscured_region);
|
||||||
|
cairo_region_intersect_rectangle (priv->unobscured_region, &bounds);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_clip_region (MetaShapedTexture *self,
|
||||||
|
cairo_region_t *clip_region)
|
||||||
|
{
|
||||||
|
MetaShapedTexturePrivate *priv = self->priv;
|
||||||
|
|
||||||
|
g_clear_pointer (&priv->clip_region, (GDestroyNotify) cairo_region_destroy);
|
||||||
|
if (clip_region)
|
||||||
|
priv->clip_region = cairo_region_copy (clip_region);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_shaped_texture_dispose (GObject *object)
|
meta_shaped_texture_dispose (GObject *object)
|
||||||
{
|
{
|
||||||
@@ -145,16 +154,84 @@ meta_shaped_texture_dispose (GObject *object)
|
|||||||
meta_texture_tower_free (priv->paint_tower);
|
meta_texture_tower_free (priv->paint_tower);
|
||||||
priv->paint_tower = NULL;
|
priv->paint_tower = NULL;
|
||||||
|
|
||||||
g_clear_pointer (&priv->pipeline, cogl_object_unref);
|
|
||||||
g_clear_pointer (&priv->pipeline_unshaped, cogl_object_unref);
|
|
||||||
g_clear_pointer (&priv->texture, cogl_object_unref);
|
g_clear_pointer (&priv->texture, cogl_object_unref);
|
||||||
|
g_clear_pointer (&priv->opaque_region, cairo_region_destroy);
|
||||||
|
|
||||||
meta_shaped_texture_set_mask_texture (self, NULL);
|
meta_shaped_texture_set_mask_texture (self, NULL);
|
||||||
meta_shaped_texture_set_clip_region (self, NULL);
|
set_unobscured_region (self, NULL);
|
||||||
|
set_clip_region (self, NULL);
|
||||||
|
|
||||||
G_OBJECT_CLASS (meta_shaped_texture_parent_class)->dispose (object);
|
G_OBJECT_CLASS (meta_shaped_texture_parent_class)->dispose (object);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static CoglPipeline *
|
||||||
|
get_unmasked_pipeline (CoglContext *ctx)
|
||||||
|
{
|
||||||
|
return cogl_pipeline_new (ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
static CoglPipeline *
|
||||||
|
get_masked_pipeline (CoglContext *ctx)
|
||||||
|
{
|
||||||
|
static CoglPipeline *template = NULL;
|
||||||
|
if (G_UNLIKELY (template == NULL))
|
||||||
|
{
|
||||||
|
template = cogl_pipeline_new (ctx);
|
||||||
|
cogl_pipeline_set_layer_combine (template, 1,
|
||||||
|
"RGBA = MODULATE (PREVIOUS, TEXTURE[A])",
|
||||||
|
NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
return cogl_pipeline_copy (template);
|
||||||
|
}
|
||||||
|
|
||||||
|
static CoglPipeline *
|
||||||
|
get_unblended_pipeline (CoglContext *ctx)
|
||||||
|
{
|
||||||
|
static CoglPipeline *template = NULL;
|
||||||
|
if (G_UNLIKELY (template == NULL))
|
||||||
|
{
|
||||||
|
CoglColor color;
|
||||||
|
template = cogl_pipeline_new (ctx);
|
||||||
|
cogl_color_init_from_4ub (&color, 255, 255, 255, 255);
|
||||||
|
cogl_pipeline_set_blend (template,
|
||||||
|
"RGBA = ADD (SRC_COLOR, 0)",
|
||||||
|
NULL);
|
||||||
|
cogl_pipeline_set_color (template, &color);
|
||||||
|
}
|
||||||
|
|
||||||
|
return cogl_pipeline_copy (template);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
paint_clipped_rectangle (CoglFramebuffer *fb,
|
||||||
|
CoglPipeline *pipeline,
|
||||||
|
cairo_rectangle_int_t *rect,
|
||||||
|
ClutterActorBox *alloc)
|
||||||
|
{
|
||||||
|
float coords[8];
|
||||||
|
float x1, y1, x2, y2;
|
||||||
|
|
||||||
|
x1 = rect->x;
|
||||||
|
y1 = rect->y;
|
||||||
|
x2 = rect->x + rect->width;
|
||||||
|
y2 = rect->y + rect->height;
|
||||||
|
|
||||||
|
coords[0] = rect->x / (alloc->x2 - alloc->x1);
|
||||||
|
coords[1] = rect->y / (alloc->y2 - alloc->y1);
|
||||||
|
coords[2] = (rect->x + rect->width) / (alloc->x2 - alloc->x1);
|
||||||
|
coords[3] = (rect->y + rect->height) / (alloc->y2 - alloc->y1);
|
||||||
|
|
||||||
|
coords[4] = coords[0];
|
||||||
|
coords[5] = coords[1];
|
||||||
|
coords[6] = coords[2];
|
||||||
|
coords[7] = coords[3];
|
||||||
|
|
||||||
|
cogl_framebuffer_draw_multitextured_rectangle (fb, pipeline,
|
||||||
|
x1, y1, x2, y2,
|
||||||
|
&coords[0], 8);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
set_cogl_texture (MetaShapedTexture *stex,
|
set_cogl_texture (MetaShapedTexture *stex,
|
||||||
CoglTexture *cogl_tex)
|
CoglTexture *cogl_tex)
|
||||||
@@ -171,14 +248,9 @@ set_cogl_texture (MetaShapedTexture *stex,
|
|||||||
|
|
||||||
priv->texture = cogl_tex;
|
priv->texture = cogl_tex;
|
||||||
|
|
||||||
if (priv->pipeline != NULL)
|
|
||||||
cogl_pipeline_set_layer_texture (priv->pipeline, 0, COGL_TEXTURE (cogl_tex));
|
|
||||||
|
|
||||||
if (priv->pipeline_unshaped != NULL)
|
|
||||||
cogl_pipeline_set_layer_texture (priv->pipeline_unshaped, 0, COGL_TEXTURE (cogl_tex));
|
|
||||||
|
|
||||||
if (cogl_tex != NULL)
|
if (cogl_tex != NULL)
|
||||||
{
|
{
|
||||||
|
cogl_object_ref (cogl_tex);
|
||||||
width = cogl_texture_get_width (COGL_TEXTURE (cogl_tex));
|
width = cogl_texture_get_width (COGL_TEXTURE (cogl_tex));
|
||||||
height = cogl_texture_get_height (COGL_TEXTURE (cogl_tex));
|
height = cogl_texture_get_height (COGL_TEXTURE (cogl_tex));
|
||||||
|
|
||||||
@@ -203,6 +275,9 @@ set_cogl_texture (MetaShapedTexture *stex,
|
|||||||
* know how much of the buffer has changed with respect to the
|
* know how much of the buffer has changed with respect to the
|
||||||
* previous buffer. We only queue a redraw in response to surface
|
* previous buffer. We only queue a redraw in response to surface
|
||||||
* damage. */
|
* damage. */
|
||||||
|
|
||||||
|
if (priv->create_mipmaps)
|
||||||
|
meta_texture_tower_set_base_texture (priv->paint_tower, cogl_tex);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -210,14 +285,15 @@ meta_shaped_texture_paint (ClutterActor *actor)
|
|||||||
{
|
{
|
||||||
MetaShapedTexture *stex = (MetaShapedTexture *) actor;
|
MetaShapedTexture *stex = (MetaShapedTexture *) actor;
|
||||||
MetaShapedTexturePrivate *priv = stex->priv;
|
MetaShapedTexturePrivate *priv = stex->priv;
|
||||||
CoglTexture *paint_tex;
|
|
||||||
guint tex_width, tex_height;
|
guint tex_width, tex_height;
|
||||||
|
guchar opacity;
|
||||||
|
CoglContext *ctx;
|
||||||
|
CoglFramebuffer *fb;
|
||||||
|
CoglPipeline *pipeline = NULL;
|
||||||
|
CoglTexture *paint_tex;
|
||||||
ClutterActorBox alloc;
|
ClutterActorBox alloc;
|
||||||
|
cairo_region_t *blended_region = NULL;
|
||||||
static CoglPipeline *pipeline_template = NULL;
|
CoglPipelineFilter filter;
|
||||||
static CoglPipeline *pipeline_unshaped_template = NULL;
|
|
||||||
|
|
||||||
CoglPipeline *pipeline;
|
|
||||||
|
|
||||||
if (priv->clip_region && cairo_region_is_empty (priv->clip_region))
|
if (priv->clip_region && cairo_region_is_empty (priv->clip_region))
|
||||||
return;
|
return;
|
||||||
@@ -254,105 +330,137 @@ meta_shaped_texture_paint (ClutterActor *actor)
|
|||||||
if (tex_width == 0 || tex_height == 0) /* no contents yet */
|
if (tex_width == 0 || tex_height == 0) /* no contents yet */
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
/* Use nearest-pixel interpolation if the texture is unscaled. This
|
||||||
|
* improves performance, especially with software rendering.
|
||||||
|
*/
|
||||||
|
|
||||||
|
filter = COGL_PIPELINE_FILTER_LINEAR;
|
||||||
|
|
||||||
|
if (!clutter_actor_is_in_clone_paint (actor) && meta_actor_is_untransformed (actor, NULL, NULL))
|
||||||
|
filter = COGL_PIPELINE_FILTER_NEAREST;
|
||||||
|
|
||||||
|
ctx = clutter_backend_get_cogl_context (clutter_get_default_backend ());
|
||||||
|
fb = cogl_get_draw_framebuffer ();
|
||||||
|
|
||||||
|
opacity = clutter_actor_get_paint_opacity (actor);
|
||||||
|
clutter_actor_get_allocation_box (actor, &alloc);
|
||||||
|
|
||||||
|
if (priv->opaque_region != NULL && opacity == 255)
|
||||||
|
{
|
||||||
|
CoglPipeline *opaque_pipeline;
|
||||||
|
cairo_region_t *region;
|
||||||
|
int n_rects;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (priv->clip_region != NULL)
|
||||||
|
{
|
||||||
|
region = cairo_region_copy (priv->clip_region);
|
||||||
|
cairo_region_intersect (region, priv->opaque_region);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
region = cairo_region_reference (priv->opaque_region);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cairo_region_is_empty (region))
|
||||||
|
goto paint_blended;
|
||||||
|
|
||||||
|
opaque_pipeline = get_unblended_pipeline (ctx);
|
||||||
|
cogl_pipeline_set_layer_texture (opaque_pipeline, 0, paint_tex);
|
||||||
|
cogl_pipeline_set_layer_filters (opaque_pipeline, 0, filter, filter);
|
||||||
|
|
||||||
|
n_rects = cairo_region_num_rectangles (region);
|
||||||
|
for (i = 0; i < n_rects; i++)
|
||||||
|
{
|
||||||
|
cairo_rectangle_int_t rect;
|
||||||
|
cairo_region_get_rectangle (region, i, &rect);
|
||||||
|
paint_clipped_rectangle (fb, opaque_pipeline, &rect, &alloc);
|
||||||
|
}
|
||||||
|
|
||||||
|
cogl_object_unref (opaque_pipeline);
|
||||||
|
|
||||||
|
if (priv->clip_region != NULL)
|
||||||
|
{
|
||||||
|
blended_region = cairo_region_copy (priv->clip_region);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cairo_rectangle_int_t rect = { 0, 0, tex_width, tex_height };
|
||||||
|
blended_region = cairo_region_create_rectangle (&rect);
|
||||||
|
}
|
||||||
|
|
||||||
|
cairo_region_subtract (blended_region, priv->opaque_region);
|
||||||
|
|
||||||
|
paint_blended:
|
||||||
|
cairo_region_destroy (region);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (blended_region == NULL && priv->clip_region != NULL)
|
||||||
|
blended_region = cairo_region_reference (priv->clip_region);
|
||||||
|
|
||||||
|
if (blended_region != NULL && cairo_region_is_empty (blended_region))
|
||||||
|
goto out;
|
||||||
|
|
||||||
if (priv->mask_texture == NULL)
|
if (priv->mask_texture == NULL)
|
||||||
{
|
{
|
||||||
/* Use a single-layer texture if we don't have a mask. */
|
pipeline = get_unmasked_pipeline (ctx);
|
||||||
|
|
||||||
if (priv->pipeline_unshaped == NULL)
|
|
||||||
{
|
|
||||||
if (G_UNLIKELY (pipeline_unshaped_template == NULL))
|
|
||||||
{
|
|
||||||
CoglContext *ctx = clutter_backend_get_cogl_context (clutter_get_default_backend ());
|
|
||||||
pipeline_unshaped_template = cogl_pipeline_new (ctx);
|
|
||||||
}
|
|
||||||
|
|
||||||
priv->pipeline_unshaped = cogl_pipeline_copy (pipeline_unshaped_template);
|
|
||||||
}
|
|
||||||
pipeline = priv->pipeline_unshaped;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (priv->pipeline == NULL)
|
pipeline = get_masked_pipeline (ctx);
|
||||||
{
|
|
||||||
if (G_UNLIKELY (pipeline_template == NULL))
|
|
||||||
{
|
|
||||||
CoglContext *ctx = clutter_backend_get_cogl_context (clutter_get_default_backend ());
|
|
||||||
pipeline_template = cogl_pipeline_new (ctx);
|
|
||||||
cogl_pipeline_set_layer_combine (pipeline_template, 1,
|
|
||||||
"RGBA = MODULATE (PREVIOUS, TEXTURE[A])",
|
|
||||||
NULL);
|
|
||||||
}
|
|
||||||
priv->pipeline = cogl_pipeline_copy (pipeline_template);
|
|
||||||
}
|
|
||||||
pipeline = priv->pipeline;
|
|
||||||
|
|
||||||
cogl_pipeline_set_layer_texture (pipeline, 1, priv->mask_texture);
|
cogl_pipeline_set_layer_texture (pipeline, 1, priv->mask_texture);
|
||||||
|
cogl_pipeline_set_layer_filters (pipeline, 1, filter, filter);
|
||||||
}
|
}
|
||||||
|
|
||||||
cogl_pipeline_set_layer_texture (pipeline, 0, paint_tex);
|
cogl_pipeline_set_layer_texture (pipeline, 0, paint_tex);
|
||||||
|
cogl_pipeline_set_layer_filters (pipeline, 0, filter, filter);
|
||||||
|
|
||||||
{
|
{
|
||||||
CoglColor color;
|
CoglColor color;
|
||||||
guchar opacity = clutter_actor_get_paint_opacity (actor);
|
cogl_color_init_from_4ub (&color, opacity, opacity, opacity, opacity);
|
||||||
cogl_color_set_from_4ub (&color, opacity, opacity, opacity, opacity);
|
|
||||||
cogl_pipeline_set_color (pipeline, &color);
|
cogl_pipeline_set_color (pipeline, &color);
|
||||||
}
|
}
|
||||||
|
|
||||||
cogl_set_source (pipeline);
|
if (blended_region != NULL)
|
||||||
|
|
||||||
clutter_actor_get_allocation_box (actor, &alloc);
|
|
||||||
|
|
||||||
if (priv->clip_region)
|
|
||||||
{
|
{
|
||||||
int n_rects;
|
int n_rects;
|
||||||
int i;
|
|
||||||
cairo_rectangle_int_t tex_rect = { 0, 0, tex_width, tex_height };
|
|
||||||
|
|
||||||
/* Limit to how many separate rectangles we'll draw; beyond this just
|
/* Limit to how many separate rectangles we'll draw; beyond this just
|
||||||
* fall back and draw the whole thing */
|
* fall back and draw the whole thing */
|
||||||
# define MAX_RECTS 16
|
# define MAX_RECTS 16
|
||||||
|
|
||||||
n_rects = cairo_region_num_rectangles (priv->clip_region);
|
n_rects = cairo_region_num_rectangles (blended_region);
|
||||||
if (n_rects <= MAX_RECTS)
|
if (n_rects <= MAX_RECTS)
|
||||||
{
|
{
|
||||||
float coords[8];
|
int i;
|
||||||
float x1, y1, x2, y2;
|
cairo_rectangle_int_t tex_rect = { 0, 0, tex_width, tex_height };
|
||||||
|
|
||||||
for (i = 0; i < n_rects; i++)
|
for (i = 0; i < n_rects; i++)
|
||||||
{
|
{
|
||||||
cairo_rectangle_int_t rect;
|
cairo_rectangle_int_t rect;
|
||||||
|
|
||||||
cairo_region_get_rectangle (priv->clip_region, i, &rect);
|
cairo_region_get_rectangle (blended_region, i, &rect);
|
||||||
|
|
||||||
if (!gdk_rectangle_intersect (&tex_rect, &rect, &rect))
|
if (!gdk_rectangle_intersect (&tex_rect, &rect, &rect))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
x1 = rect.x;
|
paint_clipped_rectangle (fb, pipeline, &rect, &alloc);
|
||||||
y1 = rect.y;
|
|
||||||
x2 = rect.x + rect.width;
|
|
||||||
y2 = rect.y + rect.height;
|
|
||||||
|
|
||||||
coords[0] = rect.x / (alloc.x2 - alloc.x1);
|
|
||||||
coords[1] = rect.y / (alloc.y2 - alloc.y1);
|
|
||||||
coords[2] = (rect.x + rect.width) / (alloc.x2 - alloc.x1);
|
|
||||||
coords[3] = (rect.y + rect.height) / (alloc.y2 - alloc.y1);
|
|
||||||
|
|
||||||
coords[4] = coords[0];
|
|
||||||
coords[5] = coords[1];
|
|
||||||
coords[6] = coords[2];
|
|
||||||
coords[7] = coords[3];
|
|
||||||
|
|
||||||
cogl_rectangle_with_multitexture_coords (x1, y1, x2, y2,
|
|
||||||
&coords[0], 8);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cogl_rectangle (0, 0,
|
cogl_framebuffer_draw_rectangle (fb, pipeline,
|
||||||
alloc.x2 - alloc.x1,
|
0, 0,
|
||||||
alloc.y2 - alloc.y1);
|
alloc.x2 - alloc.x1,
|
||||||
|
alloc.y2 - alloc.y1);
|
||||||
|
|
||||||
|
out:
|
||||||
|
if (pipeline != NULL)
|
||||||
|
cogl_object_unref (pipeline);
|
||||||
|
if (blended_region != NULL)
|
||||||
|
cairo_region_destroy (blended_region);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -368,13 +476,16 @@ meta_shaped_texture_pick (ClutterActor *actor,
|
|||||||
|
|
||||||
/* If there is no region then use the regular pick */
|
/* If there is no region then use the regular pick */
|
||||||
if (priv->input_shape_region == NULL)
|
if (priv->input_shape_region == NULL)
|
||||||
CLUTTER_ACTOR_CLASS (meta_shaped_texture_parent_class)
|
CLUTTER_ACTOR_CLASS (meta_shaped_texture_parent_class)->pick (actor, color);
|
||||||
->pick (actor, color);
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int n_rects;
|
int n_rects;
|
||||||
float *rectangles;
|
float *rectangles;
|
||||||
int i;
|
int i;
|
||||||
|
CoglPipeline *pipeline;
|
||||||
|
CoglContext *ctx;
|
||||||
|
CoglFramebuffer *fb;
|
||||||
|
CoglColor cogl_color;
|
||||||
|
|
||||||
/* Note: We don't bother trying to intersect the pick and clip regions
|
/* Note: We don't bother trying to intersect the pick and clip regions
|
||||||
* since needing to copy the region, do the intersection, and probably
|
* since needing to copy the region, do the intersection, and probably
|
||||||
@@ -403,12 +514,17 @@ meta_shaped_texture_pick (ClutterActor *actor,
|
|||||||
rectangles[pos + 3] = rect.y + rect.height;
|
rectangles[pos + 3] = rect.y + rect.height;
|
||||||
}
|
}
|
||||||
|
|
||||||
cogl_set_source_color4ub (color->red,
|
ctx = clutter_backend_get_cogl_context (clutter_get_default_backend ());
|
||||||
color->green,
|
fb = cogl_get_draw_framebuffer ();
|
||||||
color->blue,
|
|
||||||
color->alpha);
|
|
||||||
|
|
||||||
cogl_rectangles (rectangles, n_rects);
|
cogl_color_init_from_4ub (&cogl_color, color->red, color->green, color->blue, color->alpha);
|
||||||
|
|
||||||
|
pipeline = cogl_pipeline_new (ctx);
|
||||||
|
cogl_pipeline_set_color (pipeline, &cogl_color);
|
||||||
|
|
||||||
|
cogl_framebuffer_draw_rectangles (fb, pipeline,
|
||||||
|
rectangles, n_rects);
|
||||||
|
cogl_object_unref (pipeline);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -451,52 +567,37 @@ meta_shaped_texture_get_preferred_height (ClutterActor *self,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
meta_shaped_texture_get_paint_volume (ClutterActor *self,
|
meta_shaped_texture_get_paint_volume (ClutterActor *actor,
|
||||||
ClutterPaintVolume *volume)
|
ClutterPaintVolume *volume)
|
||||||
{
|
{
|
||||||
return clutter_paint_volume_set_from_allocation (volume, self);
|
MetaShapedTexture *self = META_SHAPED_TEXTURE (actor);
|
||||||
}
|
cairo_rectangle_int_t unobscured_bounds;
|
||||||
|
|
||||||
ClutterActor *
|
if (!clutter_paint_volume_set_from_allocation (volume, actor))
|
||||||
meta_shaped_texture_new_with_wayland_surface (MetaWaylandSurface *surface)
|
return FALSE;
|
||||||
{
|
|
||||||
ClutterActor *actor = g_object_new (META_TYPE_SHAPED_TEXTURE, NULL);
|
|
||||||
MetaShapedTexturePrivate *priv = META_SHAPED_TEXTURE (actor)->priv;
|
|
||||||
|
|
||||||
/* XXX: it could probably be better to have a "type" construct-only
|
if (meta_shaped_texture_get_unobscured_bounds (self, &unobscured_bounds))
|
||||||
* property or create wayland/x11 subclasses */
|
{
|
||||||
priv->type = META_SHAPED_TEXTURE_TYPE_WAYLAND_SURFACE;
|
ClutterVertex origin;
|
||||||
|
cairo_rectangle_int_t bounds;
|
||||||
|
|
||||||
meta_shaped_texture_set_wayland_surface (META_SHAPED_TEXTURE (actor),
|
/* I hate ClutterPaintVolume so much... */
|
||||||
surface);
|
clutter_paint_volume_get_origin (volume, &origin);
|
||||||
|
bounds.x = origin.x;
|
||||||
|
bounds.y = origin.y;
|
||||||
|
bounds.width = clutter_paint_volume_get_width (volume);
|
||||||
|
bounds.height = clutter_paint_volume_get_height (volume);
|
||||||
|
|
||||||
return actor;
|
gdk_rectangle_intersect (&bounds, &unobscured_bounds, &bounds);
|
||||||
}
|
|
||||||
|
|
||||||
void
|
origin.x = bounds.x;
|
||||||
meta_shaped_texture_set_wayland_surface (MetaShapedTexture *stex,
|
origin.y = bounds.y;
|
||||||
MetaWaylandSurface *surface)
|
clutter_paint_volume_set_origin (volume, &origin);
|
||||||
{
|
clutter_paint_volume_set_width (volume, bounds.width);
|
||||||
MetaShapedTexturePrivate *priv = stex->priv;
|
clutter_paint_volume_set_height (volume, bounds.height);
|
||||||
|
}
|
||||||
|
|
||||||
priv->wayland.surface = surface;
|
return TRUE;
|
||||||
|
|
||||||
if (surface && surface->buffer_ref.buffer)
|
|
||||||
meta_shaped_texture_attach_wayland_buffer (stex,
|
|
||||||
surface->buffer_ref.buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
MetaWaylandSurface *
|
|
||||||
meta_shaped_texture_get_wayland_surface (MetaShapedTexture *stex)
|
|
||||||
{
|
|
||||||
MetaShapedTexturePrivate *priv = stex->priv;
|
|
||||||
return priv->wayland.surface;
|
|
||||||
}
|
|
||||||
|
|
||||||
ClutterActor *
|
|
||||||
meta_shaped_texture_new_with_xwindow (Window xwindow)
|
|
||||||
{
|
|
||||||
return g_object_new (META_TYPE_SHAPED_TEXTURE, NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -541,224 +642,113 @@ meta_shaped_texture_set_mask_texture (MetaShapedTexture *stex,
|
|||||||
clutter_actor_queue_redraw (CLUTTER_ACTOR (stex));
|
clutter_actor_queue_redraw (CLUTTER_ACTOR (stex));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static cairo_region_t *
|
||||||
wayland_surface_update_area (MetaShapedTexture *stex,
|
effective_unobscured_region (MetaShapedTexture *self)
|
||||||
int x,
|
|
||||||
int y,
|
|
||||||
int width,
|
|
||||||
int height)
|
|
||||||
{
|
{
|
||||||
MetaShapedTexturePrivate *priv;
|
MetaShapedTexturePrivate *priv = self->priv;
|
||||||
MetaWaylandBuffer *buffer;
|
|
||||||
|
|
||||||
priv = stex->priv;
|
return clutter_actor_has_mapped_clones (CLUTTER_ACTOR (self)) ? NULL : priv->unobscured_region;
|
||||||
|
|
||||||
g_return_if_fail (priv->type == META_SHAPED_TEXTURE_TYPE_WAYLAND_SURFACE);
|
|
||||||
g_return_if_fail (priv->texture != NULL);
|
|
||||||
|
|
||||||
buffer = priv->wayland.surface->buffer_ref.buffer;
|
|
||||||
|
|
||||||
if (buffer)
|
|
||||||
{
|
|
||||||
struct wl_resource *resource = buffer->resource;
|
|
||||||
struct wl_shm_buffer *shm_buffer = wl_shm_buffer_get (resource);
|
|
||||||
|
|
||||||
if (shm_buffer)
|
|
||||||
{
|
|
||||||
CoglPixelFormat format;
|
|
||||||
|
|
||||||
switch (wl_shm_buffer_get_format (shm_buffer))
|
|
||||||
{
|
|
||||||
#if G_BYTE_ORDER == G_BIG_ENDIAN
|
|
||||||
case WL_SHM_FORMAT_ARGB8888:
|
|
||||||
format = COGL_PIXEL_FORMAT_ARGB_8888_PRE;
|
|
||||||
break;
|
|
||||||
case WL_SHM_FORMAT_XRGB8888:
|
|
||||||
format = COGL_PIXEL_FORMAT_ARGB_8888;
|
|
||||||
break;
|
|
||||||
#elif G_BYTE_ORDER == G_LITTLE_ENDIAN
|
|
||||||
case WL_SHM_FORMAT_ARGB8888:
|
|
||||||
format = COGL_PIXEL_FORMAT_BGRA_8888_PRE;
|
|
||||||
break;
|
|
||||||
case WL_SHM_FORMAT_XRGB8888:
|
|
||||||
format = COGL_PIXEL_FORMAT_BGRA_8888;
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
default:
|
|
||||||
g_warn_if_reached ();
|
|
||||||
format = COGL_PIXEL_FORMAT_ARGB_8888;
|
|
||||||
}
|
|
||||||
|
|
||||||
cogl_texture_set_region (priv->texture,
|
|
||||||
x, y,
|
|
||||||
x, y,
|
|
||||||
width, height,
|
|
||||||
width, height,
|
|
||||||
format,
|
|
||||||
wl_shm_buffer_get_stride (shm_buffer),
|
|
||||||
wl_shm_buffer_get_data (shm_buffer));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
gboolean
|
||||||
queue_damage_redraw_with_clip (MetaShapedTexture *stex,
|
meta_shaped_texture_get_unobscured_bounds (MetaShapedTexture *self,
|
||||||
int x,
|
cairo_rectangle_int_t *unobscured_bounds)
|
||||||
int y,
|
|
||||||
int width,
|
|
||||||
int height)
|
|
||||||
{
|
{
|
||||||
ClutterActor *self = CLUTTER_ACTOR (stex);
|
cairo_region_t *unobscured_region = effective_unobscured_region (self);
|
||||||
MetaShapedTexturePrivate *priv;
|
|
||||||
ClutterActorBox allocation;
|
|
||||||
float scale_x;
|
|
||||||
float scale_y;
|
|
||||||
cairo_rectangle_int_t clip;
|
|
||||||
|
|
||||||
/* NB: clutter_actor_queue_redraw_with_clip expects a box in the actor's
|
if (unobscured_region)
|
||||||
* coordinate space so we need to convert from surface coordinates to
|
|
||||||
* actor coordinates...
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Calling clutter_actor_get_allocation_box() is enormously expensive
|
|
||||||
* if the actor has an out-of-date allocation, since it triggers
|
|
||||||
* a full redraw. clutter_actor_queue_redraw_with_clip() would redraw
|
|
||||||
* the whole stage anyways in that case, so just go ahead and do
|
|
||||||
* it here.
|
|
||||||
*/
|
|
||||||
if (!clutter_actor_has_allocation (self))
|
|
||||||
{
|
{
|
||||||
clutter_actor_queue_redraw (self);
|
cairo_region_get_extents (unobscured_region, unobscured_bounds);
|
||||||
return;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
priv = stex->priv;
|
return FALSE;
|
||||||
|
|
||||||
if (priv->tex_width == 0 || priv->tex_height == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
clutter_actor_get_allocation_box (self, &allocation);
|
|
||||||
|
|
||||||
scale_x = (allocation.x2 - allocation.x1) / priv->tex_width;
|
|
||||||
scale_y = (allocation.y2 - allocation.y1) / priv->tex_height;
|
|
||||||
|
|
||||||
clip.x = x * scale_x;
|
|
||||||
clip.y = y * scale_y;
|
|
||||||
clip.width = width * scale_x;
|
|
||||||
clip.height = height * scale_y;
|
|
||||||
clutter_actor_queue_redraw_with_clip (self, &clip);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
gboolean
|
||||||
|
meta_shaped_texture_is_obscured (MetaShapedTexture *self)
|
||||||
|
{
|
||||||
|
cairo_region_t *unobscured_region = effective_unobscured_region (self);
|
||||||
|
|
||||||
|
if (unobscured_region)
|
||||||
|
return cairo_region_is_empty (unobscured_region);
|
||||||
|
else
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* meta_shaped_texture_update_area:
|
||||||
|
* @stex: #MetaShapedTexture
|
||||||
|
* @x: the x coordinate of the damaged area
|
||||||
|
* @y: the y coordinate of the damaged area
|
||||||
|
* @width: the width of the damaged area
|
||||||
|
* @height: the height of the damaged area
|
||||||
|
*
|
||||||
|
* Repairs the damaged area indicated by @x, @y, @width and @height
|
||||||
|
* and potentially queues a redraw.
|
||||||
|
*
|
||||||
|
* Return value: Whether a redraw have been queued or not
|
||||||
|
*/
|
||||||
|
gboolean
|
||||||
meta_shaped_texture_update_area (MetaShapedTexture *stex,
|
meta_shaped_texture_update_area (MetaShapedTexture *stex,
|
||||||
int x,
|
int x,
|
||||||
int y,
|
int y,
|
||||||
int width,
|
int width,
|
||||||
int height)
|
int height)
|
||||||
{
|
{
|
||||||
MetaShapedTexturePrivate *priv;
|
MetaShapedTexturePrivate *priv;
|
||||||
|
cairo_region_t *unobscured_region;
|
||||||
|
const cairo_rectangle_int_t clip = { x, y, width, height };
|
||||||
|
|
||||||
priv = stex->priv;
|
priv = stex->priv;
|
||||||
|
|
||||||
if (priv->texture == NULL)
|
if (priv->texture == NULL)
|
||||||
return;
|
return FALSE;
|
||||||
|
|
||||||
switch (priv->type)
|
|
||||||
{
|
|
||||||
case META_SHAPED_TEXTURE_TYPE_X11_PIXMAP:
|
|
||||||
cogl_texture_pixmap_x11_update_area (COGL_TEXTURE_PIXMAP_X11 (priv->texture),
|
|
||||||
x, y, width, height);
|
|
||||||
break;
|
|
||||||
case META_SHAPED_TEXTURE_TYPE_WAYLAND_SURFACE:
|
|
||||||
wayland_surface_update_area (stex, x, y, width, height);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
meta_texture_tower_update_area (priv->paint_tower, x, y, width, height);
|
meta_texture_tower_update_area (priv->paint_tower, x, y, width, height);
|
||||||
|
|
||||||
queue_damage_redraw_with_clip (stex, x, y, width, height);
|
unobscured_region = effective_unobscured_region (stex);
|
||||||
|
if (unobscured_region)
|
||||||
|
{
|
||||||
|
cairo_region_t *intersection;
|
||||||
|
|
||||||
|
if (cairo_region_is_empty (unobscured_region))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
intersection = cairo_region_copy (unobscured_region);
|
||||||
|
cairo_region_intersect_rectangle (intersection, &clip);
|
||||||
|
|
||||||
|
if (!cairo_region_is_empty (intersection))
|
||||||
|
{
|
||||||
|
cairo_rectangle_int_t damage_rect;
|
||||||
|
cairo_region_get_extents (intersection, &damage_rect);
|
||||||
|
clutter_actor_queue_redraw_with_clip (CLUTTER_ACTOR (stex), &damage_rect);
|
||||||
|
cairo_region_destroy (intersection);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
cairo_region_destroy (intersection);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
clutter_actor_queue_redraw_with_clip (CLUTTER_ACTOR (stex), &clip);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* meta_shaped_texture_set_pixmap:
|
* meta_shaped_texture_set_texture:
|
||||||
* @stex: The #MetaShapedTexture
|
* @stex: The #MetaShapedTexture
|
||||||
* @pixmap: The pixmap you want the stex to assume
|
* @pixmap: The #CoglTexture to display
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
meta_shaped_texture_set_pixmap (MetaShapedTexture *stex,
|
meta_shaped_texture_set_texture (MetaShapedTexture *stex,
|
||||||
Pixmap pixmap)
|
CoglTexture *texture)
|
||||||
{
|
{
|
||||||
MetaShapedTexturePrivate *priv;
|
|
||||||
|
|
||||||
g_return_if_fail (META_IS_SHAPED_TEXTURE (stex));
|
g_return_if_fail (META_IS_SHAPED_TEXTURE (stex));
|
||||||
|
|
||||||
priv = stex->priv;
|
set_cogl_texture (stex, texture);
|
||||||
|
|
||||||
if (priv->x11.pixmap == pixmap)
|
|
||||||
return;
|
|
||||||
|
|
||||||
priv->x11.pixmap = pixmap;
|
|
||||||
|
|
||||||
if (pixmap != None)
|
|
||||||
{
|
|
||||||
CoglContext *ctx =
|
|
||||||
clutter_backend_get_cogl_context (clutter_get_default_backend ());
|
|
||||||
CoglTexture *texture =
|
|
||||||
COGL_TEXTURE (cogl_texture_pixmap_x11_new (ctx, pixmap, FALSE, NULL));
|
|
||||||
set_cogl_texture (stex, texture);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
set_cogl_texture (stex, NULL);
|
|
||||||
|
|
||||||
if (priv->create_mipmaps)
|
|
||||||
meta_texture_tower_set_base_texture (priv->paint_tower,
|
|
||||||
COGL_TEXTURE (priv->texture));
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
meta_shaped_texture_attach_wayland_buffer (MetaShapedTexture *stex,
|
|
||||||
MetaWaylandBuffer *buffer)
|
|
||||||
{
|
|
||||||
MetaShapedTexturePrivate *priv;
|
|
||||||
|
|
||||||
g_return_if_fail (META_IS_SHAPED_TEXTURE (stex));
|
|
||||||
|
|
||||||
priv = stex->priv;
|
|
||||||
|
|
||||||
/* TODO: we should change this api to be something like
|
|
||||||
* meta_shaped_texture_notify_buffer_attach() since we now maintain
|
|
||||||
* a reference to the MetaWaylandSurface where we can access the
|
|
||||||
* buffer without it being explicitly passed as an argument.
|
|
||||||
*/
|
|
||||||
g_return_if_fail (priv->wayland.surface->buffer_ref.buffer == buffer);
|
|
||||||
|
|
||||||
if (buffer)
|
|
||||||
{
|
|
||||||
CoglContext *ctx =
|
|
||||||
clutter_backend_get_cogl_context (clutter_get_default_backend ());
|
|
||||||
CoglError *catch_error = NULL;
|
|
||||||
CoglTexture *texture =
|
|
||||||
COGL_TEXTURE (cogl_wayland_texture_2d_new_from_buffer (ctx,
|
|
||||||
buffer->resource,
|
|
||||||
&catch_error));
|
|
||||||
if (!texture)
|
|
||||||
{
|
|
||||||
cogl_error_free (catch_error);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
buffer->width = cogl_texture_get_width (texture);
|
|
||||||
buffer->height = cogl_texture_get_height (texture);
|
|
||||||
}
|
|
||||||
|
|
||||||
set_cogl_texture (stex, texture);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
set_cogl_texture (stex, NULL);
|
|
||||||
|
|
||||||
if (priv->create_mipmaps)
|
|
||||||
meta_texture_tower_set_base_texture (priv->paint_tower,
|
|
||||||
COGL_TEXTURE (priv->texture));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -810,22 +800,19 @@ meta_shaped_texture_set_input_shape_region (MetaShapedTexture *stex,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* meta_shaped_texture_set_clip_region:
|
* meta_shaped_texture_set_opaque_region:
|
||||||
* @stex: a #MetaShapedTexture
|
* @stex: a #MetaShapedTexture
|
||||||
* @clip_region: (transfer full): the region of the texture that
|
* @opaque_region: (transfer full): the region of the texture that
|
||||||
* is visible and should be painted.
|
* can have blending turned off.
|
||||||
*
|
*
|
||||||
* Provides a hint to the texture about what areas of the texture
|
* As most windows have a large portion that does not require blending,
|
||||||
* are not completely obscured and thus need to be painted. This
|
* we can easily turn off blending if we know the areas that do not
|
||||||
* is an optimization and is not supposed to have any effect on
|
* require blending. This sets the region where we will not blend for
|
||||||
* the output.
|
* optimization purposes.
|
||||||
*
|
|
||||||
* Typically a parent container will set the clip region before
|
|
||||||
* painting its children, and then unset it afterwards.
|
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
meta_shaped_texture_set_clip_region (MetaShapedTexture *stex,
|
meta_shaped_texture_set_opaque_region (MetaShapedTexture *stex,
|
||||||
cairo_region_t *clip_region)
|
cairo_region_t *opaque_region)
|
||||||
{
|
{
|
||||||
MetaShapedTexturePrivate *priv;
|
MetaShapedTexturePrivate *priv;
|
||||||
|
|
||||||
@@ -833,16 +820,13 @@ meta_shaped_texture_set_clip_region (MetaShapedTexture *stex,
|
|||||||
|
|
||||||
priv = stex->priv;
|
priv = stex->priv;
|
||||||
|
|
||||||
if (priv->clip_region)
|
if (priv->opaque_region)
|
||||||
{
|
cairo_region_destroy (priv->opaque_region);
|
||||||
cairo_region_destroy (priv->clip_region);
|
|
||||||
priv->clip_region = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (clip_region)
|
if (opaque_region)
|
||||||
priv->clip_region = cairo_region_copy (clip_region);
|
priv->opaque_region = cairo_region_reference (opaque_region);
|
||||||
else
|
else
|
||||||
priv->clip_region = NULL;
|
priv->opaque_region = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -942,3 +926,46 @@ meta_shaped_texture_get_image (MetaShapedTexture *stex,
|
|||||||
|
|
||||||
return surface;
|
return surface;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_shaped_texture_cull_out (MetaCullable *cullable,
|
||||||
|
cairo_region_t *unobscured_region,
|
||||||
|
cairo_region_t *clip_region)
|
||||||
|
{
|
||||||
|
MetaShapedTexture *self = META_SHAPED_TEXTURE (cullable);
|
||||||
|
MetaShapedTexturePrivate *priv = self->priv;
|
||||||
|
|
||||||
|
set_unobscured_region (self, unobscured_region);
|
||||||
|
set_clip_region (self, clip_region);
|
||||||
|
|
||||||
|
if (clutter_actor_get_paint_opacity (CLUTTER_ACTOR (self)) == 0xff)
|
||||||
|
{
|
||||||
|
if (priv->opaque_region)
|
||||||
|
{
|
||||||
|
if (unobscured_region)
|
||||||
|
cairo_region_subtract (unobscured_region, priv->opaque_region);
|
||||||
|
if (clip_region)
|
||||||
|
cairo_region_subtract (clip_region, priv->opaque_region);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_shaped_texture_reset_culling (MetaCullable *cullable)
|
||||||
|
{
|
||||||
|
MetaShapedTexture *self = META_SHAPED_TEXTURE (cullable);
|
||||||
|
set_clip_region (self, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
cullable_iface_init (MetaCullableInterface *iface)
|
||||||
|
{
|
||||||
|
iface->cull_out = meta_shaped_texture_cull_out;
|
||||||
|
iface->reset_culling = meta_shaped_texture_reset_culling;
|
||||||
|
}
|
||||||
|
|
||||||
|
ClutterActor *
|
||||||
|
meta_shaped_texture_new (void)
|
||||||
|
{
|
||||||
|
return g_object_new (META_TYPE_SHAPED_TEXTURE, NULL);
|
||||||
|
}
|
||||||
|
190
src/compositor/meta-surface-actor.c
Normal file
190
src/compositor/meta-surface-actor.c
Normal file
@@ -0,0 +1,190 @@
|
|||||||
|
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SECTION:meta-surface-actor
|
||||||
|
* @title: MetaSurfaceActor
|
||||||
|
* @short_description: An actor representing a surface in the scene graph
|
||||||
|
*
|
||||||
|
* A surface can be either a shaped texture, or a group of shaped texture,
|
||||||
|
* used to draw the content of a window.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
#include <clutter/clutter.h>
|
||||||
|
#include <cogl/cogl-wayland-server.h>
|
||||||
|
#include <cogl/cogl-texture-pixmap-x11.h>
|
||||||
|
#include <meta/meta-shaped-texture.h>
|
||||||
|
#include "meta-surface-actor.h"
|
||||||
|
#include "meta-wayland-private.h"
|
||||||
|
#include "meta-cullable.h"
|
||||||
|
|
||||||
|
#include "meta-shaped-texture-private.h"
|
||||||
|
|
||||||
|
struct _MetaSurfaceActorPrivate
|
||||||
|
{
|
||||||
|
MetaShapedTexture *texture;
|
||||||
|
MetaWaylandBuffer *buffer;
|
||||||
|
};
|
||||||
|
|
||||||
|
static void cullable_iface_init (MetaCullableInterface *iface);
|
||||||
|
|
||||||
|
G_DEFINE_TYPE_WITH_CODE (MetaSurfaceActor, meta_surface_actor, CLUTTER_TYPE_ACTOR,
|
||||||
|
G_IMPLEMENT_INTERFACE (META_TYPE_CULLABLE, cullable_iface_init));
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
meta_surface_actor_get_unobscured_bounds (MetaSurfaceActor *self,
|
||||||
|
cairo_rectangle_int_t *unobscured_bounds)
|
||||||
|
{
|
||||||
|
MetaSurfaceActorPrivate *priv = self->priv;
|
||||||
|
return meta_shaped_texture_get_unobscured_bounds (priv->texture, unobscured_bounds);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_surface_actor_class_init (MetaSurfaceActorClass *klass)
|
||||||
|
{
|
||||||
|
g_type_class_add_private (klass, sizeof (MetaSurfaceActorPrivate));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_surface_actor_cull_out (MetaCullable *cullable,
|
||||||
|
cairo_region_t *unobscured_region,
|
||||||
|
cairo_region_t *clip_region)
|
||||||
|
{
|
||||||
|
meta_cullable_cull_out_children (cullable, unobscured_region, clip_region);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_surface_actor_reset_culling (MetaCullable *cullable)
|
||||||
|
{
|
||||||
|
meta_cullable_reset_culling_children (cullable);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
cullable_iface_init (MetaCullableInterface *iface)
|
||||||
|
{
|
||||||
|
iface->cull_out = meta_surface_actor_cull_out;
|
||||||
|
iface->reset_culling = meta_surface_actor_reset_culling;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_surface_actor_init (MetaSurfaceActor *self)
|
||||||
|
{
|
||||||
|
MetaSurfaceActorPrivate *priv;
|
||||||
|
|
||||||
|
priv = self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
|
||||||
|
META_TYPE_SURFACE_ACTOR,
|
||||||
|
MetaSurfaceActorPrivate);
|
||||||
|
|
||||||
|
priv->texture = META_SHAPED_TEXTURE (meta_shaped_texture_new ());
|
||||||
|
clutter_actor_add_child (CLUTTER_ACTOR (self), CLUTTER_ACTOR (priv->texture));
|
||||||
|
}
|
||||||
|
|
||||||
|
cairo_surface_t *
|
||||||
|
meta_surface_actor_get_image (MetaSurfaceActor *self,
|
||||||
|
cairo_rectangle_int_t *clip)
|
||||||
|
{
|
||||||
|
return meta_shaped_texture_get_image (self->priv->texture, clip);
|
||||||
|
}
|
||||||
|
|
||||||
|
MetaShapedTexture *
|
||||||
|
meta_surface_actor_get_texture (MetaSurfaceActor *self)
|
||||||
|
{
|
||||||
|
return self->priv->texture;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
update_area (MetaSurfaceActor *self,
|
||||||
|
int x, int y, int width, int height)
|
||||||
|
{
|
||||||
|
MetaSurfaceActorPrivate *priv = self->priv;
|
||||||
|
|
||||||
|
if (meta_is_wayland_compositor ())
|
||||||
|
{
|
||||||
|
struct wl_resource *resource = priv->buffer->resource;
|
||||||
|
struct wl_shm_buffer *shm_buffer = wl_shm_buffer_get (resource);
|
||||||
|
|
||||||
|
if (shm_buffer)
|
||||||
|
{
|
||||||
|
CoglTexture2D *texture = COGL_TEXTURE_2D (priv->buffer->texture);
|
||||||
|
cogl_wayland_texture_set_region_from_shm_buffer (texture, x, y, width, height, shm_buffer, x, y, 0, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CoglTexturePixmapX11 *texture = COGL_TEXTURE_PIXMAP_X11 (meta_shaped_texture_get_texture (priv->texture));
|
||||||
|
cogl_texture_pixmap_x11_update_area (texture, x, y, width, height);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
meta_surface_actor_damage_all (MetaSurfaceActor *self)
|
||||||
|
{
|
||||||
|
MetaSurfaceActorPrivate *priv = self->priv;
|
||||||
|
CoglTexture *texture = meta_shaped_texture_get_texture (priv->texture);
|
||||||
|
|
||||||
|
update_area (self, 0, 0, cogl_texture_get_width (texture), cogl_texture_get_height (texture));
|
||||||
|
return meta_shaped_texture_update_area (priv->texture, 0, 0, cogl_texture_get_width (texture), cogl_texture_get_height (texture));
|
||||||
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
meta_surface_actor_damage_area (MetaSurfaceActor *self,
|
||||||
|
int x,
|
||||||
|
int y,
|
||||||
|
int width,
|
||||||
|
int height)
|
||||||
|
{
|
||||||
|
MetaSurfaceActorPrivate *priv = self->priv;
|
||||||
|
|
||||||
|
update_area (self, x, y, width, height);
|
||||||
|
return meta_shaped_texture_update_area (priv->texture, x, y, width, height);
|
||||||
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
meta_surface_actor_is_obscured (MetaSurfaceActor *self)
|
||||||
|
{
|
||||||
|
MetaSurfaceActorPrivate *priv = self->priv;
|
||||||
|
return meta_shaped_texture_is_obscured (priv->texture);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_surface_actor_attach_wayland_buffer (MetaSurfaceActor *self,
|
||||||
|
MetaWaylandBuffer *buffer)
|
||||||
|
{
|
||||||
|
MetaSurfaceActorPrivate *priv = self->priv;
|
||||||
|
priv->buffer = buffer;
|
||||||
|
|
||||||
|
if (buffer)
|
||||||
|
meta_shaped_texture_set_texture (priv->texture, buffer->texture);
|
||||||
|
else
|
||||||
|
meta_shaped_texture_set_texture (priv->texture, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_surface_actor_set_texture (MetaSurfaceActor *self,
|
||||||
|
CoglTexture *texture)
|
||||||
|
{
|
||||||
|
MetaSurfaceActorPrivate *priv = self->priv;
|
||||||
|
meta_shaped_texture_set_texture (priv->texture, texture);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_surface_actor_set_input_region (MetaSurfaceActor *self,
|
||||||
|
cairo_region_t *region)
|
||||||
|
{
|
||||||
|
MetaSurfaceActorPrivate *priv = self->priv;
|
||||||
|
meta_shaped_texture_set_input_shape_region (priv->texture, region);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_surface_actor_set_opaque_region (MetaSurfaceActor *self,
|
||||||
|
cairo_region_t *region)
|
||||||
|
{
|
||||||
|
MetaSurfaceActorPrivate *priv = self->priv;
|
||||||
|
meta_shaped_texture_set_opaque_region (priv->texture, region);
|
||||||
|
}
|
||||||
|
|
||||||
|
MetaSurfaceActor *
|
||||||
|
meta_surface_actor_new (void)
|
||||||
|
{
|
||||||
|
return g_object_new (META_TYPE_SURFACE_ACTOR, NULL);
|
||||||
|
}
|
68
src/compositor/meta-surface-actor.h
Normal file
68
src/compositor/meta-surface-actor.h
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||||
|
|
||||||
|
#ifndef META_SURFACE_ACTOR_PRIVATE_H
|
||||||
|
#define META_SURFACE_ACTOR_PRIVATE_H
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include <meta/meta-shaped-texture.h>
|
||||||
|
#include "meta-wayland-types.h"
|
||||||
|
|
||||||
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
|
#define META_TYPE_SURFACE_ACTOR (meta_surface_actor_get_type())
|
||||||
|
#define META_SURFACE_ACTOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_SURFACE_ACTOR, MetaSurfaceActor))
|
||||||
|
#define META_SURFACE_ACTOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_SURFACE_ACTOR, MetaSurfaceActorClass))
|
||||||
|
#define META_IS_SURFACE_ACTOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_SURFACE_ACTOR))
|
||||||
|
#define META_IS_SURFACE_ACTOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_SURFACE_ACTOR))
|
||||||
|
#define META_SURFACE_ACTOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), META_TYPE_SURFACE_ACTOR, MetaSurfaceActorClass))
|
||||||
|
|
||||||
|
typedef struct _MetaSurfaceActor MetaSurfaceActor;
|
||||||
|
typedef struct _MetaSurfaceActorClass MetaSurfaceActorClass;
|
||||||
|
typedef struct _MetaSurfaceActorPrivate MetaSurfaceActorPrivate;
|
||||||
|
|
||||||
|
struct _MetaSurfaceActorClass
|
||||||
|
{
|
||||||
|
/*< private >*/
|
||||||
|
ClutterActorClass parent_class;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct _MetaSurfaceActor
|
||||||
|
{
|
||||||
|
ClutterActor parent;
|
||||||
|
|
||||||
|
MetaSurfaceActorPrivate *priv;
|
||||||
|
};
|
||||||
|
|
||||||
|
GType meta_surface_actor_get_type (void);
|
||||||
|
|
||||||
|
MetaSurfaceActor *meta_surface_actor_new (void);
|
||||||
|
|
||||||
|
cairo_surface_t *meta_surface_actor_get_image (MetaSurfaceActor *self,
|
||||||
|
cairo_rectangle_int_t *clip);
|
||||||
|
|
||||||
|
MetaShapedTexture *meta_surface_actor_get_texture (MetaSurfaceActor *self);
|
||||||
|
|
||||||
|
gboolean meta_surface_actor_damage_all (MetaSurfaceActor *self);
|
||||||
|
gboolean meta_surface_actor_damage_area (MetaSurfaceActor *self,
|
||||||
|
int x,
|
||||||
|
int y,
|
||||||
|
int width,
|
||||||
|
int height);
|
||||||
|
|
||||||
|
gboolean meta_surface_actor_is_obscured (MetaSurfaceActor *self);
|
||||||
|
gboolean meta_surface_actor_get_unobscured_bounds (MetaSurfaceActor *self,
|
||||||
|
cairo_rectangle_int_t *unobscured_bounds);
|
||||||
|
|
||||||
|
void meta_surface_actor_set_texture (MetaSurfaceActor *self,
|
||||||
|
CoglTexture *texture);
|
||||||
|
void meta_surface_actor_attach_wayland_buffer (MetaSurfaceActor *self,
|
||||||
|
MetaWaylandBuffer *buffer);
|
||||||
|
void meta_surface_actor_set_input_region (MetaSurfaceActor *self,
|
||||||
|
cairo_region_t *region);
|
||||||
|
void meta_surface_actor_set_opaque_region (MetaSurfaceActor *self,
|
||||||
|
cairo_region_t *region);
|
||||||
|
|
||||||
|
G_END_DECLS
|
||||||
|
|
||||||
|
#endif /* META_SURFACE_ACTOR_PRIVATE_H */
|
@@ -18,9 +18,7 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
@@ -28,41 +26,6 @@
|
|||||||
#include <clutter/clutter.h>
|
#include <clutter/clutter.h>
|
||||||
#include "meta-texture-rectangle.h"
|
#include "meta-texture-rectangle.h"
|
||||||
|
|
||||||
CoglTexture *
|
|
||||||
meta_texture_rectangle_new (unsigned int width,
|
|
||||||
unsigned int height,
|
|
||||||
CoglPixelFormat format,
|
|
||||||
CoglPixelFormat internal_format,
|
|
||||||
unsigned int rowstride,
|
|
||||||
const guint8 *data,
|
|
||||||
GError **error)
|
|
||||||
{
|
|
||||||
ClutterBackend *backend =
|
|
||||||
clutter_get_default_backend ();
|
|
||||||
CoglContext *context =
|
|
||||||
clutter_backend_get_cogl_context (backend);
|
|
||||||
CoglTextureRectangle *tex_rect;
|
|
||||||
|
|
||||||
tex_rect = cogl_texture_rectangle_new_with_size (context,
|
|
||||||
width, height,
|
|
||||||
internal_format,
|
|
||||||
error);
|
|
||||||
if (tex_rect == NULL)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
if (data)
|
|
||||||
cogl_texture_set_region (COGL_TEXTURE (tex_rect),
|
|
||||||
0, 0, /* src_x/y */
|
|
||||||
0, 0, /* dst_x/y */
|
|
||||||
width, height, /* dst_width/height */
|
|
||||||
width, height, /* width/height */
|
|
||||||
format,
|
|
||||||
rowstride,
|
|
||||||
data);
|
|
||||||
|
|
||||||
return COGL_TEXTURE (tex_rect);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
texture_rectangle_check_cb (CoglTexture *sub_texture,
|
texture_rectangle_check_cb (CoglTexture *sub_texture,
|
||||||
const float *sub_texture_coords,
|
const float *sub_texture_coords,
|
||||||
|
@@ -18,9 +18,7 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __META_TEXTURE_RECTANGLE_H__
|
#ifndef __META_TEXTURE_RECTANGLE_H__
|
||||||
@@ -30,15 +28,6 @@
|
|||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
CoglTexture *
|
|
||||||
meta_texture_rectangle_new (unsigned int width,
|
|
||||||
unsigned int height,
|
|
||||||
CoglPixelFormat format,
|
|
||||||
CoglPixelFormat internal_format,
|
|
||||||
unsigned int rowstride,
|
|
||||||
const guint8 *data,
|
|
||||||
GError **error);
|
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
meta_texture_rectangle_check (CoglTexture *texture);
|
meta_texture_rectangle_check (CoglTexture *texture);
|
||||||
|
|
||||||
|
@@ -17,9 +17,7 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
@@ -357,18 +355,10 @@ texture_tower_create_texture (MetaTextureTower *tower,
|
|||||||
if ((!is_power_of_two (width) || !is_power_of_two (height)) &&
|
if ((!is_power_of_two (width) || !is_power_of_two (height)) &&
|
||||||
meta_texture_rectangle_check (tower->textures[level - 1]))
|
meta_texture_rectangle_check (tower->textures[level - 1]))
|
||||||
{
|
{
|
||||||
tower->textures[level] =
|
ClutterBackend *backend = clutter_get_default_backend ();
|
||||||
meta_texture_rectangle_new (width, height,
|
CoglContext *context = clutter_backend_get_cogl_context (backend);
|
||||||
/* data format */
|
|
||||||
TEXTURE_FORMAT,
|
tower->textures[level] = cogl_texture_rectangle_new_with_size (context, width, height);
|
||||||
/* internal cogl format */
|
|
||||||
TEXTURE_FORMAT,
|
|
||||||
/* rowstride */
|
|
||||||
width * 4,
|
|
||||||
/* data */
|
|
||||||
NULL,
|
|
||||||
/* error */
|
|
||||||
NULL);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@@ -17,9 +17,7 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __META_TEXTURE_TOWER_H__
|
#ifndef __META_TEXTURE_TOWER_H__
|
||||||
|
@@ -10,6 +10,7 @@
|
|||||||
|
|
||||||
#include <X11/extensions/Xdamage.h>
|
#include <X11/extensions/Xdamage.h>
|
||||||
#include <meta/compositor-mutter.h>
|
#include <meta/compositor-mutter.h>
|
||||||
|
#include "meta-surface-actor.h"
|
||||||
|
|
||||||
MetaWindowActor *meta_window_actor_new (MetaWindow *window);
|
MetaWindowActor *meta_window_actor_new (MetaWindow *window);
|
||||||
|
|
||||||
@@ -30,16 +31,6 @@ void meta_window_actor_unmaximize (MetaWindowActor *self,
|
|||||||
void meta_window_actor_process_x11_damage (MetaWindowActor *self,
|
void meta_window_actor_process_x11_damage (MetaWindowActor *self,
|
||||||
XDamageNotifyEvent *event);
|
XDamageNotifyEvent *event);
|
||||||
|
|
||||||
void meta_window_actor_process_wayland_damage (MetaWindowActor *self,
|
|
||||||
int x,
|
|
||||||
int y,
|
|
||||||
int width,
|
|
||||||
int height);
|
|
||||||
void meta_window_actor_set_wayland_surface (MetaWindowActor *self,
|
|
||||||
MetaWaylandSurface *surface);
|
|
||||||
void meta_window_actor_attach_wayland_buffer (MetaWindowActor *self,
|
|
||||||
MetaWaylandBuffer *buffer);
|
|
||||||
|
|
||||||
void meta_window_actor_pre_paint (MetaWindowActor *self);
|
void meta_window_actor_pre_paint (MetaWindowActor *self);
|
||||||
void meta_window_actor_post_paint (MetaWindowActor *self);
|
void meta_window_actor_post_paint (MetaWindowActor *self);
|
||||||
void meta_window_actor_frame_complete (MetaWindowActor *self,
|
void meta_window_actor_frame_complete (MetaWindowActor *self,
|
||||||
@@ -48,13 +39,13 @@ void meta_window_actor_frame_complete (MetaWindowActor *self,
|
|||||||
|
|
||||||
void meta_window_actor_invalidate_shadow (MetaWindowActor *self);
|
void meta_window_actor_invalidate_shadow (MetaWindowActor *self);
|
||||||
|
|
||||||
void meta_window_actor_set_redirected (MetaWindowActor *self, gboolean state);
|
|
||||||
|
|
||||||
gboolean meta_window_actor_should_unredirect (MetaWindowActor *self);
|
|
||||||
|
|
||||||
void meta_window_actor_get_shape_bounds (MetaWindowActor *self,
|
void meta_window_actor_get_shape_bounds (MetaWindowActor *self,
|
||||||
cairo_rectangle_int_t *bounds);
|
cairo_rectangle_int_t *bounds);
|
||||||
|
|
||||||
|
gboolean meta_window_actor_should_unredirect (MetaWindowActor *self);
|
||||||
|
void meta_window_actor_set_unredirected (MetaWindowActor *self,
|
||||||
|
gboolean unredirected);
|
||||||
|
|
||||||
gboolean meta_window_actor_effect_in_progress (MetaWindowActor *self);
|
gboolean meta_window_actor_effect_in_progress (MetaWindowActor *self);
|
||||||
void meta_window_actor_sync_actor_geometry (MetaWindowActor *self,
|
void meta_window_actor_sync_actor_geometry (MetaWindowActor *self,
|
||||||
gboolean did_placement);
|
gboolean did_placement);
|
||||||
@@ -68,15 +59,9 @@ void meta_window_actor_set_updates_frozen (MetaWindowActor *self,
|
|||||||
void meta_window_actor_queue_frame_drawn (MetaWindowActor *self,
|
void meta_window_actor_queue_frame_drawn (MetaWindowActor *self,
|
||||||
gboolean no_delay_frame);
|
gboolean no_delay_frame);
|
||||||
|
|
||||||
cairo_region_t *meta_window_actor_get_obscured_region (MetaWindowActor *self);
|
|
||||||
|
|
||||||
void meta_window_actor_set_visible_region (MetaWindowActor *self,
|
|
||||||
cairo_region_t *visible_region);
|
|
||||||
void meta_window_actor_set_visible_region_beneath (MetaWindowActor *self,
|
|
||||||
cairo_region_t *beneath_region);
|
|
||||||
void meta_window_actor_reset_visible_regions (MetaWindowActor *self);
|
|
||||||
|
|
||||||
void meta_window_actor_effect_completed (MetaWindowActor *actor,
|
void meta_window_actor_effect_completed (MetaWindowActor *actor,
|
||||||
gulong event);
|
gulong event);
|
||||||
|
|
||||||
|
MetaSurfaceActor *meta_window_actor_get_surface (MetaWindowActor *self);
|
||||||
|
|
||||||
#endif /* META_WINDOW_ACTOR_PRIVATE_H */
|
#endif /* META_WINDOW_ACTOR_PRIVATE_H */
|
||||||
|
File diff suppressed because it is too large
Load Diff
@@ -11,9 +11,8 @@
|
|||||||
#include "compositor-private.h"
|
#include "compositor-private.h"
|
||||||
#include "meta-window-actor-private.h"
|
#include "meta-window-actor-private.h"
|
||||||
#include "meta-window-group.h"
|
#include "meta-window-group.h"
|
||||||
#include "meta-background-actor-private.h"
|
|
||||||
#include "meta-background-group-private.h"
|
|
||||||
#include "window-private.h"
|
#include "window-private.h"
|
||||||
|
#include "meta-cullable.h"
|
||||||
|
|
||||||
struct _MetaWindowGroupClass
|
struct _MetaWindowGroupClass
|
||||||
{
|
{
|
||||||
@@ -27,7 +26,10 @@ struct _MetaWindowGroup
|
|||||||
MetaScreen *screen;
|
MetaScreen *screen;
|
||||||
};
|
};
|
||||||
|
|
||||||
G_DEFINE_TYPE (MetaWindowGroup, meta_window_group, CLUTTER_TYPE_ACTOR);
|
static void cullable_iface_init (MetaCullableInterface *iface);
|
||||||
|
|
||||||
|
G_DEFINE_TYPE_WITH_CODE (MetaWindowGroup, meta_window_group, CLUTTER_TYPE_ACTOR,
|
||||||
|
G_IMPLEMENT_INTERFACE (META_TYPE_CULLABLE, cullable_iface_init));
|
||||||
|
|
||||||
/* Help macros to scale from OpenGL <-1,1> coordinates system to
|
/* Help macros to scale from OpenGL <-1,1> coordinates system to
|
||||||
* window coordinates ranging [0,window-size]. Borrowed from clutter-utils.c
|
* window coordinates ranging [0,window-size]. Borrowed from clutter-utils.c
|
||||||
@@ -87,20 +89,39 @@ painting_untransformed (MetaWindowGroup *window_group,
|
|||||||
return meta_actor_vertices_are_untransformed (vertices, width, height, x_origin, y_origin);
|
return meta_actor_vertices_are_untransformed (vertices, width, height, x_origin, y_origin);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_window_group_cull_out (MetaCullable *cullable,
|
||||||
|
cairo_region_t *unobscured_region,
|
||||||
|
cairo_region_t *clip_region)
|
||||||
|
{
|
||||||
|
meta_cullable_cull_out_children (cullable, unobscured_region, clip_region);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_window_group_reset_culling (MetaCullable *cullable)
|
||||||
|
{
|
||||||
|
meta_cullable_reset_culling_children (cullable);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
cullable_iface_init (MetaCullableInterface *iface)
|
||||||
|
{
|
||||||
|
iface->cull_out = meta_window_group_cull_out;
|
||||||
|
iface->reset_culling = meta_window_group_reset_culling;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_window_group_paint (ClutterActor *actor)
|
meta_window_group_paint (ClutterActor *actor)
|
||||||
{
|
{
|
||||||
cairo_region_t *visible_region;
|
cairo_region_t *clip_region;
|
||||||
ClutterActor *stage;
|
cairo_region_t *unobscured_region;
|
||||||
ClutterActorIter iter;
|
cairo_rectangle_int_t visible_rect, clip_rect;
|
||||||
ClutterActor *child;
|
int paint_x_offset, paint_y_offset;
|
||||||
cairo_rectangle_int_t visible_rect;
|
|
||||||
int paint_x_origin, paint_y_origin;
|
int paint_x_origin, paint_y_origin;
|
||||||
int actor_x_origin, actor_y_origin;
|
int actor_x_origin, actor_y_origin;
|
||||||
int paint_x_offset, paint_y_offset;
|
|
||||||
|
|
||||||
MetaWindowGroup *window_group = META_WINDOW_GROUP (actor);
|
MetaWindowGroup *window_group = META_WINDOW_GROUP (actor);
|
||||||
MetaCompScreen *info;
|
ClutterActor *stage = clutter_actor_get_stage (actor);
|
||||||
|
|
||||||
/* Normally we expect an actor to be drawn at it's position on the screen.
|
/* Normally we expect an actor to be drawn at it's position on the screen.
|
||||||
* However, if we're inside the paint of a ClutterClone, that won't be the
|
* However, if we're inside the paint of a ClutterClone, that won't be the
|
||||||
@@ -122,8 +143,11 @@ meta_window_group_paint (ClutterActor *actor)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
paint_x_offset = paint_x_origin - actor_x_origin;
|
visible_rect.x = visible_rect.y = 0;
|
||||||
paint_y_offset = paint_y_origin - actor_y_origin;
|
visible_rect.width = clutter_actor_get_width (CLUTTER_ACTOR (stage));
|
||||||
|
visible_rect.height = clutter_actor_get_height (CLUTTER_ACTOR (stage));
|
||||||
|
|
||||||
|
unobscured_region = cairo_region_create_rectangle (&visible_rect);
|
||||||
|
|
||||||
/* Get the clipped redraw bounds from Clutter so that we can avoid
|
/* Get the clipped redraw bounds from Clutter so that we can avoid
|
||||||
* painting shadows on windows that don't need to be painted in this
|
* painting shadows on windows that don't need to be painted in this
|
||||||
@@ -131,142 +155,62 @@ meta_window_group_paint (ClutterActor *actor)
|
|||||||
* sizes, we could intersect this with an accurate union of the
|
* sizes, we could intersect this with an accurate union of the
|
||||||
* monitors to avoid painting shadows that are visible only in the
|
* monitors to avoid painting shadows that are visible only in the
|
||||||
* holes. */
|
* holes. */
|
||||||
stage = clutter_actor_get_stage (actor);
|
|
||||||
clutter_stage_get_redraw_clip_bounds (CLUTTER_STAGE (stage),
|
clutter_stage_get_redraw_clip_bounds (CLUTTER_STAGE (stage),
|
||||||
&visible_rect);
|
&clip_rect);
|
||||||
|
|
||||||
visible_region = cairo_region_create_rectangle (&visible_rect);
|
clip_region = cairo_region_create_rectangle (&clip_rect);
|
||||||
|
|
||||||
|
paint_x_offset = paint_x_origin - actor_x_origin;
|
||||||
|
paint_y_offset = paint_y_origin - actor_y_origin;
|
||||||
|
cairo_region_translate (clip_region, -paint_x_offset, -paint_y_offset);
|
||||||
|
|
||||||
if (!meta_is_wayland_compositor ())
|
if (!meta_is_wayland_compositor ())
|
||||||
{
|
{
|
||||||
info = meta_screen_get_compositor_data (window_group->screen);
|
MetaCompScreen *info = meta_screen_get_compositor_data (window_group->screen);
|
||||||
if (info->unredirected_window != NULL)
|
if (info->unredirected_window != NULL)
|
||||||
{
|
{
|
||||||
cairo_rectangle_int_t unredirected_rect;
|
cairo_rectangle_int_t unredirected_rect;
|
||||||
MetaWindow *window = meta_window_actor_get_meta_window (info->unredirected_window);
|
|
||||||
|
|
||||||
meta_window_get_outer_rect (window, (MetaRectangle *)&unredirected_rect);
|
meta_window_get_frame_rect (info->unredirected_window, (MetaRectangle *)&unredirected_rect);
|
||||||
cairo_region_subtract_rectangle (visible_region, &unredirected_rect);
|
cairo_region_subtract_rectangle (unobscured_region, &unredirected_rect);
|
||||||
|
cairo_region_subtract_rectangle (clip_region, &unredirected_rect);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We walk the list from top to bottom (opposite of painting order),
|
meta_cullable_cull_out (META_CULLABLE (window_group), unobscured_region, clip_region);
|
||||||
* and subtract the opaque area of each window out of the visible
|
|
||||||
* region that we pass to the windows below.
|
|
||||||
*/
|
|
||||||
clutter_actor_iter_init (&iter, actor);
|
|
||||||
while (clutter_actor_iter_prev (&iter, &child))
|
|
||||||
{
|
|
||||||
if (!CLUTTER_ACTOR_IS_VISIBLE (child))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (!meta_is_wayland_compositor () &&
|
cairo_region_destroy (unobscured_region);
|
||||||
info->unredirected_window != NULL &&
|
cairo_region_destroy (clip_region);
|
||||||
child == CLUTTER_ACTOR (info->unredirected_window))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
/* If an actor has effects applied, then that can change the area
|
|
||||||
* it paints and the opacity, so we no longer can figure out what
|
|
||||||
* portion of the actor is obscured and what portion of the screen
|
|
||||||
* it obscures, so we skip the actor.
|
|
||||||
*
|
|
||||||
* This has a secondary beneficial effect: if a ClutterOffscreenEffect
|
|
||||||
* is applied to an actor, then our clipped redraws interfere with the
|
|
||||||
* caching of the FBO - even if we only need to draw a small portion
|
|
||||||
* of the window right now, ClutterOffscreenEffect may use other portions
|
|
||||||
* of the FBO later. So, skipping actors with effects applied also
|
|
||||||
* prevents these bugs.
|
|
||||||
*
|
|
||||||
* Theoretically, we should check clutter_actor_get_offscreen_redirect()
|
|
||||||
* as well for the same reason, but omitted for simplicity in the
|
|
||||||
* hopes that no-one will do that.
|
|
||||||
*/
|
|
||||||
if (clutter_actor_has_effects (child))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (META_IS_WINDOW_ACTOR (child))
|
|
||||||
{
|
|
||||||
MetaWindow *meta_window;
|
|
||||||
MetaWindowActor *window_actor = META_WINDOW_ACTOR (child);
|
|
||||||
int x, y;
|
|
||||||
|
|
||||||
if (!meta_actor_is_untransformed (CLUTTER_ACTOR (window_actor), &x, &y))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
x += paint_x_offset;
|
|
||||||
y += paint_y_offset;
|
|
||||||
|
|
||||||
/* Temporarily move to the coordinate system of the actor */
|
|
||||||
cairo_region_translate (visible_region, - x, - y);
|
|
||||||
|
|
||||||
meta_window_actor_set_visible_region (window_actor, visible_region);
|
|
||||||
|
|
||||||
/* TODO: Track the opaque regions of wayland clients.
|
|
||||||
* Although wayland clients can report opaque window
|
|
||||||
* regions, for now we assume that all wayland clients are
|
|
||||||
* transparent... */
|
|
||||||
meta_window = meta_window_actor_get_meta_window (window_actor);
|
|
||||||
|
|
||||||
if (meta_window->client_type != META_WINDOW_CLIENT_TYPE_WAYLAND &&
|
|
||||||
clutter_actor_get_paint_opacity (CLUTTER_ACTOR (window_actor)) == 0xff)
|
|
||||||
{
|
|
||||||
cairo_region_t *obscured_region = meta_window_actor_get_obscured_region (window_actor);
|
|
||||||
if (obscured_region)
|
|
||||||
cairo_region_subtract (visible_region, obscured_region);
|
|
||||||
}
|
|
||||||
|
|
||||||
meta_window_actor_set_visible_region_beneath (window_actor, visible_region);
|
|
||||||
cairo_region_translate (visible_region, x, y);
|
|
||||||
}
|
|
||||||
else if (META_IS_BACKGROUND_ACTOR (child) ||
|
|
||||||
META_IS_BACKGROUND_GROUP (child))
|
|
||||||
{
|
|
||||||
int x, y;
|
|
||||||
|
|
||||||
if (!meta_actor_is_untransformed (child, &x, &y))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
x += paint_x_offset;
|
|
||||||
y += paint_y_offset;
|
|
||||||
|
|
||||||
cairo_region_translate (visible_region, - x, - y);
|
|
||||||
|
|
||||||
if (META_IS_BACKGROUND_GROUP (child))
|
|
||||||
meta_background_group_set_visible_region (META_BACKGROUND_GROUP (child), visible_region);
|
|
||||||
else
|
|
||||||
meta_background_actor_set_visible_region (META_BACKGROUND_ACTOR (child), visible_region);
|
|
||||||
cairo_region_translate (visible_region, x, y);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
cairo_region_destroy (visible_region);
|
|
||||||
|
|
||||||
CLUTTER_ACTOR_CLASS (meta_window_group_parent_class)->paint (actor);
|
CLUTTER_ACTOR_CLASS (meta_window_group_parent_class)->paint (actor);
|
||||||
|
|
||||||
/* Now that we are done painting, unset the visible regions (they will
|
meta_cullable_reset_culling (META_CULLABLE (window_group));
|
||||||
* mess up painting clones of our actors)
|
|
||||||
*/
|
|
||||||
clutter_actor_iter_init (&iter, actor);
|
|
||||||
while (clutter_actor_iter_next (&iter, &child))
|
|
||||||
{
|
|
||||||
if (META_IS_WINDOW_ACTOR (child))
|
|
||||||
{
|
|
||||||
MetaWindowActor *window_actor = META_WINDOW_ACTOR (child);
|
|
||||||
meta_window_actor_reset_visible_regions (window_actor);
|
|
||||||
}
|
|
||||||
else if (META_IS_BACKGROUND_ACTOR (child))
|
|
||||||
{
|
|
||||||
MetaBackgroundActor *background_actor = META_BACKGROUND_ACTOR (child);
|
|
||||||
meta_background_actor_set_visible_region (background_actor, NULL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Adapted from clutter_actor_update_default_paint_volume() */
|
||||||
static gboolean
|
static gboolean
|
||||||
meta_window_group_get_paint_volume (ClutterActor *actor,
|
meta_window_group_get_paint_volume (ClutterActor *self,
|
||||||
ClutterPaintVolume *volume)
|
ClutterPaintVolume *volume)
|
||||||
{
|
{
|
||||||
return clutter_paint_volume_set_from_allocation (volume, actor);
|
ClutterActorIter iter;
|
||||||
|
ClutterActor *child;
|
||||||
|
|
||||||
|
clutter_actor_iter_init (&iter, self);
|
||||||
|
while (clutter_actor_iter_next (&iter, &child))
|
||||||
|
{
|
||||||
|
const ClutterPaintVolume *child_volume;
|
||||||
|
|
||||||
|
if (!CLUTTER_ACTOR_IS_MAPPED (child))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
child_volume = clutter_actor_get_transformed_paint_volume (child, self);
|
||||||
|
if (child_volume == NULL)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
clutter_paint_volume_union (volume, child_volume);
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@@ -11,29 +11,9 @@
|
|||||||
* MetaWindowGroup:
|
* MetaWindowGroup:
|
||||||
*
|
*
|
||||||
* This class is a subclass of ClutterActor with special handling for
|
* This class is a subclass of ClutterActor with special handling for
|
||||||
* MetaWindowActor/MetaBackgroundActor/MetaBackgroundGroup when painting
|
* #MetaCullable when painting children. It uses code similar to
|
||||||
* children.
|
* meta_cullable_cull_out_children(), but also has additional special
|
||||||
*
|
* cases for the undirected window, and similar.
|
||||||
* When we are painting a stack of 5-10 maximized windows, the
|
|
||||||
* standard bottom-to-top method of drawing every actor results in a
|
|
||||||
* tremendous amount of overdraw and can easily max out the available
|
|
||||||
* memory bandwidth on a low-end graphics chipset. It's even worse if
|
|
||||||
* window textures are being accessed over the AGP bus.
|
|
||||||
*
|
|
||||||
* The basic technique applied here is to do a pre-pass before painting
|
|
||||||
* where we walk window from top to bottom and compute the visible area
|
|
||||||
* at each step by subtracting out the windows above it. The visible
|
|
||||||
* area is passed to MetaWindowActor which uses it to clip the portion of
|
|
||||||
* the window which drawn and avoid redrawing the shadow if it is completely
|
|
||||||
* obscured.
|
|
||||||
*
|
|
||||||
* A caveat is that this is ineffective if applications are using ARGB
|
|
||||||
* visuals, since we have no way of knowing whether a window obscures
|
|
||||||
* the windows behind it or not. Alternate approaches using the depth
|
|
||||||
* or stencil buffer rather than client side regions might be able to
|
|
||||||
* handle alpha windows, but the combination of glAlphaFunc and stenciling
|
|
||||||
* tends not to be efficient except on newer cards. (And on newer cards
|
|
||||||
* we have lots of memory and bandwidth.)
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define META_TYPE_WINDOW_GROUP (meta_window_group_get_type ())
|
#define META_TYPE_WINDOW_GROUP (meta_window_group_get_type ())
|
||||||
|
@@ -17,9 +17,7 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*/
|
*/
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
@@ -17,9 +17,7 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __META_WINDOW_SHAPE_H__
|
#ifndef __META_WINDOW_SHAPE_H__
|
||||||
|
@@ -16,26 +16,23 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
#include <meta/meta-plugin.h>
|
#include <meta/meta-plugin.h>
|
||||||
#include <meta/window.h>
|
#include <meta/window.h>
|
||||||
#include <meta/util.h>
|
|
||||||
#include <meta/meta-background-group.h>
|
#include <meta/meta-background-group.h>
|
||||||
#include <meta/meta-background-actor.h>
|
#include <meta/meta-background-actor.h>
|
||||||
|
#include <meta/util.h>
|
||||||
#include <libintl.h>
|
#include <glib/gi18n-lib.h>
|
||||||
#define _(x) dgettext (GETTEXT_PACKAGE, x)
|
|
||||||
#define N_(x) x
|
|
||||||
|
|
||||||
#include <clutter/clutter.h>
|
#include <clutter/clutter.h>
|
||||||
#include <gmodule.h>
|
#include <gmodule.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#define DESTROY_TIMEOUT 250
|
#define DESTROY_TIMEOUT 100
|
||||||
#define MINIMIZE_TIMEOUT 250
|
#define MINIMIZE_TIMEOUT 250
|
||||||
#define MAXIMIZE_TIMEOUT 250
|
#define MAXIMIZE_TIMEOUT 250
|
||||||
#define MAP_TIMEOUT 250
|
#define MAP_TIMEOUT 250
|
||||||
@@ -292,26 +289,13 @@ on_switch_workspace_effect_complete (ClutterTimeline *timeline, gpointer data)
|
|||||||
meta_plugin_switch_workspace_completed (plugin);
|
meta_plugin_switch_workspace_completed (plugin);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
|
||||||
show_stage (MetaPlugin *plugin)
|
|
||||||
{
|
|
||||||
MetaScreen *screen;
|
|
||||||
ClutterActor *stage;
|
|
||||||
|
|
||||||
screen = meta_plugin_get_screen (plugin);
|
|
||||||
stage = meta_get_stage_for_screen (screen);
|
|
||||||
|
|
||||||
clutter_actor_show (stage);
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
on_monitors_changed (MetaScreen *screen,
|
on_monitors_changed (MetaScreen *screen,
|
||||||
MetaPlugin *plugin)
|
MetaPlugin *plugin)
|
||||||
{
|
{
|
||||||
MetaDefaultPlugin *self = META_DEFAULT_PLUGIN (plugin);
|
MetaDefaultPlugin *self = META_DEFAULT_PLUGIN (plugin);
|
||||||
int i, n;
|
int i, n;
|
||||||
|
GRand *rand = g_rand_new_with_seed (12345);
|
||||||
|
|
||||||
clutter_actor_destroy_all_children (self->priv->background_group);
|
clutter_actor_destroy_all_children (self->priv->background_group);
|
||||||
|
|
||||||
@@ -334,14 +318,16 @@ on_monitors_changed (MetaScreen *screen,
|
|||||||
reproducible.
|
reproducible.
|
||||||
*/
|
*/
|
||||||
clutter_color_init (&color,
|
clutter_color_init (&color,
|
||||||
g_random_int () % 255,
|
g_rand_int_range (rand, 0, 255),
|
||||||
g_random_int () % 255,
|
g_rand_int_range (rand, 0, 255),
|
||||||
g_random_int () % 255,
|
g_rand_int_range (rand, 0, 255),
|
||||||
255);
|
255);
|
||||||
clutter_actor_set_background_color (background, &color);
|
clutter_actor_set_background_color (background, &color);
|
||||||
|
|
||||||
clutter_actor_add_child (self->priv->background_group, background);
|
clutter_actor_add_child (self->priv->background_group, background);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g_rand_free (rand);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -358,10 +344,7 @@ start (MetaPlugin *plugin)
|
|||||||
G_CALLBACK (on_monitors_changed), plugin);
|
G_CALLBACK (on_monitors_changed), plugin);
|
||||||
on_monitors_changed (screen, plugin);
|
on_monitors_changed (screen, plugin);
|
||||||
|
|
||||||
meta_later_add (META_LATER_BEFORE_REDRAW,
|
clutter_actor_show (meta_get_stage_for_screen (screen));
|
||||||
(GSourceFunc) show_stage,
|
|
||||||
plugin,
|
|
||||||
NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -410,9 +393,11 @@ switch_workspace (MetaPlugin *plugin,
|
|||||||
MetaWindowActor *window_actor = l->data;
|
MetaWindowActor *window_actor = l->data;
|
||||||
ActorPrivate *apriv = get_actor_private (window_actor);
|
ActorPrivate *apriv = get_actor_private (window_actor);
|
||||||
ClutterActor *actor = CLUTTER_ACTOR (window_actor);
|
ClutterActor *actor = CLUTTER_ACTOR (window_actor);
|
||||||
|
MetaWorkspace *workspace;
|
||||||
gint win_workspace;
|
gint win_workspace;
|
||||||
|
|
||||||
win_workspace = meta_window_actor_get_workspace (window_actor);
|
workspace = meta_window_get_workspace (meta_window_actor_get_meta_window (window_actor));
|
||||||
|
win_workspace = meta_workspace_index (workspace);
|
||||||
|
|
||||||
if (win_workspace == to || win_workspace == from)
|
if (win_workspace == to || win_workspace == from)
|
||||||
{
|
{
|
||||||
@@ -484,8 +469,6 @@ on_minimize_effect_complete (ClutterTimeline *timeline, EffectCompleteData *data
|
|||||||
/* FIXME - we shouldn't assume the original scale, it should be saved
|
/* FIXME - we shouldn't assume the original scale, it should be saved
|
||||||
* at the start of the effect */
|
* at the start of the effect */
|
||||||
clutter_actor_set_scale (data->actor, 1.0, 1.0);
|
clutter_actor_set_scale (data->actor, 1.0, 1.0);
|
||||||
clutter_actor_move_anchor_point_from_gravity (data->actor,
|
|
||||||
CLUTTER_GRAVITY_NORTH_WEST);
|
|
||||||
|
|
||||||
/* Now notify the manager that we are done with this effect */
|
/* Now notify the manager that we are done with this effect */
|
||||||
meta_plugin_minimize_completed (plugin, window_actor);
|
meta_plugin_minimize_completed (plugin, window_actor);
|
||||||
@@ -522,9 +505,6 @@ minimize (MetaPlugin *plugin, MetaWindowActor *window_actor)
|
|||||||
|
|
||||||
apriv->is_minimized = TRUE;
|
apriv->is_minimized = TRUE;
|
||||||
|
|
||||||
clutter_actor_move_anchor_point_from_gravity (actor,
|
|
||||||
CLUTTER_GRAVITY_CENTER);
|
|
||||||
|
|
||||||
animation = clutter_actor_animate (actor,
|
animation = clutter_actor_animate (actor,
|
||||||
CLUTTER_EASE_IN_SINE,
|
CLUTTER_EASE_IN_SINE,
|
||||||
MINIMIZE_TIMEOUT,
|
MINIMIZE_TIMEOUT,
|
||||||
@@ -563,8 +543,6 @@ on_maximize_effect_complete (ClutterTimeline *timeline, EffectCompleteData *data
|
|||||||
|
|
||||||
/* FIXME - don't assume the original scale was 1.0 */
|
/* FIXME - don't assume the original scale was 1.0 */
|
||||||
clutter_actor_set_scale (data->actor, 1.0, 1.0);
|
clutter_actor_set_scale (data->actor, 1.0, 1.0);
|
||||||
clutter_actor_move_anchor_point_from_gravity (data->actor,
|
|
||||||
CLUTTER_GRAVITY_NORTH_WEST);
|
|
||||||
|
|
||||||
/* Now notify the manager that we are done with this effect */
|
/* Now notify the manager that we are done with this effect */
|
||||||
meta_plugin_maximize_completed (plugin, window_actor);
|
meta_plugin_maximize_completed (plugin, window_actor);
|
||||||
@@ -589,10 +567,8 @@ maximize (MetaPlugin *plugin,
|
|||||||
ClutterActor *actor = CLUTTER_ACTOR (window_actor);
|
ClutterActor *actor = CLUTTER_ACTOR (window_actor);
|
||||||
MetaWindow *meta_window = meta_window_actor_get_meta_window (window_actor);
|
MetaWindow *meta_window = meta_window_actor_get_meta_window (window_actor);
|
||||||
|
|
||||||
gdouble scale_x = 1.0;
|
gdouble scale_x = 1.0;
|
||||||
gdouble scale_y = 1.0;
|
gdouble scale_y = 1.0;
|
||||||
gfloat anchor_x = 0;
|
|
||||||
gfloat anchor_y = 0;
|
|
||||||
|
|
||||||
type = meta_window_get_window_type (meta_window);
|
type = meta_window_get_window_type (meta_window);
|
||||||
|
|
||||||
@@ -616,13 +592,6 @@ maximize (MetaPlugin *plugin,
|
|||||||
scale_x = (gdouble)end_width / (gdouble) width;
|
scale_x = (gdouble)end_width / (gdouble) width;
|
||||||
scale_y = (gdouble)end_height / (gdouble) height;
|
scale_y = (gdouble)end_height / (gdouble) height;
|
||||||
|
|
||||||
anchor_x = (gdouble)(x - end_x)*(gdouble)width /
|
|
||||||
((gdouble)(end_width - width));
|
|
||||||
anchor_y = (gdouble)(y - end_y)*(gdouble)height /
|
|
||||||
((gdouble)(end_height - height));
|
|
||||||
|
|
||||||
clutter_actor_move_anchor_point (actor, anchor_x, anchor_y);
|
|
||||||
|
|
||||||
animation = clutter_actor_animate (actor,
|
animation = clutter_actor_animate (actor,
|
||||||
CLUTTER_EASE_IN_SINE,
|
CLUTTER_EASE_IN_SINE,
|
||||||
MAXIMIZE_TIMEOUT,
|
MAXIMIZE_TIMEOUT,
|
||||||
@@ -677,9 +646,6 @@ on_map_effect_complete (ClutterTimeline *timeline, EffectCompleteData *data)
|
|||||||
|
|
||||||
apriv->tml_map = NULL;
|
apriv->tml_map = NULL;
|
||||||
|
|
||||||
clutter_actor_move_anchor_point_from_gravity (data->actor,
|
|
||||||
CLUTTER_GRAVITY_NORTH_WEST);
|
|
||||||
|
|
||||||
/* Now notify the manager that we are done with this effect */
|
/* Now notify the manager that we are done with this effect */
|
||||||
meta_plugin_map_completed (plugin, window_actor);
|
meta_plugin_map_completed (plugin, window_actor);
|
||||||
|
|
||||||
@@ -705,15 +671,15 @@ map (MetaPlugin *plugin, MetaWindowActor *window_actor)
|
|||||||
EffectCompleteData *data = g_new0 (EffectCompleteData, 1);
|
EffectCompleteData *data = g_new0 (EffectCompleteData, 1);
|
||||||
ActorPrivate *apriv = get_actor_private (window_actor);
|
ActorPrivate *apriv = get_actor_private (window_actor);
|
||||||
|
|
||||||
clutter_actor_move_anchor_point_from_gravity (actor,
|
clutter_actor_set_pivot_point (actor, 0.5, 0.5);
|
||||||
CLUTTER_GRAVITY_CENTER);
|
clutter_actor_set_opacity (actor, 0);
|
||||||
|
clutter_actor_set_scale (actor, 0.5, 0.5);
|
||||||
clutter_actor_set_scale (actor, 0.0, 0.0);
|
|
||||||
clutter_actor_show (actor);
|
clutter_actor_show (actor);
|
||||||
|
|
||||||
animation = clutter_actor_animate (actor,
|
animation = clutter_actor_animate (actor,
|
||||||
CLUTTER_EASE_IN_SINE,
|
CLUTTER_EASE_OUT_QUAD,
|
||||||
MAP_TIMEOUT,
|
MAP_TIMEOUT,
|
||||||
|
"opacity", 255,
|
||||||
"scale-x", 1.0,
|
"scale-x", 1.0,
|
||||||
"scale-y", 1.0,
|
"scale-y", 1.0,
|
||||||
NULL);
|
NULL);
|
||||||
@@ -765,14 +731,12 @@ destroy (MetaPlugin *plugin, MetaWindowActor *window_actor)
|
|||||||
EffectCompleteData *data = g_new0 (EffectCompleteData, 1);
|
EffectCompleteData *data = g_new0 (EffectCompleteData, 1);
|
||||||
ActorPrivate *apriv = get_actor_private (window_actor);
|
ActorPrivate *apriv = get_actor_private (window_actor);
|
||||||
|
|
||||||
clutter_actor_move_anchor_point_from_gravity (actor,
|
|
||||||
CLUTTER_GRAVITY_CENTER);
|
|
||||||
|
|
||||||
animation = clutter_actor_animate (actor,
|
animation = clutter_actor_animate (actor,
|
||||||
CLUTTER_EASE_IN_SINE,
|
CLUTTER_EASE_OUT_QUAD,
|
||||||
DESTROY_TIMEOUT,
|
DESTROY_TIMEOUT,
|
||||||
"scale-x", 0.0,
|
"opacity", 0,
|
||||||
"scale-y", 1.0,
|
"scale-x", 0.8,
|
||||||
|
"scale-y", 0.8,
|
||||||
NULL);
|
NULL);
|
||||||
apriv->tml_destroy = clutter_animation_get_timeline (animation);
|
apriv->tml_destroy = clutter_animation_get_timeline (animation);
|
||||||
data->plugin = plugin;
|
data->plugin = plugin;
|
||||||
|
@@ -15,9 +15,7 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "region-utils.h"
|
#include "region-utils.h"
|
||||||
|
@@ -15,9 +15,7 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __META_REGION_UTILS_H__
|
#ifndef __META_REGION_UTILS_H__
|
||||||
|
@@ -15,9 +15,7 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* The standard cycle-windows keybinding should be the key above the
|
/* The standard cycle-windows keybinding should be the key above the
|
||||||
|
@@ -366,11 +366,25 @@ meta_barrier_fire_event (MetaBarrier *barrier,
|
|||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
meta_display_process_barrier_event (MetaDisplay *display,
|
meta_display_process_barrier_event (MetaDisplay *display,
|
||||||
XIBarrierEvent *xev)
|
XIEvent *event)
|
||||||
{
|
{
|
||||||
MetaBarrier *barrier;
|
MetaBarrier *barrier;
|
||||||
|
XIBarrierEvent *xev;
|
||||||
|
|
||||||
|
if (event == NULL)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
switch (event->evtype)
|
||||||
|
{
|
||||||
|
case XI_BarrierHit:
|
||||||
|
case XI_BarrierLeave:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
xev = (XIBarrierEvent *) event;
|
||||||
barrier = g_hash_table_lookup (display->xids, &xev->barrier);
|
barrier = g_hash_table_lookup (display->xids, &xev->barrier);
|
||||||
if (barrier != NULL)
|
if (barrier != NULL)
|
||||||
{
|
{
|
||||||
|
@@ -17,9 +17,7 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -53,6 +51,7 @@
|
|||||||
#include "bell.h"
|
#include "bell.h"
|
||||||
#include "screen-private.h"
|
#include "screen-private.h"
|
||||||
#include "window-private.h"
|
#include "window-private.h"
|
||||||
|
#include "util-private.h"
|
||||||
#include <meta/prefs.h>
|
#include <meta/prefs.h>
|
||||||
#include <meta/compositor.h>
|
#include <meta/compositor.h>
|
||||||
#ifdef HAVE_LIBCANBERRA
|
#ifdef HAVE_LIBCANBERRA
|
||||||
|
@@ -14,9 +14,7 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <X11/Xlib.h>
|
#include <X11/Xlib.h>
|
||||||
|
@@ -16,9 +16,7 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef META_BOXES_PRIVATE_H
|
#ifndef META_BOXES_PRIVATE_H
|
||||||
|
@@ -25,9 +25,7 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "boxes-private.h"
|
#include "boxes-private.h"
|
||||||
|
@@ -18,9 +18,7 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
@@ -118,8 +116,6 @@ typedef struct
|
|||||||
{
|
{
|
||||||
MetaRectangle orig;
|
MetaRectangle orig;
|
||||||
MetaRectangle current;
|
MetaRectangle current;
|
||||||
MetaFrameBorders *borders;
|
|
||||||
gboolean must_free_borders;
|
|
||||||
ActionType action_type;
|
ActionType action_type;
|
||||||
gboolean is_user_action;
|
gboolean is_user_action;
|
||||||
|
|
||||||
@@ -195,7 +191,6 @@ static gboolean constrain_partially_onscreen (MetaWindow *window,
|
|||||||
|
|
||||||
static void setup_constraint_info (ConstraintInfo *info,
|
static void setup_constraint_info (ConstraintInfo *info,
|
||||||
MetaWindow *window,
|
MetaWindow *window,
|
||||||
MetaFrameBorders *orig_borders,
|
|
||||||
MetaMoveResizeFlags flags,
|
MetaMoveResizeFlags flags,
|
||||||
int resize_gravity,
|
int resize_gravity,
|
||||||
const MetaRectangle *orig,
|
const MetaRectangle *orig,
|
||||||
@@ -204,13 +199,12 @@ static void place_window_if_needed (MetaWindow *window,
|
|||||||
ConstraintInfo *info);
|
ConstraintInfo *info);
|
||||||
static void update_onscreen_requirements (MetaWindow *window,
|
static void update_onscreen_requirements (MetaWindow *window,
|
||||||
ConstraintInfo *info);
|
ConstraintInfo *info);
|
||||||
static void extend_by_frame (MetaRectangle *rect,
|
static void extend_by_frame (MetaWindow *window,
|
||||||
const MetaFrameBorders *borders);
|
MetaRectangle *rect);
|
||||||
static void unextend_by_frame (MetaRectangle *rect,
|
static void unextend_by_frame (MetaWindow *window,
|
||||||
const MetaFrameBorders *borders);
|
MetaRectangle *rect);
|
||||||
static inline void get_size_limits (const MetaWindow *window,
|
static inline void get_size_limits (MetaWindow *window,
|
||||||
const MetaFrameBorders *borders,
|
gboolean include_frame,
|
||||||
gboolean include_frame,
|
|
||||||
MetaRectangle *min_size,
|
MetaRectangle *min_size,
|
||||||
MetaRectangle *max_size);
|
MetaRectangle *max_size);
|
||||||
|
|
||||||
@@ -280,7 +274,6 @@ do_all_constraints (MetaWindow *window,
|
|||||||
|
|
||||||
void
|
void
|
||||||
meta_window_constrain (MetaWindow *window,
|
meta_window_constrain (MetaWindow *window,
|
||||||
MetaFrameBorders *orig_borders,
|
|
||||||
MetaMoveResizeFlags flags,
|
MetaMoveResizeFlags flags,
|
||||||
int resize_gravity,
|
int resize_gravity,
|
||||||
const MetaRectangle *orig,
|
const MetaRectangle *orig,
|
||||||
@@ -303,7 +296,6 @@ meta_window_constrain (MetaWindow *window,
|
|||||||
|
|
||||||
setup_constraint_info (&info,
|
setup_constraint_info (&info,
|
||||||
window,
|
window,
|
||||||
orig_borders,
|
|
||||||
flags,
|
flags,
|
||||||
resize_gravity,
|
resize_gravity,
|
||||||
orig,
|
orig,
|
||||||
@@ -333,19 +325,11 @@ meta_window_constrain (MetaWindow *window,
|
|||||||
* if this was a user move or user move-and-resize operation.
|
* if this was a user move or user move-and-resize operation.
|
||||||
*/
|
*/
|
||||||
update_onscreen_requirements (window, &info);
|
update_onscreen_requirements (window, &info);
|
||||||
|
|
||||||
/* Ew, what an ugly way to do things. Destructors (in a real OOP language,
|
|
||||||
* not gobject-style--gobject would be more pain than it's worth) or
|
|
||||||
* smart pointers would be so much nicer here. *shrug*
|
|
||||||
*/
|
|
||||||
if (info.must_free_borders)
|
|
||||||
g_free (info.borders);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
setup_constraint_info (ConstraintInfo *info,
|
setup_constraint_info (ConstraintInfo *info,
|
||||||
MetaWindow *window,
|
MetaWindow *window,
|
||||||
MetaFrameBorders *orig_borders,
|
|
||||||
MetaMoveResizeFlags flags,
|
MetaMoveResizeFlags flags,
|
||||||
int resize_gravity,
|
int resize_gravity,
|
||||||
const MetaRectangle *orig,
|
const MetaRectangle *orig,
|
||||||
@@ -357,18 +341,6 @@ setup_constraint_info (ConstraintInfo *info,
|
|||||||
info->orig = *orig;
|
info->orig = *orig;
|
||||||
info->current = *new;
|
info->current = *new;
|
||||||
|
|
||||||
/* Create a fake frame geometry if none really exists */
|
|
||||||
if (orig_borders && !window->fullscreen)
|
|
||||||
{
|
|
||||||
info->borders = orig_borders;
|
|
||||||
info->must_free_borders = FALSE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
info->borders = g_new0 (MetaFrameBorders, 1);
|
|
||||||
info->must_free_borders = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (flags & META_IS_MOVE_ACTION && flags & META_IS_RESIZE_ACTION)
|
if (flags & META_IS_MOVE_ACTION && flags & META_IS_RESIZE_ACTION)
|
||||||
info->action_type = ACTION_MOVE_AND_RESIZE;
|
info->action_type = ACTION_MOVE_AND_RESIZE;
|
||||||
else if (flags & META_IS_RESIZE_ACTION)
|
else if (flags & META_IS_RESIZE_ACTION)
|
||||||
@@ -447,12 +419,14 @@ setup_constraint_info (ConstraintInfo *info,
|
|||||||
|
|
||||||
/* Workaround braindead legacy apps that don't know how to
|
/* Workaround braindead legacy apps that don't know how to
|
||||||
* fullscreen themselves properly - don't get fooled by
|
* fullscreen themselves properly - don't get fooled by
|
||||||
* windows which hide their titlebar when maximized; that's
|
* windows which hide their titlebar when maximized or which are
|
||||||
* not the same as fullscreen, even if there are no struts
|
* client decorated; that's not the same as fullscreen, even
|
||||||
* making the workarea smaller than the monitor.
|
* if there are no struts making the workarea smaller than
|
||||||
|
* the monitor.
|
||||||
*/
|
*/
|
||||||
if (meta_prefs_get_force_fullscreen() &&
|
if (meta_prefs_get_force_fullscreen() &&
|
||||||
!window->hide_titlebar_when_maximized &&
|
!window->hide_titlebar_when_maximized &&
|
||||||
|
window->decorated &&
|
||||||
meta_rectangle_equal (new, &monitor_info->rect) &&
|
meta_rectangle_equal (new, &monitor_info->rect) &&
|
||||||
window->has_fullscreen_func &&
|
window->has_fullscreen_func &&
|
||||||
!window->fullscreen)
|
!window->fullscreen)
|
||||||
@@ -517,11 +491,12 @@ place_window_if_needed(MetaWindow *window,
|
|||||||
!window->minimized &&
|
!window->minimized &&
|
||||||
!window->fullscreen)
|
!window->fullscreen)
|
||||||
{
|
{
|
||||||
MetaRectangle placed_rect = info->orig;
|
MetaRectangle placed_rect;
|
||||||
MetaWorkspace *cur_workspace;
|
MetaWorkspace *cur_workspace;
|
||||||
const MetaMonitorInfo *monitor_info;
|
const MetaMonitorInfo *monitor_info;
|
||||||
|
|
||||||
meta_window_place (window, info->borders, info->orig.x, info->orig.y,
|
meta_window_get_frame_rect (window, &placed_rect);
|
||||||
|
meta_window_place (window, info->orig.x, info->orig.y,
|
||||||
&placed_rect.x, &placed_rect.y);
|
&placed_rect.x, &placed_rect.y);
|
||||||
did_placement = TRUE;
|
did_placement = TRUE;
|
||||||
|
|
||||||
@@ -539,6 +514,7 @@ place_window_if_needed(MetaWindow *window,
|
|||||||
meta_workspace_get_onmonitor_region (cur_workspace,
|
meta_workspace_get_onmonitor_region (cur_workspace,
|
||||||
monitor_info->number);
|
monitor_info->number);
|
||||||
|
|
||||||
|
meta_window_frame_rect_to_client_rect (window, &placed_rect, &placed_rect);
|
||||||
|
|
||||||
info->current.x = placed_rect.x;
|
info->current.x = placed_rect.x;
|
||||||
info->current.y = placed_rect.y;
|
info->current.y = placed_rect.y;
|
||||||
@@ -584,10 +560,6 @@ place_window_if_needed(MetaWindow *window,
|
|||||||
(window->maximize_vertically_after_placement ?
|
(window->maximize_vertically_after_placement ?
|
||||||
META_MAXIMIZE_VERTICAL : 0), &info->current);
|
META_MAXIMIZE_VERTICAL : 0), &info->current);
|
||||||
|
|
||||||
/* maximization may have changed frame geometry */
|
|
||||||
if (!window->fullscreen)
|
|
||||||
meta_frame_calc_borders (window->frame, info->borders);
|
|
||||||
|
|
||||||
if (window->fullscreen_after_placement)
|
if (window->fullscreen_after_placement)
|
||||||
{
|
{
|
||||||
window->saved_rect = info->current;
|
window->saved_rect = info->current;
|
||||||
@@ -647,7 +619,7 @@ update_onscreen_requirements (MetaWindow *window,
|
|||||||
/* The require onscreen/on-single-monitor and titlebar_visible
|
/* The require onscreen/on-single-monitor and titlebar_visible
|
||||||
* stuff is relative to the outer window, not the inner
|
* stuff is relative to the outer window, not the inner
|
||||||
*/
|
*/
|
||||||
extend_by_frame (&info->current, info->borders);
|
extend_by_frame (window, &info->current);
|
||||||
|
|
||||||
/* Update whether we want future constraint runs to require the
|
/* Update whether we want future constraint runs to require the
|
||||||
* window to be on fully onscreen.
|
* window to be on fully onscreen.
|
||||||
@@ -680,10 +652,13 @@ update_onscreen_requirements (MetaWindow *window,
|
|||||||
*/
|
*/
|
||||||
if (window->frame && window->decorated)
|
if (window->frame && window->decorated)
|
||||||
{
|
{
|
||||||
|
MetaFrameBorders borders;
|
||||||
MetaRectangle titlebar_rect;
|
MetaRectangle titlebar_rect;
|
||||||
|
|
||||||
|
meta_frame_calc_borders (window->frame, &borders);
|
||||||
|
|
||||||
titlebar_rect = info->current;
|
titlebar_rect = info->current;
|
||||||
titlebar_rect.height = info->borders->visible.top;
|
titlebar_rect.height = borders.visible.top;
|
||||||
old = window->require_titlebar_visible;
|
old = window->require_titlebar_visible;
|
||||||
window->require_titlebar_visible =
|
window->require_titlebar_visible =
|
||||||
meta_rectangle_overlaps_with_region (info->usable_screen_region,
|
meta_rectangle_overlaps_with_region (info->usable_screen_region,
|
||||||
@@ -696,39 +671,33 @@ update_onscreen_requirements (MetaWindow *window,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Don't forget to restore the position of the window */
|
/* Don't forget to restore the position of the window */
|
||||||
unextend_by_frame (&info->current, info->borders);
|
unextend_by_frame (window, &info->current);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
extend_by_frame (MetaRectangle *rect,
|
extend_by_frame (MetaWindow *window,
|
||||||
const MetaFrameBorders *borders)
|
MetaRectangle *rect)
|
||||||
{
|
{
|
||||||
rect->x -= borders->visible.left;
|
meta_window_client_rect_to_frame_rect (window, rect, rect);
|
||||||
rect->y -= borders->visible.top;
|
|
||||||
rect->width += borders->visible.left + borders->visible.right;
|
|
||||||
rect->height += borders->visible.top + borders->visible.bottom;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
unextend_by_frame (MetaRectangle *rect,
|
unextend_by_frame (MetaWindow *window,
|
||||||
const MetaFrameBorders *borders)
|
MetaRectangle *rect)
|
||||||
{
|
{
|
||||||
rect->x += borders->visible.left;
|
meta_window_frame_rect_to_client_rect (window, rect, rect);
|
||||||
rect->y += borders->visible.top;
|
|
||||||
rect->width -= borders->visible.left + borders->visible.right;
|
|
||||||
rect->height -= borders->visible.top + borders->visible.bottom;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
get_size_limits (const MetaWindow *window,
|
get_size_limits (MetaWindow *window,
|
||||||
const MetaFrameBorders *borders,
|
gboolean include_frame,
|
||||||
gboolean include_frame,
|
|
||||||
MetaRectangle *min_size,
|
MetaRectangle *min_size,
|
||||||
MetaRectangle *max_size)
|
MetaRectangle *max_size)
|
||||||
{
|
{
|
||||||
/* We pack the results into MetaRectangle structs just for convienience; we
|
/* We pack the results into MetaRectangle structs just for convienience; we
|
||||||
* don't actually use the position of those rects.
|
* don't actually use the position of those rects.
|
||||||
*/
|
*/
|
||||||
|
min_size->x = min_size->y = max_size->x = max_size->y = 0;
|
||||||
min_size->width = window->size_hints.min_width;
|
min_size->width = window->size_hints.min_width;
|
||||||
min_size->height = window->size_hints.min_height;
|
min_size->height = window->size_hints.min_height;
|
||||||
max_size->width = window->size_hints.max_width;
|
max_size->width = window->size_hints.max_width;
|
||||||
@@ -736,22 +705,8 @@ get_size_limits (const MetaWindow *window,
|
|||||||
|
|
||||||
if (include_frame)
|
if (include_frame)
|
||||||
{
|
{
|
||||||
int fw = borders->visible.left + borders->visible.right;
|
meta_window_client_rect_to_frame_rect (window, min_size, min_size);
|
||||||
int fh = borders->visible.top + borders->visible.bottom;
|
meta_window_client_rect_to_frame_rect (window, max_size, max_size);
|
||||||
|
|
||||||
min_size->width += fw;
|
|
||||||
min_size->height += fh;
|
|
||||||
/* Do check to avoid overflow (e.g. max_size->width & max_size->height
|
|
||||||
* may be set to G_MAXINT by meta_set_normal_hints()).
|
|
||||||
*/
|
|
||||||
if (max_size->width < (G_MAXINT - fw))
|
|
||||||
max_size->width += fw;
|
|
||||||
else
|
|
||||||
max_size->width = G_MAXINT;
|
|
||||||
if (max_size->height < (G_MAXINT - fh))
|
|
||||||
max_size->height += fh;
|
|
||||||
else
|
|
||||||
max_size->height = G_MAXINT;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -763,18 +718,28 @@ constrain_modal_dialog (MetaWindow *window,
|
|||||||
{
|
{
|
||||||
int x, y;
|
int x, y;
|
||||||
MetaWindow *parent = meta_window_get_transient_for (window);
|
MetaWindow *parent = meta_window_get_transient_for (window);
|
||||||
|
MetaRectangle child_rect, parent_rect;
|
||||||
gboolean constraint_already_satisfied;
|
gboolean constraint_already_satisfied;
|
||||||
|
|
||||||
if (!meta_window_is_attached_dialog (window))
|
if (!meta_window_is_attached_dialog (window))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
x = parent->rect.x + (parent->rect.width / 2 - info->current.width / 2);
|
/* We want to center the dialog on the parent, including the decorations
|
||||||
y = parent->rect.y + (parent->rect.height / 2 - info->current.height / 2);
|
for both of them. info->current is in client X window coordinates, so we need
|
||||||
if (parent->frame)
|
to convert them to frame coordinates, apply the centering and then
|
||||||
{
|
convert back to client.
|
||||||
x += parent->frame->rect.x;
|
*/
|
||||||
y += parent->frame->rect.y;
|
|
||||||
}
|
child_rect = info->current;
|
||||||
|
extend_by_frame (window, &child_rect);
|
||||||
|
|
||||||
|
meta_window_get_frame_rect (parent, &parent_rect);
|
||||||
|
|
||||||
|
child_rect.x = parent_rect.x + (parent_rect.width / 2 - child_rect.width / 2);
|
||||||
|
child_rect.y = parent_rect.y + (parent_rect.height / 2 - child_rect.height / 2);
|
||||||
|
unextend_by_frame (window, &child_rect);
|
||||||
|
x = child_rect.x;
|
||||||
|
y = child_rect.y;
|
||||||
|
|
||||||
constraint_already_satisfied = (x == info->current.x) && (y == info->current.y);
|
constraint_already_satisfied = (x == info->current.x) && (y == info->current.y);
|
||||||
|
|
||||||
@@ -839,19 +804,19 @@ constrain_maximization (MetaWindow *window,
|
|||||||
active_workspace_struts = window->screen->active_workspace->all_struts;
|
active_workspace_struts = window->screen->active_workspace->all_struts;
|
||||||
|
|
||||||
target_size = info->current;
|
target_size = info->current;
|
||||||
extend_by_frame (&target_size, info->borders);
|
extend_by_frame (window, &target_size);
|
||||||
meta_rectangle_expand_to_avoiding_struts (&target_size,
|
meta_rectangle_expand_to_avoiding_struts (&target_size,
|
||||||
&info->entire_monitor,
|
&info->entire_monitor,
|
||||||
direction,
|
direction,
|
||||||
active_workspace_struts);
|
active_workspace_struts);
|
||||||
}
|
}
|
||||||
/* Now make target_size = maximized size of client window */
|
/* Now make target_size = maximized size of client window */
|
||||||
unextend_by_frame (&target_size, info->borders);
|
unextend_by_frame (window, &target_size);
|
||||||
|
|
||||||
/* Check min size constraints; max size constraints are ignored for maximized
|
/* Check min size constraints; max size constraints are ignored for maximized
|
||||||
* windows, as per bug 327543.
|
* windows, as per bug 327543.
|
||||||
*/
|
*/
|
||||||
get_size_limits (window, info->borders, FALSE, &min_size, &max_size);
|
get_size_limits (window, FALSE, &min_size, &max_size);
|
||||||
hminbad = target_size.width < min_size.width && window->maximized_horizontally;
|
hminbad = target_size.width < min_size.width && window->maximized_horizontally;
|
||||||
vminbad = target_size.height < min_size.height && window->maximized_vertically;
|
vminbad = target_size.height < min_size.height && window->maximized_vertically;
|
||||||
if (hminbad || vminbad)
|
if (hminbad || vminbad)
|
||||||
@@ -905,12 +870,12 @@ constrain_tiling (MetaWindow *window,
|
|||||||
* use an external function for the actual calculation
|
* use an external function for the actual calculation
|
||||||
*/
|
*/
|
||||||
meta_window_get_current_tile_area (window, &target_size);
|
meta_window_get_current_tile_area (window, &target_size);
|
||||||
unextend_by_frame (&target_size, info->borders);
|
unextend_by_frame (window, &target_size);
|
||||||
|
|
||||||
/* Check min size constraints; max size constraints are ignored as for
|
/* Check min size constraints; max size constraints are ignored as for
|
||||||
* maximized windows.
|
* maximized windows.
|
||||||
*/
|
*/
|
||||||
get_size_limits (window, info->borders, FALSE, &min_size, &max_size);
|
get_size_limits (window, FALSE, &min_size, &max_size);
|
||||||
hminbad = target_size.width < min_size.width;
|
hminbad = target_size.width < min_size.width;
|
||||||
vminbad = target_size.height < min_size.height;
|
vminbad = target_size.height < min_size.height;
|
||||||
if (hminbad || vminbad)
|
if (hminbad || vminbad)
|
||||||
@@ -953,7 +918,7 @@ constrain_fullscreen (MetaWindow *window,
|
|||||||
|
|
||||||
monitor = info->entire_monitor;
|
monitor = info->entire_monitor;
|
||||||
|
|
||||||
get_size_limits (window, info->borders, FALSE, &min_size, &max_size);
|
get_size_limits (window, FALSE, &min_size, &max_size);
|
||||||
too_big = !meta_rectangle_could_fit_rect (&monitor, &min_size);
|
too_big = !meta_rectangle_could_fit_rect (&monitor, &min_size);
|
||||||
too_small = !meta_rectangle_could_fit_rect (&max_size, &monitor);
|
too_small = !meta_rectangle_could_fit_rect (&max_size, &monitor);
|
||||||
if (too_big || too_small)
|
if (too_big || too_small)
|
||||||
@@ -1062,7 +1027,7 @@ constrain_size_limits (MetaWindow *window,
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
/* Determine whether constraint is already satisfied; exit if it is */
|
/* Determine whether constraint is already satisfied; exit if it is */
|
||||||
get_size_limits (window, info->borders, FALSE, &min_size, &max_size);
|
get_size_limits (window, FALSE, &min_size, &max_size);
|
||||||
/* We ignore max-size limits for maximized windows; see #327543 */
|
/* We ignore max-size limits for maximized windows; see #327543 */
|
||||||
if (window->maximized_horizontally)
|
if (window->maximized_horizontally)
|
||||||
max_size.width = MAX (max_size.width, info->current.width);
|
max_size.width = MAX (max_size.width, info->current.width);
|
||||||
@@ -1254,8 +1219,8 @@ do_screen_and_monitor_relative_constraints (
|
|||||||
|
|
||||||
/* Determine whether constraint applies; exit if it doesn't */
|
/* Determine whether constraint applies; exit if it doesn't */
|
||||||
how_far_it_can_be_smushed = info->current;
|
how_far_it_can_be_smushed = info->current;
|
||||||
get_size_limits (window, info->borders, TRUE, &min_size, &max_size);
|
get_size_limits (window, TRUE, &min_size, &max_size);
|
||||||
extend_by_frame (&info->current, info->borders);
|
extend_by_frame (window, &info->current);
|
||||||
|
|
||||||
if (info->action_type != ACTION_MOVE)
|
if (info->action_type != ACTION_MOVE)
|
||||||
{
|
{
|
||||||
@@ -1275,7 +1240,7 @@ do_screen_and_monitor_relative_constraints (
|
|||||||
&info->current);
|
&info->current);
|
||||||
if (exit_early || constraint_satisfied || check_only)
|
if (exit_early || constraint_satisfied || check_only)
|
||||||
{
|
{
|
||||||
unextend_by_frame (&info->current, info->borders);
|
unextend_by_frame (window, &info->current);
|
||||||
return constraint_satisfied;
|
return constraint_satisfied;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1299,7 +1264,7 @@ do_screen_and_monitor_relative_constraints (
|
|||||||
info->fixed_directions,
|
info->fixed_directions,
|
||||||
&info->current);
|
&info->current);
|
||||||
|
|
||||||
unextend_by_frame (&info->current, info->borders);
|
unextend_by_frame (window, &info->current);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1388,7 +1353,6 @@ constrain_titlebar_visible (MetaWindow *window,
|
|||||||
window->type == META_WINDOW_DOCK ||
|
window->type == META_WINDOW_DOCK ||
|
||||||
window->fullscreen ||
|
window->fullscreen ||
|
||||||
!window->require_titlebar_visible ||
|
!window->require_titlebar_visible ||
|
||||||
!window->decorated ||
|
|
||||||
unconstrained_user_action)
|
unconstrained_user_action)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
@@ -1412,8 +1376,11 @@ constrain_titlebar_visible (MetaWindow *window,
|
|||||||
*/
|
*/
|
||||||
if (window->frame)
|
if (window->frame)
|
||||||
{
|
{
|
||||||
bottom_amount = info->current.height + info->borders->visible.bottom;
|
MetaFrameBorders borders;
|
||||||
vert_amount_onscreen = info->borders->visible.top;
|
meta_frame_calc_borders (window->frame, &borders);
|
||||||
|
|
||||||
|
bottom_amount = info->current.height + borders.visible.bottom;
|
||||||
|
vert_amount_onscreen = borders.visible.top;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
bottom_amount = vert_amount_offscreen;
|
bottom_amount = vert_amount_offscreen;
|
||||||
@@ -1487,8 +1454,11 @@ constrain_partially_onscreen (MetaWindow *window,
|
|||||||
*/
|
*/
|
||||||
if (window->frame)
|
if (window->frame)
|
||||||
{
|
{
|
||||||
bottom_amount = info->current.height + info->borders->visible.bottom;
|
MetaFrameBorders borders;
|
||||||
vert_amount_onscreen = info->borders->visible.top;
|
meta_frame_calc_borders (window->frame, &borders);
|
||||||
|
|
||||||
|
bottom_amount = info->current.height + borders.visible.bottom;
|
||||||
|
vert_amount_onscreen = borders.visible.top;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
bottom_amount = vert_amount_offscreen;
|
bottom_amount = vert_amount_offscreen;
|
||||||
|
@@ -17,9 +17,7 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef META_CONSTRAINTS_H
|
#ifndef META_CONSTRAINTS_H
|
||||||
@@ -35,11 +33,11 @@ typedef enum
|
|||||||
META_DO_GRAVITY_ADJUST = 1 << 1,
|
META_DO_GRAVITY_ADJUST = 1 << 1,
|
||||||
META_IS_USER_ACTION = 1 << 2,
|
META_IS_USER_ACTION = 1 << 2,
|
||||||
META_IS_MOVE_ACTION = 1 << 3,
|
META_IS_MOVE_ACTION = 1 << 3,
|
||||||
META_IS_RESIZE_ACTION = 1 << 4
|
META_IS_RESIZE_ACTION = 1 << 4,
|
||||||
|
META_IS_WAYLAND_RESIZE = 1 << 5
|
||||||
} MetaMoveResizeFlags;
|
} MetaMoveResizeFlags;
|
||||||
|
|
||||||
void meta_window_constrain (MetaWindow *window,
|
void meta_window_constrain (MetaWindow *window,
|
||||||
MetaFrameBorders *orig_borders,
|
|
||||||
MetaMoveResizeFlags flags,
|
MetaMoveResizeFlags flags,
|
||||||
int resize_gravity,
|
int resize_gravity,
|
||||||
const MetaRectangle *orig,
|
const MetaRectangle *orig,
|
||||||
|
@@ -18,9 +18,7 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
@@ -29,6 +27,7 @@
|
|||||||
#include "workspace-private.h"
|
#include "workspace-private.h"
|
||||||
#include <meta/prefs.h>
|
#include <meta/prefs.h>
|
||||||
#include <meta/errors.h>
|
#include <meta/errors.h>
|
||||||
|
#include "util-private.h"
|
||||||
|
|
||||||
/* Looks up the MetaWindow representing the frame of the given X window.
|
/* Looks up the MetaWindow representing the frame of the given X window.
|
||||||
* Used as a helper function by a bunch of the functions below.
|
* Used as a helper function by a bunch of the functions below.
|
||||||
@@ -89,7 +88,7 @@ meta_core_get (Display *xdisplay,
|
|||||||
if (request != META_CORE_WINDOW_HAS_FRAME &&
|
if (request != META_CORE_WINDOW_HAS_FRAME &&
|
||||||
(window == NULL || window->frame == NULL)) {
|
(window == NULL || window->frame == NULL)) {
|
||||||
meta_bug ("No such frame window 0x%lx!\n", xwindow);
|
meta_bug ("No such frame window 0x%lx!\n", xwindow);
|
||||||
return;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (request != META_CORE_GET_END) {
|
while (request != META_CORE_GET_END) {
|
||||||
@@ -99,7 +98,7 @@ meta_core_get (Display *xdisplay,
|
|||||||
switch (request) {
|
switch (request) {
|
||||||
case META_CORE_WINDOW_HAS_FRAME:
|
case META_CORE_WINDOW_HAS_FRAME:
|
||||||
*((gboolean*)answer) = window != NULL && window->frame != NULL;
|
*((gboolean*)answer) = window != NULL && window->frame != NULL;
|
||||||
if (!*((gboolean*)answer)) return; /* see above */
|
if (!*((gboolean*)answer)) goto out; /* see above */
|
||||||
break;
|
break;
|
||||||
case META_CORE_GET_CLIENT_WIDTH:
|
case META_CORE_GET_CLIENT_WIDTH:
|
||||||
*((gint*)answer) = window->rect.width;
|
*((gint*)answer) = window->rect.width;
|
||||||
@@ -154,12 +153,13 @@ meta_core_get (Display *xdisplay,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
meta_warning(_("Unknown window information request: %d"), request);
|
meta_warning("Unknown window information request: %d\n", request);
|
||||||
}
|
}
|
||||||
|
|
||||||
request = va_arg (args, MetaCoreGetType);
|
request = va_arg (args, MetaCoreGetType);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
va_end (args);
|
va_end (args);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -170,6 +170,7 @@ meta_core_queue_frame_resize (Display *xdisplay,
|
|||||||
MetaWindow *window = get_window (xdisplay, frame_xwindow);
|
MetaWindow *window = get_window (xdisplay, frame_xwindow);
|
||||||
|
|
||||||
meta_window_queue (window, META_QUEUE_MOVE_RESIZE);
|
meta_window_queue (window, META_QUEUE_MOVE_RESIZE);
|
||||||
|
meta_window_frame_size_changed (window);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -280,8 +281,7 @@ meta_core_lower_beneath_grab_window (Display *xdisplay,
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
changes.stack_mode = Below;
|
changes.stack_mode = Below;
|
||||||
changes.sibling = grab_window->frame ? grab_window->frame->xwindow
|
changes.sibling = meta_window_get_toplevel_xwindow (grab_window);
|
||||||
: grab_window->xwindow;
|
|
||||||
|
|
||||||
stack_window.any.type = META_WINDOW_CLIENT_TYPE_X11;
|
stack_window.any.type = META_WINDOW_CLIENT_TYPE_X11;
|
||||||
stack_window.x11.xwindow = xwindow;
|
stack_window.x11.xwindow = xwindow;
|
||||||
@@ -474,26 +474,6 @@ meta_core_change_workspace (Display *xdisplay,
|
|||||||
new_workspace));
|
new_workspace));
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
|
||||||
meta_core_get_num_workspaces (Screen *xscreen)
|
|
||||||
{
|
|
||||||
MetaScreen *screen;
|
|
||||||
|
|
||||||
screen = meta_screen_for_x_screen (xscreen);
|
|
||||||
|
|
||||||
return meta_screen_get_n_workspaces (screen);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
meta_core_get_active_workspace (Screen *xscreen)
|
|
||||||
{
|
|
||||||
MetaScreen *screen;
|
|
||||||
|
|
||||||
screen = meta_screen_for_x_screen (xscreen);
|
|
||||||
|
|
||||||
return meta_workspace_index (screen->active_workspace);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_core_show_window_menu (Display *xdisplay,
|
meta_core_show_window_menu (Display *xdisplay,
|
||||||
Window frame_xwindow,
|
Window frame_xwindow,
|
||||||
|
@@ -17,9 +17,7 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef META_CORE_H
|
#ifndef META_CORE_H
|
||||||
@@ -153,8 +151,6 @@ void meta_core_change_workspace (Display *xdisplay,
|
|||||||
Window frame_xwindow,
|
Window frame_xwindow,
|
||||||
int new_workspace);
|
int new_workspace);
|
||||||
|
|
||||||
int meta_core_get_num_workspaces (Screen *xscreen);
|
|
||||||
int meta_core_get_active_workspace (Screen *xscreen);
|
|
||||||
int meta_core_get_frame_workspace (Display *xdisplay,
|
int meta_core_get_frame_workspace (Display *xdisplay,
|
||||||
Window frame_xwindow);
|
Window frame_xwindow);
|
||||||
const char* meta_core_get_workspace_name_with_index (Display *xdisplay,
|
const char* meta_core_get_workspace_name_with_index (Display *xdisplay,
|
||||||
|
@@ -17,15 +17,13 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define _XOPEN_SOURCE /* for kill() */
|
#define _XOPEN_SOURCE /* for kill() */
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
#include <meta/util.h>
|
#include "util-private.h"
|
||||||
#include "window-private.h"
|
#include "window-private.h"
|
||||||
#include <meta/errors.h>
|
#include <meta/errors.h>
|
||||||
#include <meta/workspace.h>
|
#include <meta/workspace.h>
|
||||||
@@ -39,18 +37,17 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "meta-wayland-surface.h"
|
||||||
|
|
||||||
static void meta_window_present_delete_dialog (MetaWindow *window,
|
static void meta_window_present_delete_dialog (MetaWindow *window,
|
||||||
guint32 timestamp);
|
guint32 timestamp);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
delete_ping_reply_func (MetaDisplay *display,
|
delete_ping_reply_func (MetaWindow *window,
|
||||||
Window xwindow,
|
|
||||||
guint32 timestamp,
|
guint32 timestamp,
|
||||||
void *user_data)
|
void *user_data)
|
||||||
{
|
{
|
||||||
meta_topic (META_DEBUG_PING,
|
meta_topic (META_DEBUG_PING, "Got reply to delete ping for %s\n", window->desc);
|
||||||
"Got reply to delete ping for %s\n",
|
|
||||||
((MetaWindow*)user_data)->desc);
|
|
||||||
|
|
||||||
/* we do nothing */
|
/* we do nothing */
|
||||||
}
|
}
|
||||||
@@ -68,12 +65,10 @@ dialog_exited (GPid pid, int status, gpointer user_data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
delete_ping_timeout_func (MetaDisplay *display,
|
delete_ping_timeout_func (MetaWindow *window,
|
||||||
Window xwindow,
|
|
||||||
guint32 timestamp,
|
guint32 timestamp,
|
||||||
void *user_data)
|
void *user_data)
|
||||||
{
|
{
|
||||||
MetaWindow *window = user_data;
|
|
||||||
char *window_title;
|
char *window_title;
|
||||||
gchar *window_content, *tmp;
|
gchar *window_content, *tmp;
|
||||||
GPid dialog_pid;
|
GPid dialog_pid;
|
||||||
@@ -137,36 +132,42 @@ void
|
|||||||
meta_window_check_alive (MetaWindow *window,
|
meta_window_check_alive (MetaWindow *window,
|
||||||
guint32 timestamp)
|
guint32 timestamp)
|
||||||
{
|
{
|
||||||
meta_display_ping_window (window->display,
|
meta_display_ping_window (window,
|
||||||
window,
|
|
||||||
timestamp,
|
timestamp,
|
||||||
delete_ping_reply_func,
|
delete_ping_reply_func,
|
||||||
delete_ping_timeout_func,
|
delete_ping_timeout_func,
|
||||||
window);
|
NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_window_delete (MetaWindow *window,
|
meta_window_delete (MetaWindow *window,
|
||||||
guint32 timestamp)
|
guint32 timestamp)
|
||||||
{
|
{
|
||||||
meta_error_trap_push (window->display);
|
if (window->client_type == META_WINDOW_CLIENT_TYPE_X11)
|
||||||
if (window->delete_window)
|
|
||||||
{
|
{
|
||||||
meta_topic (META_DEBUG_WINDOW_OPS,
|
meta_error_trap_push (window->display);
|
||||||
"Deleting %s with delete_window request\n",
|
if (window->delete_window)
|
||||||
window->desc);
|
{
|
||||||
meta_window_send_icccm_message (window,
|
meta_topic (META_DEBUG_WINDOW_OPS,
|
||||||
window->display->atom_WM_DELETE_WINDOW,
|
"Deleting %s with delete_window request\n",
|
||||||
timestamp);
|
window->desc);
|
||||||
|
meta_window_send_icccm_message (window,
|
||||||
|
window->display->atom_WM_DELETE_WINDOW,
|
||||||
|
timestamp);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
meta_topic (META_DEBUG_WINDOW_OPS,
|
||||||
|
"Deleting %s with explicit kill\n",
|
||||||
|
window->desc);
|
||||||
|
XKillClient (window->display->xdisplay, window->xwindow);
|
||||||
|
}
|
||||||
|
meta_error_trap_pop (window->display);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
meta_topic (META_DEBUG_WINDOW_OPS,
|
meta_wayland_surface_delete (window->surface);
|
||||||
"Deleting %s with explicit kill\n",
|
|
||||||
window->desc);
|
|
||||||
XKillClient (window->display->xdisplay, window->xwindow);
|
|
||||||
}
|
}
|
||||||
meta_error_trap_pop (window->display);
|
|
||||||
|
|
||||||
meta_window_check_alive (window, timestamp);
|
meta_window_check_alive (window, timestamp);
|
||||||
|
|
||||||
|
@@ -19,9 +19,7 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef META_DISPLAY_PRIVATE_H
|
#ifndef META_DISPLAY_PRIVATE_H
|
||||||
@@ -39,6 +37,7 @@
|
|||||||
#include "keybindings-private.h"
|
#include "keybindings-private.h"
|
||||||
#include <meta/prefs.h>
|
#include <meta/prefs.h>
|
||||||
#include <meta/barrier.h>
|
#include <meta/barrier.h>
|
||||||
|
#include <clutter/clutter.h>
|
||||||
|
|
||||||
#ifdef HAVE_STARTUP_NOTIFICATION
|
#ifdef HAVE_STARTUP_NOTIFICATION
|
||||||
#include <libsn/sn.h>
|
#include <libsn/sn.h>
|
||||||
@@ -56,10 +55,9 @@ typedef struct _MetaWindowPropHooks MetaWindowPropHooks;
|
|||||||
|
|
||||||
typedef struct MetaEdgeResistanceData MetaEdgeResistanceData;
|
typedef struct MetaEdgeResistanceData MetaEdgeResistanceData;
|
||||||
|
|
||||||
typedef void (* MetaWindowPingFunc) (MetaDisplay *display,
|
typedef void (* MetaWindowPingFunc) (MetaWindow *window,
|
||||||
Window xwindow,
|
guint32 timestamp,
|
||||||
guint32 timestamp,
|
gpointer user_data);
|
||||||
gpointer user_data);
|
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
META_LIST_DEFAULT = 0, /* normal windows */
|
META_LIST_DEFAULT = 0, /* normal windows */
|
||||||
@@ -101,6 +99,8 @@ struct _MetaDisplay
|
|||||||
char *name;
|
char *name;
|
||||||
Display *xdisplay;
|
Display *xdisplay;
|
||||||
|
|
||||||
|
int clutter_event_filter;
|
||||||
|
|
||||||
Window leader_window;
|
Window leader_window;
|
||||||
Window timestamp_pinging_window;
|
Window timestamp_pinging_window;
|
||||||
|
|
||||||
@@ -147,6 +147,14 @@ struct _MetaDisplay
|
|||||||
*/
|
*/
|
||||||
guint allow_terminal_deactivation : 1;
|
guint allow_terminal_deactivation : 1;
|
||||||
|
|
||||||
|
/* If true, server->focus_serial refers to us changing the focus; in
|
||||||
|
* this case, we can ignore focus events that have exactly focus_serial,
|
||||||
|
* since we take care to make another request immediately afterwards.
|
||||||
|
* But if focus is being changed by another client, we have to accept
|
||||||
|
* multiple events with the same serial.
|
||||||
|
*/
|
||||||
|
guint focused_by_us : 1;
|
||||||
|
|
||||||
guint static_gravity_works : 1;
|
guint static_gravity_works : 1;
|
||||||
|
|
||||||
/*< private-ish >*/
|
/*< private-ish >*/
|
||||||
@@ -154,6 +162,7 @@ struct _MetaDisplay
|
|||||||
GSList *screens;
|
GSList *screens;
|
||||||
MetaScreen *active_screen;
|
MetaScreen *active_screen;
|
||||||
GHashTable *xids;
|
GHashTable *xids;
|
||||||
|
GHashTable *wayland_windows;
|
||||||
int error_traps;
|
int error_traps;
|
||||||
int (* error_trap_handler) (Display *display,
|
int (* error_trap_handler) (Display *display,
|
||||||
XErrorEvent *error);
|
XErrorEvent *error);
|
||||||
@@ -188,7 +197,7 @@ struct _MetaDisplay
|
|||||||
MetaWindow* autoraise_window;
|
MetaWindow* autoraise_window;
|
||||||
|
|
||||||
/* Alt+click button grabs */
|
/* Alt+click button grabs */
|
||||||
unsigned int window_grab_modifiers;
|
ClutterModifierType window_grab_modifiers;
|
||||||
|
|
||||||
/* current window operation */
|
/* current window operation */
|
||||||
MetaGrabOp grab_op;
|
MetaGrabOp grab_op;
|
||||||
@@ -380,6 +389,11 @@ void meta_display_register_x_window (MetaDisplay *display,
|
|||||||
void meta_display_unregister_x_window (MetaDisplay *display,
|
void meta_display_unregister_x_window (MetaDisplay *display,
|
||||||
Window xwindow);
|
Window xwindow);
|
||||||
|
|
||||||
|
void meta_display_register_wayland_window (MetaDisplay *display,
|
||||||
|
MetaWindow *window);
|
||||||
|
void meta_display_unregister_wayland_window (MetaDisplay *display,
|
||||||
|
MetaWindow *window);
|
||||||
|
|
||||||
#ifdef HAVE_XSYNC
|
#ifdef HAVE_XSYNC
|
||||||
MetaWindow* meta_display_lookup_sync_alarm (MetaDisplay *display,
|
MetaWindow* meta_display_lookup_sync_alarm (MetaDisplay *display,
|
||||||
XSyncAlarm alarm);
|
XSyncAlarm alarm);
|
||||||
@@ -439,14 +453,13 @@ void meta_display_retheme_all (void);
|
|||||||
void meta_display_set_cursor_theme (const char *theme,
|
void meta_display_set_cursor_theme (const char *theme,
|
||||||
int size);
|
int size);
|
||||||
|
|
||||||
void meta_display_ping_window (MetaDisplay *display,
|
void meta_display_ping_window (MetaWindow *window,
|
||||||
MetaWindow *window,
|
|
||||||
guint32 timestamp,
|
guint32 timestamp,
|
||||||
MetaWindowPingFunc ping_reply_func,
|
MetaWindowPingFunc ping_reply_func,
|
||||||
MetaWindowPingFunc ping_timeout_func,
|
MetaWindowPingFunc ping_timeout_func,
|
||||||
void *user_data);
|
void *user_data);
|
||||||
gboolean meta_display_window_has_pending_pings (MetaDisplay *display,
|
void meta_display_pong_for_serial (MetaDisplay *display,
|
||||||
MetaWindow *window);
|
guint32 serial);
|
||||||
|
|
||||||
int meta_resize_gravity_from_grab_op (MetaGrabOp op);
|
int meta_resize_gravity_from_grab_op (MetaGrabOp op);
|
||||||
|
|
||||||
@@ -467,21 +480,17 @@ void meta_display_queue_autoraise_callback (MetaDisplay *display,
|
|||||||
void meta_display_remove_autoraise_callback (MetaDisplay *display);
|
void meta_display_remove_autoraise_callback (MetaDisplay *display);
|
||||||
|
|
||||||
void meta_display_overlay_key_activate (MetaDisplay *display);
|
void meta_display_overlay_key_activate (MetaDisplay *display);
|
||||||
void meta_display_accelerator_activate (MetaDisplay *display,
|
void meta_display_accelerator_activate (MetaDisplay *display,
|
||||||
guint action,
|
guint action,
|
||||||
guint deviceid,
|
ClutterKeyEvent *event);
|
||||||
guint timestamp);
|
|
||||||
gboolean meta_display_modifiers_accelerator_activate (MetaDisplay *display);
|
gboolean meta_display_modifiers_accelerator_activate (MetaDisplay *display);
|
||||||
|
|
||||||
/* In above-tab-keycode.c */
|
/* In above-tab-keycode.c */
|
||||||
guint meta_display_get_above_tab_keycode (MetaDisplay *display);
|
guint meta_display_get_above_tab_keycode (MetaDisplay *display);
|
||||||
|
|
||||||
gboolean meta_display_handle_event (MetaDisplay *display,
|
|
||||||
XEvent *event);
|
|
||||||
|
|
||||||
#ifdef HAVE_XI23
|
#ifdef HAVE_XI23
|
||||||
gboolean meta_display_process_barrier_event (MetaDisplay *display,
|
gboolean meta_display_process_barrier_event (MetaDisplay *display,
|
||||||
XIBarrierEvent *event);
|
XIEvent *event);
|
||||||
#endif /* HAVE_XI23 */
|
#endif /* HAVE_XI23 */
|
||||||
|
|
||||||
void meta_display_set_input_focus_xwindow (MetaDisplay *display,
|
void meta_display_set_input_focus_xwindow (MetaDisplay *display,
|
||||||
|
2883
src/core/display.c
2883
src/core/display.c
File diff suppressed because it is too large
Load Diff
@@ -16,9 +16,7 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
@@ -985,7 +983,7 @@ compute_resistance_and_snapping_edges (MetaDisplay *display)
|
|||||||
{
|
{
|
||||||
MetaRectangle *new_rect;
|
MetaRectangle *new_rect;
|
||||||
new_rect = g_new (MetaRectangle, 1);
|
new_rect = g_new (MetaRectangle, 1);
|
||||||
meta_window_get_outer_rect (cur_window, new_rect);
|
meta_window_get_frame_rect (cur_window, new_rect);
|
||||||
obscuring_windows = g_slist_prepend (obscuring_windows, new_rect);
|
obscuring_windows = g_slist_prepend (obscuring_windows, new_rect);
|
||||||
window_stacking =
|
window_stacking =
|
||||||
g_slist_prepend (window_stacking, GINT_TO_POINTER (stack_position));
|
g_slist_prepend (window_stacking, GINT_TO_POINTER (stack_position));
|
||||||
@@ -1010,7 +1008,7 @@ compute_resistance_and_snapping_edges (MetaDisplay *display)
|
|||||||
{
|
{
|
||||||
MetaRectangle cur_rect;
|
MetaRectangle cur_rect;
|
||||||
MetaWindow *cur_window = cur_window_iter->data;
|
MetaWindow *cur_window = cur_window_iter->data;
|
||||||
meta_window_get_outer_rect (cur_window, &cur_rect);
|
meta_window_get_frame_rect (cur_window, &cur_rect);
|
||||||
|
|
||||||
/* Check if we want to use this window's edges for edge
|
/* Check if we want to use this window's edges for edge
|
||||||
* resistance (note that dock edges are considered screen edges
|
* resistance (note that dock edges are considered screen edges
|
||||||
@@ -1151,7 +1149,7 @@ meta_window_edge_resistance_for_move (MetaWindow *window,
|
|||||||
MetaRectangle old_outer, proposed_outer, new_outer;
|
MetaRectangle old_outer, proposed_outer, new_outer;
|
||||||
gboolean is_resize;
|
gboolean is_resize;
|
||||||
|
|
||||||
meta_window_get_outer_rect (window, &old_outer);
|
meta_window_get_frame_rect (window, &old_outer);
|
||||||
|
|
||||||
proposed_outer = old_outer;
|
proposed_outer = old_outer;
|
||||||
proposed_outer.x += (*new_x - old_x);
|
proposed_outer.x += (*new_x - old_x);
|
||||||
@@ -1237,7 +1235,7 @@ meta_window_edge_resistance_for_resize (MetaWindow *window,
|
|||||||
int proposed_outer_width, proposed_outer_height;
|
int proposed_outer_width, proposed_outer_height;
|
||||||
gboolean is_resize;
|
gboolean is_resize;
|
||||||
|
|
||||||
meta_window_get_outer_rect (window, &old_outer);
|
meta_window_get_frame_rect (window, &old_outer);
|
||||||
proposed_outer_width = old_outer.width + (*new_width - old_width);
|
proposed_outer_width = old_outer.width + (*new_width - old_width);
|
||||||
proposed_outer_height = old_outer.height + (*new_height - old_height);
|
proposed_outer_height = old_outer.height + (*new_height - old_height);
|
||||||
meta_rectangle_resize_with_gravity (&old_outer,
|
meta_rectangle_resize_with_gravity (&old_outer,
|
||||||
|
@@ -16,9 +16,7 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef META_EDGE_RESISTANCE_H
|
#ifndef META_EDGE_RESISTANCE_H
|
||||||
|
@@ -15,9 +15,7 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -18,9 +18,7 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
@@ -52,9 +50,6 @@ meta_window_ensure_frame (MetaWindow *window)
|
|||||||
if (window->frame)
|
if (window->frame)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* See comment below for why this is required. */
|
|
||||||
meta_display_grab (window->display);
|
|
||||||
|
|
||||||
frame = g_new (MetaFrame, 1);
|
frame = g_new (MetaFrame, 1);
|
||||||
|
|
||||||
frame->window = window;
|
frame->window = window;
|
||||||
@@ -67,8 +62,8 @@ meta_window_ensure_frame (MetaWindow *window)
|
|||||||
frame->right_width = 0;
|
frame->right_width = 0;
|
||||||
frame->current_cursor = 0;
|
frame->current_cursor = 0;
|
||||||
|
|
||||||
frame->mapped = FALSE;
|
|
||||||
frame->is_flashing = FALSE;
|
frame->is_flashing = FALSE;
|
||||||
|
frame->borders_cached = FALSE;
|
||||||
|
|
||||||
meta_verbose ("Framing window %s: visual %s default, depth %d default depth %d\n",
|
meta_verbose ("Framing window %s: visual %s default, depth %d default depth %d\n",
|
||||||
window->desc,
|
window->desc,
|
||||||
@@ -119,14 +114,6 @@ meta_window_ensure_frame (MetaWindow *window)
|
|||||||
|
|
||||||
meta_display_register_x_window (window->display, &frame->xwindow, window);
|
meta_display_register_x_window (window->display, &frame->xwindow, window);
|
||||||
|
|
||||||
/* Reparent the client window; it may be destroyed,
|
|
||||||
* thus the error trap. We'll get a destroy notify later
|
|
||||||
* and free everything. Comment in FVWM source code says
|
|
||||||
* we need a server grab or the child can get its MapNotify
|
|
||||||
* before we've finished reparenting and getting the decoration
|
|
||||||
* window onscreen, so ensure_frame must be called with
|
|
||||||
* a grab.
|
|
||||||
*/
|
|
||||||
meta_error_trap_push (window->display);
|
meta_error_trap_push (window->display);
|
||||||
if (window->mapped)
|
if (window->mapped)
|
||||||
{
|
{
|
||||||
@@ -170,7 +157,7 @@ meta_window_ensure_frame (MetaWindow *window)
|
|||||||
/* Move keybindings to frame instead of window */
|
/* Move keybindings to frame instead of window */
|
||||||
meta_window_grab_keys (window);
|
meta_window_grab_keys (window);
|
||||||
|
|
||||||
meta_display_ungrab (window->display);
|
meta_ui_map_frame (frame->window->screen->ui, frame->xwindow);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -334,9 +321,23 @@ meta_frame_calc_borders (MetaFrame *frame,
|
|||||||
if (frame == NULL)
|
if (frame == NULL)
|
||||||
meta_frame_borders_clear (borders);
|
meta_frame_borders_clear (borders);
|
||||||
else
|
else
|
||||||
meta_ui_get_frame_borders (frame->window->screen->ui,
|
{
|
||||||
frame->xwindow,
|
if (!frame->borders_cached)
|
||||||
borders);
|
{
|
||||||
|
meta_ui_get_frame_borders (frame->window->screen->ui,
|
||||||
|
frame->xwindow,
|
||||||
|
&frame->cached_borders);
|
||||||
|
frame->borders_cached = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
*borders = frame->cached_borders;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_frame_clear_cached_borders (MetaFrame *frame)
|
||||||
|
{
|
||||||
|
frame->borders_cached = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
|
@@ -16,9 +16,7 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef META_FRAME_PRIVATE_H
|
#ifndef META_FRAME_PRIVATE_H
|
||||||
@@ -41,15 +39,17 @@ struct _MetaFrame
|
|||||||
*/
|
*/
|
||||||
MetaRectangle rect;
|
MetaRectangle rect;
|
||||||
|
|
||||||
|
MetaFrameBorders cached_borders; /* valid if borders_cached is set */
|
||||||
|
|
||||||
/* position of client, size of frame */
|
/* position of client, size of frame */
|
||||||
int child_x;
|
int child_x;
|
||||||
int child_y;
|
int child_y;
|
||||||
int right_width;
|
int right_width;
|
||||||
int bottom_height;
|
int bottom_height;
|
||||||
|
|
||||||
guint mapped : 1;
|
|
||||||
guint need_reapply_frame_shape : 1;
|
guint need_reapply_frame_shape : 1;
|
||||||
guint is_flashing : 1; /* used by the visual bell flash */
|
guint is_flashing : 1; /* used by the visual bell flash */
|
||||||
|
guint borders_cached : 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
void meta_window_ensure_frame (MetaWindow *window);
|
void meta_window_ensure_frame (MetaWindow *window);
|
||||||
@@ -68,6 +68,8 @@ gboolean meta_frame_sync_to_window (MetaFrame *frame,
|
|||||||
gboolean need_move,
|
gboolean need_move,
|
||||||
gboolean need_resize);
|
gboolean need_resize);
|
||||||
|
|
||||||
|
void meta_frame_clear_cached_borders (MetaFrame *frame);
|
||||||
|
|
||||||
cairo_region_t *meta_frame_get_frame_bounds (MetaFrame *frame);
|
cairo_region_t *meta_frame_get_frame_bounds (MetaFrame *frame);
|
||||||
|
|
||||||
void meta_frame_get_mask (MetaFrame *frame,
|
void meta_frame_get_mask (MetaFrame *frame,
|
||||||
|
@@ -16,9 +16,7 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef META_GROUP_PRIVATE_H
|
#ifndef META_GROUP_PRIVATE_H
|
||||||
|
@@ -16,9 +16,7 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
@@ -16,9 +16,7 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef META_GROUP_PROPS_H
|
#ifndef META_GROUP_PROPS_H
|
||||||
|
@@ -15,9 +15,7 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -16,9 +16,7 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
@@ -16,9 +16,7 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef META_ICON_CACHE_H
|
#ifndef META_ICON_CACHE_H
|
||||||
|
@@ -21,9 +21,7 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef META_KEYBINDINGS_PRIVATE_H
|
#ifndef META_KEYBINDINGS_PRIVATE_H
|
||||||
@@ -66,9 +64,9 @@ gboolean meta_window_grab_all_keys (MetaWindow *window,
|
|||||||
guint32 timestamp);
|
guint32 timestamp);
|
||||||
void meta_window_ungrab_all_keys (MetaWindow *window,
|
void meta_window_ungrab_all_keys (MetaWindow *window,
|
||||||
guint32 timestamp);
|
guint32 timestamp);
|
||||||
gboolean meta_display_process_key_event (MetaDisplay *display,
|
gboolean meta_display_process_key_event (MetaDisplay *display,
|
||||||
MetaWindow *window,
|
MetaWindow *window,
|
||||||
XIDeviceEvent *event);
|
ClutterKeyEvent *event);
|
||||||
void meta_display_process_mapping_event (MetaDisplay *display,
|
void meta_display_process_mapping_event (MetaDisplay *display,
|
||||||
XEvent *event);
|
XEvent *event);
|
||||||
|
|
||||||
@@ -81,7 +79,3 @@ gboolean meta_prefs_remove_keybinding (const char *name);
|
|||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
128
src/core/main.c
128
src/core/main.c
@@ -17,9 +17,7 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -48,7 +46,7 @@
|
|||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
#include <meta/main.h>
|
#include <meta/main.h>
|
||||||
#include <meta/util.h>
|
#include "util-private.h"
|
||||||
#include "display-private.h"
|
#include "display-private.h"
|
||||||
#include <meta/errors.h>
|
#include <meta/errors.h>
|
||||||
#include "ui.h"
|
#include "ui.h"
|
||||||
@@ -58,6 +56,7 @@
|
|||||||
#include "meta-wayland-private.h"
|
#include "meta-wayland-private.h"
|
||||||
|
|
||||||
#include <glib-object.h>
|
#include <glib-object.h>
|
||||||
|
#include <glib-unix.h>
|
||||||
#include <gdk/gdkx.h>
|
#include <gdk/gdkx.h>
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@@ -190,6 +189,7 @@ static gchar *opt_client_id;
|
|||||||
static gboolean opt_replace_wm;
|
static gboolean opt_replace_wm;
|
||||||
static gboolean opt_disable_sm;
|
static gboolean opt_disable_sm;
|
||||||
static gboolean opt_sync;
|
static gboolean opt_sync;
|
||||||
|
static gboolean opt_wayland;
|
||||||
|
|
||||||
static GOptionEntry meta_options[] = {
|
static GOptionEntry meta_options[] = {
|
||||||
{
|
{
|
||||||
@@ -227,6 +227,12 @@ static GOptionEntry meta_options[] = {
|
|||||||
N_("Make X calls synchronous"),
|
N_("Make X calls synchronous"),
|
||||||
NULL
|
NULL
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"wayland", 0, 0, G_OPTION_ARG_NONE,
|
||||||
|
&opt_wayland,
|
||||||
|
N_("Run as a wayland compositor"),
|
||||||
|
NULL
|
||||||
|
},
|
||||||
{NULL}
|
{NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -250,9 +256,6 @@ meta_get_option_context (void)
|
|||||||
|
|
||||||
ctx = g_option_context_new (NULL);
|
ctx = g_option_context_new (NULL);
|
||||||
g_option_context_add_main_entries (ctx, meta_options, GETTEXT_PACKAGE);
|
g_option_context_add_main_entries (ctx, meta_options, GETTEXT_PACKAGE);
|
||||||
g_option_context_add_group (ctx, clutter_get_option_group_without_init ());
|
|
||||||
g_option_context_add_group (ctx, cogl_get_option_group ());
|
|
||||||
|
|
||||||
return ctx;
|
return ctx;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -288,8 +291,12 @@ event_dispatch (GSource *source,
|
|||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
ClutterEvent *event = clutter_event_get ();
|
ClutterEvent *event = clutter_event_get ();
|
||||||
|
|
||||||
if (event)
|
if (event)
|
||||||
clutter_do_event (event);
|
{
|
||||||
|
clutter_do_event (event);
|
||||||
|
clutter_event_free (event);
|
||||||
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@@ -327,16 +334,16 @@ meta_clutter_init (void)
|
|||||||
* also is %NULL, use the default - :0.0
|
* also is %NULL, use the default - :0.0
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
meta_select_display (gchar *display_name)
|
meta_select_display (char *display_arg)
|
||||||
{
|
{
|
||||||
gchar *envVar = "";
|
const char *display_name;
|
||||||
if (display_name)
|
|
||||||
envVar = g_strconcat ("DISPLAY=", display_name, NULL);
|
if (display_arg)
|
||||||
else if (g_getenv ("MUTTER_DISPLAY"))
|
display_name = (const char *) display_arg;
|
||||||
envVar = g_strconcat ("DISPLAY=",
|
else
|
||||||
g_getenv ("MUTTER_DISPLAY"), NULL);
|
display_name = g_getenv ("MUTTER_DISPLAY");
|
||||||
/* DO NOT FREE envVar, putenv() sucks */
|
|
||||||
putenv (envVar);
|
g_setenv ("DISPLAY", display_name, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -352,59 +359,12 @@ meta_finalize (void)
|
|||||||
meta_wayland_finalize ();
|
meta_wayland_finalize ();
|
||||||
}
|
}
|
||||||
|
|
||||||
static int signal_pipe_fds[2] = { -1, -1 };
|
|
||||||
|
|
||||||
static void
|
|
||||||
signal_handler (int signum)
|
|
||||||
{
|
|
||||||
if (signal_pipe_fds[1] >= 0)
|
|
||||||
{
|
|
||||||
switch (signum)
|
|
||||||
{
|
|
||||||
case SIGTERM:
|
|
||||||
write (signal_pipe_fds[1], "T", 1);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
on_signal (GIOChannel *source,
|
on_sigterm (gpointer user_data)
|
||||||
GIOCondition condition,
|
|
||||||
void *data)
|
|
||||||
{
|
{
|
||||||
char signal;
|
meta_quit (EXIT_SUCCESS);
|
||||||
int count;
|
|
||||||
|
|
||||||
for (;;)
|
return G_SOURCE_REMOVE;
|
||||||
{
|
|
||||||
count = read (signal_pipe_fds[0], &signal, 1);
|
|
||||||
if (count == EINTR)
|
|
||||||
continue;
|
|
||||||
if (count < 0)
|
|
||||||
{
|
|
||||||
const char *msg = strerror (errno);
|
|
||||||
g_warning ("Error handling signal: %s", msg);
|
|
||||||
}
|
|
||||||
if (count != 1)
|
|
||||||
{
|
|
||||||
g_warning ("Unexpectedly failed to read byte from signal pipe\n");
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
switch (signal)
|
|
||||||
{
|
|
||||||
case 'T': /* SIGTERM */
|
|
||||||
meta_quit (META_EXIT_SUCCESS);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
g_warning ("Spurious character '%c' read from signal pipe", signal);
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -418,8 +378,8 @@ meta_init (void)
|
|||||||
{
|
{
|
||||||
struct sigaction act;
|
struct sigaction act;
|
||||||
sigset_t empty_mask;
|
sigset_t empty_mask;
|
||||||
GIOChannel *channel;
|
ClutterSettings *clutter_settings;
|
||||||
|
|
||||||
sigemptyset (&empty_mask);
|
sigemptyset (&empty_mask);
|
||||||
act.sa_handler = SIG_IGN;
|
act.sa_handler = SIG_IGN;
|
||||||
act.sa_mask = empty_mask;
|
act.sa_mask = empty_mask;
|
||||||
@@ -433,26 +393,19 @@ meta_init (void)
|
|||||||
g_strerror (errno));
|
g_strerror (errno));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (pipe (signal_pipe_fds) != 0)
|
g_unix_signal_add (SIGTERM, on_sigterm, NULL);
|
||||||
g_printerr ("Failed to create signal pipe: %s\n",
|
|
||||||
g_strerror (errno));
|
|
||||||
|
|
||||||
channel = g_io_channel_unix_new (signal_pipe_fds[0]);
|
|
||||||
g_io_channel_set_flags (channel, G_IO_FLAG_NONBLOCK, NULL);
|
|
||||||
g_io_add_watch (channel, G_IO_IN, (GIOFunc) on_signal, NULL);
|
|
||||||
g_io_channel_set_close_on_unref (channel, TRUE);
|
|
||||||
g_io_channel_unref (channel);
|
|
||||||
|
|
||||||
act.sa_handler = &signal_handler;
|
|
||||||
if (sigaction (SIGTERM, &act, NULL) < 0)
|
|
||||||
g_printerr ("Failed to register SIGTERM handler: %s\n",
|
|
||||||
g_strerror (errno));
|
|
||||||
|
|
||||||
if (g_getenv ("MUTTER_VERBOSE"))
|
if (g_getenv ("MUTTER_VERBOSE"))
|
||||||
meta_set_verbose (TRUE);
|
meta_set_verbose (TRUE);
|
||||||
if (g_getenv ("MUTTER_DEBUG"))
|
if (g_getenv ("MUTTER_DEBUG"))
|
||||||
meta_set_debugging (TRUE);
|
meta_set_debugging (TRUE);
|
||||||
|
|
||||||
|
/* We consider running from mutter-launch equivalent to running from bare metal. */
|
||||||
|
if (getenv ("WESTON_LAUNCHER_SOCK"))
|
||||||
|
clutter_set_windowing_backend (CLUTTER_WINDOWING_EGL);
|
||||||
|
|
||||||
|
meta_set_is_wayland_compositor (opt_wayland);
|
||||||
|
|
||||||
if (g_get_home_dir ())
|
if (g_get_home_dir ())
|
||||||
if (chdir (g_get_home_dir ()) < 0)
|
if (chdir (g_get_home_dir ()) < 0)
|
||||||
meta_warning ("Could not change to home directory %s.\n",
|
meta_warning ("Could not change to home directory %s.\n",
|
||||||
@@ -482,7 +435,7 @@ meta_init (void)
|
|||||||
meta_fatal ("Can't specify both SM save file and SM client id\n");
|
meta_fatal ("Can't specify both SM save file and SM client id\n");
|
||||||
|
|
||||||
meta_main_loop = g_main_loop_new (NULL, FALSE);
|
meta_main_loop = g_main_loop_new (NULL, FALSE);
|
||||||
|
|
||||||
meta_ui_init ();
|
meta_ui_init ();
|
||||||
|
|
||||||
/* If we are running with wayland then we don't wait until we have
|
/* If we are running with wayland then we don't wait until we have
|
||||||
@@ -496,6 +449,13 @@ meta_init (void)
|
|||||||
*/
|
*/
|
||||||
meta_clutter_init ();
|
meta_clutter_init ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* XXX: We cannot handle high dpi scaling yet, so fix the scale to 1
|
||||||
|
* for now.
|
||||||
|
*/
|
||||||
|
clutter_settings = clutter_settings_get_default ();
|
||||||
|
g_object_set (clutter_settings, "window-scaling-factor", 1, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user