Compare commits
460 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
dd64f62b2f | ||
![]() |
7b84590c71 | ||
![]() |
2601b30c7e | ||
![]() |
d38f89636a | ||
![]() |
caf6c650a6 | ||
![]() |
e285628cd7 | ||
![]() |
d253580d14 | ||
![]() |
4edfafb61f | ||
![]() |
c07957d6ec | ||
![]() |
423bd70238 | ||
![]() |
2fc9e1af58 | ||
![]() |
baa6d808c2 | ||
![]() |
1e1c26c91a | ||
![]() |
eba27a7e05 | ||
![]() |
4009267c2b | ||
![]() |
8a370c0094 | ||
![]() |
abe0701ce7 | ||
![]() |
eef6570962 | ||
![]() |
a2c7c8f26a | ||
![]() |
91ce46f6f3 | ||
![]() |
c5ebe75424 | ||
![]() |
08161078f4 | ||
![]() |
9def55914c | ||
![]() |
f044eda079 | ||
![]() |
4883b96e0d | ||
![]() |
ca6a1aac2b | ||
![]() |
cc3f6c5ca9 | ||
![]() |
cacdaa0067 | ||
![]() |
016e2aec8e | ||
![]() |
9c5416d598 | ||
![]() |
5f50bc6380 | ||
![]() |
e44aef6d5a | ||
![]() |
2ff904915e | ||
![]() |
565c04b989 | ||
![]() |
7dfc8fd446 | ||
![]() |
f96dc97c4f | ||
![]() |
40163c737c | ||
![]() |
6327b8d15a | ||
![]() |
3053cc0de4 | ||
![]() |
0b89e34439 | ||
![]() |
c5bf60eab4 | ||
![]() |
bdbb852163 | ||
![]() |
4a11f126cd | ||
![]() |
03f736607b | ||
![]() |
5aa3a288dc | ||
![]() |
ddf566a3c4 | ||
![]() |
d50ea010ef | ||
![]() |
9678a412e2 | ||
![]() |
46f4ea7ed7 | ||
![]() |
e3b1c2dea0 | ||
![]() |
5cbac5bf23 | ||
![]() |
7050b97d94 | ||
![]() |
23e9947f7a | ||
![]() |
fc605d2561 | ||
![]() |
ab4c929a07 | ||
![]() |
c251ab5092 | ||
![]() |
57258dc1d4 | ||
![]() |
f1df49ad17 | ||
![]() |
9d8e7371fb | ||
![]() |
84a1b394a1 | ||
![]() |
4ea8b91e0b | ||
![]() |
8e1e0fc344 | ||
![]() |
7186d0ce55 | ||
![]() |
6393789345 | ||
![]() |
2a5c2aa404 | ||
![]() |
d0210c1a97 | ||
![]() |
691c107ce9 | ||
![]() |
5b4924c76e | ||
![]() |
a292d21b6c | ||
![]() |
576cd87a5b | ||
![]() |
e74ed92993 | ||
![]() |
eeed3d605b | ||
![]() |
a3037a6dd1 | ||
![]() |
207fdd4a34 | ||
![]() |
cb242318d4 | ||
![]() |
29cd09a6ca | ||
![]() |
54fc2daa46 | ||
![]() |
a4cc394c22 | ||
![]() |
0a0bcf65ad | ||
![]() |
d36f544069 | ||
![]() |
d99c0ad384 | ||
![]() |
387b53977d | ||
![]() |
c63e5f755f | ||
![]() |
7476419940 | ||
![]() |
25ad3486a4 | ||
![]() |
9198de7d45 | ||
![]() |
88b2b6cb83 | ||
![]() |
8a0b1ceb4c | ||
![]() |
54d18c0196 | ||
![]() |
e24f0a77c4 | ||
![]() |
7fc9a807a0 | ||
![]() |
fdfde62a33 | ||
![]() |
4366687b95 | ||
![]() |
f28fed51da | ||
![]() |
2b940f6aba | ||
![]() |
f42682711b | ||
![]() |
ad159d3ebd | ||
![]() |
faa3e2d04d | ||
![]() |
604a79ad98 | ||
![]() |
ce0c6b8d9f | ||
![]() |
9552ec89fb | ||
![]() |
3a7c1e7b6c | ||
![]() |
6980256a42 | ||
![]() |
3f2dcf1698 | ||
![]() |
44097c1b37 | ||
![]() |
551b188c01 | ||
![]() |
3a786542c4 | ||
![]() |
bb2df9b2c6 | ||
![]() |
7d1e149905 | ||
![]() |
1dcd52838b | ||
![]() |
909a6607c5 | ||
![]() |
1bde397edf | ||
![]() |
015c05fbf6 | ||
![]() |
8ad5ccd2f8 | ||
![]() |
115cc870c7 | ||
![]() |
3112794d83 | ||
![]() |
3528b067d0 | ||
![]() |
0986b660be | ||
![]() |
3bb5086173 | ||
![]() |
69467842ab | ||
![]() |
57077435ed | ||
![]() |
46de0ed462 | ||
![]() |
5086626805 | ||
![]() |
bbbcd8c631 | ||
![]() |
3b61b85f2c | ||
![]() |
cd20f1bc0b | ||
![]() |
8b52782ed4 | ||
![]() |
849050be95 | ||
![]() |
5c27a91684 | ||
![]() |
764c472edb | ||
![]() |
d0529b7482 | ||
![]() |
8f4621240a | ||
![]() |
e039add240 | ||
![]() |
dbd8d4d598 | ||
![]() |
522542c486 | ||
![]() |
fc67c707e4 | ||
![]() |
c354e7e81b | ||
![]() |
bf40409d97 | ||
![]() |
57d083730e | ||
![]() |
dc242e46c2 | ||
![]() |
7e1d1003c9 | ||
![]() |
3bb33d384f | ||
![]() |
214f31257b | ||
![]() |
506ddc3d6c | ||
![]() |
c3e8646af3 | ||
![]() |
8c17b670fb | ||
![]() |
12d2e1f600 | ||
![]() |
c20b007985 | ||
![]() |
ef480e9120 | ||
![]() |
8c1c77482d | ||
![]() |
e633606ca9 | ||
![]() |
6fdc23d0b7 | ||
![]() |
4862872c78 | ||
![]() |
ae2e4c5114 | ||
![]() |
06b5be2d13 | ||
![]() |
56fb8a81b3 | ||
![]() |
90a3d613ca | ||
![]() |
c2af13cf31 | ||
![]() |
b0cf0b2442 | ||
![]() |
1c569c2d0e | ||
![]() |
e3855c77af | ||
![]() |
21fe5be026 | ||
![]() |
57bc974a57 | ||
![]() |
3b51405255 | ||
![]() |
73dbb4b9a5 | ||
![]() |
51acc3ee31 | ||
![]() |
a6f206f07c | ||
![]() |
9504fdd2cb | ||
![]() |
b76c3312e9 | ||
![]() |
fd7db8e6b3 | ||
![]() |
b7840bec7d | ||
![]() |
f743539886 | ||
![]() |
15e01152da | ||
![]() |
2103ff6a5c | ||
![]() |
8ab136b7ea | ||
![]() |
5205821fb9 | ||
![]() |
7187206ef5 | ||
![]() |
96221e6c04 | ||
![]() |
7fdfbad6d4 | ||
![]() |
2a5b068863 | ||
![]() |
0c505faded | ||
![]() |
b2dd4f33f7 | ||
![]() |
47b21b3547 | ||
![]() |
c119f98bac | ||
![]() |
d20078574e | ||
![]() |
26bd4fde5c | ||
![]() |
2af49e503f | ||
![]() |
6ea6af6eb4 | ||
![]() |
10df80762c | ||
![]() |
f86032d700 | ||
![]() |
a8eb33f6fd | ||
![]() |
bd19de9429 | ||
![]() |
2ca2838548 | ||
![]() |
df8234c5e3 | ||
![]() |
d03ffd801e | ||
![]() |
7a4c808e43 | ||
![]() |
4f1d62170b | ||
![]() |
e10804727d | ||
![]() |
e430e051b7 | ||
![]() |
696d9d2fa9 | ||
![]() |
f6dd081acd | ||
![]() |
eddd6f8e9b | ||
![]() |
dfa4c7d670 | ||
![]() |
a487d4dd01 | ||
![]() |
c2ecdd0524 | ||
![]() |
50b9042ac2 | ||
![]() |
f5e75de330 | ||
![]() |
1ffe1eae4d | ||
![]() |
970a446bd8 | ||
![]() |
8880dffbdb | ||
![]() |
5b6621811c | ||
![]() |
c2a9ccb7e2 | ||
![]() |
4608cb6027 | ||
![]() |
ad61676af0 | ||
![]() |
c7c1225393 | ||
![]() |
c7dc6928a9 | ||
![]() |
7cfaa6a6a8 | ||
![]() |
673a9e2521 | ||
![]() |
9ef4ac00df | ||
![]() |
46f0cffa53 | ||
![]() |
b6203192b5 | ||
![]() |
992a15e640 | ||
![]() |
f1620abfad | ||
![]() |
591523e473 | ||
![]() |
72769e113a | ||
![]() |
387cb83c8a | ||
![]() |
577e5e2e1a | ||
![]() |
47cf63bebe | ||
![]() |
0e58906194 | ||
![]() |
13c7020b80 | ||
![]() |
5ed6e37e3c | ||
![]() |
9ed3a77102 | ||
![]() |
acd99927f9 | ||
![]() |
13c92f63bb | ||
![]() |
12400caef8 | ||
![]() |
a1b3fdfbd6 | ||
![]() |
4b47c59a04 | ||
![]() |
5d223c189c | ||
![]() |
c5d0923453 | ||
![]() |
41f8fccf6b | ||
![]() |
e02ad64fef | ||
![]() |
8db53af1f8 | ||
![]() |
defaa5876c | ||
![]() |
e7870cb665 | ||
![]() |
64eb42023c | ||
![]() |
e7faef860b | ||
![]() |
4dfbe9a493 | ||
![]() |
6a17bb4cf5 | ||
![]() |
58496de595 | ||
![]() |
f80a15f312 | ||
![]() |
9df2d83aa0 | ||
![]() |
1582448553 | ||
![]() |
eefa62bcd4 | ||
![]() |
e216b6ca0f | ||
![]() |
8a33880c00 | ||
![]() |
7a8c45dda8 | ||
![]() |
af01ddaf5d | ||
![]() |
5ceffe86ee | ||
![]() |
49df033b4e | ||
![]() |
ac3465ffbb | ||
![]() |
884ab602cb | ||
![]() |
d944bda7b9 | ||
![]() |
11f7cfb27b | ||
![]() |
64358d9901 | ||
![]() |
2efed44257 | ||
![]() |
69c72ebb26 | ||
![]() |
00a842f41b | ||
![]() |
460dc9f2ef | ||
![]() |
be46869782 | ||
![]() |
2863eba2e7 | ||
![]() |
e0b698d365 | ||
![]() |
edeac1de09 | ||
![]() |
9281a1c191 | ||
![]() |
a3826987e6 | ||
![]() |
e46c7fd27b | ||
![]() |
0bb8d29be4 | ||
![]() |
1f905bd0e2 | ||
![]() |
cce5ad7cc0 | ||
![]() |
97a4cc8c9b | ||
![]() |
592374bc62 | ||
![]() |
2e0f979613 | ||
![]() |
6d365a700c | ||
![]() |
72a9eb6a3e | ||
![]() |
ae3cfe6c01 | ||
![]() |
da557cb712 | ||
![]() |
c1e41d558f | ||
![]() |
889844b004 | ||
![]() |
6311a3ebc1 | ||
![]() |
0f6c1db2ba | ||
![]() |
e6ec1abbfa | ||
![]() |
42621c960e | ||
![]() |
8e9ae2eb50 | ||
![]() |
ca7843372c | ||
![]() |
1202714428 | ||
![]() |
45addabe5d | ||
![]() |
31abad0ea5 | ||
![]() |
c169d29836 | ||
![]() |
df8ad83cec | ||
![]() |
381a9c2650 | ||
![]() |
dc3529d98a | ||
![]() |
e15bc37225 | ||
![]() |
160150d127 | ||
![]() |
6e02fb80c4 | ||
![]() |
98b0a37442 | ||
![]() |
4d437e32e0 | ||
![]() |
7db236b2a4 | ||
![]() |
377e2ed8a5 | ||
![]() |
99cfbac473 | ||
![]() |
34f06ee9e5 | ||
![]() |
f212723e71 | ||
![]() |
660eceb61a | ||
![]() |
d395d75e26 | ||
![]() |
2aea49a8d0 | ||
![]() |
c996dde5cb | ||
![]() |
4bdd985faf | ||
![]() |
6e831c88a6 | ||
![]() |
0e3d164117 | ||
![]() |
ec6460382c | ||
![]() |
436d3ff8a9 | ||
![]() |
e4269002ce | ||
![]() |
4f2bb583bf | ||
![]() |
702f3fc691 | ||
![]() |
4cad9513b4 | ||
![]() |
24974816a6 | ||
![]() |
773ae8dc65 | ||
![]() |
7f14298126 | ||
![]() |
a39cabfadb | ||
![]() |
4df3e987c6 | ||
![]() |
64c523c534 | ||
![]() |
fba2c49aae | ||
![]() |
e623406c99 | ||
![]() |
de36d51b91 | ||
![]() |
e6d5e98c9d | ||
![]() |
832b7f9431 | ||
![]() |
171a273d11 | ||
![]() |
45b0765f2f | ||
![]() |
2a773e0c85 | ||
![]() |
b5152c3327 | ||
![]() |
d4f8c29221 | ||
![]() |
1b83e8a64c | ||
![]() |
36eb5c305d | ||
![]() |
c72dbeb611 | ||
![]() |
63aec4566d | ||
![]() |
2cafb8be2d | ||
![]() |
64544fa0ed | ||
![]() |
51ccaaaff0 | ||
![]() |
b09f47d17f | ||
![]() |
1dbefc4e36 | ||
![]() |
7f6a77232f | ||
![]() |
580feb0c85 | ||
![]() |
842bc4421c | ||
![]() |
aba87407e9 | ||
![]() |
112ef93e19 | ||
![]() |
c4efd1c789 | ||
![]() |
7e61ef0936 | ||
![]() |
e9709b7ff9 | ||
![]() |
027593faa5 | ||
![]() |
491c5b622e | ||
![]() |
5e9621ed80 | ||
![]() |
f5de1c78af | ||
![]() |
b0774d795c | ||
![]() |
034ab77c30 | ||
![]() |
a6a9d3f448 | ||
![]() |
a215852d3c | ||
![]() |
264a0bbd15 | ||
![]() |
55a4d0e0cb | ||
![]() |
d900d83522 | ||
![]() |
e8b0c11703 | ||
![]() |
3d337a98d9 | ||
![]() |
3e38a48c40 | ||
![]() |
5876f2e3e5 | ||
![]() |
aeb589c176 | ||
![]() |
14dd766e11 | ||
![]() |
24ff4b5622 | ||
![]() |
7f3362bdce | ||
![]() |
6b5cf2eb61 | ||
![]() |
fb0cd80332 | ||
![]() |
579bf2105e | ||
![]() |
995e8040dd | ||
![]() |
0503f6bb9a | ||
![]() |
87fe9685b5 | ||
![]() |
2d9b8bb2d0 | ||
![]() |
74b1a9e2b9 | ||
![]() |
fcc178ee8c | ||
![]() |
d8696c17be | ||
![]() |
b07aea467e | ||
![]() |
04ef448927 | ||
![]() |
790bfcad9a | ||
![]() |
fbfab93c63 | ||
![]() |
70c0d39fa7 | ||
![]() |
7d43bde019 | ||
![]() |
7743c70d47 | ||
![]() |
c9343e3ee3 | ||
![]() |
3abaf506a6 | ||
![]() |
9de142db09 | ||
![]() |
2942b22ccf | ||
![]() |
94e6e55ef7 | ||
![]() |
34fc234fd7 | ||
![]() |
c3ffd28bb6 | ||
![]() |
1c680be11a | ||
![]() |
a362c08f4e | ||
![]() |
380154af0a | ||
![]() |
d482590c84 | ||
![]() |
b3c572b8e3 | ||
![]() |
c64eb94724 | ||
![]() |
d8f569eaf5 | ||
![]() |
57c31a56f4 | ||
![]() |
8b21df92f0 | ||
![]() |
e914595062 | ||
![]() |
a2a3188331 | ||
![]() |
453020c315 | ||
![]() |
d794db876a | ||
![]() |
b33b4a8e2c | ||
![]() |
6f74a63bbd | ||
![]() |
5298d1c8d0 | ||
![]() |
493f619adc | ||
![]() |
a613a55658 | ||
![]() |
3fe5a676c2 | ||
![]() |
19420f147f | ||
![]() |
32b7743735 | ||
![]() |
093e101252 | ||
![]() |
6f873be7fa | ||
![]() |
f37dd25e92 | ||
![]() |
d48df249c9 | ||
![]() |
e48c3dac87 | ||
![]() |
3516902fae | ||
![]() |
66185a468c | ||
![]() |
84930f1d78 | ||
![]() |
07273a075d | ||
![]() |
3900aa10f8 | ||
![]() |
d8058138ab | ||
![]() |
ac49259fc7 | ||
![]() |
12dbb90a5a | ||
![]() |
90f2a3ae4c | ||
![]() |
867e10dbcc | ||
![]() |
9a57626556 | ||
![]() |
b9e21b76ae | ||
![]() |
2ecc50af53 | ||
![]() |
1cebe19bbe | ||
![]() |
71055556ee | ||
![]() |
4d9d66da65 | ||
![]() |
30bdadb519 | ||
![]() |
c388ccf477 | ||
![]() |
a2d54bb2ab | ||
![]() |
cefadb55b1 | ||
![]() |
06e31e4c03 | ||
![]() |
869a137c2f | ||
![]() |
f4e4a05a9e | ||
![]() |
df15843407 | ||
![]() |
d8eb47e2b7 | ||
![]() |
e28a36affd | ||
![]() |
53534b4ded | ||
![]() |
079dd60e3d | ||
![]() |
5d12f00b3b | ||
![]() |
95f3bb3b81 | ||
![]() |
2bfe6d2da5 | ||
![]() |
27e0e44d8b | ||
![]() |
7e5fb3e1a0 | ||
![]() |
2ac17cc7ba | ||
![]() |
7b32b7fcd1 |
22
.gitignore
vendored
22
.gitignore
vendored
@@ -46,7 +46,6 @@ POTFILES
|
||||
po/*.pot
|
||||
50-metacity-desktop-key.xml
|
||||
50-metacity-key.xml
|
||||
inlinepixbufs.h
|
||||
libmutter.pc
|
||||
mutter
|
||||
mutter-theme-viewer
|
||||
@@ -56,12 +55,14 @@ org.gnome.mutter.gschema.xml
|
||||
testasyncgetprop
|
||||
testboxes
|
||||
testgradient
|
||||
m4/*
|
||||
mutter-grayscale
|
||||
mutter-mag
|
||||
mutter-message
|
||||
mutter-window-demo
|
||||
focus-window
|
||||
test-attached
|
||||
test-focus
|
||||
test-gravity
|
||||
test-resizing
|
||||
test-size-hints
|
||||
@@ -74,4 +75,23 @@ src/mutter-enum-types.[ch]
|
||||
src/stamp-mutter-enum-types.h
|
||||
src/mutter-marshal.[ch]
|
||||
src/stamp-mutter-marshal.h
|
||||
src/meta-dbus-xrandr.[ch]
|
||||
src/meta-dbus-idle-monitor.[ch]
|
||||
src/mutter-plugins.pc
|
||||
doc/reference/*.args
|
||||
doc/reference/*.bak
|
||||
doc/reference/*.hierarchy
|
||||
doc/reference/*.interfaces
|
||||
doc/reference/*.prerequisites
|
||||
doc/reference/*.signals
|
||||
doc/reference/*.stamp
|
||||
doc/reference/html/
|
||||
doc/reference/xml/
|
||||
doc/reference/meta-decl-list.txt
|
||||
doc/reference/meta-decl.txt
|
||||
doc/reference/meta-overrides.txt
|
||||
doc/reference/meta-undeclared.txt
|
||||
doc/reference/meta-undocumented.txt
|
||||
doc/reference/meta-unused.txt
|
||||
doc/reference/meta-docs.sgml
|
||||
doc/reference/meta.types
|
||||
|
@@ -1,6 +1,10 @@
|
||||
|
||||
SUBDIRS=src po doc
|
||||
|
||||
ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS}
|
||||
|
||||
EXTRA_DIST = HACKING MAINTAINERS rationales.txt
|
||||
|
||||
DISTCLEANFILES = intltool-extract intltool-merge intltool-update po/stamp-it po/.intltool-merge-cache
|
||||
|
||||
DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc
|
||||
|
257
NEWS
257
NEWS
@@ -1,3 +1,260 @@
|
||||
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
|
||||
======
|
||||
|
||||
Translations:
|
||||
Ask H. Larsen [da], Gabor Kelemen [hu], Duarte Loreto [pt],
|
||||
Yosef Or Boczko [he]
|
||||
|
||||
3.9.92
|
||||
======
|
||||
* Don't create a dummy texture for the texture pipeline template [Neil; #707458]
|
||||
* Remove holes generated by disabling the laptop lid [Giovanni; #707473]
|
||||
* https://bugzilla.gnome.org/show_bug.cgi?id=707474 [Giovanni; #707474]
|
||||
* Don't require plugins to pass event to Clutter [Giovanni; #707482]
|
||||
* Add support for more cursor types [Giovanni; #707919]
|
||||
* Immediately fire idle watches that are already expired [Giovanni; #707302]
|
||||
* Misc bug fixes [Giovanni, Colin, Pavel; #707649, #707563, #708070]
|
||||
|
||||
Contributors:
|
||||
Giovanni Campagna, Adel Gadllah, Colin Guthrie, Neil Roberts,
|
||||
Jasper St. Pierre, Ray Strode, 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; #706005]
|
||||
* 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]
|
||||
* Turn blending off when drawing entirely opaque regions [Jasper; #706930]
|
||||
* Check event timestamps before reconfiguring [Giovanni; #706735]
|
||||
* Misc bug fixes [Giovanni, Colin, Seán, Jasper, Cosimo; #706582, #706598,
|
||||
#706787, #706729, #706825, #707081, #707090, #707250, #707267]
|
||||
|
||||
Contributors:
|
||||
Giovanni Campagna, Cosimo Cecchi, Adel Gadllah, Colin Guthrie, Kalev Lember,
|
||||
Tim Lunn, Jasper St. Pierre, 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
|
||||
======
|
||||
* Add support for _GTK_FRAME_EXTENTS [Jasper; #705766]
|
||||
* Fix quick consecutive <super> presses breaking keyboard input [Alban; #666101]
|
||||
* Work towards running as wayland compositor [Giovanni]
|
||||
- Add DBus API for display configuration
|
||||
[#705670, #706231, #706233, #706322, #706382]
|
||||
- Add abstraction layer for cursor tracking [#705911]
|
||||
- Add support for plugin modality under wayland [#705917]
|
||||
* Disable GTK+ scaling [Alexander; #706388]
|
||||
* Disable blending while updating tower [Robert]
|
||||
* Misc bug fixes and cleanups [Adel, Jasper, Giovanni, Colin, Rico, Florian;
|
||||
#703332, #704437, #706207]
|
||||
|
||||
Contributors:
|
||||
Robert Bragg, Giovanni Campagna, Alban Crequy, Adel Gadllah,
|
||||
Alexander Larsson, Florian Müllner, Jasper St. Pierre, Rico Tzschichholz,
|
||||
Colin Walters
|
||||
|
||||
Translations:
|
||||
Jiro Matsuzawa [ja], Kjartan Maraas [nb], Matej Urbančič [sl],
|
||||
Marek Černocký [cs], Daniel Mustieles [es], Rafael Ferreira [pt_BR],
|
||||
Yaron Shahrabani [he], Ján Kyselica [sk]
|
||||
|
||||
3.9.5
|
||||
=====
|
||||
* Don't select for touch events on the stage [Jasper; #697192]
|
||||
* Don't queue redraws for obscured regions [Adel; #703332]
|
||||
* Export timestamp of global keybinding events [Bastien; #704858]
|
||||
* Misc bug fixes and cleanups [Jasper, Rico; #703970]
|
||||
|
||||
Contributors:
|
||||
Adel Gadllah, Bastien Nocera, Jasper St. Pierre, Rico Tzschichholz
|
||||
|
||||
3.9.4
|
||||
=====
|
||||
* Tweak window shadows [Allan; #702141]
|
||||
* Ignore our own focus events for focus prediction [Jasper; #701017]
|
||||
* Add API to query if the stage is focused [Jasper; #700735]
|
||||
* Add API to query the monitor for a given position [Adel]
|
||||
* Don't force attached dialogs to be border-only [Florian; #702764]
|
||||
* Allow slicing of backgrounds to avoid texture size limits [Ray; #702283]
|
||||
* Miscellaneous bug fixes and cleanups [Adel; #701224, #702564]
|
||||
|
||||
Contributors:
|
||||
Allan Day, Adel Gadllah, Florian Müllner, Jasper St. Pierre, Ray Strode
|
||||
|
||||
3.9.3
|
||||
=====
|
||||
* Ensure events are always reported to the grab window [Rui; #701219]
|
||||
* Use new clutter_stage_set_paint_callback() function to prevent dropping
|
||||
frames with frame synced toolkits [Owen; #698794]
|
||||
|
||||
Contributors:
|
||||
Rui Matos, Owen W. Taylor
|
||||
|
||||
3.9.2
|
||||
=====
|
||||
* Add meta_window_can_close() function [Jasper; #699269]
|
||||
* Add support for string-array preferences [Florian; #700223]
|
||||
* Fix a potential race condition with _NET_WM_MOVERESIZE [Jasper; #699777]
|
||||
* Fix shade window action [Stef; #693714]
|
||||
* Remove overlay_group [Giovanni; #700735]
|
||||
* Improve tracking of the focus window [Dan, Jasper; #647706]
|
||||
* Add API to freeze/unfreeze the keyboard [Rui; #697001]
|
||||
* Grab and emit a signal when XK_ISO_Next_Group is pressed [Rui; #697002]
|
||||
* Misc bug fixes and cleanups [Dieter, Jasper, Rui; #699636, #700735, #697000]
|
||||
|
||||
Contributors:
|
||||
Giovanni Campagna, Rui Matos, Florian Müllner, Jasper St. Pierre,
|
||||
Dieter Verfaillie, Stef Walter, Dan Winship
|
||||
|
||||
Translations:
|
||||
Kjartan Maraas [nb], Ján Kyselica [sk]
|
||||
|
||||
3.9.1
|
||||
=====
|
||||
* Fix miscellaneous memory leaks [Pavel; #698710]
|
||||
* Misc fixes and cleanups [Stef, Simon; #698179, #697758]
|
||||
|
||||
Contributors:
|
||||
Simon McVittie, Pavel Vasin, Stef Walter
|
||||
|
||||
3.8.1
|
||||
=====
|
||||
* Fix crash when getting default font [Bastien; #696814]
|
||||
* Fix ungrabbing of keybindings [Rui; #697003]
|
||||
* Misc fixes and cleanups [Jasper, Simon; #697758]
|
||||
|
||||
Contributors:
|
||||
Jasper Lievisse Adriaanse, Rui Matos, Simon McVittie, Bastien Nocera
|
||||
|
||||
Translations:
|
||||
Guillaume Desmottes [fr], Shankar Prasad [kn], Bruce Cowan [en_GB],
|
||||
Andika Triwidada [id], Yaron Shahrabani [he], Kjartan Maraas [nb],
|
||||
Gheyret Kenji [ug]
|
||||
|
||||
3.8.0
|
||||
=====
|
||||
* Address major memory leak when changing backgrounds [Ray; #696157]
|
||||
|
||||
Contributors:
|
||||
Ray Strode
|
||||
|
||||
Translations:
|
||||
Sandeep Sheshrao Shedmake [mr], Victor Ibragimov [tg], Gabor Kelemen [hu],
|
||||
Ville-Pekka Vainio [fi], Rajesh Ranjan [hi], Dr.T.Vasudevan [ta],
|
||||
ManojKumar Giri [or], Yuri Myasoedov [ru], Petr Kovar [cs],
|
||||
Jiro Matsuzawa [ja], Krishnababu Krothapalli [te], Ani Peter [ml],
|
||||
Inaki Larranaga Murgoitio [eu]
|
||||
|
||||
3.7.92
|
||||
======
|
||||
* Build and improve reference docs [Tomeu; #676856, #695641, #695935]
|
||||
* Add tracking of whether there are fullscreen windows [Owen; 649748]
|
||||
* Misc bug fixes and cleanups [Adel, Giovanni, Owen, Jasper, Florian; #695269,
|
||||
#695711, #694046, #695813, #695881, #676856, #696053, #682779, #696089,
|
||||
#696091, #696087]
|
||||
|
||||
Contributors:
|
||||
Giovanni Campagna, Adel Gadllah, Florian Müllner, Jasper St. Pierre,
|
||||
Tomeu Vizoso, Owen W. Taylor
|
||||
|
||||
Translations:
|
||||
Chao-Hsiung Liao [zh_HK, zh_TW], Rafael Ferreira [pt_BR],
|
||||
Ihar Hrachyshka [be], Nilamdyuti Goswami [as], Matej Urbančič [sl],
|
||||
Dimitris Spingos [el], Jan Kyselica [sk], Khaled Hosny [ar],
|
||||
Мирослав Николић [sr, sr@latin], Duarte Loreto [pt], Sweta Kothari [gu],
|
||||
Milo Casagrande [it], Changwoo Ryu [ko], Gil Forcada [ca],
|
||||
Carles Ferrando [ca@valencia], Mattias Põldaru [et], Alexandre Franke [fr],
|
||||
Ask H. Larsen [da], Rūdolfs Mazurs [lv], Nguyễn Thái Ngọc Duy [vi]
|
||||
|
||||
3.7.91
|
||||
======
|
||||
* Fix windows being treated as remote after hostname changes [Ray; #688716]
|
||||
* Add meta_window_get_all_monitors() method [Adel; #646861]
|
||||
* Add grab API for externally defined accelerators [Florian; #643111]
|
||||
* Make session registration an explicit step [Ray; #694876]
|
||||
* Avoid unnecessary stage redraws [Adel; #694988, #695006]
|
||||
* Misc fixes [Giovanni, Ray, Jasper, Rui, Pavel, Owen; #694801, #694725,
|
||||
#694641, #694393, #678917, #695093, #694837, #695135, #694771, #694321]
|
||||
|
||||
Contributors:
|
||||
Giovanni Campagna, Adel Gadllah, Rui Matos, Florian Müllner,
|
||||
Jasper St. Pierre, Ray Strode, Owen Taylor, Pavel Vasin
|
||||
|
||||
Translations:
|
||||
Daniel Mustieles [es], Yaron Shahrabani [he], A S Alam [pa], Piotr Drąg [pl],
|
||||
Gheyret Kenji [ug], Alexandre Franke [fr], Milo Casagrande [it],
|
||||
Fran Diéguez [gl], Dimitris Spingos [el], Мирослав Николић [sr, sr@latin],
|
||||
Chao-Hsiung Liao [zh_HK, zh_TW], Nguyễn Thái Ngọc Duy [vi],
|
||||
Aurimas Černius [lt], Mario Blättermann [de], Kjartan Maraas [nb]
|
||||
|
||||
3.7.90
|
||||
======
|
||||
* Support _NET_WM_OPAQUE_REGION [Jasper, Adel; #679901]
|
||||
* Add wrapper for XI2.3 pointer barriers [Jasper; #677215]
|
||||
* Update style of resize popups [Cosimo; #692741]
|
||||
* Implement compositor <-> application frame synchronization [Owen; #685463]
|
||||
* Handle animated backgrounds [Ray; #682427]
|
||||
* Add a new window group for override-redirect windows [Gayan; #633620]
|
||||
* Pass on pointer events on guard window to Clutter [Jasper; #681540]
|
||||
* Show correct shortcut in window menus [Giovanni; #694045]
|
||||
* Don't put minimized windows at the back of alt-tab [Jasper; #693991]
|
||||
* Misc bug fixes and cleanups [Jasper, Rico, Adel, Florian, Rui, Giovanni,
|
||||
Owen; #692679, #693354, #690581, #693439, #692718, #693475, #693482, #693540,
|
||||
#690580, #680990, #693833, #693922, #693854, #694224]
|
||||
|
||||
Contributors:
|
||||
Giovanni Campagna, Cosimo Cecchi, Adel Gadllah, Rui Matos, Florian Müllner,
|
||||
Gayan Perera, Jasper St. Pierre, Ray Strode, Owen Taylor, Rico Tzschichholz
|
||||
|
||||
Translations:
|
||||
Fran Diéguez [gl], A S Alam [pa], Alexandre Franke [fr], Aurimas Černius [lt],
|
||||
Мирослав Николић [sr, sr@latin], Fran Diéguez [gl], Piotr Drąg [pl],
|
||||
Luca Ferretti [it], Daniel Mustieles [es]
|
||||
|
||||
3.7.5
|
||||
=====
|
||||
* Don't allow multiline window titles [Jon; #683056]
|
||||
* Make meta_window_located_on_workspace() public [Jasper; #691744]
|
||||
* Request XI2.3 [Colin; #692877]
|
||||
* Add meta_window_set_icon_geometry() method [Florian; #692997]
|
||||
* Require XFixes 5.0 [Jasper; #677215]
|
||||
* Change unredirection hints to match spec changes [Adel; #693064]
|
||||
* Improve unredict heuristicts [Adel; #683786]
|
||||
* Misc bug fixes and cleanups [Florian, Jasper, Adel; #691874, #679901,
|
||||
#692952, #693042]
|
||||
|
||||
Contributors:
|
||||
Adel Gadllah, William Jon McCann, Florian Müllner, Jasper St. Pierre,
|
||||
Colin Walters
|
||||
|
||||
Translations:
|
||||
Daniel Mustieles [es], Ihar Hrachyshka [be], Nilamdyuti Goswami [as],
|
||||
Gheyret Kenji [ug], Kjartan Maraas [nb], Yaron Shahrabani [he],
|
||||
Piotr Drąg [pl], Chao-Hsiung Liao [zh_HK,zh_TW], Milo Casagrande [it]
|
||||
|
||||
3.7.4
|
||||
=====
|
||||
* Add support for bypass compositor hints [Adel; #683020]
|
||||
|
30
configure.ac
30
configure.ac
@@ -1,8 +1,8 @@
|
||||
AC_PREREQ(2.50)
|
||||
|
||||
m4_define([mutter_major_version], [3])
|
||||
m4_define([mutter_minor_version], [7])
|
||||
m4_define([mutter_micro_version], [4])
|
||||
m4_define([mutter_minor_version], [10])
|
||||
m4_define([mutter_micro_version], [0.1])
|
||||
|
||||
m4_define([mutter_version],
|
||||
[mutter_major_version.mutter_minor_version.mutter_micro_version])
|
||||
@@ -12,6 +12,7 @@ m4_define([mutter_plugin_api_version], [3])
|
||||
AC_INIT([mutter], [mutter_version],
|
||||
[http://bugzilla.gnome.org/enter_bug.cgi?product=mutter])
|
||||
|
||||
AC_CONFIG_MACRO_DIR([m4])
|
||||
AC_CONFIG_SRCDIR(src/core/display.c)
|
||||
AC_CONFIG_HEADERS(config.h)
|
||||
|
||||
@@ -67,14 +68,16 @@ CANBERRA_GTK_VERSION=0.26
|
||||
CLUTTER_PACKAGE=clutter-1.0
|
||||
|
||||
MUTTER_PC_MODULES="
|
||||
gtk+-3.0 >= 3.3.7
|
||||
gtk+-3.0 >= 3.9.11
|
||||
gio-2.0 >= 2.25.10
|
||||
pango >= 1.2.0
|
||||
cairo >= 1.10.0
|
||||
gsettings-desktop-schemas >= 3.3.0
|
||||
gsettings-desktop-schemas >= 3.7.3
|
||||
xcomposite >= 0.2 xfixes xrender xdamage xi >= 1.6.0
|
||||
$CLUTTER_PACKAGE >= 1.9.10
|
||||
cogl-1.0 >= 1.9.6
|
||||
$CLUTTER_PACKAGE >= 1.15.90
|
||||
cogl-1.0 >= 1.15.6
|
||||
upower-glib > 0.9.11
|
||||
gnome-desktop-3.0
|
||||
"
|
||||
|
||||
GLIB_GSETTINGS
|
||||
@@ -118,9 +121,6 @@ AM_GLIB_GNU_GETTEXT
|
||||
## here we get the flags we'll actually use
|
||||
# GRegex requires Glib-2.14.0
|
||||
PKG_CHECK_MODULES(ALL, glib-2.0 >= 2.14.0)
|
||||
# gtk_window_set_icon_name requires gtk2+-2.6.0
|
||||
PKG_CHECK_MODULES(MUTTER_MESSAGE, gtk+-3.0)
|
||||
PKG_CHECK_MODULES(MUTTER_WINDOW_DEMO, gtk+-3.0)
|
||||
|
||||
# Unconditionally use this dir to avoid a circular dep with gnomecc
|
||||
GNOME_KEYBINDINGS_KEYSDIR="${datadir}/gnome-control-center/keybindings"
|
||||
@@ -201,6 +201,9 @@ fi
|
||||
|
||||
PKG_CHECK_MODULES(MUTTER, $MUTTER_PC_MODULES)
|
||||
|
||||
PKG_CHECK_EXISTS([xi >= 1.6.99.1],
|
||||
AC_DEFINE([HAVE_XI23],[1],[Define if you have support for XInput 2.3 or greater]))
|
||||
|
||||
# This is used for plugins
|
||||
AC_SUBST(CLUTTER_PACKAGE)
|
||||
PKG_CHECK_MODULES(CLUTTER, $CLUTTER_PACKAGE)
|
||||
@@ -304,9 +307,6 @@ if test "x$found_xsync" = "xyes"; then
|
||||
fi
|
||||
|
||||
MUTTER_LIBS="$MUTTER_LIBS $XSYNC_LIBS $RANDR_LIBS $SHAPE_LIBS $X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS -lm"
|
||||
MUTTER_MESSAGE_LIBS="$MUTTER_MESSAGE_LIBS $X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS"
|
||||
MUTTER_WINDOW_DEMO_LIBS="$MUTTER_WINDOW_DEMO_LIBS $X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS -lm"
|
||||
MUTTER_PROPS_LIBS="$MUTTER_PROPS_LIBS $X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS"
|
||||
|
||||
found_sm=no
|
||||
case "$MUTTER_LIBS" in
|
||||
@@ -361,6 +361,8 @@ if test "x$enable_debug" = "xyes"; then
|
||||
CFLAGS="$CFLAGS -g -O"
|
||||
fi
|
||||
|
||||
GTK_DOC_CHECK([1.15], [--flavour no-tmpl])
|
||||
|
||||
#### Warnings (last since -Werror can disturb other tests)
|
||||
|
||||
# Stay command-line compatible with the gnome-common configure option. Here
|
||||
@@ -431,11 +433,11 @@ AC_CONFIG_FILES([
|
||||
Makefile
|
||||
doc/Makefile
|
||||
doc/man/Makefile
|
||||
doc/reference/Makefile
|
||||
doc/reference/meta-docs.sgml
|
||||
src/Makefile
|
||||
src/wm-tester/Makefile
|
||||
src/libmutter.pc
|
||||
src/mutter-plugins.pc
|
||||
src/tools/Makefile
|
||||
src/compositor/plugins/Makefile
|
||||
po/Makefile.in
|
||||
])
|
||||
|
@@ -1,4 +1,4 @@
|
||||
SUBDIRS = man
|
||||
SUBDIRS = man reference
|
||||
|
||||
EXTRA_DIST=theme-format.txt dialogs.txt code-overview.txt \
|
||||
how-to-get-focus-right.txt
|
||||
|
@@ -1,4 +1,3 @@
|
||||
man_MANS = mutter.1 mutter-theme-viewer.1 \
|
||||
mutter-window-demo.1 mutter-message.1
|
||||
man_MANS = mutter.1
|
||||
|
||||
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).
|
166
doc/reference/Makefile.am
Normal file
166
doc/reference/Makefile.am
Normal file
@@ -0,0 +1,166 @@
|
||||
## Process this file with automake to produce Makefile.in
|
||||
|
||||
# We require automake 1.6 at least.
|
||||
AUTOMAKE_OPTIONS = 1.6
|
||||
|
||||
# This is a blank Makefile.am for using gtk-doc.
|
||||
# Copy this to your project's API docs directory and modify the variables to
|
||||
# suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples
|
||||
# of using the various options.
|
||||
|
||||
# The name of the module, e.g. 'glib'.
|
||||
DOC_MODULE=meta
|
||||
|
||||
# Uncomment for versioned docs and specify the version of the module, e.g. '2'.
|
||||
#DOC_MODULE_VERSION=2
|
||||
|
||||
|
||||
# The top-level SGML file. You can change this if you want to.
|
||||
DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.sgml
|
||||
|
||||
# Directories containing the source code, relative to $(srcdir).
|
||||
# gtk-doc will search all .c and .h files beneath these paths
|
||||
# for inline comments documenting functions and macros.
|
||||
# e.g. DOC_SOURCE_DIR=../../../gtk ../../../gdk
|
||||
DOC_SOURCE_DIR=../../src/
|
||||
|
||||
# Extra options to pass to gtkdoc-scangobj. Not normally needed.
|
||||
SCANGOBJ_OPTIONS=
|
||||
|
||||
# Extra options to supply to gtkdoc-scan.
|
||||
# e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED"
|
||||
SCAN_OPTIONS=--rebuild-types
|
||||
|
||||
# Extra options to supply to gtkdoc-mkdb.
|
||||
# e.g. MKDB_OPTIONS=--xml-mode --output-format=xml
|
||||
MKDB_OPTIONS=--xml-mode --output-format=xml
|
||||
|
||||
# Extra options to supply to gtkdoc-mktmpl
|
||||
# e.g. MKTMPL_OPTIONS=--only-section-tmpl
|
||||
MKTMPL_OPTIONS=
|
||||
|
||||
# Extra options to supply to gtkdoc-mkhtml
|
||||
MKHTML_OPTIONS=
|
||||
|
||||
# Extra options to supply to gtkdoc-fixref. Not normally needed.
|
||||
# e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html
|
||||
FIXXREF_OPTIONS=
|
||||
|
||||
# Used for dependencies. The docs will be rebuilt if any of these change.
|
||||
# e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h
|
||||
# e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c
|
||||
HFILE_GLOB=$(top_srcdir)/src/*.h
|
||||
CFILE_GLOB=$(top_srcdir)/src/*.c
|
||||
|
||||
# Extra header to include when scanning, which are not under DOC_SOURCE_DIR
|
||||
# e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h
|
||||
EXTRA_HFILES=
|
||||
|
||||
# Header files or dirs to ignore when scanning. Use base file/dir names
|
||||
# e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h private_code
|
||||
IGNORE_HFILES= \
|
||||
async-getprop.h \
|
||||
atoms.h \
|
||||
bell.h \
|
||||
boxes-private.h \
|
||||
clutter-utils.h \
|
||||
cogl-utils.h \
|
||||
compositor-private.h \
|
||||
constraints.h \
|
||||
core.h \
|
||||
display-private.h \
|
||||
draw-workspace.h \
|
||||
edge-resistance.h \
|
||||
eventqueue.h \
|
||||
frame.h \
|
||||
frames.h \
|
||||
group-private.h \
|
||||
group-props.h \
|
||||
iconcache.h \
|
||||
inlinepixbufs.h \
|
||||
keybindings-private.h \
|
||||
menu.h \
|
||||
metaaccellabel.h \
|
||||
meta-background-actor-private.h \
|
||||
meta-background-group-private.h \
|
||||
meta-module.h \
|
||||
meta-plugin-manager.h \
|
||||
meta-shadow-factory-private.h \
|
||||
meta-texture-rectangle.h \
|
||||
meta-texture-tower.h \
|
||||
meta-window-actor-private.h \
|
||||
meta-window-group.h \
|
||||
meta-window-shape.h \
|
||||
mutter-enum-types.h \
|
||||
mutter-Xatomtype.h \
|
||||
place.h \
|
||||
preview-widget.h \
|
||||
region-utils.h \
|
||||
resizepopup.h \
|
||||
screen-private.h \
|
||||
session.h \
|
||||
stack.h \
|
||||
stack-tracker.h \
|
||||
stamp-mutter-enum-types.h \
|
||||
tabpopup.h \
|
||||
theme.h \
|
||||
theme-private.h \
|
||||
tile-preview.h \
|
||||
ui.h \
|
||||
window-private.h \
|
||||
window-props.h \
|
||||
workspace-private.h \
|
||||
xprops.h \
|
||||
$(NULL)
|
||||
|
||||
MKDB_OPTIONS+=--ignore-files="$(IGNORE_HFILES)"
|
||||
|
||||
# Images to copy into HTML directory.
|
||||
# e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png
|
||||
HTML_IMAGES=
|
||||
|
||||
# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE).
|
||||
# e.g. content_files=running.sgml building.sgml changes-2.0.sgml
|
||||
content_files= \
|
||||
mutter-overview.xml \
|
||||
running-mutter.xml \
|
||||
$(NULL)
|
||||
|
||||
# SGML files where gtk-doc abbrevations (#GtkWidget) are expanded
|
||||
# These files must be listed here *and* in content_files
|
||||
# e.g. expand_content_files=running.sgml
|
||||
expand_content_files= \
|
||||
mutter-overview.xml \
|
||||
running-mutter.xml \
|
||||
$(NULL)
|
||||
|
||||
# CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library.
|
||||
# Only needed if you are using gtkdoc-scangobj to dynamically query widget
|
||||
# signals and properties.
|
||||
# e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS)
|
||||
# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib)
|
||||
GTKDOC_CFLAGS=$(MUTTER_CFLAGS)
|
||||
GTKDOC_LIBS=$(MUTTER_LIBS) $(top_builddir)/src/libmutter.la
|
||||
|
||||
# This includes the standard gtk-doc make rules, copied by gtkdocize.
|
||||
include $(top_srcdir)/gtk-doc.make
|
||||
|
||||
# Other files to distribute
|
||||
# e.g. EXTRA_DIST += version.xml.in
|
||||
EXTRA_DIST +=
|
||||
|
||||
# Files not to distribute
|
||||
# for --rebuild-types in $(SCAN_OPTIONS), e.g. $(DOC_MODULE).types
|
||||
# for --rebuild-sections in $(SCAN_OPTIONS) e.g. $(DOC_MODULE)-sections.txt
|
||||
DISTCLEANFILES = $(DOC_MODULES).types
|
||||
|
||||
# Comment this out if you want 'make check' to test you doc status
|
||||
# and run some sanity checks
|
||||
if ENABLE_GTK_DOC
|
||||
TESTS_ENVIRONMENT = cd $(srcdir) && \
|
||||
DOC_MODULE=$(DOC_MODULE) DOC_MAIN_SGML_FILE=$(DOC_MAIN_SGML_FILE) \
|
||||
SRCDIR=$(abs_srcdir) BUILDDIR=$(abs_builddir)
|
||||
#TESTS = $(GTKDOC_CHECK)
|
||||
endif
|
||||
|
||||
-include $(top_srcdir)/git.mk
|
59
doc/reference/meta-docs.sgml.in
Normal file
59
doc/reference/meta-docs.sgml.in
Normal file
@@ -0,0 +1,59 @@
|
||||
<?xml version="1.0"?>
|
||||
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
|
||||
"http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd"
|
||||
[
|
||||
<!ENTITY % local.common.attrib "xmlns:xi CDATA #FIXED 'http://www.w3.org/2003/XInclude'">
|
||||
<!ENTITY version "@VERSION@">
|
||||
]>
|
||||
<book id="index">
|
||||
<bookinfo>
|
||||
<title>Mutter Reference Manual</title>
|
||||
<releaseinfo>
|
||||
This document is for Mutter &version;.
|
||||
The latest version of this documentation can be found on-line at
|
||||
<ulink role="online-location" url="http://developer.gnome.org/meta/">http://developer.gnome.org/meta/</ulink>.
|
||||
</releaseinfo>
|
||||
</bookinfo>
|
||||
|
||||
<xi:include href="xml/mutter-overview.xml"/>
|
||||
<xi:include href="xml/running-mutter.xml"/>
|
||||
|
||||
<part id="core-reference">
|
||||
<title>Mutter Core Reference</title>
|
||||
<xi:include href="xml/main.xml"/>
|
||||
<xi:include href="xml/common.xml"/>
|
||||
<xi:include href="xml/gradient.xml"/>
|
||||
<xi:include href="xml/prefs.xml"/>
|
||||
<xi:include href="xml/util.xml"/>
|
||||
<xi:include href="xml/errors.xml"/>
|
||||
<xi:include href="xml/meta-plugin.xml"/>
|
||||
<xi:include href="xml/barrier.xml"/>
|
||||
<xi:include href="xml/boxes.xml"/>
|
||||
<xi:include href="xml/compositor.xml"/>
|
||||
<xi:include href="xml/display.xml"/>
|
||||
<xi:include href="xml/group.xml"/>
|
||||
<xi:include href="xml/keybindings.xml"/>
|
||||
<xi:include href="xml/meta-background-actor.xml"/>
|
||||
<xi:include href="xml/meta-shadow-factory.xml"/>
|
||||
<xi:include href="xml/meta-shaped-texture.xml"/>
|
||||
<xi:include href="xml/meta-window-actor.xml"/>
|
||||
<xi:include href="xml/screen.xml"/>
|
||||
<xi:include href="xml/window.xml"/>
|
||||
<xi:include href="xml/workspace.xml"/>
|
||||
</part>
|
||||
|
||||
<chapter id="object-tree">
|
||||
<title>Object Hierarchy</title>
|
||||
<xi:include href="xml/tree_index.sgml"/>
|
||||
</chapter>
|
||||
<index id="api-index-full">
|
||||
<title>API Index</title>
|
||||
<xi:include href="xml/api-index-full.xml"><xi:fallback /></xi:include>
|
||||
</index>
|
||||
<index id="deprecated-api-index" role="deprecated">
|
||||
<title>Index of deprecated API</title>
|
||||
<xi:include href="xml/api-index-deprecated.xml"><xi:fallback /></xi:include>
|
||||
</index>
|
||||
|
||||
<xi:include href="xml/annotation-glossary.xml"><xi:fallback /></xi:include>
|
||||
</book>
|
666
doc/reference/meta-sections.txt
Normal file
666
doc/reference/meta-sections.txt
Normal file
@@ -0,0 +1,666 @@
|
||||
<SECTION>
|
||||
<FILE>barrier</FILE>
|
||||
<TITLE>MetaBarrier</TITLE>
|
||||
MetaBarrier
|
||||
MetaBarrierClass
|
||||
meta_barrier_is_active
|
||||
meta_barrier_destroy
|
||||
meta_barrier_release
|
||||
MetaBarrierDirection
|
||||
MetaBarrierEvent
|
||||
<SUBSECTION Standard>
|
||||
META_BARRIER
|
||||
META_BARRIER_CLASS
|
||||
META_BARRIER_GET_CLASS
|
||||
META_IS_BARRIER
|
||||
META_IS_BARRIER_CLASS
|
||||
META_TYPE_BARRIER
|
||||
META_TYPE_BARRIER_EVENT
|
||||
MetaBarrierPrivate
|
||||
meta_barrier_event_get_type
|
||||
meta_barrier_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>boxes</FILE>
|
||||
MetaRectangle
|
||||
MetaStrut
|
||||
MetaEdgeType
|
||||
MetaEdge
|
||||
meta_rectangle_copy
|
||||
meta_rectangle_free
|
||||
meta_rect
|
||||
meta_rectangle_area
|
||||
meta_rectangle_intersect
|
||||
meta_rectangle_equal
|
||||
meta_rectangle_union
|
||||
meta_rectangle_overlap
|
||||
meta_rectangle_vert_overlap
|
||||
meta_rectangle_horiz_overlap
|
||||
meta_rectangle_could_fit_rect
|
||||
meta_rectangle_contains_rect
|
||||
<SUBSECTION Standard>
|
||||
META_TYPE_RECTANGLE
|
||||
meta_rectangle_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>common</FILE>
|
||||
META_VIRTUAL_CORE_POINTER_ID
|
||||
META_VIRTUAL_CORE_KEYBOARD_ID
|
||||
MetaFrameFlags
|
||||
MetaMenuOp
|
||||
MetaWindowMenuFunc
|
||||
MetaGrabOp
|
||||
MetaCursor
|
||||
MetaFrameType
|
||||
MetaVirtualModifier
|
||||
MetaDirection
|
||||
MetaMotionDirection
|
||||
MetaSide
|
||||
MetaButtonFunction
|
||||
MAX_BUTTONS_PER_CORNER
|
||||
MetaButtonLayout
|
||||
MetaFrameBorders
|
||||
meta_frame_borders_clear
|
||||
META_ICON_WIDTH
|
||||
META_ICON_HEIGHT
|
||||
META_MINI_ICON_WIDTH
|
||||
META_MINI_ICON_HEIGHT
|
||||
META_DEFAULT_ICON_NAME
|
||||
META_PRIORITY_RESIZE
|
||||
META_PRIORITY_BEFORE_REDRAW
|
||||
META_PRIORITY_REDRAW
|
||||
META_PRIORITY_PREFS_NOTIFY
|
||||
POINT_IN_RECT
|
||||
MetaStackLayer
|
||||
MetaWindowMenu
|
||||
MetaResizePopup
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>compositor</FILE>
|
||||
MetaCompEffect
|
||||
MetaCompositor
|
||||
meta_compositor_new
|
||||
meta_compositor_destroy
|
||||
meta_compositor_manage_screen
|
||||
meta_compositor_unmanage_screen
|
||||
meta_compositor_window_shape_changed
|
||||
meta_compositor_process_event
|
||||
meta_compositor_filter_keybinding
|
||||
meta_compositor_add_window
|
||||
meta_compositor_remove_window
|
||||
meta_compositor_show_window
|
||||
meta_compositor_hide_window
|
||||
meta_compositor_switch_workspace
|
||||
meta_compositor_maximize_window
|
||||
meta_compositor_unmaximize_window
|
||||
meta_compositor_window_mapped
|
||||
meta_compositor_window_unmapped
|
||||
meta_compositor_sync_window_geometry
|
||||
meta_compositor_set_updates_frozen
|
||||
meta_compositor_queue_frame_drawn
|
||||
meta_compositor_sync_stack
|
||||
meta_compositor_sync_screen_size
|
||||
meta_compositor_flash_screen
|
||||
meta_get_stage_for_screen
|
||||
meta_get_overlay_group_for_screen
|
||||
meta_get_overlay_window
|
||||
meta_get_window_actors
|
||||
meta_get_window_group_for_screen
|
||||
meta_get_top_window_group_for_screen
|
||||
meta_disable_unredirect_for_screen
|
||||
meta_enable_unredirect_for_screen
|
||||
meta_set_stage_input_region
|
||||
meta_empty_stage_input_region
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>display</FILE>
|
||||
MetaTabList
|
||||
MetaTabShowType
|
||||
meta_XFree
|
||||
meta_display_get_compositor_version
|
||||
meta_display_get_xinput_opcode
|
||||
meta_display_supports_extended_barriers
|
||||
meta_display_get_xdisplay
|
||||
meta_display_get_compositor
|
||||
meta_display_get_screens
|
||||
meta_display_has_shape
|
||||
meta_display_screen_for_root
|
||||
meta_display_get_focus_window
|
||||
meta_display_xwindow_is_a_no_focus_window
|
||||
meta_display_get_damage_event_base
|
||||
meta_display_get_shape_event_base
|
||||
meta_display_xserver_time_is_before
|
||||
meta_display_get_last_user_time
|
||||
meta_display_get_current_time
|
||||
meta_display_get_current_time_roundtrip
|
||||
meta_display_get_ignored_modifier_mask
|
||||
meta_display_get_tab_list
|
||||
meta_display_get_tab_next
|
||||
meta_display_get_tab_current
|
||||
meta_display_begin_grab_op
|
||||
meta_display_end_grab_op
|
||||
meta_display_get_grab_op
|
||||
meta_display_add_keybinding
|
||||
meta_display_remove_keybinding
|
||||
meta_display_get_keybinding_action
|
||||
meta_display_set_input_focus_window
|
||||
meta_display_focus_the_no_focus_window
|
||||
meta_display_sort_windows_by_stacking
|
||||
meta_display_get_leader_window
|
||||
meta_display_add_ignored_crossing_serial
|
||||
meta_display_unmanage_screen
|
||||
meta_display_clear_mouse_mode
|
||||
MetaDisplay
|
||||
MetaDisplayClass
|
||||
<SUBSECTION Standard>
|
||||
META_DISPLAY
|
||||
META_DISPLAY_CLASS
|
||||
META_DISPLAY_GET_CLASS
|
||||
META_IS_DISPLAY
|
||||
META_IS_DISPLAY_CLASS
|
||||
META_TYPE_DISPLAY
|
||||
meta_display_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>errors</FILE>
|
||||
meta_error_trap_push
|
||||
meta_error_trap_pop
|
||||
meta_error_trap_push_with_return
|
||||
meta_error_trap_pop_with_return
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>gradient</FILE>
|
||||
MetaGradientType
|
||||
meta_gradient_create_simple
|
||||
meta_gradient_create_multi
|
||||
meta_gradient_create_interwoven
|
||||
meta_gradient_add_alpha
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>group</FILE>
|
||||
MetaGroup
|
||||
meta_window_get_group
|
||||
meta_window_compute_group
|
||||
meta_window_shutdown_group
|
||||
meta_window_group_leader_changed
|
||||
meta_display_lookup_group
|
||||
meta_group_list_windows
|
||||
meta_group_update_layers
|
||||
meta_group_get_startup_id
|
||||
meta_group_get_size
|
||||
meta_group_property_notify
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>keybindings</FILE>
|
||||
MetaKeyBinding
|
||||
META_TYPE_KEY_BINDING
|
||||
meta_key_binding_get_name
|
||||
meta_key_binding_get_modifiers
|
||||
meta_key_binding_get_mask
|
||||
meta_key_binding_is_builtin
|
||||
meta_keybindings_set_custom_handler
|
||||
meta_keybindings_switch_window
|
||||
meta_screen_ungrab_all_keys
|
||||
meta_screen_grab_all_keys
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>main</FILE>
|
||||
meta_get_option_context
|
||||
meta_init
|
||||
meta_run
|
||||
meta_get_replace_current_wm
|
||||
meta_set_wm_name
|
||||
meta_set_gnome_wm_keybindings
|
||||
MetaExitCode
|
||||
meta_exit
|
||||
meta_quit
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>meta-background</FILE>
|
||||
<TITLE>MetaBackground</TITLE>
|
||||
MetaBackgroundEffects
|
||||
MetaBackground
|
||||
MetaBackgroundClass
|
||||
meta_background_new
|
||||
meta_background_copy
|
||||
meta_background_load_gradient
|
||||
meta_background_load_color
|
||||
meta_background_load_still_frame
|
||||
meta_background_load_file_async
|
||||
meta_background_load_file_finish
|
||||
meta_background_get_filename
|
||||
meta_background_get_style
|
||||
meta_background_get_shading
|
||||
meta_background_get_color
|
||||
meta_background_get_second_color
|
||||
<SUBSECTION Standard>
|
||||
META_BACKGROUND
|
||||
META_BACKGROUND_CLASS
|
||||
META_BACKGROUND_GET_CLASS
|
||||
META_IS_BACKGROUND
|
||||
META_IS_BACKGROUND_CLASS
|
||||
META_TYPE_BACKGROUND
|
||||
MetaBackgroundPrivate
|
||||
meta_background_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>meta-background-actor</FILE>
|
||||
<TITLE>MetaBackgroundActor</TITLE>
|
||||
MetaBackgroundActor
|
||||
MetaBackgroundActorClass
|
||||
meta_background_actor_new_for_screen
|
||||
MetaSnippetHook
|
||||
meta_background_actor_add_glsl_snippet
|
||||
meta_background_actor_set_uniform_float
|
||||
<SUBSECTION Standard>
|
||||
META_BACKGROUND_ACTOR
|
||||
META_BACKGROUND_ACTOR_CLASS
|
||||
META_BACKGROUND_ACTOR_GET_CLASS
|
||||
META_IS_BACKGROUND_ACTOR
|
||||
META_IS_BACKGROUND_ACTOR_CLASS
|
||||
META_TYPE_BACKGROUND_ACTOR
|
||||
MetaBackgroundActorPrivate
|
||||
meta_background_actor_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>meta-background-group</FILE>
|
||||
<TITLE>MetaBackgroundGroup</TITLE>
|
||||
MetaBackgroundGroupClass
|
||||
meta_background_group_new
|
||||
<SUBSECTION Standard>
|
||||
META_BACKGROUND_GROUP
|
||||
META_BACKGROUND_GROUP_CLASS
|
||||
META_BACKGROUND_GROUP_GET_CLASS
|
||||
META_IS_BACKGROUND_GROUP
|
||||
META_IS_BACKGROUND_GROUP_CLASS
|
||||
META_TYPE_BACKGROUND_GROUP
|
||||
MetaBackgroundGroupPrivate
|
||||
meta_background_group_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>meta-plugin</FILE>
|
||||
<TITLE>MetaPlugin</TITLE>
|
||||
MetaPlugin
|
||||
MetaPluginClass
|
||||
MetaPluginInfo
|
||||
meta_plugin_running
|
||||
meta_plugin_debug_mode
|
||||
meta_plugin_get_info
|
||||
MetaPluginVersion
|
||||
META_PLUGIN_DECLARE
|
||||
meta_plugin_switch_workspace_completed
|
||||
meta_plugin_minimize_completed
|
||||
meta_plugin_maximize_completed
|
||||
meta_plugin_unmaximize_completed
|
||||
meta_plugin_map_completed
|
||||
meta_plugin_destroy_completed
|
||||
MetaModalOptions
|
||||
meta_plugin_begin_modal
|
||||
meta_plugin_end_modal
|
||||
meta_plugin_get_screen
|
||||
meta_plugin_manager_set_plugin_type
|
||||
<SUBSECTION Standard>
|
||||
META_IS_PLUGIN
|
||||
META_IS_PLUGIN_CLASS
|
||||
META_PLUGIN
|
||||
META_PLUGIN_CLASS
|
||||
META_PLUGIN_GET_CLASS
|
||||
META_TYPE_PLUGIN
|
||||
MetaPluginPrivate
|
||||
meta_plugin_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>meta-shadow-factory</FILE>
|
||||
MetaShadowParams
|
||||
meta_shadow_factory_get_default
|
||||
meta_shadow_factory_set_params
|
||||
meta_shadow_factory_get_params
|
||||
MetaShadowFactory
|
||||
MetaShadowFactoryClass
|
||||
<SUBSECTION Standard>
|
||||
META_IS_SHADOW_FACTORY
|
||||
META_IS_SHADOW_FACTORY_CLASS
|
||||
META_SHADOW_FACTORY
|
||||
META_SHADOW_FACTORY_CLASS
|
||||
META_SHADOW_FACTORY_GET_CLASS
|
||||
META_TYPE_SHADOW_FACTORY
|
||||
meta_shadow_factory_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>meta-shaped-texture</FILE>
|
||||
<TITLE>MetaShapedTexture</TITLE>
|
||||
MetaShapedTexture
|
||||
MetaShapedTextureClass
|
||||
meta_shaped_texture_new
|
||||
meta_shaped_texture_set_create_mipmaps
|
||||
meta_shaped_texture_update_area
|
||||
meta_shaped_texture_set_pixmap
|
||||
meta_shaped_texture_get_texture
|
||||
meta_shaped_texture_set_mask_texture
|
||||
meta_shaped_texture_set_clip_region
|
||||
meta_shaped_texture_get_image
|
||||
<SUBSECTION Standard>
|
||||
META_IS_SHAPED_TEXTURE
|
||||
META_IS_SHAPED_TEXTURE_CLASS
|
||||
META_SHAPED_TEXTURE
|
||||
META_SHAPED_TEXTURE_CLASS
|
||||
META_SHAPED_TEXTURE_GET_CLASS
|
||||
META_TYPE_SHAPED_TEXTURE
|
||||
MetaShapedTexturePrivate
|
||||
meta_shaped_texture_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>meta-window-actor</FILE>
|
||||
<TITLE>MetaWindowActor</TITLE>
|
||||
MetaWindowActor
|
||||
MetaWindowActorClass
|
||||
meta_window_actor_get_x_window
|
||||
meta_window_actor_get_workspace
|
||||
meta_window_actor_get_meta_window
|
||||
meta_window_actor_get_texture
|
||||
meta_window_actor_is_override_redirect
|
||||
meta_window_actor_get_description
|
||||
meta_window_actor_showing_on_its_workspace
|
||||
meta_window_actor_is_destroyed
|
||||
<SUBSECTION Standard>
|
||||
META_IS_WINDOW_ACTOR
|
||||
META_IS_WINDOW_ACTOR_CLASS
|
||||
META_TYPE_WINDOW_ACTOR
|
||||
META_WINDOW_ACTOR
|
||||
META_WINDOW_ACTOR_CLASS
|
||||
META_WINDOW_ACTOR_GET_CLASS
|
||||
MetaWindowActorPrivate
|
||||
meta_window_actor_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>prefs</FILE>
|
||||
MetaPreference
|
||||
MetaPrefsChangedFunc
|
||||
meta_prefs_add_listener
|
||||
meta_prefs_remove_listener
|
||||
meta_prefs_init
|
||||
meta_prefs_override_preference_schema
|
||||
meta_preference_to_string
|
||||
meta_prefs_get_mouse_button_mods
|
||||
meta_prefs_get_mouse_button_resize
|
||||
meta_prefs_get_mouse_button_menu
|
||||
meta_prefs_get_focus_mode
|
||||
meta_prefs_get_focus_new_windows
|
||||
meta_prefs_get_attach_modal_dialogs
|
||||
meta_prefs_get_raise_on_click
|
||||
meta_prefs_get_theme
|
||||
meta_prefs_get_titlebar_font
|
||||
meta_prefs_get_num_workspaces
|
||||
meta_prefs_get_dynamic_workspaces
|
||||
meta_prefs_get_disable_workarounds
|
||||
meta_prefs_get_auto_raise
|
||||
meta_prefs_get_auto_raise_delay
|
||||
meta_prefs_get_focus_change_on_pointer_rest
|
||||
meta_prefs_get_gnome_accessibility
|
||||
meta_prefs_get_gnome_animations
|
||||
meta_prefs_get_edge_tiling
|
||||
meta_prefs_get_auto_maximize
|
||||
meta_prefs_get_button_layout
|
||||
meta_prefs_get_action_double_click_titlebar
|
||||
meta_prefs_get_action_middle_click_titlebar
|
||||
meta_prefs_get_action_right_click_titlebar
|
||||
meta_prefs_set_num_workspaces
|
||||
meta_prefs_get_workspace_name
|
||||
meta_prefs_change_workspace_name
|
||||
meta_prefs_get_cursor_theme
|
||||
meta_prefs_get_cursor_size
|
||||
meta_prefs_get_compositing_manager
|
||||
meta_prefs_get_force_fullscreen
|
||||
meta_prefs_set_force_fullscreen
|
||||
meta_prefs_get_workspaces_only_on_primary
|
||||
meta_prefs_get_no_tab_popup
|
||||
meta_prefs_set_no_tab_popup
|
||||
meta_prefs_get_draggable_border_width
|
||||
meta_prefs_get_ignore_request_hide_titlebar
|
||||
meta_prefs_set_ignore_request_hide_titlebar
|
||||
MetaKeyBindingAction
|
||||
MetaKeyBindingFlags
|
||||
MetaKeyCombo
|
||||
MetaKeyHandlerFunc
|
||||
meta_prefs_get_keybindings
|
||||
meta_prefs_get_keybinding_action
|
||||
meta_prefs_get_window_binding
|
||||
meta_prefs_get_overlay_binding
|
||||
meta_prefs_get_visual_bell
|
||||
meta_prefs_bell_is_audible
|
||||
meta_prefs_get_visual_bell_type
|
||||
MetaKeyHandler
|
||||
<SUBSECTION Standard>
|
||||
meta_key_binding_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>screen</FILE>
|
||||
MetaScreen
|
||||
MetaScreenClass
|
||||
meta_screen_get_screen_number
|
||||
meta_screen_get_display
|
||||
meta_screen_get_xroot
|
||||
meta_screen_get_size
|
||||
meta_screen_get_compositor_data
|
||||
meta_screen_set_compositor_data
|
||||
meta_screen_for_x_screen
|
||||
meta_screen_set_cm_selection
|
||||
meta_screen_unset_cm_selection
|
||||
meta_screen_get_startup_sequences
|
||||
meta_screen_get_workspaces
|
||||
meta_screen_get_n_workspaces
|
||||
meta_screen_get_workspace_by_index
|
||||
meta_screen_remove_workspace
|
||||
meta_screen_append_new_workspace
|
||||
meta_screen_get_active_workspace_index
|
||||
meta_screen_get_active_workspace
|
||||
meta_screen_get_n_monitors
|
||||
meta_screen_get_primary_monitor
|
||||
meta_screen_get_current_monitor
|
||||
meta_screen_get_monitor_geometry
|
||||
meta_screen_get_monitor_index_for_rect
|
||||
meta_screen_focus_default_window
|
||||
MetaScreenCorner
|
||||
meta_screen_override_workspace_layout
|
||||
<SUBSECTION Standard>
|
||||
META_IS_SCREEN
|
||||
META_IS_SCREEN_CLASS
|
||||
META_SCREEN
|
||||
META_SCREEN_CLASS
|
||||
META_SCREEN_GET_CLASS
|
||||
META_TYPE_SCREEN
|
||||
meta_screen_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>util</FILE>
|
||||
meta_is_verbose
|
||||
meta_set_verbose
|
||||
meta_is_debugging
|
||||
meta_set_debugging
|
||||
meta_is_syncing
|
||||
meta_set_syncing
|
||||
meta_set_replace_current_wm
|
||||
meta_debug_spew_real
|
||||
meta_verbose_real
|
||||
meta_bug
|
||||
meta_warning
|
||||
meta_fatal
|
||||
MetaDebugTopic
|
||||
meta_topic_real
|
||||
meta_add_verbose_topic
|
||||
meta_remove_verbose_topic
|
||||
meta_push_no_msg_prefix
|
||||
meta_pop_no_msg_prefix
|
||||
meta_unsigned_long_equal
|
||||
meta_unsigned_long_hash
|
||||
meta_frame_type_to_string
|
||||
meta_gravity_to_string
|
||||
_
|
||||
N_
|
||||
meta_g_utf8_strndup
|
||||
meta_free_gslist_and_elements
|
||||
meta_show_dialog
|
||||
meta_debug_spew
|
||||
meta_verbose
|
||||
meta_topic
|
||||
MetaLaterType
|
||||
meta_later_add
|
||||
meta_later_remove
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>window</FILE>
|
||||
MetaWindow
|
||||
MetaWindowClass
|
||||
MetaWindowType
|
||||
MetaMaximizeFlags
|
||||
meta_window_get_frame
|
||||
meta_window_has_focus
|
||||
meta_window_appears_focused
|
||||
meta_window_is_shaded
|
||||
meta_window_is_monitor_sized
|
||||
meta_window_is_override_redirect
|
||||
meta_window_is_skip_taskbar
|
||||
meta_window_get_rect
|
||||
meta_window_get_input_rect
|
||||
meta_window_get_outer_rect
|
||||
meta_window_get_screen
|
||||
meta_window_get_display
|
||||
meta_window_get_xwindow
|
||||
meta_window_get_window_type
|
||||
meta_window_get_window_type_atom
|
||||
meta_window_get_workspace
|
||||
meta_window_get_monitor
|
||||
meta_window_is_on_all_workspaces
|
||||
meta_window_located_on_workspace
|
||||
meta_window_is_hidden
|
||||
meta_window_activate
|
||||
meta_window_activate_with_workspace
|
||||
meta_window_get_description
|
||||
meta_window_get_wm_class
|
||||
meta_window_get_wm_class_instance
|
||||
meta_window_showing_on_its_workspace
|
||||
meta_window_get_gtk_application_id
|
||||
meta_window_get_gtk_unique_bus_name
|
||||
meta_window_get_gtk_application_object_path
|
||||
meta_window_get_gtk_window_object_path
|
||||
meta_window_get_gtk_app_menu_object_path
|
||||
meta_window_get_gtk_menubar_object_path
|
||||
meta_window_move
|
||||
meta_window_move_frame
|
||||
meta_window_move_resize_frame
|
||||
meta_window_move_to_monitor
|
||||
meta_window_resize
|
||||
meta_window_set_demands_attention
|
||||
meta_window_unset_demands_attention
|
||||
meta_window_get_startup_id
|
||||
meta_window_change_workspace_by_index
|
||||
meta_window_change_workspace
|
||||
meta_window_get_compositor_private
|
||||
meta_window_set_compositor_private
|
||||
meta_window_configure_notify
|
||||
meta_window_get_role
|
||||
meta_window_get_layer
|
||||
meta_window_find_root_ancestor
|
||||
meta_window_is_ancestor_of_transient
|
||||
MetaWindowForeachFunc
|
||||
meta_window_foreach_transient
|
||||
meta_window_foreach_ancestor
|
||||
meta_window_get_maximized
|
||||
meta_window_is_fullscreen
|
||||
meta_window_is_on_primary_monitor
|
||||
meta_window_requested_bypass_compositor
|
||||
meta_window_requested_dont_bypass_compositor
|
||||
meta_window_is_mapped
|
||||
meta_window_toplevel_is_mapped
|
||||
meta_window_get_icon_geometry
|
||||
meta_window_set_icon_geometry
|
||||
meta_window_maximize
|
||||
meta_window_unmaximize
|
||||
meta_window_minimize
|
||||
meta_window_unminimize
|
||||
meta_window_raise
|
||||
meta_window_lower
|
||||
meta_window_get_title
|
||||
meta_window_get_transient_for
|
||||
meta_window_get_transient_for_as_xid
|
||||
meta_window_delete
|
||||
meta_window_get_stable_sequence
|
||||
meta_window_get_user_time
|
||||
meta_window_get_pid
|
||||
meta_window_get_client_machine
|
||||
meta_window_is_remote
|
||||
meta_window_is_modal
|
||||
meta_window_is_attached_dialog
|
||||
meta_window_get_mutter_hints
|
||||
meta_window_get_frame_type
|
||||
meta_window_get_frame_bounds
|
||||
meta_window_get_tile_match
|
||||
meta_window_make_fullscreen
|
||||
meta_window_unmake_fullscreen
|
||||
meta_window_make_above
|
||||
meta_window_unmake_above
|
||||
meta_window_shade
|
||||
meta_window_unshade
|
||||
meta_window_stick
|
||||
meta_window_unstick
|
||||
meta_window_kill
|
||||
meta_window_focus
|
||||
meta_window_check_alive
|
||||
meta_window_get_work_area_current_monitor
|
||||
meta_window_get_work_area_for_monitor
|
||||
meta_window_get_work_area_all_monitors
|
||||
meta_window_begin_grab_op
|
||||
<SUBSECTION Standard>
|
||||
META_IS_WINDOW
|
||||
META_IS_WINDOW_CLASS
|
||||
META_TYPE_WINDOW
|
||||
META_WINDOW
|
||||
META_WINDOW_CLASS
|
||||
META_WINDOW_GET_CLASS
|
||||
meta_window_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>workspace</FILE>
|
||||
MetaWorkspace
|
||||
MetaWorkspaceClass
|
||||
meta_workspace_index
|
||||
meta_workspace_get_screen
|
||||
meta_workspace_list_windows
|
||||
meta_workspace_get_work_area_for_monitor
|
||||
meta_workspace_get_work_area_all_monitors
|
||||
meta_workspace_activate
|
||||
meta_workspace_activate_with_focus
|
||||
meta_workspace_update_window_hints
|
||||
meta_workspace_set_builtin_struts
|
||||
meta_workspace_get_neighbor
|
||||
<SUBSECTION Standard>
|
||||
META_IS_WORKSPACE
|
||||
META_IS_WORKSPACE_CLASS
|
||||
META_TYPE_WORKSPACE
|
||||
META_WORKSPACE
|
||||
META_WORKSPACE_CLASS
|
||||
META_WORKSPACE_GET_CLASS
|
||||
meta_workspace_get_type
|
||||
</SECTION>
|
||||
|
15
doc/reference/mutter-overview.xml
Normal file
15
doc/reference/mutter-overview.xml
Normal file
@@ -0,0 +1,15 @@
|
||||
<part id="mutter-overview">
|
||||
|
||||
<title>Overview</title>
|
||||
|
||||
<partintro>
|
||||
|
||||
<para>Mutter is a GObject-based library for creating compositing window managers.</para>
|
||||
|
||||
<para>Compositors that wish to use Mutter must implement a subclass of #MetaPlugin and register it with meta_plugin_manager_set_plugin_type() before calling meta_init() but after g_type_init().</para>
|
||||
|
||||
<para>#MetaPlugin provides virtual functions that allow to override default behavior in the window management code, such as the effect to perform when a window is created or when switching workspaces.</para>
|
||||
|
||||
</partintro>
|
||||
|
||||
</part>
|
100
doc/reference/running-mutter.xml
Normal file
100
doc/reference/running-mutter.xml
Normal file
@@ -0,0 +1,100 @@
|
||||
<part id="running-mutter">
|
||||
|
||||
<title>Running Mutter</title>
|
||||
|
||||
<partintro>
|
||||
|
||||
<section id="environment-variables">
|
||||
<title>Environment Variables</title>
|
||||
|
||||
<para>
|
||||
Mutter automatically checks environment variables during
|
||||
its initialization. These environment variables are meant
|
||||
as debug tools or overrides for default behaviours:
|
||||
</para>
|
||||
|
||||
<variablelist>
|
||||
<varlistentry>
|
||||
<term>MUTTER_VERBOSE</term>
|
||||
<listitem>
|
||||
<para>Enable verbose mode, in which more information is printed to the console. Mutter needs to be built with the --enable-verbose-mode option (enabled by default). For more fine-grained control of the output, see meta_add_verbose_topic().</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>MUTTER_DEBUG</term>
|
||||
<listitem>
|
||||
<para>Traps and prints X errors to the console.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>MUTTER_G_FATAL_WARNINGS</term>
|
||||
<listitem>
|
||||
<para>Causes any logging from the domains Mutter, Gtk, Gdk, Pango or GLib to terminate the process (only when using the log functions in GLib).</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>MUTTER_USE_LOGFILE</term>
|
||||
<listitem>
|
||||
<para>Log all messages to a temporary file.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>MUTTER_DEBUG_XINERAMA</term>
|
||||
<listitem>
|
||||
<para>Log extra information about support of the XINERAMA extension.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>MUTTER_DEBUG_SM</term>
|
||||
<listitem>
|
||||
<para>Log extra information about session management.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>MUTTER_DEBUG_BUTTON_GRABS</term>
|
||||
<listitem>
|
||||
<para>Log extra information about button grabs.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>MUTTER_SYNC</term>
|
||||
<listitem>
|
||||
<para>Call XSync after each X call.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>MUTTER_DISPLAY</term>
|
||||
<listitem>
|
||||
<para>Name of the X11 display to use.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>META_DISABLE_MIPMAPS</term>
|
||||
<listitem>
|
||||
<para>Disable use of mipmaps for the textures that back window pixmaps.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>MUTTER_USE_STATIC_GRAVITY</term>
|
||||
<listitem>
|
||||
<para>Enable support for clients with static bit-gravity.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>MUTTER_WM_CLASS_FILTER</term>
|
||||
<listitem>
|
||||
<para>Comma-separated list of WM_CLASS names to which to restrict Mutter to.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>MUTTER_DISABLE_FALLBACK_COLOR</term>
|
||||
<listitem>
|
||||
<para>Disable fallback for themed colors, for easier detection of typographical errors.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
|
||||
</section>
|
||||
|
||||
</partintro>
|
||||
</part>
|
@@ -44,6 +44,7 @@ is
|
||||
it
|
||||
ja
|
||||
ka
|
||||
kk
|
||||
kn
|
||||
ko
|
||||
ku
|
||||
@@ -80,6 +81,7 @@ sr@latin
|
||||
sv
|
||||
ta
|
||||
te
|
||||
tg
|
||||
th
|
||||
tk
|
||||
tr
|
||||
|
@@ -4,6 +4,7 @@ src/50-mutter-navigation.xml.in
|
||||
src/50-mutter-system.xml.in
|
||||
src/50-mutter-windows.xml.in
|
||||
src/compositor/compositor.c
|
||||
src/compositor/meta-background.c
|
||||
src/core/bell.c
|
||||
src/core/core.c
|
||||
src/core/delete.c
|
||||
@@ -11,6 +12,7 @@ src/core/display.c
|
||||
src/core/errors.c
|
||||
src/core/keybindings.c
|
||||
src/core/main.c
|
||||
src/core/monitor.c
|
||||
src/core/mutter.c
|
||||
src/core/prefs.c
|
||||
src/core/screen.c
|
||||
@@ -22,12 +24,9 @@ src/core/xprops.c
|
||||
src/mutter.desktop.in
|
||||
src/mutter-wm.desktop.in
|
||||
src/org.gnome.mutter.gschema.xml.in
|
||||
src/tools/mutter-message.c
|
||||
src/ui/frames.c
|
||||
src/ui/menu.c
|
||||
src/ui/metaaccellabel.c
|
||||
src/ui/resizepopup.c
|
||||
src/ui/theme.c
|
||||
src/ui/theme-parser.c
|
||||
src/ui/theme-viewer.c
|
||||
|
||||
|
224
po/ar.po
224
po/ar.po
@@ -4,14 +4,14 @@
|
||||
# Arafat Medini <lumina@silverpen.de>, 2003.
|
||||
# Abdulaziz Al-Arfaj <alarfaj0@yahoo.com>, 2004.
|
||||
# Djihed Afifi <djihed@gmail.com>, 2006.
|
||||
# Khaled Hosny <khaledhosny@eglug.org>, 2006, 2007, 2008, 2009, 2010, 2011, 2012.
|
||||
# Khaled Hosny <khaledhosny@eglug.org>, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013.
|
||||
# Anas Afif Emad <anas.e87@gmail.com>, 2008.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: metacity.HEAD\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2012-12-24 13:14+0200\n"
|
||||
"PO-Revision-Date: 2012-12-24 13:17+0200\n"
|
||||
"POT-Creation-Date: 2013-03-09 22:48+0200\n"
|
||||
"PO-Revision-Date: 2013-03-09 22:48+0200\n"
|
||||
"Last-Translator: Khaled Hosny <khaledhosny@eglug.org>\n"
|
||||
"Language-Team: Arabic <doc@arabeyes.org>\n"
|
||||
"Language: ar\n"
|
||||
@@ -167,8 +167,8 @@ msgid "Close window"
|
||||
msgstr "أغلق النّافذة"
|
||||
|
||||
#: ../src/50-mutter-windows.xml.in.h:9
|
||||
msgid "Minimize window"
|
||||
msgstr "صغّر النّافذة"
|
||||
msgid "Hide window"
|
||||
msgstr "أخفِ النّافذة"
|
||||
|
||||
#: ../src/50-mutter-windows.xml.in.h:10
|
||||
msgid "Move window"
|
||||
@@ -212,13 +212,17 @@ msgstr "المنظور مقسوم على اليسار"
|
||||
|
||||
#. This probably means that a non-WM compositor like xcompmgr is running;
|
||||
#. * we have no way to get it to exit
|
||||
#: ../src/compositor/compositor.c:512
|
||||
#: ../src/compositor/compositor.c:502
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Another compositing manager is already running on screen %i on display \"%s"
|
||||
"\"."
|
||||
msgstr "يعمل مدير مزج آخر على الشاشة %i والعرض \"%s\"."
|
||||
|
||||
#: ../src/compositor/meta-background.c:1180
|
||||
msgid "background texture could not be created from file"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/core/bell.c:320
|
||||
msgid "Bell event"
|
||||
msgstr "حدث جرس"
|
||||
@@ -251,23 +255,28 @@ msgstr "ا_نتظر"
|
||||
msgid "_Force Quit"
|
||||
msgstr "أ_جبر الإنهاء"
|
||||
|
||||
#: ../src/core/display.c:394
|
||||
#: ../src/core/display.c:402
|
||||
#, c-format
|
||||
msgid "Missing %s extension required for compositing"
|
||||
msgstr "الامتداد %s مفقود، لكنه مطلوب للتركيب"
|
||||
|
||||
#: ../src/core/display.c:491
|
||||
#: ../src/core/display.c:494
|
||||
#, c-format
|
||||
msgid "Failed to open X Window System display '%s'\n"
|
||||
msgstr "فشل فتح عرض نظام نوافذ إكس '%s'\n"
|
||||
|
||||
#: ../src/core/keybindings.c:876
|
||||
#: ../src/core/keybindings.c:929
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Some other program is already using the key %s with modifiers %x as a "
|
||||
"binding\n"
|
||||
msgstr "يستعمل برنامج آخر المفتاح %s بالفعل مع المغيرين %x كرابط\n"
|
||||
|
||||
#: ../src/core/keybindings.c:1129
|
||||
#, c-format
|
||||
msgid "\"%s\" is not a valid accelerator\n"
|
||||
msgstr "\"%s\" ليس اختصارا صحيحا\n"
|
||||
|
||||
#: ../src/core/main.c:196
|
||||
msgid "Disable connection to session manager"
|
||||
msgstr "عطّل الاتصال بمدير الجلسة"
|
||||
@@ -292,12 +301,12 @@ msgstr "ابدأ الجلسة من ملف محفوظ"
|
||||
msgid "Make X calls synchronous"
|
||||
msgstr "اجعل نداءات س متزامنة"
|
||||
|
||||
#: ../src/core/main.c:496
|
||||
#: ../src/core/main.c:533
|
||||
#, c-format
|
||||
msgid "Failed to scan themes directory: %s\n"
|
||||
msgstr "فشلت قراءة دليل السِمات : %s\n"
|
||||
|
||||
#: ../src/core/main.c:512
|
||||
#: ../src/core/main.c:549
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Could not find a theme! Be sure %s exists and contains the usual themes.\n"
|
||||
@@ -325,7 +334,7 @@ msgstr "اطبع الإصدارة"
|
||||
msgid "Mutter plugin to use"
|
||||
msgstr "ملحق مَتَر الذي سيُستخدم"
|
||||
|
||||
#: ../src/core/prefs.c:1079
|
||||
#: ../src/core/prefs.c:1087
|
||||
msgid ""
|
||||
"Workarounds for broken applications disabled. Some applications may not "
|
||||
"behave properly.\n"
|
||||
@@ -333,12 +342,12 @@ msgstr ""
|
||||
"عطّلت الحلول الجزئيّة للتطبيقات المعطوبة . ربما لن تتصرف بعض التطبيقات "
|
||||
"بسلامة.\n"
|
||||
|
||||
#: ../src/core/prefs.c:1154
|
||||
#: ../src/core/prefs.c:1162
|
||||
#, c-format
|
||||
msgid "Could not parse font description \"%s\" from GSettings key %s\n"
|
||||
msgstr "لا يمكن تحليل وصف الخط \"%s\" من مفتاح GSettings %s\n"
|
||||
|
||||
#: ../src/core/prefs.c:1220
|
||||
#: ../src/core/prefs.c:1228
|
||||
#, c-format
|
||||
msgid ""
|
||||
"\"%s\" found in configuration database is not a valid value for mouse button "
|
||||
@@ -346,7 +355,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"\"%s\" الموجود في قاعدة بيانات الإعدادات ليس قيمة سليمة لمغير أزرار الفأرة\n"
|
||||
|
||||
#: ../src/core/prefs.c:1757
|
||||
#: ../src/core/prefs.c:1780
|
||||
#, c-format
|
||||
msgid ""
|
||||
"\"%s\" found in configuration database is not a valid value for keybinding "
|
||||
@@ -355,17 +364,17 @@ msgstr ""
|
||||
"\"%s\" الموجود في قاعدة بيانات الإعدادات ليس قيمة سليمة لارتباط المفتاح \"%s"
|
||||
"\"\n"
|
||||
|
||||
#: ../src/core/prefs.c:1854
|
||||
#: ../src/core/prefs.c:1879
|
||||
#, c-format
|
||||
msgid "Workspace %d"
|
||||
msgstr "مساحة العمل %d"
|
||||
|
||||
#: ../src/core/screen.c:658
|
||||
#: ../src/core/screen.c:674
|
||||
#, c-format
|
||||
msgid "Screen %d on display '%s' is invalid\n"
|
||||
msgstr "الشاشة %d على العرض '%s' غير صحيحة\n"
|
||||
|
||||
#: ../src/core/screen.c:674
|
||||
#: ../src/core/screen.c:690
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Screen %d on display \"%s\" already has a window manager; try using the --"
|
||||
@@ -374,18 +383,18 @@ msgstr ""
|
||||
"الشاشة %d على العرض \"%s\" لها مدير نوافذ بالفعل، حاول استعمال خيار التبديل "
|
||||
"--replace لتحُلّ محلّ مدير النوافذ الحالي.\n"
|
||||
|
||||
#: ../src/core/screen.c:701
|
||||
#: ../src/core/screen.c:717
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Could not acquire window manager selection on screen %d display \"%s\"\n"
|
||||
msgstr "لا يمكن الحصول على اختيار مدير النوافذ على الشاشة %d العرض \"%s\"\n"
|
||||
|
||||
#: ../src/core/screen.c:770
|
||||
#: ../src/core/screen.c:795
|
||||
#, c-format
|
||||
msgid "Screen %d on display \"%s\" already has a window manager\n"
|
||||
msgstr "الشاشة %d على العرض \"%s\" لها مدير نوافذ بالفعل\n"
|
||||
|
||||
#: ../src/core/screen.c:955
|
||||
#: ../src/core/screen.c:980
|
||||
#, c-format
|
||||
msgid "Could not release screen %d on display \"%s\"\n"
|
||||
msgstr "لا يمكن ترك الشاشة %d على العرض \"%s\"\n"
|
||||
@@ -482,7 +491,7 @@ msgid "Window manager error: "
|
||||
msgstr "خطأ مدير النوافذ: "
|
||||
|
||||
#. first time through
|
||||
#: ../src/core/window.c:7275
|
||||
#: ../src/core/window.c:7538
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER "
|
||||
@@ -498,7 +507,7 @@ msgstr ""
|
||||
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
|
||||
#. * about these apps but make them work.
|
||||
#.
|
||||
#: ../src/core/window.c:7941
|
||||
#: ../src/core/window.c:8262
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Window %s sets an MWM hint indicating it isn't resizable, but sets min size "
|
||||
@@ -507,22 +516,22 @@ msgstr ""
|
||||
"ضبطت النافذة %s تلميحة MWM يدل على انه لا يمكن تحجيمها، لكنها تضبط الحجم "
|
||||
"الأدنى %d x %d و الحجم الأقصى %d x %d، هذا ليس له أي معنى.\n"
|
||||
|
||||
#: ../src/core/window-props.c:274
|
||||
#: ../src/core/window-props.c:318
|
||||
#, c-format
|
||||
msgid "Application set a bogus _NET_WM_PID %lu\n"
|
||||
msgstr "ضبط التطبيق رمز NET_WM_PID غير مفهوم %lu\n"
|
||||
|
||||
#: ../src/core/window-props.c:393
|
||||
#: ../src/core/window-props.c:434
|
||||
#, c-format
|
||||
msgid "%s (on %s)"
|
||||
msgstr "%s (على %s)"
|
||||
|
||||
#: ../src/core/window-props.c:1448
|
||||
#: ../src/core/window-props.c:1517
|
||||
#, c-format
|
||||
msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
|
||||
msgstr "نافذة WM_TRANSIENT_FOR 0x%lx غير صحيحة ل %s.\n"
|
||||
|
||||
#: ../src/core/window-props.c:1459
|
||||
#: ../src/core/window-props.c:1528
|
||||
#, fuzzy, c-format
|
||||
msgid "WM_TRANSIENT_FOR window 0x%lx for %s would create loop.\n"
|
||||
msgstr "نافذة WM_TRANSIENT_FOR 0x%lx غير صحيحة ل %s.\n"
|
||||
@@ -645,10 +654,20 @@ msgid ""
|
||||
msgstr ""
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:17
|
||||
msgid "Select window from tab popup"
|
||||
msgid "Auto maximize nearly monitor sized windows"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:18
|
||||
msgid ""
|
||||
"If enabled, new windows that are initially the size of the monitor "
|
||||
"automatically get maximized."
|
||||
msgstr ""
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:19
|
||||
msgid "Select window from tab popup"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:20
|
||||
msgid "Cancel tab popup"
|
||||
msgstr ""
|
||||
|
||||
@@ -851,69 +870,69 @@ msgstr "Mod5"
|
||||
#. Translators: This represents the size of a window. The first number is
|
||||
#. * the width of the window and the second is the height.
|
||||
#.
|
||||
#: ../src/ui/resizepopup.c:113
|
||||
#: ../src/ui/resizepopup.c:136
|
||||
#, c-format
|
||||
msgid "%d x %d"
|
||||
msgstr "%d × %d"
|
||||
|
||||
#: ../src/ui/theme.c:234
|
||||
#: ../src/ui/theme.c:235
|
||||
msgid "top"
|
||||
msgstr "أعلى"
|
||||
|
||||
#: ../src/ui/theme.c:236
|
||||
#: ../src/ui/theme.c:237
|
||||
msgid "bottom"
|
||||
msgstr "أسفل"
|
||||
|
||||
#: ../src/ui/theme.c:238
|
||||
#: ../src/ui/theme.c:239
|
||||
msgid "left"
|
||||
msgstr "يسار"
|
||||
|
||||
#: ../src/ui/theme.c:240
|
||||
#: ../src/ui/theme.c:241
|
||||
msgid "right"
|
||||
msgstr "يمين"
|
||||
|
||||
#: ../src/ui/theme.c:268
|
||||
#: ../src/ui/theme.c:269
|
||||
#, c-format
|
||||
msgid "frame geometry does not specify \"%s\" dimension"
|
||||
msgstr "هندسة الإطار لا تخصص البعد \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:287
|
||||
#: ../src/ui/theme.c:288
|
||||
#, c-format
|
||||
msgid "frame geometry does not specify dimension \"%s\" for border \"%s\""
|
||||
msgstr "هندسة الإطار لا تخصص البعد \"%s\" للحد \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:324
|
||||
#: ../src/ui/theme.c:325
|
||||
#, c-format
|
||||
msgid "Button aspect ratio %g is not reasonable"
|
||||
msgstr "النسبة الجانبية للزر %g غير معقولة"
|
||||
|
||||
#: ../src/ui/theme.c:336
|
||||
#: ../src/ui/theme.c:337
|
||||
#, c-format
|
||||
msgid "Frame geometry does not specify size of buttons"
|
||||
msgstr "هندسة الإطار لا تخصص حجم الأزرار"
|
||||
|
||||
#: ../src/ui/theme.c:1049
|
||||
#: ../src/ui/theme.c:1050
|
||||
#, c-format
|
||||
msgid "Gradients should have at least two colors"
|
||||
msgstr "يجب أن يكون للتّدرُّجات لونان على الأقل"
|
||||
|
||||
#: ../src/ui/theme.c:1201
|
||||
#: ../src/ui/theme.c:1202
|
||||
#, fuzzy, c-format
|
||||
msgid ""
|
||||
"GTK custom color specification must have color name and fallback in "
|
||||
"parentheses, e.g. gtk:custom(foo,bar); could not parse \"%s\""
|
||||
msgstr ""
|
||||
"يحب أن يكون لتخصيص حالة ألوان جتك قوس غلق قائم بعد الحالة/ مثال gtk:fg"
|
||||
"[NORMAL]، NORMAL هنا هو الحالة، لا يمكن تحليل \"%s\""
|
||||
"يحب أن يكون لتخصيص حالة ألوان جتك قوس غلق قائم بعد الحالة/ مثال gtk:"
|
||||
"fg[NORMAL]، NORMAL هنا هو الحالة، لا يمكن تحليل \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:1217
|
||||
#: ../src/ui/theme.c:1218
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Invalid character '%c' in color_name parameter of gtk:custom, only A-Za-z0-9-"
|
||||
"_ are valid"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/ui/theme.c:1231
|
||||
#: ../src/ui/theme.c:1232
|
||||
#, fuzzy, c-format
|
||||
msgid ""
|
||||
"Gtk:custom format is \"gtk:custom(color_name,fallback)\", \"%s\" does not "
|
||||
@@ -921,7 +940,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"تهيئة التظليل هي \"تظليل/اللون_الأساسي/العامل\"، \"%s\" لا يناسب التهيئة"
|
||||
|
||||
#: ../src/ui/theme.c:1276
|
||||
#: ../src/ui/theme.c:1277
|
||||
#, c-format
|
||||
msgid ""
|
||||
"GTK color specification must have the state in brackets, e.g. gtk:fg[NORMAL] "
|
||||
@@ -930,158 +949,158 @@ msgstr ""
|
||||
"يجب أن تكون حالة تخصيصات ألوان جتك في قوسان قائمان، مثال gtk:fg[NORMAL] "
|
||||
"NORMAL هنا هو الحالة، لا يمكن تحليل \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:1290
|
||||
#: ../src/ui/theme.c:1291
|
||||
#, c-format
|
||||
msgid ""
|
||||
"GTK color specification must have a close bracket after the state, e.g. gtk:"
|
||||
"fg[NORMAL] where NORMAL is the state; could not parse \"%s\""
|
||||
msgstr ""
|
||||
"يحب أن يكون لتخصيص حالة ألوان جتك قوس غلق قائم بعد الحالة/ مثال gtk:fg"
|
||||
"[NORMAL]، NORMAL هنا هو الحالة، لا يمكن تحليل \"%s\""
|
||||
"يحب أن يكون لتخصيص حالة ألوان جتك قوس غلق قائم بعد الحالة/ مثال gtk:"
|
||||
"fg[NORMAL]، NORMAL هنا هو الحالة، لا يمكن تحليل \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:1301
|
||||
#: ../src/ui/theme.c:1302
|
||||
#, c-format
|
||||
msgid "Did not understand state \"%s\" in color specification"
|
||||
msgstr "لم تفهم الحالة \"%s\" في تخصيص الألوان"
|
||||
|
||||
#: ../src/ui/theme.c:1314
|
||||
#: ../src/ui/theme.c:1315
|
||||
#, c-format
|
||||
msgid "Did not understand color component \"%s\" in color specification"
|
||||
msgstr "لم يفهم جزء اللون \"%s\" في تخصيص اللون"
|
||||
|
||||
#: ../src/ui/theme.c:1343
|
||||
#: ../src/ui/theme.c:1344
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Blend format is \"blend/bg_color/fg_color/alpha\", \"%s\" does not fit the "
|
||||
"format"
|
||||
msgstr "تهيئة الخلط \"blend/bg_color/fg_color/alpha\"، \"%s\"لا يناسب التهيئة"
|
||||
|
||||
#: ../src/ui/theme.c:1354
|
||||
#: ../src/ui/theme.c:1355
|
||||
#, c-format
|
||||
msgid "Could not parse alpha value \"%s\" in blended color"
|
||||
msgstr "لا يمكن تحليل قيمة الشفافية \"%s\" في اللون المخلط"
|
||||
|
||||
#: ../src/ui/theme.c:1364
|
||||
#: ../src/ui/theme.c:1365
|
||||
#, c-format
|
||||
msgid "Alpha value \"%s\" in blended color is not between 0.0 and 1.0"
|
||||
msgstr "قيمة الشفافية \"%s\" في اللون المخلوط ليست بين 0.0 و 1.0"
|
||||
|
||||
#: ../src/ui/theme.c:1411
|
||||
#: ../src/ui/theme.c:1412
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Shade format is \"shade/base_color/factor\", \"%s\" does not fit the format"
|
||||
msgstr ""
|
||||
"تهيئة التظليل هي \"تظليل/اللون_الأساسي/العامل\"، \"%s\" لا يناسب التهيئة"
|
||||
|
||||
#: ../src/ui/theme.c:1422
|
||||
#: ../src/ui/theme.c:1423
|
||||
#, c-format
|
||||
msgid "Could not parse shade factor \"%s\" in shaded color"
|
||||
msgstr "لا يمكن تحليل عامل التظليل \"%s\" في اللون المظلل"
|
||||
|
||||
#: ../src/ui/theme.c:1432
|
||||
#: ../src/ui/theme.c:1433
|
||||
#, c-format
|
||||
msgid "Shade factor \"%s\" in shaded color is negative"
|
||||
msgstr "عامل التظليل \"%s\" في اللون المظلل سلبي"
|
||||
|
||||
#: ../src/ui/theme.c:1461
|
||||
#: ../src/ui/theme.c:1462
|
||||
#, c-format
|
||||
msgid "Could not parse color \"%s\""
|
||||
msgstr "لا يمكن تحليل اللون \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:1778
|
||||
#: ../src/ui/theme.c:1779
|
||||
#, c-format
|
||||
msgid "Coordinate expression contains character '%s' which is not allowed"
|
||||
msgstr "تعبير الإحداثيّات يحتوي على الرمز '%s' الممنوع"
|
||||
|
||||
#: ../src/ui/theme.c:1805
|
||||
#: ../src/ui/theme.c:1806
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression contains floating point number '%s' which could not be "
|
||||
"parsed"
|
||||
msgstr "تعبير الإحداثيّات يحتوي على عدد نقطة متغيرة '%s' تعذّر تحليله"
|
||||
|
||||
#: ../src/ui/theme.c:1819
|
||||
#: ../src/ui/theme.c:1820
|
||||
#, c-format
|
||||
msgid "Coordinate expression contains integer '%s' which could not be parsed"
|
||||
msgstr "تعبير الإحداثيّات يحتوي على عدد صحيح '%s' تعذّر تحليله"
|
||||
|
||||
#: ../src/ui/theme.c:1940
|
||||
#: ../src/ui/theme.c:1941
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression contained unknown operator at the start of this text: "
|
||||
"\"%s\""
|
||||
msgstr "تعبير الإحداثيّات يحتوي على مقسوم مجهول عند بداية هذا النص: \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:1997
|
||||
#: ../src/ui/theme.c:1998
|
||||
#, c-format
|
||||
msgid "Coordinate expression was empty or not understood"
|
||||
msgstr "تعبير الإحداثيّات فارغ أو لم يفهم"
|
||||
|
||||
#: ../src/ui/theme.c:2110 ../src/ui/theme.c:2120 ../src/ui/theme.c:2154
|
||||
#: ../src/ui/theme.c:2111 ../src/ui/theme.c:2121 ../src/ui/theme.c:2155
|
||||
#, c-format
|
||||
msgid "Coordinate expression results in division by zero"
|
||||
msgstr "تعبير الإحداثيّات ينتُج عند القسمة على صفر"
|
||||
|
||||
#: ../src/ui/theme.c:2162
|
||||
#: ../src/ui/theme.c:2163
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression tries to use mod operator on a floating-point number"
|
||||
msgstr "تعبير الإحداثيّاتيّات يحاول استعمال مقسوم mod على عدد فاصلة متحرّكة"
|
||||
|
||||
#: ../src/ui/theme.c:2218
|
||||
#: ../src/ui/theme.c:2219
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression has an operator \"%s\" where an operand was expected"
|
||||
msgstr "تعبير الإحداثيّات له مقسوم \"%s\" بالرغم من ترقبه قاسم"
|
||||
|
||||
#: ../src/ui/theme.c:2227
|
||||
#: ../src/ui/theme.c:2228
|
||||
#, c-format
|
||||
msgid "Coordinate expression had an operand where an operator was expected"
|
||||
msgstr "تعبير الإحداثيّات له قاسم بالرغم من ترقبه لمقسوم"
|
||||
|
||||
#: ../src/ui/theme.c:2235
|
||||
#: ../src/ui/theme.c:2236
|
||||
#, c-format
|
||||
msgid "Coordinate expression ended with an operator instead of an operand"
|
||||
msgstr "انتهى تعبير الإحداثيّات بمقسوم عوضا عن قاسم"
|
||||
|
||||
#: ../src/ui/theme.c:2245
|
||||
#: ../src/ui/theme.c:2246
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression has operator \"%c\" following operator \"%c\" with no "
|
||||
"operand in between"
|
||||
msgstr "لتعبير الإحداثيّات مقسوم \"%c\" يتبع القاسم \"%c\" بدون قاسم بينهما"
|
||||
|
||||
#: ../src/ui/theme.c:2396 ../src/ui/theme.c:2441
|
||||
#: ../src/ui/theme.c:2397 ../src/ui/theme.c:2442
|
||||
#, c-format
|
||||
msgid "Coordinate expression had unknown variable or constant \"%s\""
|
||||
msgstr "كان لتعبير الإحداثيّات متغير أو ثابت \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:2495
|
||||
#: ../src/ui/theme.c:2496
|
||||
#, c-format
|
||||
msgid "Coordinate expression parser overflowed its buffer."
|
||||
msgstr "غمر محلّل تعبير الإحداثيّات مجاله"
|
||||
|
||||
#: ../src/ui/theme.c:2524
|
||||
#: ../src/ui/theme.c:2525
|
||||
#, c-format
|
||||
msgid "Coordinate expression had a close parenthesis with no open parenthesis"
|
||||
msgstr "كان لتعبير الإحداثيّات قوس غلق بدون قوس فتح"
|
||||
|
||||
#: ../src/ui/theme.c:2588
|
||||
#: ../src/ui/theme.c:2589
|
||||
#, c-format
|
||||
msgid "Coordinate expression had an open parenthesis with no close parenthesis"
|
||||
msgstr "كان لتعبير الإحداثيات قوس فتح بدون قوس غلق"
|
||||
|
||||
#: ../src/ui/theme.c:2599
|
||||
#: ../src/ui/theme.c:2600
|
||||
#, c-format
|
||||
msgid "Coordinate expression doesn't seem to have any operators or operands"
|
||||
msgstr "تعبير الإحداثيات لا يملك قاسمات و مقسومات"
|
||||
|
||||
#: ../src/ui/theme.c:2812 ../src/ui/theme.c:2832 ../src/ui/theme.c:2852
|
||||
#: ../src/ui/theme.c:2813 ../src/ui/theme.c:2833 ../src/ui/theme.c:2853
|
||||
#, c-format
|
||||
msgid "Theme contained an expression that resulted in an error: %s\n"
|
||||
msgstr "احتوت السِمة على تعبير ادى الى خطأ: %s\n"
|
||||
|
||||
#: ../src/ui/theme.c:4498
|
||||
#: ../src/ui/theme.c:4499
|
||||
#, c-format
|
||||
msgid ""
|
||||
"<button function=\"%s\" state=\"%s\" draw_ops=\"whatever\"/> must be "
|
||||
@@ -1090,25 +1109,25 @@ msgstr ""
|
||||
"يجب تخصيص <button function=\"%s\" state=\"%s\" draw_ops=\"whatever\"/> "
|
||||
"لأسلوب الإطار هذا"
|
||||
|
||||
#: ../src/ui/theme.c:5009 ../src/ui/theme.c:5034
|
||||
#: ../src/ui/theme.c:5010 ../src/ui/theme.c:5035
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Missing <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/>"
|
||||
msgstr ""
|
||||
"<frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/> مفقود"
|
||||
|
||||
#: ../src/ui/theme.c:5082
|
||||
#: ../src/ui/theme.c:5083
|
||||
#, c-format
|
||||
msgid "Failed to load theme \"%s\": %s\n"
|
||||
msgstr "فشل تحميل السِمة \"%s\": %s\n"
|
||||
|
||||
#: ../src/ui/theme.c:5218 ../src/ui/theme.c:5225 ../src/ui/theme.c:5232
|
||||
#: ../src/ui/theme.c:5239 ../src/ui/theme.c:5246
|
||||
#: ../src/ui/theme.c:5219 ../src/ui/theme.c:5226 ../src/ui/theme.c:5233
|
||||
#: ../src/ui/theme.c:5240 ../src/ui/theme.c:5247
|
||||
#, c-format
|
||||
msgid "No <%s> set for theme \"%s\""
|
||||
msgstr "لا <%s> ضبط للسِمة \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:5254
|
||||
#: ../src/ui/theme.c:5255
|
||||
#, c-format
|
||||
msgid ""
|
||||
"No frame style set for window type \"%s\" in theme \"%s\", add a <window "
|
||||
@@ -1117,14 +1136,14 @@ msgstr ""
|
||||
"لا أسلوب إطار مضبوط لنوع النافذة \"%s\" في السِمة \"%s\"، اضف عنصر <window "
|
||||
"type=\"%s\" style_set=\"whatever\"/>"
|
||||
|
||||
#: ../src/ui/theme.c:5650 ../src/ui/theme.c:5712 ../src/ui/theme.c:5775
|
||||
#: ../src/ui/theme.c:5662 ../src/ui/theme.c:5724 ../src/ui/theme.c:5787
|
||||
#, c-format
|
||||
msgid ""
|
||||
"User-defined constants must begin with a capital letter; \"%s\" does not"
|
||||
msgstr ""
|
||||
"الثوابت المعرفة من طرف المستخدم يجب أن تبدأ بحروف كبيرة، \"%s\" لا يبدأ بذلك"
|
||||
|
||||
#: ../src/ui/theme.c:5658 ../src/ui/theme.c:5720 ../src/ui/theme.c:5783
|
||||
#: ../src/ui/theme.c:5670 ../src/ui/theme.c:5732 ../src/ui/theme.c:5795
|
||||
#, c-format
|
||||
msgid "Constant \"%s\" has already been defined"
|
||||
msgstr "عُرِّف الثابت \"%s\" بالفعل"
|
||||
@@ -1599,56 +1618,56 @@ msgstr "حد"
|
||||
msgid "Attached Modal Dialog"
|
||||
msgstr "صندوق حوار سائد"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:739
|
||||
#: ../src/ui/theme-viewer.c:737
|
||||
#, c-format
|
||||
msgid "Button layout test %d"
|
||||
msgstr "تجربة تصميم الأزرار %d"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:768
|
||||
#: ../src/ui/theme-viewer.c:766
|
||||
#, c-format
|
||||
msgid "%g milliseconds to draw one window frame"
|
||||
msgstr "%g ملي ثانية لرسم إظار واحد للنافذة"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:813
|
||||
#: ../src/ui/theme-viewer.c:811
|
||||
#, c-format
|
||||
msgid "Usage: metacity-theme-viewer [THEMENAME]\n"
|
||||
msgstr "الإستعمال: metacity-theme-viewer [THEMENAME]\n"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:820
|
||||
#: ../src/ui/theme-viewer.c:818
|
||||
#, c-format
|
||||
msgid "Error loading theme: %s\n"
|
||||
msgstr "خطأ عند تحميل السِمة: %s\n"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:826
|
||||
#: ../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:870
|
||||
#: ../src/ui/theme-viewer.c:869
|
||||
msgid "Normal Title Font"
|
||||
msgstr "خط عنوان عادي"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:876
|
||||
#: ../src/ui/theme-viewer.c:875
|
||||
msgid "Small Title Font"
|
||||
msgstr "خط عنوان صغير"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:882
|
||||
#: ../src/ui/theme-viewer.c:881
|
||||
msgid "Large Title Font"
|
||||
msgstr "خط عنوان كبير"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:887
|
||||
#: ../src/ui/theme-viewer.c:886
|
||||
msgid "Button Layouts"
|
||||
msgstr "تصاميم الأزرار"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:892
|
||||
#: ../src/ui/theme-viewer.c:891
|
||||
msgid "Benchmark"
|
||||
msgstr "علامة إهتداء"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:949
|
||||
#: ../src/ui/theme-viewer.c:947
|
||||
msgid "Window Title Goes Here"
|
||||
msgstr "عنوان النافذة يكون هنا"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:1052
|
||||
#: ../src/ui/theme-viewer.c:1053
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Drew %d frames in %g client-side seconds (%g milliseconds per frame) and %g "
|
||||
@@ -1658,43 +1677,46 @@ msgstr ""
|
||||
"دفعت %d إطارات في %g ثوان بإتجاه العميل (%g ملي ثانية لكل إطار) و %g ثواني "
|
||||
"بوقت ساعة حائطية مع مصادر خادوم X (%g ملي ثانية لكل إطار)\n"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:1271
|
||||
#: ../src/ui/theme-viewer.c:1273
|
||||
msgid "position expression test returned TRUE but set error"
|
||||
msgstr "أرجع إختبار تعبير الموقع TRUE لكنه لم يكتشف الخطأ"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:1273
|
||||
#: ../src/ui/theme-viewer.c:1275
|
||||
msgid "position expression test returned FALSE but didn't set error"
|
||||
msgstr "أرجع إختبار تعبير الموقع خطأ لكنه لم يكتشف الخطأ"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:1277
|
||||
#: ../src/ui/theme-viewer.c:1279
|
||||
msgid "Error was expected but none given"
|
||||
msgstr "تُرُقِّب خطأ لكن لم يعطى أي خطأ"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:1279
|
||||
#: ../src/ui/theme-viewer.c:1281
|
||||
#, c-format
|
||||
msgid "Error %d was expected but %d given"
|
||||
msgstr "تُرقّب %d لكن أعطى %d"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:1285
|
||||
#: ../src/ui/theme-viewer.c:1287
|
||||
#, c-format
|
||||
msgid "Error not expected but one was returned: %s"
|
||||
msgstr "لم يُترقب خطأ لكنه أرجع واحدًا: %s"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:1289
|
||||
#: ../src/ui/theme-viewer.c:1291
|
||||
#, c-format
|
||||
msgid "x value was %d, %d was expected"
|
||||
msgstr "قيمة س كانت %d، تُرُقِّب %d"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:1292
|
||||
#: ../src/ui/theme-viewer.c:1294
|
||||
#, c-format
|
||||
msgid "y value was %d, %d was expected"
|
||||
msgstr "قيمة ص كانت %d، تُرُقَِب %d"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:1357
|
||||
#: ../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"
|
||||
|
||||
#~ msgid "Minimize window"
|
||||
#~ msgstr "صغّر النّافذة"
|
||||
|
||||
#~ msgid "Comma-separated list of compositor plugins"
|
||||
#~ msgstr "قائمة بملحقات المزج مفصولة بفاصلة"
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
664
po/en_GB.po
664
po/en_GB.po
File diff suppressed because it is too large
Load Diff
257
po/et.po
257
po/et.po
@@ -7,15 +7,15 @@
|
||||
#
|
||||
# Tõivo Leedjärv <toivo linux ee>, 2004.
|
||||
# Ivar Smolin <okul linux ee>, 2005, 2006, 2009–2011.
|
||||
# Mattias Põldaru <mahfiaz@gmail.com>, 2008–2011, 2012.
|
||||
# Mattias Põldaru <mahfiaz@gmail.com>, 2008–2011, 2012, 2013.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: mutter MASTER\n"
|
||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
|
||||
"product=mutter&keywords=I18N+L10N&component=general\n"
|
||||
"POT-Creation-Date: 2012-12-18 22:30+0000\n"
|
||||
"PO-Revision-Date: 2012-12-19 18:06+0300\n"
|
||||
"POT-Creation-Date: 2013-09-10 15:25+0000\n"
|
||||
"PO-Revision-Date: 2013-09-11 23:20+0300\n"
|
||||
"Last-Translator: Mattias Põldaru <mahfiaz@gmail.com>\n"
|
||||
"Language-Team: Estonian <>\n"
|
||||
"Language: et\n"
|
||||
@@ -23,6 +23,7 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n!=1);\n"
|
||||
"X-Generator: Poedit 1.5.4\n"
|
||||
|
||||
msgid "Navigation"
|
||||
msgstr "Navigeerimine"
|
||||
@@ -132,8 +133,8 @@ msgstr "Varjatud oleku vahetamine"
|
||||
msgid "Close window"
|
||||
msgstr "Akna sulgemine"
|
||||
|
||||
msgid "Minimize window"
|
||||
msgstr "Akna minimeerimine"
|
||||
msgid "Hide window"
|
||||
msgstr "Peida aken"
|
||||
|
||||
msgid "Move window"
|
||||
msgstr "Akna liigutamine"
|
||||
@@ -173,6 +174,9 @@ msgid ""
|
||||
"\"."
|
||||
msgstr "Teine komposiithaldur juba töötab ekraani %i kuval \"%s\"."
|
||||
|
||||
msgid "background texture could not be created from file"
|
||||
msgstr "failist polnud võimalik taustatekstuuri luua"
|
||||
|
||||
msgid "Bell event"
|
||||
msgstr "Helina sündmus"
|
||||
|
||||
@@ -214,6 +218,10 @@ msgstr ""
|
||||
"Mõni teine programm juba kasutab klahvi %s koos muuteklahvidega %x "
|
||||
"kiirklahvina\n"
|
||||
|
||||
#, c-format
|
||||
msgid "\"%s\" is not a valid accelerator\n"
|
||||
msgstr "\"%s\" pole sobiv kiirklahv\n"
|
||||
|
||||
msgid "Disable connection to session manager"
|
||||
msgstr "Seansihalduriga ühendumise keelamine"
|
||||
|
||||
@@ -242,6 +250,17 @@ msgid ""
|
||||
msgstr ""
|
||||
"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
|
||||
msgid ""
|
||||
"mutter %s\n"
|
||||
@@ -374,7 +393,6 @@ msgstr "Tõrge logifaili %s avamisel funktsiooniga fdopen(): %s\n"
|
||||
msgid "Opened log file %s\n"
|
||||
msgstr "Avati logifail %s\n"
|
||||
|
||||
#, c-format
|
||||
msgid "Mutter was compiled without support for verbose mode\n"
|
||||
msgstr "Mutter kompileeriti ilma jutuka režiimi toeta\n"
|
||||
|
||||
@@ -549,16 +567,22 @@ msgstr ""
|
||||
"Lohistatava äärise laius. Kui kujunduse nähtavatest ääristest ei piisa, "
|
||||
"lisatakse puuduoleva osa jaoks nähtamatu ääris."
|
||||
|
||||
msgid "Auto maximize nearly monitor sized windows"
|
||||
msgstr "Peaaegu monitori suurused ekraanid maksimeeritakse automaatselt"
|
||||
|
||||
msgid ""
|
||||
"If enabled, new windows that are initially the size of the monitor "
|
||||
"automatically get maximized."
|
||||
msgstr ""
|
||||
"Kui lubatud, maksimeeritakse automaatselt aknad, mis on avanedes monitori "
|
||||
"suurused."
|
||||
|
||||
msgid "Select window from tab popup"
|
||||
msgstr "Akna valimine tabulaatori hüpikaknalt"
|
||||
|
||||
msgid "Cancel tab popup"
|
||||
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!
|
||||
msgid "Mi_nimize"
|
||||
msgstr "_Minimeeri"
|
||||
@@ -1264,156 +1288,151 @@ msgstr "Selle teema jaoks on <%s> määratud kaks korda"
|
||||
msgid "Failed to find a valid file for theme %s\n"
|
||||
msgstr "Tõrge %s teema jaoks korrektse faili leidmisel\n"
|
||||
|
||||
msgid "_Windows"
|
||||
msgstr "_Aknad"
|
||||
#~ msgid "Usage: %s\n"
|
||||
#~ msgstr "Kasutamine: %s\n"
|
||||
|
||||
msgid "_Dialog"
|
||||
msgstr "_Dialoog"
|
||||
#~ msgid "_Windows"
|
||||
#~ msgstr "_Aknad"
|
||||
|
||||
msgid "_Modal dialog"
|
||||
msgstr "_Modaaldialoog"
|
||||
#~ msgid "_Dialog"
|
||||
#~ msgstr "_Dialoog"
|
||||
|
||||
msgid "_Utility"
|
||||
msgstr "_Utiliit"
|
||||
#~ msgid "_Modal dialog"
|
||||
#~ msgstr "_Modaaldialoog"
|
||||
|
||||
msgid "_Splashscreen"
|
||||
msgstr "_Käivitusekraan"
|
||||
#~ msgid "_Utility"
|
||||
#~ msgstr "_Utiliit"
|
||||
|
||||
msgid "_Top dock"
|
||||
msgstr "Ü_lemine dokk"
|
||||
#~ msgid "_Splashscreen"
|
||||
#~ msgstr "_Käivitusekraan"
|
||||
|
||||
msgid "_Bottom dock"
|
||||
msgstr "_Alumine dokk"
|
||||
#~ msgid "_Top dock"
|
||||
#~ msgstr "Ü_lemine dokk"
|
||||
|
||||
msgid "_Left dock"
|
||||
msgstr "_Vasak dokk"
|
||||
#~ msgid "_Bottom dock"
|
||||
#~ msgstr "_Alumine dokk"
|
||||
|
||||
msgid "_Right dock"
|
||||
msgstr "_Parem dokk"
|
||||
#~ msgid "_Left dock"
|
||||
#~ msgstr "_Vasak dokk"
|
||||
|
||||
msgid "_All docks"
|
||||
msgstr "_Kõik dokid"
|
||||
#~ msgid "_Right dock"
|
||||
#~ msgstr "_Parem dokk"
|
||||
|
||||
msgid "Des_ktop"
|
||||
msgstr "_Töölaud"
|
||||
#~ msgid "_All docks"
|
||||
#~ msgstr "_Kõik dokid"
|
||||
|
||||
msgid "Open another one of these windows"
|
||||
msgstr "Ava neist akendest järgmine"
|
||||
#~ msgid "Des_ktop"
|
||||
#~ msgstr "_Töölaud"
|
||||
|
||||
msgid "This is a demo button with an 'open' icon"
|
||||
msgstr "See on näidisnupp koos 'ava' ikooniga"
|
||||
#~ msgid "Open another one of these windows"
|
||||
#~ msgstr "Ava neist akendest järgmine"
|
||||
|
||||
msgid "This is a demo button with a 'quit' icon"
|
||||
msgstr "See on näidisnupp koos 'lõpeta' ikooniga"
|
||||
#~ msgid "This is a demo button with an 'open' icon"
|
||||
#~ msgstr "See on näidisnupp koos 'ava' ikooniga"
|
||||
|
||||
msgid "This is a sample message in a sample dialog"
|
||||
msgstr "See on näidisteade näidisdialoogis"
|
||||
#~ msgid "This is a demo button with a 'quit' icon"
|
||||
#~ msgstr "See on näidisnupp koos 'lõpeta' ikooniga"
|
||||
|
||||
#, c-format
|
||||
msgid "Fake menu item %d\n"
|
||||
msgstr "Võltsitud menüüpunkt %d\n"
|
||||
#~ msgid "This is a sample message in a sample dialog"
|
||||
#~ msgstr "See on näidisteade näidisdialoogis"
|
||||
|
||||
msgid "Border-only window"
|
||||
msgstr "Ainult raamiga aken"
|
||||
#~ msgid "Fake menu item %d\n"
|
||||
#~ msgstr "Võltsitud menüüpunkt %d\n"
|
||||
|
||||
msgid "Bar"
|
||||
msgstr "Riba"
|
||||
#~ msgid "Border-only window"
|
||||
#~ msgstr "Ainult raamiga aken"
|
||||
|
||||
msgid "Normal Application Window"
|
||||
msgstr "Tavaline rakenduseaken"
|
||||
#~ msgid "Bar"
|
||||
#~ msgstr "Riba"
|
||||
|
||||
msgid "Dialog Box"
|
||||
msgstr "Dialoogikast"
|
||||
#~ msgid "Normal Application Window"
|
||||
#~ msgstr "Tavaline rakenduseaken"
|
||||
|
||||
msgid "Modal Dialog Box"
|
||||
msgstr "Modaalne dialoogikast"
|
||||
#~ msgid "Dialog Box"
|
||||
#~ msgstr "Dialoogikast"
|
||||
|
||||
msgid "Utility Palette"
|
||||
msgstr "Rakendite palett"
|
||||
#~ msgid "Modal Dialog Box"
|
||||
#~ msgstr "Modaalne dialoogikast"
|
||||
|
||||
msgid "Torn-off Menu"
|
||||
msgstr "Ärarebitav menüü"
|
||||
#~ msgid "Utility Palette"
|
||||
#~ msgstr "Rakendite palett"
|
||||
|
||||
msgid "Border"
|
||||
msgstr "Raam"
|
||||
#~ msgid "Torn-off Menu"
|
||||
#~ msgstr "Ärarebitav menüü"
|
||||
|
||||
msgid "Attached Modal Dialog"
|
||||
msgstr "Kinnistatud modaaldialoog"
|
||||
#~ msgid "Border"
|
||||
#~ msgstr "Raam"
|
||||
|
||||
#, c-format
|
||||
msgid "Button layout test %d"
|
||||
msgstr "Nuppude paigutuse test %d"
|
||||
#~ msgid "Attached Modal Dialog"
|
||||
#~ msgstr "Kinnistatud modaaldialoog"
|
||||
|
||||
#, c-format
|
||||
msgid "%g milliseconds to draw one window frame"
|
||||
msgstr "%g millisekundit kulub ühe akna raami joonistamiseks"
|
||||
#~ msgid "Button layout test %d"
|
||||
#~ msgstr "Nuppude paigutuse test %d"
|
||||
|
||||
#, c-format
|
||||
msgid "Usage: metacity-theme-viewer [THEMENAME]\n"
|
||||
msgstr "Kasutamine: metacity-theme-viewer [TEEMANIMI]\n"
|
||||
#~ msgid "%g milliseconds to draw one window frame"
|
||||
#~ msgstr "%g millisekundit kulub ühe akna raami joonistamiseks"
|
||||
|
||||
#, c-format
|
||||
msgid "Error loading theme: %s\n"
|
||||
msgstr "Viga teema laadimisel: %s\n"
|
||||
#~ msgid "Usage: metacity-theme-viewer [THEMENAME]\n"
|
||||
#~ msgstr "Kasutamine: metacity-theme-viewer [TEEMANIMI]\n"
|
||||
|
||||
#, c-format
|
||||
msgid "Loaded theme \"%s\" in %g seconds\n"
|
||||
msgstr "Teema \"%s\" laaditi %g sekundiga\n"
|
||||
#~ msgid "Error loading theme: %s\n"
|
||||
#~ msgstr "Viga teema laadimisel: %s\n"
|
||||
|
||||
msgid "Normal Title Font"
|
||||
msgstr "Tiitli tavasuurusega kirjatüüp"
|
||||
#~ msgid "Loaded theme \"%s\" in %g seconds\n"
|
||||
#~ msgstr "Teema \"%s\" laaditi %g sekundiga\n"
|
||||
|
||||
msgid "Small Title Font"
|
||||
msgstr "Tiitli väike kirjatüüp"
|
||||
#~ msgid "Normal Title Font"
|
||||
#~ msgstr "Tiitli tavasuurusega kirjatüüp"
|
||||
|
||||
msgid "Large Title Font"
|
||||
msgstr "Tiitli suur kirjatüüp"
|
||||
#~ msgid "Small Title Font"
|
||||
#~ msgstr "Tiitli väike kirjatüüp"
|
||||
|
||||
msgid "Button Layouts"
|
||||
msgstr "Nuppude paigutus"
|
||||
#~ msgid "Large Title Font"
|
||||
#~ msgstr "Tiitli suur kirjatüüp"
|
||||
|
||||
msgid "Benchmark"
|
||||
msgstr "Jõudlus"
|
||||
#~ msgid "Button Layouts"
|
||||
#~ msgstr "Nuppude paigutus"
|
||||
|
||||
msgid "Window Title Goes Here"
|
||||
msgstr "Siia tuleb akna pealkiri"
|
||||
#~ msgid "Benchmark"
|
||||
#~ msgstr "Jõudlus"
|
||||
|
||||
#, 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 ""
|
||||
"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 "Window Title Goes Here"
|
||||
#~ msgstr "Siia tuleb akna pealkiri"
|
||||
|
||||
msgid "position expression test returned TRUE but set error"
|
||||
msgstr "asukoha avaldise kontroll tagastas TÕENE, aga määras vea"
|
||||
#~ 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 ""
|
||||
#~ "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"
|
||||
msgstr "asukoha avaldise kontroll tagastas VÄÄR, aga ei määranud viga"
|
||||
#~ msgid "position expression test returned TRUE but set error"
|
||||
#~ msgstr "asukoha avaldise kontroll tagastas TÕENE, aga määras vea"
|
||||
|
||||
msgid "Error was expected but none given"
|
||||
msgstr "Oodati viga, aga ühtegi ei edastatud"
|
||||
#~ msgid "position expression test returned FALSE but didn't set error"
|
||||
#~ msgstr "asukoha avaldise kontroll tagastas VÄÄR, aga ei määranud viga"
|
||||
|
||||
#, c-format
|
||||
msgid "Error %d was expected but %d given"
|
||||
msgstr "Oodati viga %d, aga edastati viga %d"
|
||||
#~ msgid "Error was expected but none given"
|
||||
#~ msgstr "Oodati viga, aga ühtegi ei edastatud"
|
||||
|
||||
#, c-format
|
||||
msgid "Error not expected but one was returned: %s"
|
||||
msgstr "Viga ei oodatud, aga üks edastati: %s"
|
||||
#~ msgid "Error %d was expected but %d given"
|
||||
#~ msgstr "Oodati viga %d, aga edastati viga %d"
|
||||
|
||||
#, c-format
|
||||
msgid "x value was %d, %d was expected"
|
||||
msgstr "x väärtus oli %d, oodati väärtust %d"
|
||||
#~ msgid "Error not expected but one was returned: %s"
|
||||
#~ msgstr "Viga ei oodatud, aga üks edastati: %s"
|
||||
|
||||
#, c-format
|
||||
msgid "y value was %d, %d was expected"
|
||||
msgstr "y väärtus oli %d, oodati väärtust %d"
|
||||
#~ msgid "x value was %d, %d was expected"
|
||||
#~ msgstr "x väärtus oli %d, oodati väärtust %d"
|
||||
|
||||
#, c-format
|
||||
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 "y value was %d, %d was expected"
|
||||
#~ msgstr "y väärtus oli %d, oodati väärtust %d"
|
||||
|
||||
#~ 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"
|
||||
#~ msgstr "Akna minimeerimine"
|
||||
|
463
po/pl.po
463
po/pl.po
@@ -9,14 +9,14 @@
|
||||
# Marek Stępień <marcoos@aviary.pl>, 2007.
|
||||
# Wadim Dziedzic <wdziedzic@aviary.pl>, 2007.
|
||||
# Tomasz Dominikowski <dominikowski@gmail.com>, 2008-2009.
|
||||
# Piotr Drąg <piotrdrag@gmail.com>, 2010-2012.
|
||||
# Aviary.pl <gnomepl@aviary.pl>, 2007-2012.
|
||||
# Piotr Drąg <piotrdrag@gmail.com>, 2010-2013.
|
||||
# Aviary.pl <gnomepl@aviary.pl>, 2007-2013.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: mutter\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2012-12-26 21:39+0100\n"
|
||||
"PO-Revision-Date: 2012-12-26 21:40+0100\n"
|
||||
"POT-Creation-Date: 2013-08-22 01:49+0200\n"
|
||||
"PO-Revision-Date: 2013-08-22 01:50+0200\n"
|
||||
"Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
|
||||
"Language-Team: Polish <gnomepl@aviary.pl>\n"
|
||||
"Language: pl\n"
|
||||
@@ -173,8 +173,8 @@ msgid "Close window"
|
||||
msgstr "Zamknięcie okna"
|
||||
|
||||
#: ../src/50-mutter-windows.xml.in.h:9
|
||||
msgid "Minimize window"
|
||||
msgstr "Minimalizacja okna"
|
||||
msgid "Hide window"
|
||||
msgstr "Ukrycie okna"
|
||||
|
||||
#: ../src/50-mutter-windows.xml.in.h:10
|
||||
msgid "Move window"
|
||||
@@ -187,7 +187,7 @@ msgstr "Zmiana rozmiaru okna"
|
||||
#: ../src/50-mutter-windows.xml.in.h:12
|
||||
msgid "Toggle window on all workspaces or one"
|
||||
msgstr ""
|
||||
"Przełączenie obecności okna na wszystkich obszarach roboczych lub jednym "
|
||||
"Przełączenie obecności okna na wszystkich obszarach roboczych lub jednym"
|
||||
|
||||
#: ../src/50-mutter-windows.xml.in.h:13
|
||||
msgid "Raise window if covered, otherwise lower it"
|
||||
@@ -220,7 +220,7 @@ msgstr "Podział widoku po prawej"
|
||||
|
||||
#. This probably means that a non-WM compositor like xcompmgr is running;
|
||||
#. * we have no way to get it to exit
|
||||
#: ../src/compositor/compositor.c:512
|
||||
#: ../src/compositor/compositor.c:596
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Another compositing manager is already running on screen %i on display \"%s"
|
||||
@@ -228,7 +228,11 @@ msgid ""
|
||||
msgstr ""
|
||||
"Inny menedżer składania jest już uruchomiony na podekranie %i ekranu \"%s\"."
|
||||
|
||||
#: ../src/core/bell.c:320
|
||||
#: ../src/compositor/meta-background.c:1076
|
||||
msgid "background texture could not be created from file"
|
||||
msgstr "nie można utworzyć tekstury tła z pliku"
|
||||
|
||||
#: ../src/core/bell.c:322
|
||||
msgid "Bell event"
|
||||
msgstr "Zdarzenie sygnału dźwiękowego"
|
||||
|
||||
@@ -260,18 +264,18 @@ msgstr "_Czekaj"
|
||||
msgid "_Force Quit"
|
||||
msgstr "_Zakończ"
|
||||
|
||||
#: ../src/core/display.c:394
|
||||
#: ../src/core/display.c:421
|
||||
#, c-format
|
||||
msgid "Missing %s extension required for compositing"
|
||||
msgstr "Brak rozszerzenia %s, wymaganego przez składanie"
|
||||
|
||||
#: ../src/core/display.c:491
|
||||
#: ../src/core/display.c:513
|
||||
#, c-format
|
||||
msgid "Failed to open X Window System display '%s'\n"
|
||||
msgstr ""
|
||||
"Otwarcie połączenia z ekranem \"%s\" systemu X Window się nie powiodło\n"
|
||||
|
||||
#: ../src/core/keybindings.c:876
|
||||
#: ../src/core/keybindings.c:1136
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Some other program is already using the key %s with modifiers %x as a "
|
||||
@@ -280,36 +284,41 @@ msgstr ""
|
||||
"Skrótu klawiszowego z klawiszem %s i modyfikatorami %x używa już inny "
|
||||
"program\n"
|
||||
|
||||
#: ../src/core/main.c:196
|
||||
msgid "Disable connection to session manager"
|
||||
msgstr "Wyłącza połączenie z menedżerem sesji"
|
||||
#: ../src/core/keybindings.c:1333
|
||||
#, c-format
|
||||
msgid "\"%s\" is not a valid accelerator\n"
|
||||
msgstr "\"%s\" nie jest prawidłowym skrótem\n"
|
||||
|
||||
#: ../src/core/main.c:202
|
||||
#: ../src/core/main.c:197
|
||||
msgid "Disable connection to session manager"
|
||||
msgstr "Rozłącza połączenie z menedżerem sesji"
|
||||
|
||||
#: ../src/core/main.c:203
|
||||
msgid "Replace the running window manager"
|
||||
msgstr "Zastępuje uruchomionego menedżera okien"
|
||||
|
||||
#: ../src/core/main.c:208
|
||||
#: ../src/core/main.c:209
|
||||
msgid "Specify session management ID"
|
||||
msgstr "Określa identyfikator zarządzania sesją"
|
||||
msgstr "Podaje identyfikator zarządzania sesją"
|
||||
|
||||
#: ../src/core/main.c:213
|
||||
#: ../src/core/main.c:214
|
||||
msgid "X Display to use"
|
||||
msgstr "Używany ekran X"
|
||||
|
||||
#: ../src/core/main.c:219
|
||||
#: ../src/core/main.c:220
|
||||
msgid "Initialize session from savefile"
|
||||
msgstr "Inicjuje sesję z zapisanego pliku"
|
||||
|
||||
#: ../src/core/main.c:225
|
||||
#: ../src/core/main.c:226
|
||||
msgid "Make X calls synchronous"
|
||||
msgstr "Synchroniczne wywołania X"
|
||||
|
||||
#: ../src/core/main.c:496
|
||||
#: ../src/core/main.c:534
|
||||
#, c-format
|
||||
msgid "Failed to scan themes directory: %s\n"
|
||||
msgstr "Przejrzenie katalogu z motywami się nie powiodło: %s\n"
|
||||
|
||||
#: ../src/core/main.c:512
|
||||
#: ../src/core/main.c:550
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Could not find a theme! Be sure %s exists and contains the usual themes.\n"
|
||||
@@ -317,6 +326,19 @@ msgstr ""
|
||||
"Nie można odnaleźć żadnego motywu. Proszę sprawdzić, czy katalog %s istnieje "
|
||||
"i zawiera standardowe motywy.\n"
|
||||
|
||||
#: ../src/core/monitor.c:702
|
||||
msgid "Built-in display"
|
||||
msgstr "Wbudowany ekran"
|
||||
|
||||
#. TRANSLATORS: this is a monitor name (in case we don't know
|
||||
#. the vendor), it's Unknown followed by a size in inches,
|
||||
#. like 'Unknown 15"'
|
||||
#.
|
||||
#: ../src/core/monitor.c:730
|
||||
#, c-format
|
||||
msgid "Unknown %s"
|
||||
msgstr "Nieznany %s"
|
||||
|
||||
#: ../src/core/mutter.c:40
|
||||
#, c-format
|
||||
msgid ""
|
||||
@@ -341,7 +363,7 @@ msgstr "Wyświetla wersję"
|
||||
msgid "Mutter plugin to use"
|
||||
msgstr "Używana wtyczka programu Mutter"
|
||||
|
||||
#: ../src/core/prefs.c:1087
|
||||
#: ../src/core/prefs.c:1202
|
||||
msgid ""
|
||||
"Workarounds for broken applications disabled. Some applications may not "
|
||||
"behave properly.\n"
|
||||
@@ -349,14 +371,14 @@ msgstr ""
|
||||
"Obejścia dla błędnie działających programów są wyłączone. Niektóre z nich "
|
||||
"mogą się zachowywać w sposób nieprzewidywalny.\n"
|
||||
|
||||
#: ../src/core/prefs.c:1162
|
||||
#: ../src/core/prefs.c:1277
|
||||
#, c-format
|
||||
msgid "Could not parse font description \"%s\" from GSettings key %s\n"
|
||||
msgstr ""
|
||||
"Nie można przetworzyć opisu czcionki \"%s\", powiązanego z kluczem GSettings "
|
||||
"%s\n"
|
||||
|
||||
#: ../src/core/prefs.c:1228
|
||||
#: ../src/core/prefs.c:1343
|
||||
#, c-format
|
||||
msgid ""
|
||||
"\"%s\" found in configuration database is not a valid value for mouse button "
|
||||
@@ -365,7 +387,7 @@ msgstr ""
|
||||
"Wartość \"%s\", odnaleziona w bazie danych konfiguracji nie opisuje "
|
||||
"prawidłowo modyfikatora przycisku myszy\n"
|
||||
|
||||
#: ../src/core/prefs.c:1768
|
||||
#: ../src/core/prefs.c:1909
|
||||
#, c-format
|
||||
msgid ""
|
||||
"\"%s\" found in configuration database is not a valid value for keybinding "
|
||||
@@ -374,17 +396,17 @@ msgstr ""
|
||||
"Wartość \"%s\", odnaleziona w bazie danych konfiguracji nie opisuje "
|
||||
"prawidłowo skrótu klawiszowego \"%s\"\n"
|
||||
|
||||
#: ../src/core/prefs.c:1865
|
||||
#: ../src/core/prefs.c:1999
|
||||
#, c-format
|
||||
msgid "Workspace %d"
|
||||
msgstr "Obszar roboczy %d"
|
||||
|
||||
#: ../src/core/screen.c:658
|
||||
#: ../src/core/screen.c:537
|
||||
#, c-format
|
||||
msgid "Screen %d on display '%s' is invalid\n"
|
||||
msgstr "Podekran %d ekranu \"%s\" jest nieprawidłowy\n"
|
||||
|
||||
#: ../src/core/screen.c:674
|
||||
#: ../src/core/screen.c:553
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Screen %d on display \"%s\" already has a window manager; try using the --"
|
||||
@@ -393,7 +415,7 @@ msgstr ""
|
||||
"Na podekranie %d ekranu \"%s\" działa już menedżer okien. Aby zastąpić "
|
||||
"działającego menedżera okien, proszę spróbować użyć opcji --replace.\n"
|
||||
|
||||
#: ../src/core/screen.c:701
|
||||
#: ../src/core/screen.c:580
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Could not acquire window manager selection on screen %d display \"%s\"\n"
|
||||
@@ -401,12 +423,12 @@ msgstr ""
|
||||
"Nie można uzyskać zaznaczenia menedżera okien na podekranie %d ekranu \"%s"
|
||||
"\"\n"
|
||||
|
||||
#: ../src/core/screen.c:770
|
||||
#: ../src/core/screen.c:658
|
||||
#, c-format
|
||||
msgid "Screen %d on display \"%s\" already has a window manager\n"
|
||||
msgstr "Na podekranie %d ekranu \"%s\" działa już menedżer okien\n"
|
||||
|
||||
#: ../src/core/screen.c:955
|
||||
#: ../src/core/screen.c:850
|
||||
#, c-format
|
||||
msgid "Could not release screen %d on display \"%s\"\n"
|
||||
msgstr "Nie można zwolnić podekranu %d ekranu \"%s\"\n"
|
||||
@@ -468,45 +490,44 @@ msgstr ""
|
||||
"Te okna nie obsługują opcji zapisu aktualnego stanu (\"save current setup"
|
||||
"\"), więc przy następnym zalogowaniu będą musiały zostać uruchomione ręcznie."
|
||||
|
||||
#: ../src/core/util.c:80
|
||||
#: ../src/core/util.c:84
|
||||
#, c-format
|
||||
msgid "Failed to open debug log: %s\n"
|
||||
msgstr "Otwarcie dziennika z zapisem wykonania się nie powiodło: %s\n"
|
||||
|
||||
#: ../src/core/util.c:90
|
||||
#: ../src/core/util.c:94
|
||||
#, c-format
|
||||
msgid "Failed to fdopen() log file %s: %s\n"
|
||||
msgstr "Wykonać fdopen() na pliku dziennika %s się nie powiodło: %s\n"
|
||||
|
||||
#: ../src/core/util.c:96
|
||||
#: ../src/core/util.c:100
|
||||
#, c-format
|
||||
msgid "Opened log file %s\n"
|
||||
msgstr "Otwarty plik dziennika %s\n"
|
||||
|
||||
#: ../src/core/util.c:115 ../src/tools/mutter-message.c:149
|
||||
#, c-format
|
||||
#: ../src/core/util.c:119
|
||||
msgid "Mutter was compiled without support for verbose mode\n"
|
||||
msgstr ""
|
||||
"Program Mutter został skompilowany bez obsługi trybu z obszerną informacją\n"
|
||||
|
||||
#: ../src/core/util.c:259
|
||||
#: ../src/core/util.c:264
|
||||
msgid "Window manager: "
|
||||
msgstr "Menedżer okien: "
|
||||
|
||||
#: ../src/core/util.c:407
|
||||
#: ../src/core/util.c:414
|
||||
msgid "Bug in window manager: "
|
||||
msgstr "Błąd w programie menedżera okien: "
|
||||
|
||||
#: ../src/core/util.c:438
|
||||
#: ../src/core/util.c:445
|
||||
msgid "Window manager warning: "
|
||||
msgstr "Ostrzeżenie menedżera okien: "
|
||||
|
||||
#: ../src/core/util.c:466
|
||||
#: ../src/core/util.c:473
|
||||
msgid "Window manager error: "
|
||||
msgstr "Błąd menedżera okien: "
|
||||
|
||||
#. first time through
|
||||
#: ../src/core/window.c:7277
|
||||
#: ../src/core/window.c:7533
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER "
|
||||
@@ -522,7 +543,7 @@ msgstr ""
|
||||
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
|
||||
#. * about these apps but make them work.
|
||||
#.
|
||||
#: ../src/core/window.c:7943
|
||||
#: ../src/core/window.c:8257
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Window %s sets an MWM hint indicating it isn't resizable, but sets min size "
|
||||
@@ -532,23 +553,23 @@ msgstr ""
|
||||
"niezmienny, lecz jednocześnie ustawia minimalny rozmiar na %d x %d, a "
|
||||
"maksymalny rozmiar na %d x %d. To nie ma żadnego sensu.\n"
|
||||
|
||||
#: ../src/core/window-props.c:274
|
||||
#: ../src/core/window-props.c:347
|
||||
#, c-format
|
||||
msgid "Application set a bogus _NET_WM_PID %lu\n"
|
||||
msgstr "Program ustawił błędną wartość _NET_WM_PID %lu\n"
|
||||
|
||||
#: ../src/core/window-props.c:393
|
||||
#: ../src/core/window-props.c:463
|
||||
#, c-format
|
||||
msgid "%s (on %s)"
|
||||
msgstr "%s (na %s)"
|
||||
|
||||
#: ../src/core/window-props.c:1448
|
||||
#: ../src/core/window-props.c:1546
|
||||
#, c-format
|
||||
msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
|
||||
msgstr ""
|
||||
"Nieprawidłowa wartość WM_TRANSIENT_FOR dla okna 0x%lx określona w %s.\n"
|
||||
|
||||
#: ../src/core/window-props.c:1459
|
||||
#: ../src/core/window-props.c:1557
|
||||
#, c-format
|
||||
msgid "WM_TRANSIENT_FOR window 0x%lx for %s would create loop.\n"
|
||||
msgstr "WM_TRANSIENT_FOR okna 0x%lx dla %s utworzyłoby pętlę.\n"
|
||||
@@ -707,11 +728,11 @@ msgstr ""
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:18
|
||||
msgid ""
|
||||
"If enabled, monitor nearly monitor sized windows automatically get maximized "
|
||||
"when mapped."
|
||||
"If enabled, new windows that are initially the size of the monitor "
|
||||
"automatically get maximized."
|
||||
msgstr ""
|
||||
"Jeśli jest włączone, to okna o rozmiarze zbliżonym do rozmiaru monitora "
|
||||
"zostają automatycznie maksymalizowane podczas mapowania."
|
||||
"Jeśli jest włączone, to nowe okna o początkowym rozmiarze zbliżonym do "
|
||||
"rozmiaru monitora zostają automatycznie maksymalizowane."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:19
|
||||
msgid "Select window from tab popup"
|
||||
@@ -721,109 +742,104 @@ msgstr "Wybór okna z wyskakującego okna dla tabulacji"
|
||||
msgid "Cancel tab popup"
|
||||
msgstr "Anulowanie wyskakującego okna dla tabulacji"
|
||||
|
||||
#: ../src/tools/mutter-message.c:123
|
||||
#, c-format
|
||||
msgid "Usage: %s\n"
|
||||
msgstr "Użycie: %s\n"
|
||||
|
||||
#. 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"
|
||||
msgstr "Zm_inimalizuj"
|
||||
|
||||
#. 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"
|
||||
msgstr "Zm_aksymalizuj"
|
||||
|
||||
#. 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"
|
||||
msgstr "Cofnij m_aksymalizację"
|
||||
|
||||
#. 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"
|
||||
msgstr "_Zwiń"
|
||||
|
||||
#. Translators: Translate this string the same way as you do in libwnck!
|
||||
#: ../src/ui/menu.c:77
|
||||
#: ../src/ui/menu.c:75
|
||||
msgid "_Unroll"
|
||||
msgstr "Ro_zwiń"
|
||||
|
||||
#. Translators: Translate this string the same way as you do in libwnck!
|
||||
#: ../src/ui/menu.c:79
|
||||
#: ../src/ui/menu.c:77
|
||||
msgid "_Move"
|
||||
msgstr "Prz_esuń"
|
||||
|
||||
#. Translators: Translate this string the same way as you do in libwnck!
|
||||
#: ../src/ui/menu.c:81
|
||||
#: ../src/ui/menu.c:79
|
||||
msgid "_Resize"
|
||||
msgstr "Zmień _rozmiar"
|
||||
|
||||
#. 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"
|
||||
msgstr "Przeno_szenie paska tytułowego na ekranie"
|
||||
|
||||
#. separator
|
||||
#. 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"
|
||||
msgstr "Zawsze na _wierzchu"
|
||||
|
||||
#. 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"
|
||||
msgstr "_Zawsze na widocznym obszarze roboczym"
|
||||
|
||||
#. 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"
|
||||
msgstr "_Tylko na tym obszarze roboczym"
|
||||
|
||||
#. 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"
|
||||
msgstr "Przenieś na _lewy obszar roboczy"
|
||||
|
||||
#. 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"
|
||||
msgstr "Przen_ieś na prawy obszar roboczy"
|
||||
|
||||
#. 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"
|
||||
msgstr "_Przenieś na górny obszar roboczy"
|
||||
|
||||
#. 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"
|
||||
msgstr "Przenieś na _dolny obszar roboczy"
|
||||
|
||||
#. separator
|
||||
#. Translators: Translate this string the same way as you do in libwnck!
|
||||
#: ../src/ui/menu.c:104
|
||||
#: ../src/ui/menu.c:102
|
||||
msgid "_Close"
|
||||
msgstr "Za_mknij"
|
||||
|
||||
#: ../src/ui/menu.c:204
|
||||
#: ../src/ui/menu.c:202
|
||||
#, c-format
|
||||
msgid "Workspace %d%n"
|
||||
msgstr "Obszar roboczy %d%n"
|
||||
|
||||
#: ../src/ui/menu.c:214
|
||||
#: ../src/ui/menu.c:212
|
||||
#, c-format
|
||||
msgid "Workspace 1_0"
|
||||
msgstr "Obszar roboczy 1_0"
|
||||
|
||||
#: ../src/ui/menu.c:216
|
||||
#: ../src/ui/menu.c:214
|
||||
#, c-format
|
||||
msgid "Workspace %s%d"
|
||||
msgstr "Obszar roboczy %s%d"
|
||||
|
||||
#: ../src/ui/menu.c:397
|
||||
#: ../src/ui/menu.c:384
|
||||
msgid "Move to Another _Workspace"
|
||||
msgstr "Przeniesienie na inny _obszar roboczy"
|
||||
|
||||
@@ -920,54 +936,54 @@ msgstr "Mod5"
|
||||
#. Translators: This represents the size of a window. The first number is
|
||||
#. * the width of the window and the second is the height.
|
||||
#.
|
||||
#: ../src/ui/resizepopup.c:113
|
||||
#: ../src/ui/resizepopup.c:136
|
||||
#, c-format
|
||||
msgid "%d x %d"
|
||||
msgstr "%d x %d"
|
||||
|
||||
#: ../src/ui/theme.c:234
|
||||
#: ../src/ui/theme.c:236
|
||||
msgid "top"
|
||||
msgstr "góra"
|
||||
|
||||
#: ../src/ui/theme.c:236
|
||||
#: ../src/ui/theme.c:238
|
||||
msgid "bottom"
|
||||
msgstr "dół"
|
||||
|
||||
#: ../src/ui/theme.c:238
|
||||
#: ../src/ui/theme.c:240
|
||||
msgid "left"
|
||||
msgstr "lewa"
|
||||
|
||||
#: ../src/ui/theme.c:240
|
||||
#: ../src/ui/theme.c:242
|
||||
msgid "right"
|
||||
msgstr "prawa"
|
||||
|
||||
#: ../src/ui/theme.c:268
|
||||
#: ../src/ui/theme.c:270
|
||||
#, c-format
|
||||
msgid "frame geometry does not specify \"%s\" dimension"
|
||||
msgstr "Rozmiar ramki nie określa wymiaru \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:287
|
||||
#: ../src/ui/theme.c:289
|
||||
#, c-format
|
||||
msgid "frame geometry does not specify dimension \"%s\" for border \"%s\""
|
||||
msgstr "Rozmiar ramki nie określa wymiaru \"%s\" dla krawędzi \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:324
|
||||
#: ../src/ui/theme.c:326
|
||||
#, c-format
|
||||
msgid "Button aspect ratio %g is not reasonable"
|
||||
msgstr ""
|
||||
"Współczynnik proporcji przycisku %g nie mieści się w rozsądnych granicach"
|
||||
|
||||
#: ../src/ui/theme.c:336
|
||||
#: ../src/ui/theme.c:338
|
||||
#, c-format
|
||||
msgid "Frame geometry does not specify size of buttons"
|
||||
msgstr "Rozmiar ramki nie określa liczby przycisków"
|
||||
|
||||
#: ../src/ui/theme.c:1049
|
||||
#: ../src/ui/theme.c:1051
|
||||
#, c-format
|
||||
msgid "Gradients should have at least two colors"
|
||||
msgstr "Gradienty powinny się składać co najmniej z dwóch kolorów"
|
||||
|
||||
#: ../src/ui/theme.c:1201
|
||||
#: ../src/ui/theme.c:1203
|
||||
#, c-format
|
||||
msgid ""
|
||||
"GTK custom color specification must have color name and fallback in "
|
||||
@@ -977,7 +993,7 @@ msgstr ""
|
||||
"kolor zastępczy w nawiasach, np. gtk:custom(foo,bar); nie można przetworzyć "
|
||||
"\"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:1217
|
||||
#: ../src/ui/theme.c:1219
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Invalid character '%c' in color_name parameter of gtk:custom, only A-Za-z0-9-"
|
||||
@@ -986,7 +1002,7 @@ msgstr ""
|
||||
"Nieprawidłowy znak \"%c\" w parametrze nazwa_koloru opcji gtk:custom, tylko "
|
||||
"znaki A-Za-z0-9-_ są prawidłowe"
|
||||
|
||||
#: ../src/ui/theme.c:1231
|
||||
#: ../src/ui/theme.c:1233
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Gtk:custom format is \"gtk:custom(color_name,fallback)\", \"%s\" does not "
|
||||
@@ -995,7 +1011,7 @@ msgstr ""
|
||||
"Formatem Gtk:custom jest \"gtk:custom(nazwa_koloru,kolor_zastępczy)\", \"%s"
|
||||
"\" nie pasuje do formatu"
|
||||
|
||||
#: ../src/ui/theme.c:1276
|
||||
#: ../src/ui/theme.c:1278
|
||||
#, c-format
|
||||
msgid ""
|
||||
"GTK color specification must have the state in brackets, e.g. gtk:fg[NORMAL] "
|
||||
@@ -1005,7 +1021,7 @@ msgstr ""
|
||||
"kwadratowych, np. gtk:fg[NORMAL], gdzie NORMAL jest nazwą stanu; nie można "
|
||||
"przetworzyć \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:1290
|
||||
#: ../src/ui/theme.c:1292
|
||||
#, c-format
|
||||
msgid ""
|
||||
"GTK color specification must have a close bracket after the state, e.g. gtk:"
|
||||
@@ -1015,17 +1031,17 @@ msgstr ""
|
||||
"nawias kwadratowy, np. gtk:fg[NORMAL], gdzie NORMAL jest nazwą stanu; nie "
|
||||
"można przetworzyć \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:1301
|
||||
#: ../src/ui/theme.c:1303
|
||||
#, c-format
|
||||
msgid "Did not understand state \"%s\" in color specification"
|
||||
msgstr "Niezrozumiały stan \"%s\" w specyfikacji koloru"
|
||||
|
||||
#: ../src/ui/theme.c:1314
|
||||
#: ../src/ui/theme.c:1316
|
||||
#, c-format
|
||||
msgid "Did not understand color component \"%s\" in color specification"
|
||||
msgstr "Niezrozumiała definicja koloru \"%s\" w specyfikacji koloru"
|
||||
|
||||
#: ../src/ui/theme.c:1343
|
||||
#: ../src/ui/theme.c:1345
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Blend format is \"blend/bg_color/fg_color/alpha\", \"%s\" does not fit the "
|
||||
@@ -1034,19 +1050,19 @@ msgstr ""
|
||||
"Formatem przenikania jest \"blend/bg_color/fg_color/alpha\", \"%s\" nie "
|
||||
"pasuje do formatu"
|
||||
|
||||
#: ../src/ui/theme.c:1354
|
||||
#: ../src/ui/theme.c:1356
|
||||
#, c-format
|
||||
msgid "Could not parse alpha value \"%s\" in blended color"
|
||||
msgstr "Nie można przetworzyć wartości alfa \"%s\" w przenikającym kolorze"
|
||||
|
||||
#: ../src/ui/theme.c:1364
|
||||
#: ../src/ui/theme.c:1366
|
||||
#, c-format
|
||||
msgid "Alpha value \"%s\" in blended color is not between 0.0 and 1.0"
|
||||
msgstr ""
|
||||
"Wartość alfa \"%s\" w przenikającym kolorze nie zawiera się pomiędzy 0,0 i "
|
||||
"1,0"
|
||||
|
||||
#: ../src/ui/theme.c:1411
|
||||
#: ../src/ui/theme.c:1413
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Shade format is \"shade/base_color/factor\", \"%s\" does not fit the format"
|
||||
@@ -1054,29 +1070,29 @@ msgstr ""
|
||||
"Formatem przenikania jest \"shade/base_color/factor\", \"%s\" nie pasuje do "
|
||||
"formatu"
|
||||
|
||||
#: ../src/ui/theme.c:1422
|
||||
#: ../src/ui/theme.c:1424
|
||||
#, c-format
|
||||
msgid "Could not parse shade factor \"%s\" in shaded color"
|
||||
msgstr ""
|
||||
"Nie można przetworzyć współczynnika przenikania \"%s\" w przenikającym "
|
||||
"kolorze"
|
||||
|
||||
#: ../src/ui/theme.c:1432
|
||||
#: ../src/ui/theme.c:1434
|
||||
#, c-format
|
||||
msgid "Shade factor \"%s\" in shaded color is negative"
|
||||
msgstr "Współczynnik przenikania \"%s\" w przenikającym kolorze jest ujemny"
|
||||
|
||||
#: ../src/ui/theme.c:1461
|
||||
#: ../src/ui/theme.c:1463
|
||||
#, c-format
|
||||
msgid "Could not parse color \"%s\""
|
||||
msgstr "Nie można przetworzyć koloru \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:1778
|
||||
#: ../src/ui/theme.c:1780
|
||||
#, c-format
|
||||
msgid "Coordinate expression contains character '%s' which is not allowed"
|
||||
msgstr "Wyrażenie określające współrzędne zawiera niedozwolony znak \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:1805
|
||||
#: ../src/ui/theme.c:1807
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression contains floating point number '%s' which could not be "
|
||||
@@ -1085,14 +1101,14 @@ msgstr ""
|
||||
"Wyrażenie określające współrzędne zawiera liczbę zmiennoprzecinkową \"%s\", "
|
||||
"której nie można przetworzyć"
|
||||
|
||||
#: ../src/ui/theme.c:1819
|
||||
#: ../src/ui/theme.c:1821
|
||||
#, c-format
|
||||
msgid "Coordinate expression contains integer '%s' which could not be parsed"
|
||||
msgstr ""
|
||||
"Wyrażenie określające współrzędne zawiera liczbę całkowitą \"%s\", której "
|
||||
"nie można przetworzyć"
|
||||
|
||||
#: ../src/ui/theme.c:1940
|
||||
#: ../src/ui/theme.c:1942
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression contained unknown operator at the start of this text: "
|
||||
@@ -1101,18 +1117,18 @@ msgstr ""
|
||||
"Wyrażenie określające współrzędne zawiera nieznany operator na początku "
|
||||
"tekstu: \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:1997
|
||||
#: ../src/ui/theme.c:1999
|
||||
#, c-format
|
||||
msgid "Coordinate expression was empty or not understood"
|
||||
msgstr ""
|
||||
"Wyrażenie określające współrzędne jest puste lub nie można go rozpoznać"
|
||||
|
||||
#: ../src/ui/theme.c:2110 ../src/ui/theme.c:2120 ../src/ui/theme.c:2154
|
||||
#: ../src/ui/theme.c:2112 ../src/ui/theme.c:2122 ../src/ui/theme.c:2156
|
||||
#, c-format
|
||||
msgid "Coordinate expression results in division by zero"
|
||||
msgstr "Wyrażenie opisujące położenie zawiera dzielenie przez zero"
|
||||
|
||||
#: ../src/ui/theme.c:2162
|
||||
#: ../src/ui/theme.c:2164
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression tries to use mod operator on a floating-point number"
|
||||
@@ -1120,7 +1136,7 @@ msgstr ""
|
||||
"Wyrażenie opisujące położenie używa operatora dzielenia modulo z liczbą "
|
||||
"zmiennoprzecinkową"
|
||||
|
||||
#: ../src/ui/theme.c:2218
|
||||
#: ../src/ui/theme.c:2220
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression has an operator \"%s\" where an operand was expected"
|
||||
@@ -1128,19 +1144,19 @@ msgstr ""
|
||||
"Wyrażenie opisujące położenie zawiera operator \"%s\" w miejscu, w którym "
|
||||
"oczekiwano operandu"
|
||||
|
||||
#: ../src/ui/theme.c:2227
|
||||
#: ../src/ui/theme.c:2229
|
||||
#, c-format
|
||||
msgid "Coordinate expression had an operand where an operator was expected"
|
||||
msgstr ""
|
||||
"Wyrażenie opisujące położenie zawiera operand w miejscu, w którym oczekiwano "
|
||||
"operatora"
|
||||
|
||||
#: ../src/ui/theme.c:2235
|
||||
#: ../src/ui/theme.c:2237
|
||||
#, c-format
|
||||
msgid "Coordinate expression ended with an operator instead of an operand"
|
||||
msgstr "Wyrażenie opisujące położenie kończy się operatorem zamiast operandem"
|
||||
|
||||
#: ../src/ui/theme.c:2245
|
||||
#: ../src/ui/theme.c:2247
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression has operator \"%c\" following operator \"%c\" with no "
|
||||
@@ -1149,43 +1165,43 @@ msgstr ""
|
||||
"Wyrażenie opisujące położenie zawiera operator \"%c\" bezpośrednio po "
|
||||
"operatorze \"%c\" bez rozdzielającego ich operandu"
|
||||
|
||||
#: ../src/ui/theme.c:2396 ../src/ui/theme.c:2441
|
||||
#: ../src/ui/theme.c:2398 ../src/ui/theme.c:2443
|
||||
#, c-format
|
||||
msgid "Coordinate expression had unknown variable or constant \"%s\""
|
||||
msgstr ""
|
||||
"Wyrażenie opisujące położenie zawiera nieznaną zmienną lub stałą \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:2495
|
||||
#: ../src/ui/theme.c:2497
|
||||
#, c-format
|
||||
msgid "Coordinate expression parser overflowed its buffer."
|
||||
msgstr "Parser wyrażeń określających współrzędne przepełnił swój bufor."
|
||||
|
||||
#: ../src/ui/theme.c:2524
|
||||
#: ../src/ui/theme.c:2526
|
||||
#, c-format
|
||||
msgid "Coordinate expression had a close parenthesis with no open parenthesis"
|
||||
msgstr ""
|
||||
"Wyrażenie opisujące położenie zawiera nawias zamykający bez odpowiadającego "
|
||||
"mu nawiasu otwierającego"
|
||||
|
||||
#: ../src/ui/theme.c:2588
|
||||
#: ../src/ui/theme.c:2590
|
||||
#, c-format
|
||||
msgid "Coordinate expression had an open parenthesis with no close parenthesis"
|
||||
msgstr ""
|
||||
"Wyrażenie opisujące położenie zawiera nawias otwierający bez odpowiadającego "
|
||||
"mu nawiasu zamykającego"
|
||||
|
||||
#: ../src/ui/theme.c:2599
|
||||
#: ../src/ui/theme.c:2601
|
||||
#, c-format
|
||||
msgid "Coordinate expression doesn't seem to have any operators or operands"
|
||||
msgstr ""
|
||||
"Wyrażenie opisujące położenie nie zawiera żadnych operatorów ani operandów"
|
||||
|
||||
#: ../src/ui/theme.c:2812 ../src/ui/theme.c:2832 ../src/ui/theme.c:2852
|
||||
#: ../src/ui/theme.c:2814 ../src/ui/theme.c:2834 ../src/ui/theme.c:2854
|
||||
#, c-format
|
||||
msgid "Theme contained an expression that resulted in an error: %s\n"
|
||||
msgstr "Motyw zawiera wyrażenie, przy którego obliczaniu wystąpił błąd: %s\n"
|
||||
|
||||
#: ../src/ui/theme.c:4498
|
||||
#: ../src/ui/theme.c:4500
|
||||
#, c-format
|
||||
msgid ""
|
||||
"<button function=\"%s\" state=\"%s\" draw_ops=\"whatever\"/> must be "
|
||||
@@ -1194,7 +1210,7 @@ msgstr ""
|
||||
"Przy tym stylu ramki należy podać <button function=\"%s\" state=\"%s\" "
|
||||
"draw_ops=\"cokolwiek\"/>"
|
||||
|
||||
#: ../src/ui/theme.c:5009 ../src/ui/theme.c:5034
|
||||
#: ../src/ui/theme.c:5011 ../src/ui/theme.c:5036
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Missing <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/>"
|
||||
@@ -1221,7 +1237,7 @@ msgstr ""
|
||||
"Przy typie okna \"%s\" w motywie \"%s\" nie ustawiono stylu ramki. Należy "
|
||||
"dodać element <window type=\"%s\" style_set=\"cokolwiek\"/>"
|
||||
|
||||
#: ../src/ui/theme.c:5650 ../src/ui/theme.c:5712 ../src/ui/theme.c:5775
|
||||
#: ../src/ui/theme.c:5661 ../src/ui/theme.c:5723 ../src/ui/theme.c:5786
|
||||
#, c-format
|
||||
msgid ""
|
||||
"User-defined constants must begin with a capital letter; \"%s\" does not"
|
||||
@@ -1229,7 +1245,7 @@ msgstr ""
|
||||
"Stałe definiowane przez użytkownika powinny rozpoczynać się wielką literą, "
|
||||
"natomiast \"%s\" nie spełnia tego warunku"
|
||||
|
||||
#: ../src/ui/theme.c:5658 ../src/ui/theme.c:5720 ../src/ui/theme.c:5783
|
||||
#: ../src/ui/theme.c:5669 ../src/ui/theme.c:5731 ../src/ui/theme.c:5794
|
||||
#, c-format
|
||||
msgid "Constant \"%s\" has already been defined"
|
||||
msgstr "Stała \"%s\" została już określona"
|
||||
@@ -1617,208 +1633,7 @@ msgstr "Wewnątrz elementu <%s> nie jest dopuszczalny tekst"
|
||||
msgid "<%s> specified twice for this theme"
|
||||
msgstr "<%s> określono dwukrotnie dla tego motywu"
|
||||
|
||||
#: ../src/ui/theme-parser.c:4334
|
||||
#: ../src/ui/theme-parser.c:4336
|
||||
#, c-format
|
||||
msgid "Failed to find a valid file for theme %s\n"
|
||||
msgstr "Odnalezienie prawidłowego pliku dla motywu %s się nie powiodło\n"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:99
|
||||
msgid "_Windows"
|
||||
msgstr "_Okna"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:100
|
||||
msgid "_Dialog"
|
||||
msgstr "Okno _dialogowe"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:101
|
||||
msgid "_Modal dialog"
|
||||
msgstr "_Modalne okno dialogowe"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:102
|
||||
msgid "_Utility"
|
||||
msgstr "_Narzędzie"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:103
|
||||
msgid "_Splashscreen"
|
||||
msgstr "_Ekran powitalny"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:104
|
||||
msgid "_Top dock"
|
||||
msgstr "_Górny dok"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:105
|
||||
msgid "_Bottom dock"
|
||||
msgstr "_Dolny dok"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:106
|
||||
msgid "_Left dock"
|
||||
msgstr "_Lewy dok"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:107
|
||||
msgid "_Right dock"
|
||||
msgstr "_Prawy dok"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:108
|
||||
msgid "_All docks"
|
||||
msgstr "_Wszystkie doki"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:109
|
||||
msgid "Des_ktop"
|
||||
msgstr "Pu_lpit"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:115
|
||||
msgid "Open another one of these windows"
|
||||
msgstr "Otwiera kolejne okno tego typu"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:117
|
||||
msgid "This is a demo button with an 'open' icon"
|
||||
msgstr "To jest przycisk demonstracyjny z ikoną \"otwórz\""
|
||||
|
||||
#: ../src/ui/theme-viewer.c:119
|
||||
msgid "This is a demo button with a 'quit' icon"
|
||||
msgstr "To jest przycisk demonstracyjny z ikoną \"zakończ\""
|
||||
|
||||
#: ../src/ui/theme-viewer.c:248
|
||||
msgid "This is a sample message in a sample dialog"
|
||||
msgstr "To jest przykładowy komunikat w prostym oknie dialogowym"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:328
|
||||
#, c-format
|
||||
msgid "Fake menu item %d\n"
|
||||
msgstr "Imitacja elementu menu %d\n"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:363
|
||||
msgid "Border-only window"
|
||||
msgstr "Okno zawierające tylko krawędzie"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:365
|
||||
msgid "Bar"
|
||||
msgstr "Pasek"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:382
|
||||
msgid "Normal Application Window"
|
||||
msgstr "Zwykłe okno programu"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:386
|
||||
msgid "Dialog Box"
|
||||
msgstr "Okno dialogowe"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:390
|
||||
msgid "Modal Dialog Box"
|
||||
msgstr "Modalne okno dialogowe"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:394
|
||||
msgid "Utility Palette"
|
||||
msgstr "Paleta narzędziowa"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:398
|
||||
msgid "Torn-off Menu"
|
||||
msgstr "Menu oderwane"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:402
|
||||
msgid "Border"
|
||||
msgstr "Krawędź"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:406
|
||||
msgid "Attached Modal Dialog"
|
||||
msgstr "Dołączone modalne okno dialogowe"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:739
|
||||
#, c-format
|
||||
msgid "Button layout test %d"
|
||||
msgstr "Test układu przycisków %d"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:768
|
||||
#, c-format
|
||||
msgid "%g milliseconds to draw one window frame"
|
||||
msgstr "%g milisekundy do narysowania jednej ramki okna"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:813
|
||||
#, c-format
|
||||
msgid "Usage: metacity-theme-viewer [THEMENAME]\n"
|
||||
msgstr "Użycie: metacity-theme-viewer [NAZWA_MOTYWU]\n"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:820
|
||||
#, c-format
|
||||
msgid "Error loading theme: %s\n"
|
||||
msgstr "Błąd podczas wczytywania motywu: %s\n"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:826
|
||||
#, c-format
|
||||
msgid "Loaded theme \"%s\" in %g seconds\n"
|
||||
msgstr "Wczytano motyw \"%s\" w ciągu %g sekund\n"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:870
|
||||
msgid "Normal Title Font"
|
||||
msgstr "Zwykła czcionka tytułu"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:876
|
||||
msgid "Small Title Font"
|
||||
msgstr "Mała czcionka tytułu"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:882
|
||||
msgid "Large Title Font"
|
||||
msgstr "Duża czcionka tytułu"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:887
|
||||
msgid "Button Layouts"
|
||||
msgstr "Układy przycisków"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:892
|
||||
msgid "Benchmark"
|
||||
msgstr "Test wydajności"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:949
|
||||
msgid "Window Title Goes Here"
|
||||
msgstr "Tutaj znajduje się tytuł okna"
|
||||
|
||||
# FIXME - bełkot
|
||||
#: ../src/ui/theme-viewer.c:1052
|
||||
#, 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 ""
|
||||
"Narysowano %d ramek w ciągu %g sekund klienta (%g milisekund na ramkę) oraz "
|
||||
"%g sekund rzeczywistych, włączając w to zasoby serwera X (%g milisekund na "
|
||||
"ramkę)\n"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:1271
|
||||
msgid "position expression test returned TRUE but set error"
|
||||
msgstr "Test wyrażenia pozycji zwrócił wartość PRAWDA, lecz ustawił błąd"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:1273
|
||||
msgid "position expression test returned FALSE but didn't set error"
|
||||
msgstr "Test wyrażenia pozycji zwrócił wartość FAŁSZ, lecz nie ustawił błędu"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:1277
|
||||
msgid "Error was expected but none given"
|
||||
msgstr "Oczekiwano błędu, lecz nie otrzymano żadnego"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:1279
|
||||
#, c-format
|
||||
msgid "Error %d was expected but %d given"
|
||||
msgstr "Oczekiwano błędu %d, lecz otrzymano %d"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:1285
|
||||
#, c-format
|
||||
msgid "Error not expected but one was returned: %s"
|
||||
msgstr "Nie oczekiwano błędu, lecz został on zwrócony: %s"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:1289
|
||||
#, c-format
|
||||
msgid "x value was %d, %d was expected"
|
||||
msgstr "Wartością X było %d, oczekiwano wartości %d"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:1292
|
||||
#, c-format
|
||||
msgid "y value was %d, %d was expected"
|
||||
msgstr "Wartością Y było %d, oczekiwano wartości %d"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:1357
|
||||
#, c-format
|
||||
msgid "%d coordinate expressions parsed in %g seconds (%g seconds average)\n"
|
||||
msgstr ""
|
||||
"Wyrażenia współrzędnych %d zostało przetworzone w %g sekund (średnio %g "
|
||||
"sekund)\n"
|
||||
|
804
po/pt_BR.po
804
po/pt_BR.po
File diff suppressed because it is too large
Load Diff
810
po/sr@latin.po
810
po/sr@latin.po
File diff suppressed because it is too large
Load Diff
282
po/ta.po
282
po/ta.po
@@ -7,17 +7,17 @@
|
||||
# Dinesh Nadarajah <n_dinesh@yahoo.com>, 2003.
|
||||
# Jayaradha N <jaya@pune.redhat.com>, 2004.
|
||||
# Felix <ifelix@redhat.com>, 2006.
|
||||
# Dr.T.Vasudevan <agnihot3@gmail.com>, 2007, 2010, 2011, 2012.
|
||||
# Dr.T.Vasudevan <agnihot3@gmail.com>, 2007, 2010, 2011, 2012, 2013.
|
||||
# Dr.T.vasudevan <agnihot3@gmail.com>, 2009.
|
||||
# I. Felix <ifelix@redhat.com>, 2009, 2011.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: metacity.gnome-2-26.ta\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2012-12-02 17:25+0530\n"
|
||||
"PO-Revision-Date: 2012-12-02 18:58+0530\n"
|
||||
"POT-Creation-Date: 2013-03-23 14:03+0530\n"
|
||||
"PO-Revision-Date: 2013-03-23 14:11+0530\n"
|
||||
"Last-Translator: Dr.T.Vasudevan <drtvasudevan@gmail.com>\n"
|
||||
"Language-Team: American English <gnome-tamil-translation@googlegroups.com>\n"
|
||||
"Language-Team: American English <<gnome-tamil-translation@googlegroups.com>>\n"
|
||||
"Language: en_US\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -70,58 +70,62 @@ msgid "Switch applications"
|
||||
msgstr "பயன்பாடுகளுக்கிடையே மாறவும்"
|
||||
|
||||
#: ../src/50-mutter-navigation.xml.in.h:11
|
||||
msgid "Switch windows"
|
||||
msgstr "சாளரத்தை மாற்றுக"
|
||||
|
||||
#: ../src/50-mutter-navigation.xml.in.h:12
|
||||
msgid "Switch windows of an application"
|
||||
msgstr "ஒரு பயன்பாட்டின் சாளரங்களிடையே மாறவும்"
|
||||
|
||||
#: ../src/50-mutter-navigation.xml.in.h:12
|
||||
#: ../src/50-mutter-navigation.xml.in.h:13
|
||||
msgid "Switch system controls"
|
||||
msgstr "கணினி கட்டுப்பாடுகளை மாற்றவும்"
|
||||
|
||||
#: ../src/50-mutter-navigation.xml.in.h:13
|
||||
#: ../src/50-mutter-navigation.xml.in.h:14
|
||||
msgid "Switch windows directly"
|
||||
msgstr "சாளரங்களிடையே உடனடியாக நகரவும்"
|
||||
|
||||
#: ../src/50-mutter-navigation.xml.in.h:14
|
||||
#: ../src/50-mutter-navigation.xml.in.h:15
|
||||
msgid "Switch windows of an app directly"
|
||||
msgstr "ஒரு பயன்பாட்டின் சாளரங்களிடையே நேரடியாக நகரவும்"
|
||||
|
||||
#: ../src/50-mutter-navigation.xml.in.h:15
|
||||
#: ../src/50-mutter-navigation.xml.in.h:16
|
||||
msgid "Switch system controls directly"
|
||||
msgstr "கணினி கட்டுப்பாடுகளை நேரடியாக மாற்றவும்"
|
||||
|
||||
#: ../src/50-mutter-navigation.xml.in.h:16
|
||||
#: ../src/50-mutter-navigation.xml.in.h:17
|
||||
msgid "Hide all normal windows"
|
||||
msgstr "எல்லா வழக்கமான சாளரங்களையும் மறை"
|
||||
|
||||
#: ../src/50-mutter-navigation.xml.in.h:17
|
||||
#: ../src/50-mutter-navigation.xml.in.h:18
|
||||
msgid "Switch to workspace 1"
|
||||
msgstr "பணியிடம் 1க்கு மாறு"
|
||||
|
||||
#: ../src/50-mutter-navigation.xml.in.h:18
|
||||
#: ../src/50-mutter-navigation.xml.in.h:19
|
||||
msgid "Switch to workspace 2"
|
||||
msgstr "பணியிடம் 2 க்கு மாறு"
|
||||
|
||||
#: ../src/50-mutter-navigation.xml.in.h:19
|
||||
#: ../src/50-mutter-navigation.xml.in.h:20
|
||||
msgid "Switch to workspace 3"
|
||||
msgstr "பணியிடம் 3 க்கு மாறு"
|
||||
|
||||
#: ../src/50-mutter-navigation.xml.in.h:20
|
||||
#: ../src/50-mutter-navigation.xml.in.h:21
|
||||
msgid "Switch to workspace 4"
|
||||
msgstr "பணியிடம் 4 க்கு மாறு"
|
||||
|
||||
#: ../src/50-mutter-navigation.xml.in.h:21
|
||||
#: ../src/50-mutter-navigation.xml.in.h:22
|
||||
msgid "Move to workspace left"
|
||||
msgstr "வேலையிடத்தை இடப்பக்கத்திற்கு நகர்த்தவும்"
|
||||
|
||||
#: ../src/50-mutter-navigation.xml.in.h:22
|
||||
#: ../src/50-mutter-navigation.xml.in.h:23
|
||||
msgid "Move to workspace right"
|
||||
msgstr "வேலையிடத்தை வலப்பக்கத்திற்கு நகர்த்தவும்"
|
||||
|
||||
#: ../src/50-mutter-navigation.xml.in.h:23
|
||||
#: ../src/50-mutter-navigation.xml.in.h:24
|
||||
msgid "Move to workspace above"
|
||||
msgstr "வேலையிடத்தை மேல்பக்கத்திற்கு நகர்த்தவும்"
|
||||
|
||||
#: ../src/50-mutter-navigation.xml.in.h:24
|
||||
#: ../src/50-mutter-navigation.xml.in.h:25
|
||||
msgid "Move to workspace below"
|
||||
msgstr "வேலையிடத்தை கீழே நகர்த்தவும் "
|
||||
|
||||
@@ -170,8 +174,8 @@ msgid "Close window"
|
||||
msgstr "சாளரம் மூடவும்"
|
||||
|
||||
#: ../src/50-mutter-windows.xml.in.h:9
|
||||
msgid "Minimize window"
|
||||
msgstr "சாளரத்தை சிறிதாக்கு"
|
||||
msgid "Hide window"
|
||||
msgstr "சாளரத்தை மறை "
|
||||
|
||||
#: ../src/50-mutter-windows.xml.in.h:10
|
||||
msgid "Move window"
|
||||
@@ -217,7 +221,7 @@ msgstr "வலது பக்கத்தில் பிளந்து பா
|
||||
|
||||
#. This probably means that a non-WM compositor like xcompmgr is running;
|
||||
#. * we have no way to get it to exit
|
||||
#: ../src/compositor/compositor.c:492
|
||||
#: ../src/compositor/compositor.c:568
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Another compositing manager is already running on screen %i on display \"%s"
|
||||
@@ -225,7 +229,11 @@ msgid ""
|
||||
msgstr ""
|
||||
" %i திரையில் காட்சி \"%s\" இல் இன்னொரு சாளர மேலாளர் இயங்கிக்கொண்டு இருக்கிறது."
|
||||
|
||||
#: ../src/core/bell.c:320
|
||||
#: ../src/compositor/meta-background.c:1191
|
||||
msgid "background texture could not be created from file"
|
||||
msgstr "கோப்பிலிருந்து பின் புல இழை நய அமைப்பை உருவாக்க முடியவில்லை."
|
||||
|
||||
#: ../src/core/bell.c:322
|
||||
msgid "Bell event"
|
||||
msgstr "மணி நிகழ்ச்சி"
|
||||
|
||||
@@ -260,17 +268,17 @@ msgstr "_காத்திரு"
|
||||
msgid "_Force Quit"
|
||||
msgstr "கட்டாய வெளியேற்றம் (_F)"
|
||||
|
||||
#: ../src/core/display.c:397
|
||||
#: ../src/core/display.c:401
|
||||
#, c-format
|
||||
msgid "Missing %s extension required for compositing"
|
||||
msgstr "நீட்சி %s காணப்படவில்லை பவின் ஆக்கத்துக்கு அது அவசியம்"
|
||||
|
||||
#: ../src/core/display.c:494
|
||||
#: ../src/core/display.c:493
|
||||
#, c-format
|
||||
msgid "Failed to open X Window System display '%s'\n"
|
||||
msgstr "X சாளர காட்சியை திறப்பதில் தோல்வி '%s'\n"
|
||||
|
||||
#: ../src/core/keybindings.c:860
|
||||
#: ../src/core/keybindings.c:935
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Some other program is already using the key %s with modifiers %x as a "
|
||||
@@ -278,36 +286,41 @@ msgid ""
|
||||
msgstr ""
|
||||
"விசை %s ஐ மாற்றி %x ஓடு இணைத்து வேறு நிரல் பயன்படுத்திக்கொண்டிருக்கிறது\n"
|
||||
|
||||
#: ../src/core/main.c:196
|
||||
#: ../src/core/keybindings.c:1135
|
||||
#, c-format
|
||||
msgid "\"%s\" is not a valid accelerator\n"
|
||||
msgstr "\"%s\" செல்லாத முடுக்கி\n"
|
||||
|
||||
#: ../src/core/main.c:197
|
||||
msgid "Disable connection to session manager"
|
||||
msgstr "அமர்வு மேலாளருடன் இருக்கும் இணைப்பை முடக்கு"
|
||||
|
||||
#: ../src/core/main.c:202
|
||||
#: ../src/core/main.c:203
|
||||
msgid "Replace the running window manager"
|
||||
msgstr "இயங்கும் சாளர மேலாளரை மாற்றுக"
|
||||
|
||||
#: ../src/core/main.c:208
|
||||
#: ../src/core/main.c:209
|
||||
msgid "Specify session management ID"
|
||||
msgstr "அமர்வு மேலாண் எண்ணை குறிப்பிடு"
|
||||
|
||||
#: ../src/core/main.c:213
|
||||
#: ../src/core/main.c:214
|
||||
msgid "X Display to use"
|
||||
msgstr "பயன்படுத்த வேண்டிய X காட்சி"
|
||||
|
||||
#: ../src/core/main.c:219
|
||||
#: ../src/core/main.c:220
|
||||
msgid "Initialize session from savefile"
|
||||
msgstr "அமர்வை சேவ்பைல் இலிருந்து துவக்கு "
|
||||
|
||||
#: ../src/core/main.c:225
|
||||
#: ../src/core/main.c:226
|
||||
msgid "Make X calls synchronous"
|
||||
msgstr "எக்ஸ் அழைப்புகளை ஒத்திசை."
|
||||
|
||||
#: ../src/core/main.c:494
|
||||
#: ../src/core/main.c:534
|
||||
#, c-format
|
||||
msgid "Failed to scan themes directory: %s\n"
|
||||
msgstr "கருப்பொருள் அடைவை வருடுவதில் தோல்வி: %s\n"
|
||||
|
||||
#: ../src/core/main.c:510
|
||||
#: ../src/core/main.c:550
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Could not find a theme! Be sure %s exists and contains the usual themes.\n"
|
||||
@@ -341,7 +354,7 @@ msgstr "அச்சு பதிப்பு"
|
||||
msgid "Mutter plugin to use"
|
||||
msgstr "பயன்படுத்த க்ளட்டர் செருகிகள்"
|
||||
|
||||
#: ../src/core/prefs.c:1079
|
||||
#: ../src/core/prefs.c:1095
|
||||
msgid ""
|
||||
"Workarounds for broken applications disabled. Some applications may not "
|
||||
"behave properly.\n"
|
||||
@@ -349,14 +362,14 @@ msgstr ""
|
||||
"உடைந்த பயன்பாடுகளின் செயல்பாடு தடைசெய்யப்பட்டது, சில பயன்பாடுகள் சரியாக வேலை "
|
||||
"செய்யாது.\n"
|
||||
|
||||
#: ../src/core/prefs.c:1154
|
||||
#: ../src/core/prefs.c:1170
|
||||
#, c-format
|
||||
msgid "Could not parse font description \"%s\" from GSettings key %s\n"
|
||||
msgstr ""
|
||||
"எழுத்துரு விளக்கம் \"%s\" ஐ ஜிசெட்டிங்க்ஸ் விசையிலிருந்து பகுக்க முடியவில்லை %"
|
||||
"s\n"
|
||||
|
||||
#: ../src/core/prefs.c:1220
|
||||
#: ../src/core/prefs.c:1236
|
||||
#, c-format
|
||||
msgid ""
|
||||
"\"%s\" found in configuration database is not a valid value for mouse button "
|
||||
@@ -364,24 +377,24 @@ msgid ""
|
||||
msgstr ""
|
||||
"அமைப்பு பாங்கில் உள்ள \"%s\" சுட்டி பட்டன் மாற்றியில் செல்லாத மதிப்பு\n"
|
||||
|
||||
#: ../src/core/prefs.c:1757
|
||||
#: ../src/core/prefs.c:1788
|
||||
#, c-format
|
||||
msgid ""
|
||||
"\"%s\" found in configuration database is not a valid value for keybinding "
|
||||
"\"%s\"\n"
|
||||
msgstr "\"%s\" அமைப்பு தரவுத்தளத்தில் உள்ள மதிப்பு செல்லாத கீபைன்டிங்\"%s\"\n"
|
||||
|
||||
#: ../src/core/prefs.c:1854
|
||||
#: ../src/core/prefs.c:1887
|
||||
#, c-format
|
||||
msgid "Workspace %d"
|
||||
msgstr "வேலையிடம் %d"
|
||||
|
||||
#: ../src/core/screen.c:652
|
||||
#: ../src/core/screen.c:691
|
||||
#, c-format
|
||||
msgid "Screen %d on display '%s' is invalid\n"
|
||||
msgstr "திரை %d காட்சி '%s' இல் செல்லாது\n"
|
||||
|
||||
#: ../src/core/screen.c:668
|
||||
#: ../src/core/screen.c:707
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Screen %d on display \"%s\" already has a window manager; try using the --"
|
||||
@@ -390,18 +403,18 @@ msgstr ""
|
||||
"திரை %d காட்சி \"%s\" க்கு சாளர மேலாளர் உள்ளது; --replace தேர்வை பயன்படுத்தி "
|
||||
"தற்போதைய சாளரத்தை மாற்றவும்.\n"
|
||||
|
||||
#: ../src/core/screen.c:695
|
||||
#: ../src/core/screen.c:734
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Could not acquire window manager selection on screen %d display \"%s\"\n"
|
||||
msgstr "திரையில் சாளர மேலாளர் தேர்வை பெறமுடியவில்லை %d காட்சி \"%s\"\n"
|
||||
|
||||
#: ../src/core/screen.c:750
|
||||
#: ../src/core/screen.c:812
|
||||
#, c-format
|
||||
msgid "Screen %d on display \"%s\" already has a window manager\n"
|
||||
msgstr "திரை %d யின் காட்சி \"%s\" க்கு சாளர மேலாளர் ஏற்கெனவே உள்ளது\n"
|
||||
|
||||
#: ../src/core/screen.c:935
|
||||
#: ../src/core/screen.c:998
|
||||
#, c-format
|
||||
msgid "Could not release screen %d on display \"%s\"\n"
|
||||
msgstr "திரை %d ஐ விடுவிக்க முடியவில்லை \"%s\"\n"
|
||||
@@ -462,44 +475,44 @@ msgstr ""
|
||||
" "தற்போதைய அமைப்பை சேமி" செயலுக்கு ஆதரவு இல்லை மேலும் அடுத்த முறை "
|
||||
"உள்நுழையும் போது நீங்களாக துவக்க வேண்டும்"
|
||||
|
||||
#: ../src/core/util.c:80
|
||||
#: ../src/core/util.c:84
|
||||
#, c-format
|
||||
msgid "Failed to open debug log: %s\n"
|
||||
msgstr "பிழைதிருத்த பட்டியலை திறப்பதில் தோல்வி: %s\n"
|
||||
|
||||
#: ../src/core/util.c:90
|
||||
#: ../src/core/util.c:94
|
||||
#, c-format
|
||||
msgid "Failed to fdopen() log file %s: %s\n"
|
||||
msgstr "fdopen() பதிவுக்கோப்பு தோல்வி %s: %s\n"
|
||||
|
||||
#: ../src/core/util.c:96
|
||||
#: ../src/core/util.c:100
|
||||
#, c-format
|
||||
msgid "Opened log file %s\n"
|
||||
msgstr "பதிவுக்கோப்பு திறக்கப்பட்டது %s\n"
|
||||
|
||||
#: ../src/core/util.c:115 ../src/tools/mutter-message.c:149
|
||||
#: ../src/core/util.c:119 ../src/tools/mutter-message.c:149
|
||||
#, c-format
|
||||
msgid "Mutter was compiled without support for verbose mode\n"
|
||||
msgstr "வெர்போஸ் ஆதரவு இல்லாமல் மட்டர் அமைக்கப்பட்டது\n"
|
||||
|
||||
#: ../src/core/util.c:259
|
||||
#: ../src/core/util.c:264
|
||||
msgid "Window manager: "
|
||||
msgstr "சாளர மேலாளர்:"
|
||||
|
||||
#: ../src/core/util.c:407
|
||||
#: ../src/core/util.c:412
|
||||
msgid "Bug in window manager: "
|
||||
msgstr "சாளர மேலாளரில் பிழை"
|
||||
|
||||
#: ../src/core/util.c:438
|
||||
#: ../src/core/util.c:443
|
||||
msgid "Window manager warning: "
|
||||
msgstr "சாளர மேலாளர் எச்சரிக்கை:"
|
||||
|
||||
#: ../src/core/util.c:466
|
||||
#: ../src/core/util.c:471
|
||||
msgid "Window manager error: "
|
||||
msgstr "சாளர மேலாளர் பிழை"
|
||||
|
||||
#. first time through
|
||||
#: ../src/core/window.c:7240
|
||||
#: ../src/core/window.c:7596
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER "
|
||||
@@ -516,7 +529,7 @@ msgstr ""
|
||||
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
|
||||
#. * about these apps but make them work.
|
||||
#.
|
||||
#: ../src/core/window.c:7905
|
||||
#: ../src/core/window.c:8320
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Window %s sets an MWM hint indicating it isn't resizable, but sets min size "
|
||||
@@ -526,22 +539,22 @@ msgstr ""
|
||||
"அதிக "
|
||||
"பட்ச அளவு %d x %d; பொருள் தரும்படி இல்லை.\n"
|
||||
|
||||
#: ../src/core/window-props.c:274
|
||||
#: ../src/core/window-props.c:318
|
||||
#, c-format
|
||||
msgid "Application set a bogus _NET_WM_PID %lu\n"
|
||||
msgstr "பயன்பாடு பொய்யான ஒரு _NET_WM_PID %lu ஐ அமைத்தது\n"
|
||||
|
||||
#: ../src/core/window-props.c:393
|
||||
#: ../src/core/window-props.c:434
|
||||
#, c-format
|
||||
msgid "%s (on %s)"
|
||||
msgstr "%s (%s மீது)"
|
||||
|
||||
#: ../src/core/window-props.c:1448
|
||||
#: ../src/core/window-props.c:1517
|
||||
#, c-format
|
||||
msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
|
||||
msgstr "செல்லாத WM_TRANSIENT_FOR சாளரம் 0x%lx இதற்கு குறிக்கப்பட்டது: %s.\n"
|
||||
|
||||
#: ../src/core/window-props.c:1459
|
||||
#: ../src/core/window-props.c:1528
|
||||
#, c-format
|
||||
msgid "WM_TRANSIENT_FOR window 0x%lx for %s would create loop.\n"
|
||||
msgstr "WM_TRANSIENT_FOR சாளரம் 0x%lx %s க்கு சுழல் நிகழ்வை உருவாக்கும்.\n"
|
||||
@@ -693,10 +706,22 @@ msgstr ""
|
||||
"இந்த மதிப்பை அடைய மறை விளிம்பு சேர்க்கப்படும்."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:17
|
||||
msgid "Auto maximize nearly monitor sized windows"
|
||||
msgstr "ஏறத்தாழ திரை அளவுள்ள சாளரங்களை தானியங்கியாக அதிக பட்ச அளவாக்கு"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:18
|
||||
msgid ""
|
||||
"If enabled, new windows that are initially the size of the monitor "
|
||||
"automatically get maximized."
|
||||
msgstr ""
|
||||
"செயலாக்கினால், துவக்கத்தில் ஏறத்தாழ திரை அளவுள்ள புதிய சாளரங்கள் தானியங்கியாக "
|
||||
"அதிக பட்ச அளவாக்கப்படும்"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:19
|
||||
msgid "Select window from tab popup"
|
||||
msgstr "கீற்றுத்துள்ளலிருந்து சாளரத்தை தேர்ந்தெடுக்கவும்."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:18
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:20
|
||||
msgid "Cancel tab popup"
|
||||
msgstr "கீற்று துள்ளுவதை இரத்து செய்"
|
||||
|
||||
@@ -899,53 +924,53 @@ msgstr "Mod5"
|
||||
#. Translators: This represents the size of a window. The first number is
|
||||
#. * the width of the window and the second is the height.
|
||||
#.
|
||||
#: ../src/ui/resizepopup.c:113
|
||||
#: ../src/ui/resizepopup.c:136
|
||||
#, c-format
|
||||
msgid "%d x %d"
|
||||
msgstr "%d x %d"
|
||||
|
||||
#: ../src/ui/theme.c:234
|
||||
#: ../src/ui/theme.c:236
|
||||
msgid "top"
|
||||
msgstr "மேல்"
|
||||
|
||||
#: ../src/ui/theme.c:236
|
||||
#: ../src/ui/theme.c:238
|
||||
msgid "bottom"
|
||||
msgstr "கீழ்"
|
||||
|
||||
#: ../src/ui/theme.c:238
|
||||
#: ../src/ui/theme.c:240
|
||||
msgid "left"
|
||||
msgstr "இடது"
|
||||
|
||||
#: ../src/ui/theme.c:240
|
||||
#: ../src/ui/theme.c:242
|
||||
msgid "right"
|
||||
msgstr "வலது"
|
||||
|
||||
#: ../src/ui/theme.c:268
|
||||
#: ../src/ui/theme.c:270
|
||||
#, c-format
|
||||
msgid "frame geometry does not specify \"%s\" dimension"
|
||||
msgstr "சட்ட வடிவியல் \"%s\" அளவை குறிப்பிடவில்லை"
|
||||
|
||||
#: ../src/ui/theme.c:287
|
||||
#: ../src/ui/theme.c:289
|
||||
#, c-format
|
||||
msgid "frame geometry does not specify dimension \"%s\" for border \"%s\""
|
||||
msgstr "\"%s\" ஓரத்திற்கு வடிவியல் \"%s\" அளவை குறிப்பிடவில்லை"
|
||||
|
||||
#: ../src/ui/theme.c:324
|
||||
#: ../src/ui/theme.c:326
|
||||
#, c-format
|
||||
msgid "Button aspect ratio %g is not reasonable"
|
||||
msgstr "பட்டன் அளவு விகிதம் %g சரியில்ல"
|
||||
|
||||
#: ../src/ui/theme.c:336
|
||||
#: ../src/ui/theme.c:338
|
||||
#, c-format
|
||||
msgid "Frame geometry does not specify size of buttons"
|
||||
msgstr "சட்ட அளவு பட்டன் அளவை குறிப்பிடவில்லை"
|
||||
|
||||
#: ../src/ui/theme.c:1049
|
||||
#: ../src/ui/theme.c:1051
|
||||
#, c-format
|
||||
msgid "Gradients should have at least two colors"
|
||||
msgstr "க்ரேடியன்டில் இரண்டு நிறங்களாவது இருக்க வேண்டும்"
|
||||
|
||||
#: ../src/ui/theme.c:1201
|
||||
#: ../src/ui/theme.c:1203
|
||||
#, c-format
|
||||
msgid ""
|
||||
"GTK custom color specification must have color name and fallback in "
|
||||
@@ -955,7 +980,7 @@ msgstr ""
|
||||
"அடைப்புக்குறிகளுக்குள்ளும் "
|
||||
"கொண்டிருக்க வேண்டும் உம் gtk:custom(foo,bar); \"%s\" ஐ பகுக்க முடியவில்லை"
|
||||
|
||||
#: ../src/ui/theme.c:1217
|
||||
#: ../src/ui/theme.c:1219
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Invalid character '%c' in color_name parameter of gtk:custom, only A-Za-z0-9-"
|
||||
@@ -965,7 +990,7 @@ msgstr ""
|
||||
"A-Za-z0-9-"
|
||||
"_ ஆகியன மட்டுமே செல்லுபடியாகும்."
|
||||
|
||||
#: ../src/ui/theme.c:1231
|
||||
#: ../src/ui/theme.c:1233
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Gtk:custom format is \"gtk:custom(color_name,fallback)\", \"%s\" does not "
|
||||
@@ -974,7 +999,7 @@ msgstr ""
|
||||
"ஜிடிகே:தனிப்பயன் ஒழுங்கு \"gtk:custom(color_name,fallback)\", \"%s\" இந்த "
|
||||
"ஒழுங்குக்கு பொருந்தாது"
|
||||
|
||||
#: ../src/ui/theme.c:1276
|
||||
#: ../src/ui/theme.c:1278
|
||||
#, c-format
|
||||
msgid ""
|
||||
"GTK color specification must have the state in brackets, e.g. gtk:fg[NORMAL] "
|
||||
@@ -984,7 +1009,7 @@ msgstr ""
|
||||
"நிலையை "
|
||||
"குறிக்கும் பகுக்க முடியாது \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:1290
|
||||
#: ../src/ui/theme.c:1292
|
||||
#, c-format
|
||||
msgid ""
|
||||
"GTK color specification must have a close bracket after the state, e.g. gtk:"
|
||||
@@ -994,17 +1019,17 @@ msgstr ""
|
||||
"NORMAL "
|
||||
"நிலையை குறிக்கும் பகுக்க முடியாது \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:1301
|
||||
#: ../src/ui/theme.c:1303
|
||||
#, c-format
|
||||
msgid "Did not understand state \"%s\" in color specification"
|
||||
msgstr "நிலை \"%s\" வண்ண குறிப்பில் புரிந்துகொள்ள முடியவில்லை"
|
||||
|
||||
#: ../src/ui/theme.c:1314
|
||||
#: ../src/ui/theme.c:1316
|
||||
#, c-format
|
||||
msgid "Did not understand color component \"%s\" in color specification"
|
||||
msgstr "நிலை \"%s\" வண்ண குறிப்பு பொருளில் புரிந்துகொள்ள முடியவில்லை"
|
||||
|
||||
#: ../src/ui/theme.c:1343
|
||||
#: ../src/ui/theme.c:1345
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Blend format is \"blend/bg_color/fg_color/alpha\", \"%s\" does not fit the "
|
||||
@@ -1013,18 +1038,18 @@ msgstr ""
|
||||
"வளைந்த அமைப்பு \"blend/bg_color/fg_color/alpha\", \"%s\" இந்த வடிவமைப்பிற்கு "
|
||||
"பொருந்தாது"
|
||||
|
||||
#: ../src/ui/theme.c:1354
|
||||
#: ../src/ui/theme.c:1356
|
||||
#, c-format
|
||||
msgid "Could not parse alpha value \"%s\" in blended color"
|
||||
msgstr "ஆம்ஃபா மதிப்பை \"%s\" வளைந்த நிறத்தில் பகுக்க முடியவில்லை"
|
||||
|
||||
#: ../src/ui/theme.c:1364
|
||||
#: ../src/ui/theme.c:1366
|
||||
#, c-format
|
||||
msgid "Alpha value \"%s\" in blended color is not between 0.0 and 1.0"
|
||||
msgstr ""
|
||||
"ஆல்ஃபா மதுப்பு \"%s\"வளைவு நிறத்தில் 0.0 க்கும் 1.0 க்கும் இடையில் இல்லை"
|
||||
|
||||
#: ../src/ui/theme.c:1411
|
||||
#: ../src/ui/theme.c:1413
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Shade format is \"shade/base_color/factor\", \"%s\" does not fit the format"
|
||||
@@ -1032,39 +1057,39 @@ msgstr ""
|
||||
"நிழல் வடிவமைப்பு \"shade/base_color/factor\", \"%s\" இந்த அமைப்பிற்கு "
|
||||
"பொருந்தாது"
|
||||
|
||||
#: ../src/ui/theme.c:1422
|
||||
#: ../src/ui/theme.c:1424
|
||||
#, c-format
|
||||
msgid "Could not parse shade factor \"%s\" in shaded color"
|
||||
msgstr "நிழல்விகிதத்தை \"%s\" நிறத்தோடு பகுக்க முடியாது"
|
||||
|
||||
#: ../src/ui/theme.c:1432
|
||||
#: ../src/ui/theme.c:1434
|
||||
#, c-format
|
||||
msgid "Shade factor \"%s\" in shaded color is negative"
|
||||
msgstr "நிழல் விகிதம் \"%s\" முழுக்களாக உள்ளது "
|
||||
|
||||
#: ../src/ui/theme.c:1461
|
||||
#: ../src/ui/theme.c:1463
|
||||
#, c-format
|
||||
msgid "Could not parse color \"%s\""
|
||||
msgstr "\"%s\" நிறத்தை பகுக்க முடியவில்லை"
|
||||
|
||||
#: ../src/ui/theme.c:1778
|
||||
#: ../src/ui/theme.c:1780
|
||||
#, c-format
|
||||
msgid "Coordinate expression contains character '%s' which is not allowed"
|
||||
msgstr "அச்சுக்கள் எழுத்தால் குறிக்கப்பட்டுள்ளது '%s' க்கு அனுமதி இல்லை"
|
||||
|
||||
#: ../src/ui/theme.c:1805
|
||||
#: ../src/ui/theme.c:1807
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression contains floating point number '%s' which could not be "
|
||||
"parsed"
|
||||
msgstr "அச்சுக்கள் பின்ன எண்ணால் குறிக்கப்பட்டுள்ளது '%s' ஐ பகுக்க முடியாது"
|
||||
|
||||
#: ../src/ui/theme.c:1819
|
||||
#: ../src/ui/theme.c:1821
|
||||
#, c-format
|
||||
msgid "Coordinate expression contains integer '%s' which could not be parsed"
|
||||
msgstr "அச்சுக்கள் இயல் எண்ணால் குறிக்கப்பட்டுள்ளது '%s' ஐ பகுக்க முடியாது"
|
||||
|
||||
#: ../src/ui/theme.c:1940
|
||||
#: ../src/ui/theme.c:1942
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression contained unknown operator at the start of this text: "
|
||||
@@ -1072,41 +1097,41 @@ msgid ""
|
||||
msgstr ""
|
||||
"உரையின் துவக்கத்தில் அச்சின் கூற்றில் தெரியாத செயல் இடம்பெற்றுள்ளது \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:1997
|
||||
#: ../src/ui/theme.c:1999
|
||||
#, c-format
|
||||
msgid "Coordinate expression was empty or not understood"
|
||||
msgstr "அச்சு கூற்று காலியாக உள்ளது அல்லது புரியவில்லை"
|
||||
|
||||
#: ../src/ui/theme.c:2110 ../src/ui/theme.c:2120 ../src/ui/theme.c:2154
|
||||
#: ../src/ui/theme.c:2112 ../src/ui/theme.c:2122 ../src/ui/theme.c:2156
|
||||
#, c-format
|
||||
msgid "Coordinate expression results in division by zero"
|
||||
msgstr "அச்சு கூற்று பூஜ்ஜியத்தால் வகுத்தல் பிழையை தந்தது"
|
||||
|
||||
#: ../src/ui/theme.c:2162
|
||||
#: ../src/ui/theme.c:2164
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression tries to use mod operator on a floating-point number"
|
||||
msgstr "அச்சு கூற்று mod ஆப்பரேட்டரை பின்ன எண்ணில் பயன்படுத்த முயல்கிறது"
|
||||
|
||||
#: ../src/ui/theme.c:2218
|
||||
#: ../src/ui/theme.c:2220
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression has an operator \"%s\" where an operand was expected"
|
||||
msgstr ""
|
||||
"அச்சு கூற்றில் ஆப்பரேட்டர் உள்ளது \"%s\" ஆப்பரன் எதிர்பார்க்கப்படுகிறது"
|
||||
|
||||
#: ../src/ui/theme.c:2227
|
||||
#: ../src/ui/theme.c:2229
|
||||
#, c-format
|
||||
msgid "Coordinate expression had an operand where an operator was expected"
|
||||
msgstr ""
|
||||
"அச்சு கூற்றில் ஆப்பரன்ட் உள்ளது ஆனால் ஆப்பரேட்டர் எதிர்பார்க்கப்படுகிறது"
|
||||
|
||||
#: ../src/ui/theme.c:2235
|
||||
#: ../src/ui/theme.c:2237
|
||||
#, c-format
|
||||
msgid "Coordinate expression ended with an operator instead of an operand"
|
||||
msgstr "அச்சு கூற்றில் ஆப்பரன்ட்டுக்கு பதில் ஆப்பரேட்டரால் முடிந்தது"
|
||||
|
||||
#: ../src/ui/theme.c:2245
|
||||
#: ../src/ui/theme.c:2247
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression has operator \"%c\" following operator \"%c\" with no "
|
||||
@@ -1115,39 +1140,39 @@ msgstr ""
|
||||
"அச்சு கூற்றில் \"%c\" ஆப்பரேட்டர் உள்ளது \"%c\" ஆப்பரேட்டருக்கு ஆப்பரன்ட் "
|
||||
"இல்லை"
|
||||
|
||||
#: ../src/ui/theme.c:2396 ../src/ui/theme.c:2441
|
||||
#: ../src/ui/theme.c:2398 ../src/ui/theme.c:2443
|
||||
#, c-format
|
||||
msgid "Coordinate expression had unknown variable or constant \"%s\""
|
||||
msgstr "அச்சு கூற்றில் செல்லாத மாற்றி மற்றும் கான்ஸ்ட்டன் உள்ளது \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:2495
|
||||
#: ../src/ui/theme.c:2497
|
||||
#, c-format
|
||||
msgid "Coordinate expression parser overflowed its buffer."
|
||||
msgstr "ஆயத்தொலைவு தெரிவிப்பு பகுப்பி அதன் இடையகத்தை நிரப்பியது"
|
||||
|
||||
#: ../src/ui/theme.c:2524
|
||||
#: ../src/ui/theme.c:2526
|
||||
#, c-format
|
||||
msgid "Coordinate expression had a close parenthesis with no open parenthesis"
|
||||
msgstr ""
|
||||
"அச்சு கூற்றில் மூடிய அடைப்புக்குறி உள்ளது ஆனால் திறந்த அடைப்புகுறி இல்லை"
|
||||
|
||||
#: ../src/ui/theme.c:2588
|
||||
#: ../src/ui/theme.c:2590
|
||||
#, c-format
|
||||
msgid "Coordinate expression had an open parenthesis with no close parenthesis"
|
||||
msgstr ""
|
||||
"அச்சு கூற்றில் திறந்த அடைப்புக்குறி உள்ளது ஆனால் மூடிய அடைப்புகுறி இல்லை"
|
||||
|
||||
#: ../src/ui/theme.c:2599
|
||||
#: ../src/ui/theme.c:2601
|
||||
#, c-format
|
||||
msgid "Coordinate expression doesn't seem to have any operators or operands"
|
||||
msgstr "அச்சுக்கூற்றில் ஆப்பரன்ட் மற்றும் ஆப்பரேட்டர் காணப்படவில்லை"
|
||||
|
||||
#: ../src/ui/theme.c:2812 ../src/ui/theme.c:2832 ../src/ui/theme.c:2852
|
||||
#: ../src/ui/theme.c:2814 ../src/ui/theme.c:2834 ../src/ui/theme.c:2854
|
||||
#, c-format
|
||||
msgid "Theme contained an expression that resulted in an error: %s\n"
|
||||
msgstr "கருப்பொருளில் ஒரு கூற்று இருந்தது. அது பிழையை ஏற்படுத்தியது : %s\n"
|
||||
|
||||
#: ../src/ui/theme.c:4498
|
||||
#: ../src/ui/theme.c:4500
|
||||
#, c-format
|
||||
msgid ""
|
||||
"<button function=\"%s\" state=\"%s\" draw_ops=\"whatever\"/> must be "
|
||||
@@ -1157,25 +1182,25 @@ msgstr ""
|
||||
"பாணிக்கு "
|
||||
"குறிப்பிடப்பட வேண்டும்"
|
||||
|
||||
#: ../src/ui/theme.c:5009 ../src/ui/theme.c:5034
|
||||
#: ../src/ui/theme.c:5011 ../src/ui/theme.c:5036
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Missing <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/>"
|
||||
msgstr ""
|
||||
"காணவில்லை <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/>"
|
||||
|
||||
#: ../src/ui/theme.c:5082
|
||||
#: ../src/ui/theme.c:5084
|
||||
#, c-format
|
||||
msgid "Failed to load theme \"%s\": %s\n"
|
||||
msgstr "கருப்பொருளை ஏற்றுவதில் தோல்வி \"%s\": %s\n"
|
||||
|
||||
#: ../src/ui/theme.c:5218 ../src/ui/theme.c:5225 ../src/ui/theme.c:5232
|
||||
#: ../src/ui/theme.c:5239 ../src/ui/theme.c:5246
|
||||
#: ../src/ui/theme.c:5220 ../src/ui/theme.c:5227 ../src/ui/theme.c:5234
|
||||
#: ../src/ui/theme.c:5241 ../src/ui/theme.c:5248
|
||||
#, c-format
|
||||
msgid "No <%s> set for theme \"%s\""
|
||||
msgstr "இல்லை<%s> கருப்பொருளுக்காக அமைக்கப்பட்டது \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:5254
|
||||
#: ../src/ui/theme.c:5256
|
||||
#, c-format
|
||||
msgid ""
|
||||
"No frame style set for window type \"%s\" in theme \"%s\", add a <window "
|
||||
@@ -1184,7 +1209,7 @@ msgstr ""
|
||||
"சட்ட பாணி சாளர வகை இல்லை\"%s\" கருப்பொருளில் \"%s\", <window type=\"%s\" "
|
||||
"style_set=\"whatever\"/> உறுப்பை சேர்க்கவும்"
|
||||
|
||||
#: ../src/ui/theme.c:5650 ../src/ui/theme.c:5712 ../src/ui/theme.c:5775
|
||||
#: ../src/ui/theme.c:5663 ../src/ui/theme.c:5725 ../src/ui/theme.c:5788
|
||||
#, c-format
|
||||
msgid ""
|
||||
"User-defined constants must begin with a capital letter; \"%s\" does not"
|
||||
@@ -1192,7 +1217,7 @@ msgstr ""
|
||||
"பயனீட்டாளர்-குறிப்பிட்ட கான்ஸ்டன் பெரிய எழுத்தில் துவங்க வேண்டும்; \"%s\" "
|
||||
"இல்லை"
|
||||
|
||||
#: ../src/ui/theme.c:5658 ../src/ui/theme.c:5720 ../src/ui/theme.c:5783
|
||||
#: ../src/ui/theme.c:5671 ../src/ui/theme.c:5733 ../src/ui/theme.c:5796
|
||||
#, c-format
|
||||
msgid "Constant \"%s\" has already been defined"
|
||||
msgstr "கான்ஸ்டன் \"%s\" ஏற்கெனவே குறிப்பிடப்பட்டது"
|
||||
@@ -1575,7 +1600,7 @@ msgstr "உறுப்பிற்குள் உரை அனுமதி இ
|
||||
msgid "<%s> specified twice for this theme"
|
||||
msgstr "<%s> இந்த கருப்பொருளுக்கு இரண்டுமுறை குறிப்பிட்டுள்ளது"
|
||||
|
||||
#: ../src/ui/theme-parser.c:4334
|
||||
#: ../src/ui/theme-parser.c:4336
|
||||
#, c-format
|
||||
msgid "Failed to find a valid file for theme %s\n"
|
||||
msgstr "%s கருத்துக்கு செல்லுபடியாகும் கோப்பு கண்டுபிடித்தல் தோல்வியுற்றது \n"
|
||||
@@ -1681,56 +1706,56 @@ msgstr "ஓரம்"
|
||||
msgid "Attached Modal Dialog"
|
||||
msgstr "இணைத்த மாதிரி உரையாடல்"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:739
|
||||
#: ../src/ui/theme-viewer.c:737
|
||||
#, c-format
|
||||
msgid "Button layout test %d"
|
||||
msgstr "பட்டன் உருவரை சோதனை %d"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:768
|
||||
#: ../src/ui/theme-viewer.c:766
|
||||
#, c-format
|
||||
msgid "%g milliseconds to draw one window frame"
|
||||
msgstr "%g சாளரத்தை வரைய மில்லிசெக்கண்டு"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:813
|
||||
#: ../src/ui/theme-viewer.c:811
|
||||
#, c-format
|
||||
msgid "Usage: metacity-theme-viewer [THEMENAME]\n"
|
||||
msgstr "பயன்பாடு: metacity-theme-viewer [THEMENAME]\n"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:820
|
||||
#: ../src/ui/theme-viewer.c:818
|
||||
#, c-format
|
||||
msgid "Error loading theme: %s\n"
|
||||
msgstr "கருப்பொருளை ஏற்றுவதில் பிழை: %s\n"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:826
|
||||
#: ../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:870
|
||||
#: ../src/ui/theme-viewer.c:869
|
||||
msgid "Normal Title Font"
|
||||
msgstr "இயல்பான தலைப்பு எழுத்துரு"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:876
|
||||
#: ../src/ui/theme-viewer.c:875
|
||||
msgid "Small Title Font"
|
||||
msgstr "சிறிய தலைப்பு எழுத்துரு"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:882
|
||||
#: ../src/ui/theme-viewer.c:881
|
||||
msgid "Large Title Font"
|
||||
msgstr "பெரிய தலைப்பு எழுத்துரு"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:887
|
||||
#: ../src/ui/theme-viewer.c:886
|
||||
msgid "Button Layouts"
|
||||
msgstr "பட்டன் உருவரை"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:892
|
||||
#: ../src/ui/theme-viewer.c:891
|
||||
msgid "Benchmark"
|
||||
msgstr "நிர்ணயம்"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:944
|
||||
#: ../src/ui/theme-viewer.c:947
|
||||
msgid "Window Title Goes Here"
|
||||
msgstr "சாளர தலைப்பு இங்கே"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:1047
|
||||
#: ../src/ui/theme-viewer.c:1053
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Drew %d frames in %g client-side seconds (%g milliseconds per frame) and %g "
|
||||
@@ -1741,43 +1766,46 @@ msgstr ""
|
||||
"சேவகனின் "
|
||||
"மூலத்தில் (%g மில்லி செகண்ட் சட்டத்திற்கு)\n"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:1266
|
||||
#: ../src/ui/theme-viewer.c:1273
|
||||
msgid "position expression test returned TRUE but set error"
|
||||
msgstr "நிலை கூற்று சோதனை உண்மையை தந்தது ஆனால் பிழை"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:1268
|
||||
#: ../src/ui/theme-viewer.c:1275
|
||||
msgid "position expression test returned FALSE but didn't set error"
|
||||
msgstr "நிலை கூற்று சோதனை பொய்யை தந்தது ஆனால் பிழை"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:1272
|
||||
#: ../src/ui/theme-viewer.c:1279
|
||||
msgid "Error was expected but none given"
|
||||
msgstr "பிழை எதிர்பார்க்கப்பட்டடு ஆனால் தரப்படவில்லை"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:1274
|
||||
#: ../src/ui/theme-viewer.c:1281
|
||||
#, c-format
|
||||
msgid "Error %d was expected but %d given"
|
||||
msgstr "பிழை %d எதிர்பார்க்கப்பட்டது %d தரப்படவில்லை"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:1280
|
||||
#: ../src/ui/theme-viewer.c:1287
|
||||
#, c-format
|
||||
msgid "Error not expected but one was returned: %s"
|
||||
msgstr "பிழை எதிர்பார்க்கப்பட்டடு ஆனால் தரப்படவில்லை: %s"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:1284
|
||||
#: ../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:1287
|
||||
#: ../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:1352
|
||||
#: ../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"
|
||||
|
||||
#~ msgid "Minimize window"
|
||||
#~ msgstr "சாளரத்தை சிறிதாக்கு"
|
||||
|
||||
#~ msgid "Comma-separated list of compositor plugins"
|
||||
#~ msgstr "பல்வினையாக்கியின் சொருகிகளின் கமாவால் பிரித்த பட்டியல்."
|
||||
|
||||
|
1094
po/zh_HK.po
1094
po/zh_HK.po
File diff suppressed because it is too large
Load Diff
1096
po/zh_TW.po
1096
po/zh_TW.po
File diff suppressed because it is too large
Load Diff
@@ -3,9 +3,12 @@
|
||||
|
||||
lib_LTLIBRARIES = libmutter.la
|
||||
|
||||
SUBDIRS=wm-tester tools compositor/plugins
|
||||
SUBDIRS=compositor/plugins
|
||||
|
||||
INCLUDES= \
|
||||
-DCLUTTER_ENABLE_EXPERIMENTAL_API \
|
||||
-DCOGL_ENABLE_EXPERIMENTAL_API \
|
||||
-DCOGL_ENABLE_EXPERIMENTAL_2_0_API \
|
||||
$(MUTTER_CFLAGS) \
|
||||
-I$(srcdir) \
|
||||
-I$(srcdir)/core \
|
||||
@@ -27,23 +30,32 @@ INCLUDES= \
|
||||
-DGETTEXT_PACKAGE=\"$(GETTEXT_PACKAGE)\"
|
||||
|
||||
mutter_built_sources = \
|
||||
mutter-enum-types.h \
|
||||
$(dbus_idle_built_sources) \
|
||||
$(dbus_xrandr_built_sources) \
|
||||
mutter-enum-types.h \
|
||||
mutter-enum-types.c
|
||||
|
||||
libmutter_la_SOURCES = \
|
||||
core/async-getprop.c \
|
||||
core/async-getprop.h \
|
||||
core/barrier.c \
|
||||
meta/barrier.h \
|
||||
core/bell.c \
|
||||
core/bell.h \
|
||||
core/boxes.c \
|
||||
core/boxes-private.h \
|
||||
meta/boxes.h \
|
||||
compositor/clutter-utils.c \
|
||||
compositor/clutter-utils.h \
|
||||
compositor/cogl-utils.c \
|
||||
compositor/cogl-utils.h \
|
||||
compositor/compositor.c \
|
||||
compositor/compositor-private.h \
|
||||
compositor/meta-background.c \
|
||||
compositor/meta-background-actor.c \
|
||||
compositor/meta-background-actor-private.h \
|
||||
compositor/meta-background-group.c \
|
||||
compositor/meta-background-group-private.h \
|
||||
compositor/meta-module.c \
|
||||
compositor/meta-module.h \
|
||||
compositor/meta-plugin.c \
|
||||
@@ -65,7 +77,9 @@ libmutter_la_SOURCES = \
|
||||
compositor/region-utils.c \
|
||||
compositor/region-utils.h \
|
||||
meta/compositor.h \
|
||||
meta/meta-background.h \
|
||||
meta/meta-background-actor.h \
|
||||
meta/meta-background-group.h \
|
||||
meta/meta-plugin.h \
|
||||
meta/meta-shadow-factory.h \
|
||||
meta/meta-window-actor.h \
|
||||
@@ -82,10 +96,10 @@ libmutter_la_SOURCES = \
|
||||
ui/draw-workspace.h \
|
||||
core/edge-resistance.c \
|
||||
core/edge-resistance.h \
|
||||
core/edid-parse.c \
|
||||
core/edid.h \
|
||||
core/errors.c \
|
||||
meta/errors.h \
|
||||
core/eventqueue.c \
|
||||
core/eventqueue.h \
|
||||
core/frame.c \
|
||||
core/frame.h \
|
||||
ui/gradient.c \
|
||||
@@ -100,6 +114,15 @@ libmutter_la_SOURCES = \
|
||||
core/keybindings.c \
|
||||
core/keybindings-private.h \
|
||||
core/main.c \
|
||||
core/meta-cursor-tracker.c \
|
||||
core/meta-cursor-tracker-private.h \
|
||||
core/meta-idle-monitor.c \
|
||||
core/meta-idle-monitor-private.h \
|
||||
core/meta-xrandr-shared.h \
|
||||
core/monitor.c \
|
||||
core/monitor-config.c \
|
||||
core/monitor-private.h \
|
||||
core/monitor-xrandr.c \
|
||||
core/mutter-Xatomtype.h \
|
||||
core/place.c \
|
||||
core/place.h \
|
||||
@@ -129,7 +152,6 @@ libmutter_la_SOURCES = \
|
||||
meta/common.h \
|
||||
core/core.h \
|
||||
ui/ui.h \
|
||||
inlinepixbufs.h \
|
||||
ui/frames.c \
|
||||
ui/frames.h \
|
||||
ui/menu.c \
|
||||
@@ -147,8 +169,6 @@ libmutter_la_SOURCES = \
|
||||
meta/theme.h \
|
||||
ui/theme-private.h \
|
||||
ui/ui.c \
|
||||
meta/preview-widget.h \
|
||||
ui/preview-widget.c \
|
||||
$(mutter_built_sources)
|
||||
|
||||
libmutter_la_LDFLAGS = -no-undefined
|
||||
@@ -157,6 +177,7 @@ libmutter_la_LIBADD = $(MUTTER_LIBS)
|
||||
# Headers installed for plugins; introspected information will
|
||||
# be extracted into Mutter-<version>.gir
|
||||
libmutterinclude_base_headers = \
|
||||
meta/barrier.h \
|
||||
meta/boxes.h \
|
||||
meta/common.h \
|
||||
meta/compositor-mutter.h \
|
||||
@@ -168,6 +189,10 @@ libmutterinclude_base_headers = \
|
||||
meta/keybindings.h \
|
||||
meta/main.h \
|
||||
meta/meta-background-actor.h \
|
||||
meta/meta-background-group.h \
|
||||
meta/meta-background.h \
|
||||
meta/meta-cursor-tracker.h \
|
||||
meta/meta-idle-monitor.h \
|
||||
meta/meta-plugin.h \
|
||||
meta/meta-shaped-texture.h \
|
||||
meta/meta-shadow-factory.h \
|
||||
@@ -183,7 +208,6 @@ libmutterinclude_base_headers = \
|
||||
# Excluded from scanning for introspection but installed
|
||||
# atomnames.h: macros cause problems for scanning process
|
||||
libmutterinclude_extra_headers = \
|
||||
meta/preview-widget.h \
|
||||
meta/atomnames.h
|
||||
|
||||
libmutterincludedir = $(includedir)/mutter/meta
|
||||
@@ -192,10 +216,7 @@ libmutterinclude_HEADERS = \
|
||||
$(libmutterinclude_base_headers) \
|
||||
$(libmutterinclude_extra_headers)
|
||||
|
||||
mutter_theme_viewer_SOURCES= \
|
||||
ui/theme-viewer.c
|
||||
|
||||
bin_PROGRAMS=mutter mutter-theme-viewer
|
||||
bin_PROGRAMS=mutter
|
||||
|
||||
mutter_SOURCES = core/mutter.c
|
||||
mutter_LDADD = $(MUTTER_LIBS) libmutter.la
|
||||
@@ -233,8 +254,6 @@ Meta-$(api_version).gir: libmutter.la
|
||||
|
||||
endif
|
||||
|
||||
mutter_theme_viewer_LDADD= $(MUTTER_LIBS) libmutter.la
|
||||
|
||||
testboxes_SOURCES = core/testboxes.c
|
||||
testgradient_SOURCES = ui/testgradient.c
|
||||
testasyncgetprop_SOURCES = core/testasyncgetprop.c
|
||||
@@ -271,14 +290,7 @@ gsettings_SCHEMAS = org.gnome.mutter.gschema.xml
|
||||
convertdir = $(datadir)/GConf/gsettings
|
||||
convert_DATA = mutter-schemas.convert
|
||||
|
||||
IMAGES=stock_maximize.png stock_minimize.png stock_delete.png
|
||||
VARIABLES=stock_maximize_data $(srcdir)/stock_maximize.png \
|
||||
stock_minimize_data $(srcdir)/stock_minimize.png \
|
||||
stock_delete_data $(srcdir)/stock_delete.png
|
||||
|
||||
BUILT_SOURCES = inlinepixbufs.h
|
||||
CLEANFILES = \
|
||||
inlinepixbufs.h \
|
||||
mutter.desktop \
|
||||
mutter-wm.desktop \
|
||||
org.gnome.mutter.gschema.xml \
|
||||
@@ -287,9 +299,6 @@ CLEANFILES = \
|
||||
$(typelib_DATA) \
|
||||
$(gir_DATA)
|
||||
|
||||
inlinepixbufs.h: $(IMAGES)
|
||||
$(GDK_PIXBUF_CSOURCE) --raw --build-list $(VARIABLES) >$(srcdir)/inlinepixbufs.h
|
||||
|
||||
pkgconfigdir = $(libdir)/pkgconfig
|
||||
|
||||
pkgconfig_DATA = libmutter.pc mutter-plugins.pc
|
||||
@@ -301,13 +310,15 @@ EXTRA_DIST=$(desktopfiles_files) \
|
||||
$(wmproperties_in_files) \
|
||||
$(xml_in_files) \
|
||||
org.gnome.mutter.gschema.xml.in \
|
||||
idle-monitor.xml \
|
||||
xrandr.xml \
|
||||
mutter-schemas.convert \
|
||||
libmutter.pc.in \
|
||||
mutter-plugins.pc.in \
|
||||
mutter-enum-types.h.in \
|
||||
mutter-enum-types.c.in
|
||||
|
||||
BUILT_SOURCES += $(mutter_built_sources)
|
||||
BUILT_SOURCES = $(mutter_built_sources)
|
||||
MUTTER_STAMP_FILES = stamp-mutter-enum-types.h
|
||||
CLEANFILES += $(MUTTER_STAMP_FILES)
|
||||
|
||||
@@ -329,3 +340,22 @@ mutter-enum-types.c: stamp-mutter-enum-types.h mutter-enum-types.c.in
|
||||
$(libmutterinclude_base_headers) ) >> xgen-tetc && \
|
||||
cp xgen-tetc mutter-enum-types.c && \
|
||||
rm -f xgen-tetc
|
||||
|
||||
dbus_xrandr_built_sources = meta-dbus-xrandr.c meta-dbus-xrandr.h
|
||||
|
||||
$(dbus_xrandr_built_sources) : Makefile.am xrandr.xml
|
||||
$(AM_V_GEN)gdbus-codegen \
|
||||
--interface-prefix org.gnome.Mutter \
|
||||
--c-namespace MetaDBus \
|
||||
--generate-c-code meta-dbus-xrandr \
|
||||
$(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
|
||||
$(AM_V_GEN)gdbus-codegen \
|
||||
--interface-prefix org.gnome.Mutter \
|
||||
--c-namespace MetaDBus \
|
||||
--generate-c-code meta-dbus-idle-monitor \
|
||||
--c-generate-object-manager \
|
||||
$(srcdir)/idle-monitor.xml
|
||||
|
120
src/compositor/clutter-utils.c
Normal file
120
src/compositor/clutter-utils.c
Normal file
@@ -0,0 +1,120 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
/*
|
||||
* Utilities for use with Cogl
|
||||
*
|
||||
* Copyright 2010 Red Hat, Inc.
|
||||
* Copyright 2010 Intel Corporation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
* 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include "clutter-utils.h"
|
||||
#include <math.h>
|
||||
|
||||
/* This file uses pixel-aligned region computation to determine what
|
||||
* can be clipped out. This only really works if everything is aligned
|
||||
* to the pixel grid - not scaled or rotated and at integer offsets.
|
||||
*
|
||||
* (This could be relaxed - if we turned off filtering for unscaled
|
||||
* windows then windows would be, by definition aligned to the pixel
|
||||
* grid. And for rectangular windows without a shape, the outline that
|
||||
* we draw for an unrotated window is always a rectangle because we
|
||||
* don't use antialasing for the window boundary - with or without
|
||||
* filtering, with or without a scale. But figuring out exactly
|
||||
* what pixels will be drawn by the graphics system in these cases
|
||||
* gets tricky, so we just go for the easiest part - no scale,
|
||||
* and at integer offsets.)
|
||||
*
|
||||
* The way we check for pixel-aligned is by looking at the
|
||||
* transformation into screen space of the allocation box of an actor
|
||||
* and and checking if the corners are "close enough" to integral
|
||||
* pixel values.
|
||||
*/
|
||||
|
||||
/* The definition of "close enough" to integral pixel values is
|
||||
* equality when we convert to 24.8 fixed-point.
|
||||
*/
|
||||
static inline int
|
||||
round_to_fixed (float x)
|
||||
{
|
||||
return roundf (x * 256);
|
||||
}
|
||||
|
||||
/* This helper function checks if (according to our fixed point precision)
|
||||
* the vertices @verts form a box of width @widthf and height @heightf
|
||||
* located at integral coordinates. These coordinates are returned
|
||||
* in @x_origin and @y_origin.
|
||||
*/
|
||||
gboolean
|
||||
meta_actor_vertices_are_untransformed (ClutterVertex *verts,
|
||||
float widthf,
|
||||
float heightf,
|
||||
int *x_origin,
|
||||
int *y_origin)
|
||||
{
|
||||
int width, height;
|
||||
int v0x, v0y, v1x, v1y, v2x, v2y, v3x, v3y;
|
||||
int x, y;
|
||||
|
||||
width = round_to_fixed (widthf); height = round_to_fixed (heightf);
|
||||
|
||||
v0x = round_to_fixed (verts[0].x); v0y = round_to_fixed (verts[0].y);
|
||||
v1x = round_to_fixed (verts[1].x); v1y = round_to_fixed (verts[1].y);
|
||||
v2x = round_to_fixed (verts[2].x); v2y = round_to_fixed (verts[2].y);
|
||||
v3x = round_to_fixed (verts[3].x); v3y = round_to_fixed (verts[3].y);
|
||||
|
||||
/* Using shifting for converting fixed => int, gets things right for
|
||||
* negative values. / 256. wouldn't do the same
|
||||
*/
|
||||
x = v0x >> 8;
|
||||
y = v0y >> 8;
|
||||
|
||||
/* At integral coordinates? */
|
||||
if (x * 256 != v0x || y * 256 != v0y)
|
||||
return FALSE;
|
||||
|
||||
/* Not scaled? */
|
||||
if (v1x - v0x != width || v2y - v0y != height)
|
||||
return FALSE;
|
||||
|
||||
/* Not rotated/skewed? */
|
||||
if (v0x != v2x || v0y != v1y ||
|
||||
v3x != v1x || v3y != v2y)
|
||||
return FALSE;
|
||||
|
||||
*x_origin = x;
|
||||
*y_origin = y;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* Check if an actor is "untransformed" - which actually means transformed by
|
||||
* at most a integer-translation. The integer translation, if any, is returned.
|
||||
*/
|
||||
gboolean
|
||||
meta_actor_is_untransformed (ClutterActor *actor,
|
||||
int *x_origin,
|
||||
int *y_origin)
|
||||
{
|
||||
gfloat widthf, heightf;
|
||||
ClutterVertex verts[4];
|
||||
|
||||
clutter_actor_get_size (actor, &widthf, &heightf);
|
||||
clutter_actor_get_abs_allocation_vertices (actor, verts);
|
||||
|
||||
return meta_actor_vertices_are_untransformed (verts, widthf, heightf, x_origin, y_origin);
|
||||
}
|
||||
|
36
src/compositor/clutter-utils.h
Normal file
36
src/compositor/clutter-utils.h
Normal file
@@ -0,0 +1,36 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
/*
|
||||
* Utilities for use with Clutter
|
||||
*
|
||||
* Copyright 2010 Red Hat, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
* 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __META_CLUTTER_UTILS_H__
|
||||
#define __META_CLUTTER_UTILS_H__
|
||||
|
||||
#include <clutter/clutter.h>
|
||||
gboolean meta_actor_vertices_are_untransformed (ClutterVertex *verts,
|
||||
float widthf,
|
||||
float heightf,
|
||||
int *x_origin,
|
||||
int *y_origin);
|
||||
gboolean meta_actor_is_untransformed (ClutterActor *actor,
|
||||
int *x_origin,
|
||||
int *y_origin);
|
||||
|
||||
#endif /* __META_CLUTTER_UTILS_H__ */
|
@@ -21,14 +21,15 @@
|
||||
* 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include <clutter/clutter.h>
|
||||
#include "cogl-utils.h"
|
||||
|
||||
/**
|
||||
* meta_create_color_texture_4ub:
|
||||
* @red:
|
||||
* @green:
|
||||
* @blue:
|
||||
* @alpha:
|
||||
* @red: red component
|
||||
* @green: green component
|
||||
* @blue: blue component
|
||||
* @alpha: alpha component
|
||||
* @flags: Optional flags for the texture, or %COGL_TEXTURE_NONE;
|
||||
* %COGL_TEXTURE_NO_SLICING is useful if the texture will be
|
||||
* repeated to create a constant color fill, since hardware
|
||||
@@ -39,7 +40,7 @@
|
||||
*
|
||||
* Return value: (transfer full): a newly created Cogl texture
|
||||
*/
|
||||
CoglHandle
|
||||
CoglTexture *
|
||||
meta_create_color_texture_4ub (guint8 red,
|
||||
guint8 green,
|
||||
guint8 blue,
|
||||
@@ -49,7 +50,7 @@ meta_create_color_texture_4ub (guint8 red,
|
||||
CoglColor color;
|
||||
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);
|
||||
|
||||
pixel[0] = cogl_color_get_red_byte (&color);
|
||||
@@ -68,43 +69,42 @@ meta_create_color_texture_4ub (guint8 red,
|
||||
/* Based on gnome-shell/src/st/st-private.c:_st_create_texture_material.c */
|
||||
|
||||
/**
|
||||
* meta_create_texture_material:
|
||||
* meta_create_texture_pipeline:
|
||||
* @src_texture: (allow-none): texture to use initially for the layer
|
||||
*
|
||||
* Creates a material with a single layer. Using a common template
|
||||
* allows sharing a shader for different uses in Mutter. To share the same
|
||||
* shader with all other materials that are just texture plus opacity
|
||||
* would require Cogl fixes.
|
||||
* (See http://bugzilla.clutter-project.org/show_bug.cgi?id=2425)
|
||||
* Creates a pipeline with a single layer. Using a common template
|
||||
* makes it easier for Cogl to share a shader for different uses in
|
||||
* Mutter.
|
||||
*
|
||||
* Return value: (transfer full): a newly created Cogl material
|
||||
* Return value: (transfer full): a newly created #CoglPipeline
|
||||
*/
|
||||
CoglHandle
|
||||
meta_create_texture_material (CoglHandle src_texture)
|
||||
CoglPipeline *
|
||||
meta_create_texture_pipeline (CoglTexture *src_texture)
|
||||
{
|
||||
static CoglHandle texture_material_template = COGL_INVALID_HANDLE;
|
||||
CoglHandle material;
|
||||
static CoglPipeline *texture_pipeline_template = NULL;
|
||||
CoglPipeline *pipeline;
|
||||
|
||||
/* We use a material that has a dummy texture as a base for all
|
||||
texture materials. The idea is that only the Cogl texture object
|
||||
would be different in the children so it is likely that Cogl will
|
||||
be able to share GL programs between all the textures. */
|
||||
if (G_UNLIKELY (texture_material_template == COGL_INVALID_HANDLE))
|
||||
/* The only state used in the pipeline that would affect the shader
|
||||
generation is the texture type on the layer. Therefore we create
|
||||
a template pipeline which sets this state and all texture
|
||||
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))
|
||||
{
|
||||
CoglHandle dummy_texture;
|
||||
CoglContext *ctx =
|
||||
clutter_backend_get_cogl_context (clutter_get_default_backend ());
|
||||
|
||||
dummy_texture = meta_create_color_texture_4ub (0xff, 0xff, 0xff, 0xff,
|
||||
COGL_TEXTURE_NONE);
|
||||
|
||||
texture_material_template = cogl_material_new ();
|
||||
cogl_material_set_layer (texture_material_template, 0, dummy_texture);
|
||||
cogl_handle_unref (dummy_texture);
|
||||
texture_pipeline_template = cogl_pipeline_new (ctx);
|
||||
cogl_pipeline_set_layer_null_texture (texture_pipeline_template,
|
||||
0, /* layer */
|
||||
COGL_TEXTURE_TYPE_2D);
|
||||
}
|
||||
|
||||
material = cogl_material_copy (texture_material_template);
|
||||
pipeline = cogl_pipeline_copy (texture_pipeline_template);
|
||||
|
||||
if (src_texture != COGL_INVALID_HANDLE)
|
||||
cogl_material_set_layer (material, 0, src_texture);
|
||||
if (src_texture != NULL)
|
||||
cogl_pipeline_set_layer_texture (pipeline, 0, src_texture);
|
||||
|
||||
return material;
|
||||
return pipeline;
|
||||
}
|
||||
|
@@ -25,11 +25,11 @@
|
||||
|
||||
#include <cogl/cogl.h>
|
||||
|
||||
CoglHandle meta_create_color_texture_4ub (guint8 red,
|
||||
guint8 green,
|
||||
guint8 blue,
|
||||
guint8 alpha,
|
||||
CoglTextureFlags flags);
|
||||
CoglHandle meta_create_texture_material (CoglHandle src_texture);
|
||||
CoglTexture * meta_create_color_texture_4ub (guint8 red,
|
||||
guint8 green,
|
||||
guint8 blue,
|
||||
guint8 alpha,
|
||||
CoglTextureFlags flags);
|
||||
CoglPipeline * meta_create_texture_pipeline (CoglTexture *texture);
|
||||
|
||||
#endif /* __META_COGL_UTILS_H__ */
|
||||
|
@@ -25,22 +25,28 @@ struct _MetaCompositor
|
||||
|
||||
MetaPlugin *modal_plugin;
|
||||
|
||||
gboolean show_redraw : 1;
|
||||
gboolean debug : 1;
|
||||
gboolean no_mipmaps : 1;
|
||||
gint64 server_time_query_time;
|
||||
gint64 server_time_offset;
|
||||
|
||||
guint server_time_is_monotonic_time : 1;
|
||||
guint show_redraw : 1;
|
||||
guint debug : 1;
|
||||
guint no_mipmaps : 1;
|
||||
};
|
||||
|
||||
struct _MetaCompScreen
|
||||
{
|
||||
MetaScreen *screen;
|
||||
|
||||
ClutterActor *stage, *window_group, *overlay_group;
|
||||
ClutterActor *stage, *window_group, *top_window_group, *overlay_group;
|
||||
ClutterActor *background_actor;
|
||||
ClutterActor *hidden_group;
|
||||
GList *windows;
|
||||
GHashTable *windows_by_xid;
|
||||
Window output;
|
||||
|
||||
CoglOnscreen *onscreen;
|
||||
CoglFrameClosure *frame_closure;
|
||||
|
||||
/* Used for unredirecting fullscreen windows */
|
||||
guint disable_unredirect_count;
|
||||
MetaWindowActor *unredirected_window;
|
||||
@@ -53,18 +59,22 @@ struct _MetaCompScreen
|
||||
MetaPluginManager *plugin_mgr;
|
||||
};
|
||||
|
||||
/* Wait 2ms after vblank before starting to draw next frame */
|
||||
#define META_SYNC_DELAY 2
|
||||
|
||||
void meta_switch_workspace_completed (MetaScreen *screen);
|
||||
|
||||
gboolean meta_begin_modal_for_plugin (MetaScreen *screen,
|
||||
MetaPlugin *plugin,
|
||||
Window grab_window,
|
||||
Cursor cursor,
|
||||
MetaModalOptions options,
|
||||
guint32 timestamp);
|
||||
void meta_end_modal_for_plugin (MetaScreen *screen,
|
||||
MetaPlugin *plugin,
|
||||
guint32 timestamp);
|
||||
|
||||
gint64 meta_compositor_monotonic_time_to_server_time (MetaDisplay *display,
|
||||
gint64 monotonic_time);
|
||||
|
||||
void meta_check_end_modal (MetaScreen *screen);
|
||||
|
||||
#endif /* META_COMPOSITOR_PRIVATE_H */
|
||||
|
@@ -1,9 +1,74 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/**
|
||||
* SECTION:compositor
|
||||
* @Title: MetaCompositor
|
||||
* @Short_Description: Compositor API
|
||||
*
|
||||
* At a high-level, a window is not-visible or visible. When a
|
||||
* window is added (with meta_compositor_add_window()) it is not visible.
|
||||
* meta_compositor_show_window() indicates a transition from not-visible to
|
||||
* visible. Some of the reasons for this:
|
||||
*
|
||||
* - Window newly created
|
||||
* - Window is unminimized
|
||||
* - Window is moved to the current desktop
|
||||
* - Window was made sticky
|
||||
*
|
||||
* meta_compositor_hide_window() indicates that the window has transitioned from
|
||||
* visible to not-visible. Some reasons include:
|
||||
*
|
||||
* - Window was destroyed
|
||||
* - Window is minimized
|
||||
* - Window is moved to a different desktop
|
||||
* - Window no longer sticky.
|
||||
*
|
||||
* Note that combinations are possible - a window might have first
|
||||
* been minimized and then moved to a different desktop. The 'effect' parameter
|
||||
* to meta_compositor_show_window() and meta_compositor_hide_window() is a hint
|
||||
* as to the appropriate effect to show the user and should not
|
||||
* be considered to be indicative of a state change.
|
||||
*
|
||||
* When the active workspace is changed, meta_compositor_switch_workspace() is
|
||||
* called first, then meta_compositor_show_window() and
|
||||
* meta_compositor_hide_window() are called individually for each window
|
||||
* affected, with an effect of META_COMP_EFFECT_NONE.
|
||||
* If hiding windows will affect the switch workspace animation, the
|
||||
* compositor needs to delay hiding the windows until the switch
|
||||
* workspace animation completes.
|
||||
*
|
||||
* meta_compositor_maximize_window() and meta_compositor_unmaximize_window()
|
||||
* are transitions within the visible state. The window is resized __before__
|
||||
* the call, so it may be necessary to readjust the display based on the
|
||||
* old_rect to start the animation.
|
||||
*
|
||||
* 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 #
|
||||
*
|
||||
* There's two containers in the stage that are used to place window actors, here
|
||||
* are listed in the order in which they are painted:
|
||||
*
|
||||
* - window group, accessible with meta_get_window_group_for_screen()
|
||||
* - top window group, accessible with meta_get_top_window_group_for_screen()
|
||||
*
|
||||
* Mutter will place actors representing windows in the window group, except for
|
||||
* override-redirect windows (ie. popups and menus) which will be placed in the
|
||||
* top window group.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#include <clutter/x11/clutter-x11.h>
|
||||
|
||||
#include "core.h"
|
||||
#include <meta/screen.h>
|
||||
#include <meta/errors.h>
|
||||
#include <meta/window.h>
|
||||
@@ -12,10 +77,11 @@
|
||||
#include "xprops.h"
|
||||
#include <meta/prefs.h>
|
||||
#include <meta/main.h>
|
||||
#include <meta/meta-background-actor.h>
|
||||
#include <meta/meta-background-group.h>
|
||||
#include <meta/meta-shadow-factory.h>
|
||||
#include "meta-window-actor-private.h"
|
||||
#include "meta-window-group.h"
|
||||
#include "meta-background-actor-private.h"
|
||||
#include "window-private.h" /* to check window->hidden */
|
||||
#include "display-private.h" /* for meta_display_lookup_x_window() */
|
||||
#include <X11/extensions/shape.h>
|
||||
@@ -116,21 +182,6 @@ process_property_notify (MetaCompositor *compositor,
|
||||
{
|
||||
MetaWindowActor *window_actor;
|
||||
|
||||
if (event->atom == compositor->atom_x_root_pixmap)
|
||||
{
|
||||
GSList *l;
|
||||
|
||||
for (l = meta_display_get_screens (compositor->display); l; l = l->next)
|
||||
{
|
||||
MetaScreen *screen = l->data;
|
||||
if (event->window == meta_screen_get_xroot (screen))
|
||||
{
|
||||
meta_background_actor_update (screen);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (window == NULL)
|
||||
return;
|
||||
|
||||
@@ -163,6 +214,8 @@ get_output_window (MetaScreen *screen)
|
||||
xroot = meta_screen_get_xroot (screen);
|
||||
output = XCompositeGetOverlayWindow (xdisplay, xroot);
|
||||
|
||||
meta_core_add_old_event_mask (xdisplay, output, &mask);
|
||||
|
||||
XISetMask (mask.mask, XI_KeyPress);
|
||||
XISetMask (mask.mask, XI_KeyRelease);
|
||||
XISetMask (mask.mask, XI_ButtonPress);
|
||||
@@ -200,23 +253,6 @@ meta_get_stage_for_screen (MetaScreen *screen)
|
||||
return info->stage;
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_get_overlay_group_for_screen:
|
||||
* @screen: a #MetaScreen
|
||||
*
|
||||
* Returns: (transfer none): The overlay group corresponding to @screen
|
||||
*/
|
||||
ClutterActor *
|
||||
meta_get_overlay_group_for_screen (MetaScreen *screen)
|
||||
{
|
||||
MetaCompScreen *info = meta_screen_get_compositor_data (screen);
|
||||
|
||||
if (!info)
|
||||
return NULL;
|
||||
|
||||
return info->overlay_group;
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_get_window_group_for_screen:
|
||||
* @screen: a #MetaScreen
|
||||
@@ -235,24 +271,20 @@ meta_get_window_group_for_screen (MetaScreen *screen)
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_get_background_actor_for_screen:
|
||||
* meta_get_top_window_group_for_screen:
|
||||
* @screen: a #MetaScreen
|
||||
*
|
||||
* Gets the actor that draws the root window background under the windows.
|
||||
* The root window background automatically tracks the image or color set
|
||||
* by the environment.
|
||||
*
|
||||
* Returns: (transfer none): The background actor corresponding to @screen
|
||||
* Returns: (transfer none): The top window group corresponding to @screen
|
||||
*/
|
||||
ClutterActor *
|
||||
meta_get_background_actor_for_screen (MetaScreen *screen)
|
||||
meta_get_top_window_group_for_screen (MetaScreen *screen)
|
||||
{
|
||||
MetaCompScreen *info = meta_screen_get_compositor_data (screen);
|
||||
|
||||
if (!info)
|
||||
return NULL;
|
||||
|
||||
return info->background_actor;
|
||||
return info->top_window_group;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -337,11 +369,49 @@ meta_empty_stage_input_region (MetaScreen *screen)
|
||||
meta_set_stage_input_region (screen, region);
|
||||
}
|
||||
|
||||
void
|
||||
meta_focus_stage_window (MetaScreen *screen,
|
||||
guint32 timestamp)
|
||||
{
|
||||
ClutterStage *stage;
|
||||
Window window;
|
||||
|
||||
stage = CLUTTER_STAGE (meta_get_stage_for_screen (screen));
|
||||
if (!stage)
|
||||
return;
|
||||
|
||||
window = clutter_x11_get_stage_window (stage);
|
||||
|
||||
if (window == None)
|
||||
return;
|
||||
|
||||
meta_display_set_input_focus_xwindow (screen->display,
|
||||
screen,
|
||||
window,
|
||||
timestamp);
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_stage_is_focused (MetaScreen *screen)
|
||||
{
|
||||
ClutterStage *stage;
|
||||
Window window;
|
||||
|
||||
stage = CLUTTER_STAGE (meta_get_stage_for_screen (screen));
|
||||
if (!stage)
|
||||
return FALSE;
|
||||
|
||||
window = clutter_x11_get_stage_window (stage);
|
||||
|
||||
if (window == None)
|
||||
return FALSE;
|
||||
|
||||
return (screen->display->focus_xwindow == window);
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_begin_modal_for_plugin (MetaScreen *screen,
|
||||
MetaPlugin *plugin,
|
||||
Window grab_window,
|
||||
Cursor cursor,
|
||||
MetaModalOptions options,
|
||||
guint32 timestamp)
|
||||
{
|
||||
@@ -352,10 +422,19 @@ meta_begin_modal_for_plugin (MetaScreen *screen,
|
||||
MetaDisplay *display = meta_screen_get_display (screen);
|
||||
Display *xdpy = meta_display_get_xdisplay (display);
|
||||
MetaCompositor *compositor = display->compositor;
|
||||
ClutterStage *stage;
|
||||
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;
|
||||
|
||||
@@ -463,27 +542,32 @@ meta_check_end_modal (MetaScreen *screen)
|
||||
{
|
||||
meta_end_modal_for_plugin (screen,
|
||||
compositor->modal_plugin,
|
||||
CurrentTime);
|
||||
|
||||
CurrentTime);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
meta_compositor_manage_screen (MetaCompositor *compositor,
|
||||
MetaScreen *screen)
|
||||
static void
|
||||
after_stage_paint (ClutterStage *stage,
|
||||
gpointer data)
|
||||
{
|
||||
MetaCompScreen *info;
|
||||
MetaDisplay *display = meta_screen_get_display (screen);
|
||||
Display *xdisplay = meta_display_get_xdisplay (display);
|
||||
int screen_number = meta_screen_get_screen_number (screen);
|
||||
Window xroot = meta_screen_get_xroot (screen);
|
||||
Window xwin;
|
||||
gint width, height;
|
||||
guint n_retries;
|
||||
guint max_retries;
|
||||
MetaCompScreen *info = (MetaCompScreen*) data;
|
||||
GList *l;
|
||||
|
||||
/* Check if the screen is already managed */
|
||||
if (meta_screen_get_compositor_data (screen))
|
||||
return;
|
||||
for (l = info->windows; l; l = l->next)
|
||||
meta_window_actor_post_paint (l->data);
|
||||
}
|
||||
|
||||
static void
|
||||
redirect_windows (MetaCompositor *compositor,
|
||||
MetaScreen *screen)
|
||||
{
|
||||
MetaDisplay *display = meta_screen_get_display (screen);
|
||||
Display *xdisplay = meta_display_get_xdisplay (display);
|
||||
Window xroot = meta_screen_get_xroot (screen);
|
||||
int screen_number = meta_screen_get_screen_number (screen);
|
||||
guint n_retries;
|
||||
guint max_retries;
|
||||
|
||||
if (meta_get_replace_current_wm ())
|
||||
max_retries = 5;
|
||||
@@ -516,6 +600,21 @@ meta_compositor_manage_screen (MetaCompositor *compositor,
|
||||
n_retries++;
|
||||
g_usleep (G_USEC_PER_SEC);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
meta_compositor_manage_screen (MetaCompositor *compositor,
|
||||
MetaScreen *screen)
|
||||
{
|
||||
MetaCompScreen *info;
|
||||
MetaDisplay *display = meta_screen_get_display (screen);
|
||||
Display *xdisplay = meta_display_get_xdisplay (display);
|
||||
Window xwin;
|
||||
gint width, height;
|
||||
|
||||
/* Check if the screen is already managed */
|
||||
if (meta_screen_get_compositor_data (screen))
|
||||
return;
|
||||
|
||||
info = g_new0 (MetaCompScreen, 1);
|
||||
/*
|
||||
@@ -537,6 +636,13 @@ meta_compositor_manage_screen (MetaCompositor *compositor,
|
||||
|
||||
info->stage = clutter_stage_new ();
|
||||
|
||||
clutter_stage_set_paint_callback (CLUTTER_STAGE (info->stage),
|
||||
after_stage_paint,
|
||||
info,
|
||||
NULL);
|
||||
|
||||
clutter_stage_set_sync_delay (CLUTTER_STAGE (info->stage), META_SYNC_DELAY);
|
||||
|
||||
meta_screen_get_size (screen, &width, &height);
|
||||
clutter_actor_realize (info->stage);
|
||||
|
||||
@@ -550,6 +656,8 @@ meta_compositor_manage_screen (MetaCompositor *compositor,
|
||||
XIEventMask mask = { XIAllMasterDevices, sizeof (mask_bits), mask_bits };
|
||||
XWindowAttributes attr;
|
||||
|
||||
meta_core_add_old_event_mask (xdisplay, xwin, &mask);
|
||||
|
||||
XISetMask (mask.mask, XI_KeyPress);
|
||||
XISetMask (mask.mask, XI_KeyRelease);
|
||||
XISetMask (mask.mask, XI_ButtonPress);
|
||||
@@ -559,6 +667,9 @@ meta_compositor_manage_screen (MetaCompositor *compositor,
|
||||
XISetMask (mask.mask, XI_FocusIn);
|
||||
XISetMask (mask.mask, XI_FocusOut);
|
||||
XISetMask (mask.mask, XI_Motion);
|
||||
XIClearMask (mask.mask, XI_TouchBegin);
|
||||
XIClearMask (mask.mask, XI_TouchEnd);
|
||||
XIClearMask (mask.mask, XI_TouchUpdate);
|
||||
XISelectEvents (xdisplay, xwin, &mask, 1);
|
||||
|
||||
event_mask = ExposureMask | PropertyChangeMask | StructureNotifyMask;
|
||||
@@ -569,21 +680,10 @@ meta_compositor_manage_screen (MetaCompositor *compositor,
|
||||
}
|
||||
|
||||
info->window_group = meta_window_group_new (screen);
|
||||
info->background_actor = meta_background_actor_new_for_screen (screen);
|
||||
info->overlay_group = clutter_group_new ();
|
||||
info->hidden_group = clutter_group_new ();
|
||||
info->top_window_group = meta_window_group_new (screen);
|
||||
|
||||
clutter_container_add (CLUTTER_CONTAINER (info->window_group),
|
||||
info->background_actor,
|
||||
NULL);
|
||||
|
||||
clutter_container_add (CLUTTER_CONTAINER (info->stage),
|
||||
info->window_group,
|
||||
info->overlay_group,
|
||||
info->hidden_group,
|
||||
NULL);
|
||||
|
||||
clutter_actor_hide (info->hidden_group);
|
||||
clutter_actor_add_child (info->stage, info->window_group);
|
||||
clutter_actor_add_child (info->stage, info->top_window_group);
|
||||
|
||||
info->plugin_mgr = meta_plugin_manager_new (screen);
|
||||
|
||||
@@ -614,8 +714,12 @@ meta_compositor_manage_screen (MetaCompositor *compositor,
|
||||
info->pending_input_region = None;
|
||||
}
|
||||
|
||||
clutter_actor_show (info->overlay_group);
|
||||
clutter_actor_show (info->stage);
|
||||
/* Map overlay window before redirecting windows offscreen so we catch their
|
||||
* contents until we show the stage.
|
||||
*/
|
||||
XMapWindow (xdisplay, info->output);
|
||||
|
||||
redirect_windows (compositor, screen);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -716,10 +820,33 @@ meta_compositor_remove_window (MetaCompositor *compositor,
|
||||
}
|
||||
|
||||
void
|
||||
meta_compositor_set_updates (MetaCompositor *compositor,
|
||||
MetaWindow *window,
|
||||
gboolean updates)
|
||||
meta_compositor_set_updates_frozen (MetaCompositor *compositor,
|
||||
MetaWindow *window,
|
||||
gboolean updates_frozen)
|
||||
{
|
||||
MetaWindowActor *window_actor;
|
||||
|
||||
DEBUG_TRACE ("meta_compositor_set_updates_frozen\n");
|
||||
window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (window));
|
||||
if (!window_actor)
|
||||
return;
|
||||
|
||||
meta_window_actor_set_updates_frozen (window_actor, updates_frozen);
|
||||
}
|
||||
|
||||
void
|
||||
meta_compositor_queue_frame_drawn (MetaCompositor *compositor,
|
||||
MetaWindow *window,
|
||||
gboolean no_delay_frame)
|
||||
{
|
||||
MetaWindowActor *window_actor;
|
||||
|
||||
DEBUG_TRACE ("meta_compositor_queue_frame_drawn\n");
|
||||
window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (window));
|
||||
if (!window_actor)
|
||||
return;
|
||||
|
||||
meta_window_actor_queue_frame_drawn (window_actor, no_delay_frame);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
@@ -751,11 +878,63 @@ meta_compositor_window_shape_changed (MetaCompositor *compositor,
|
||||
{
|
||||
MetaWindowActor *window_actor;
|
||||
window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (window));
|
||||
if (!window_actor)
|
||||
return;
|
||||
|
||||
meta_window_actor_update_shape (window_actor);
|
||||
}
|
||||
|
||||
/* Clutter makes the assumption that there is only one X window
|
||||
* per stage, which is a valid assumption to make for a generic
|
||||
* application toolkit. As such, it will ignore any events sent
|
||||
* to the a stage that isn't its X window.
|
||||
*
|
||||
* When a user clicks on what she thinks is the wallpaper, she
|
||||
* is actually clicking on the guard window, which is an entirely
|
||||
* separate top-level override-redirect window in the hierarchy.
|
||||
* 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
|
||||
maybe_spoof_guard_window_event_as_stage_event (MetaCompScreen *info,
|
||||
XEvent *event)
|
||||
{
|
||||
MetaDisplay *display = meta_screen_get_display (info->screen);
|
||||
|
||||
if (event->type == GenericEvent &&
|
||||
event->xcookie.extension == display->xinput_opcode)
|
||||
{
|
||||
XIEvent *input_event = (XIEvent *) event->xcookie.data;
|
||||
|
||||
/* Only care about pointer events for now. */
|
||||
switch (input_event->evtype)
|
||||
{
|
||||
case XI_Motion:
|
||||
case XI_ButtonPress:
|
||||
case XI_ButtonRelease:
|
||||
{
|
||||
XIDeviceEvent *device_event = ((XIDeviceEvent *) input_event);
|
||||
if (device_event->event == info->screen->guard_window)
|
||||
{
|
||||
Window xwin = clutter_x11_get_stage_window (CLUTTER_STAGE (info->stage));
|
||||
device_event->event = xwin;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_compositor_process_event: (skip)
|
||||
* @compositor:
|
||||
* @event:
|
||||
* @window:
|
||||
*
|
||||
*/
|
||||
gboolean
|
||||
@@ -765,10 +944,7 @@ meta_compositor_process_event (MetaCompositor *compositor,
|
||||
{
|
||||
if (compositor->modal_plugin && is_grabbed_event (compositor->display, event))
|
||||
{
|
||||
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (compositor->modal_plugin);
|
||||
|
||||
if (klass->xevent_filter)
|
||||
klass->xevent_filter (compositor->modal_plugin, event);
|
||||
_meta_plugin_xevent_filter (compositor->modal_plugin, event);
|
||||
|
||||
/* We always consume events even if the plugin says it didn't handle them;
|
||||
* exclusive is exclusive */
|
||||
@@ -802,6 +978,8 @@ meta_compositor_process_event (MetaCompositor *compositor,
|
||||
|
||||
info = meta_screen_get_compositor_data (screen);
|
||||
|
||||
maybe_spoof_guard_window_event_as_stage_event (info, event);
|
||||
|
||||
if (meta_plugin_manager_xevent_filter (info->plugin_mgr, event))
|
||||
{
|
||||
DEBUG_TRACE ("meta_compositor_process_event (filtered,window==NULL)\n");
|
||||
@@ -957,8 +1135,11 @@ static void
|
||||
sync_actor_stacking (MetaCompScreen *info)
|
||||
{
|
||||
GList *children;
|
||||
GList *expected_window_node;
|
||||
GList *tmp;
|
||||
GList *old;
|
||||
GList *backgrounds;
|
||||
gboolean has_windows;
|
||||
gboolean reordered;
|
||||
|
||||
/* NB: The first entries in the lists are stacked the lowest */
|
||||
@@ -967,60 +1148,75 @@ sync_actor_stacking (MetaCompScreen *info)
|
||||
* little effort to make sure we actually need to restack before
|
||||
* we go ahead and do it */
|
||||
|
||||
children = clutter_container_get_children (CLUTTER_CONTAINER (info->window_group));
|
||||
children = clutter_actor_get_children (info->window_group);
|
||||
has_windows = FALSE;
|
||||
reordered = FALSE;
|
||||
|
||||
old = children;
|
||||
|
||||
/* We allow for actors in the window group other than the actors we
|
||||
* know about, but it's up to a plugin to try and keep them stacked correctly
|
||||
* (we really need extra API to make that reliable.)
|
||||
*/
|
||||
|
||||
/* Of the actors we know, the bottom actor should be the background actor */
|
||||
|
||||
while (old && old->data != info->background_actor && !META_IS_WINDOW_ACTOR (old->data))
|
||||
old = old->next;
|
||||
if (old == NULL || old->data != info->background_actor)
|
||||
/* First we collect a list of all backgrounds, and check if they're at the
|
||||
* bottom. Then we check if the window actors are in the correct sequence */
|
||||
backgrounds = NULL;
|
||||
expected_window_node = info->windows;
|
||||
for (old = children; old != NULL; old = old->next)
|
||||
{
|
||||
reordered = TRUE;
|
||||
goto done_with_check;
|
||||
}
|
||||
ClutterActor *actor = old->data;
|
||||
|
||||
/* Then the window actors should follow in sequence */
|
||||
|
||||
old = old->next;
|
||||
for (tmp = info->windows; tmp != NULL; tmp = tmp->next)
|
||||
{
|
||||
while (old && !META_IS_WINDOW_ACTOR (old->data))
|
||||
old = old->next;
|
||||
|
||||
/* old == NULL: someone reparented a window out of the window group,
|
||||
* order undefined, always restack */
|
||||
if (old == NULL || old->data != tmp->data)
|
||||
if (META_IS_BACKGROUND_GROUP (actor) ||
|
||||
META_IS_BACKGROUND_ACTOR (actor))
|
||||
{
|
||||
reordered = TRUE;
|
||||
goto done_with_check;
|
||||
backgrounds = g_list_prepend (backgrounds, actor);
|
||||
|
||||
if (has_windows)
|
||||
reordered = TRUE;
|
||||
}
|
||||
else if (META_IS_WINDOW_ACTOR (actor) && !reordered)
|
||||
{
|
||||
has_windows = TRUE;
|
||||
|
||||
old = old->next;
|
||||
if (expected_window_node != NULL && actor == expected_window_node->data)
|
||||
expected_window_node = expected_window_node->next;
|
||||
else
|
||||
reordered = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
done_with_check:
|
||||
|
||||
g_list_free (children);
|
||||
|
||||
if (!reordered)
|
||||
return;
|
||||
|
||||
for (tmp = g_list_last (info->windows); tmp != NULL; tmp = tmp->prev)
|
||||
{
|
||||
MetaWindowActor *window_actor = tmp->data;
|
||||
|
||||
clutter_actor_lower_bottom (CLUTTER_ACTOR (window_actor));
|
||||
g_list_free (backgrounds);
|
||||
return;
|
||||
}
|
||||
|
||||
clutter_actor_lower_bottom (info->background_actor);
|
||||
/* reorder the actors by lowering them in turn to the bottom of the stack.
|
||||
* windows first, then background.
|
||||
*
|
||||
* We reorder the actors even if they're not parented to the window group,
|
||||
* to allow stacking to work with intermediate actors (eg during effects)
|
||||
*/
|
||||
for (tmp = g_list_last (info->windows); tmp != NULL; tmp = tmp->prev)
|
||||
{
|
||||
ClutterActor *actor = tmp->data, *parent;
|
||||
|
||||
parent = clutter_actor_get_parent (actor);
|
||||
clutter_actor_set_child_below_sibling (parent, actor, NULL);
|
||||
}
|
||||
|
||||
/* we prepended the backgrounds above so the last actor in the list
|
||||
* should get lowered to the bottom last.
|
||||
*/
|
||||
for (tmp = backgrounds; tmp != NULL; tmp = tmp->next)
|
||||
{
|
||||
ClutterActor *actor = tmp->data, *parent;
|
||||
|
||||
parent = clutter_actor_get_parent (actor);
|
||||
clutter_actor_set_child_below_sibling (parent, actor, NULL);
|
||||
}
|
||||
g_list_free (backgrounds);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -1141,7 +1337,8 @@ meta_compositor_window_unmapped (MetaCompositor *compositor,
|
||||
|
||||
void
|
||||
meta_compositor_sync_window_geometry (MetaCompositor *compositor,
|
||||
MetaWindow *window)
|
||||
MetaWindow *window,
|
||||
gboolean did_placement)
|
||||
{
|
||||
MetaWindowActor *window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (window));
|
||||
MetaScreen *screen = meta_window_get_screen (window);
|
||||
@@ -1153,7 +1350,7 @@ meta_compositor_sync_window_geometry (MetaCompositor *compositor,
|
||||
if (!window_actor)
|
||||
return;
|
||||
|
||||
meta_window_actor_sync_actor_position (window_actor);
|
||||
meta_window_actor_sync_actor_geometry (window_actor, did_placement);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -1175,13 +1372,53 @@ meta_compositor_sync_screen_size (MetaCompositor *compositor,
|
||||
|
||||
XResizeWindow (xdisplay, xwin, width, height);
|
||||
|
||||
meta_background_actor_screen_size_changed (screen);
|
||||
|
||||
meta_verbose ("Changed size for stage on screen %d to %dx%d\n",
|
||||
meta_screen_get_screen_number (screen),
|
||||
width, height);
|
||||
}
|
||||
|
||||
static void
|
||||
frame_callback (CoglOnscreen *onscreen,
|
||||
CoglFrameEvent event,
|
||||
CoglFrameInfo *frame_info,
|
||||
void *user_data)
|
||||
{
|
||||
MetaCompScreen *info = user_data;
|
||||
GList *l;
|
||||
|
||||
if (event == COGL_FRAME_EVENT_COMPLETE)
|
||||
{
|
||||
gint64 presentation_time_cogl = cogl_frame_info_get_presentation_time (frame_info);
|
||||
gint64 presentation_time;
|
||||
|
||||
if (presentation_time_cogl != 0)
|
||||
{
|
||||
/* Cogl reports presentation in terms of its own clock, which is
|
||||
* guaranteed to be in nanoseconds but with no specified base. The
|
||||
* normal case with the open source GPU drivers on Linux 3.8 and
|
||||
* newer is that the base of cogl_get_clock_time() is that of
|
||||
* clock_gettime(CLOCK_MONOTONIC), so the same as g_get_monotonic_time),
|
||||
* but there's no exposure of that through the API. clock_gettime()
|
||||
* is fairly fast, so calling it twice and subtracting to get a
|
||||
* nearly-zero number is acceptable, if a litle ugly.
|
||||
*/
|
||||
CoglContext *context = cogl_framebuffer_get_context (COGL_FRAMEBUFFER (onscreen));
|
||||
gint64 current_cogl_time = cogl_get_clock_time (context);
|
||||
gint64 current_monotonic_time = g_get_monotonic_time ();
|
||||
|
||||
presentation_time =
|
||||
current_monotonic_time + (presentation_time_cogl - current_cogl_time) / 1000;
|
||||
}
|
||||
else
|
||||
{
|
||||
presentation_time = 0;
|
||||
}
|
||||
|
||||
for (l = info->windows; l; l = l->next)
|
||||
meta_window_actor_frame_complete (l->data, frame_info, presentation_time);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
pre_paint_windows (MetaCompScreen *info)
|
||||
{
|
||||
@@ -1189,6 +1426,15 @@ pre_paint_windows (MetaCompScreen *info)
|
||||
MetaWindowActor *top_window;
|
||||
MetaWindowActor *expected_unredirected_window = NULL;
|
||||
|
||||
if (info->onscreen == NULL)
|
||||
{
|
||||
info->onscreen = COGL_ONSCREEN (cogl_get_draw_framebuffer ());
|
||||
info->frame_closure = cogl_onscreen_add_frame_callback (info->onscreen,
|
||||
frame_callback,
|
||||
info,
|
||||
NULL);
|
||||
}
|
||||
|
||||
if (info->windows == NULL)
|
||||
return;
|
||||
|
||||
@@ -1263,6 +1509,7 @@ on_shadow_factory_changed (MetaShadowFactory *factory,
|
||||
|
||||
/**
|
||||
* meta_compositor_new: (skip)
|
||||
* @display:
|
||||
*
|
||||
*/
|
||||
MetaCompositor *
|
||||
@@ -1307,6 +1554,7 @@ meta_compositor_new (MetaDisplay *display)
|
||||
|
||||
/**
|
||||
* meta_get_overlay_window: (skip)
|
||||
* @screen: a #MetaScreen
|
||||
*
|
||||
*/
|
||||
Window
|
||||
@@ -1344,50 +1592,100 @@ void
|
||||
meta_enable_unredirect_for_screen (MetaScreen *screen)
|
||||
{
|
||||
MetaCompScreen *info = meta_screen_get_compositor_data (screen);
|
||||
if (info != NULL)
|
||||
info->disable_unredirect_count = MAX(0, info->disable_unredirect_count - 1);
|
||||
if (info != NULL && info->disable_unredirect_count == 0)
|
||||
g_warning ("Called enable_unredirect_for_screen while unredirection is enabled.");
|
||||
if (info != NULL && info->disable_unredirect_count > 0)
|
||||
info->disable_unredirect_count = info->disable_unredirect_count - 1;
|
||||
}
|
||||
|
||||
#define FLASH_TIME_MS 50
|
||||
|
||||
static void
|
||||
flash_out_completed (ClutterAnimation *animation,
|
||||
ClutterActor *flash)
|
||||
flash_out_completed (ClutterTimeline *timeline,
|
||||
gboolean is_finished,
|
||||
gpointer user_data)
|
||||
{
|
||||
ClutterActor *flash = CLUTTER_ACTOR (user_data);
|
||||
clutter_actor_destroy (flash);
|
||||
}
|
||||
|
||||
static void
|
||||
flash_in_completed (ClutterAnimation *animation,
|
||||
ClutterActor *flash)
|
||||
{
|
||||
clutter_actor_animate (flash, CLUTTER_EASE_IN_QUAD,
|
||||
FLASH_TIME_MS,
|
||||
"opacity", 0,
|
||||
"signal-after::completed", flash_out_completed, flash,
|
||||
NULL);
|
||||
}
|
||||
|
||||
void
|
||||
meta_compositor_flash_screen (MetaCompositor *compositor,
|
||||
MetaScreen *screen)
|
||||
{
|
||||
ClutterActor *stage;
|
||||
ClutterActor *flash;
|
||||
ClutterColor black = { 0, 0, 0, 255 };
|
||||
ClutterTransition *transition;
|
||||
gfloat width, height;
|
||||
|
||||
stage = meta_get_stage_for_screen (screen);
|
||||
clutter_actor_get_size (stage, &width, &height);
|
||||
|
||||
flash = clutter_rectangle_new_with_color (&black);
|
||||
flash = clutter_actor_new ();
|
||||
clutter_actor_set_background_color (flash, CLUTTER_COLOR_Black);
|
||||
clutter_actor_set_size (flash, width, height);
|
||||
clutter_actor_set_opacity (flash, 0);
|
||||
clutter_container_add_actor (CLUTTER_CONTAINER (stage), flash);
|
||||
clutter_actor_add_child (stage, flash);
|
||||
|
||||
clutter_actor_animate (flash, CLUTTER_EASE_OUT_QUAD,
|
||||
FLASH_TIME_MS,
|
||||
"opacity", 192,
|
||||
"signal-after::completed", flash_in_completed, flash,
|
||||
NULL);
|
||||
clutter_actor_save_easing_state (flash);
|
||||
clutter_actor_set_easing_mode (flash, CLUTTER_EASE_IN_QUAD);
|
||||
clutter_actor_set_easing_duration (flash, FLASH_TIME_MS);
|
||||
clutter_actor_set_opacity (flash, 192);
|
||||
|
||||
transition = clutter_actor_get_transition (flash, "opacity");
|
||||
clutter_timeline_set_auto_reverse (CLUTTER_TIMELINE (transition), TRUE);
|
||||
clutter_timeline_set_repeat_count (CLUTTER_TIMELINE (transition), 2);
|
||||
|
||||
g_signal_connect (transition, "stopped",
|
||||
G_CALLBACK (flash_out_completed), flash);
|
||||
|
||||
clutter_actor_restore_easing_state (flash);
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_compositor_monotonic_time_to_server_time:
|
||||
* @display: a #MetaDisplay
|
||||
* @monotonic_time: time in the units of g_get_monotonic_time()
|
||||
*
|
||||
* _NET_WM_FRAME_DRAWN and _NET_WM_FRAME_TIMINGS messages represent time
|
||||
* as a "high resolution server time" - this is the server time interpolated
|
||||
* to microsecond resolution. The advantage of this time representation
|
||||
* is that if X server is running on the same computer as a client, and
|
||||
* the Xserver uses 'clock_gettime(CLOCK_MONOTONIC, ...)' for the server
|
||||
* time, the client can detect this, and all such clients will share a
|
||||
* a time representation with high accuracy. If there is not a common
|
||||
* time source, then the time synchronization will be less accurate.
|
||||
*/
|
||||
gint64
|
||||
meta_compositor_monotonic_time_to_server_time (MetaDisplay *display,
|
||||
gint64 monotonic_time)
|
||||
{
|
||||
MetaCompositor *compositor = display->compositor;
|
||||
|
||||
if (compositor->server_time_query_time == 0 ||
|
||||
(!compositor->server_time_is_monotonic_time &&
|
||||
monotonic_time > compositor->server_time_query_time + 10*1000*1000)) /* 10 seconds */
|
||||
{
|
||||
guint32 server_time = meta_display_get_current_time_roundtrip (display);
|
||||
gint64 server_time_usec = (gint64)server_time * 1000;
|
||||
gint64 current_monotonic_time = g_get_monotonic_time ();
|
||||
compositor->server_time_query_time = current_monotonic_time;
|
||||
|
||||
/* If the server time is within a second of the monotonic time,
|
||||
* we assume that they are identical. This seems like a big margin,
|
||||
* but we want to be as robust as possible even if the system
|
||||
* is under load and our processing of the server response is
|
||||
* delayed.
|
||||
*/
|
||||
if (server_time_usec > current_monotonic_time - 1000*1000 &&
|
||||
server_time_usec < current_monotonic_time + 1000*1000)
|
||||
compositor->server_time_is_monotonic_time = TRUE;
|
||||
|
||||
compositor->server_time_offset = server_time_usec - current_monotonic_time;
|
||||
}
|
||||
|
||||
if (compositor->server_time_is_monotonic_time)
|
||||
return monotonic_time;
|
||||
else
|
||||
return monotonic_time + compositor->server_time_offset;
|
||||
}
|
||||
|
@@ -6,10 +6,9 @@
|
||||
#include <meta/screen.h>
|
||||
#include <meta/meta-background-actor.h>
|
||||
|
||||
void meta_background_actor_set_visible_region (MetaBackgroundActor *self,
|
||||
cairo_region_t *visible_region);
|
||||
void meta_background_actor_set_clip_region (MetaBackgroundActor *self,
|
||||
cairo_region_t *clip_region);
|
||||
|
||||
void meta_background_actor_update (MetaScreen *screen);
|
||||
void meta_background_actor_screen_size_changed (MetaScreen *screen);
|
||||
cairo_region_t *meta_background_actor_get_clip_region (MetaBackgroundActor *self);
|
||||
|
||||
#endif /* META_BACKGROUND_ACTOR_PRIVATE_H */
|
||||
|
@@ -1,7 +1,5 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
/*
|
||||
* meta-background-actor.c: Actor for painting the root window background
|
||||
*
|
||||
* Copyright 2009 Sander Dijkhuis
|
||||
* Copyright 2010 Red Hat, Inc.
|
||||
*
|
||||
@@ -23,12 +21,17 @@
|
||||
* Portions adapted from gnome-shell/src/shell-global.c
|
||||
*/
|
||||
|
||||
/**
|
||||
* SECTION:meta-background-actor
|
||||
* @title: MetaBackgroundActor
|
||||
* @short_description: Actor for painting the root window background
|
||||
*
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#define COGL_ENABLE_EXPERIMENTAL_API
|
||||
#include <cogl/cogl-texture-pixmap-x11.h>
|
||||
|
||||
#define CLUTTER_ENABLE_EXPERIMENTAL_API
|
||||
#include <clutter/clutter.h>
|
||||
|
||||
#include <X11/Xatom.h>
|
||||
@@ -36,222 +39,22 @@
|
||||
#include "cogl-utils.h"
|
||||
#include "compositor-private.h"
|
||||
#include <meta/errors.h>
|
||||
#include <meta/meta-background.h>
|
||||
#include "meta-background-actor-private.h"
|
||||
|
||||
/* We allow creating multiple MetaBackgroundActors for the same MetaScreen to
|
||||
* allow different rendering options to be set for different copies.
|
||||
* But we want to share the same underlying CoglTexture for efficiency and
|
||||
* to avoid driver bugs that might occur if we created multiple CoglTexturePixmaps
|
||||
* for the same pixmap.
|
||||
*
|
||||
* This structure holds common information.
|
||||
*/
|
||||
typedef struct _MetaScreenBackground MetaScreenBackground;
|
||||
|
||||
struct _MetaScreenBackground
|
||||
{
|
||||
MetaScreen *screen;
|
||||
GSList *actors;
|
||||
|
||||
float texture_width;
|
||||
float texture_height;
|
||||
CoglTexture *texture;
|
||||
CoglMaterialWrapMode wrap_mode;
|
||||
guint have_pixmap : 1;
|
||||
};
|
||||
|
||||
struct _MetaBackgroundActorPrivate
|
||||
{
|
||||
MetaScreenBackground *background;
|
||||
CoglPipeline *pipeline;
|
||||
|
||||
cairo_region_t *visible_region;
|
||||
float dim_factor;
|
||||
cairo_region_t *clip_region;
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
PROP_0,
|
||||
|
||||
PROP_DIM_FACTOR,
|
||||
|
||||
PROP_LAST
|
||||
};
|
||||
|
||||
static GParamSpec *obj_props[PROP_LAST];
|
||||
|
||||
G_DEFINE_TYPE (MetaBackgroundActor, meta_background_actor, CLUTTER_TYPE_ACTOR);
|
||||
|
||||
static void set_texture (MetaScreenBackground *background,
|
||||
CoglHandle texture);
|
||||
static void set_texture_to_stage_color (MetaScreenBackground *background);
|
||||
|
||||
static void
|
||||
on_notify_stage_color (GObject *stage,
|
||||
GParamSpec *pspec,
|
||||
MetaScreenBackground *background)
|
||||
{
|
||||
if (!background->have_pixmap)
|
||||
set_texture_to_stage_color (background);
|
||||
}
|
||||
|
||||
static void
|
||||
free_screen_background (MetaScreenBackground *background)
|
||||
{
|
||||
set_texture (background, COGL_INVALID_HANDLE);
|
||||
|
||||
if (background->screen != NULL)
|
||||
{
|
||||
ClutterActor *stage = meta_get_stage_for_screen (background->screen);
|
||||
g_signal_handlers_disconnect_by_func (stage,
|
||||
(gpointer) on_notify_stage_color,
|
||||
background);
|
||||
background->screen = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static MetaScreenBackground *
|
||||
meta_screen_background_get (MetaScreen *screen)
|
||||
{
|
||||
MetaScreenBackground *background;
|
||||
|
||||
background = g_object_get_data (G_OBJECT (screen), "meta-screen-background");
|
||||
if (background == NULL)
|
||||
{
|
||||
ClutterActor *stage;
|
||||
|
||||
background = g_new0 (MetaScreenBackground, 1);
|
||||
|
||||
background->screen = screen;
|
||||
g_object_set_data_full (G_OBJECT (screen), "meta-screen-background",
|
||||
background, (GDestroyNotify) free_screen_background);
|
||||
|
||||
stage = meta_get_stage_for_screen (screen);
|
||||
g_signal_connect (stage, "notify::color",
|
||||
G_CALLBACK (on_notify_stage_color), background);
|
||||
|
||||
meta_background_actor_update (screen);
|
||||
}
|
||||
|
||||
return background;
|
||||
}
|
||||
|
||||
static void
|
||||
update_wrap_mode_of_actor (MetaBackgroundActor *self)
|
||||
{
|
||||
MetaBackgroundActorPrivate *priv = self->priv;
|
||||
|
||||
cogl_pipeline_set_layer_wrap_mode (priv->pipeline, 0, priv->background->wrap_mode);
|
||||
}
|
||||
|
||||
static void
|
||||
update_wrap_mode (MetaScreenBackground *background)
|
||||
{
|
||||
GSList *l;
|
||||
int width, height;
|
||||
|
||||
meta_screen_get_size (background->screen, &width, &height);
|
||||
|
||||
/* We turn off repeating when we have a full-screen pixmap to keep from
|
||||
* getting artifacts from one side of the image sneaking into the other
|
||||
* side of the image via bilinear filtering.
|
||||
*/
|
||||
if (width == background->texture_width && height == background->texture_height)
|
||||
background->wrap_mode = COGL_MATERIAL_WRAP_MODE_CLAMP_TO_EDGE;
|
||||
else
|
||||
background->wrap_mode = COGL_MATERIAL_WRAP_MODE_REPEAT;
|
||||
|
||||
for (l = background->actors; l; l = l->next)
|
||||
update_wrap_mode_of_actor (l->data);
|
||||
}
|
||||
|
||||
static void
|
||||
set_texture_on_actor (MetaBackgroundActor *self)
|
||||
{
|
||||
MetaBackgroundActorPrivate *priv = self->priv;
|
||||
MetaDisplay *display = meta_screen_get_display (priv->background->screen);
|
||||
|
||||
/* This may trigger destruction of an old texture pixmap, which, if
|
||||
* the underlying X pixmap is already gone has the tendency to trigger
|
||||
* X errors inside DRI. For safety, trap errors */
|
||||
meta_error_trap_push (display);
|
||||
cogl_pipeline_set_layer_texture (priv->pipeline, 0, priv->background->texture);
|
||||
meta_error_trap_pop (display);
|
||||
|
||||
clutter_actor_queue_redraw (CLUTTER_ACTOR (self));
|
||||
}
|
||||
|
||||
static void
|
||||
set_texture (MetaScreenBackground *background,
|
||||
CoglHandle texture)
|
||||
{
|
||||
MetaDisplay *display = meta_screen_get_display (background->screen);
|
||||
GSList *l;
|
||||
|
||||
/* This may trigger destruction of an old texture pixmap, which, if
|
||||
* the underlying X pixmap is already gone has the tendency to trigger
|
||||
* X errors inside DRI. For safety, trap errors */
|
||||
meta_error_trap_push (display);
|
||||
if (background->texture != COGL_INVALID_HANDLE)
|
||||
{
|
||||
cogl_handle_unref (background->texture);
|
||||
background->texture = COGL_INVALID_HANDLE;
|
||||
}
|
||||
meta_error_trap_pop (display);
|
||||
|
||||
if (texture != COGL_INVALID_HANDLE)
|
||||
background->texture = cogl_handle_ref (texture);
|
||||
|
||||
background->texture_width = cogl_texture_get_width (background->texture);
|
||||
background->texture_height = cogl_texture_get_height (background->texture);
|
||||
|
||||
for (l = background->actors; l; l = l->next)
|
||||
set_texture_on_actor (l->data);
|
||||
|
||||
update_wrap_mode (background);
|
||||
}
|
||||
|
||||
/* Sets our pipeline to paint with a 1x1 texture of the stage's background
|
||||
* color; doing this when we have no pixmap allows the application to turn
|
||||
* off painting the stage. There might be a performance benefit to
|
||||
* painting in this case with a solid color, but the normal solid color
|
||||
* case is a 1x1 root pixmap, so we'd have to reverse-engineer that to
|
||||
* actually pick up the (small?) performance win. This is just a fallback.
|
||||
*/
|
||||
static void
|
||||
set_texture_to_stage_color (MetaScreenBackground *background)
|
||||
{
|
||||
ClutterActor *stage = meta_get_stage_for_screen (background->screen);
|
||||
ClutterColor color;
|
||||
CoglHandle texture;
|
||||
|
||||
clutter_stage_get_color (CLUTTER_STAGE (stage), &color);
|
||||
|
||||
/* Slicing will prevent COGL from using hardware texturing for
|
||||
* the tiled 1x1 pixmap, and will cause it to draw the window
|
||||
* background in millions of separate 1x1 rectangles */
|
||||
texture = meta_create_color_texture_4ub (color.red, color.green,
|
||||
color.blue, 0xff,
|
||||
COGL_TEXTURE_NO_SLICING);
|
||||
set_texture (background, texture);
|
||||
cogl_handle_unref (texture);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_background_actor_dispose (GObject *object)
|
||||
{
|
||||
MetaBackgroundActor *self = META_BACKGROUND_ACTOR (object);
|
||||
MetaBackgroundActorPrivate *priv = self->priv;
|
||||
|
||||
meta_background_actor_set_visible_region (self, NULL);
|
||||
|
||||
if (priv->background != NULL)
|
||||
{
|
||||
priv->background->actors = g_slist_remove (priv->background->actors, self);
|
||||
priv->background = NULL;
|
||||
}
|
||||
|
||||
g_clear_pointer(&priv->pipeline, cogl_object_unref);
|
||||
meta_background_actor_set_clip_region (self, NULL);
|
||||
|
||||
G_OBJECT_CLASS (meta_background_actor_parent_class)->dispose (object);
|
||||
}
|
||||
@@ -262,11 +65,15 @@ meta_background_actor_get_preferred_width (ClutterActor *actor,
|
||||
gfloat *min_width_p,
|
||||
gfloat *natural_width_p)
|
||||
{
|
||||
MetaBackgroundActor *self = META_BACKGROUND_ACTOR (actor);
|
||||
MetaBackgroundActorPrivate *priv = self->priv;
|
||||
int width, height;
|
||||
ClutterContent *content;
|
||||
gfloat width;
|
||||
|
||||
meta_screen_get_size (priv->background->screen, &width, &height);
|
||||
content = clutter_actor_get_content (actor);
|
||||
|
||||
if (content)
|
||||
clutter_content_get_preferred_size (content, &width, NULL);
|
||||
else
|
||||
width = 0;
|
||||
|
||||
if (min_width_p)
|
||||
*min_width_p = width;
|
||||
@@ -281,11 +88,15 @@ meta_background_actor_get_preferred_height (ClutterActor *actor,
|
||||
gfloat *natural_height_p)
|
||||
|
||||
{
|
||||
MetaBackgroundActor *self = META_BACKGROUND_ACTOR (actor);
|
||||
MetaBackgroundActorPrivate *priv = self->priv;
|
||||
int width, height;
|
||||
ClutterContent *content;
|
||||
gfloat height;
|
||||
|
||||
meta_screen_get_size (priv->background->screen, &width, &height);
|
||||
content = clutter_actor_get_content (actor);
|
||||
|
||||
if (content)
|
||||
clutter_content_get_preferred_size (content, NULL, &height);
|
||||
else
|
||||
height = 0;
|
||||
|
||||
if (min_height_p)
|
||||
*min_height_p = height;
|
||||
@@ -293,64 +104,19 @@ meta_background_actor_get_preferred_height (ClutterActor *actor,
|
||||
*natural_height_p = height;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_background_actor_paint (ClutterActor *actor)
|
||||
{
|
||||
MetaBackgroundActor *self = META_BACKGROUND_ACTOR (actor);
|
||||
MetaBackgroundActorPrivate *priv = self->priv;
|
||||
guint8 opacity = clutter_actor_get_paint_opacity (actor);
|
||||
guint8 color_component;
|
||||
int width, height;
|
||||
|
||||
meta_screen_get_size (priv->background->screen, &width, &height);
|
||||
|
||||
color_component = (int)(0.5 + opacity * priv->dim_factor);
|
||||
|
||||
cogl_pipeline_set_color4ub (priv->pipeline,
|
||||
color_component,
|
||||
color_component,
|
||||
color_component,
|
||||
opacity);
|
||||
|
||||
cogl_set_source (priv->pipeline);
|
||||
|
||||
if (priv->visible_region)
|
||||
{
|
||||
int n_rectangles = cairo_region_num_rectangles (priv->visible_region);
|
||||
int i;
|
||||
|
||||
for (i = 0; i < n_rectangles; i++)
|
||||
{
|
||||
cairo_rectangle_int_t rect;
|
||||
cairo_region_get_rectangle (priv->visible_region, i, &rect);
|
||||
|
||||
cogl_rectangle_with_texture_coords (rect.x, rect.y,
|
||||
rect.x + rect.width, rect.y + rect.height,
|
||||
rect.x / priv->background->texture_width,
|
||||
rect.y / priv->background->texture_height,
|
||||
(rect.x + rect.width) / priv->background->texture_width,
|
||||
(rect.y + rect.height) / priv->background->texture_height);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
cogl_rectangle_with_texture_coords (0.0f, 0.0f,
|
||||
width, height,
|
||||
0.0f, 0.0f,
|
||||
width / priv->background->texture_width,
|
||||
height / priv->background->texture_height);
|
||||
}
|
||||
}
|
||||
|
||||
static gboolean
|
||||
meta_background_actor_get_paint_volume (ClutterActor *actor,
|
||||
ClutterPaintVolume *volume)
|
||||
{
|
||||
MetaBackgroundActor *self = META_BACKGROUND_ACTOR (actor);
|
||||
MetaBackgroundActorPrivate *priv = self->priv;
|
||||
int width, height;
|
||||
ClutterContent *content;
|
||||
gfloat width, height;
|
||||
|
||||
meta_screen_get_size (priv->background->screen, &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);
|
||||
@@ -358,227 +124,60 @@ meta_background_actor_get_paint_volume (ClutterActor *actor,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_background_actor_set_dim_factor (MetaBackgroundActor *self,
|
||||
gfloat dim_factor)
|
||||
{
|
||||
MetaBackgroundActorPrivate *priv = self->priv;
|
||||
|
||||
if (priv->dim_factor == dim_factor)
|
||||
return;
|
||||
|
||||
priv->dim_factor = dim_factor;
|
||||
|
||||
clutter_actor_queue_redraw (CLUTTER_ACTOR (self));
|
||||
|
||||
g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_DIM_FACTOR]);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_background_actor_get_property(GObject *object,
|
||||
guint prop_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
MetaBackgroundActor *self = META_BACKGROUND_ACTOR (object);
|
||||
MetaBackgroundActorPrivate *priv = self->priv;
|
||||
|
||||
switch (prop_id)
|
||||
{
|
||||
case PROP_DIM_FACTOR:
|
||||
g_value_set_float (value, priv->dim_factor);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
meta_background_actor_set_property(GObject *object,
|
||||
guint prop_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
MetaBackgroundActor *self = META_BACKGROUND_ACTOR (object);
|
||||
|
||||
switch (prop_id)
|
||||
{
|
||||
case PROP_DIM_FACTOR:
|
||||
meta_background_actor_set_dim_factor (self, g_value_get_float (value));
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
meta_background_actor_class_init (MetaBackgroundActorClass *klass)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass);
|
||||
GParamSpec *pspec;
|
||||
|
||||
g_type_class_add_private (klass, sizeof (MetaBackgroundActorPrivate));
|
||||
|
||||
object_class->dispose = meta_background_actor_dispose;
|
||||
object_class->get_property = meta_background_actor_get_property;
|
||||
object_class->set_property = meta_background_actor_set_property;
|
||||
|
||||
actor_class->get_preferred_width = meta_background_actor_get_preferred_width;
|
||||
actor_class->get_preferred_height = meta_background_actor_get_preferred_height;
|
||||
actor_class->paint = meta_background_actor_paint;
|
||||
actor_class->get_paint_volume = meta_background_actor_get_paint_volume;
|
||||
|
||||
/**
|
||||
* MetaBackgroundActor:dim-factor:
|
||||
*
|
||||
* Factor to dim the background by, between 0.0 (black) and 1.0 (original
|
||||
* colors)
|
||||
*/
|
||||
pspec = g_param_spec_float ("dim-factor",
|
||||
"Dim factor",
|
||||
"Factor to dim the background by",
|
||||
0.0, 1.0,
|
||||
1.0,
|
||||
G_PARAM_READWRITE);
|
||||
obj_props[PROP_DIM_FACTOR] = pspec;
|
||||
g_object_class_install_property (object_class, PROP_DIM_FACTOR, pspec);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_background_actor_init (MetaBackgroundActor *self)
|
||||
{
|
||||
MetaBackgroundActorPrivate *priv;
|
||||
|
||||
priv = self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
|
||||
META_TYPE_BACKGROUND_ACTOR,
|
||||
MetaBackgroundActorPrivate);
|
||||
priv->dim_factor = 1.0;
|
||||
self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
|
||||
META_TYPE_BACKGROUND_ACTOR,
|
||||
MetaBackgroundActorPrivate);
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_background_actor_new:
|
||||
* @screen: the #MetaScreen
|
||||
*
|
||||
* Creates a new actor to draw the background for the given screen.
|
||||
* Creates a new actor to draw the background for the given monitor.
|
||||
* This actor should be associated with a #MetaBackground using
|
||||
* clutter_actor_set_content()
|
||||
*
|
||||
* Return value: the newly created background actor
|
||||
*/
|
||||
ClutterActor *
|
||||
meta_background_actor_new_for_screen (MetaScreen *screen)
|
||||
meta_background_actor_new (void)
|
||||
{
|
||||
MetaBackgroundActor *self;
|
||||
MetaBackgroundActorPrivate *priv;
|
||||
|
||||
g_return_val_if_fail (META_IS_SCREEN (screen), NULL);
|
||||
|
||||
self = g_object_new (META_TYPE_BACKGROUND_ACTOR, NULL);
|
||||
priv = self->priv;
|
||||
|
||||
priv->background = meta_screen_background_get (screen);
|
||||
priv->background->actors = g_slist_prepend (priv->background->actors, self);
|
||||
|
||||
/* A CoglMaterial and a CoglPipeline are the same thing */
|
||||
priv->pipeline = (CoglPipeline*) meta_create_texture_material (NULL);
|
||||
|
||||
set_texture_on_actor (self);
|
||||
update_wrap_mode_of_actor (self);
|
||||
|
||||
return CLUTTER_ACTOR (self);
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_background_actor_update:
|
||||
* @screen: a #MetaScreen
|
||||
*
|
||||
* Refetches the _XROOTPMAP_ID property for the root window and updates
|
||||
* the contents of the background actor based on that. There's no attempt
|
||||
* to optimize out pixmap values that don't change (since a root pixmap
|
||||
* could be replaced by with another pixmap with the same ID under some
|
||||
* circumstances), so this should only be called when we actually receive
|
||||
* a PropertyNotify event for the property.
|
||||
*/
|
||||
void
|
||||
meta_background_actor_update (MetaScreen *screen)
|
||||
{
|
||||
MetaScreenBackground *background;
|
||||
MetaDisplay *display;
|
||||
MetaCompositor *compositor;
|
||||
Atom type;
|
||||
int format;
|
||||
gulong nitems;
|
||||
gulong bytes_after;
|
||||
guchar *data;
|
||||
Pixmap root_pixmap_id;
|
||||
|
||||
background = meta_screen_background_get (screen);
|
||||
display = meta_screen_get_display (screen);
|
||||
compositor = meta_display_get_compositor (display);
|
||||
|
||||
root_pixmap_id = None;
|
||||
if (!XGetWindowProperty (meta_display_get_xdisplay (display),
|
||||
meta_screen_get_xroot (screen),
|
||||
compositor->atom_x_root_pixmap,
|
||||
0, LONG_MAX,
|
||||
False,
|
||||
AnyPropertyType,
|
||||
&type, &format, &nitems, &bytes_after, &data) &&
|
||||
type != None)
|
||||
{
|
||||
/* Got a property. */
|
||||
if (type == XA_PIXMAP && format == 32 && nitems == 1)
|
||||
{
|
||||
/* Was what we expected. */
|
||||
root_pixmap_id = *(Pixmap *)data;
|
||||
}
|
||||
|
||||
XFree(data);
|
||||
}
|
||||
|
||||
if (root_pixmap_id != None)
|
||||
{
|
||||
CoglHandle texture;
|
||||
CoglContext *ctx = clutter_backend_get_cogl_context (clutter_get_default_backend ());
|
||||
GError *error = NULL;
|
||||
|
||||
meta_error_trap_push (display);
|
||||
texture = cogl_texture_pixmap_x11_new (ctx, root_pixmap_id, FALSE, &error);
|
||||
meta_error_trap_pop (display);
|
||||
|
||||
if (texture != COGL_INVALID_HANDLE)
|
||||
{
|
||||
set_texture (background, texture);
|
||||
cogl_handle_unref (texture);
|
||||
|
||||
background->have_pixmap = True;
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
g_warning ("Failed to create background texture from pixmap: %s",
|
||||
error->message);
|
||||
g_error_free (error);
|
||||
}
|
||||
}
|
||||
|
||||
background->have_pixmap = False;
|
||||
set_texture_to_stage_color (background);
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_background_actor_set_visible_region:
|
||||
* meta_background_actor_set_clip_region:
|
||||
* @self: a #MetaBackgroundActor
|
||||
* @visible_region: (allow-none): the area of the actor (in allocate-relative
|
||||
* @clip_region: (allow-none): the area of the actor (in allocate-relative
|
||||
* 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)
|
||||
meta_background_actor_set_clip_region (MetaBackgroundActor *self,
|
||||
cairo_region_t *clip_region)
|
||||
{
|
||||
MetaBackgroundActorPrivate *priv;
|
||||
|
||||
@@ -586,120 +185,44 @@ meta_background_actor_set_visible_region (MetaBackgroundActor *self,
|
||||
|
||||
priv = self->priv;
|
||||
|
||||
if (priv->visible_region)
|
||||
{
|
||||
cairo_region_destroy (priv->visible_region);
|
||||
priv->visible_region = NULL;
|
||||
}
|
||||
g_clear_pointer (&priv->clip_region,
|
||||
(GDestroyNotify)
|
||||
cairo_region_destroy);
|
||||
|
||||
if (visible_region)
|
||||
{
|
||||
cairo_rectangle_int_t screen_rect = { 0 };
|
||||
meta_screen_get_size (priv->background->screen, &screen_rect.width, &screen_rect.height);
|
||||
|
||||
/* Doing the intersection here is probably unnecessary - MetaWindowGroup
|
||||
* should never compute a visible area that's larger than the root screen!
|
||||
* but it's not that expensive and adds some extra robustness.
|
||||
*/
|
||||
priv->visible_region = cairo_region_create_rectangle (&screen_rect);
|
||||
cairo_region_intersect (priv->visible_region, visible_region);
|
||||
}
|
||||
if (clip_region)
|
||||
priv->clip_region = cairo_region_copy (clip_region);
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_background_actor_screen_size_changed:
|
||||
* @screen: a #MetaScreen
|
||||
* meta_background_actor_get_clip_region:
|
||||
* @self: a #MetaBackgroundActor
|
||||
*
|
||||
* Called by the compositor when the size of the #MetaScreen changes
|
||||
* Return value (transfer full): a #cairo_region_t that represents the part of
|
||||
* the background not obscured by other #MetaBackgroundActor or
|
||||
* #MetaWindowActor objects.
|
||||
*/
|
||||
void
|
||||
meta_background_actor_screen_size_changed (MetaScreen *screen)
|
||||
cairo_region_t *
|
||||
meta_background_actor_get_clip_region (MetaBackgroundActor *self)
|
||||
{
|
||||
MetaScreenBackground *background = meta_screen_background_get (screen);
|
||||
GSList *l;
|
||||
MetaBackgroundActorPrivate *priv = self->priv;
|
||||
ClutterActorBox content_box;
|
||||
cairo_rectangle_int_t content_area = { 0 };
|
||||
cairo_region_t *clip_region;
|
||||
|
||||
update_wrap_mode (background);
|
||||
g_return_val_if_fail (META_IS_BACKGROUND_ACTOR (self), NULL);
|
||||
|
||||
for (l = background->actors; l; l = l->next)
|
||||
clutter_actor_queue_relayout (l->data);
|
||||
if (!priv->clip_region)
|
||||
return NULL;
|
||||
|
||||
clutter_actor_get_content_box (CLUTTER_ACTOR (self), &content_box);
|
||||
|
||||
content_area.x = content_box.x1;
|
||||
content_area.y = content_box.y1;
|
||||
content_area.width = content_box.x2 - content_box.x1;
|
||||
content_area.height = content_box.y2 - content_box.y1;
|
||||
|
||||
clip_region = cairo_region_create_rectangle (&content_area);
|
||||
cairo_region_intersect (clip_region, priv->clip_region);
|
||||
|
||||
return clip_region;
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_background_actor_add_glsl_snippet:
|
||||
* @actor: a #MetaBackgroundActor
|
||||
* @hook: where to insert the code
|
||||
* @declarations: GLSL declarations
|
||||
* @code: GLSL code
|
||||
* @is_replace: wheter Cogl code should be replaced by the custom shader
|
||||
*
|
||||
* Adds a GLSL snippet to the pipeline used for drawing the background.
|
||||
* See #CoglSnippet for details.
|
||||
*/
|
||||
void
|
||||
meta_background_actor_add_glsl_snippet (MetaBackgroundActor *actor,
|
||||
MetaSnippetHook hook,
|
||||
const char *declarations,
|
||||
const char *code,
|
||||
gboolean is_replace)
|
||||
{
|
||||
MetaBackgroundActorPrivate *priv;
|
||||
CoglSnippet *snippet;
|
||||
|
||||
g_return_if_fail (META_IS_BACKGROUND_ACTOR (actor));
|
||||
|
||||
priv = actor->priv;
|
||||
|
||||
if (is_replace)
|
||||
{
|
||||
snippet = cogl_snippet_new (hook, declarations, NULL);
|
||||
cogl_snippet_set_replace (snippet, code);
|
||||
}
|
||||
else
|
||||
{
|
||||
snippet = cogl_snippet_new (hook, declarations, code);
|
||||
}
|
||||
|
||||
if (hook == META_SNIPPET_HOOK_VERTEX ||
|
||||
hook == META_SNIPPET_HOOK_FRAGMENT)
|
||||
cogl_pipeline_add_snippet (priv->pipeline, snippet);
|
||||
else
|
||||
cogl_pipeline_add_layer_snippet (priv->pipeline, 0, snippet);
|
||||
|
||||
cogl_object_unref (snippet);
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_background_actor_set_uniform_float:
|
||||
* @actor: a #MetaBackgroundActor
|
||||
* @uniform_name:
|
||||
* @n_components: number of components (for vector uniforms)
|
||||
* @count: number of uniforms (for array uniforms)
|
||||
* @uniform: (array length=uniform_length): the float values to set
|
||||
* @uniform_length: the length of @uniform. Must be exactly @n_components x @count,
|
||||
* and is provided mainly for language bindings.
|
||||
*
|
||||
* Sets a new GLSL uniform to the provided value. This is mostly
|
||||
* useful in congiunction with meta_background_actor_add_glsl_snippet().
|
||||
*/
|
||||
|
||||
void
|
||||
meta_background_actor_set_uniform_float (MetaBackgroundActor *actor,
|
||||
const char *uniform_name,
|
||||
int n_components,
|
||||
int count,
|
||||
const float *uniform,
|
||||
int uniform_length)
|
||||
{
|
||||
MetaBackgroundActorPrivate *priv;
|
||||
|
||||
g_return_if_fail (META_IS_BACKGROUND_ACTOR (actor));
|
||||
g_return_if_fail (uniform_length == n_components * count);
|
||||
|
||||
priv = actor->priv;
|
||||
|
||||
cogl_pipeline_set_uniform_float (priv->pipeline,
|
||||
cogl_pipeline_get_uniform_location (priv->pipeline,
|
||||
uniform_name),
|
||||
n_components, count, uniform);
|
||||
}
|
||||
|
||||
|
11
src/compositor/meta-background-group-private.h
Normal file
11
src/compositor/meta-background-group-private.h
Normal file
@@ -0,0 +1,11 @@
|
||||
/* -*- 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_clip_region (MetaBackgroundGroup *self,
|
||||
cairo_region_t *visible_region);
|
||||
#endif /* META_BACKGROUND_GROUP_PRIVATE_H */
|
110
src/compositor/meta-background-group.c
Normal file
110
src/compositor/meta-background-group.c
Normal file
@@ -0,0 +1,110 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/**
|
||||
* SECTION:meta-background-group
|
||||
* @title: MetaBackgroundGroup
|
||||
* @short_description: Container for background actors
|
||||
*
|
||||
* This class is a subclass of ClutterActor with special handling for
|
||||
* MetaBackgroundActor/MetaBackgroundGroup when painting children.
|
||||
* It makes sure to only draw the parts of the backgrounds not
|
||||
* occluded by opaque windows.
|
||||
*
|
||||
* See #MetaWindowGroup for more information behind the motivation,
|
||||
* and details on implementation.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#include "compositor-private.h"
|
||||
#include "clutter-utils.h"
|
||||
#include "meta-background-actor-private.h"
|
||||
#include "meta-background-group-private.h"
|
||||
|
||||
G_DEFINE_TYPE (MetaBackgroundGroup, meta_background_group, CLUTTER_TYPE_ACTOR);
|
||||
|
||||
struct _MetaBackgroundGroupPrivate
|
||||
{
|
||||
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
|
||||
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;
|
||||
object_class->dispose = meta_background_group_dispose;
|
||||
|
||||
g_type_class_add_private (klass, sizeof (MetaBackgroundGroupPrivate));
|
||||
}
|
||||
|
||||
static void
|
||||
meta_background_group_init (MetaBackgroundGroup *self)
|
||||
{
|
||||
self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
|
||||
META_TYPE_BACKGROUND_GROUP,
|
||||
MetaBackgroundGroupPrivate);
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_background_group_set_clip_region:
|
||||
* @self: a #MetaBackgroundGroup
|
||||
* @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_clip_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_clip_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_clip_region (META_BACKGROUND_GROUP (actor), region);
|
||||
cairo_region_translate (region, x, y);
|
||||
}
|
||||
}
|
||||
g_list_free (children);
|
||||
}
|
||||
|
||||
ClutterActor *
|
||||
meta_background_group_new (void)
|
||||
{
|
||||
MetaBackgroundGroup *background_group;
|
||||
|
||||
background_group = g_object_new (META_TYPE_BACKGROUND_GROUP, NULL);
|
||||
|
||||
return CLUTTER_ACTOR (background_group);
|
||||
}
|
1275
src/compositor/meta-background.c
Normal file
1275
src/compositor/meta-background.c
Normal file
File diff suppressed because it is too large
Load Diff
@@ -192,10 +192,7 @@ meta_module_class_init (MetaModuleClass *klass)
|
||||
static void
|
||||
meta_module_init (MetaModule *self)
|
||||
{
|
||||
MetaModulePrivate *priv;
|
||||
|
||||
self->priv = priv = META_MODULE_GET_PRIVATE (self);
|
||||
|
||||
self->priv = META_MODULE_GET_PRIVATE (self);
|
||||
}
|
||||
|
||||
GType
|
||||
|
@@ -85,12 +85,20 @@ meta_plugin_manager_load (const gchar *plugin_name)
|
||||
g_free (path);
|
||||
}
|
||||
|
||||
static void
|
||||
on_confirm_display_change (MetaMonitorManager *monitors,
|
||||
MetaPluginManager *plugin_mgr)
|
||||
{
|
||||
meta_plugin_manager_confirm_display_change (plugin_mgr);
|
||||
}
|
||||
|
||||
MetaPluginManager *
|
||||
meta_plugin_manager_new (MetaScreen *screen)
|
||||
{
|
||||
MetaPluginManager *plugin_mgr;
|
||||
MetaPluginClass *klass;
|
||||
MetaPlugin *plugin;
|
||||
MetaMonitorManager *monitors;
|
||||
|
||||
plugin_mgr = g_new0 (MetaPluginManager, 1);
|
||||
plugin_mgr->screen = screen;
|
||||
@@ -101,6 +109,10 @@ meta_plugin_manager_new (MetaScreen *screen)
|
||||
if (klass->start)
|
||||
klass->start (plugin);
|
||||
|
||||
monitors = meta_monitor_manager_get ();
|
||||
g_signal_connect (monitors, "confirm-display-change",
|
||||
G_CALLBACK (on_confirm_display_change), plugin_mgr);
|
||||
|
||||
return plugin_mgr;
|
||||
}
|
||||
|
||||
@@ -294,29 +306,23 @@ meta_plugin_manager_filter_keybinding (MetaPluginManager *plugin_mgr,
|
||||
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
|
||||
meta_plugin_manager_xevent_filter (MetaPluginManager *plugin_mgr,
|
||||
XEvent *xev)
|
||||
{
|
||||
MetaPlugin *plugin = plugin_mgr->plugin;
|
||||
|
||||
return _meta_plugin_xevent_filter (plugin, xev);
|
||||
}
|
||||
|
||||
void
|
||||
meta_plugin_manager_confirm_display_change (MetaPluginManager *plugin_mgr)
|
||||
{
|
||||
MetaPlugin *plugin = plugin_mgr->plugin;
|
||||
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin);
|
||||
|
||||
/* We need to make sure that clutter gets certain events, like
|
||||
* 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);
|
||||
if (klass->confirm_display_change)
|
||||
return klass->confirm_display_change (plugin);
|
||||
else
|
||||
return clutter_x11_handle_event (xev) != CLUTTER_X11_FILTER_CONTINUE;
|
||||
return meta_plugin_complete_display_change (plugin, TRUE);
|
||||
}
|
||||
|
@@ -72,5 +72,9 @@ gboolean meta_plugin_manager_filter_keybinding (MetaPluginManager *mgr,
|
||||
|
||||
gboolean meta_plugin_manager_xevent_filter (MetaPluginManager *mgr,
|
||||
XEvent *xev);
|
||||
gboolean _meta_plugin_xevent_filter (MetaPlugin *plugin,
|
||||
XEvent *xev);
|
||||
|
||||
void meta_plugin_manager_confirm_display_change (MetaPluginManager *mgr);
|
||||
|
||||
#endif
|
||||
|
@@ -21,6 +21,13 @@
|
||||
* 02111-1307, USA.
|
||||
*/
|
||||
|
||||
/**
|
||||
* SECTION:meta-plugin
|
||||
* @title: MetaPlugin
|
||||
* @short_description: Entry point for plugins
|
||||
*
|
||||
*/
|
||||
|
||||
#include <meta/meta-plugin.h>
|
||||
#include "meta-plugin-manager.h"
|
||||
#include <meta/screen.h>
|
||||
@@ -34,6 +41,7 @@
|
||||
|
||||
#include "compositor-private.h"
|
||||
#include "meta-window-actor-private.h"
|
||||
#include "monitor-private.h"
|
||||
|
||||
G_DEFINE_ABSTRACT_TYPE (MetaPlugin, meta_plugin, G_TYPE_OBJECT);
|
||||
|
||||
@@ -130,9 +138,7 @@ meta_plugin_class_init (MetaPluginClass *klass)
|
||||
static void
|
||||
meta_plugin_init (MetaPlugin *self)
|
||||
{
|
||||
MetaPluginPrivate *priv;
|
||||
|
||||
self->priv = priv = META_PLUGIN_GET_PRIVATE (self);
|
||||
self->priv = META_PLUGIN_GET_PRIVATE (self);
|
||||
}
|
||||
|
||||
gboolean
|
||||
@@ -177,6 +183,18 @@ _meta_plugin_effect_started (MetaPlugin *plugin)
|
||||
priv->running++;
|
||||
}
|
||||
|
||||
gboolean
|
||||
_meta_plugin_xevent_filter (MetaPlugin *plugin,
|
||||
XEvent *xev)
|
||||
{
|
||||
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin);
|
||||
|
||||
if (klass->xevent_filter && klass->xevent_filter (plugin, xev))
|
||||
return TRUE;
|
||||
else
|
||||
return clutter_x11_handle_event (xev) != CLUTTER_X11_FILTER_CONTINUE;
|
||||
}
|
||||
|
||||
void
|
||||
meta_plugin_switch_workspace_completed (MetaPlugin *plugin)
|
||||
{
|
||||
@@ -259,10 +277,6 @@ meta_plugin_destroy_completed (MetaPlugin *plugin,
|
||||
/**
|
||||
* meta_plugin_begin_modal:
|
||||
* @plugin: a #MetaPlugin
|
||||
* @grab_window: the X window to grab the keyboard and mouse on
|
||||
* @cursor: the cursor to use for the pointer grab, or None,
|
||||
* to use the normal cursor for the grab window and
|
||||
* its descendants.
|
||||
* @options: flags that modify the behavior of the modal grab
|
||||
* @timestamp: the timestamp used for establishing grabs
|
||||
*
|
||||
@@ -283,15 +297,13 @@ meta_plugin_destroy_completed (MetaPlugin *plugin,
|
||||
*/
|
||||
gboolean
|
||||
meta_plugin_begin_modal (MetaPlugin *plugin,
|
||||
Window grab_window,
|
||||
Cursor cursor,
|
||||
MetaModalOptions options,
|
||||
guint32 timestamp)
|
||||
{
|
||||
MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
|
||||
|
||||
return meta_begin_modal_for_plugin (priv->screen, plugin,
|
||||
grab_window, cursor, options, timestamp);
|
||||
options, timestamp);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -331,3 +343,13 @@ meta_plugin_get_screen (MetaPlugin *plugin)
|
||||
|
||||
return priv->screen;
|
||||
}
|
||||
|
||||
void
|
||||
meta_plugin_complete_display_change (MetaPlugin *plugin,
|
||||
gboolean ok)
|
||||
{
|
||||
MetaMonitorManager *manager;
|
||||
|
||||
manager = meta_monitor_manager_get ();
|
||||
meta_monitor_manager_confirm_configuration (manager, ok);
|
||||
}
|
||||
|
@@ -40,7 +40,7 @@ typedef struct _MetaShadow MetaShadow;
|
||||
|
||||
MetaShadow *meta_shadow_ref (MetaShadow *shadow);
|
||||
void meta_shadow_unref (MetaShadow *shadow);
|
||||
CoglHandle meta_shadow_get_texture (MetaShadow *shadow);
|
||||
CoglTexture*meta_shadow_get_texture (MetaShadow *shadow);
|
||||
void meta_shadow_paint (MetaShadow *shadow,
|
||||
int window_x,
|
||||
int window_y,
|
||||
|
@@ -1,9 +1,5 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
/*
|
||||
* MetaShadowFactory:
|
||||
*
|
||||
* Create and cache shadow textures for abritrary window shapes
|
||||
*
|
||||
* Copyright 2010 Red Hat, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
@@ -21,6 +17,13 @@
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
* 02111-1307, USA.
|
||||
*/
|
||||
|
||||
/**
|
||||
* SECTION:meta-shadow-factory
|
||||
* @title: MetaShadowFactory
|
||||
* @short_description: Create and cache shadow textures for abritrary window shapes
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <math.h>
|
||||
#include <string.h>
|
||||
@@ -65,8 +68,8 @@ struct _MetaShadow
|
||||
|
||||
MetaShadowFactory *factory;
|
||||
MetaShadowCacheKey key;
|
||||
CoglHandle texture;
|
||||
CoglHandle material;
|
||||
CoglTexture *texture;
|
||||
CoglPipeline *pipeline;
|
||||
|
||||
/* The outer order is the distance the shadow extends outside the window
|
||||
* shape; the inner border is the unscaled portion inside the window
|
||||
@@ -120,12 +123,12 @@ static guint signals[LAST_SIGNAL] = { 0 };
|
||||
/* The first element in this array also defines the default parameters
|
||||
* for newly created classes */
|
||||
MetaShadowClassInfo default_shadow_classes[] = {
|
||||
{ "normal", { 6, -1, 0, 3, 255 }, { 3, -1, 0, 3, 128 } },
|
||||
{ "dialog", { 6, -1, 0, 3, 255 }, { 3, -1, 0, 3, 128 } },
|
||||
{ "modal_dialog", { 6, -1, 0, 1, 255 }, { 3, -1, 0, 3, 128 } },
|
||||
{ "utility", { 3, -1, 0, 1, 255 }, { 3, -1, 0, 1, 128 } },
|
||||
{ "border", { 6, -1, 0, 3, 255 }, { 3, -1, 0, 3, 128 } },
|
||||
{ "menu", { 6, -1, 0, 3, 255 }, { 3, -1, 0, 0, 128 } },
|
||||
{ "normal", { 6, -1, 0, 3, 128 }, { 3, -1, 0, 3, 32 } },
|
||||
{ "dialog", { 6, -1, 0, 3, 128 }, { 3, -1, 0, 3, 32 } },
|
||||
{ "modal_dialog", { 6, -1, 0, 1, 128 }, { 3, -1, 0, 3, 32 } },
|
||||
{ "utility", { 3, -1, 0, 1, 128 }, { 3, -1, 0, 1, 32 } },
|
||||
{ "border", { 6, -1, 0, 3, 128 }, { 3, -1, 0, 3, 32 } },
|
||||
{ "menu", { 6, -1, 0, 3, 128 }, { 3, -1, 0, 0, 32 } },
|
||||
|
||||
{ "popup-menu", { 1, -1, 0, 1, 128 }, { 1, -1, 0, 1, 128 } },
|
||||
|
||||
@@ -175,8 +178,8 @@ meta_shadow_unref (MetaShadow *shadow)
|
||||
}
|
||||
|
||||
meta_window_shape_unref (shadow->key.shape);
|
||||
cogl_handle_unref (shadow->texture);
|
||||
cogl_handle_unref (shadow->material);
|
||||
cogl_object_unref (shadow->texture);
|
||||
cogl_object_unref (shadow->pipeline);
|
||||
|
||||
g_slice_free (MetaShadow, shadow);
|
||||
}
|
||||
@@ -218,10 +221,10 @@ meta_shadow_paint (MetaShadow *shadow,
|
||||
int dest_y[4];
|
||||
int n_x, n_y;
|
||||
|
||||
cogl_material_set_color4ub (shadow->material,
|
||||
cogl_pipeline_set_color4ub (shadow->pipeline,
|
||||
opacity, opacity, opacity, opacity);
|
||||
|
||||
cogl_set_source (shadow->material);
|
||||
cogl_set_source (shadow->pipeline);
|
||||
|
||||
if (shadow->scale_width)
|
||||
{
|
||||
@@ -801,7 +804,7 @@ make_shadow (MetaShadow *shadow,
|
||||
cairo_region_destroy (column_convolve_region);
|
||||
g_free (buffer);
|
||||
|
||||
shadow->material = meta_create_texture_material (shadow->texture);
|
||||
shadow->pipeline = meta_create_texture_pipeline (shadow->texture);
|
||||
}
|
||||
|
||||
static MetaShadowParams *
|
||||
|
@@ -1,8 +1,4 @@
|
||||
/*
|
||||
* shaped texture
|
||||
*
|
||||
* An actor to draw a masked texture.
|
||||
*
|
||||
* Authored By Neil Roberts <neil@linux.intel.com>
|
||||
* and Jasper St. Pierre <jstpierre@mecheye.net>
|
||||
*
|
||||
@@ -25,10 +21,13 @@
|
||||
* 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
/**
|
||||
* SECTION:meta-shaped-texture
|
||||
* @title: MetaShapedTexture
|
||||
* @short_description: An actor to draw a masked texture.
|
||||
*/
|
||||
|
||||
#define CLUTTER_ENABLE_EXPERIMENTAL_API
|
||||
#define COGL_ENABLE_EXPERIMENTAL_API
|
||||
#include <config.h>
|
||||
|
||||
#include <meta/meta-shaped-texture.h>
|
||||
#include "meta-texture-tower.h"
|
||||
@@ -67,12 +66,11 @@ struct _MetaShapedTexturePrivate
|
||||
{
|
||||
MetaTextureTower *paint_tower;
|
||||
Pixmap pixmap;
|
||||
CoglHandle texture;
|
||||
CoglHandle mask_texture;
|
||||
CoglHandle material;
|
||||
CoglHandle material_unshaped;
|
||||
CoglTexturePixmapX11 *texture;
|
||||
CoglTexture *mask_texture;
|
||||
|
||||
cairo_region_t *clip_region;
|
||||
cairo_region_t *opaque_region;
|
||||
|
||||
guint tex_width, tex_height;
|
||||
|
||||
@@ -104,8 +102,8 @@ meta_shaped_texture_init (MetaShapedTexture *self)
|
||||
priv = self->priv = META_SHAPED_TEXTURE_GET_PRIVATE (self);
|
||||
|
||||
priv->paint_tower = meta_texture_tower_new ();
|
||||
priv->texture = COGL_INVALID_HANDLE;
|
||||
priv->mask_texture = COGL_INVALID_HANDLE;
|
||||
priv->texture = NULL;
|
||||
priv->mask_texture = NULL;
|
||||
priv->create_mipmaps = TRUE;
|
||||
}
|
||||
|
||||
@@ -119,41 +117,98 @@ meta_shaped_texture_dispose (GObject *object)
|
||||
meta_texture_tower_free (priv->paint_tower);
|
||||
priv->paint_tower = NULL;
|
||||
|
||||
if (priv->material != COGL_INVALID_HANDLE)
|
||||
{
|
||||
cogl_handle_unref (priv->material);
|
||||
priv->material = COGL_INVALID_HANDLE;
|
||||
}
|
||||
if (priv->material_unshaped != COGL_INVALID_HANDLE)
|
||||
{
|
||||
cogl_handle_unref (priv->material_unshaped);
|
||||
priv->material_unshaped = COGL_INVALID_HANDLE;
|
||||
}
|
||||
if (priv->texture != COGL_INVALID_HANDLE)
|
||||
{
|
||||
cogl_handle_unref (priv->texture);
|
||||
priv->texture = COGL_INVALID_HANDLE;
|
||||
}
|
||||
g_clear_pointer (&priv->texture, cogl_object_unref);
|
||||
g_clear_pointer (&priv->opaque_region, cairo_region_destroy);
|
||||
|
||||
meta_shaped_texture_set_mask_texture (self, COGL_INVALID_HANDLE);
|
||||
meta_shaped_texture_set_mask_texture (self, NULL);
|
||||
meta_shaped_texture_set_clip_region (self, NULL);
|
||||
|
||||
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
|
||||
meta_shaped_texture_paint (ClutterActor *actor)
|
||||
{
|
||||
MetaShapedTexture *stex = (MetaShapedTexture *) actor;
|
||||
MetaShapedTexturePrivate *priv = stex->priv;
|
||||
CoglHandle paint_tex;
|
||||
guint tex_width, tex_height;
|
||||
guchar opacity;
|
||||
CoglContext *ctx;
|
||||
CoglFramebuffer *fb;
|
||||
CoglPipeline *pipeline = NULL;
|
||||
CoglTexture *paint_tex;
|
||||
ClutterActorBox alloc;
|
||||
|
||||
static CoglHandle material_template = COGL_INVALID_HANDLE;
|
||||
static CoglHandle material_unshaped_template = COGL_INVALID_HANDLE;
|
||||
|
||||
CoglHandle material;
|
||||
cairo_region_t *blended_region = NULL;
|
||||
|
||||
if (priv->clip_region && cairo_region_is_empty (priv->clip_region))
|
||||
return;
|
||||
@@ -179,9 +234,9 @@ meta_shaped_texture_paint (ClutterActor *actor)
|
||||
if (priv->create_mipmaps)
|
||||
paint_tex = meta_texture_tower_get_paint_texture (priv->paint_tower);
|
||||
else
|
||||
paint_tex = priv->texture;
|
||||
paint_tex = COGL_TEXTURE (priv->texture);
|
||||
|
||||
if (paint_tex == COGL_INVALID_HANDLE)
|
||||
if (paint_tex == NULL)
|
||||
return;
|
||||
|
||||
tex_width = priv->tex_width;
|
||||
@@ -190,101 +245,125 @@ meta_shaped_texture_paint (ClutterActor *actor)
|
||||
if (tex_width == 0 || tex_height == 0) /* no contents yet */
|
||||
return;
|
||||
|
||||
if (priv->mask_texture == COGL_INVALID_HANDLE)
|
||||
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)
|
||||
{
|
||||
/* Use a single-layer texture if we don't have a mask. */
|
||||
CoglPipeline *opaque_pipeline;
|
||||
cairo_region_t *region;
|
||||
int n_rects;
|
||||
int i;
|
||||
|
||||
if (priv->material_unshaped == COGL_INVALID_HANDLE)
|
||||
if (priv->clip_region != NULL)
|
||||
{
|
||||
if (G_UNLIKELY (material_unshaped_template == COGL_INVALID_HANDLE))
|
||||
material_unshaped_template = cogl_material_new ();
|
||||
|
||||
priv->material_unshaped = cogl_material_copy (material_unshaped_template);
|
||||
region = cairo_region_copy (priv->clip_region);
|
||||
cairo_region_intersect (region, priv->opaque_region);
|
||||
}
|
||||
material = priv->material_unshaped;
|
||||
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);
|
||||
|
||||
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)
|
||||
{
|
||||
pipeline = get_unmasked_pipeline (ctx);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (priv->material == COGL_INVALID_HANDLE)
|
||||
{
|
||||
if (G_UNLIKELY (material_template == COGL_INVALID_HANDLE))
|
||||
{
|
||||
material_template = cogl_material_new ();
|
||||
cogl_material_set_layer_combine (material_template, 1,
|
||||
"RGBA = MODULATE (PREVIOUS, TEXTURE[A])",
|
||||
NULL);
|
||||
}
|
||||
priv->material = cogl_material_copy (material_template);
|
||||
}
|
||||
material = priv->material;
|
||||
|
||||
cogl_material_set_layer (material, 1, priv->mask_texture);
|
||||
pipeline = get_masked_pipeline (ctx);
|
||||
cogl_pipeline_set_layer_texture (pipeline, 1, priv->mask_texture);
|
||||
}
|
||||
|
||||
cogl_material_set_layer (material, 0, paint_tex);
|
||||
cogl_pipeline_set_layer_texture (pipeline, 0, paint_tex);
|
||||
|
||||
{
|
||||
CoglColor color;
|
||||
guchar opacity = clutter_actor_get_paint_opacity (actor);
|
||||
cogl_color_set_from_4ub (&color, opacity, opacity, opacity, opacity);
|
||||
cogl_material_set_color (material, &color);
|
||||
cogl_color_init_from_4ub (&color, opacity, opacity, opacity, opacity);
|
||||
cogl_pipeline_set_color (pipeline, &color);
|
||||
}
|
||||
|
||||
cogl_set_source (material);
|
||||
|
||||
clutter_actor_get_allocation_box (actor, &alloc);
|
||||
|
||||
if (priv->clip_region)
|
||||
if (blended_region != NULL)
|
||||
{
|
||||
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
|
||||
* fall back and draw the whole thing */
|
||||
# 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)
|
||||
{
|
||||
float coords[8];
|
||||
float x1, y1, x2, y2;
|
||||
int i;
|
||||
cairo_rectangle_int_t tex_rect = { 0, 0, tex_width, tex_height };
|
||||
|
||||
for (i = 0; i < n_rects; i++)
|
||||
{
|
||||
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))
|
||||
continue;
|
||||
|
||||
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_rectangle_with_multitexture_coords (x1, y1, x2, y2,
|
||||
&coords[0], 8);
|
||||
paint_clipped_rectangle (fb, pipeline, &rect, &alloc);
|
||||
}
|
||||
|
||||
return;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
cogl_rectangle (0, 0,
|
||||
alloc.x2 - alloc.x1,
|
||||
alloc.y2 - alloc.y1);
|
||||
cogl_framebuffer_draw_rectangle (fb, pipeline,
|
||||
0, 0,
|
||||
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
|
||||
@@ -295,18 +374,21 @@ meta_shaped_texture_pick (ClutterActor *actor,
|
||||
MetaShapedTexturePrivate *priv = stex->priv;
|
||||
|
||||
/* If there is no region then use the regular pick */
|
||||
if (priv->mask_texture == COGL_INVALID_HANDLE)
|
||||
CLUTTER_ACTOR_CLASS (meta_shaped_texture_parent_class)
|
||||
->pick (actor, color);
|
||||
if (priv->mask_texture == NULL)
|
||||
CLUTTER_ACTOR_CLASS (meta_shaped_texture_parent_class)->pick (actor, color);
|
||||
else if (clutter_actor_should_pick_paint (actor))
|
||||
{
|
||||
CoglHandle paint_tex;
|
||||
CoglTexture *paint_tex;
|
||||
ClutterActorBox alloc;
|
||||
guint tex_width, tex_height;
|
||||
CoglPipeline *pipeline;
|
||||
CoglContext *ctx;
|
||||
CoglFramebuffer *fb;
|
||||
CoglColor cogl_color;
|
||||
|
||||
paint_tex = priv->texture;
|
||||
paint_tex = COGL_TEXTURE (priv->texture);
|
||||
|
||||
if (paint_tex == COGL_INVALID_HANDLE)
|
||||
if (paint_tex == NULL)
|
||||
return;
|
||||
|
||||
tex_width = cogl_texture_get_width (paint_tex);
|
||||
@@ -315,17 +397,22 @@ meta_shaped_texture_pick (ClutterActor *actor,
|
||||
if (tex_width == 0 || tex_height == 0) /* no contents yet */
|
||||
return;
|
||||
|
||||
cogl_set_source_color4ub (color->red, color->green, color->blue,
|
||||
color->alpha);
|
||||
ctx = clutter_backend_get_cogl_context (clutter_get_default_backend ());
|
||||
fb = cogl_get_draw_framebuffer ();
|
||||
|
||||
cogl_color_init_from_4ub (&cogl_color, color->red, color->green, color->blue, color->alpha);
|
||||
|
||||
pipeline = get_masked_pipeline (ctx);
|
||||
cogl_pipeline_set_layer_texture (pipeline, 1, priv->mask_texture);
|
||||
cogl_pipeline_set_color (pipeline, &cogl_color);
|
||||
|
||||
clutter_actor_get_allocation_box (actor, &alloc);
|
||||
|
||||
/* Paint the mask rectangle in the given color */
|
||||
cogl_set_source_texture (priv->mask_texture);
|
||||
cogl_rectangle_with_texture_coords (0, 0,
|
||||
alloc.x2 - alloc.x1,
|
||||
alloc.y2 - alloc.y1,
|
||||
0, 0, 1, 1);
|
||||
cogl_framebuffer_draw_rectangle (fb, pipeline,
|
||||
0, 0,
|
||||
alloc.x2 - alloc.x1,
|
||||
alloc.y2 - alloc.y1);
|
||||
cogl_object_unref (pipeline);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -396,17 +483,17 @@ meta_shaped_texture_set_create_mipmaps (MetaShapedTexture *stex,
|
||||
|
||||
if (create_mipmaps != priv->create_mipmaps)
|
||||
{
|
||||
CoglHandle base_texture;
|
||||
CoglTexture *base_texture;
|
||||
priv->create_mipmaps = create_mipmaps;
|
||||
base_texture = create_mipmaps ?
|
||||
priv->texture : COGL_INVALID_HANDLE;
|
||||
COGL_TEXTURE (priv->texture) : NULL;
|
||||
meta_texture_tower_set_base_texture (priv->paint_tower, base_texture);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
meta_shaped_texture_set_mask_texture (MetaShapedTexture *stex,
|
||||
CoglHandle mask_texture)
|
||||
CoglTexture *mask_texture)
|
||||
{
|
||||
MetaShapedTexturePrivate *priv;
|
||||
|
||||
@@ -414,46 +501,90 @@ meta_shaped_texture_set_mask_texture (MetaShapedTexture *stex,
|
||||
|
||||
priv = stex->priv;
|
||||
|
||||
if (priv->mask_texture != COGL_INVALID_HANDLE)
|
||||
{
|
||||
cogl_handle_unref (priv->mask_texture);
|
||||
priv->mask_texture = COGL_INVALID_HANDLE;
|
||||
}
|
||||
g_clear_pointer (&priv->mask_texture, cogl_object_unref);
|
||||
|
||||
if (mask_texture != COGL_INVALID_HANDLE)
|
||||
if (mask_texture != NULL)
|
||||
{
|
||||
priv->mask_texture = mask_texture;
|
||||
cogl_handle_ref (priv->mask_texture);
|
||||
cogl_object_ref (priv->mask_texture);
|
||||
}
|
||||
|
||||
clutter_actor_queue_redraw (CLUTTER_ACTOR (stex));
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
/**
|
||||
* 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
|
||||
* @unobscured_region: The unobscured region of the window or %NULL if
|
||||
* there is no valid one (like when the actor is transformed or
|
||||
* has a mapped clone)
|
||||
*
|
||||
* Repairs the damaged area indicated by @x, @y, @width and @height
|
||||
* and queues a redraw for the intersection @visibible_region and
|
||||
* the damage area. If @visibible_region is %NULL a redraw will always
|
||||
* get queued.
|
||||
*
|
||||
* Return value: Whether a redraw have been queued or not
|
||||
*/
|
||||
gboolean
|
||||
meta_shaped_texture_update_area (MetaShapedTexture *stex,
|
||||
int x,
|
||||
int y,
|
||||
int width,
|
||||
int height)
|
||||
int height,
|
||||
cairo_region_t *unobscured_region)
|
||||
{
|
||||
MetaShapedTexturePrivate *priv;
|
||||
const cairo_rectangle_int_t clip = { x, y, width, height };
|
||||
|
||||
priv = stex->priv;
|
||||
|
||||
if (priv->texture == COGL_INVALID_HANDLE)
|
||||
return;
|
||||
if (priv->texture == NULL)
|
||||
return FALSE;
|
||||
|
||||
cogl_texture_pixmap_x11_update_area (priv->texture, x, y, width, height);
|
||||
cogl_texture_pixmap_x11_update_area (priv->texture,
|
||||
x, y, width, height);
|
||||
|
||||
meta_texture_tower_update_area (priv->paint_tower, x, y, width, height);
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
clutter_actor_queue_redraw_with_clip (CLUTTER_ACTOR (stex), &clip);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
set_cogl_texture (MetaShapedTexture *stex,
|
||||
CoglHandle cogl_tex)
|
||||
set_cogl_texture (MetaShapedTexture *stex,
|
||||
CoglTexturePixmapX11 *cogl_tex)
|
||||
{
|
||||
MetaShapedTexturePrivate *priv;
|
||||
guint width, height;
|
||||
@@ -462,21 +593,15 @@ set_cogl_texture (MetaShapedTexture *stex,
|
||||
|
||||
priv = stex->priv;
|
||||
|
||||
if (priv->texture != COGL_INVALID_HANDLE)
|
||||
cogl_handle_unref (priv->texture);
|
||||
if (priv->texture != NULL)
|
||||
cogl_object_unref (priv->texture);
|
||||
|
||||
priv->texture = cogl_tex;
|
||||
|
||||
if (priv->material != COGL_INVALID_HANDLE)
|
||||
cogl_material_set_layer (priv->material, 0, cogl_tex);
|
||||
|
||||
if (priv->material_unshaped != COGL_INVALID_HANDLE)
|
||||
cogl_material_set_layer (priv->material_unshaped, 0, cogl_tex);
|
||||
|
||||
if (cogl_tex != COGL_INVALID_HANDLE)
|
||||
if (cogl_tex != NULL)
|
||||
{
|
||||
width = cogl_texture_get_width (cogl_tex);
|
||||
height = cogl_texture_get_height (cogl_tex);
|
||||
width = cogl_texture_get_width (COGL_TEXTURE (cogl_tex));
|
||||
height = cogl_texture_get_height (COGL_TEXTURE (cogl_tex));
|
||||
|
||||
if (width != priv->tex_width ||
|
||||
height != priv->tex_height)
|
||||
@@ -489,7 +614,7 @@ set_cogl_texture (MetaShapedTexture *stex,
|
||||
}
|
||||
else
|
||||
{
|
||||
/* size changed to 0 going to an invalid handle */
|
||||
/* size changed to 0 going to an inavlid texture */
|
||||
priv->tex_width = 0;
|
||||
priv->tex_height = 0;
|
||||
clutter_actor_queue_relayout (CLUTTER_ACTOR (stex));
|
||||
@@ -525,10 +650,11 @@ meta_shaped_texture_set_pixmap (MetaShapedTexture *stex,
|
||||
set_cogl_texture (stex, cogl_texture_pixmap_x11_new (ctx, pixmap, FALSE, NULL));
|
||||
}
|
||||
else
|
||||
set_cogl_texture (stex, COGL_INVALID_HANDLE);
|
||||
set_cogl_texture (stex, NULL);
|
||||
|
||||
if (priv->create_mipmaps)
|
||||
meta_texture_tower_set_base_texture (priv->paint_tower, priv->texture);
|
||||
meta_texture_tower_set_base_texture (priv->paint_tower,
|
||||
COGL_TEXTURE (priv->texture));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -537,18 +663,18 @@ meta_shaped_texture_set_pixmap (MetaShapedTexture *stex,
|
||||
*
|
||||
* Returns: (transfer none): the unshaped texture
|
||||
*/
|
||||
CoglHandle
|
||||
CoglTexture *
|
||||
meta_shaped_texture_get_texture (MetaShapedTexture *stex)
|
||||
{
|
||||
g_return_val_if_fail (META_IS_SHAPED_TEXTURE (stex), COGL_INVALID_HANDLE);
|
||||
return stex->priv->texture;
|
||||
g_return_val_if_fail (META_IS_SHAPED_TEXTURE (stex), NULL);
|
||||
return COGL_TEXTURE (stex->priv->texture);
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_shaped_texture_set_clip_region:
|
||||
* @stex: a #MetaShapedTexture
|
||||
* @clip_region: (transfer full): the region of the texture that
|
||||
* is visible and should be painted.
|
||||
* @clip_region: the region of the texture that is visible and
|
||||
* should be painted.
|
||||
*
|
||||
* Provides a hint to the texture about what areas of the texture
|
||||
* are not completely obscured and thus need to be painted. This
|
||||
@@ -569,10 +695,7 @@ meta_shaped_texture_set_clip_region (MetaShapedTexture *stex,
|
||||
priv = stex->priv;
|
||||
|
||||
if (priv->clip_region)
|
||||
{
|
||||
cairo_region_destroy (priv->clip_region);
|
||||
priv->clip_region = NULL;
|
||||
}
|
||||
cairo_region_destroy (priv->clip_region);
|
||||
|
||||
if (clip_region)
|
||||
priv->clip_region = cairo_region_copy (clip_region);
|
||||
@@ -580,6 +703,36 @@ meta_shaped_texture_set_clip_region (MetaShapedTexture *stex,
|
||||
priv->clip_region = NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_shaped_texture_set_opaque_region:
|
||||
* @stex: a #MetaShapedTexture
|
||||
* @opaque_region: (transfer full): the region of the texture that
|
||||
* can have blending turned off.
|
||||
*
|
||||
* As most windows have a large portion that does not require blending,
|
||||
* we can easily turn off blending if we know the areas that do not
|
||||
* require blending. This sets the region where we will not blend for
|
||||
* optimization purposes.
|
||||
*/
|
||||
void
|
||||
meta_shaped_texture_set_opaque_region (MetaShapedTexture *stex,
|
||||
cairo_region_t *opaque_region)
|
||||
{
|
||||
MetaShapedTexturePrivate *priv;
|
||||
|
||||
g_return_if_fail (META_IS_SHAPED_TEXTURE (stex));
|
||||
|
||||
priv = stex->priv;
|
||||
|
||||
if (priv->opaque_region)
|
||||
cairo_region_destroy (priv->opaque_region);
|
||||
|
||||
if (opaque_region)
|
||||
priv->opaque_region = cairo_region_reference (opaque_region);
|
||||
else
|
||||
priv->opaque_region = NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_shaped_texture_get_image:
|
||||
* @stex: A #MetaShapedTexture
|
||||
@@ -598,13 +751,13 @@ cairo_surface_t *
|
||||
meta_shaped_texture_get_image (MetaShapedTexture *stex,
|
||||
cairo_rectangle_int_t *clip)
|
||||
{
|
||||
CoglHandle texture, mask_texture;
|
||||
CoglTexture *texture, *mask_texture;
|
||||
cairo_rectangle_int_t texture_rect = { 0, 0, 0, 0 };
|
||||
cairo_surface_t *surface;
|
||||
|
||||
g_return_val_if_fail (META_IS_SHAPED_TEXTURE (stex), NULL);
|
||||
|
||||
texture = stex->priv->texture;
|
||||
texture = COGL_TEXTURE (stex->priv->texture);
|
||||
|
||||
if (texture == NULL)
|
||||
return NULL;
|
||||
@@ -641,7 +794,7 @@ meta_shaped_texture_get_image (MetaShapedTexture *stex,
|
||||
cogl_object_unref (texture);
|
||||
|
||||
mask_texture = stex->priv->mask_texture;
|
||||
if (mask_texture != COGL_INVALID_HANDLE)
|
||||
if (mask_texture != NULL)
|
||||
{
|
||||
cairo_t *cr;
|
||||
cairo_surface_t *mask_surface;
|
||||
|
@@ -25,9 +25,6 @@
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#define CLUTTER_ENABLE_EXPERIMENTAL_API
|
||||
#define COGL_ENABLE_EXPERIMENTAL_API
|
||||
|
||||
#include <clutter/clutter.h>
|
||||
#include "meta-texture-rectangle.h"
|
||||
|
||||
|
@@ -59,9 +59,10 @@ typedef struct
|
||||
struct _MetaTextureTower
|
||||
{
|
||||
int n_levels;
|
||||
CoglHandle textures[MAX_TEXTURE_LEVELS];
|
||||
CoglHandle fbos[MAX_TEXTURE_LEVELS];
|
||||
CoglTexture *textures[MAX_TEXTURE_LEVELS];
|
||||
CoglOffscreen *fbos[MAX_TEXTURE_LEVELS];
|
||||
Box invalid[MAX_TEXTURE_LEVELS];
|
||||
CoglPipeline *pipeline_template;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -93,7 +94,10 @@ meta_texture_tower_free (MetaTextureTower *tower)
|
||||
{
|
||||
g_return_if_fail (tower != NULL);
|
||||
|
||||
meta_texture_tower_set_base_texture (tower, COGL_INVALID_HANDLE);
|
||||
if (tower->pipeline_template != NULL)
|
||||
cogl_object_unref (tower->pipeline_template);
|
||||
|
||||
meta_texture_tower_set_base_texture (tower, NULL);
|
||||
|
||||
g_slice_free (MetaTextureTower, tower);
|
||||
}
|
||||
@@ -110,7 +114,7 @@ meta_texture_tower_free (MetaTextureTower *tower)
|
||||
*/
|
||||
void
|
||||
meta_texture_tower_set_base_texture (MetaTextureTower *tower,
|
||||
CoglHandle texture)
|
||||
CoglTexture *texture)
|
||||
{
|
||||
int i;
|
||||
|
||||
@@ -119,33 +123,33 @@ meta_texture_tower_set_base_texture (MetaTextureTower *tower,
|
||||
if (texture == tower->textures[0])
|
||||
return;
|
||||
|
||||
if (tower->textures[0] != COGL_INVALID_HANDLE)
|
||||
if (tower->textures[0] != NULL)
|
||||
{
|
||||
for (i = 1; i < tower->n_levels; i++)
|
||||
{
|
||||
if (tower->textures[i] != COGL_INVALID_HANDLE)
|
||||
if (tower->textures[i] != NULL)
|
||||
{
|
||||
cogl_handle_unref (tower->textures[i]);
|
||||
tower->textures[i] = COGL_INVALID_HANDLE;
|
||||
cogl_object_unref (tower->textures[i]);
|
||||
tower->textures[i] = NULL;
|
||||
}
|
||||
|
||||
if (tower->fbos[i] != COGL_INVALID_HANDLE)
|
||||
if (tower->fbos[i] != NULL)
|
||||
{
|
||||
cogl_handle_unref (tower->fbos[i]);
|
||||
tower->fbos[i] = COGL_INVALID_HANDLE;
|
||||
cogl_object_unref (tower->fbos[i]);
|
||||
tower->fbos[i] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
cogl_handle_unref (tower->textures[0]);
|
||||
cogl_object_unref (tower->textures[0]);
|
||||
}
|
||||
|
||||
tower->textures[0] = texture;
|
||||
|
||||
if (tower->textures[0] != COGL_INVALID_HANDLE)
|
||||
if (tower->textures[0] != NULL)
|
||||
{
|
||||
int width, height;
|
||||
|
||||
cogl_handle_ref (tower->textures[0]);
|
||||
cogl_object_ref (tower->textures[0]);
|
||||
|
||||
width = cogl_texture_get_width (tower->textures[0]);
|
||||
height = cogl_texture_get_height (tower->textures[0]);
|
||||
@@ -186,7 +190,7 @@ meta_texture_tower_update_area (MetaTextureTower *tower,
|
||||
|
||||
g_return_if_fail (tower != NULL);
|
||||
|
||||
if (tower->textures[0] == COGL_INVALID_HANDLE)
|
||||
if (tower->textures[0] == NULL)
|
||||
return;
|
||||
|
||||
texture_width = cogl_texture_get_width (tower->textures[0]);
|
||||
@@ -383,185 +387,61 @@ texture_tower_create_texture (MetaTextureTower *tower,
|
||||
tower->invalid[level].y2 = height;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
static void
|
||||
texture_tower_revalidate_fbo (MetaTextureTower *tower,
|
||||
int level)
|
||||
{
|
||||
CoglHandle source_texture = tower->textures[level - 1];
|
||||
CoglTexture *source_texture = tower->textures[level - 1];
|
||||
int source_texture_width = cogl_texture_get_width (source_texture);
|
||||
int source_texture_height = cogl_texture_get_height (source_texture);
|
||||
CoglHandle dest_texture = tower->textures[level];
|
||||
CoglTexture *dest_texture = tower->textures[level];
|
||||
int dest_texture_width = cogl_texture_get_width (dest_texture);
|
||||
int dest_texture_height = cogl_texture_get_height (dest_texture);
|
||||
Box *invalid = &tower->invalid[level];
|
||||
CoglMatrix modelview;
|
||||
CoglFramebuffer *fb;
|
||||
CoglError *catch_error = NULL;
|
||||
CoglPipeline *pipeline;
|
||||
|
||||
if (tower->fbos[level] == COGL_INVALID_HANDLE)
|
||||
tower->fbos[level] = cogl_offscreen_new_to_texture (dest_texture);
|
||||
if (tower->fbos[level] == NULL)
|
||||
tower->fbos[level] = cogl_offscreen_new_with_texture (dest_texture);
|
||||
|
||||
if (tower->fbos[level] == COGL_INVALID_HANDLE)
|
||||
return FALSE;
|
||||
fb = COGL_FRAMEBUFFER (tower->fbos[level]);
|
||||
|
||||
cogl_push_framebuffer (tower->fbos[level]);
|
||||
|
||||
cogl_ortho (0, dest_texture_width, dest_texture_height, 0, -1., 1.);
|
||||
|
||||
cogl_matrix_init_identity (&modelview);
|
||||
cogl_set_modelview_matrix (&modelview);
|
||||
|
||||
cogl_set_source_texture (tower->textures[level - 1]);
|
||||
cogl_rectangle_with_texture_coords (invalid->x1, invalid->y1,
|
||||
invalid->x2, invalid->y2,
|
||||
(2. * invalid->x1) / source_texture_width,
|
||||
(2. * invalid->y1) / source_texture_height,
|
||||
(2. * invalid->x2) / source_texture_width,
|
||||
(2. * invalid->y2) / source_texture_height);
|
||||
|
||||
cogl_pop_framebuffer ();
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
fill_copy (guchar *buf,
|
||||
const guchar *source,
|
||||
int width)
|
||||
{
|
||||
memcpy (buf, source, width * 4);
|
||||
}
|
||||
|
||||
static void
|
||||
fill_scale_down (guchar *buf,
|
||||
const guchar *source,
|
||||
int width)
|
||||
{
|
||||
while (width > 1)
|
||||
if (!cogl_framebuffer_allocate (fb, &catch_error))
|
||||
{
|
||||
buf[0] = (source[0] + source[4]) / 2;
|
||||
buf[1] = (source[1] + source[5]) / 2;
|
||||
buf[2] = (source[2] + source[6]) / 2;
|
||||
buf[3] = (source[3] + source[7]) / 2;
|
||||
|
||||
buf += 4;
|
||||
source += 8;
|
||||
width -= 2;
|
||||
cogl_error_free (catch_error);
|
||||
return;
|
||||
}
|
||||
|
||||
if (width > 0)
|
||||
cogl_framebuffer_orthographic (fb, 0, 0, dest_texture_width, dest_texture_height, -1., 1.);
|
||||
|
||||
if (!tower->pipeline_template)
|
||||
{
|
||||
buf[0] = source[0] / 2;
|
||||
buf[1] = source[1] / 2;
|
||||
buf[2] = source[2] / 2;
|
||||
buf[3] = source[3] / 2;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
texture_tower_revalidate_client (MetaTextureTower *tower,
|
||||
int level)
|
||||
{
|
||||
CoglHandle source_texture = tower->textures[level - 1];
|
||||
int source_texture_width = cogl_texture_get_width (source_texture);
|
||||
int source_texture_height = cogl_texture_get_height (source_texture);
|
||||
guint source_rowstride;
|
||||
guchar *source_data;
|
||||
CoglHandle dest_texture = tower->textures[level];
|
||||
int dest_texture_width = cogl_texture_get_width (dest_texture);
|
||||
int dest_texture_height = cogl_texture_get_height (dest_texture);
|
||||
int dest_x = tower->invalid[level].x1;
|
||||
int dest_y = tower->invalid[level].y1;
|
||||
int dest_width = tower->invalid[level].x2 - tower->invalid[level].x1;
|
||||
int dest_height = tower->invalid[level].y2 - tower->invalid[level].y1;
|
||||
guchar *dest_data;
|
||||
guchar *source_tmp1 = NULL, *source_tmp2 = NULL;
|
||||
int i, j;
|
||||
|
||||
source_rowstride = source_texture_width * 4;
|
||||
|
||||
source_data = g_malloc (source_texture_height * source_rowstride);
|
||||
cogl_texture_get_data (source_texture, TEXTURE_FORMAT, source_rowstride,
|
||||
source_data);
|
||||
|
||||
dest_data = g_malloc (dest_height * dest_width * 4);
|
||||
|
||||
if (dest_texture_height < source_texture_height)
|
||||
{
|
||||
source_tmp1 = g_malloc (dest_width * 4);
|
||||
source_tmp2 = g_malloc (dest_width * 4);
|
||||
CoglContext *ctx =
|
||||
clutter_backend_get_cogl_context (clutter_get_default_backend ());
|
||||
tower->pipeline_template = cogl_pipeline_new (ctx);
|
||||
cogl_pipeline_set_blend (tower->pipeline_template, "RGBA = ADD (SRC_COLOR, 0)", NULL);
|
||||
}
|
||||
|
||||
for (i = 0; i < dest_height; i++)
|
||||
{
|
||||
guchar *dest_row = dest_data + i * dest_width * 4;
|
||||
if (dest_texture_height < source_texture_height)
|
||||
{
|
||||
guchar *source1, *source2;
|
||||
guchar *dest;
|
||||
pipeline = cogl_pipeline_copy (tower->pipeline_template);
|
||||
cogl_pipeline_set_layer_texture (pipeline, 0, tower->textures[level - 1]);
|
||||
|
||||
if (dest_texture_width < source_texture_width)
|
||||
{
|
||||
fill_scale_down (source_tmp1,
|
||||
source_data + ((i + dest_y) * 2) * source_rowstride + dest_x * 2 * 4,
|
||||
dest_width * 2);
|
||||
fill_scale_down (source_tmp2,
|
||||
source_data + ((i + dest_y) * 2 + 1) * source_rowstride + dest_x * 2 * 4,
|
||||
dest_width * 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
fill_copy (source_tmp1,
|
||||
source_data + ((i + dest_y) * 2) * source_rowstride + dest_x * 4,
|
||||
dest_width);
|
||||
fill_copy (source_tmp2,
|
||||
source_data + ((i + dest_y) * 2 + 1) * source_rowstride + dest_x * 4,
|
||||
dest_width);
|
||||
}
|
||||
cogl_framebuffer_draw_textured_rectangle (fb, pipeline,
|
||||
invalid->x1, invalid->y1,
|
||||
invalid->x2, invalid->y2,
|
||||
(2. * invalid->x1) / source_texture_width,
|
||||
(2. * invalid->y1) / source_texture_height,
|
||||
(2. * invalid->x2) / source_texture_width,
|
||||
(2. * invalid->y2) / source_texture_height);
|
||||
|
||||
source1 = source_tmp1;
|
||||
source2 = source_tmp2;
|
||||
|
||||
dest = dest_row;
|
||||
for (j = 0; j < dest_width * 4; j++)
|
||||
*(dest++) = (*(source1++) + *(source2++)) / 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (dest_texture_width < source_texture_width)
|
||||
fill_scale_down (dest_row,
|
||||
source_data + (i + dest_y) * source_rowstride + dest_x * 2 * 4,
|
||||
dest_width * 2);
|
||||
else
|
||||
fill_copy (dest_row,
|
||||
source_data + (i + dest_y) * source_rowstride,
|
||||
dest_width);
|
||||
}
|
||||
}
|
||||
|
||||
cogl_texture_set_region (dest_texture,
|
||||
0, 0,
|
||||
dest_x, dest_y,
|
||||
dest_width, dest_height,
|
||||
dest_width, dest_height,
|
||||
TEXTURE_FORMAT,
|
||||
4 * dest_width,
|
||||
dest_data);
|
||||
|
||||
if (dest_texture_height < source_texture_height)
|
||||
{
|
||||
g_free (source_tmp1);
|
||||
g_free (source_tmp2);
|
||||
}
|
||||
|
||||
g_free (source_data);
|
||||
g_free (dest_data);
|
||||
cogl_object_unref (pipeline);
|
||||
}
|
||||
|
||||
static void
|
||||
texture_tower_revalidate (MetaTextureTower *tower,
|
||||
int level)
|
||||
{
|
||||
if (!texture_tower_revalidate_fbo (tower, level))
|
||||
texture_tower_revalidate_client (tower, level);
|
||||
texture_tower_revalidate_fbo (tower, level);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -575,28 +455,28 @@ texture_tower_revalidate (MetaTextureTower *tower,
|
||||
* rectangle (0, 0, 200, 200).
|
||||
*
|
||||
* Return value: the COGL texture handle to use for painting, or
|
||||
* %COGL_INVALID_HANDLE if no base texture has yet been set.
|
||||
* %NULL if no base texture has yet been set.
|
||||
*/
|
||||
CoglHandle
|
||||
CoglTexture *
|
||||
meta_texture_tower_get_paint_texture (MetaTextureTower *tower)
|
||||
{
|
||||
int texture_width, texture_height;
|
||||
int level;
|
||||
|
||||
g_return_val_if_fail (tower != NULL, COGL_INVALID_HANDLE);
|
||||
g_return_val_if_fail (tower != NULL, NULL);
|
||||
|
||||
if (tower->textures[0] == COGL_INVALID_HANDLE)
|
||||
return COGL_INVALID_HANDLE;
|
||||
if (tower->textures[0] == NULL)
|
||||
return NULL;
|
||||
|
||||
texture_width = cogl_texture_get_width (tower->textures[0]);
|
||||
texture_height = cogl_texture_get_height (tower->textures[0]);
|
||||
|
||||
level = get_paint_level(texture_width, texture_height);
|
||||
if (level < 0) /* singular paint matrix, scaled to nothing */
|
||||
return COGL_INVALID_HANDLE;
|
||||
return NULL;
|
||||
level = MIN (level, tower->n_levels - 1);
|
||||
|
||||
if (tower->textures[level] == COGL_INVALID_HANDLE ||
|
||||
if (tower->textures[level] == NULL ||
|
||||
(tower->invalid[level].x2 != tower->invalid[level].x1 &&
|
||||
tower->invalid[level].y2 != tower->invalid[level].y1))
|
||||
{
|
||||
@@ -608,7 +488,7 @@ meta_texture_tower_get_paint_texture (MetaTextureTower *tower)
|
||||
texture_width = MAX (1, texture_width / 2);
|
||||
texture_height = MAX (1, texture_height / 2);
|
||||
|
||||
if (tower->textures[i] == COGL_INVALID_HANDLE)
|
||||
if (tower->textures[i] == NULL)
|
||||
texture_tower_create_texture (tower, i, texture_width, texture_height);
|
||||
}
|
||||
|
||||
|
@@ -56,13 +56,13 @@ typedef struct _MetaTextureTower MetaTextureTower;
|
||||
MetaTextureTower *meta_texture_tower_new (void);
|
||||
void meta_texture_tower_free (MetaTextureTower *tower);
|
||||
void meta_texture_tower_set_base_texture (MetaTextureTower *tower,
|
||||
CoglHandle texture);
|
||||
CoglTexture *texture);
|
||||
void meta_texture_tower_update_area (MetaTextureTower *tower,
|
||||
int x,
|
||||
int y,
|
||||
int width,
|
||||
int height);
|
||||
CoglHandle meta_texture_tower_get_paint_texture (MetaTextureTower *tower);
|
||||
CoglTexture *meta_texture_tower_get_paint_texture (MetaTextureTower *tower);
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
|
@@ -28,6 +28,10 @@ void meta_window_actor_process_damage (MetaWindowActor *self,
|
||||
XDamageNotifyEvent *event);
|
||||
|
||||
void meta_window_actor_pre_paint (MetaWindowActor *self);
|
||||
void meta_window_actor_post_paint (MetaWindowActor *self);
|
||||
void meta_window_actor_frame_complete (MetaWindowActor *self,
|
||||
CoglFrameInfo *frame_info,
|
||||
gint64 presentation_time);
|
||||
|
||||
void meta_window_actor_invalidate_shadow (MetaWindowActor *self);
|
||||
|
||||
@@ -39,20 +43,28 @@ void meta_window_actor_get_shape_bounds (MetaWindowActor *self,
|
||||
cairo_rectangle_int_t *bounds);
|
||||
|
||||
gboolean meta_window_actor_effect_in_progress (MetaWindowActor *self);
|
||||
void meta_window_actor_sync_actor_position (MetaWindowActor *self);
|
||||
void meta_window_actor_sync_actor_geometry (MetaWindowActor *self,
|
||||
gboolean did_placement);
|
||||
void meta_window_actor_sync_visibility (MetaWindowActor *self);
|
||||
void meta_window_actor_update_shape (MetaWindowActor *self);
|
||||
void meta_window_actor_update_opacity (MetaWindowActor *self);
|
||||
void meta_window_actor_mapped (MetaWindowActor *self);
|
||||
void meta_window_actor_unmapped (MetaWindowActor *self);
|
||||
void meta_window_actor_set_updates_frozen (MetaWindowActor *self,
|
||||
gboolean updates_frozen);
|
||||
void meta_window_actor_queue_frame_drawn (MetaWindowActor *self,
|
||||
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_set_clip_region (MetaWindowActor *self,
|
||||
cairo_region_t *clip_region);
|
||||
void meta_window_actor_set_clip_region_beneath (MetaWindowActor *self,
|
||||
cairo_region_t *beneath_region);
|
||||
void meta_window_actor_reset_clip_regions (MetaWindowActor *self);
|
||||
|
||||
void meta_window_actor_set_unobscured_region (MetaWindowActor *self,
|
||||
cairo_region_t *unobscured_region);
|
||||
|
||||
void meta_window_actor_effect_completed (MetaWindowActor *actor,
|
||||
gulong event);
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -7,118 +7,26 @@
|
||||
|
||||
#include <gdk/gdk.h> /* for gdk_rectangle_intersect() */
|
||||
|
||||
#include "clutter-utils.h"
|
||||
#include "compositor-private.h"
|
||||
#include "meta-window-actor-private.h"
|
||||
#include "meta-window-group.h"
|
||||
#include "meta-background-actor-private.h"
|
||||
#include "meta-background-group-private.h"
|
||||
|
||||
struct _MetaWindowGroupClass
|
||||
{
|
||||
ClutterGroupClass parent_class;
|
||||
ClutterActorClass parent_class;
|
||||
};
|
||||
|
||||
struct _MetaWindowGroup
|
||||
{
|
||||
ClutterGroup parent;
|
||||
ClutterActor parent;
|
||||
|
||||
MetaScreen *screen;
|
||||
};
|
||||
|
||||
G_DEFINE_TYPE (MetaWindowGroup, meta_window_group, CLUTTER_TYPE_GROUP);
|
||||
|
||||
/* This file uses pixel-aligned region computation to determine what
|
||||
* can be clipped out. This only really works if everything is aligned
|
||||
* to the pixel grid - not scaled or rotated and at integer offsets.
|
||||
*
|
||||
* (This could be relaxed - if we turned off filtering for unscaled
|
||||
* windows then windows would be, by definition aligned to the pixel
|
||||
* grid. And for rectangular windows without a shape, the outline that
|
||||
* we draw for an unrotated window is always a rectangle because we
|
||||
* don't use antialasing for the window boundary - with or without
|
||||
* filtering, with or without a scale. But figuring out exactly
|
||||
* what pixels will be drawn by the graphics system in these cases
|
||||
* gets tricky, so we just go for the easiest part - no scale,
|
||||
* and at integer offsets.)
|
||||
*
|
||||
* The way we check for pixel-aligned is by looking at the
|
||||
* transformation into screen space of the allocation box of an actor
|
||||
* and and checking if the corners are "close enough" to integral
|
||||
* pixel values.
|
||||
*/
|
||||
|
||||
/* The definition of "close enough" to integral pixel values is
|
||||
* equality when we convert to 24.8 fixed-point.
|
||||
*/
|
||||
static inline int
|
||||
round_to_fixed (float x)
|
||||
{
|
||||
return roundf (x * 256);
|
||||
}
|
||||
|
||||
/* This helper function checks if (according to our fixed point precision)
|
||||
* the vertices @verts form a box of width @widthf and height @heightf
|
||||
* located at integral coordinates. These coordinates are returned
|
||||
* in @x_origin and @y_origin.
|
||||
*/
|
||||
static gboolean
|
||||
vertices_are_untransformed (ClutterVertex *verts,
|
||||
float widthf,
|
||||
float heightf,
|
||||
int *x_origin,
|
||||
int *y_origin)
|
||||
{
|
||||
int width, height;
|
||||
int v0x, v0y, v1x, v1y, v2x, v2y, v3x, v3y;
|
||||
int x, y;
|
||||
|
||||
width = round_to_fixed (widthf); height = round_to_fixed (heightf);
|
||||
|
||||
v0x = round_to_fixed (verts[0].x); v0y = round_to_fixed (verts[0].y);
|
||||
v1x = round_to_fixed (verts[1].x); v1y = round_to_fixed (verts[1].y);
|
||||
v2x = round_to_fixed (verts[2].x); v2y = round_to_fixed (verts[2].y);
|
||||
v3x = round_to_fixed (verts[3].x); v3y = round_to_fixed (verts[3].y);
|
||||
|
||||
/* Using shifting for converting fixed => int, gets things right for
|
||||
* negative values. / 256. wouldn't do the same
|
||||
*/
|
||||
x = v0x >> 8;
|
||||
y = v0y >> 8;
|
||||
|
||||
/* At integral coordinates? */
|
||||
if (x * 256 != v0x || y * 256 != v0y)
|
||||
return FALSE;
|
||||
|
||||
/* Not scaled? */
|
||||
if (v1x - v0x != width || v2y - v0y != height)
|
||||
return FALSE;
|
||||
|
||||
/* Not rotated/skewed? */
|
||||
if (v0x != v2x || v0y != v1y ||
|
||||
v3x != v1x || v3y != v2y)
|
||||
return FALSE;
|
||||
|
||||
*x_origin = x;
|
||||
*y_origin = y;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* Check if an actor is "untransformed" - which actually means transformed by
|
||||
* at most a integer-translation. The integer translation, if any, is returned.
|
||||
*/
|
||||
static gboolean
|
||||
actor_is_untransformed (ClutterActor *actor,
|
||||
int *x_origin,
|
||||
int *y_origin)
|
||||
{
|
||||
gfloat widthf, heightf;
|
||||
ClutterVertex verts[4];
|
||||
|
||||
clutter_actor_get_size (actor, &widthf, &heightf);
|
||||
clutter_actor_get_abs_allocation_vertices (actor, verts);
|
||||
|
||||
return vertices_are_untransformed (verts, widthf, heightf, x_origin, y_origin);
|
||||
}
|
||||
G_DEFINE_TYPE (MetaWindowGroup, meta_window_group, CLUTTER_TYPE_ACTOR);
|
||||
|
||||
/* Help macros to scale from OpenGL <-1,1> coordinates system to
|
||||
* window coordinates ranging [0,window-size]. Borrowed from clutter-utils.c
|
||||
@@ -175,22 +83,36 @@ painting_untransformed (MetaWindowGroup *window_group,
|
||||
viewport[3], viewport[1]);
|
||||
}
|
||||
|
||||
return 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_paint (ClutterActor *actor)
|
||||
{
|
||||
cairo_region_t *visible_region;
|
||||
ClutterActor *stage;
|
||||
cairo_rectangle_int_t visible_rect;
|
||||
GList *children, *l;
|
||||
cairo_region_t *clip_region;
|
||||
cairo_region_t *unobscured_region;
|
||||
ClutterActorIter iter;
|
||||
ClutterActor *child;
|
||||
cairo_rectangle_int_t visible_rect, clip_rect;
|
||||
int paint_x_origin, paint_y_origin;
|
||||
int actor_x_origin, actor_y_origin;
|
||||
int paint_x_offset, paint_y_offset;
|
||||
|
||||
MetaWindowGroup *window_group = META_WINDOW_GROUP (actor);
|
||||
MetaCompScreen *info = meta_screen_get_compositor_data (window_group->screen);
|
||||
ClutterActor *stage = clutter_actor_get_stage (actor);
|
||||
|
||||
/* Start off by treating all windows as completely unobscured, so damage anywhere
|
||||
* in a window queues redraws, but confine it more below. */
|
||||
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_set_unobscured_region (window_actor, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
/* 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
|
||||
@@ -206,7 +128,7 @@ meta_window_group_paint (ClutterActor *actor)
|
||||
* on the stage.
|
||||
*/
|
||||
if (!painting_untransformed (window_group, &paint_x_origin, &paint_y_origin) ||
|
||||
!actor_is_untransformed (actor, &actor_x_origin, &actor_y_origin))
|
||||
!meta_actor_is_untransformed (actor, &actor_x_origin, &actor_y_origin))
|
||||
{
|
||||
CLUTTER_ACTOR_CLASS (meta_window_group_parent_class)->paint (actor);
|
||||
return;
|
||||
@@ -215,12 +137,11 @@ meta_window_group_paint (ClutterActor *actor)
|
||||
paint_x_offset = paint_x_origin - actor_x_origin;
|
||||
paint_y_offset = paint_y_origin - actor_y_origin;
|
||||
|
||||
/* We walk the list from top to bottom (opposite of painting order),
|
||||
* and subtract the opaque area of each window out of the visible
|
||||
* region that we pass to the windows below.
|
||||
*/
|
||||
children = clutter_container_get_children (CLUTTER_CONTAINER (actor));
|
||||
children = g_list_reverse (children);
|
||||
visible_rect.x = visible_rect.y = 0;
|
||||
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
|
||||
* painting shadows on windows that don't need to be painted in this
|
||||
@@ -228,11 +149,10 @@ meta_window_group_paint (ClutterActor *actor)
|
||||
* sizes, we could intersect this with an accurate union of the
|
||||
* monitors to avoid painting shadows that are visible only in the
|
||||
* holes. */
|
||||
stage = clutter_actor_get_stage (actor);
|
||||
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);
|
||||
|
||||
if (info->unredirected_window != NULL)
|
||||
{
|
||||
@@ -240,15 +160,22 @@ meta_window_group_paint (ClutterActor *actor)
|
||||
MetaWindow *window = meta_window_actor_get_meta_window (info->unredirected_window);
|
||||
|
||||
meta_window_get_outer_rect (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);
|
||||
}
|
||||
|
||||
for (l = children; l; l = l->next)
|
||||
/* We walk the list from top to bottom (opposite of painting order),
|
||||
* 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 (l->data))
|
||||
if (!CLUTTER_ACTOR_IS_VISIBLE (child))
|
||||
continue;
|
||||
|
||||
if (l->data == info->unredirected_window)
|
||||
if (info->unredirected_window != NULL &&
|
||||
child == CLUTTER_ACTOR (info->unredirected_window))
|
||||
continue;
|
||||
|
||||
/* If an actor has effects applied, then that can change the area
|
||||
@@ -267,74 +194,94 @@ meta_window_group_paint (ClutterActor *actor)
|
||||
* as well for the same reason, but omitted for simplicity in the
|
||||
* hopes that no-one will do that.
|
||||
*/
|
||||
if (clutter_actor_has_effects (l->data))
|
||||
if (clutter_actor_has_effects (child))
|
||||
continue;
|
||||
|
||||
if (META_IS_WINDOW_ACTOR (l->data))
|
||||
if (META_IS_WINDOW_ACTOR (child))
|
||||
{
|
||||
MetaWindowActor *window_actor = l->data;
|
||||
MetaWindowActor *window_actor = META_WINDOW_ACTOR (child);
|
||||
int x, y;
|
||||
|
||||
if (!actor_is_untransformed (CLUTTER_ACTOR (window_actor), &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);
|
||||
/* Temporarily move to the coordinate system of the actor */
|
||||
cairo_region_translate (unobscured_region, - x, - y);
|
||||
cairo_region_translate (clip_region, - x, - y);
|
||||
|
||||
meta_window_actor_set_unobscured_region (window_actor, unobscured_region);
|
||||
meta_window_actor_set_clip_region (window_actor, clip_region);
|
||||
|
||||
if (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);
|
||||
{
|
||||
cairo_region_subtract (unobscured_region, obscured_region);
|
||||
cairo_region_subtract (clip_region, obscured_region);
|
||||
}
|
||||
}
|
||||
|
||||
meta_window_actor_set_visible_region_beneath (window_actor, visible_region);
|
||||
cairo_region_translate (visible_region, x, y);
|
||||
meta_window_actor_set_clip_region_beneath (window_actor, clip_region);
|
||||
|
||||
cairo_region_translate (unobscured_region, x, y);
|
||||
cairo_region_translate (clip_region, x, y);
|
||||
}
|
||||
else if (META_IS_BACKGROUND_ACTOR (l->data))
|
||||
else if (META_IS_BACKGROUND_ACTOR (child) ||
|
||||
META_IS_BACKGROUND_GROUP (child))
|
||||
{
|
||||
MetaBackgroundActor *background_actor = l->data;
|
||||
int x, y;
|
||||
|
||||
if (!actor_is_untransformed (CLUTTER_ACTOR (background_actor), &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);
|
||||
meta_background_actor_set_visible_region (background_actor, visible_region);
|
||||
cairo_region_translate (visible_region, x, y);
|
||||
cairo_region_translate (clip_region, - x, - y);
|
||||
|
||||
if (META_IS_BACKGROUND_GROUP (child))
|
||||
meta_background_group_set_clip_region (META_BACKGROUND_GROUP (child), clip_region);
|
||||
else
|
||||
meta_background_actor_set_clip_region (META_BACKGROUND_ACTOR (child), clip_region);
|
||||
|
||||
cairo_region_translate (clip_region, x, y);
|
||||
}
|
||||
}
|
||||
|
||||
cairo_region_destroy (visible_region);
|
||||
cairo_region_destroy (unobscured_region);
|
||||
cairo_region_destroy (clip_region);
|
||||
|
||||
CLUTTER_ACTOR_CLASS (meta_window_group_parent_class)->paint (actor);
|
||||
|
||||
/* Now that we are done painting, unset the visible regions (they will
|
||||
* mess up painting clones of our actors)
|
||||
*/
|
||||
for (l = children; l; l = l->next)
|
||||
clutter_actor_iter_init (&iter, actor);
|
||||
while (clutter_actor_iter_next (&iter, &child))
|
||||
{
|
||||
if (META_IS_WINDOW_ACTOR (l->data))
|
||||
if (META_IS_WINDOW_ACTOR (child))
|
||||
{
|
||||
MetaWindowActor *window_actor = l->data;
|
||||
meta_window_actor_reset_visible_regions (window_actor);
|
||||
MetaWindowActor *window_actor = META_WINDOW_ACTOR (child);
|
||||
meta_window_actor_reset_clip_regions (window_actor);
|
||||
}
|
||||
else if (META_IS_BACKGROUND_ACTOR (l->data))
|
||||
else if (META_IS_BACKGROUND_ACTOR (child))
|
||||
{
|
||||
MetaBackgroundActor *background_actor = l->data;
|
||||
meta_background_actor_set_visible_region (background_actor, NULL);
|
||||
MetaBackgroundActor *background_actor = META_BACKGROUND_ACTOR (child);
|
||||
meta_background_actor_set_clip_region (background_actor, NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
g_list_free (children);
|
||||
static gboolean
|
||||
meta_window_group_get_paint_volume (ClutterActor *actor,
|
||||
ClutterPaintVolume *volume)
|
||||
{
|
||||
return clutter_paint_volume_set_from_allocation (volume, actor);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -343,6 +290,7 @@ meta_window_group_class_init (MetaWindowGroupClass *klass)
|
||||
ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass);
|
||||
|
||||
actor_class->paint = meta_window_group_paint;
|
||||
actor_class->get_paint_volume = meta_window_group_get_paint_volume;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@@ -10,13 +10,15 @@
|
||||
/**
|
||||
* MetaWindowGroup:
|
||||
*
|
||||
* This class is a subclass of ClutterGroup with special handling for
|
||||
* MetaWindowActor when painting the group. 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.
|
||||
* This class is a subclass of ClutterActor with special handling for
|
||||
* MetaWindowActor/MetaBackgroundActor/MetaBackgroundGroup when painting
|
||||
* children.
|
||||
*
|
||||
* 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
|
||||
@@ -49,4 +51,7 @@ GType meta_window_group_get_type (void);
|
||||
|
||||
ClutterActor *meta_window_group_new (MetaScreen *screen);
|
||||
|
||||
gboolean meta_window_group_actor_is_untransformed (ClutterActor *actor,
|
||||
int *x_origin,
|
||||
int *y_origin);
|
||||
#endif /* META_WINDOW_GROUP_H */
|
||||
|
@@ -23,6 +23,9 @@
|
||||
|
||||
#include <meta/meta-plugin.h>
|
||||
#include <meta/window.h>
|
||||
#include <meta/util.h>
|
||||
#include <meta/meta-background-group.h>
|
||||
#include <meta/meta-background-actor.h>
|
||||
|
||||
#include <libintl.h>
|
||||
#define _(x) dgettext (GETTEXT_PACKAGE, x)
|
||||
@@ -68,6 +71,7 @@ struct _MetaDefaultPluginClass
|
||||
|
||||
static GQuark actor_data_quark = 0;
|
||||
|
||||
static void start (MetaPlugin *plugin);
|
||||
static void minimize (MetaPlugin *plugin,
|
||||
MetaWindowActor *actor);
|
||||
static void map (MetaPlugin *plugin,
|
||||
@@ -96,6 +100,8 @@ static void kill_window_effects (MetaPlugin *plugin,
|
||||
MetaWindowActor *actor);
|
||||
static void kill_switch_workspace (MetaPlugin *plugin);
|
||||
|
||||
static void confirm_display_change (MetaPlugin *plugin);
|
||||
|
||||
static const MetaPluginInfo * plugin_info (MetaPlugin *plugin);
|
||||
|
||||
META_PLUGIN_DECLARE(MetaDefaultPlugin, meta_default_plugin);
|
||||
@@ -111,6 +117,8 @@ struct _MetaDefaultPluginPrivate
|
||||
ClutterActor *desktop1;
|
||||
ClutterActor *desktop2;
|
||||
|
||||
ClutterActor *background_group;
|
||||
|
||||
MetaPluginInfo info;
|
||||
};
|
||||
|
||||
@@ -191,6 +199,7 @@ meta_default_plugin_class_init (MetaDefaultPluginClass *klass)
|
||||
gobject_class->set_property = meta_default_plugin_set_property;
|
||||
gobject_class->get_property = meta_default_plugin_get_property;
|
||||
|
||||
plugin_class->start = start;
|
||||
plugin_class->map = map;
|
||||
plugin_class->minimize = minimize;
|
||||
plugin_class->maximize = maximize;
|
||||
@@ -200,6 +209,7 @@ meta_default_plugin_class_init (MetaDefaultPluginClass *klass)
|
||||
plugin_class->plugin_info = plugin_info;
|
||||
plugin_class->kill_window_effects = kill_window_effects;
|
||||
plugin_class->kill_switch_workspace = kill_switch_workspace;
|
||||
plugin_class->confirm_display_change = confirm_display_change;
|
||||
|
||||
g_type_class_add_private (gobject_class, sizeof (MetaDefaultPluginPrivate));
|
||||
}
|
||||
@@ -282,6 +292,78 @@ on_switch_workspace_effect_complete (ClutterTimeline *timeline, gpointer data)
|
||||
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
|
||||
on_monitors_changed (MetaScreen *screen,
|
||||
MetaPlugin *plugin)
|
||||
{
|
||||
MetaDefaultPlugin *self = META_DEFAULT_PLUGIN (plugin);
|
||||
int i, n;
|
||||
|
||||
clutter_actor_destroy_all_children (self->priv->background_group);
|
||||
|
||||
n = meta_screen_get_n_monitors (screen);
|
||||
for (i = 0; i < n; i++)
|
||||
{
|
||||
MetaRectangle rect;
|
||||
ClutterActor *background;
|
||||
ClutterColor color;
|
||||
|
||||
meta_screen_get_monitor_geometry (screen, i, &rect);
|
||||
|
||||
background = meta_background_actor_new ();
|
||||
|
||||
clutter_actor_set_position (background, rect.x, rect.y);
|
||||
clutter_actor_set_size (background, rect.width, rect.height);
|
||||
|
||||
/* Don't use rand() here, mesa calls srand() internally when
|
||||
parsing the driconf XML, but it's nice if the colors are
|
||||
reproducible.
|
||||
*/
|
||||
clutter_color_init (&color,
|
||||
g_random_int () % 255,
|
||||
g_random_int () % 255,
|
||||
g_random_int () % 255,
|
||||
255);
|
||||
clutter_actor_set_background_color (background, &color);
|
||||
|
||||
clutter_actor_add_child (self->priv->background_group, background);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
start (MetaPlugin *plugin)
|
||||
{
|
||||
MetaDefaultPlugin *self = META_DEFAULT_PLUGIN (plugin);
|
||||
MetaScreen *screen = meta_plugin_get_screen (plugin);
|
||||
|
||||
self->priv->background_group = meta_background_group_new ();
|
||||
clutter_actor_insert_child_below (meta_get_window_group_for_screen (screen),
|
||||
self->priv->background_group, NULL);
|
||||
|
||||
g_signal_connect (screen, "monitors-changed",
|
||||
G_CALLBACK (on_monitors_changed), plugin);
|
||||
on_monitors_changed (screen, plugin);
|
||||
|
||||
meta_later_add (META_LATER_BEFORE_REDRAW,
|
||||
(GSourceFunc) show_stage,
|
||||
plugin,
|
||||
NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
switch_workspace (MetaPlugin *plugin,
|
||||
gint from, gint to,
|
||||
@@ -756,3 +838,33 @@ plugin_info (MetaPlugin *plugin)
|
||||
|
||||
return &priv->info;
|
||||
}
|
||||
|
||||
static void
|
||||
on_dialog_closed (GPid pid,
|
||||
gint status,
|
||||
gpointer user_data)
|
||||
{
|
||||
MetaPlugin *plugin = user_data;
|
||||
gboolean ok;
|
||||
|
||||
ok = g_spawn_check_exit_status (status, NULL);
|
||||
meta_plugin_complete_display_change (plugin, ok);
|
||||
}
|
||||
|
||||
static void
|
||||
confirm_display_change (MetaPlugin *plugin)
|
||||
{
|
||||
GPid pid;
|
||||
|
||||
pid = meta_show_dialog ("--question",
|
||||
"Does the display look OK?",
|
||||
"20",
|
||||
NULL,
|
||||
"_Keep This Configuration",
|
||||
"_Restore Previous Configuration",
|
||||
"preferences-desktop-display",
|
||||
0,
|
||||
NULL, NULL);
|
||||
|
||||
g_child_watch_add (pid, on_dialog_closed, plugin);
|
||||
}
|
||||
|
408
src/core/barrier.c
Normal file
408
src/core/barrier.c
Normal file
@@ -0,0 +1,408 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; c-basic-offset: 2; -*- */
|
||||
|
||||
/**
|
||||
* SECTION:barrier
|
||||
* @Title: MetaBarrier
|
||||
* @Short_Description: Pointer barriers
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <glib-object.h>
|
||||
|
||||
#include <X11/extensions/XInput2.h>
|
||||
#include <X11/extensions/Xfixes.h>
|
||||
#include <meta/util.h>
|
||||
#include <meta/barrier.h>
|
||||
#include "display-private.h"
|
||||
#include "mutter-enum-types.h"
|
||||
#include "core.h"
|
||||
|
||||
G_DEFINE_TYPE (MetaBarrier, meta_barrier, G_TYPE_OBJECT)
|
||||
|
||||
enum {
|
||||
PROP_0,
|
||||
|
||||
PROP_DISPLAY,
|
||||
|
||||
PROP_X1,
|
||||
PROP_Y1,
|
||||
PROP_X2,
|
||||
PROP_Y2,
|
||||
PROP_DIRECTIONS,
|
||||
|
||||
PROP_LAST,
|
||||
};
|
||||
|
||||
static GParamSpec *obj_props[PROP_LAST];
|
||||
|
||||
enum {
|
||||
HIT,
|
||||
LEFT,
|
||||
|
||||
LAST_SIGNAL,
|
||||
};
|
||||
|
||||
static guint obj_signals[LAST_SIGNAL];
|
||||
|
||||
struct _MetaBarrierPrivate
|
||||
{
|
||||
MetaDisplay *display;
|
||||
|
||||
int x1;
|
||||
int y1;
|
||||
int x2;
|
||||
int y2;
|
||||
|
||||
MetaBarrierDirection directions;
|
||||
|
||||
PointerBarrier xbarrier;
|
||||
};
|
||||
|
||||
static void meta_barrier_event_unref (MetaBarrierEvent *event);
|
||||
|
||||
static void
|
||||
meta_barrier_get_property (GObject *object,
|
||||
guint prop_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
MetaBarrier *barrier = META_BARRIER (object);
|
||||
MetaBarrierPrivate *priv = barrier->priv;
|
||||
switch (prop_id)
|
||||
{
|
||||
case PROP_DISPLAY:
|
||||
g_value_set_object (value, priv->display);
|
||||
break;
|
||||
case PROP_X1:
|
||||
g_value_set_int (value, priv->x1);
|
||||
break;
|
||||
case PROP_Y1:
|
||||
g_value_set_int (value, priv->y1);
|
||||
break;
|
||||
case PROP_X2:
|
||||
g_value_set_int (value, priv->x2);
|
||||
break;
|
||||
case PROP_Y2:
|
||||
g_value_set_int (value, priv->y2);
|
||||
break;
|
||||
case PROP_DIRECTIONS:
|
||||
g_value_set_flags (value, priv->directions);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
meta_barrier_set_property (GObject *object,
|
||||
guint prop_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
MetaBarrier *barrier = META_BARRIER (object);
|
||||
MetaBarrierPrivate *priv = barrier->priv;
|
||||
switch (prop_id)
|
||||
{
|
||||
case PROP_DISPLAY:
|
||||
priv->display = g_value_get_object (value);
|
||||
break;
|
||||
case PROP_X1:
|
||||
priv->x1 = g_value_get_int (value);
|
||||
break;
|
||||
case PROP_Y1:
|
||||
priv->y1 = g_value_get_int (value);
|
||||
break;
|
||||
case PROP_X2:
|
||||
priv->x2 = g_value_get_int (value);
|
||||
break;
|
||||
case PROP_Y2:
|
||||
priv->y2 = g_value_get_int (value);
|
||||
break;
|
||||
case PROP_DIRECTIONS:
|
||||
priv->directions = g_value_get_flags (value);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
meta_barrier_dispose (GObject *object)
|
||||
{
|
||||
MetaBarrier *barrier = META_BARRIER (object);
|
||||
MetaBarrierPrivate *priv = barrier->priv;
|
||||
|
||||
if (meta_barrier_is_active (barrier))
|
||||
{
|
||||
meta_bug ("MetaBarrier wrapper %p for X barrier %ld was destroyed"
|
||||
" while the X barrier is still active.",
|
||||
barrier, priv->xbarrier);
|
||||
}
|
||||
|
||||
G_OBJECT_CLASS (meta_barrier_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_barrier_is_active (MetaBarrier *barrier)
|
||||
{
|
||||
return barrier->priv->xbarrier != 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_barrier_release:
|
||||
* @barrier: The barrier to release
|
||||
* @event: The event to release the pointer for
|
||||
*
|
||||
* In XI2.3, pointer barriers provide a feature where they can
|
||||
* be temporarily released so that the pointer goes through
|
||||
* them. Pass a #MetaBarrierEvent to release the barrier for
|
||||
* this event sequence.
|
||||
*/
|
||||
void
|
||||
meta_barrier_release (MetaBarrier *barrier,
|
||||
MetaBarrierEvent *event)
|
||||
{
|
||||
#ifdef HAVE_XI23
|
||||
MetaBarrierPrivate *priv = barrier->priv;
|
||||
if (META_DISPLAY_HAS_XINPUT_23 (priv->display))
|
||||
{
|
||||
XIBarrierReleasePointer (priv->display->xdisplay,
|
||||
META_VIRTUAL_CORE_POINTER_ID,
|
||||
priv->xbarrier, event->event_id);
|
||||
}
|
||||
#endif /* HAVE_XI23 */
|
||||
}
|
||||
|
||||
static void
|
||||
meta_barrier_constructed (GObject *object)
|
||||
{
|
||||
MetaBarrier *barrier = META_BARRIER (object);
|
||||
MetaBarrierPrivate *priv = barrier->priv;
|
||||
Display *dpy;
|
||||
Window root;
|
||||
|
||||
g_return_if_fail (priv->x1 == priv->x2 || priv->y1 == priv->y2);
|
||||
|
||||
if (priv->display == NULL)
|
||||
{
|
||||
g_warning ("A display must be provided when constructing a barrier.");
|
||||
return;
|
||||
}
|
||||
|
||||
dpy = priv->display->xdisplay;
|
||||
root = DefaultRootWindow (dpy);
|
||||
|
||||
priv->xbarrier = XFixesCreatePointerBarrier (dpy, root,
|
||||
priv->x1, priv->y1,
|
||||
priv->x2, priv->y2,
|
||||
priv->directions, 0, NULL);
|
||||
|
||||
/* Take a ref that we'll release when the XID dies inside destroy(),
|
||||
* so that the object stays alive and doesn't get GC'd. */
|
||||
g_object_ref (barrier);
|
||||
|
||||
g_hash_table_insert (priv->display->xids, &priv->xbarrier, barrier);
|
||||
|
||||
G_OBJECT_CLASS (meta_barrier_parent_class)->constructed (object);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_barrier_class_init (MetaBarrierClass *klass)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
|
||||
object_class->get_property = meta_barrier_get_property;
|
||||
object_class->set_property = meta_barrier_set_property;
|
||||
object_class->dispose = meta_barrier_dispose;
|
||||
object_class->constructed = meta_barrier_constructed;
|
||||
|
||||
obj_props[PROP_DISPLAY] =
|
||||
g_param_spec_object ("display",
|
||||
"Display",
|
||||
"The display to construct the pointer barrier on",
|
||||
META_TYPE_DISPLAY,
|
||||
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
|
||||
|
||||
obj_props[PROP_X1] =
|
||||
g_param_spec_int ("x1",
|
||||
"X1",
|
||||
"The first X coordinate of the barrier",
|
||||
0, G_MAXSHORT, 0,
|
||||
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
|
||||
|
||||
obj_props[PROP_Y1] =
|
||||
g_param_spec_int ("y1",
|
||||
"Y1",
|
||||
"The first Y coordinate of the barrier",
|
||||
0, G_MAXSHORT, 0,
|
||||
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
|
||||
|
||||
obj_props[PROP_X2] =
|
||||
g_param_spec_int ("x2",
|
||||
"X2",
|
||||
"The second X coordinate of the barrier",
|
||||
0, G_MAXSHORT, G_MAXSHORT,
|
||||
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
|
||||
|
||||
obj_props[PROP_Y2] =
|
||||
g_param_spec_int ("y2",
|
||||
"Y2",
|
||||
"The second Y coordinate of the barrier",
|
||||
0, G_MAXSHORT, G_MAXSHORT,
|
||||
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
|
||||
|
||||
obj_props[PROP_DIRECTIONS] =
|
||||
g_param_spec_flags ("directions",
|
||||
"Directions",
|
||||
"A set of directions to let the pointer through",
|
||||
META_TYPE_BARRIER_DIRECTION,
|
||||
0,
|
||||
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
|
||||
|
||||
g_object_class_install_properties (object_class, PROP_LAST, obj_props);
|
||||
|
||||
/**
|
||||
* MetaBarrier::hit:
|
||||
* @barrier: The #MetaBarrier that was hit
|
||||
* @event: A #MetaBarrierEvent that has the details of how
|
||||
* the barrier was hit.
|
||||
*
|
||||
* When a pointer barrier is hit, this will trigger. This
|
||||
* requires an XI2-enabled server.
|
||||
*/
|
||||
obj_signals[HIT] =
|
||||
g_signal_new ("hit",
|
||||
G_TYPE_FROM_CLASS (object_class),
|
||||
G_SIGNAL_RUN_FIRST,
|
||||
0,
|
||||
NULL, NULL, NULL,
|
||||
G_TYPE_NONE, 1,
|
||||
META_TYPE_BARRIER_EVENT);
|
||||
|
||||
/**
|
||||
* MetaBarrier::left:
|
||||
* @barrier: The #MetaBarrier that was left
|
||||
* @event: A #MetaBarrierEvent that has the details of how
|
||||
* the barrier was left.
|
||||
*
|
||||
* When a pointer barrier hitbox was left, this will trigger.
|
||||
* This requires an XI2-enabled server.
|
||||
*/
|
||||
obj_signals[LEFT] =
|
||||
g_signal_new ("left",
|
||||
G_TYPE_FROM_CLASS (object_class),
|
||||
G_SIGNAL_RUN_FIRST,
|
||||
0,
|
||||
NULL, NULL, NULL,
|
||||
G_TYPE_NONE, 1,
|
||||
META_TYPE_BARRIER_EVENT);
|
||||
|
||||
g_type_class_add_private (object_class, sizeof(MetaBarrierPrivate));
|
||||
}
|
||||
|
||||
void
|
||||
meta_barrier_destroy (MetaBarrier *barrier)
|
||||
{
|
||||
MetaBarrierPrivate *priv = barrier->priv;
|
||||
Display *dpy;
|
||||
|
||||
if (priv->display == NULL)
|
||||
return;
|
||||
|
||||
dpy = priv->display->xdisplay;
|
||||
|
||||
if (!meta_barrier_is_active (barrier))
|
||||
return;
|
||||
|
||||
XFixesDestroyPointerBarrier (dpy, priv->xbarrier);
|
||||
g_hash_table_remove (priv->display->xids, &priv->xbarrier);
|
||||
priv->xbarrier = 0;
|
||||
|
||||
g_object_unref (barrier);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_barrier_init (MetaBarrier *barrier)
|
||||
{
|
||||
barrier->priv = G_TYPE_INSTANCE_GET_PRIVATE (barrier, META_TYPE_BARRIER, MetaBarrierPrivate);
|
||||
}
|
||||
|
||||
#ifdef HAVE_XI23
|
||||
static void
|
||||
meta_barrier_fire_event (MetaBarrier *barrier,
|
||||
XIBarrierEvent *xevent)
|
||||
{
|
||||
MetaBarrierEvent *event = g_slice_new0 (MetaBarrierEvent);
|
||||
|
||||
event->ref_count = 1;
|
||||
event->event_id = xevent->eventid;
|
||||
event->time = xevent->time;
|
||||
event->dt = xevent->dtime;
|
||||
|
||||
event->x = xevent->root_x;
|
||||
event->y = xevent->root_y;
|
||||
event->dx = xevent->dx;
|
||||
event->dy = xevent->dy;
|
||||
|
||||
event->released = (xevent->flags & XIBarrierPointerReleased) != 0;
|
||||
event->grabbed = (xevent->flags & XIBarrierDeviceIsGrabbed) != 0;
|
||||
|
||||
switch (xevent->evtype)
|
||||
{
|
||||
case XI_BarrierHit:
|
||||
g_signal_emit (barrier, obj_signals[HIT], 0, event);
|
||||
break;
|
||||
case XI_BarrierLeave:
|
||||
g_signal_emit (barrier, obj_signals[LEFT], 0, event);
|
||||
break;
|
||||
default:
|
||||
g_assert_not_reached ();
|
||||
}
|
||||
|
||||
meta_barrier_event_unref (event);
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_display_process_barrier_event (MetaDisplay *display,
|
||||
XIBarrierEvent *xev)
|
||||
{
|
||||
MetaBarrier *barrier;
|
||||
|
||||
barrier = g_hash_table_lookup (display->xids, &xev->barrier);
|
||||
if (barrier != NULL)
|
||||
{
|
||||
meta_barrier_fire_event (barrier, xev);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
#endif /* HAVE_XI23 */
|
||||
|
||||
static MetaBarrierEvent *
|
||||
meta_barrier_event_ref (MetaBarrierEvent *event)
|
||||
{
|
||||
g_return_val_if_fail (event != NULL, NULL);
|
||||
g_return_val_if_fail (event->ref_count > 0, NULL);
|
||||
|
||||
g_atomic_int_inc ((volatile int *)&event->ref_count);
|
||||
return event;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_barrier_event_unref (MetaBarrierEvent *event)
|
||||
{
|
||||
g_return_if_fail (event != NULL);
|
||||
g_return_if_fail (event->ref_count > 0);
|
||||
|
||||
if (g_atomic_int_dec_and_test ((volatile int *)&event->ref_count))
|
||||
g_slice_free (MetaBarrierEvent, event);
|
||||
}
|
||||
|
||||
G_DEFINE_BOXED_TYPE (MetaBarrierEvent,
|
||||
meta_barrier_event,
|
||||
meta_barrier_event_ref,
|
||||
meta_barrier_event_unref)
|
@@ -22,8 +22,8 @@
|
||||
* 02111-1307, USA.
|
||||
*/
|
||||
|
||||
/**
|
||||
* SECTION:Bell
|
||||
/*
|
||||
* SECTION:bell
|
||||
* @short_description: Ring the bell or flash the screen
|
||||
*
|
||||
* Sometimes, X programs "ring the bell", whatever that means. Mutter lets
|
||||
@@ -52,7 +52,9 @@
|
||||
#include <config.h>
|
||||
#include "bell.h"
|
||||
#include "screen-private.h"
|
||||
#include "window-private.h"
|
||||
#include <meta/prefs.h>
|
||||
#include <meta/compositor.h>
|
||||
#ifdef HAVE_LIBCANBERRA
|
||||
#include <canberra-gtk.h>
|
||||
#endif
|
||||
|
@@ -28,30 +28,35 @@
|
||||
|
||||
#ifdef HAVE_XKB
|
||||
/**
|
||||
* meta_bell_notify:
|
||||
* @display: The display the bell event came in on
|
||||
* @xkb_ev: The bell event we just received
|
||||
*
|
||||
* Gives the user some kind of visual bell; in fact, this is our response
|
||||
* to any kind of bell request, but we set it up so that we only get
|
||||
* notified about visual bells, and X deals with audible ones.
|
||||
*
|
||||
* If the configure script found we had no XKB, this does not exist.
|
||||
*
|
||||
* \param display The display the bell event came in on
|
||||
* \param xkb_ev The bell event we just received
|
||||
*/
|
||||
void meta_bell_notify (MetaDisplay *display, XkbAnyEvent *xkb_ev);
|
||||
#endif
|
||||
|
||||
/**
|
||||
* meta_bell_set_audible:
|
||||
* @display: The display we're configuring
|
||||
* @audible: True for an audible bell, false for a visual bell
|
||||
*
|
||||
* Turns the bell to audible or visual. This tells X what to do, but
|
||||
* not Mutter; you will need to set the "visual bell" pref for that.
|
||||
*
|
||||
* If the configure script found we had no XKB, this is a no-op.
|
||||
*
|
||||
* \param display The display we're configuring
|
||||
* \param audible True for an audible bell, false for a visual bell
|
||||
*/
|
||||
void meta_bell_set_audible (MetaDisplay *display, gboolean audible);
|
||||
|
||||
/**
|
||||
* meta_bell_init:
|
||||
* @display: The display which is opening
|
||||
*
|
||||
* Initialises the bell subsystem. This involves intialising
|
||||
* XKB (which, despite being a keyboard extension, is the
|
||||
* place to look for bell notifications), then asking it
|
||||
@@ -64,8 +69,6 @@ void meta_bell_set_audible (MetaDisplay *display, gboolean audible);
|
||||
* we will have HAVE_XKB undefined, which will cause this
|
||||
* function to be a no-op.
|
||||
*
|
||||
* \param display The display which is opening
|
||||
*
|
||||
* \bug There is a line of code that's never run that tells
|
||||
* XKB to reset the bell status after we quit. Bill H said
|
||||
* (<http://bugzilla.gnome.org/show_bug.cgi?id=99886#c12>)
|
||||
@@ -75,9 +78,10 @@ void meta_bell_set_audible (MetaDisplay *display, gboolean audible);
|
||||
gboolean meta_bell_init (MetaDisplay *display);
|
||||
|
||||
/**
|
||||
* Shuts down the bell subsystem.
|
||||
* meta_bell_shutdown:
|
||||
* @display: The display which is closing
|
||||
*
|
||||
* \param display The display which is closing
|
||||
* Shuts down the bell subsystem.
|
||||
*
|
||||
* \bug This is never called! If we had XkbSetAutoResetControls
|
||||
* enabled in meta_bell_init(), this wouldn't be a problem, but
|
||||
@@ -86,11 +90,12 @@ gboolean meta_bell_init (MetaDisplay *display);
|
||||
void meta_bell_shutdown (MetaDisplay *display);
|
||||
|
||||
/**
|
||||
* meta_bell_notify_frame_destroy:
|
||||
* @frame: The frame which is being destroyed
|
||||
*
|
||||
* Deals with a frame being destroyed. This is important because if we're
|
||||
* using a visual bell, we might be flashing the edges of the frame, and
|
||||
* so we'd have a timeout function waiting ready to un-flash them. If the
|
||||
* frame's going away, we can tell the timeout not to bother.
|
||||
*
|
||||
* \param frame The frame which is being destroyed
|
||||
*/
|
||||
void meta_bell_notify_frame_destroy (MetaFrame *frame);
|
||||
|
@@ -1,6 +1,10 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/* Simple box operations */
|
||||
/**
|
||||
* SECTION:boxes
|
||||
* @Title: MetaRectangle
|
||||
* @Short_Description: Simple box operations
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2005, 2006 Elijah Newren
|
||||
|
@@ -89,7 +89,7 @@ meta_core_get (Display *xdisplay,
|
||||
if (request != META_CORE_WINDOW_HAS_FRAME &&
|
||||
(window == NULL || window->frame == NULL)) {
|
||||
meta_bug ("No such frame window 0x%lx!\n", xwindow);
|
||||
return;
|
||||
goto out;
|
||||
}
|
||||
|
||||
while (request != META_CORE_GET_END) {
|
||||
@@ -99,7 +99,7 @@ meta_core_get (Display *xdisplay,
|
||||
switch (request) {
|
||||
case META_CORE_WINDOW_HAS_FRAME:
|
||||
*((gboolean*)answer) = window != NULL && window->frame != NULL;
|
||||
if (!*((gboolean*)answer)) return; /* see above */
|
||||
if (!*((gboolean*)answer)) goto out; /* see above */
|
||||
break;
|
||||
case META_CORE_GET_CLIENT_WIDTH:
|
||||
*((gint*)answer) = window->rect.width;
|
||||
@@ -160,6 +160,7 @@ meta_core_get (Display *xdisplay,
|
||||
request = va_arg (args, MetaCoreGetType);
|
||||
}
|
||||
|
||||
out:
|
||||
va_end (args);
|
||||
}
|
||||
|
||||
@@ -775,3 +776,24 @@ meta_invalidate_default_icons (void)
|
||||
g_slist_free (windows);
|
||||
}
|
||||
|
||||
void
|
||||
meta_core_add_old_event_mask (Display *xdisplay,
|
||||
Window xwindow,
|
||||
XIEventMask *mask)
|
||||
{
|
||||
XIEventMask *prev;
|
||||
gint n_masks, i, j;
|
||||
|
||||
prev = XIGetSelectedEvents (xdisplay, xwindow, &n_masks);
|
||||
|
||||
for (i = 0; i < n_masks; i++)
|
||||
{
|
||||
if (prev[i].deviceid != XIAllMasterDevices)
|
||||
continue;
|
||||
|
||||
for (j = 0; j < MIN (mask->mask_len, prev[i].mask_len); j++)
|
||||
mask->mask[j] |= prev[i].mask[j];
|
||||
}
|
||||
|
||||
XFree (prev);
|
||||
}
|
||||
|
@@ -205,8 +205,8 @@ void meta_core_increment_event_serial (Display *display);
|
||||
|
||||
void meta_invalidate_default_icons (void);
|
||||
|
||||
void meta_core_add_old_event_mask (Display *xdisplay,
|
||||
Window xwindow,
|
||||
XIEventMask *mask);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
@@ -33,12 +33,12 @@
|
||||
|
||||
#include <glib.h>
|
||||
#include <X11/Xlib.h>
|
||||
#include "eventqueue.h"
|
||||
#include <meta/common.h>
|
||||
#include <meta/boxes.h>
|
||||
#include <meta/display.h>
|
||||
#include "keybindings-private.h"
|
||||
#include <meta/prefs.h>
|
||||
#include <meta/barrier.h>
|
||||
|
||||
#ifdef HAVE_STARTUP_NOTIFICATION
|
||||
#include <libsn/sn.h>
|
||||
@@ -92,7 +92,6 @@ struct _MetaDisplay
|
||||
|
||||
char *name;
|
||||
Display *xdisplay;
|
||||
char *hostname;
|
||||
|
||||
Window leader_window;
|
||||
Window timestamp_pinging_window;
|
||||
@@ -104,19 +103,20 @@ struct _MetaDisplay
|
||||
#include <meta/atomnames.h>
|
||||
#undef item
|
||||
|
||||
/* This is the actual window from focus events,
|
||||
* not the one we last set
|
||||
/* The window and serial of the most recent FocusIn event. */
|
||||
Window server_focus_window;
|
||||
gulong server_focus_serial;
|
||||
|
||||
/* Our best guess as to the "currently" focused window (that is, the
|
||||
* window that we expect will be focused at the point when the X
|
||||
* server processes our next request), and the serial of the request
|
||||
* or event that caused this.
|
||||
*/
|
||||
MetaWindow *focus_window;
|
||||
|
||||
/* window we are expecting a FocusIn event for or the current focus
|
||||
* window if we are not expecting any FocusIn/FocusOut events; not
|
||||
* perfect because applications can call XSetInputFocus directly.
|
||||
* (It could also be messed up if a timestamp later than current
|
||||
* time is sent to meta_display_set_input_focus_window, though that
|
||||
* would be a programming error). See bug 154598 for more info.
|
||||
*/
|
||||
MetaWindow *expected_focus_window;
|
||||
/* For windows we've focused that don't necessarily have an X window,
|
||||
* like the no_focus_window or the stage X window. */
|
||||
Window focus_xwindow;
|
||||
gulong focus_serial;
|
||||
|
||||
/* last timestamp passed to XSetInputFocus */
|
||||
guint32 last_focus_time;
|
||||
@@ -142,10 +142,9 @@ struct _MetaDisplay
|
||||
|
||||
/*< private-ish >*/
|
||||
guint error_trap_synced_at_last_pop : 1;
|
||||
MetaEventQueue *events;
|
||||
GSList *screens;
|
||||
MetaScreen *active_screen;
|
||||
GHashTable *window_ids;
|
||||
GHashTable *xids;
|
||||
int error_traps;
|
||||
int (* error_trap_handler) (Display *display,
|
||||
XErrorEvent *error);
|
||||
@@ -221,10 +220,6 @@ struct _MetaDisplay
|
||||
#ifdef HAVE_XKB
|
||||
int xkb_base_event_type;
|
||||
guint32 last_bell_time;
|
||||
#endif
|
||||
#ifdef HAVE_XSYNC
|
||||
/* alarm monitoring client's _NET_WM_SYNC_REQUEST_COUNTER */
|
||||
XSyncAlarm grab_sync_request_alarm;
|
||||
#endif
|
||||
int grab_resize_timeout_id;
|
||||
|
||||
@@ -245,6 +240,8 @@ struct _MetaDisplay
|
||||
unsigned int meta_mask;
|
||||
MetaKeyCombo overlay_key_combo;
|
||||
gboolean overlay_key_only_pressed;
|
||||
MetaKeyCombo *iso_next_group_combos;
|
||||
int n_iso_next_group_combos;
|
||||
|
||||
/* Monitor cache */
|
||||
unsigned int monitor_cache_invalidated : 1;
|
||||
@@ -315,10 +312,14 @@ struct _MetaDisplay
|
||||
#define META_DISPLAY_HAS_RENDER(display) ((display)->have_render)
|
||||
unsigned int have_composite : 1;
|
||||
unsigned int have_damage : 1;
|
||||
unsigned int have_xfixes : 1;
|
||||
#define META_DISPLAY_HAS_COMPOSITE(display) ((display)->have_composite)
|
||||
#define META_DISPLAY_HAS_DAMAGE(display) ((display)->have_damage)
|
||||
#define META_DISPLAY_HAS_XFIXES(display) ((display)->have_xfixes)
|
||||
#ifdef HAVE_XI23
|
||||
gboolean have_xinput_23 : 1;
|
||||
#define META_DISPLAY_HAS_XINPUT_23(display) ((display)->have_xinput_23)
|
||||
#else
|
||||
#define META_DISPLAY_HAS_XINPUT_23(display) FALSE
|
||||
#endif /* HAVE_XI23 */
|
||||
};
|
||||
|
||||
struct _MetaDisplayClass
|
||||
@@ -370,6 +371,16 @@ void meta_display_register_x_window (MetaDisplay *display,
|
||||
void meta_display_unregister_x_window (MetaDisplay *display,
|
||||
Window xwindow);
|
||||
|
||||
#ifdef HAVE_XSYNC
|
||||
MetaWindow* meta_display_lookup_sync_alarm (MetaDisplay *display,
|
||||
XSyncAlarm alarm);
|
||||
void meta_display_register_sync_alarm (MetaDisplay *display,
|
||||
XSyncAlarm *alarmp,
|
||||
MetaWindow *window);
|
||||
void meta_display_unregister_sync_alarm (MetaDisplay *display,
|
||||
XSyncAlarm alarm);
|
||||
#endif /* HAVE_XSYNC */
|
||||
|
||||
void meta_display_notify_window_created (MetaDisplay *display,
|
||||
MetaWindow *window);
|
||||
|
||||
@@ -447,8 +458,23 @@ void meta_display_queue_autoraise_callback (MetaDisplay *display,
|
||||
void meta_display_remove_autoraise_callback (MetaDisplay *display);
|
||||
|
||||
void meta_display_overlay_key_activate (MetaDisplay *display);
|
||||
void meta_display_accelerator_activate (MetaDisplay *display,
|
||||
guint action,
|
||||
guint deviceid,
|
||||
guint timestamp);
|
||||
gboolean meta_display_modifiers_accelerator_activate (MetaDisplay *display);
|
||||
|
||||
/* In above-tab-keycode.c */
|
||||
guint meta_display_get_above_tab_keycode (MetaDisplay *display);
|
||||
|
||||
#ifdef HAVE_XI23
|
||||
gboolean meta_display_process_barrier_event (MetaDisplay *display,
|
||||
XIBarrierEvent *event);
|
||||
#endif /* HAVE_XI23 */
|
||||
|
||||
void meta_display_set_input_focus_xwindow (MetaDisplay *display,
|
||||
MetaScreen *screen,
|
||||
Window window,
|
||||
guint32 timestamp);
|
||||
|
||||
#endif
|
||||
|
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user