Compare commits
573 Commits
wip/xinput
...
3.6.3
Author | SHA1 | Date | |
---|---|---|---|
8adc8c3898 | |||
5ad3260bb8 | |||
a16506cd67 | |||
9a1e36f458 | |||
81ac19a984 | |||
88def45498 | |||
d8503275ac | |||
d48ddff50c | |||
0dee738a43 | |||
846d7618d2 | |||
36722a8bdc | |||
8297678e11 | |||
9d37afc9e6 | |||
8685dba611 | |||
de051b2548 | |||
de9e93e469 | |||
79e54d1766 | |||
b0dfdf15fa | |||
2688d15d17 | |||
a2253a3e77 | |||
c828db5c8b | |||
ad293b7214 | |||
9c5ac65311 | |||
ce8d36a5db | |||
27b00d6f63 | |||
c441364bd3 | |||
1a521e10c3 | |||
e22d941f06 | |||
787d22dcd0 | |||
22d9182322 | |||
38295e8202 | |||
fe57f7572d | |||
aade16a9eb | |||
e31a97759e | |||
472662d099 | |||
027f16b096 | |||
5c7fdd67e8 | |||
4a0b6793bf | |||
228d1bf9aa | |||
85bcb9c121 | |||
989a38767e | |||
78e72f0a47 | |||
0faa623043 | |||
ecd7e662ff | |||
7d9925ba2e | |||
95c6547631 | |||
b5235d5a46 | |||
f3b1e8b3bd | |||
59bc5b7975 | |||
99cbe762d7 | |||
7a2c019514 | |||
c02e1b6f56 | |||
7938458eb8 | |||
165e117028 | |||
32cb4a178e | |||
7b69780d9a | |||
be500e33f9 | |||
427c5cc42b | |||
3f444cb2fe | |||
02bc4b54eb | |||
85c46be205 | |||
f97db0215b | |||
dc79d8aa3d | |||
00fecb6cea | |||
f0e97b540f | |||
37266aabfe | |||
6cc423cca6 | |||
ce820702e3 | |||
5eb72743dd | |||
ae1be578ba | |||
7e1e9320bc | |||
18a1ed6ec5 | |||
09713c5fd4 | |||
909cd82bea | |||
0593df8fe0 | |||
29b3e69dfa | |||
639d5e4710 | |||
8c36cf5939 | |||
cc107c0eda | |||
c7f70d71f7 | |||
9c6ccf96a5 | |||
11262b76df | |||
8fcc0db0c1 | |||
7c999a9d13 | |||
efc55347e0 | |||
5f11158721 | |||
88ee5a68d9 | |||
e1870a41b1 | |||
bb74499188 | |||
079822c3f4 | |||
bfacd9d420 | |||
36361b86d4 | |||
7c9c232d14 | |||
14c460c7fd | |||
0371194191 | |||
3b0c7c568d | |||
08893400a0 | |||
03cde43646 | |||
8617efb544 | |||
db4298502e | |||
9f90f25e80 | |||
1fdde85f53 | |||
0e529fba00 | |||
6a32fa9452 | |||
b422b6f06e | |||
bc96a14185 | |||
fbcddbcf3e | |||
dfe8979a90 | |||
c3a6de749b | |||
935e820a1d | |||
f4125b95ca | |||
d8bc7f7aa1 | |||
6d67ee3965 | |||
991ea50038 | |||
885a6afdcd | |||
0106f8bab1 | |||
d27bccd0ba | |||
c66488210c | |||
6c3985220e | |||
802c1ac427 | |||
7a2a6e2675 | |||
c27b4b7cfc | |||
0ab572d511 | |||
1c8d45e89c | |||
4e2c2cb1ab | |||
07dd4d3f93 | |||
22370bef09 | |||
f8d443b5b8 | |||
f22ecd1c57 | |||
b85be9312b | |||
cd0870730f | |||
d6be75ae99 | |||
c1be7f1a60 | |||
fccd5fd4ca | |||
1e5ef70fe3 | |||
1347a06e38 | |||
b5d5934e5a | |||
64b1c0f953 | |||
10d53fc7d2 | |||
eb1292ea99 | |||
e257580b94 | |||
42261156ec | |||
89e31f0d9d | |||
c805e397fd | |||
760a36aeee | |||
5d57a2594d | |||
1a5132d391 | |||
0fe0534c85 | |||
fe942049da | |||
e6ed29f0e2 | |||
15f11f879d | |||
f517eaf81e | |||
255347f876 | |||
e4ae7d7b1b | |||
2be943d1d9 | |||
0a50488bef | |||
78c966321a | |||
f65b7c59d3 | |||
e31f55e146 | |||
dc232b6cad | |||
a2f2e07e9b | |||
f5e48223c9 | |||
1478510392 | |||
18b38320a6 | |||
16be31b514 | |||
accc183474 | |||
81699619e8 | |||
75c87e5876 | |||
50bc4ad0e1 | |||
277e8bdad9 | |||
dc50ccf9b7 | |||
4595209346 | |||
50cf3dd1a5 | |||
66eac7824a | |||
4041f96ed3 | |||
3a15d637da | |||
5c3c7df948 | |||
f9454e29db | |||
574c0c3287 | |||
9fa5aa9889 | |||
80a70a4ad1 | |||
7c1b734053 | |||
33e1017403 | |||
f143fe3710 | |||
66406b3035 | |||
042ddc5637 | |||
5b04ab4473 | |||
16b86ae7f7 | |||
49400657ca | |||
30bc8bc6ce | |||
ac18f41ed1 | |||
60c05a0dac | |||
c47de98c88 | |||
f1aada0fae | |||
4de492eb20 | |||
9ca00d5cce | |||
b98e4e37ad | |||
8b64a951c9 | |||
c2a0719e44 | |||
8cb7a450ae | |||
6fb857cb23 | |||
fc87a635b2 | |||
81930ca76e | |||
da65738901 | |||
4528e1216a | |||
d56ecde39b | |||
4148a5cc6a | |||
8a6a568aca | |||
12cc0cee29 | |||
878b1012b4 | |||
a78fec7951 | |||
a24c512caa | |||
c669a3892e | |||
ba4f008d40 | |||
b0a099935b | |||
aba39ef953 | |||
ebf8c460e1 | |||
25d3432eee | |||
cd7a74fbcd | |||
c64188c67f | |||
4c2371f2e7 | |||
ff6c31dcc0 | |||
1b649c18ed | |||
93037e4c6b | |||
ed358c8f4b | |||
a22859a64a | |||
c44438b19f | |||
b58366d3ad | |||
6900128b2f | |||
c0b4d68390 | |||
0d794f28f0 | |||
e389eff79d | |||
41adbdda12 | |||
2d6555ca4d | |||
044d58951e | |||
9c97e8999e | |||
e97b38b38e | |||
8809673a74 | |||
68321d9bf4 | |||
65390e50a4 | |||
f8d32661b5 | |||
d84911fdf9 | |||
4147ea4660 | |||
2dd7c98641 | |||
3aad30143c | |||
93d06d4368 | |||
b19c061db5 | |||
497258f6e5 | |||
977e6388ad | |||
0879cf0d8d | |||
4aab7fb7b9 | |||
839fee19ef | |||
46a56bafbd | |||
c8b4939c7e | |||
fc3e82421a | |||
23046f6e28 | |||
823208120d | |||
d12c507b12 | |||
2157c238b6 | |||
423bda908e | |||
98d427ddba | |||
7a35579c3f | |||
adc89fbb2c | |||
a6ca3f768f | |||
9362fbdcde | |||
47099f4a87 | |||
2e6e5b068c | |||
ee840bc832 | |||
6333c174dc | |||
a3bf9b01aa | |||
402b477458 | |||
6b273ca713 | |||
c3ec6b34a3 | |||
78dc480e86 | |||
53364f986c | |||
5770b5b3c3 | |||
f16f47bd38 | |||
58a57185b7 | |||
8fb361cb26 | |||
335d211204 | |||
7f64d6b92e | |||
8c1b2d5eda | |||
578b1c06c7 | |||
6dfde43786 | |||
a8ead4d447 | |||
2926323a9a | |||
13bc8f7a76 | |||
ad516492d2 | |||
6677c61db3 | |||
f26f61ed7d | |||
8ca86fa8bf | |||
f2f500836e | |||
c39998efee | |||
3b811f33c7 | |||
beea2f7acd | |||
fb4c50478d | |||
ac0602a02e | |||
5361e0259f | |||
04bf73ff6d | |||
047b9de1c6 | |||
39b3244a3e | |||
63f982eb72 | |||
c689306dae | |||
0b7f2f8cd3 | |||
efc90173b1 | |||
9e439a22b5 | |||
848c1f52f3 | |||
1b84be7031 | |||
eb08a65b4c | |||
43ba596a0e | |||
2e1de1a037 | |||
81ede6abf8 | |||
1d98f1fee8 | |||
f0582d1a86 | |||
607dbf0f43 | |||
584cd3e684 | |||
90ec5b05f3 | |||
7253a75b18 | |||
cdbe3b274f | |||
3f3e3ce37e | |||
5e3d93da87 | |||
82b1d0d7e5 | |||
3583e57ec3 | |||
2ddde04678 | |||
feda493fbf | |||
fc72309b71 | |||
860c2a6282 | |||
e6b4a34daf | |||
3319cdfec0 | |||
fc5594faad | |||
7c9e0c2ebc | |||
9157cc2b70 | |||
69e7b32b54 | |||
04835eccb5 | |||
01c363bb6a | |||
7649772394 | |||
ca3dc2e876 | |||
70d85049b1 | |||
29f6f5e0ad | |||
d249cfd040 | |||
3cb912aee2 | |||
7df823132c | |||
41353d642b | |||
c47039db82 | |||
0dab6df25a | |||
c844bab232 | |||
848f9d1399 | |||
2e63de5c0a | |||
7319b10d72 | |||
1265efcf78 | |||
3e0ef03fd9 | |||
37076941ad | |||
25e43618a4 | |||
fd404bafc8 | |||
3b3b26b000 | |||
33498f6b84 | |||
c0a440b852 | |||
1772a2a59c | |||
44f362ad87 | |||
478f1020a4 | |||
e8209e7b22 | |||
2d20c9ecad | |||
f35160c30f | |||
7fad591d6e | |||
a364cea779 | |||
2eb3ff4bfb | |||
796ca6746d | |||
0a79fb8d62 | |||
ac7ec585c8 | |||
264c555af0 | |||
bbbb0e6002 | |||
41ae760454 | |||
9729a99ec5 | |||
d64c5bfc11 | |||
e4ed433e18 | |||
8ab5cc8f19 | |||
35261808a9 | |||
3a4512cd91 | |||
eb0185c1b1 | |||
34f6ffd1ad | |||
baeb9fbc4b | |||
c3d76aead6 | |||
bed9cb1648 | |||
4ca552785f | |||
b26b11c74d | |||
b3114bb9e5 | |||
497f9be61e | |||
a88365df9b | |||
47f98c5528 | |||
0e50287aea | |||
d42a2a3c27 | |||
78849bef04 | |||
b1a69d1e89 | |||
c5468ee391 | |||
7ce7feeb2b | |||
c0432ebb39 | |||
1a51d307c8 | |||
d0910da036 | |||
a2726f41c9 | |||
162213be0d | |||
1596d1af10 | |||
441287dc64 | |||
6e47f0e846 | |||
4fb2fab7f7 | |||
3beb33bb44 | |||
1b04a40dce | |||
8087872130 | |||
3ad25a62cd | |||
7ecd673d23 | |||
331c9aaee4 | |||
ec1979f9f5 | |||
4b411ea241 | |||
70db187c36 | |||
4de3f1d147 | |||
821d4458ea | |||
7f9472a58f | |||
3599917123 | |||
d624e85bc1 | |||
6aa4bfd060 | |||
a26e72c452 | |||
acc4e03482 | |||
e176a9e891 | |||
0b36663ff1 | |||
bb035fe6e0 | |||
6d0c1f08d2 | |||
f700a7be07 | |||
138eb1e3b4 | |||
c39129b6e8 | |||
bf175e72ad | |||
ba31ba4615 | |||
f94f008ed6 | |||
9d4f3c5842 | |||
0b2a9d58e0 | |||
28deea44d4 | |||
f82966adb5 | |||
9f54f1d75d | |||
be9f7d7729 | |||
1b4dce6f84 | |||
3bb17f0671 | |||
19d111a27b | |||
289561ddf3 | |||
d2ca160ea3 | |||
cd19f9239c | |||
16157ad522 | |||
d37a692392 | |||
f78f33d848 | |||
c4692b8d51 | |||
764569eb7a | |||
aab0d2f54e | |||
24678de261 | |||
1b71eeb02a | |||
bfc6a2b078 | |||
9c9da8f575 | |||
d1a87288a4 | |||
e7c65d9404 | |||
00e49b330c | |||
7c6bc73031 | |||
c1368155fc | |||
d305174ecc | |||
6b7391bca9 | |||
4e99c38491 | |||
6087a71951 | |||
5f1c3de29a | |||
abde64cb0c | |||
6923973c8a | |||
d7f1b95349 | |||
4a5c7ee4cc | |||
f3bb16f301 | |||
d6b528a955 | |||
7ba6503e9b | |||
9ee7783759 | |||
2dc5693c60 | |||
a1ef22e0d7 | |||
19b6888ea5 | |||
9520eaa970 | |||
088e0c1ee7 | |||
de704386a1 | |||
766799ec6d | |||
7c50db5bf5 | |||
7223c4e184 | |||
b0a9c391a1 | |||
5c7158792f | |||
9c71d23884 | |||
e1362562b4 | |||
1ab6abc044 | |||
bf4f3a8a99 | |||
f9626d2db6 | |||
28b59589ca | |||
fb10910e66 | |||
6d2efe9460 | |||
f587595765 | |||
5e6e8728c3 | |||
f620f1b466 | |||
818320e748 | |||
fc2e7e94a5 | |||
a47e35ba2e | |||
07d8b2d510 | |||
6329aeac11 | |||
af1fef03f4 | |||
f778cf0ea3 | |||
7af6aa9739 | |||
faae2daae8 | |||
0b4cc14aa6 | |||
622583a0d5 | |||
2f33d85a41 | |||
3abb651325 | |||
ada8882b61 | |||
d3831729a0 | |||
05fee9beea | |||
e4da6495d3 | |||
8c74ad1992 | |||
88064fd534 | |||
b28c6533f8 | |||
53e70b3e99 | |||
c630046858 | |||
a75c4d2cc9 | |||
368a90c82a | |||
2be1574e55 | |||
7f8c59614e | |||
3650e9b074 | |||
978e601217 | |||
dcfa6986c6 | |||
49a3fd53b0 | |||
d33d113746 | |||
f83568fc4e | |||
46415bb248 | |||
5123a1fb03 | |||
19f4a5c819 | |||
69e9b70829 | |||
443ca1cc02 | |||
9a5f4a3346 | |||
16a40dde7b | |||
36e6e65778 | |||
b3bf2e08f3 | |||
3ec500937f | |||
c45c4af5da | |||
a485685867 | |||
08363f4d9b | |||
2f254e5aa3 | |||
e0e78993f6 | |||
eeb2efe010 | |||
be4ef9b43d | |||
a133d8b42e | |||
a1a2527c75 | |||
6f5882302f | |||
ce9c7a210d | |||
e0fb83c691 | |||
7e0a56fb80 | |||
65e1b416ef | |||
183bcd6fc7 | |||
f76372dd7d | |||
9c493ab56a | |||
a17f73a020 | |||
6ff9cae2b1 | |||
d3edcbc11e | |||
779ef582f1 | |||
385887c55b | |||
f396a7aeb4 | |||
ffa2310a34 | |||
fccd626604 | |||
5237b2aa65 | |||
b1ae599c39 | |||
3f694c7335 | |||
3da2f876bd | |||
a6d08fcd71 | |||
73d22a273e | |||
24843f277f | |||
4167ef870c | |||
cd7a968093 | |||
12f71c9795 | |||
b369c75e1b | |||
739eade4fa | |||
d2b63eaf1f |
10
.gitignore
vendored
10
.gitignore
vendored
@ -19,6 +19,7 @@ libtool
|
||||
ltmain.sh
|
||||
missing
|
||||
.deps
|
||||
src/50-mutter-windows.xml
|
||||
src/mutter-wm.desktop
|
||||
src/mutter.desktop
|
||||
*.o
|
||||
@ -40,6 +41,7 @@ stamp-h1
|
||||
stamp-it
|
||||
.intltool-merge-cache
|
||||
POTFILES
|
||||
po/*.pot
|
||||
50-metacity-desktop-key.xml
|
||||
50-metacity-key.xml
|
||||
inlinepixbufs.h
|
||||
@ -47,7 +49,8 @@ libmutter.pc
|
||||
mutter
|
||||
mutter-theme-viewer
|
||||
mutter.desktop
|
||||
mutter.schemas
|
||||
org.gnome.mutter.gschema.valid
|
||||
org.gnome.mutter.gschema.xml
|
||||
testasyncgetprop
|
||||
testboxes
|
||||
testgradient
|
||||
@ -56,10 +59,13 @@ mutter-mag
|
||||
mutter-message
|
||||
mutter-window-demo
|
||||
focus-window
|
||||
test-attached
|
||||
test-gravity
|
||||
test-resizing
|
||||
test-size-hints
|
||||
wm-tester
|
||||
# We can't say just "wm-tester" here or it will ignore the directory
|
||||
# rather than the binary
|
||||
src/wm-tester/wm-tester
|
||||
INSTALL
|
||||
mkinstalldirs
|
||||
src/mutter-enum-types.[ch]
|
||||
|
8
HACKING
8
HACKING
@ -42,10 +42,10 @@ Minimal Building/Testing Environment
|
||||
build a development version of Metacity -- odds are, you may be able
|
||||
to build metacity from CVS without building any other modules.
|
||||
|
||||
As long as you have gtk+ >= 2.10 and GConf with your distro (gtk+ >=
|
||||
2.6 if you manually revert the change from bug 348633), you should
|
||||
be able to install your distro's development packages
|
||||
(e.g. gtk2-devel, GConf2-devel, startup-notification-devel on
|
||||
As long as you have gtk+ >= 3.0 and GIO >= 2.25.10 with your distro
|
||||
(gtk+ >= 2.6 if you manually revert the change from bug 348633), you
|
||||
should be able to install your distro's development packages
|
||||
(e.g. gtk2-devel, glib-devel, startup-notification-devel on
|
||||
Fedora; also, remember to install the gnome-common package which is
|
||||
needed for building cvs versions of Gnome modules like Metacity) as
|
||||
well as the standard development tools (gcc, autoconf, automake,
|
||||
|
480
NEWS
480
NEWS
@ -1,3 +1,483 @@
|
||||
3.6.3
|
||||
=====
|
||||
* Fix maximized windows jumping between monitors [Alban; #556696]
|
||||
* Fix windows turning black when redirected again [Adel; #693042]
|
||||
|
||||
Contributors:
|
||||
Alban Crequy, Adel Gadllah
|
||||
|
||||
Translations:
|
||||
Runa Bhattacharjee [bn_IN], Rajesh Ranjan [hi], Krishnababu Krothapalli [te],
|
||||
ManojKumar Giri [or], Dr.T.Vasudevan [ta], Shankar Prasad [kn],
|
||||
Rafael Ferreira [pt_BR]
|
||||
|
||||
3.6.2
|
||||
=====
|
||||
* Only process keyboard mapping events for the core X keyboard [Rui; #674859]
|
||||
|
||||
Contributor:
|
||||
Rui Matos
|
||||
|
||||
Translations:
|
||||
Marek Černocký [cs], Мирослав Николић [sr, sr@latin], Mattias Põldaru [et],
|
||||
Nilamdyuti Goswami [as], Sweta Kothari [gu], Tobias Endrigkeit [de],
|
||||
A S Alam [pa]
|
||||
|
||||
3.6.1
|
||||
=====
|
||||
* Fix crash when opening large popup menus [Jasper; #681676]
|
||||
* window: Don't move the desktop window after monitor hotplug [Jasper; #681159]
|
||||
* Expose MetaPlugin to introspection [Evan; #671098]
|
||||
* Optionally delay focus changes in focus-follows-mouse mode [Florian; #678169]
|
||||
* Resize the guard window when the X screen is resized [Benjamin; #670396]
|
||||
* display: Only manage the default X screen [Jürg; #648156]
|
||||
* Misc cleanups: [Owen; #587255]
|
||||
|
||||
Contributors:
|
||||
Benjamin Berg, Jürg Billeter, Evan Broder, Florian Müllner, Jasper St. Pierre,
|
||||
Owen Taylor
|
||||
|
||||
Translations:
|
||||
Alexandre Franke [fr], Theppitak Karoonboonyanan [th], Sayak Sarkar [bn_IN],
|
||||
Sandeep Sheshrao Shedmake [mr], Ask H. Larsen [da], Shankar Prasad [kn],
|
||||
Alexander Shopov [bg], Aurimas Černius [lt], Ihar Hrachyshka [be],
|
||||
Kjartan Maraas [nb], Daniel Mustieles [es], Changwoo Ryu [ko],
|
||||
Yuri Myasoedov [ru], Tom Tryfonidis [el], Rūdolfs Mazurs [lv],
|
||||
Chris Leonard [en_GB], Piotr Drąg [pl], Fran Diéguez [gl], Gil Forcada [ca],
|
||||
Matej Urbančič [sl], Andika Triwidada [id], Carles Ferrando [ca]
|
||||
|
||||
3.6.0
|
||||
=====
|
||||
|
||||
Translations:
|
||||
Alexander Shopov [bg], Daniel Korostil [uk], Rajesh Ranjan [hi],
|
||||
Krishnababu Krothapalli [te], Ani Peter [ml], Rūdolfs Mazurs [lv],
|
||||
Sweta Kothari [gu], Ihar Hrachyshka [be], Noriko Mizumoto [ja],
|
||||
Timo Jyrinki [fi], Mattias Põldaru [et]
|
||||
|
||||
3.5.92
|
||||
======
|
||||
* screen: Allow NULL out arguments in meta_screen_get_size [Tomeu]
|
||||
* display: Add API to set wm_name / wm_keybindings [Florian; #671010]
|
||||
* Improve the not responding dialog [Jon, Florian; #684306]
|
||||
* Misc. bugfixes [Jasper]
|
||||
|
||||
Contributors:
|
||||
William Jon McCann, Florian Müllner, Jasper St. Pierre, Tomeu Vizoso
|
||||
|
||||
Translations:
|
||||
Gabor Kelemen [hu], Piotr Drąg [pl], Dr.T.Vasudevan [ta], Bruce Cowan [en_GB],
|
||||
Alexandre Franke [fr], Theppitak Karoonboonyanan [th], Gil Forcada [ca],
|
||||
Carles Ferrando [ca@valencia], Tobias Endrigkeit [de], Tom Tryfonidis [el],
|
||||
Nguyễn Thái Ngọc Duy [vi], Changwoo Ryu [ko], Ask H. Larsen [da],
|
||||
Rafael Ferreira [pt_BR], Marek Černocký [cs]
|
||||
|
||||
3.5.91
|
||||
======
|
||||
* Do not include markup in app not responding dialog [Alex]
|
||||
* Fix subtracting unredirected windows from visible region [Jasper; #677116]
|
||||
* Minor improvements and bugfixes [Jasper, Florian; #682648, #682993]
|
||||
|
||||
Contributors:
|
||||
Alexander Larsson, Florian Müllner, Jasper St. Pierre
|
||||
|
||||
Translations:
|
||||
Dirgita [id], Piotr Drąg [pl], A S Alam [pa], Yuri Myasoedov [ru],
|
||||
Milo Casagrande [it], Nilamdyuti Goswami [as], Tom Tryfonidis [el],
|
||||
Duarte Loreto [pt], Fran Diéguez [gl], Nguyễn Thái Ngọc Duy [vi],
|
||||
Aurimas Černius [lt], Daniel Nylander [sv]
|
||||
|
||||
3.5.90
|
||||
======
|
||||
* Fix logic for handling translations of the windows group [Owen; #681221]
|
||||
* Handle painting inside a Clutter clone [Owen; #681953]
|
||||
* Update overlay-key on settings changes [Florian; #681906]
|
||||
* Add keybinding for overlay-key [Florian; #665547]
|
||||
* Minor fixes and improvements [Javier, Florian]
|
||||
|
||||
Contributors:
|
||||
Javier Jardón, Florian Müllner, Owen Taylor
|
||||
|
||||
Translations:
|
||||
Sweta Kothari [gu], Muhammet Kara [tr], Khaled Hosny [ar],
|
||||
Sandeep Sheshrao Shedmake [mr]
|
||||
|
||||
3.5.5
|
||||
=====
|
||||
* Fix flickering around windows when using window group [Tom; #681221]
|
||||
|
||||
Contributor(s):
|
||||
Tom Beckmann
|
||||
|
||||
Translations:
|
||||
Chao-Hsiung Liao [zh_HK, zh_TW], Matej Urbančič [sl], Fran Diéguez [gl],
|
||||
Мирослав Николић [sr, sr@latin], Yaron Shahrabani [he], Kjartan Maraas [nb]
|
||||
|
||||
3.5.4
|
||||
=====
|
||||
* Make it possible to reimplement move-to-workspace keybindings from plugins
|
||||
[Giovanni; #674104]
|
||||
* Add a preference to ignore hide-titlebar-when-maximized hint [Rico; #678947]
|
||||
* window: Also use hide-titlebar-when-maximized when tiled [Florian; #679290]
|
||||
* Center modal dialogs on their parent instead [Florian; #674499]
|
||||
* Reduce amount of markup in translated messages [Matthias; #679660]
|
||||
* Fix focus problem after closing a window with focus-follows-mouse
|
||||
[Jasper; #675982]
|
||||
* Handle changes of the attach-modal-dialogs preference [Florian; #679904]
|
||||
* Do not restore tiling on unmaximize [Florian; #677565]
|
||||
* Misc. fixes and cleanups [Jasper Adriaanse, Jasper, Debarshi, Pavel;
|
||||
#679153, 673824]
|
||||
|
||||
Contributors:
|
||||
Jasper Lievisse Adriaanse, Giovanni Campagna, Matthias Clasen, Florian Müllner,
|
||||
Debarshi Ray, Jasper St. Pierre, Rico Tzschichholz, Pavel Vasin
|
||||
|
||||
Translations:
|
||||
Alexander Shopov [bg], Kjartan Maraas [nb], Yaron Shahrabani [he],
|
||||
Nilamdyuti Goswami [as], Ihar Hrachyshka [be], Daniel Mustieles [es]
|
||||
|
||||
3.5.3
|
||||
=====
|
||||
* Simplify plugin system [Jasper; #676855]
|
||||
* meta-window-actor: Don't unredirect shaped windows [Jasper; #677657]
|
||||
* screen: Add new public meta_screen_get_current_monitor API [Tim; #642591]
|
||||
* frames: Increase the size of resize corners [Jasper; #677669]
|
||||
* window: Make some window methods public [Jasper; #678126]
|
||||
* Fix crash when running mutter stand-alone [Jasper; #678238]
|
||||
* meta-window-actor: Fix potential crash in shaping code [Jasper; #677977]
|
||||
* Misc. fixes [Jasper, Marc-Antoine, Rico]
|
||||
|
||||
Contributors:
|
||||
Tim L, Marc-Antoine Perennou, Jasper St. Pierre, Rico Tzschichholz
|
||||
|
||||
Translations:
|
||||
|
||||
Daniel Mustieles [es], Matej Urbančič [sl], Khaled Hosny [ar],
|
||||
Bruno Brouard [fr], Fran Diéguez [gl]
|
||||
|
||||
3.5.2
|
||||
=====
|
||||
* keybindings: Remove 'toggle-recording' binding [Florian; #674376]
|
||||
* Switch to gtk-doc syntax [Jasper; #673752]
|
||||
* shaped-texture: never slice shape mask texture [Robert; #674731]
|
||||
* Make Mutter stop relying on Cogl including a GL header [Neil; #672711]
|
||||
* Make support for "XFree86" Xinerama mandatory [Owen; #674727]
|
||||
* meta_window_move_frame(): fix crash when frame is NULL [Owen; #675254]
|
||||
* Fix memory leaks [Pavel; #672640]
|
||||
* Code cleanups [Jasper; #671104 #674876 #676052]
|
||||
* Look for themes in XDG user data dir [Jasper; #675316]
|
||||
* Remove frame pixel caching [Jasper; #675111]
|
||||
* stack: Ignore keep-on-top property on maximized windows [Florian; #673581]
|
||||
* Misc. fixes [Javier, Jasper, Owen, Rico]
|
||||
|
||||
Contributors:
|
||||
Robert Bragg, Javier Járdon, Florian Müllner, Neil Roberts, Jasper St. Pierre,
|
||||
Owen Taylor, Rico Tzschichholz, Pavel Vasin
|
||||
|
||||
Translations:
|
||||
Praveen Illa [te], Luca Ferretti [it], Daniel Mustieles [es]
|
||||
|
||||
3.4.1
|
||||
=====
|
||||
* API change: the meta_display_add_keybinding() function added in 3.4
|
||||
wasn't usable from a GNOME Shell extension, so has been changed to take
|
||||
a GSettings object rather than the name of a schema [Jasper; #673014]
|
||||
* Don't try to auto-maximize not-maximizable windows; this fixes the problem
|
||||
with the Nautilus desktop window being mis-positioned when enabled
|
||||
[Owen; #673566]
|
||||
* Fix a crash in the default plugin (not used in GNOME) [Giovanni; #673809]
|
||||
* Make the <Super> key work when set as the mouse button modifier
|
||||
[Florian; #662476]
|
||||
|
||||
Contributors:
|
||||
Giovanni Campagna, Florian Muellner, Jasper St. Pierre, Owen Taylor
|
||||
|
||||
Translations:
|
||||
Khaled Hosny [ar], Jordi Serratosa [ca], Carles Ferrando [ca@valencia],
|
||||
Christian Kirbach [de], Kristjan Schmidt [eo], Arash Mousavi [fa],
|
||||
Jiro Matsuzawa [ja], Shankar Prasad [kn], Aurimas Černius [lt],
|
||||
Yinghua Wang [zh_CN]
|
||||
|
||||
3.4.0
|
||||
=====
|
||||
* Fix crash when a full-screen window is opened [Jasper; #672797]
|
||||
* Fix memory leaks [Pavel; #672640]
|
||||
|
||||
Contributors:
|
||||
Jasper St. Pierre, Pavel Vasin
|
||||
|
||||
Translations:
|
||||
Marek Černocký, Petr Kovar [cz], Bruno Brouard [fr], Sweta Kothari [gu],
|
||||
Yaron Shahrabani [he], Changwoo Ryu [kr], Enrico Nicoletto [pt_BR],
|
||||
Yuri Myasoedov [ru], Muhammet Kara [tr], Nguyễn Thái Ngọc Duy [vi]
|
||||
|
||||
3.3.92
|
||||
======
|
||||
* Automaximize large windows on map [Adel; #671677]
|
||||
* When unmaximizing windows, make sure the unminimized size
|
||||
is signficantly less than the maximized size [Adel; #671677]
|
||||
* Don't offer maximize option for windows larger than the screen
|
||||
[Jasper; #643606]
|
||||
* Always focus the window immediately underneath without restacking
|
||||
when closing a window [Jasper; #620744]
|
||||
* Avoid drawing shadows when two windows are tiled together [Rui; #643075]
|
||||
* Remove tooltips for window decorations [Florian; #645101]
|
||||
* Add org.gnome.mutter.dynamic-workspaces GSetting - when this is set
|
||||
to true, workspace counts are never saved to GSettings, avoiding
|
||||
pointless disk traffic for GNOME dynamic workspaces [Florian; #671568]
|
||||
* Add ::grab-op-begin, ::grab-op-end signals to MetaDisplay [Jasper; #670658]
|
||||
* Add meta_display_get_ignored_modifier_mask() [Florian; #665215]
|
||||
* Remove pointless wrapper methods on MetaPlugin [Jasper; #671103]
|
||||
* Fix frame drawing with 3.3.x GTK+ releases [Florian; #671796]
|
||||
* Build fixes [Jasper, Rico, Rui]
|
||||
* Misc bug fixes [Damien, Jasper, Lionel, Marius, Owen, Rui;
|
||||
#661256, #667437, #671601, #671087, #672374]
|
||||
|
||||
Contributors:
|
||||
Stefano Facchini, Adel Gadllah, Lionel Landwerlin, Mariusz Libera,
|
||||
Rui Matos, Florian Müllner, Jasper St. Pierre, Damien Radtke, Owen Taylor,
|
||||
Rico Tzschichholz
|
||||
|
||||
Translations:
|
||||
Nilamdyuti Goswami [as], Ihar Hrachyshka [be], Alexander Shopov [bg],
|
||||
David Planella [ca], Carles Ferrando [ca@valencia], Kenneth Nielsen [dk],
|
||||
Bruce Cowan [en_GB], Daniel Mustieles [es], Mattias Põldaru [et],
|
||||
Inaki Larranaga Murgoitio [eu], Timo Jyrinki [fi], Fran Diéguez [gl],
|
||||
Gabor Kelemen [hu], Changwoo Ryu [ko], Anita Reitere [lv],
|
||||
Kjartan Maraas [nb], Wouter Bolsterlee [nl], A S Alam [pa], Piotr Drąg [pl],
|
||||
Duarte Loreto [pt], Yuri Myasoedov [ru], Daniel Nylander [se],
|
||||
Matej Urbančič [sl], Miroslav Nikolić [sr], Tirumurti Vasudevan [ta],
|
||||
Sasi Bhushan [te], Daniel Korostil [uk], Nguyễn Thái Ngọc Duy [vi],
|
||||
YunQiang Su [zh_CN], Chao-Hsiung Liao [zh_HK, zh_TW]
|
||||
|
||||
3.3.90
|
||||
======
|
||||
* Update for Cogl API changes [Robert]
|
||||
* Bug fixes [Adel, Jasper; #659643]
|
||||
* Build fixes [Jasper, Owen]
|
||||
|
||||
Contributors:
|
||||
Robert Bragg, Adel Gadllah, Jasper St. Pierre, Owen Taylor
|
||||
|
||||
Translations:
|
||||
Ask H. Larsen [dk], Miroslav Nikolić [sr]
|
||||
|
||||
3.3.5
|
||||
=====
|
||||
* MetaShapedTexture no longer is a ClutterTexture subclass [Jasper; #660941]
|
||||
* Add meta_shaped_texture_get_image() [Jasper; #660941]
|
||||
* Cleanups [Rui, Jasper; #657639]
|
||||
* Depend on GTK+ 3.3.7 [Rico]
|
||||
|
||||
Contributors:
|
||||
Rui Matos, Jasper St. Pierre, Rico Tzschichholz
|
||||
|
||||
Translations:
|
||||
Kjartan Maraas [nb], Chao-Hsiung Liao [zh_HK, zh_TW]
|
||||
|
||||
3.3.4
|
||||
=====
|
||||
* Adapt to changes in GtkStateFlags [Owen]
|
||||
* Redo properties for applications menu corresponding to GTK+ changes -
|
||||
they are now _GTK_* not DBUS_*. [Ryan]
|
||||
* Fix crash on gnome-shell restart when a modal dialog is open [Owen; #668299]
|
||||
* Code cleanup [Florian; #666039]
|
||||
|
||||
Contributors:
|
||||
Ryan Lortie, Florian Müllner, Owen Taylor
|
||||
|
||||
Translations:
|
||||
Alexander Shopov [bg], Fran Diéguez [gl]
|
||||
|
||||
3.3.3
|
||||
=====
|
||||
* Add keybindings for tiling to left or right [Florian; #648700]
|
||||
* Support GTK+'s hide-titlebar-when-maximized hint [Florian; #665617]
|
||||
* Load _DBUS_APPLICATION_ID, _DBUS_UNIQUE_NAME, _DBUS_OBJECT_PATH
|
||||
property [Colin, Ryan; #664851]
|
||||
* Handle changes to workspaces-only-on-primary GSetting [Florian; #664853]
|
||||
* Don't use the Clutter default stage [Jasper; #664028]
|
||||
* Fix compilation with --disable-introspection [Lionel; #661871]
|
||||
* Fix problem where stage could end up mis-sized on startup with
|
||||
multiple monitors [Lionel]
|
||||
* Misc bug fixes [Adel, Lionel, Jasper; #666015]
|
||||
|
||||
Contributors:
|
||||
Adel Gadllah, Lionel Landwerlin, Florian Müllner, Jasper St. Pierre
|
||||
|
||||
Translations:
|
||||
Daniel Mustieles [es], Yaron Shahrabani [he], Kjartan Maraas [nb],
|
||||
Matej Urbančič [sk], Muhammet Kara [tr]
|
||||
|
||||
3.3.2
|
||||
=====
|
||||
|
||||
* Move from GConf to GSettings for preferences [Florian; #635378]
|
||||
* Add meta_display_add_keybinding()/meta_display_remove_keybinding()
|
||||
to allow creating new keybindings at runtime [Florian; #663428]
|
||||
* Add suport for new _NET_WM_STATE_FOCUSED atom in _NET_WM_STATE
|
||||
to allow applications to draw unfocused windows differently
|
||||
[Rui; #661427]
|
||||
* Add meta_window_move_resize_frame() to allow specifying the
|
||||
size and position of a window via the outside dimensions of the
|
||||
window frame.
|
||||
* Don't activate window tiling when moving in snap mode
|
||||
[Rui; #662270]
|
||||
* Remove the ability to resize a window from the inner edge of
|
||||
the titlebar [Jasper; #660129]
|
||||
* Fix for deprecations in GTK+ [Jasper, Rico; #662574, #662895]
|
||||
* Misc bug fixes [Jasper, Rico, Rui; #662895, #642652, #660941, #662225]
|
||||
|
||||
Contributors:
|
||||
Tim Cuthbertson, Rui Matos, Florian Müllner, Jasper St. Pierre, Rico Tzschichholz
|
||||
|
||||
Translations:
|
||||
Jorge González (es), Kjartan Maraas (nb), Krishnababu Krothapalli (te), Nguyễn Thái Ngọc Duy (vi)
|
||||
|
||||
3.2.1
|
||||
=====
|
||||
* Allow keyboard window switching (alt-Tab) during drag-and-drop
|
||||
[Matthias, #660457]
|
||||
* Don't add invisible resize borders to fullscreen windows
|
||||
[Jasper, Owen; #659854]
|
||||
* Fix crash when toplevel windows were set to unexpected window types
|
||||
[Owen; #599988]
|
||||
* Correct problems with windows moving when restarting or switching
|
||||
window managers [Jasper; #660848]
|
||||
* Fix interaction of tiled windows with multiple monitors
|
||||
[Rui; #642580, #657519]
|
||||
* Make meta_display_unmanage_screen() public [Jasper; #660848]
|
||||
* Fix problem with turning off window decorations on the fly [Rui; #660773]
|
||||
* Fix spurious assertion failures with themes such as Nodoka [Sandro; #661286]
|
||||
* Misc bug fixes [Adel, Jasper, Rui; #660464, #660854, #662053]
|
||||
|
||||
Contributors:
|
||||
Matthias Clasen, Sandro Mani, Rui Matos, Jasper St. Pierre, Owen Taylor
|
||||
|
||||
Translations:
|
||||
Tommi Vainikainen [fi], Miroslav Nikolić [sr, sr@latin], Muhammet Kara [tr]
|
||||
|
||||
3.2.0
|
||||
=====
|
||||
* Fix _NET_WM_FRAME_EXTENTS not to include invisible borders [Jasper; #659848]
|
||||
* Fix application-specified window placement (-geometry) for
|
||||
invisible borders [Jasper; #659848]
|
||||
|
||||
Contributors:
|
||||
Jasper St. Pierre
|
||||
|
||||
Translations:
|
||||
Nilamdyuti Goswami [as], Carles Ferrando [ca@valencia], Petr Kovar [cz],
|
||||
Mario Blättermann [de], Inaki Larranaga [eu], Gabor Kelemen [hu],
|
||||
Takayoshi Okano [ja], Changwoo Ryu [ko], Djavan Fagundes [pt_BR]
|
||||
|
||||
3.1.92
|
||||
======
|
||||
* Fix bug with unredirecting full-screen windows on multi-monitor -
|
||||
notably affected gnome-screensaver [Adel; #657869]
|
||||
* Disable top resizing of attached dialogs [Jasper; #657795]
|
||||
* Code cleanup [Jasper, Rui]
|
||||
* Misc bug fixes [Adel, Florian, Jasper, Rui;
|
||||
#658069, #659266, #659523, #659477]
|
||||
|
||||
Contributors:
|
||||
Adel Gadllah, Rui Matos, Florian Müllner, Jasper St. Pierre
|
||||
|
||||
Translations:
|
||||
Joan Duran [ca], Joe Hansen [dk], Jiro Matsuzawa [ja], Daniel Korostil [uk]
|
||||
|
||||
3.1.91.1
|
||||
========
|
||||
* Fix problem where certain application updates would get lost [#657071, Owen]
|
||||
* Fix a problem where after resuming from the screensaver, things got
|
||||
slow [#658228, Jasper, Adel]
|
||||
* When a monitor is plugged or unplugged, keep existing windows on their
|
||||
current monitor [#645408, Alex]
|
||||
* Remove 'Mutter' title from alerts such as
|
||||
"The widow '%s' is not responding" [Matthias]
|
||||
* Remove pointless warning:
|
||||
Received a _NET_WM_MOVERESIZE message for %s; these
|
||||
messages lack timestamps and therefore suck.
|
||||
[Rui]
|
||||
* Misc bug fixes [Jasper]
|
||||
* Build fixes [Javier]
|
||||
|
||||
Contributors:
|
||||
Matthias Clasen, Adel Gadllah, Javier Jardón, Alex Larsson, Rui Matos,
|
||||
Jasper St. Pierre, Owen Taylor
|
||||
|
||||
Translations:
|
||||
Ihar Hrachyshka [be], Bruce Cowan [en_FB], Daniel Mustieles [es],
|
||||
Claude Paroz [fr], Andika Triwidada [id], Luca Ferretti [it],
|
||||
Rudolfs Mazurs [lt], Piotr Drąg [pl], Duarte Loreto [pt],
|
||||
Matej Urbančič [sl], Tirumurti Vasudevan [ta], Chao-Hsiung Liao [zh_KH, TW]
|
||||
|
||||
3.1.90.1
|
||||
========
|
||||
* Fix crash when no windows are open [Adel; #657692]
|
||||
* Fix annotations for new strictness in gobject-introspection [Jasper, Owen]
|
||||
* Fix some errors with rounded frame drawing [Jasper; #657661]
|
||||
|
||||
Contributors:
|
||||
Adel Gadllah, Jasper St. Pierre, Owen Taylor
|
||||
|
||||
3.1.90
|
||||
======
|
||||
* Extend the draggable portion of window borders outside the visible frame
|
||||
for easy resizing with thin borders. (New draggable_border_width GConf key
|
||||
controls the total width of visible and invisible borders.)
|
||||
[Jasper; #644930]
|
||||
* Draw rounded window corners with antialising [Jasper; #628195]
|
||||
* Unredirect override-redirect fullscreen windows, such as full-screen
|
||||
3D games to avoid any performance impact [Adel; #597014]
|
||||
* Add :resizable and :above properties to MetaWindow. [Tim; #653858]
|
||||
* Add MUTTER_DISABLE_FALLBACK_COLOR environment variable to allow visualizing
|
||||
places where a color is missing for gtk:custom() colors [Florian; #656112]
|
||||
* Don't attach modal dialogs to special windows like the desktop;
|
||||
add meta_window_is_attached_dialog() [Dan, #646761]
|
||||
* Make MetaBackgroundActor public, allow creating multiple instances
|
||||
(sharing a common texture), and add a :dim-factor property
|
||||
[Rui, Owen; #656433]
|
||||
* Fix attached dialogs to not be resizable from the top and to be
|
||||
position correctly [Jasper; #656619]
|
||||
* Misc bug fixes [Jasper, Rui; #656335, #657583]
|
||||
|
||||
Contributors:
|
||||
Tim Cuthbertson, Adel Gadllah, Rui Matos, Florian Müllner, Jasper St. Pierre,
|
||||
Owen Taylor, Dan Winship
|
||||
|
||||
Translations:
|
||||
Alexander Shopov [bg], Jorge González [es], Fran Dieguez [gl],
|
||||
Yaron Shahrabani [he], Takeshi Aihana [ja], Aurimas Černius [lt],
|
||||
Kjartan Maraas [nb], A S Alam [pa], Yuri Kozlov [ru], Daniel Nylander [se],
|
||||
Theppitak Karoonboonyanan [th], Abduxukur Abdurixit [ug], Aron Xu [zh_CN]
|
||||
|
||||
3.1.4
|
||||
=====
|
||||
* Use better, much more subtle shadow definitions [Jakub; #649374]
|
||||
* Add the ability to use named GTK+ colors in theme files as
|
||||
gtk:custom(name,fallback) [Florian; #648709]
|
||||
* Port from GdkColor to GdkRGBA and from GtkStyle to GtkStyleContext
|
||||
[Florian; #650586]
|
||||
* Try to fix window bindings using the Super key [Owen; #624869]
|
||||
* Update to using more modern Cogl and Clutter APIs
|
||||
[Adel, Emmanuele, Neil; #654551 #654729 #654730 #655064]
|
||||
* Fix for srcdir != builddir builds [Thierry; #624910]
|
||||
* Make handling of focus appearance for attached dialogs more robust
|
||||
[Dan; #647712]
|
||||
* Misc bug fixes
|
||||
[Dan, Florian, Jasper, Owen, Rui; #642957 #649374 #650661 #654489 #654539]
|
||||
|
||||
Contributors:
|
||||
Emmanuele Bassi, Adel Gadllah, Rui Matos, Florian Müllner, Neil Roberts,
|
||||
Jasper St. Pierre, Jakub Steiner, Owen Taylor
|
||||
|
||||
Translations:
|
||||
Ihar Hrachyshka [be], Jorge González, Daniel Mustieles [es],
|
||||
Fran Dieguez [gl], Yaron Shahrabani [he], Takeshi Aihana [ja],
|
||||
Kjartan Maraas [nb], Rudolfs Mazurs [lv], Matej Urbančič [sl],
|
||||
Abduxukur Abdurixit [ug], Nguyễn Thái Ngọc Duy [vi]
|
||||
|
||||
3.1.3.1
|
||||
=======
|
||||
* Back API version down to "3.0" - the change to Meta-3.1.gir
|
||||
|
29
README
29
README
@ -18,8 +18,7 @@ COMPILING MUTTER
|
||||
You need GTK+ 2.2. For startup notification to work you need
|
||||
libstartup-notification at
|
||||
http://www.freedesktop.org/software/startup-notification/ or on the
|
||||
GNOME ftp site. You also need GConf 1.2 (unless building a funky
|
||||
extra-small embedded metacity with --disable-gconf, see below).
|
||||
GNOME ftp site.
|
||||
You need Clutter 1.0. You need gobject-introspection 0.6.3.
|
||||
|
||||
REPORTING BUGS AND SUBMITTING PATCHES
|
||||
@ -59,25 +58,24 @@ MUTTER FEATURES
|
||||
and should work with KWin, fvwm2, and other EWMH-compliant WMs.)
|
||||
|
||||
- Has a simple theme system and a couple of extra themes come with it.
|
||||
Change themes via gconf-editor or gconftool or GNOME themes control
|
||||
panel:
|
||||
gconftool-2 --type=string --set /apps/metacity/general/theme Crux
|
||||
gconftool-2 --type=string --set /apps/metacity/general/theme Gorilla
|
||||
gconftool-2 --type=string --set /apps/metacity/general/theme Atlanta
|
||||
gconftool-2 --type=string --set /apps/metacity/general/theme Bright
|
||||
Change themes via gsettings:
|
||||
gsettings set org.gnome.desktop.wm.preferences theme Crux
|
||||
gsettings set org.gnome.desktop.wm.preferences theme Gorilla
|
||||
gsettings set org.gnome.desktop.wm.preferences theme Atlanta
|
||||
gsettings set org.gnome.desktop.wm.preferences theme Bright
|
||||
|
||||
See theme-format.txt for docs on the theme format. Use
|
||||
metacity-theme-viewer to preview themes.
|
||||
|
||||
- Change number of workspaces via gconf-editor or gconftool:
|
||||
gconftool-2 --type=int --set /apps/metacity/general/num_workspaces 5
|
||||
- Change number of workspaces via gsettings:
|
||||
gsettings set org.gnome.desktop.wm.preferences num-workspaces 5
|
||||
|
||||
Can also change workspaces from GNOME 2 pager.
|
||||
|
||||
- Change focus mode:
|
||||
gconftool-2 --type=string --set /apps/metacity/general/focus_mode mouse
|
||||
gconftool-2 --type=string --set /apps/metacity/general/focus_mode sloppy
|
||||
gconftool-2 --type=string --set /apps/metacity/general/focus_mode click
|
||||
gsettings set org.gnome.desktop.wm.preferences focus-mode mouse
|
||||
gsettings set org.gnome.desktop.wm.preferences focus-mode sloppy
|
||||
gsettings set org.gnome.desktop.wm.preferences focus-mode click
|
||||
|
||||
- Global keybinding defaults include:
|
||||
|
||||
@ -92,10 +90,9 @@ MUTTER FEATURES
|
||||
|
||||
Change keybindings for example:
|
||||
|
||||
unst gconftool-2 --type=string --set /apps/metacity/global_keybindings/switch_to_workspace_1 '<Alt>F1'
|
||||
gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-1 '[<Alt>F1]'
|
||||
|
||||
Also try the GNOME keyboard shortcuts control panel, or
|
||||
gconf-editor.
|
||||
Also try the GNOME keyboard shortcuts control panel.
|
||||
|
||||
- Window keybindings:
|
||||
|
||||
|
177
configure.in
177
configure.in
@ -1,8 +1,8 @@
|
||||
AC_PREREQ(2.50)
|
||||
|
||||
m4_define([mutter_major_version], [3])
|
||||
m4_define([mutter_minor_version], [1])
|
||||
m4_define([mutter_micro_version], [3.1])
|
||||
m4_define([mutter_minor_version], [6])
|
||||
m4_define([mutter_micro_version], [3])
|
||||
|
||||
m4_define([mutter_version],
|
||||
[mutter_major_version.mutter_minor_version.mutter_micro_version])
|
||||
@ -15,9 +15,9 @@ AC_INIT([mutter], [mutter_version],
|
||||
AC_CONFIG_SRCDIR(src/core/display.c)
|
||||
AC_CONFIG_HEADERS(config.h)
|
||||
|
||||
AM_INIT_AUTOMAKE([dist-bzip2 no-dist-gzip])
|
||||
AM_INIT_AUTOMAKE([1.11 no-dist-gzip dist-xz tar-ustar])
|
||||
m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])],)
|
||||
AM_MAINTAINER_MODE
|
||||
AM_MAINTAINER_MODE([enable])
|
||||
|
||||
MUTTER_MAJOR_VERSION=mutter_major_version
|
||||
MUTTER_MINOR_VERSION=mutter_minor_version
|
||||
@ -61,21 +61,23 @@ AC_CHECK_SIZEOF(__int64)
|
||||
## byte order
|
||||
AC_C_BIGENDIAN
|
||||
|
||||
GTK_MIN_VERSION=2.91.7
|
||||
CANBERRA_GTK=libcanberra-gtk3
|
||||
CANBERRA_GTK_VERSION=0.26
|
||||
|
||||
MUTTER_PC_MODULES="gtk+-3.0 >= $GTK_MIN_VERSION pango >= 1.2.0 cairo >= 1.10.0"
|
||||
CLUTTER_PACKAGE=clutter-1.0
|
||||
|
||||
AC_ARG_ENABLE(gconf,
|
||||
AC_HELP_STRING([--disable-gconf],
|
||||
[disable gconf usage, for embedded/size-sensitive non-GNOME builds]),,
|
||||
enable_gconf=yes)
|
||||
MUTTER_PC_MODULES="
|
||||
gtk+-3.0 >= 3.3.7
|
||||
gio-2.0 >= 2.25.10
|
||||
pango >= 1.2.0
|
||||
cairo >= 1.10.0
|
||||
gsettings-desktop-schemas >= 3.3.0
|
||||
xcomposite >= 0.2 xfixes xrender xdamage
|
||||
$CLUTTER_PACKAGE >= 1.9.10
|
||||
cogl-1.0 >= 1.9.6
|
||||
"
|
||||
|
||||
if test x$enable_gconf = xyes; then
|
||||
AC_DEFINE(HAVE_GCONF,1,[Build with gconf support])
|
||||
MUTTER_PC_MODULES="$MUTTER_PC_MODULES gconf-2.0 >= 1.2.0"
|
||||
fi
|
||||
GLIB_GSETTINGS
|
||||
|
||||
AC_ARG_ENABLE(verbose-mode,
|
||||
AC_HELP_STRING([--disable-verbose-mode],
|
||||
@ -111,17 +113,14 @@ AC_ARG_ENABLE(shape,
|
||||
[disable mutter's use of the shaped window extension]),,
|
||||
enable_shape=auto)
|
||||
|
||||
## try definining HAVE_BACKTRACE
|
||||
AC_CHECK_HEADERS(execinfo.h, [AC_CHECK_FUNCS(backtrace)])
|
||||
|
||||
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 >= $GTK_MIN_VERSION)
|
||||
PKG_CHECK_MODULES(MUTTER_WINDOW_DEMO, gtk+-3.0 >= $GTK_MIN_VERSION)
|
||||
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"
|
||||
@ -171,44 +170,6 @@ else
|
||||
fi
|
||||
fi
|
||||
|
||||
XCOMPOSITE_VERSION=0.2
|
||||
|
||||
AC_MSG_CHECKING([Xcomposite >= $XCOMPOSITE_VERSION])
|
||||
if $PKG_CONFIG --atleast-version $XCOMPOSITE_VERSION xcomposite; then
|
||||
MUTTER_PC_MODULES="$MUTTER_PC_MODULES xcomposite >= $XCOMPOSITE_VERSION xfixes xrender xdamage"
|
||||
AC_DEFINE(HAVE_COMPOSITE_EXTENSIONS, 1, [Building with compositing manager support])
|
||||
echo "Building with compositing manager"
|
||||
|
||||
## force on render also
|
||||
have_xrender=yes
|
||||
else
|
||||
AC_MSG_ERROR([no. Mutter requires the Xcomposite extension to build.])
|
||||
fi
|
||||
|
||||
CLUTTER_VERSION=1.2.0
|
||||
CLUTTER_PACKAGE=clutter-1.0
|
||||
AC_SUBST(CLUTTER_PACKAGE)
|
||||
if $PKG_CONFIG --atleast-version $CLUTTER_VERSION $CLUTTER_PACKAGE ; then
|
||||
MUTTER_PC_MODULES="$MUTTER_PC_MODULES $CLUTTER_PACKAGE "
|
||||
PKG_CHECK_MODULES(CLUTTER, $CLUTTER_PACKAGE)
|
||||
AC_DEFINE(WITH_CLUTTER, , [Building with Clutter compositor])
|
||||
|
||||
dnl Check for the clutter-glx-texture-pixmap header
|
||||
mutter_save_cppflags="$CPPFLAGS"
|
||||
CPPFLAGS="$CPPFLAGS $CLUTTER_CFLAGS"
|
||||
AC_CHECK_HEADER([clutter/glx/clutter-glx-texture-pixmap.h],
|
||||
[have_glx_texture_pixmap=yes],
|
||||
[have_glx_texture_pixmap=no])
|
||||
CPPFLAGS="$mutter_save_cppflags"
|
||||
|
||||
if test x$have_glx_texture_pixmap = xyes; then
|
||||
AC_DEFINE(HAVE_GLX_TEXTURE_PIXMAP, ,
|
||||
[Is ClutterGLXTexturePixmap available?])
|
||||
fi
|
||||
else
|
||||
AC_MSG_ERROR([no. Mutter requires Clutter version $CLUTTER_VERSION.])
|
||||
fi
|
||||
|
||||
INTROSPECTION_VERSION=0.9.5
|
||||
GOBJECT_INTROSPECTION_CHECK([$INTROSPECTION_VERSION])
|
||||
|
||||
@ -240,64 +201,39 @@ fi
|
||||
|
||||
PKG_CHECK_MODULES(MUTTER, $MUTTER_PC_MODULES)
|
||||
|
||||
# This is used for plugins
|
||||
AC_SUBST(CLUTTER_PACKAGE)
|
||||
PKG_CHECK_MODULES(CLUTTER, $CLUTTER_PACKAGE)
|
||||
|
||||
AC_PATH_XTRA
|
||||
|
||||
ALL_X_LIBS="$X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS"
|
||||
|
||||
# Check for Xinerama extension (Solaris impl or Xfree impl)
|
||||
# Check for Xinerama extension - we only support the "XFree86" style,
|
||||
# and not the older Solaris-only version; recent Solaris supports the
|
||||
# XFree86 style.
|
||||
mutter_save_cppflags="$CPPFLAGS"
|
||||
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
|
||||
|
||||
AC_ARG_ENABLE(xinerama,
|
||||
AC_HELP_STRING([--disable-xinerama],
|
||||
[disable mutter's use of the Xinerama extension]),
|
||||
try_xinerama=$enable_xinerama,try_xinerama=yes)
|
||||
|
||||
use_solaris_xinerama=no
|
||||
use_xfree_xinerama=no
|
||||
if test "${try_xinerama}" != no; then
|
||||
case "$host" in
|
||||
*-*-solaris*)
|
||||
# Check for solaris
|
||||
use_solaris_xinerama=yes
|
||||
AC_CHECK_LIB(Xext, XineramaGetInfo,
|
||||
use_solaris_xinerama=yes, use_solaris_xinerama=no,
|
||||
$ALL_X_LIBS)
|
||||
if test "x$use_solaris_xinerama" = "xyes"; then
|
||||
AC_CHECK_HEADER(X11/extensions/xinerama.h,
|
||||
if test -z "`echo $ALL_X_LIBS | grep "\-lXext" 2> /dev/null`"; then
|
||||
X_EXTRA_LIBS="-lXext $X_EXTRA_LIBS"
|
||||
fi
|
||||
AC_DEFINE(HAVE_SOLARIS_XINERAMA, , [Have Solaris-style Xinerama])
|
||||
AC_DEFINE(HAVE_XINERAMA, , [Have some version of Xinerama]),
|
||||
use_solaris_xinerama=no,
|
||||
[#include <X11/Xlib.h>])
|
||||
fi
|
||||
AC_MSG_CHECKING(for Xinerama support on Solaris)
|
||||
AC_MSG_RESULT($use_solaris_xinerama);
|
||||
;;
|
||||
*)
|
||||
# Check for XFree
|
||||
use_xfree_xinerama=yes
|
||||
AC_CHECK_LIB(Xinerama, XineramaQueryExtension,
|
||||
[AC_CHECK_HEADER(X11/extensions/Xinerama.h,
|
||||
X_EXTRA_LIBS="-lXinerama $X_EXTRA_LIBS"
|
||||
if test -z "`echo $ALL_X_LIBS | grep "\-lXext" 2> /dev/null`"; then
|
||||
X_EXTRA_LIBS="-lXext $X_EXTRA_LIBS"
|
||||
fi
|
||||
AC_DEFINE(HAVE_XFREE_XINERAMA, , [Have XFree86-style Xinerama])
|
||||
AC_DEFINE(HAVE_XINERAMA,, [Have some version of Xinerama]),
|
||||
use_xfree_xinerama=no,
|
||||
[#include <X11/Xlib.h>])],
|
||||
use_xfree_xinerama=no, -lXext $ALL_X_LIBS)
|
||||
AC_MSG_CHECKING(for Xinerama support on XFree86)
|
||||
AC_MSG_RESULT($use_xfree_xinerama);
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
have_xinerama=yes
|
||||
AC_CHECK_LIB(Xinerama, XineramaQueryExtension,
|
||||
[AC_CHECK_HEADER(X11/extensions/Xinerama.h,
|
||||
[X_EXTRA_LIBS="-lXinerama $X_EXTRA_LIBS"
|
||||
if test -z "`echo $ALL_X_LIBS | grep "\-lXext" 2> /dev/null`"; then
|
||||
X_EXTRA_LIBS="-lXext $X_EXTRA_LIBS"
|
||||
fi],
|
||||
have_xinerama=no,
|
||||
[#include <X11/Xlib.h>])],
|
||||
have_xinerama=no, -lXext $ALL_X_LIBS)
|
||||
AC_MSG_CHECKING(for Xinerama support)
|
||||
AC_MSG_RESULT($have_xinerama)
|
||||
|
||||
CPPFLAGS="$mutter_save_cppflags"
|
||||
|
||||
if test x$have_xinerama = xno; then
|
||||
AC_MSG_ERROR([Xinerama extension was not found])
|
||||
fi
|
||||
|
||||
SHAPE_LIBS=
|
||||
found_shape=no
|
||||
AC_CHECK_LIB(Xext, XShapeQueryExtension,
|
||||
@ -413,18 +349,6 @@ fi
|
||||
|
||||
AC_SUBST(GDK_PIXBUF_CSOURCE)
|
||||
|
||||
if test x$enable_gconf = xyes; then
|
||||
AC_PATH_PROG(GCONFTOOL, gconftool-2, no)
|
||||
if test x"$GCONFTOOL" = xno; then
|
||||
AC_MSG_ERROR([gconftool-2 executable not found in your path - should be installed with GConf])
|
||||
fi
|
||||
|
||||
AM_GCONF_SOURCE_2
|
||||
else
|
||||
GCONF_SCHEMAS_INSTALL_TRUE='#'
|
||||
GCONF_SCHEMAS_INSTALL_FALSE=
|
||||
fi
|
||||
|
||||
AC_PATH_PROG(ZENITY, zenity, no)
|
||||
if test x"$ZENITY" = xno; then
|
||||
AC_MSG_ERROR([zenity not found in your path - needed for dialogs])
|
||||
@ -440,9 +364,6 @@ fi
|
||||
# For fix-meta-rectangle.py
|
||||
AM_PATH_PYTHON([2.5])
|
||||
|
||||
# Use gnome-doc-utils:
|
||||
GNOME_DOC_INIT([0.8.0])
|
||||
|
||||
#### Warnings (last since -Werror can disturb other tests)
|
||||
|
||||
# Stay command-line compatible with the gnome-common configure option. Here
|
||||
@ -502,7 +423,7 @@ if test "$enable_compile_warnings" != no ; then
|
||||
if test "$enable_compile_warnings" = error; then
|
||||
case " $CFLAGS " in
|
||||
*[\ \ ]-Werror[\ \ ]*) ;;
|
||||
*) CFLAGS="$CFLAGS -Werror" ;;
|
||||
*) CFLAGS="$CFLAGS -Werror -Wno-error=deprecated-declarations" ;;
|
||||
esac
|
||||
fi
|
||||
fi
|
||||
@ -524,13 +445,6 @@ po/Makefile.in
|
||||
|
||||
AC_OUTPUT
|
||||
|
||||
if test x$enable_gconf = xno; then
|
||||
echo "*** WARNING WARNING WARNING WARNING WARNING"
|
||||
echo "*** Building without GConf. This means there's no"
|
||||
echo "*** way to change prefs except hacking source code."
|
||||
echo "*** This is intended for embedded systems etc., not for normal use."
|
||||
fi
|
||||
|
||||
if test x$enable_verbose_mode = xno; then
|
||||
echo "*** WARNING WARNING WARNING WARNING WARNING"
|
||||
echo "*** Building without verbose mode"
|
||||
@ -547,9 +461,6 @@ mutter-$VERSION
|
||||
source code location: ${srcdir}
|
||||
compiler: ${CC}
|
||||
|
||||
GConf: ${enable_gconf}
|
||||
XFree86 Xinerama: ${use_xfree_xinerama}
|
||||
Solaris Xinerama: ${use_solaris_xinerama}
|
||||
Startup notification: ${have_startup_notification}
|
||||
libcanberra: ${have_libcanberra}
|
||||
Introspection: ${found_introspection}
|
||||
@ -564,8 +475,8 @@ MUTTER_MINOR_VERSION=mutter_minor_version
|
||||
if expr $MUTTER_MINOR_VERSION % 2 > /dev/null ; then
|
||||
stable_version=`expr $MUTTER_MINOR_VERSION - 1`
|
||||
echo "This is the UNSTABLE branch of mutter"
|
||||
echo -n "Use 2.$stable_version.x for stable "
|
||||
echo "(gnome-2-$stable_version branch in git)"
|
||||
echo -n "Use 3.$stable_version.x for stable "
|
||||
echo "(gnome-3-$stable_version branch in git)"
|
||||
else
|
||||
echo "This is the stable branch of mutter"
|
||||
fi
|
||||
|
@ -31,8 +31,7 @@ workspaces. In these cases, there needs to be a rule consistent with
|
||||
the above about the new window to choose.
|
||||
|
||||
Focus method Behavior
|
||||
click Focus the most recently used window (same as the window
|
||||
on top)
|
||||
click Focus the window on top
|
||||
sloppy Focus the window containing the pointer if there is such
|
||||
a window, otherwise focus the most recently used window.
|
||||
mouse Focus the non-DESKTOP window containing the pointer if
|
||||
|
@ -46,13 +46,13 @@ because the original program does not have a manual page.
|
||||
Restart \fBmutter\fP(1) which is running.
|
||||
.TP
|
||||
.B reload-theme
|
||||
Reload a theme which is specified on gconf database.
|
||||
Reload a theme which is specified on gsettings database.
|
||||
.TP
|
||||
.B enable-keybindings
|
||||
Enable all of keybindings which is specified on gconf database.
|
||||
Enable all of keybindings which is specified on gsettings database.
|
||||
.TP
|
||||
.B disable-keybindings
|
||||
Disable all of keybindings which is specified on gconf database.
|
||||
Disable all of keybindings which is specified on gsettings database.
|
||||
.SH SEE ALSO
|
||||
.BR mutter (1)
|
||||
.SH AUTHOR
|
||||
|
@ -51,7 +51,7 @@ Print the version number.
|
||||
.B \-?, \-\-help
|
||||
Show summary of options.
|
||||
.SH CONFIGURATION
|
||||
\fBmutter\fP configuration can be found under \fIPreferences\fP->\fIWindows\fP and \fIPreferences\fP->\fIKeyboard Shortcuts\fP on the menu-panel. Advanced configuration can be achieved directly through gconf editing (gconf-editor or gconftool-2).
|
||||
\fBmutter\fP configuration can be found under \fIPreferences\fP->\fIWindows\fP and \fIPreferences\fP->\fIKeyboard Shortcuts\fP on the menu-panel. Advanced configuration can be achieved directly through gsettings.
|
||||
.SH SEE ALSO
|
||||
.BR mutter-message (1)
|
||||
.SH AUTHOR
|
||||
|
@ -39,4 +39,11 @@ environment.</description>
|
||||
<gnome:userid>otaylor</gnome:userid>
|
||||
</foaf:Person>
|
||||
</maintainer>
|
||||
<maintainer>
|
||||
<foaf:Person>
|
||||
<foaf:name>Florian Müllner</foaf:name>
|
||||
<foaf:mbox rdf:resource="mailto:fmuellner@gnome.org" />
|
||||
<gnome:userid>fmuellner</gnome:userid>
|
||||
</foaf:Person>
|
||||
</maintainer>
|
||||
</Project>
|
||||
|
@ -1,7 +1,7 @@
|
||||
# List of source files containing translatable strings.
|
||||
# Please keep this file sorted alphabetically.
|
||||
src/50-mutter-windows.xml.in
|
||||
src/compositor/compositor.c
|
||||
src/core/all-keybindings.h
|
||||
src/core/bell.c
|
||||
src/core/core.c
|
||||
src/core/delete.c
|
||||
@ -19,7 +19,7 @@ src/core/window-props.c
|
||||
src/core/xprops.c
|
||||
src/mutter.desktop.in
|
||||
src/mutter-wm.desktop.in
|
||||
src/mutter.schemas.in
|
||||
src/org.gnome.mutter.gschema.xml.in
|
||||
src/tools/mutter-message.c
|
||||
src/ui/frames.c
|
||||
src/ui/menu.c
|
||||
|
2892
po/bn_IN.po
2892
po/bn_IN.po
File diff suppressed because it is too large
Load Diff
1296
po/ca@valencia.po
1296
po/ca@valencia.po
File diff suppressed because it is too large
Load Diff
1266
po/en_GB.po
1266
po/en_GB.po
File diff suppressed because it is too large
Load Diff
522
po/et.po
522
po/et.po
@ -7,253 +7,39 @@
|
||||
#
|
||||
# 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.
|
||||
# Mattias Põldaru <mahfiaz@gmail.com>, 2008–2011, 2012.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: mutter MASTER\n"
|
||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
|
||||
"product=mutter&component=general\n"
|
||||
"POT-Creation-Date: 2011-03-07 23:35+0000\n"
|
||||
"PO-Revision-Date: 2011-03-09 06:41+0200\n"
|
||||
"Last-Translator: Ivar Smolin <okul@linux.ee>\n"
|
||||
"Language-Team: Estonian <gnome-et@linux.ee>\n"
|
||||
"product=mutter&keywords=I18N+L10N&component=general\n"
|
||||
"POT-Creation-Date: 2012-10-17 08:23+0000\n"
|
||||
"PO-Revision-Date: 2012-10-21 20:52+0300\n"
|
||||
"Last-Translator: Mattias Põldaru <mahfiaz@gmail.com>\n"
|
||||
"Language-Team: Estonian <>\n"
|
||||
"Language: et\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: et\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n!=1);\n"
|
||||
|
||||
msgid "Switch to workspace 1"
|
||||
msgstr "Lülitumine 1. tööalale"
|
||||
msgid "Windows"
|
||||
msgstr "Aknad"
|
||||
|
||||
msgid "Switch to workspace 2"
|
||||
msgstr "Lülitumine 2. tööalale"
|
||||
msgid "View split on left"
|
||||
msgstr "Vaade poolitatakse vasakult"
|
||||
|
||||
msgid "Switch to workspace 3"
|
||||
msgstr "Lülitumine 3. tööalale"
|
||||
msgid "View split on right"
|
||||
msgstr "Vaade poolitatakse paremalt"
|
||||
|
||||
msgid "Switch to workspace 4"
|
||||
msgstr "Lülitumine 4. tööalale"
|
||||
|
||||
msgid "Switch to workspace 5"
|
||||
msgstr "Lülitumine 5. tööalale"
|
||||
|
||||
msgid "Switch to workspace 6"
|
||||
msgstr "Lülitumine 6. tööalale"
|
||||
|
||||
msgid "Switch to workspace 7"
|
||||
msgstr "Lülitumine 7. tööalale"
|
||||
|
||||
msgid "Switch to workspace 8"
|
||||
msgstr "Lülitumine 8. tööalale"
|
||||
|
||||
msgid "Switch to workspace 9"
|
||||
msgstr "Lülitumine 9. tööalale"
|
||||
|
||||
msgid "Switch to workspace 10"
|
||||
msgstr "Lülitumine 10. tööalale"
|
||||
|
||||
msgid "Switch to workspace 11"
|
||||
msgstr "Lülitumine 11. tööalale"
|
||||
|
||||
msgid "Switch to workspace 12"
|
||||
msgstr "Lülitumine 12. tööalale"
|
||||
|
||||
msgid "Switch to workspace on the left of the current workspace"
|
||||
msgstr "Lülitumine sellest tööalast vasakul olevale tööalale"
|
||||
|
||||
msgid "Switch to workspace on the right of the current workspace"
|
||||
msgstr "Lülitumine sellest tööalast paremal olevale tööalale"
|
||||
|
||||
msgid "Switch to workspace above the current workspace"
|
||||
msgstr "Lülitumine selle tööala kohal olevale tööalale"
|
||||
|
||||
msgid "Switch to workspace below the current workspace"
|
||||
msgstr "Lülitumine selle tööala all olevale tööalale"
|
||||
|
||||
msgid "Move between windows of an application, using a popup window"
|
||||
msgstr "Liigu rakenduse akende vahel, hüpikaknaga"
|
||||
|
||||
msgid "Move backward between windows of an application, using a popup window"
|
||||
msgstr "Liigu rakenduse akende vahel tagasisuunas, hüpikaknaga"
|
||||
|
||||
msgid "Move between windows, using a popup window"
|
||||
msgstr "Liigu akende vahel, hüpikaknaga"
|
||||
|
||||
msgid "Move backward between windows, using a popup window"
|
||||
msgstr "Liigu akende vahel tagasisuunas, hüpikaknaga"
|
||||
|
||||
msgid "Move between panels and the desktop, using a popup window"
|
||||
msgstr "Liigu paneelide ja töölaua vahel, hüpikaknaga"
|
||||
|
||||
msgid "Move backward between panels and the desktop, using a popup window"
|
||||
msgstr "Liigu tagasisuunas paneelide ja töölaua vahel, hüpikaknaga"
|
||||
|
||||
msgid "Move between windows of an application immediately"
|
||||
msgstr "Liigu koheselt rakenduse akende vahel"
|
||||
|
||||
msgid "Move backward between windows of an application immediately"
|
||||
msgstr "Liigu koheselt rakenduse akende vahel tagasisuunas"
|
||||
|
||||
msgid "Move between windows immediately"
|
||||
msgstr "Liigu koheselt akende vahel"
|
||||
|
||||
msgid "Move backward between windows immediately"
|
||||
msgstr "Liigu koheselt akende vahel tagasisuunas"
|
||||
|
||||
msgid "Move between panels and the desktop immediately"
|
||||
msgstr "Liigu koheselt paneeli ja töölaua vahel"
|
||||
|
||||
msgid "Move backward between panels and the desktop immediately"
|
||||
msgstr "Liigu koheselt tagasisuunas paneelide ja töölaua vahel"
|
||||
|
||||
msgid "Hide all normal windows and set focus to the desktop"
|
||||
msgstr "Peida kõik tavalised aknad ja fokuseeri töölaud"
|
||||
|
||||
msgid "Show the panel's main menu"
|
||||
msgstr "Paneeli peamenüü näitamine"
|
||||
|
||||
msgid "Show the panel's \"Run Application\" dialog box"
|
||||
msgstr "Paneeli dialoogi \"Käivita rakendus\" näitamine"
|
||||
|
||||
msgid "Start or stop recording the session"
|
||||
msgstr "Seansi salvestamise käivitamine või seiskamine"
|
||||
|
||||
msgid "Take a screenshot"
|
||||
msgstr "Kuvatõmmise võtmine"
|
||||
|
||||
msgid "Take a screenshot of a window"
|
||||
msgstr "Kuvatõmmise võtmine aknast"
|
||||
|
||||
msgid "Run a terminal"
|
||||
msgstr "Terminali käivitamine"
|
||||
|
||||
msgid "Activate the window menu"
|
||||
msgstr "Aknamenüü aktiveerimine"
|
||||
|
||||
msgid "Toggle fullscreen mode"
|
||||
msgstr "Täisekraanivaate sisse- ja väljalülitamine"
|
||||
|
||||
msgid "Toggle maximization state"
|
||||
msgstr "Maksimeeritud oleku sisse- ja väljalülitamine"
|
||||
|
||||
msgid "Toggle whether a window will always be visible over other windows"
|
||||
msgstr "Lüliti määrab, kas aken on alati teiste akende kohal nähtav"
|
||||
|
||||
msgid "Maximize window"
|
||||
msgstr "Akna maksimeerimine"
|
||||
|
||||
msgid "Restore window"
|
||||
msgstr "Taasta akna suurus"
|
||||
|
||||
msgid "Toggle shaded state"
|
||||
msgstr "Varjatud oleku lüliti"
|
||||
|
||||
msgid "Minimize window"
|
||||
msgstr "Akna minimeerimine"
|
||||
|
||||
msgid "Close window"
|
||||
msgstr "Akna sulgemine"
|
||||
|
||||
msgid "Move window"
|
||||
msgstr "Teisalda aken"
|
||||
|
||||
msgid "Resize window"
|
||||
msgstr "Muuda akna suurust"
|
||||
|
||||
msgid "Toggle whether window is on all workspaces or just one"
|
||||
msgstr "Lüliti määrab, kas aken on kõigil tööaladel või ainult ühel"
|
||||
|
||||
msgid "Move window to workspace 1"
|
||||
msgstr "Akna tõstmine 1. tööalale"
|
||||
|
||||
msgid "Move window to workspace 2"
|
||||
msgstr "Akna tõstmine 2. tööalale"
|
||||
|
||||
msgid "Move window to workspace 3"
|
||||
msgstr "Akna tõstmine 3. tööalale"
|
||||
|
||||
msgid "Move window to workspace 4"
|
||||
msgstr "Akna tõstmine 4. tööalale"
|
||||
|
||||
msgid "Move window to workspace 5"
|
||||
msgstr "Akna tõstmine 5. tööalale"
|
||||
|
||||
msgid "Move window to workspace 6"
|
||||
msgstr "Akna tõstmine 6. tööalale"
|
||||
|
||||
msgid "Move window to workspace 7"
|
||||
msgstr "Akna tõstmine 7. tööalale"
|
||||
|
||||
msgid "Move window to workspace 8"
|
||||
msgstr "Akna tõstmine 8. tööalale"
|
||||
|
||||
msgid "Move window to workspace 9"
|
||||
msgstr "Akna tõstmine 9. tööalale"
|
||||
|
||||
msgid "Move window to workspace 10"
|
||||
msgstr "Akna tõstmine 10. tööalale"
|
||||
|
||||
msgid "Move window to workspace 11"
|
||||
msgstr "Akna tõstmine 11. tööalale"
|
||||
|
||||
msgid "Move window to workspace 12"
|
||||
msgstr "Akna tõstmine 12. tööalale"
|
||||
|
||||
msgid "Move window one workspace to the left"
|
||||
msgstr "Akna tõstmine ühe tööala võrra vasakule"
|
||||
|
||||
msgid "Move window one workspace to the right"
|
||||
msgstr "Akna tõstmine ühe tööala võrra paremale"
|
||||
|
||||
msgid "Move window one workspace up"
|
||||
msgstr "Akna tõstmine ühe tööala võrra ülespoole"
|
||||
|
||||
msgid "Move window one workspace down"
|
||||
msgstr "Akna tõstmine ühe tööala võrra allapoole"
|
||||
|
||||
msgid "Raise window if it's covered by another window, otherwise lower it"
|
||||
msgstr "Tõsta aken, kui seda katab teine aken, muul juhul vii tahapoole"
|
||||
|
||||
msgid "Raise window above other windows"
|
||||
msgstr "Akna tõstmine teiste akende kohale"
|
||||
|
||||
msgid "Lower window below other windows"
|
||||
msgstr "Saada aken teiste taha"
|
||||
|
||||
msgid "Maximize window vertically"
|
||||
msgstr "Maksimeeri aken vertikaalselt"
|
||||
|
||||
msgid "Maximize window horizontally"
|
||||
msgstr "Maksimeeri aken horisontaalselt"
|
||||
|
||||
msgid "Move window to north-west (top left) corner"
|
||||
msgstr "Akna tõstmine ekraani loodepoolsesse (ülemisse vasakusse) nurka"
|
||||
|
||||
msgid "Move window to north-east (top right) corner"
|
||||
msgstr "Akna tõstmine ekraani kirdepoolsesse (ülemisse paremasse) nurka"
|
||||
|
||||
msgid "Move window to south-west (bottom left) corner"
|
||||
msgstr "Akna tõstmine ekraani edelapoolsesse (alumisse vasakusse) nurka"
|
||||
|
||||
msgid "Move window to south-east (bottom right) corner"
|
||||
msgstr "Akna tõstmine ekraani kagupoolsesse (alumisse paremasse) nurka"
|
||||
|
||||
msgid "Move window to north (top) side of screen"
|
||||
msgstr "Akna tõstmine ekraani põhjapoolsesse (ülemisse) serva"
|
||||
|
||||
msgid "Move window to south (bottom) side of screen"
|
||||
msgstr "Akna tõstmine ekraani lõunapoolsesse (alumisse) serva"
|
||||
|
||||
msgid "Move window to east (right) side of screen"
|
||||
msgstr "Akna tõstmine ekraani idapoolsesse (paremasse) serva"
|
||||
|
||||
msgid "Move window to west (left) side of screen"
|
||||
msgstr "Akna tõstmine ekraani läänepoolsesse (vasakusse) serva"
|
||||
|
||||
msgid "Move window to center of screen"
|
||||
msgstr "Akna tõstmine ekraani keskele"
|
||||
#. This probably means that a non-WM compositor like xcompmgr is running;
|
||||
#. * we have no way to get it to exit
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Another compositing manager is already running on screen %i on display \"%s"
|
||||
"\"."
|
||||
msgstr "Teine komposiithaldur juba töötab ekraani %i kuval \"%s\"."
|
||||
|
||||
msgid "Bell event"
|
||||
msgstr "Helina sündmus"
|
||||
@ -262,10 +48,12 @@ msgstr "Helina sündmus"
|
||||
msgid "Unknown window information request: %d"
|
||||
msgstr "Tundmatu aknateabe päring: %d"
|
||||
|
||||
#. Translators: %s is a window title
|
||||
#, c-format
|
||||
msgid "<tt>%s</tt> is not responding."
|
||||
msgstr "<tt>%s</tt> ei vasta."
|
||||
msgid "%s is not responding."
|
||||
msgstr "%s ei vasta."
|
||||
|
||||
msgid "Application is not responding."
|
||||
msgstr "Rakendus ei vasta."
|
||||
|
||||
msgid ""
|
||||
"You may choose to wait a short while for it to continue or force the "
|
||||
@ -294,27 +82,6 @@ msgstr ""
|
||||
"Mõni teine programm juba kasutab klahvi %s koos muuteklahvidega %x "
|
||||
"kiirklahvina\n"
|
||||
|
||||
#. Displayed when a keybinding which is
|
||||
#. * supposed to launch a program fails.
|
||||
#.
|
||||
#, c-format
|
||||
msgid ""
|
||||
"There was an error running <tt>%s</tt>:\n"
|
||||
"\n"
|
||||
"%s"
|
||||
msgstr ""
|
||||
"<tt>%s</tt> käivitamisel esines viga:\n"
|
||||
"\n"
|
||||
"%s"
|
||||
|
||||
#, c-format
|
||||
msgid "No command %d has been defined.\n"
|
||||
msgstr "Käsku %d pole defineeritud.\n"
|
||||
|
||||
#, c-format
|
||||
msgid "No terminal command has been defined.\n"
|
||||
msgstr "Terminalikäsku pole defineeritud.\n"
|
||||
|
||||
msgid "Disable connection to session manager"
|
||||
msgstr "Seansihalduriga ühendumise keelamine"
|
||||
|
||||
@ -361,41 +128,8 @@ msgstr ""
|
||||
msgid "Print version"
|
||||
msgstr "Versiooni printimine"
|
||||
|
||||
msgid "Comma-separated list of compositor plugins"
|
||||
msgstr "Komaga eraldatud nimekiri komposiitmontaaži pluginatest"
|
||||
|
||||
#.
|
||||
#. * We found it, but it was invalid. Complain.
|
||||
#. *
|
||||
#. * FIXME: This replicates the original behaviour, but in the future
|
||||
#. * we might consider reverting invalid keys to their original values.
|
||||
#. * (We know the old value, so we can look up a suitable string in
|
||||
#. * the symtab.)
|
||||
#. *
|
||||
#. * (Empty comment follows so the translators don't see this.)
|
||||
#.
|
||||
#.
|
||||
#, c-format
|
||||
msgid "GConf key '%s' is set to an invalid value\n"
|
||||
msgstr "GConf võtme '%s' väärtus on vigane\n"
|
||||
|
||||
#, c-format
|
||||
msgid "%d stored in GConf key %s is out of range %d to %d\n"
|
||||
msgstr ""
|
||||
"%d, mis on salvestatud GConf võtmes %s, on väljaspool piirkonda %d - %d\n"
|
||||
|
||||
#, c-format
|
||||
msgid "GConf key \"%s\" is set to an invalid type\n"
|
||||
msgstr "GConf-i võti \"%s\" on määratud vigase tüübiga\n"
|
||||
|
||||
#, c-format
|
||||
msgid "GConf key %s is already in use and can't be used to override %s\n"
|
||||
msgstr ""
|
||||
"GConfi võti %s on juba kasutusel ja sellega ei saa tühistada võtit %s\n"
|
||||
|
||||
#, c-format
|
||||
msgid "Can't override GConf key, %s not found\n"
|
||||
msgstr "GConfi võtit pole võimalik tühistada, võtit %s ei leitud\n"
|
||||
msgid "Mutter plugin to use"
|
||||
msgstr "Millist Mutteri pluginat kasutada"
|
||||
|
||||
msgid ""
|
||||
"Workarounds for broken applications disabled. Some applications may not "
|
||||
@ -405,8 +139,8 @@ msgstr ""
|
||||
"ei pruugi õigesti käituda.\n"
|
||||
|
||||
#, c-format
|
||||
msgid "Could not parse font description \"%s\" from GConf key %s\n"
|
||||
msgstr "Fondi kirjeldust \"%s\" GConf võtmest %s ei saa töödelda\n"
|
||||
msgid "Could not parse font description \"%s\" from GSettings key %s\n"
|
||||
msgstr "Fondi kirjeldust \"%s\" GSettings võtmest %s pole võimalik töödelda\n"
|
||||
|
||||
#, c-format
|
||||
msgid ""
|
||||
@ -416,14 +150,6 @@ msgstr ""
|
||||
"Seadistuste andmebaasist leitud \"%s\" ei ole sobiv väärtus hiireklahvi "
|
||||
"modifikaatoriks\n"
|
||||
|
||||
#, c-format
|
||||
msgid "Error setting number of workspaces to %d: %s\n"
|
||||
msgstr "Viga tööalade arvuks %d määramisel: %s\n"
|
||||
|
||||
#, c-format
|
||||
msgid "Workspace %d"
|
||||
msgstr "Tööala %d"
|
||||
|
||||
#, c-format
|
||||
msgid ""
|
||||
"\"%s\" found in configuration database is not a valid value for keybinding "
|
||||
@ -433,16 +159,8 @@ msgstr ""
|
||||
"\"\n"
|
||||
|
||||
#, c-format
|
||||
msgid "Error setting name for workspace %d to \"%s\": %s\n"
|
||||
msgstr "Viga tööalale %d nime \"%s\" määramisel: %s\n"
|
||||
|
||||
#, c-format
|
||||
msgid "Error setting live hidden windows status status: %s\n"
|
||||
msgstr "Viga varjus elushoitavate akende oleku määramisel: %s\n"
|
||||
|
||||
#, c-format
|
||||
msgid "Error setting no tab popup status: %s\n"
|
||||
msgstr ""
|
||||
msgid "Workspace %d"
|
||||
msgstr "Tööala %d"
|
||||
|
||||
#, c-format
|
||||
msgid "Screen %d on display '%s' is invalid\n"
|
||||
@ -540,10 +258,6 @@ msgstr "Aknahalduri hoiatus: "
|
||||
msgid "Window manager error: "
|
||||
msgstr "Aknahalduri viga: "
|
||||
|
||||
#. Translators: This is the title used on dialog boxes
|
||||
msgid "Mutter"
|
||||
msgstr "Mutter"
|
||||
|
||||
#. first time through
|
||||
#, c-format
|
||||
msgid ""
|
||||
@ -581,6 +295,12 @@ msgstr "%s (masinas %s)"
|
||||
msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
|
||||
msgstr "Vigane WM_TRANSIENT_FOR aknale 0x%lx määratud %s jaoks.\n"
|
||||
|
||||
#, c-format
|
||||
msgid "WM_TRANSIENT_FOR window 0x%lx for %s would create loop.\n"
|
||||
msgstr ""
|
||||
"WM_TRANSIENT_FOR aknale 0x%lx määratud %s jaoks tekitaks tsüklilise "
|
||||
"korduse.\n"
|
||||
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Window 0x%lx has property %s\n"
|
||||
@ -604,18 +324,8 @@ msgid ""
|
||||
"Property %s on window 0x%lx contained invalid UTF-8 for item %d in the list\n"
|
||||
msgstr "Omadus %s aknal 0x%lx sisaldab vigast UTF-8 %d kirjele nimekirjas\n"
|
||||
|
||||
msgid "Attach modal dialogs"
|
||||
msgstr "Modaaldialoogide kinnistamine"
|
||||
|
||||
msgid ""
|
||||
"Determines whether hidden windows (i.e., minimized windows and windows on "
|
||||
"other workspaces than the current one) should be kept alive."
|
||||
msgstr ""
|
||||
"Määrab, kas varjatud aknaid (nt minimeeritud ja teistel tööaladel aknad) "
|
||||
"hoitakse elus."
|
||||
|
||||
msgid "Live Hidden Windows"
|
||||
msgstr "Varjatud akende aktiivsus"
|
||||
msgid "Mutter"
|
||||
msgstr "Mutter"
|
||||
|
||||
msgid "Modifier to use for extended window management operations"
|
||||
msgstr "Laiendatud aknaoperatsioonide korral kasutatav muuteklahv"
|
||||
@ -632,6 +342,9 @@ msgstr ""
|
||||
"klahv\". Eeldatavasti määratakse selle seose väärtuseks vaikimisi või tühi "
|
||||
"sõne."
|
||||
|
||||
msgid "Attach modal dialogs"
|
||||
msgstr "Modaaldialoogide kinnistamine"
|
||||
|
||||
msgid ""
|
||||
"When true, instead of having independent titlebars, modal dialogs appear "
|
||||
"attached to the titlebar of the parent window and are moved together with "
|
||||
@ -640,43 +353,80 @@ msgstr ""
|
||||
"Kui märgitud, siis eraldi tiitliribade asemel on moodaalsed dialoogid "
|
||||
"emaakna tiitliribade küljes ning liiguvad koos emaaknaga."
|
||||
|
||||
msgid "Enable edge tiling when dropping windows on screen edges"
|
||||
msgstr "Akna ümberpaigutamine selle lohistamisel ekraani serva"
|
||||
|
||||
msgid ""
|
||||
"If enabled, dropping windows on vertical screen edges maximizes them "
|
||||
"vertically and resizes them horizontally to cover half of the available "
|
||||
"area. Dropping windows on the top screen edge maximizes them completely."
|
||||
msgstr ""
|
||||
"Kui märgitud, siis akna lohistamine ekraani külgservale maksimeerib selle "
|
||||
"vertikaalselt ja laius katab pool saadaolevast laiusest. Akna lohistamine "
|
||||
"ekraani ülaserva maksimeerib akna täielikult."
|
||||
|
||||
msgid "Workspaces are managed dynamically"
|
||||
msgstr "Tööalade dünaamiline haldus"
|
||||
|
||||
msgid ""
|
||||
"Determines whether workspaces are managed dynamically or whether there's a "
|
||||
"static number of workspaces (determined by the num-workspaces key in org."
|
||||
"gnome.desktop.wm.preferences)."
|
||||
msgstr ""
|
||||
"Määrab, kas tööalasid hallatakse dünaamiliselt või on nende arv staatiline "
|
||||
"(arvu määrab org.gnome.desktop.wm.preferences all võti num-workspaces)."
|
||||
|
||||
msgid "Workspaces only on primary"
|
||||
msgstr "Tööalad ainult peamisel"
|
||||
|
||||
msgid ""
|
||||
"Determines whether workspace switching should happen for windows on all "
|
||||
"monitors or only for windows on the primary monitor."
|
||||
msgstr ""
|
||||
"Määrab, kas tööalade vahetamine mõjutab kõiki aknaid kõigil monitoridel või "
|
||||
"ainult aknaid peamisel monitoril."
|
||||
|
||||
msgid "No tab popup"
|
||||
msgstr "Tabulaatoril pole hüpikakent"
|
||||
|
||||
msgid ""
|
||||
"Determines whether the use of popup and highlight frame should be disabled "
|
||||
"for window cycling."
|
||||
msgstr ""
|
||||
"Kui märgitud, siis on hüpikaken ja esiletõstmise raam keelatud akende "
|
||||
"vahetamisel."
|
||||
|
||||
msgid "Delay focus changes until the pointer stops moving"
|
||||
msgstr "Fookusemuutused lükatakse edasi kuni kursor peatub"
|
||||
|
||||
msgid ""
|
||||
"If set to true, and the focus mode is either \"sloppy\" or \"mouse\" then "
|
||||
"the focus will not be changed immediately when entering a window, but only "
|
||||
"after the pointer stops moving."
|
||||
msgstr ""
|
||||
"Kui tõene ning fookusrežiim on kas \"sloppy\" või \"mouse\", siis fookust ei "
|
||||
"vahetata kohe, kui kursor aknale liigub, vaid alles pärast kursori peatumist."
|
||||
|
||||
msgid "Draggable border width"
|
||||
msgstr "Lohistatava äärise laius."
|
||||
|
||||
msgid ""
|
||||
"The amount of total draggable borders. If the theme's visible borders are "
|
||||
"not enough, invisible borders will be added to meet this value."
|
||||
msgstr ""
|
||||
"Lohistatava äärise laius. Kui kujunduse nähtavatest ääristest ei piisa, "
|
||||
"lisatakse puuduoleva osa jaoks nähtamatu ääris."
|
||||
|
||||
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"
|
||||
|
||||
msgid "Close Window"
|
||||
msgstr "Sulge aken"
|
||||
|
||||
msgid "Window Menu"
|
||||
msgstr "Aknamenüü"
|
||||
|
||||
msgid "Minimize Window"
|
||||
msgstr "Akna minimeerimine"
|
||||
|
||||
msgid "Maximize Window"
|
||||
msgstr "Akna maksimeerimine"
|
||||
|
||||
msgid "Restore Window"
|
||||
msgstr "Akna taastamine"
|
||||
|
||||
msgid "Roll Up Window"
|
||||
msgstr "Akna kokkukerimine"
|
||||
|
||||
msgid "Unroll Window"
|
||||
msgstr "Akna lahtikerimine"
|
||||
|
||||
msgid "Keep Window On Top"
|
||||
msgstr "Akna kõige pealmiseks määramine"
|
||||
|
||||
msgid "Remove Window From Top"
|
||||
msgstr "Eemalda aken kõige pealmise kohalt"
|
||||
|
||||
msgid "Always On Visible Workspace"
|
||||
msgstr "Alati nähtaval tööalal"
|
||||
|
||||
msgid "Put Window On Only One Workspace"
|
||||
msgstr "Tõsta aken ainult ühele tööalale"
|
||||
|
||||
#. Translators: Translate this string the same way as you do in libwnck!
|
||||
msgid "Mi_nimize"
|
||||
msgstr "_Minimeeri"
|
||||
@ -877,6 +627,30 @@ msgstr "Raami geomeetria ei määra nuppude suurust"
|
||||
msgid "Gradients should have at least two colors"
|
||||
msgstr "Värviüleminekus peaks olema vähemalt kaks värvi"
|
||||
|
||||
#, 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 kohandatud värvi määrang peab sisaldama sulgudes värvi nimetust ning "
|
||||
"varuvärvi, nt gtk:custom(foo,bar); väärtust \"%s\" pole võimalik töödelda"
|
||||
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Invalid character '%c' in color_name parameter of gtk:custom, only A-Za-z0-9-"
|
||||
"_ are valid"
|
||||
msgstr ""
|
||||
"gtk:custom color_name parameetris sobimatu märk '%c', lubatud on ainult A-Za-"
|
||||
"z0-9-_"
|
||||
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Gtk:custom format is \"gtk:custom(color_name,fallback)\", \"%s\" does not "
|
||||
"fit the format"
|
||||
msgstr ""
|
||||
"Gtk:custom vorming on \"gtk:custom(värvi_nimi,varuvärv)\", \"%s\" ei sobi "
|
||||
"selle vorminguga"
|
||||
|
||||
#, c-format
|
||||
msgid ""
|
||||
"GTK color specification must have the state in brackets, e.g. gtk:fg[NORMAL] "
|
||||
@ -1511,25 +1285,3 @@ 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 ""
|
||||
#~ "Don't make fullscreen windows that are maximized and have no decorations"
|
||||
#~ msgstr "Ei tehta maksimeeritud ilma raamita täisekraanaknaid."
|
||||
|
||||
#~ msgid "Whether window popup/frame should be shown when cycling windows."
|
||||
#~ msgstr "Kas hüpikakent/raami näidatakse akende vahetamisel."
|
||||
|
||||
#~ msgid "Internal argument for GObject introspection"
|
||||
#~ msgstr "GObject enesevaatluse siseargument"
|
||||
|
||||
#~ msgid "Failed to restart: %s\n"
|
||||
#~ msgstr "Tõrge taaskäivitamisel: %s\n"
|
||||
|
||||
#~ msgid "Error setting clutter plugin list: %s\n"
|
||||
#~ msgstr "Viga clutteri pluginate nimekirja määramisel: %s\n"
|
||||
|
||||
#~ msgid "Clutter Plugins"
|
||||
#~ msgstr "Clutteri pluginad"
|
||||
|
||||
#~ msgid "Plugins to load for the Clutter-based compositing manager."
|
||||
#~ msgstr "Clutteril põhineva komposiitmontaažihalduri laadimise pluginad."
|
||||
|
1280
po/pt_BR.po
1280
po/pt_BR.po
File diff suppressed because it is too large
Load Diff
3174
po/sr@latin.po
3174
po/sr@latin.po
File diff suppressed because it is too large
Load Diff
269
po/ug.po
269
po/ug.po
@ -10,8 +10,8 @@ msgstr ""
|
||||
"Project-Id-Version: mutter\n"
|
||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
|
||||
"product=mutter&keywords=I18N+L10N&component=general\n"
|
||||
"POT-Creation-Date: 2011-06-30 21:06+0000\n"
|
||||
"PO-Revision-Date: 2011-06-27 11:17+0600\n"
|
||||
"POT-Creation-Date: 2011-08-27 17:13+0000\n"
|
||||
"PO-Revision-Date: 2011-08-08 16:52+0600\n"
|
||||
"Last-Translator: Sahran <sahran.ug@gmail.com>\n"
|
||||
"Language-Team: Uyghur Computer Science Association <UKIJ@yahoogroups.com>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@ -20,16 +20,13 @@ 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:509
|
||||
#, fuzzy, c-format
|
||||
#| msgid ""
|
||||
#| "Could not acquire window manager selection on screen %d display \"%s\"\n"
|
||||
#: ../src/compositor/compositor.c:487
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Another compositing manager is already running on screen %i on display \"%s"
|
||||
"\"."
|
||||
msgstr ""
|
||||
"كۆرسەتكۈچ \"%2$s\" نىڭدىكى ئېكران %1$d دا كۆزنەك باشقۇرغۇنىڭ تاللانمىسىنى "
|
||||
"ئالغىلى بولمىدى\n"
|
||||
"كۆرسەتكۈچ \"%2$s\" نىڭدىكى ئېكران %1$d دا بۆلەك باشقۇرغۇچ ئىجرا قىلىنىۋاتىدۇ."
|
||||
|
||||
#: ../src/core/all-keybindings.h:88
|
||||
msgid "Switch to workspace 1"
|
||||
@ -401,7 +398,7 @@ msgstr ""
|
||||
#. Displayed when a keybinding which is
|
||||
#. * supposed to launch a program fails.
|
||||
#.
|
||||
#: ../src/core/keybindings.c:2468
|
||||
#: ../src/core/keybindings.c:2523
|
||||
#, c-format
|
||||
msgid ""
|
||||
"There was an error running <tt>%s</tt>:\n"
|
||||
@ -412,12 +409,12 @@ msgstr ""
|
||||
"\n"
|
||||
"%s"
|
||||
|
||||
#: ../src/core/keybindings.c:2558
|
||||
#: ../src/core/keybindings.c:2613
|
||||
#, c-format
|
||||
msgid "No command %d has been defined.\n"
|
||||
msgstr "بۇيرۇق %d بېكىتىلمىگەن.\n"
|
||||
|
||||
#: ../src/core/keybindings.c:3570
|
||||
#: ../src/core/keybindings.c:3625
|
||||
#, c-format
|
||||
msgid "No terminal command has been defined.\n"
|
||||
msgstr "تېرمىنال بۇيرۇققا ئېنىقلىما بېرىلمىگەن .\n"
|
||||
@ -492,41 +489,41 @@ msgstr "پەش بىلەن ئايرىلغان تىزىم ۋە بىرىكمە رە
|
||||
#. * (Empty comment follows so the translators don't see this.)
|
||||
#.
|
||||
#.
|
||||
#: ../src/core/prefs.c:543 ../src/core/prefs.c:704
|
||||
#: ../src/core/prefs.c:550 ../src/core/prefs.c:711
|
||||
#, c-format
|
||||
msgid "GConf key '%s' is set to an invalid value\n"
|
||||
msgstr ""
|
||||
"GConf نىڭ ئاچقۇچ سۆزى“%s” ئۈنۈمسىز \n"
|
||||
" قىلىپ تەڭشەلگەن\n"
|
||||
|
||||
#: ../src/core/prefs.c:630 ../src/core/prefs.c:873
|
||||
#: ../src/core/prefs.c:637 ../src/core/prefs.c:880
|
||||
#, c-format
|
||||
msgid "%d stored in GConf key %s is out of range %d to %d\n"
|
||||
msgstr ""
|
||||
"GConf نىڭ %2$s ئاچقۇچىنىڭ قىممىتى %1$d نىڭ دائىرىسى %3$d〜%4$d نىڭ ئىچىدە "
|
||||
"ئەمەس\n"
|
||||
|
||||
#: ../src/core/prefs.c:674 ../src/core/prefs.c:751 ../src/core/prefs.c:799
|
||||
#: ../src/core/prefs.c:863 ../src/core/prefs.c:1324 ../src/core/prefs.c:1340
|
||||
#: ../src/core/prefs.c:1357 ../src/core/prefs.c:1373
|
||||
#: ../src/core/prefs.c:681 ../src/core/prefs.c:758 ../src/core/prefs.c:806
|
||||
#: ../src/core/prefs.c:870 ../src/core/prefs.c:1331 ../src/core/prefs.c:1347
|
||||
#: ../src/core/prefs.c:1364 ../src/core/prefs.c:1380
|
||||
#, c-format
|
||||
msgid "GConf key \"%s\" is set to an invalid type\n"
|
||||
msgstr ""
|
||||
"GConf نىڭ ئاچقۇچلۇق سۆزى “%s” ئۈنۈمسىز تىپتىكى \n"
|
||||
" قىلىپ تەڭشەلگەن\n"
|
||||
|
||||
#: ../src/core/prefs.c:1203
|
||||
#: ../src/core/prefs.c:1210
|
||||
#, c-format
|
||||
msgid "GConf key %s is already in use and can't be used to override %s\n"
|
||||
msgstr ""
|
||||
"GConf ئاچقۇچى %s ئىشلىتىلىۋاتىدۇ، شۇڭا %s نى قاپلاشقا ئىشلەتكىلى بولمايدۇ\n"
|
||||
|
||||
#: ../src/core/prefs.c:1262
|
||||
#: ../src/core/prefs.c:1269
|
||||
#, c-format
|
||||
msgid "Can't override GConf key, %s not found\n"
|
||||
msgstr "GConf ئاچقۇچىنى قاپلىغىلى بولمىدى، %s تېپىلمىدى\n"
|
||||
|
||||
#: ../src/core/prefs.c:1447
|
||||
#: ../src/core/prefs.c:1454
|
||||
msgid ""
|
||||
"Workarounds for broken applications disabled. Some applications may not "
|
||||
"behave properly.\n"
|
||||
@ -534,14 +531,14 @@ msgstr ""
|
||||
"بۇزۇلغان پروگراممىلارنى تۈزىتىش-ياخشىلاش قوزغىتىلمىغان. بەزى پروگراممىلار "
|
||||
"نورمال ئىشلىمەسلىكى مۇمكىن.\n"
|
||||
|
||||
#: ../src/core/prefs.c:1524
|
||||
#: ../src/core/prefs.c:1531
|
||||
#, c-format
|
||||
msgid "Could not parse font description \"%s\" from GConf key %s\n"
|
||||
msgstr ""
|
||||
"خەت نۇسخىسىنىڭ چۈشەندۈرۈلۈشىنى ئانالىز قىلغىلى بولمىدى “%s” ( GConf دىكى "
|
||||
"ئاچقۇچلۇق سۆز %s )\n"
|
||||
|
||||
#: ../src/core/prefs.c:1586
|
||||
#: ../src/core/prefs.c:1593
|
||||
#, c-format
|
||||
msgid ""
|
||||
"\"%s\" found in configuration database is not a valid value for mouse button "
|
||||
@ -551,17 +548,17 @@ msgstr ""
|
||||
"ئۈنۈملۈك قىممەت \n"
|
||||
" ئەمەس\n"
|
||||
|
||||
#: ../src/core/prefs.c:2016
|
||||
#: ../src/core/prefs.c:2028
|
||||
#, c-format
|
||||
msgid "Error setting number of workspaces to %d: %s\n"
|
||||
msgstr "خىزمەت رايونى سانىنى %d قىلىپ تەڭشەشتە كۆرۈلگەن خاتالىق :%s\n"
|
||||
|
||||
#: ../src/core/prefs.c:2200 ../src/core/prefs.c:2702
|
||||
#: ../src/core/prefs.c:2212 ../src/core/prefs.c:2714
|
||||
#, c-format
|
||||
msgid "Workspace %d"
|
||||
msgstr "خىزمەت بوشلۇقى %d"
|
||||
|
||||
#: ../src/core/prefs.c:2232 ../src/core/prefs.c:2410
|
||||
#: ../src/core/prefs.c:2244 ../src/core/prefs.c:2422
|
||||
#, c-format
|
||||
msgid ""
|
||||
"\"%s\" found in configuration database is not a valid value for keybinding "
|
||||
@ -570,18 +567,18 @@ msgstr ""
|
||||
"سەپلىمە ساندانىدىن تېپىلغان \"%s\"، \"%s\" كۇنۇپكا باغلانمىسىنىڭ ئىناۋەتلىك "
|
||||
"قىممىتى ئەمەس\n"
|
||||
|
||||
#: ../src/core/prefs.c:2783
|
||||
#: ../src/core/prefs.c:2795
|
||||
#, c-format
|
||||
msgid "Error setting name for workspace %d to \"%s\": %s\n"
|
||||
msgstr "خىزمەت مۇھىتى %d غا \"%s\" دەپ ئائىت قويۇشتا خاتالىق كۆرۈلدى: %s\n"
|
||||
|
||||
#: ../src/core/prefs.c:2997
|
||||
#: ../src/core/prefs.c:3009
|
||||
#, c-format
|
||||
msgid "Error setting live hidden windows status status: %s\n"
|
||||
msgstr ""
|
||||
"شۇئان يوشۇرۇنىدىغان كۆزنەك ھالىتىنى تەڭشەۋاتقاندا خاتالىق كۆرۈلدى: %s\n"
|
||||
|
||||
#: ../src/core/prefs.c:3032
|
||||
#: ../src/core/prefs.c:3044
|
||||
#, c-format
|
||||
msgid "Error setting no tab popup status: %s\n"
|
||||
msgstr "بەتكۈچ يوق قاڭقىش ھالىتىنى تەڭشەۋەتقاندا خاتالىق كۆرۈلدى: %s\n"
|
||||
@ -721,7 +718,7 @@ msgid "Mutter"
|
||||
msgstr "Mutter"
|
||||
|
||||
#. first time through
|
||||
#: ../src/core/window.c:6886
|
||||
#: ../src/core/window.c:7019
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER "
|
||||
@ -737,7 +734,7 @@ msgstr ""
|
||||
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
|
||||
#. * about these apps but make them work.
|
||||
#.
|
||||
#: ../src/core/window.c:7549
|
||||
#: ../src/core/window.c:7682
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Window %s sets an MWM hint indicating it isn't resizable, but sets min size %"
|
||||
@ -759,12 +756,17 @@ msgstr ""
|
||||
msgid "%s (on %s)"
|
||||
msgstr "%s (ھەققىدە %s)"
|
||||
|
||||
#: ../src/core/window-props.c:1484
|
||||
#: ../src/core/window-props.c:1481
|
||||
#, c-format
|
||||
msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
|
||||
msgstr ""
|
||||
"%2$s گە بەلگىلەنگەن ئۈنۈمسىز WM_TRANSIENT_FOR كۆزنەك 0x%1$lx بولىدۇ.\n"
|
||||
|
||||
#: ../src/core/window-props.c:1492
|
||||
#, c-format
|
||||
msgid "WM_TRANSIENT_FOR window 0x%lx for %s would create loop.\n"
|
||||
msgstr "%2$s نىڭ WM_TRANSIENT_FOR كۆزنەك0x%1$lx دەۋرىيلىك قۇرۇشى مۇمكىن.\n"
|
||||
|
||||
#: ../src/core/xprops.c:155
|
||||
#, c-format
|
||||
msgid ""
|
||||
@ -815,14 +817,24 @@ msgstr ""
|
||||
"ئېكرانغىلا قارىتىلغانلىقىنى جەزملەيدۇ."
|
||||
|
||||
#: ../src/mutter.schemas.in.h:4
|
||||
msgid "Draggable border width"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/mutter.schemas.in.h:5
|
||||
msgid "Live Hidden Windows"
|
||||
msgstr "شۇئان يوشۇرۇنىدىغان كۆزنەكلەر"
|
||||
|
||||
#: ../src/mutter.schemas.in.h:5
|
||||
#: ../src/mutter.schemas.in.h:6
|
||||
msgid "Modifier to use for extended window management operations"
|
||||
msgstr "كېڭەيتىلگەن كۆزنەك باشقۇرۇش مەشغۇلاتىغا ئىشلىتىلىدىغان ئۆزگەرتىش"
|
||||
|
||||
#: ../src/mutter.schemas.in.h:6
|
||||
#: ../src/mutter.schemas.in.h:7
|
||||
msgid ""
|
||||
"The amount of total draggable borders. If the theme's visible borders are "
|
||||
"not enough, invisible borders will be added to meet this value."
|
||||
msgstr ""
|
||||
|
||||
#: ../src/mutter.schemas.in.h:8
|
||||
msgid ""
|
||||
"This key will initiate the \"overlay\", which is a combination window "
|
||||
"overview and application launching system. The default is intended to be the "
|
||||
@ -834,7 +846,7 @@ msgstr ""
|
||||
"ئەھۋالدا يەككە كومپيۇتېردىكى \"Windows key\" كۇنۇپكىسىنى ئىشلىتىشنى تەلەپ "
|
||||
"قىلىدۇ. بەلكىم كۆڭۈلدىكى ياكى بوش تىزىقنى ئىشلىتىدۇ."
|
||||
|
||||
#: ../src/mutter.schemas.in.h:7
|
||||
#: ../src/mutter.schemas.in.h:9
|
||||
msgid ""
|
||||
"When true, instead of having independent titlebars, modal dialogs appear "
|
||||
"attached to the titlebar of the parent window and are moved together with "
|
||||
@ -843,7 +855,7 @@ msgstr ""
|
||||
"true بولغاندا مودېل سۆزلەشكۈ ئاتا كۆزنەكنىڭ ماۋزۇ بالداققا يېپىشىپ كۆرۈنىدۇ "
|
||||
"ھەمدە ئاتا كۆزنەككە ئەگىشىپ يۆتكىلىدۇ، ئايرىم ماۋزۇ بالدىقى بولمايدۇ."
|
||||
|
||||
#: ../src/mutter.schemas.in.h:8
|
||||
#: ../src/mutter.schemas.in.h:10
|
||||
msgid "Workspaces only on primary"
|
||||
msgstr "ئاساسىي كۆزەتكۈچتىكى خىزمەت رايونىغىلا"
|
||||
|
||||
@ -852,47 +864,47 @@ msgstr "ئاساسىي كۆزەتكۈچتىكى خىزمەت رايونىغىل
|
||||
msgid "Usage: %s\n"
|
||||
msgstr "ئىشلىتىش ئۇسۇلى:%s\n"
|
||||
|
||||
#: ../src/ui/frames.c:1280
|
||||
#: ../src/ui/frames.c:1157
|
||||
msgid "Close Window"
|
||||
msgstr "كۆزنەك ياپ"
|
||||
|
||||
#: ../src/ui/frames.c:1283
|
||||
#: ../src/ui/frames.c:1160
|
||||
msgid "Window Menu"
|
||||
msgstr "كۆزنەك تىزىملىكى"
|
||||
|
||||
#: ../src/ui/frames.c:1286
|
||||
#: ../src/ui/frames.c:1163
|
||||
msgid "Minimize Window"
|
||||
msgstr "كۆزنەكنى كىچىكلەت"
|
||||
|
||||
#: ../src/ui/frames.c:1289
|
||||
#: ../src/ui/frames.c:1166
|
||||
msgid "Maximize Window"
|
||||
msgstr "كۆزنەكنى چوڭايت"
|
||||
|
||||
#: ../src/ui/frames.c:1292
|
||||
#: ../src/ui/frames.c:1169
|
||||
msgid "Restore Window"
|
||||
msgstr "كۆزنەكنى ئەسلىگە كەلتۈر"
|
||||
|
||||
#: ../src/ui/frames.c:1295
|
||||
#: ../src/ui/frames.c:1172
|
||||
msgid "Roll Up Window"
|
||||
msgstr "كۆزنەكنى تۈر"
|
||||
|
||||
#: ../src/ui/frames.c:1298
|
||||
#: ../src/ui/frames.c:1175
|
||||
msgid "Unroll Window"
|
||||
msgstr "كۆزنەكنى تۈرمە"
|
||||
|
||||
#: ../src/ui/frames.c:1301
|
||||
#: ../src/ui/frames.c:1178
|
||||
msgid "Keep Window On Top"
|
||||
msgstr "كۆزنەكنى چوققىلاشنى ساقلا"
|
||||
|
||||
#: ../src/ui/frames.c:1304
|
||||
#: ../src/ui/frames.c:1181
|
||||
msgid "Remove Window From Top"
|
||||
msgstr "كۆزنەكنى چوققىلاشنى بىكار قىلىش"
|
||||
|
||||
#: ../src/ui/frames.c:1307
|
||||
#: ../src/ui/frames.c:1184
|
||||
msgid "Always On Visible Workspace"
|
||||
msgstr "خىزمەت رايونىدا ئىزچىل كۆرۈنسۇن"
|
||||
|
||||
#: ../src/ui/frames.c:1310
|
||||
#: ../src/ui/frames.c:1187
|
||||
msgid "Put Window On Only One Workspace"
|
||||
msgstr "بىر خىزمەت رايونىغا ئورۇنلاشتۇرۇش"
|
||||
|
||||
@ -1004,7 +1016,7 @@ msgstr "باشقا خىزمەت بوشلۇقىغا يۆتكە(_W)"
|
||||
#.
|
||||
#: ../src/ui/metaaccellabel.c:77
|
||||
msgid "Shift"
|
||||
msgstr "Shift كۇنۇپكىسى"
|
||||
msgstr "Shift"
|
||||
|
||||
#. This is the text that should appear next to menu accelerators
|
||||
#. * that use the control key. If the text on this key isn't typically
|
||||
@ -1095,50 +1107,77 @@ msgstr "Mod5"
|
||||
msgid "%d x %d"
|
||||
msgstr "%d x %d"
|
||||
|
||||
#: ../src/ui/theme.c:255
|
||||
#: ../src/ui/theme.c:253
|
||||
msgid "top"
|
||||
msgstr "چوققا"
|
||||
|
||||
#: ../src/ui/theme.c:257
|
||||
#: ../src/ui/theme.c:255
|
||||
msgid "bottom"
|
||||
msgstr "ئاستى"
|
||||
|
||||
#: ../src/ui/theme.c:259
|
||||
#: ../src/ui/theme.c:257
|
||||
msgid "left"
|
||||
msgstr "سول"
|
||||
|
||||
#: ../src/ui/theme.c:261
|
||||
#: ../src/ui/theme.c:259
|
||||
msgid "right"
|
||||
msgstr "ئوڭ"
|
||||
|
||||
#: ../src/ui/theme.c:288
|
||||
#: ../src/ui/theme.c:286
|
||||
#, c-format
|
||||
msgid "frame geometry does not specify \"%s\" dimension"
|
||||
msgstr "كاندۇك گىيومېتىرىك جايلاشتۇرۇش \"%s\" نىڭ چوڭلۇقىنى بەلگىلىمىگەن"
|
||||
|
||||
#: ../src/ui/theme.c:307
|
||||
#: ../src/ui/theme.c:305
|
||||
#, c-format
|
||||
msgid "frame geometry does not specify dimension \"%s\" for border \"%s\""
|
||||
msgstr ""
|
||||
"كاندۇك گىيومېتىرىك جايلاشتۇرۇش \"%s\" نىڭ چوڭلۇقىنى بەلگىلىمىگەن(\"%s\" "
|
||||
"گىرۋىكىگە بەلگىلەنگەن)"
|
||||
|
||||
#: ../src/ui/theme.c:344
|
||||
#: ../src/ui/theme.c:342
|
||||
#, c-format
|
||||
msgid "Button aspect ratio %g is not reasonable"
|
||||
msgstr "كۇنۇپكا ئۇزۇنلۇق كەڭلىك نىسبىتى %g غا ماس كەلمەيدۇ"
|
||||
|
||||
#: ../src/ui/theme.c:356
|
||||
#: ../src/ui/theme.c:354
|
||||
#, c-format
|
||||
msgid "Frame geometry does not specify size of buttons"
|
||||
msgstr "كاندۇك گىيومېتىرىك جايلاشتۇرۇشتا تۈگمە چوڭلۇقى بەلگىلەنمىگەن"
|
||||
|
||||
#: ../src/ui/theme.c:1064
|
||||
#: ../src/ui/theme.c:1060
|
||||
#, c-format
|
||||
msgid "Gradients should have at least two colors"
|
||||
msgstr "تەدرىجىي ئۆزگىرىشتە ئاز دېگەندە ئىككى خىل رەڭ بولۇش كېرەك"
|
||||
|
||||
#: ../src/ui/theme.c:1202
|
||||
#: ../src/ui/theme.c:1212
|
||||
#, c-format
|
||||
msgid ""
|
||||
"GTK custom color specification must have color name and fallback in "
|
||||
"parentheses, e.g. gtk:custom(foo,bar); could not parse \"%s\""
|
||||
msgstr ""
|
||||
"GTK رەڭ ئۆلچىمىدە ھالەتتىن كېيىن چوقۇم رەڭ ئاتى ۋە زاپاس بولۇشى لازىم، "
|
||||
"مەسىلەن، gtk:custom(foo,bar) ھالەت؛ \"%s\" نى تەھلىل قىلالمايدۇ"
|
||||
|
||||
#: ../src/ui/theme.c:1228
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Invalid character '%c' in color_name parameter of gtk:custom, only A-Za-z0-9-"
|
||||
"_ are valid"
|
||||
msgstr ""
|
||||
"gtk:custom نىڭ color_name پارامېتىرىدىكى ئىناۋەتسىز ھەرپ '%c'، پەقەت A-Za-z0-"
|
||||
"9-_ نىلا ئىشلەتكىلى بولىدۇ"
|
||||
|
||||
#: ../src/ui/theme.c:1242
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Gtk:custom format is \"gtk:custom(color_name,fallback)\", \"%s\" does not "
|
||||
"fit the format"
|
||||
msgstr ""
|
||||
"Gtk:custom نىڭ پىچىمى \"gtk:custom(color_name,fallback)\" بولۇپ، \"%s\" "
|
||||
"پىچىمغا توغرا كەلمەيدۇ"
|
||||
|
||||
#: ../src/ui/theme.c:1287
|
||||
#, c-format
|
||||
msgid ""
|
||||
"GTK color specification must have the state in brackets, e.g. gtk:fg[NORMAL] "
|
||||
@ -1147,7 +1186,7 @@ msgstr ""
|
||||
"GTK رەڭ ئۆلچىمىدە ھالەت چوقۇم ئوتتۇرا تىرناققا ئېلىنىشى لازىم، مەسىلەن، gtk:"
|
||||
"fg[NORMAL] بۇنىڭدىكى NORMAL ھالەت؛ \"%s\" نى تەھلىل قىلالمايدۇ"
|
||||
|
||||
#: ../src/ui/theme.c:1216
|
||||
#: ../src/ui/theme.c:1301
|
||||
#, c-format
|
||||
msgid ""
|
||||
"GTK color specification must have a close bracket after the state, e.g. gtk:"
|
||||
@ -1156,17 +1195,17 @@ msgstr ""
|
||||
"GTK رەڭ ئۆلچىمىدە ھالەتتىن كېيىن چوقۇم ئوتتۇرا تىرناق يېپىلىشى لازىم، "
|
||||
"مەسىلەن، gtk:fg[NORMAL] بۇنىڭدىكى NORMAL ھالەت؛ \"%s\" نى تەھلىل قىلالمايدۇ"
|
||||
|
||||
#: ../src/ui/theme.c:1227
|
||||
#: ../src/ui/theme.c:1312
|
||||
#, c-format
|
||||
msgid "Did not understand state \"%s\" in color specification"
|
||||
msgstr "رەڭ بەلگىلىمىسىدىكى «%s» ھالەتنى چۈشەنگىلى بولمىدى"
|
||||
|
||||
#: ../src/ui/theme.c:1240
|
||||
#: ../src/ui/theme.c:1325
|
||||
#, c-format
|
||||
msgid "Did not understand color component \"%s\" in color specification"
|
||||
msgstr "رەڭ بەلگىلىمىسىدىكى «%s» رەڭ بۆلىكىنى چۈشەنگىلى بولمىدى"
|
||||
|
||||
#: ../src/ui/theme.c:1270
|
||||
#: ../src/ui/theme.c:1355
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Blend format is \"blend/bg_color/fg_color/alpha\", \"%s\" does not fit the "
|
||||
@ -1175,49 +1214,44 @@ msgstr ""
|
||||
"بىرىكمە رەڭنىڭ فورماتى \"blend/bg_color/fg_color/alpha\"، \"%s\" بۇ "
|
||||
"فورماتقا ماس كەلمىدى"
|
||||
|
||||
#: ../src/ui/theme.c:1281
|
||||
#: ../src/ui/theme.c:1366
|
||||
#, c-format
|
||||
msgid "Could not parse alpha value \"%s\" in blended color"
|
||||
msgstr "بىرىكمە رەڭدىكى ئالفا قىممىتى \"%s\" نى تەھلىل قىلغىلى بولمىدى"
|
||||
|
||||
#: ../src/ui/theme.c:1291
|
||||
#: ../src/ui/theme.c:1376
|
||||
#, 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:1338
|
||||
#: ../src/ui/theme.c:1423
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Shade format is \"shade/base_color/factor\", \"%s\" does not fit the format"
|
||||
msgstr "سايە پىچىمى \"shade/base_color/factor\"، \"%s\" پىچىمغا توغرا كەلمەيدۇ"
|
||||
|
||||
#: ../src/ui/theme.c:1349
|
||||
#: ../src/ui/theme.c:1434
|
||||
#, c-format
|
||||
msgid "Could not parse shade factor \"%s\" in shaded color"
|
||||
msgstr "سايە رەڭگىدىكى سايە فاكتور «%s»نى تەھلىل قىلغىلى بولمىدى"
|
||||
|
||||
#: ../src/ui/theme.c:1359
|
||||
#: ../src/ui/theme.c:1444
|
||||
#, c-format
|
||||
msgid "Shade factor \"%s\" in shaded color is negative"
|
||||
msgstr "سايە رەڭگىدىكى سايە فاكتور “%s” مەنپىي سان"
|
||||
|
||||
#: ../src/ui/theme.c:1388
|
||||
#: ../src/ui/theme.c:1473
|
||||
#, c-format
|
||||
msgid "Could not parse color \"%s\""
|
||||
msgstr "رەڭنى تەھلىل قىلغىلى بولمىدى“%s”"
|
||||
|
||||
#: ../src/ui/theme.c:1481
|
||||
#, c-format
|
||||
msgid "Failed to retrieve color %s[%s] from GTK+ theme.\n"
|
||||
msgstr "GTK+ ئۆرنەكتىن رەڭ %s[%s] نى ئىزدىيەلمىدى\n"
|
||||
|
||||
#: ../src/ui/theme.c:1713
|
||||
#: ../src/ui/theme.c:1784
|
||||
#, c-format
|
||||
msgid "Coordinate expression contains character '%s' which is not allowed"
|
||||
msgstr "كوئوردېنات ئىپادىسىنىڭ تەركىبىدە رۇخسەت قىلىنمىغان تېكىست '%s' بار"
|
||||
|
||||
#: ../src/ui/theme.c:1740
|
||||
#: ../src/ui/theme.c:1811
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression contains floating point number '%s' which could not be "
|
||||
@ -1226,54 +1260,54 @@ msgstr ""
|
||||
"كوئوردېنات ئىپادىسىنىڭ تەركىبىدە تەھلىل قىلغىلى بولمايدىغان كەسىر سان '%s' "
|
||||
"بار"
|
||||
|
||||
#: ../src/ui/theme.c:1754
|
||||
#: ../src/ui/theme.c:1825
|
||||
#, c-format
|
||||
msgid "Coordinate expression contains integer '%s' which could not be parsed"
|
||||
msgstr ""
|
||||
"كوئوردېنات ئىپادىسىنىڭ تەركىبىدە تەھلىل قىلغىلى بولمايدىغان پۈتۈن سان '%s' "
|
||||
"بار"
|
||||
|
||||
#: ../src/ui/theme.c:1876
|
||||
#: ../src/ui/theme.c:1947
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression contained unknown operator at the start of this text: "
|
||||
"\"%s\""
|
||||
msgstr "كوئوردېنات ئىپادىسىنىڭ بېشىدا نامەلۇم ئەمەل بار: «%s»"
|
||||
|
||||
#: ../src/ui/theme.c:1933
|
||||
#: ../src/ui/theme.c:2004
|
||||
#, c-format
|
||||
msgid "Coordinate expression was empty or not understood"
|
||||
msgstr "كوئوردېناتنىڭ ئىپادىلەش شەكلى قۇرۇق ياكى چۈشىنىكسىز"
|
||||
|
||||
#: ../src/ui/theme.c:2044 ../src/ui/theme.c:2054 ../src/ui/theme.c:2088
|
||||
#: ../src/ui/theme.c:2115 ../src/ui/theme.c:2125 ../src/ui/theme.c:2159
|
||||
#, c-format
|
||||
msgid "Coordinate expression results in division by zero"
|
||||
msgstr "كوئوردېناتنىڭ ئىپادىلەش شەكلى 0 نى بۆلگۈچ قىلغان"
|
||||
|
||||
#: ../src/ui/theme.c:2096
|
||||
#: ../src/ui/theme.c:2167
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression tries to use mod operator on a floating-point number"
|
||||
msgstr "كوئوردېنات ئىپادىسى كەسىر سانغا mod ئەمىلىنى ئىشلەتمەكچى"
|
||||
|
||||
#: ../src/ui/theme.c:2152
|
||||
#: ../src/ui/theme.c:2223
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression has an operator \"%s\" where an operand was expected"
|
||||
msgstr ""
|
||||
"كوئوردېنات ئىپادىسىنىڭ تەركىبىدە سان كېلىدىغان يەردە ئەمەل \"%s\" بار ئىكەن"
|
||||
|
||||
#: ../src/ui/theme.c:2161
|
||||
#: ../src/ui/theme.c:2232
|
||||
#, c-format
|
||||
msgid "Coordinate expression had an operand where an operator was expected"
|
||||
msgstr "كوئوردېنات ئىپادىسىنىڭ تەركىبىدە ئەمەل كېلىدىغان يەردە سان بار ئىكەن"
|
||||
|
||||
#: ../src/ui/theme.c:2169
|
||||
#: ../src/ui/theme.c:2240
|
||||
#, c-format
|
||||
msgid "Coordinate expression ended with an operator instead of an operand"
|
||||
msgstr "كوئوردېنات ئىپادىسى سان بىلەن ئاياغلاشماي ئەمەل بىلەن ئاياغلاشقان"
|
||||
|
||||
#: ../src/ui/theme.c:2179
|
||||
#: ../src/ui/theme.c:2250
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression has operator \"%c\" following operator \"%c\" with no "
|
||||
@ -1282,43 +1316,43 @@ msgstr ""
|
||||
"كوئوردېنات ئىپادىسىنىڭ تەركىبىدە ئەمەل \"%2$c\" نىڭ ئارقىسىدىن ئەمەل \"%1$c"
|
||||
"\" كېلىپتۇ، ئارىلىقتا سان يوق ئىكەن"
|
||||
|
||||
#: ../src/ui/theme.c:2330 ../src/ui/theme.c:2375
|
||||
#: ../src/ui/theme.c:2401 ../src/ui/theme.c:2446
|
||||
#, c-format
|
||||
msgid "Coordinate expression had unknown variable or constant \"%s\""
|
||||
msgstr ""
|
||||
"كوئوردېنات ئىپادىسىنىڭ تەركىبىدە نامەلۇم ئۆزگەرگۈچى ياكى تۇراقلىق سان \"%s\" "
|
||||
"بار ئىكەن"
|
||||
|
||||
#: ../src/ui/theme.c:2429
|
||||
#: ../src/ui/theme.c:2500
|
||||
#, c-format
|
||||
msgid "Coordinate expression parser overflowed its buffer."
|
||||
msgstr "كوئوردېنات ئىپادىسىنى تەھلىل قىلىۋاتقاندا يىغلەك تېشىپ كەتتى."
|
||||
|
||||
#: ../src/ui/theme.c:2458
|
||||
#: ../src/ui/theme.c:2529
|
||||
#, c-format
|
||||
msgid "Coordinate expression had a close parenthesis with no open parenthesis"
|
||||
msgstr ""
|
||||
"كوئوردېنات ئىپادىسىنىڭ تەركىبىدىكى يېپىلغان تىرناققا ماس كېلىدىغان ئېچىلغان "
|
||||
"تىرناق يوق"
|
||||
|
||||
#: ../src/ui/theme.c:2522
|
||||
#: ../src/ui/theme.c:2593
|
||||
#, c-format
|
||||
msgid "Coordinate expression had an open parenthesis with no close parenthesis"
|
||||
msgstr ""
|
||||
"كوئوردېنات ئىپادىسىنىڭ تەركىبىدىكى ئېچىلغان تىرناققا ماس كېلىدىغان يېپىلغان "
|
||||
"تىرناق يوق"
|
||||
|
||||
#: ../src/ui/theme.c:2533
|
||||
#: ../src/ui/theme.c:2604
|
||||
#, c-format
|
||||
msgid "Coordinate expression doesn't seem to have any operators or operands"
|
||||
msgstr "كوئوردېنات ئىپادىسىنىڭ تەركىبىدە ئەمەل(قوشۇش، ئېلىش...) ياكى سان يوق"
|
||||
|
||||
#: ../src/ui/theme.c:2745 ../src/ui/theme.c:2765 ../src/ui/theme.c:2785
|
||||
#: ../src/ui/theme.c:2816 ../src/ui/theme.c:2836 ../src/ui/theme.c:2856
|
||||
#, c-format
|
||||
msgid "Theme contained an expression that resulted in an error: %s\n"
|
||||
msgstr "تېما تەركىبىدە خاتالىق چىقىرىدىغان ئىپادە بار: %s\n"
|
||||
|
||||
#: ../src/ui/theme.c:4482
|
||||
#: ../src/ui/theme.c:4527
|
||||
#, c-format
|
||||
msgid ""
|
||||
"<button function=\"%s\" state=\"%s\" draw_ops=\"whatever\"/> must be "
|
||||
@ -1327,25 +1361,25 @@ msgstr ""
|
||||
"<button function=\"%s\" state=\"%s\" draw_ops=\"whatever\"/>بۇ كۆزنەكنىڭ "
|
||||
"ئۇسلۇبى ئۈچۈن بەلگىلىنىشى زۆرۈر"
|
||||
|
||||
#: ../src/ui/theme.c:5012 ../src/ui/theme.c:5037
|
||||
#: ../src/ui/theme.c:5060 ../src/ui/theme.c:5085
|
||||
#, 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:5085
|
||||
#: ../src/ui/theme.c:5133
|
||||
#, c-format
|
||||
msgid "Failed to load theme \"%s\": %s\n"
|
||||
msgstr "تېما “%s” نى كىرگۈزگىلى بولمىدى:%s\n"
|
||||
|
||||
#: ../src/ui/theme.c:5221 ../src/ui/theme.c:5228 ../src/ui/theme.c:5235
|
||||
#: ../src/ui/theme.c:5242 ../src/ui/theme.c:5249
|
||||
#: ../src/ui/theme.c:5269 ../src/ui/theme.c:5276 ../src/ui/theme.c:5283
|
||||
#: ../src/ui/theme.c:5290 ../src/ui/theme.c:5297
|
||||
#, c-format
|
||||
msgid "No <%s> set for theme \"%s\""
|
||||
msgstr "ئۇسلۇب \"%1$s\" نىڭ <%2$s> ئى بەلگىلەنمىگەن"
|
||||
|
||||
#: ../src/ui/theme.c:5257
|
||||
#: ../src/ui/theme.c:5305
|
||||
#, c-format
|
||||
msgid ""
|
||||
"No frame style set for window type \"%s\" in theme \"%s\", add a <window "
|
||||
@ -1354,7 +1388,7 @@ msgstr ""
|
||||
"كۆزنەك تىپى \"%s\" (\"%s\" تېمىدا)غا كاندۇك كۆزنەك تەڭشەلمىگەن، بىر <window "
|
||||
"type=\"%s\" style_set=\"whatever\"/> ئېلېمېنتى قوشۇڭ"
|
||||
|
||||
#: ../src/ui/theme.c:5707 ../src/ui/theme.c:5769 ../src/ui/theme.c:5832
|
||||
#: ../src/ui/theme.c:5744 ../src/ui/theme.c:5806 ../src/ui/theme.c:5869
|
||||
#, c-format
|
||||
msgid ""
|
||||
"User-defined constants must begin with a capital letter; \"%s\" does not"
|
||||
@ -1362,7 +1396,7 @@ msgstr ""
|
||||
"ئىشلەتكۈچى بەلگىلىگەن تۇراقلىق مىقدار چوقۇم چوڭ ھەرپ بىلەن باشلانسۇن؛ «%s» "
|
||||
"بولمايدۇ"
|
||||
|
||||
#: ../src/ui/theme.c:5715 ../src/ui/theme.c:5777 ../src/ui/theme.c:5840
|
||||
#: ../src/ui/theme.c:5752 ../src/ui/theme.c:5814 ../src/ui/theme.c:5877
|
||||
#, c-format
|
||||
msgid "Constant \"%s\" has already been defined"
|
||||
msgstr "تۇراقلىق سان “%s” غا ئېنىقلىما بېرىلگەن"
|
||||
@ -1821,88 +1855,88 @@ msgstr "بۇ ئۈلگە سۆزلەشكۈسىدىكى مىسال ئۇچۇرى"
|
||||
msgid "Fake menu item %d\n"
|
||||
msgstr "مەۋھۇم تىزىملىك تۈرى %d\n"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:370
|
||||
#: ../src/ui/theme-viewer.c:371
|
||||
msgid "Border-only window"
|
||||
msgstr "گىرۋەكلىك كۆزنەك"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:372
|
||||
#: ../src/ui/theme-viewer.c:373
|
||||
msgid "Bar"
|
||||
msgstr "تۈۋرۈكسىمان دىئاگرامما"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:389
|
||||
#: ../src/ui/theme-viewer.c:390
|
||||
msgid "Normal Application Window"
|
||||
msgstr "ئادەتتىكى پروگرامما كۆزنىكى"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:393
|
||||
#: ../src/ui/theme-viewer.c:394
|
||||
msgid "Dialog Box"
|
||||
msgstr "سۆزلەشكۈ كۆزنەكچىسى"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:397
|
||||
#: ../src/ui/theme-viewer.c:398
|
||||
msgid "Modal Dialog Box"
|
||||
msgstr "ھالەت سۆزلەشكۈ رامكىسى"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:401
|
||||
#: ../src/ui/theme-viewer.c:402
|
||||
msgid "Utility Palette"
|
||||
msgstr "قورال كۇنۇپكىسى"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:405
|
||||
#: ../src/ui/theme-viewer.c:406
|
||||
msgid "Torn-off Menu"
|
||||
msgstr "بۆلىۋالغان تىزىملىك"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:409
|
||||
#: ../src/ui/theme-viewer.c:410
|
||||
msgid "Border"
|
||||
msgstr "گىرۋەك"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:413
|
||||
#: ../src/ui/theme-viewer.c:414
|
||||
msgid "Attached Modal Dialog"
|
||||
msgstr "قوشۇلغان Modal سۆزلەشكۈ"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:744
|
||||
#: ../src/ui/theme-viewer.c:747
|
||||
#, c-format
|
||||
msgid "Button layout test %d"
|
||||
msgstr "كۇنۇپكا ئورۇنلاشتۇرۇلۇشىنى سىناش %d"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:773
|
||||
#: ../src/ui/theme-viewer.c:776
|
||||
#, c-format
|
||||
msgid "%g milliseconds to draw one window frame"
|
||||
msgstr "%g مىللىسېكۇنت(بىر كۆزنەك كاندۇكىنى سىزىشقا كەتكەن ۋاقىت)"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:818
|
||||
#: ../src/ui/theme-viewer.c:821
|
||||
#, c-format
|
||||
msgid "Usage: metacity-theme-viewer [THEMENAME]\n"
|
||||
msgstr "ئىشلىتىش ئۇسۇلى: metacity-theme-viewer [ئۇسلۇب ئاتى]\n"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:825
|
||||
#: ../src/ui/theme-viewer.c:828
|
||||
#, c-format
|
||||
msgid "Error loading theme: %s\n"
|
||||
msgstr "تېما قاچىلاشتا خاتالىق كۆرۈلدى:%s\n"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:831
|
||||
#: ../src/ui/theme-viewer.c:834
|
||||
#, c-format
|
||||
msgid "Loaded theme \"%s\" in %g seconds\n"
|
||||
msgstr "\"%s\" دېگەن ئۇسلۇبنى %g سېكۇنتتا ئوقۇدى\n"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:875
|
||||
#: ../src/ui/theme-viewer.c:878
|
||||
msgid "Normal Title Font"
|
||||
msgstr "ئادەتتىكى ماۋزۇ خەت نۇسخىسى"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:881
|
||||
#: ../src/ui/theme-viewer.c:884
|
||||
msgid "Small Title Font"
|
||||
msgstr "تارماق ماۋزۇ خەت نۇسخىسى"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:887
|
||||
#: ../src/ui/theme-viewer.c:890
|
||||
msgid "Large Title Font"
|
||||
msgstr "ماۋزۇ خەت نۇسخىسى"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:892
|
||||
#: ../src/ui/theme-viewer.c:895
|
||||
msgid "Button Layouts"
|
||||
msgstr "كۇنۇپكا ئورۇنلاشتۇرۇلۇشى"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:897
|
||||
#: ../src/ui/theme-viewer.c:900
|
||||
msgid "Benchmark"
|
||||
msgstr "ئاساسىي ئۆلچەم"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:949
|
||||
#: ../src/ui/theme-viewer.c:952
|
||||
msgid "Window Title Goes Here"
|
||||
msgstr "بۇ يەردە كۆزنەك ماۋزۇسى كۆرسىتىلىدۇ"
|
||||
|
||||
@ -1955,6 +1989,9 @@ msgid "%d coordinate expressions parsed in %g seconds (%g seconds average)\n"
|
||||
msgstr ""
|
||||
"%d كوئوردېنات ئىپادىسى %g سېكۇنتتا تەھلىل قىلىندى(%g ئوتتۇرىچە سېكۇنت)\n"
|
||||
|
||||
#~ msgid "Failed to retrieve color %s[%s] from GTK+ theme.\n"
|
||||
#~ msgstr "GTK+ ئۆرنەكتىن رەڭ %s[%s] نى ئىزدىيەلمىدى\n"
|
||||
|
||||
#~ msgid "Turn compositing on"
|
||||
#~ msgstr "ئارىلاشتۇرۇشنى ئىچىش"
|
||||
|
||||
|
1166
po/zh_CN.po
1166
po/zh_CN.po
File diff suppressed because it is too large
Load Diff
1337
po/zh_HK.po
1337
po/zh_HK.po
File diff suppressed because it is too large
Load Diff
1346
po/zh_TW.po
1346
po/zh_TW.po
File diff suppressed because it is too large
Load Diff
15
src/50-mutter-windows.xml.in
Normal file
15
src/50-mutter-windows.xml.in
Normal file
@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<KeyListEntries schema="org.gnome.mutter.keybindings"
|
||||
group="system"
|
||||
_name="Windows"
|
||||
wm_name="Mutter"
|
||||
package="mutter">
|
||||
|
||||
<KeyListEntry name="toggle-tiled-left"
|
||||
_description="View split on left"/>
|
||||
|
||||
<KeyListEntry name="toggle-tiled-right"
|
||||
_description="View split on right"/>
|
||||
|
||||
</KeyListEntries>
|
||||
|
@ -27,8 +27,6 @@ INCLUDES= \
|
||||
-DGETTEXT_PACKAGE=\"$(GETTEXT_PACKAGE)\"
|
||||
|
||||
mutter_built_sources = \
|
||||
mutter-marshal.h \
|
||||
mutter-marshal.c \
|
||||
mutter-enum-types.h \
|
||||
mutter-enum-types.c
|
||||
|
||||
@ -45,7 +43,7 @@ libmutter_la_SOURCES = \
|
||||
compositor/compositor.c \
|
||||
compositor/compositor-private.h \
|
||||
compositor/meta-background-actor.c \
|
||||
compositor/meta-background-actor.h \
|
||||
compositor/meta-background-actor-private.h \
|
||||
compositor/meta-module.c \
|
||||
compositor/meta-module.h \
|
||||
compositor/meta-plugin.c \
|
||||
@ -54,7 +52,8 @@ libmutter_la_SOURCES = \
|
||||
compositor/meta-shadow-factory.c \
|
||||
compositor/meta-shadow-factory-private.h \
|
||||
compositor/meta-shaped-texture.c \
|
||||
compositor/meta-shaped-texture.h \
|
||||
compositor/meta-texture-rectangle.c \
|
||||
compositor/meta-texture-rectangle.h \
|
||||
compositor/meta-texture-tower.c \
|
||||
compositor/meta-texture-tower.h \
|
||||
compositor/meta-window-actor.c \
|
||||
@ -66,6 +65,7 @@ libmutter_la_SOURCES = \
|
||||
compositor/region-utils.c \
|
||||
compositor/region-utils.h \
|
||||
meta/compositor.h \
|
||||
meta/meta-background-actor.h \
|
||||
meta/meta-plugin.h \
|
||||
meta/meta-shadow-factory.h \
|
||||
meta/meta-window-actor.h \
|
||||
@ -130,8 +130,6 @@ libmutter_la_SOURCES = \
|
||||
core/core.h \
|
||||
ui/ui.h \
|
||||
inlinepixbufs.h \
|
||||
ui/fixedtip.c \
|
||||
ui/fixedtip.h \
|
||||
ui/frames.c \
|
||||
ui/frames.h \
|
||||
ui/menu.c \
|
||||
@ -149,7 +147,6 @@ libmutter_la_SOURCES = \
|
||||
meta/theme.h \
|
||||
ui/theme-private.h \
|
||||
ui/ui.c \
|
||||
core/all-keybindings.h \
|
||||
meta/preview-widget.h \
|
||||
ui/preview-widget.c \
|
||||
$(mutter_built_sources)
|
||||
@ -170,7 +167,9 @@ libmutterinclude_base_headers = \
|
||||
meta/group.h \
|
||||
meta/keybindings.h \
|
||||
meta/main.h \
|
||||
meta/meta-background-actor.h \
|
||||
meta/meta-plugin.h \
|
||||
meta/meta-shaped-texture.h \
|
||||
meta/meta-shadow-factory.h \
|
||||
meta/meta-window-actor.h \
|
||||
meta/prefs.h \
|
||||
@ -222,8 +221,8 @@ typelib_DATA = Meta-$(api_version).typelib
|
||||
INTROSPECTION_GIRS = Meta-$(api_version).gir
|
||||
|
||||
Meta-$(api_version).gir: libmutter.la
|
||||
@META_GIR@_INCLUDES = GObject-2.0 Gdk-3.0 Gtk-3.0 Clutter-1.0 xlib-2.0 xfixes-4.0
|
||||
@META_GIR@_PACKAGES = clutter-1.0 gtk+-3.0
|
||||
@META_GIR@_INCLUDES = GObject-2.0 GDesktopEnums-3.0 Gdk-3.0 Gtk-3.0 Clutter-1.0 xlib-2.0 xfixes-4.0
|
||||
@META_GIR@_EXPORT_PACKAGES = libmutter
|
||||
@META_GIR@_CFLAGS = $(INCLUDES)
|
||||
@META_GIR@_LIBS = libmutter.la
|
||||
@META_GIR@_FILES = \
|
||||
@ -258,20 +257,17 @@ wmproperties_in_files=mutter-wm.desktop.in
|
||||
wmproperties_files=$(wmproperties_in_files:.desktop.in=.desktop)
|
||||
wmproperties_DATA = $(wmproperties_files)
|
||||
|
||||
schemadir = $(GCONF_SCHEMA_FILE_DIR)
|
||||
schema_in_files = mutter.schemas.in
|
||||
schema_DATA = $(schema_in_files:.schemas.in=.schemas)
|
||||
xmldir = @GNOME_KEYBINDINGS_KEYSDIR@
|
||||
xml_in_files = \
|
||||
50-mutter-windows.xml.in
|
||||
xml_DATA = $(xml_in_files:.xml.in=.xml)
|
||||
|
||||
gsettings_SCHEMAS = org.gnome.mutter.gschema.xml
|
||||
@INTLTOOL_XML_NOMERGE_RULE@
|
||||
@GSETTINGS_RULES@
|
||||
|
||||
@INTLTOOL_SCHEMAS_RULE@
|
||||
|
||||
if GCONF_SCHEMAS_INSTALL
|
||||
install-data-local:
|
||||
GCONF_CONFIG_SOURCE=$(GCONF_SCHEMA_CONFIG_SOURCE) $(GCONFTOOL) --makefile-install-rule $(schema_DATA)
|
||||
else
|
||||
install-data-local:
|
||||
endif
|
||||
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 \
|
||||
@ -283,7 +279,8 @@ CLEANFILES = \
|
||||
inlinepixbufs.h \
|
||||
mutter.desktop \
|
||||
mutter-wm.desktop \
|
||||
mutter.schemas \
|
||||
org.gnome.mutter.gschema.xml \
|
||||
$(xml_DATA) \
|
||||
$(mutter_built_sources) \
|
||||
$(typelib_DATA) \
|
||||
$(gir_DATA)
|
||||
@ -300,37 +297,18 @@ EXTRA_DIST=$(desktopfiles_files) \
|
||||
$(IMAGES) \
|
||||
$(desktopfiles_in_files) \
|
||||
$(wmproperties_in_files) \
|
||||
$(schema_in_files) \
|
||||
$(xml_in_files) \
|
||||
org.gnome.mutter.gschema.xml.in \
|
||||
mutter-schemas.convert \
|
||||
libmutter.pc.in \
|
||||
mutter-plugins.pc.in \
|
||||
mutter-enum-types.h.in \
|
||||
mutter-enum-types.c.in \
|
||||
mutter-marshal.list
|
||||
mutter-enum-types.c.in
|
||||
|
||||
BUILT_SOURCES += $(mutter_built_sources)
|
||||
MUTTER_STAMP_FILES = stamp-mutter-marshal.h stamp-mutter-enum-types.h
|
||||
MUTTER_STAMP_FILES = stamp-mutter-enum-types.h
|
||||
CLEANFILES += $(MUTTER_STAMP_FILES)
|
||||
|
||||
mutter-marshal.h: stamp-mutter-marshal.h
|
||||
@true
|
||||
stamp-mutter-marshal.h: Makefile mutter-marshal.list
|
||||
$(AM_V_GEN) $(GLIB_GENMARSHAL) \
|
||||
--prefix=_mutter_marshal \
|
||||
--header \
|
||||
$(srcdir)/mutter-marshal.list > xgen-tmh && \
|
||||
(cmp -s xgen-tmh mutter-marshal.h || cp -f xgen-tmh mutter-marshal.h) && \
|
||||
rm -f xgen-tmh && \
|
||||
echo timestamp > $(@F)
|
||||
|
||||
mutter-marshal.c: Makefile mutter-marshal.list
|
||||
$(AM_V_GEN) (echo "#include \"mutter-marshal.h\"" ; \
|
||||
$(GLIB_GENMARSHAL) \
|
||||
--prefix=_mutter_marshal \
|
||||
--body \
|
||||
$(srcdir)/mutter-marshal.list ) > xgen-tmc && \
|
||||
cp -f xgen-tmc mutter-marshal.c && \
|
||||
rm -f xgen-tmc
|
||||
|
||||
mutter-enum-types.h: stamp-mutter-enum-types.h Makefile
|
||||
@true
|
||||
stamp-mutter-enum-types.h: $(libmutterinclude_base_headers) mutter-enum-types.h.in
|
||||
|
@ -8,6 +8,7 @@
|
||||
#include <meta/compositor.h>
|
||||
#include <meta/display.h>
|
||||
#include "meta-plugin-manager.h"
|
||||
#include "meta-window-actor-private.h"
|
||||
#include <clutter/clutter.h>
|
||||
|
||||
typedef struct _MetaCompScreen MetaCompScreen;
|
||||
@ -41,6 +42,10 @@ struct _MetaCompScreen
|
||||
GHashTable *windows_by_xid;
|
||||
Window output;
|
||||
|
||||
/* Used for unredirecting fullscreen windows */
|
||||
guint disable_unredirect_count;
|
||||
MetaWindowActor *unredirected_window;
|
||||
|
||||
/* Before we create the output window */
|
||||
XserverRegion pending_input_region;
|
||||
|
||||
@ -50,9 +55,6 @@ struct _MetaCompScreen
|
||||
};
|
||||
|
||||
void meta_switch_workspace_completed (MetaScreen *screen);
|
||||
void meta_set_stage_input_region (MetaScreen *screen,
|
||||
XserverRegion region);
|
||||
void meta_empty_stage_input_region (MetaScreen *screen);
|
||||
|
||||
gboolean meta_begin_modal_for_plugin (MetaScreen *screen,
|
||||
MetaPlugin *plugin,
|
||||
|
@ -15,7 +15,7 @@
|
||||
#include <meta/meta-shadow-factory.h>
|
||||
#include "meta-window-actor-private.h"
|
||||
#include "meta-window-group.h"
|
||||
#include "meta-background-actor.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>
|
||||
@ -109,28 +109,6 @@ process_damage (MetaCompositor *compositor,
|
||||
meta_window_actor_process_damage (window_actor, event);
|
||||
}
|
||||
|
||||
#ifdef HAVE_SHAPE
|
||||
static void
|
||||
process_shape (MetaCompositor *compositor,
|
||||
XShapeEvent *event,
|
||||
MetaWindow *window)
|
||||
{
|
||||
MetaWindowActor *window_actor;
|
||||
|
||||
if (window == NULL)
|
||||
return;
|
||||
|
||||
window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (window));
|
||||
if (window_actor == NULL)
|
||||
return;
|
||||
|
||||
if (event->kind == ShapeBounding)
|
||||
{
|
||||
meta_window_actor_update_shape (window_actor, event->shaped);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static void
|
||||
process_property_notify (MetaCompositor *compositor,
|
||||
XPropertyEvent *event,
|
||||
@ -147,8 +125,7 @@ process_property_notify (MetaCompositor *compositor,
|
||||
MetaScreen *screen = l->data;
|
||||
if (event->window == meta_screen_get_xroot (screen))
|
||||
{
|
||||
MetaCompScreen *info = meta_screen_get_compositor_data (screen);
|
||||
meta_background_actor_update (META_BACKGROUND_ACTOR (info->background_actor));
|
||||
meta_background_actor_update (screen);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -302,6 +279,12 @@ do_set_stage_input_region (MetaScreen *screen,
|
||||
Window xstage = clutter_x11_get_stage_window (CLUTTER_STAGE (info->stage));
|
||||
|
||||
XFixesSetWindowShapeRegion (xdpy, xstage, ShapeInput, 0, 0, region);
|
||||
|
||||
/* It's generally a good heuristic that when a crossing event is generated because
|
||||
* we reshape the overlay, we don't want it to affect focus-follows-mouse focus -
|
||||
* it's not the user doing something, it's the environment changing under the user.
|
||||
*/
|
||||
meta_display_add_ignored_crossing_serial (display, XNextRequest (xdpy));
|
||||
XFixesSetWindowShapeRegion (xdpy, info->output, ShapeInput, 0, 0, region);
|
||||
}
|
||||
|
||||
@ -532,13 +515,15 @@ meta_compositor_manage_screen (MetaCompositor *compositor,
|
||||
|
||||
meta_screen_set_cm_selection (screen);
|
||||
|
||||
info->stage = clutter_stage_get_default ();
|
||||
info->stage = clutter_stage_new ();
|
||||
|
||||
meta_screen_get_size (screen, &width, &height);
|
||||
clutter_actor_set_size (info->stage, width, height);
|
||||
clutter_actor_realize (info->stage);
|
||||
|
||||
xwin = clutter_x11_get_stage_window (CLUTTER_STAGE (info->stage));
|
||||
|
||||
XResizeWindow (xdisplay, xwin, width, height);
|
||||
|
||||
event_mask = FocusChangeMask |
|
||||
ExposureMask |
|
||||
EnterWindowMask | LeaveWindowMask |
|
||||
@ -556,7 +541,7 @@ meta_compositor_manage_screen (MetaCompositor *compositor,
|
||||
XSelectInput (xdisplay, xwin, event_mask);
|
||||
|
||||
info->window_group = meta_window_group_new (screen);
|
||||
info->background_actor = meta_background_actor_new (screen);
|
||||
info->background_actor = meta_background_actor_new_for_screen (screen);
|
||||
info->overlay_group = clutter_group_new ();
|
||||
info->hidden_group = clutter_group_new ();
|
||||
|
||||
@ -572,9 +557,7 @@ meta_compositor_manage_screen (MetaCompositor *compositor,
|
||||
|
||||
clutter_actor_hide (info->hidden_group);
|
||||
|
||||
info->plugin_mgr =
|
||||
meta_plugin_manager_get (screen);
|
||||
meta_plugin_manager_initialize (info->plugin_mgr);
|
||||
info->plugin_mgr = meta_plugin_manager_new (screen);
|
||||
|
||||
/*
|
||||
* Delay the creation of the overlay window as long as we can, to avoid
|
||||
@ -621,6 +604,47 @@ meta_compositor_unmanage_screen (MetaCompositor *compositor,
|
||||
XCompositeUnredirectSubwindows (xdisplay, xroot, CompositeRedirectManual);
|
||||
}
|
||||
|
||||
/*
|
||||
* Shapes the cow so that the given window is exposed,
|
||||
* when metaWindow is NULL it clears the shape again
|
||||
*/
|
||||
static void
|
||||
meta_shape_cow_for_window (MetaScreen *screen,
|
||||
MetaWindow *metaWindow)
|
||||
{
|
||||
MetaCompScreen *info = meta_screen_get_compositor_data (screen);
|
||||
Display *xdisplay = meta_display_get_xdisplay (meta_screen_get_display (screen));
|
||||
|
||||
if (metaWindow == NULL)
|
||||
XFixesSetWindowShapeRegion (xdisplay, info->output, ShapeBounding, 0, 0, None);
|
||||
else
|
||||
{
|
||||
XserverRegion output_region;
|
||||
XRectangle screen_rect, window_bounds;
|
||||
int width, height;
|
||||
MetaRectangle rect;
|
||||
|
||||
meta_window_get_outer_rect (metaWindow, &rect);
|
||||
|
||||
window_bounds.x = rect.x;
|
||||
window_bounds.y = rect.y;
|
||||
window_bounds.width = rect.width;
|
||||
window_bounds.height = rect.height;
|
||||
|
||||
meta_screen_get_size (screen, &width, &height);
|
||||
screen_rect.x = 0;
|
||||
screen_rect.y = 0;
|
||||
screen_rect.width = width;
|
||||
screen_rect.height = height;
|
||||
|
||||
output_region = XFixesCreateRegion (xdisplay, &window_bounds, 1);
|
||||
|
||||
XFixesInvertRegion (xdisplay, output_region, &screen_rect, output_region);
|
||||
XFixesSetWindowShapeRegion (xdisplay, info->output, ShapeBounding, 0, 0, output_region);
|
||||
XFixesDestroyRegion (xdisplay, output_region);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
meta_compositor_add_window (MetaCompositor *compositor,
|
||||
MetaWindow *window)
|
||||
@ -641,12 +665,25 @@ meta_compositor_remove_window (MetaCompositor *compositor,
|
||||
MetaWindow *window)
|
||||
{
|
||||
MetaWindowActor *window_actor = NULL;
|
||||
MetaScreen *screen;
|
||||
MetaCompScreen *info;
|
||||
|
||||
DEBUG_TRACE ("meta_compositor_remove_window\n");
|
||||
window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (window));
|
||||
if (!window_actor)
|
||||
return;
|
||||
|
||||
screen = meta_window_get_screen (window);
|
||||
info = meta_screen_get_compositor_data (screen);
|
||||
|
||||
if (window_actor == info->unredirected_window)
|
||||
{
|
||||
meta_window_actor_set_redirected (window_actor, TRUE);
|
||||
meta_shape_cow_for_window (meta_window_get_screen (meta_window_actor_get_meta_window (info->unredirected_window)),
|
||||
NULL);
|
||||
info->unredirected_window = NULL;
|
||||
}
|
||||
|
||||
meta_window_actor_destroy (window_actor);
|
||||
}
|
||||
|
||||
@ -674,6 +711,16 @@ is_grabbed_event (XEvent *event)
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void
|
||||
meta_compositor_window_shape_changed (MetaCompositor *compositor,
|
||||
MetaWindow *window)
|
||||
{
|
||||
MetaWindowActor *window_actor;
|
||||
window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (window));
|
||||
meta_window_actor_update_shape (window_actor);
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_compositor_process_event: (skip)
|
||||
*
|
||||
@ -753,13 +800,6 @@ meta_compositor_process_event (MetaCompositor *compositor,
|
||||
DEBUG_TRACE ("meta_compositor_process_event (process_damage)\n");
|
||||
process_damage (compositor, (XDamageNotifyEvent *) event, window);
|
||||
}
|
||||
#ifdef HAVE_SHAPE
|
||||
else if (event->type == meta_display_get_shape_event_base (compositor->display) + ShapeNotify)
|
||||
{
|
||||
DEBUG_TRACE ("meta_compositor_process_event (process_shape)\n");
|
||||
process_shape (compositor, (XShapeEvent *) event, window);
|
||||
}
|
||||
#endif /* HAVE_SHAPE */
|
||||
break;
|
||||
}
|
||||
|
||||
@ -829,29 +869,6 @@ meta_compositor_unmaximize_window (MetaCompositor *compositor,
|
||||
meta_window_actor_unmaximize (window_actor, old_rect, new_rect);
|
||||
}
|
||||
|
||||
void
|
||||
meta_compositor_update_workspace_geometry (MetaCompositor *compositor,
|
||||
MetaWorkspace *workspace)
|
||||
{
|
||||
#if 0
|
||||
/* FIXME -- should do away with this function in favour of MetaWorkspace
|
||||
* signal.
|
||||
*/
|
||||
MetaScreen *screen = meta_workspace_get_screen (workspace);
|
||||
MetaCompScreen *info;
|
||||
MetaPluginManager *mgr;
|
||||
|
||||
DEBUG_TRACE ("meta_compositor_update_workspace_geometry\n");
|
||||
info = meta_screen_get_compositor_data (screen);
|
||||
mgr = info->plugin_mgr;
|
||||
|
||||
if (!mgr || !workspace)
|
||||
return;
|
||||
|
||||
meta_plugin_manager_update_workspace (mgr, workspace);
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
meta_compositor_switch_workspace (MetaCompositor *compositor,
|
||||
MetaScreen *screen,
|
||||
@ -1099,14 +1116,20 @@ meta_compositor_sync_screen_size (MetaCompositor *compositor,
|
||||
guint width,
|
||||
guint height)
|
||||
{
|
||||
MetaCompScreen *info = meta_screen_get_compositor_data (screen);
|
||||
MetaDisplay *display = meta_screen_get_display (screen);
|
||||
MetaCompScreen *info = meta_screen_get_compositor_data (screen);
|
||||
Display *xdisplay;
|
||||
Window xwin;
|
||||
|
||||
DEBUG_TRACE ("meta_compositor_sync_screen_size\n");
|
||||
g_return_if_fail (info);
|
||||
|
||||
clutter_actor_set_size (info->stage, width, height);
|
||||
xdisplay = meta_display_get_xdisplay (display);
|
||||
xwin = clutter_x11_get_stage_window (CLUTTER_STAGE (info->stage));
|
||||
|
||||
meta_background_actor_screen_size_changed (META_BACKGROUND_ACTOR (info->background_actor));
|
||||
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),
|
||||
@ -1117,6 +1140,36 @@ static void
|
||||
pre_paint_windows (MetaCompScreen *info)
|
||||
{
|
||||
GList *l;
|
||||
MetaWindowActor *top_window;
|
||||
MetaWindowActor *expected_unredirected_window = NULL;
|
||||
|
||||
if (info->windows == NULL)
|
||||
return;
|
||||
|
||||
top_window = g_list_last (info->windows)->data;
|
||||
|
||||
if (meta_window_actor_should_unredirect (top_window) &&
|
||||
info->disable_unredirect_count == 0)
|
||||
expected_unredirected_window = top_window;
|
||||
|
||||
if (info->unredirected_window != expected_unredirected_window)
|
||||
{
|
||||
if (info->unredirected_window != NULL)
|
||||
{
|
||||
meta_window_actor_set_redirected (info->unredirected_window, TRUE);
|
||||
meta_shape_cow_for_window (meta_window_get_screen (meta_window_actor_get_meta_window (info->unredirected_window)),
|
||||
NULL);
|
||||
}
|
||||
|
||||
if (expected_unredirected_window != NULL)
|
||||
{
|
||||
meta_shape_cow_for_window (meta_window_get_screen (meta_window_actor_get_meta_window (top_window)),
|
||||
meta_window_actor_get_meta_window (top_window));
|
||||
meta_window_actor_set_redirected (top_window, FALSE);
|
||||
}
|
||||
|
||||
info->unredirected_window = expected_unredirected_window;
|
||||
}
|
||||
|
||||
for (l = info->windows; l; l = l->next)
|
||||
meta_window_actor_pre_paint (l->data);
|
||||
@ -1220,6 +1273,37 @@ meta_get_overlay_window (MetaScreen *screen)
|
||||
return info->output;
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_disable_unredirect_for_screen:
|
||||
* @screen: a #MetaScreen
|
||||
*
|
||||
* Disables unredirection, can be usefull in situations where having
|
||||
* unredirected windows is undesireable like when recording a video.
|
||||
*
|
||||
*/
|
||||
void
|
||||
meta_disable_unredirect_for_screen (MetaScreen *screen)
|
||||
{
|
||||
MetaCompScreen *info = meta_screen_get_compositor_data (screen);
|
||||
if (info != NULL)
|
||||
info->disable_unredirect_count = info->disable_unredirect_count + 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_enable_unredirect_for_screen:
|
||||
* @screen: a #MetaScreen
|
||||
*
|
||||
* Enables unredirection which reduces the overhead for apps like games.
|
||||
*
|
||||
*/
|
||||
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);
|
||||
}
|
||||
|
||||
#define FLASH_TIME_MS 50
|
||||
|
||||
static void
|
||||
|
15
src/compositor/meta-background-actor-private.h
Normal file
15
src/compositor/meta-background-actor-private.h
Normal file
@ -0,0 +1,15 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
#ifndef META_BACKGROUND_ACTOR_PRIVATE_H
|
||||
#define META_BACKGROUND_ACTOR_PRIVATE_H
|
||||
|
||||
#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_update (MetaScreen *screen);
|
||||
void meta_background_actor_screen_size_changed (MetaScreen *screen);
|
||||
|
||||
#endif /* META_BACKGROUND_ACTOR_PRIVATE_H */
|
@ -28,76 +28,188 @@
|
||||
#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>
|
||||
|
||||
#include "cogl-utils.h"
|
||||
#include "compositor-private.h"
|
||||
#include <meta/errors.h>
|
||||
#include "meta-background-actor.h"
|
||||
#include "meta-background-actor-private.h"
|
||||
|
||||
struct _MetaBackgroundActorClass
|
||||
/* 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
|
||||
{
|
||||
ClutterActorClass parent_class;
|
||||
};
|
||||
|
||||
struct _MetaBackgroundActor
|
||||
{
|
||||
ClutterActor parent;
|
||||
|
||||
CoglHandle material;
|
||||
MetaScreen *screen;
|
||||
cairo_region_t *visible_region;
|
||||
GSList *actors;
|
||||
|
||||
float texture_width;
|
||||
float texture_height;
|
||||
|
||||
CoglHandle texture;
|
||||
CoglMaterialWrapMode wrap_mode;
|
||||
guint have_pixmap : 1;
|
||||
};
|
||||
|
||||
struct _MetaBackgroundActorPrivate
|
||||
{
|
||||
MetaScreenBackground *background;
|
||||
CoglHandle material;
|
||||
cairo_region_t *visible_region;
|
||||
float dim_factor;
|
||||
};
|
||||
|
||||
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
|
||||
update_wrap_mode (MetaBackgroundActor *self)
|
||||
{
|
||||
int width, height;
|
||||
CoglMaterialWrapMode wrap_mode;
|
||||
static void set_texture (MetaScreenBackground *background,
|
||||
CoglHandle texture);
|
||||
static void set_texture_to_stage_color (MetaScreenBackground *background);
|
||||
|
||||
meta_screen_get_size (self->screen, &width, &height);
|
||||
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_material_set_layer_wrap_mode (priv->material, 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 == self->texture_width && height == self->texture_height)
|
||||
wrap_mode = COGL_MATERIAL_WRAP_MODE_CLAMP_TO_EDGE;
|
||||
if (width == background->texture_width && height == background->texture_height)
|
||||
background->wrap_mode = COGL_MATERIAL_WRAP_MODE_CLAMP_TO_EDGE;
|
||||
else
|
||||
wrap_mode = COGL_MATERIAL_WRAP_MODE_REPEAT;
|
||||
background->wrap_mode = COGL_MATERIAL_WRAP_MODE_REPEAT;
|
||||
|
||||
cogl_material_set_layer_wrap_mode (self->material, 0, wrap_mode);
|
||||
for (l = background->actors; l; l = l->next)
|
||||
update_wrap_mode_of_actor (l->data);
|
||||
}
|
||||
|
||||
static void
|
||||
set_texture (MetaBackgroundActor *self,
|
||||
CoglHandle texture)
|
||||
set_texture_on_actor (MetaBackgroundActor *self)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
|
||||
display = meta_screen_get_display (self->screen);
|
||||
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_material_set_layer (self->material, 0, texture);
|
||||
cogl_material_set_layer (priv->material, 0, priv->background->texture);
|
||||
meta_error_trap_pop (display);
|
||||
|
||||
self->texture_width = cogl_texture_get_width (texture);
|
||||
self->texture_height = cogl_texture_get_height (texture);
|
||||
|
||||
update_wrap_mode (self);
|
||||
|
||||
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 material 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
|
||||
@ -106,9 +218,9 @@ set_texture (MetaBackgroundActor *self,
|
||||
* actually pick up the (small?) performance win. This is just a fallback.
|
||||
*/
|
||||
static void
|
||||
set_texture_to_stage_color (MetaBackgroundActor *self)
|
||||
set_texture_to_stage_color (MetaScreenBackground *background)
|
||||
{
|
||||
ClutterActor *stage = meta_get_stage_for_screen (self->screen);
|
||||
ClutterActor *stage = meta_get_stage_for_screen (background->screen);
|
||||
ClutterColor color;
|
||||
CoglHandle texture;
|
||||
|
||||
@ -120,40 +232,31 @@ set_texture_to_stage_color (MetaBackgroundActor *self)
|
||||
texture = meta_create_color_texture_4ub (color.red, color.green,
|
||||
color.blue, 0xff,
|
||||
COGL_TEXTURE_NO_SLICING);
|
||||
set_texture (self, texture);
|
||||
set_texture (background, texture);
|
||||
cogl_handle_unref (texture);
|
||||
}
|
||||
|
||||
static void
|
||||
on_notify_stage_color (GObject *stage,
|
||||
GParamSpec *pspec,
|
||||
MetaBackgroundActor *self)
|
||||
{
|
||||
if (!self->have_pixmap)
|
||||
set_texture_to_stage_color (self);
|
||||
}
|
||||
|
||||
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 (self->material != COGL_INVALID_HANDLE)
|
||||
if (priv->background != NULL)
|
||||
{
|
||||
cogl_handle_unref (self->material);
|
||||
self->material = COGL_INVALID_HANDLE;
|
||||
priv->background->actors = g_slist_remove (priv->background->actors, self);
|
||||
priv->background = NULL;
|
||||
}
|
||||
|
||||
if (self->screen != NULL)
|
||||
if (priv->material != COGL_INVALID_HANDLE)
|
||||
{
|
||||
ClutterActor *stage = meta_get_stage_for_screen (self->screen);
|
||||
g_signal_handlers_disconnect_by_func (stage,
|
||||
(gpointer) on_notify_stage_color,
|
||||
self);
|
||||
self->screen = NULL;
|
||||
cogl_handle_unref (priv->material);
|
||||
priv->material = COGL_INVALID_HANDLE;
|
||||
}
|
||||
|
||||
G_OBJECT_CLASS (meta_background_actor_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -163,14 +266,15 @@ meta_background_actor_get_preferred_width (ClutterActor *actor,
|
||||
gfloat *natural_width_p)
|
||||
{
|
||||
MetaBackgroundActor *self = META_BACKGROUND_ACTOR (actor);
|
||||
MetaBackgroundActorPrivate *priv = self->priv;
|
||||
int width, height;
|
||||
|
||||
meta_screen_get_size (self->screen, &width, &height);
|
||||
meta_screen_get_size (priv->background->screen, &width, &height);
|
||||
|
||||
if (min_width_p)
|
||||
*min_width_p = width;
|
||||
if (natural_width_p)
|
||||
*natural_width_p = height;
|
||||
*natural_width_p = width;
|
||||
}
|
||||
|
||||
static void
|
||||
@ -181,9 +285,10 @@ meta_background_actor_get_preferred_height (ClutterActor *actor,
|
||||
|
||||
{
|
||||
MetaBackgroundActor *self = META_BACKGROUND_ACTOR (actor);
|
||||
MetaBackgroundActorPrivate *priv = self->priv;
|
||||
int width, height;
|
||||
|
||||
meta_screen_get_size (self->screen, &width, &height);
|
||||
meta_screen_get_size (priv->background->screen, &width, &height);
|
||||
|
||||
if (min_height_p)
|
||||
*min_height_p = height;
|
||||
@ -195,32 +300,39 @@ static void
|
||||
meta_background_actor_paint (ClutterActor *actor)
|
||||
{
|
||||
MetaBackgroundActor *self = META_BACKGROUND_ACTOR (actor);
|
||||
guchar opacity = clutter_actor_get_paint_opacity (actor);
|
||||
MetaBackgroundActorPrivate *priv = self->priv;
|
||||
guint8 opacity = clutter_actor_get_paint_opacity (actor);
|
||||
guint8 color_component;
|
||||
int width, height;
|
||||
|
||||
meta_screen_get_size (self->screen, &width, &height);
|
||||
meta_screen_get_size (priv->background->screen, &width, &height);
|
||||
|
||||
cogl_material_set_color4ub (self->material,
|
||||
opacity, opacity, opacity, opacity);
|
||||
color_component = (int)(0.5 + opacity * priv->dim_factor);
|
||||
|
||||
cogl_set_source (self->material);
|
||||
cogl_material_set_color4ub (priv->material,
|
||||
color_component,
|
||||
color_component,
|
||||
color_component,
|
||||
opacity);
|
||||
|
||||
if (self->visible_region)
|
||||
cogl_set_source (priv->material);
|
||||
|
||||
if (priv->visible_region)
|
||||
{
|
||||
int n_rectangles = cairo_region_num_rectangles (self->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 (self->visible_region, i, &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 / self->texture_width,
|
||||
rect.y / self->texture_height,
|
||||
(rect.x + rect.width) / self->texture_width,
|
||||
(rect.y + rect.height) / self->texture_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
|
||||
@ -228,85 +340,160 @@ meta_background_actor_paint (ClutterActor *actor)
|
||||
cogl_rectangle_with_texture_coords (0.0f, 0.0f,
|
||||
width, height,
|
||||
0.0f, 0.0f,
|
||||
width / self->texture_width,
|
||||
height / self->texture_height);
|
||||
width / priv->background->texture_width,
|
||||
height / priv->background->texture_height);
|
||||
}
|
||||
}
|
||||
|
||||
#if CLUTTER_CHECK_VERSION(1, 5, 2)
|
||||
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;
|
||||
|
||||
meta_screen_get_size (self->screen, &width, &height);
|
||||
meta_screen_get_size (priv->background->screen, &width, &height);
|
||||
|
||||
clutter_paint_volume_set_width (volume, width);
|
||||
clutter_paint_volume_set_height (volume, height);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
#endif
|
||||
|
||||
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;
|
||||
#if CLUTTER_CHECK_VERSION(1, 5, 2)
|
||||
actor_class->get_paint_volume = meta_background_actor_get_paint_volume;
|
||||
#endif
|
||||
|
||||
/**
|
||||
* 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 *background_actor)
|
||||
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;
|
||||
}
|
||||
|
||||
/**
|
||||
* @screen: the #MetaScreen
|
||||
* meta_background_actor_new:
|
||||
* @screen: the #MetaScreen
|
||||
*
|
||||
* Creates a new actor to draw the background for the given screen.
|
||||
*
|
||||
* Return value: (transfer none): the newly created background actor
|
||||
* Return value: the newly created background actor
|
||||
*/
|
||||
ClutterActor *
|
||||
meta_background_actor_new (MetaScreen *screen)
|
||||
meta_background_actor_new_for_screen (MetaScreen *screen)
|
||||
{
|
||||
MetaBackgroundActor *self;
|
||||
ClutterActor *stage;
|
||||
MetaBackgroundActorPrivate *priv;
|
||||
|
||||
g_return_val_if_fail (META_IS_SCREEN (screen), NULL);
|
||||
|
||||
self = g_object_new (META_TYPE_BACKGROUND_ACTOR, NULL);
|
||||
priv = self->priv;
|
||||
|
||||
self->screen = screen;
|
||||
priv->background = meta_screen_background_get (screen);
|
||||
priv->background->actors = g_slist_prepend (priv->background->actors, self);
|
||||
|
||||
self->material = meta_create_texture_material (NULL);
|
||||
cogl_material_set_layer_wrap_mode (self->material, 0,
|
||||
COGL_MATERIAL_WRAP_MODE_REPEAT);
|
||||
priv->material = meta_create_texture_material (NULL);
|
||||
|
||||
stage = meta_get_stage_for_screen (self->screen);
|
||||
g_signal_connect (stage, "notify::color",
|
||||
G_CALLBACK (on_notify_stage_color), self);
|
||||
|
||||
meta_background_actor_update (self);
|
||||
set_texture_on_actor (self);
|
||||
update_wrap_mode_of_actor (self);
|
||||
|
||||
return CLUTTER_ACTOR (self);
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_background_actor_update:
|
||||
* @self: a #MetaBackgroundActor
|
||||
* @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
|
||||
@ -316,8 +503,9 @@ meta_background_actor_new (MetaScreen *screen)
|
||||
* a PropertyNotify event for the property.
|
||||
*/
|
||||
void
|
||||
meta_background_actor_update (MetaBackgroundActor *self)
|
||||
meta_background_actor_update (MetaScreen *screen)
|
||||
{
|
||||
MetaScreenBackground *background;
|
||||
MetaDisplay *display;
|
||||
MetaCompositor *compositor;
|
||||
Atom type;
|
||||
@ -327,14 +515,13 @@ meta_background_actor_update (MetaBackgroundActor *self)
|
||||
guchar *data;
|
||||
Pixmap root_pixmap_id;
|
||||
|
||||
g_return_if_fail (META_IS_BACKGROUND_ACTOR (self));
|
||||
|
||||
display = meta_screen_get_display (self->screen);
|
||||
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 (self->screen),
|
||||
meta_screen_get_xroot (screen),
|
||||
compositor->atom_x_root_pixmap,
|
||||
0, LONG_MAX,
|
||||
False,
|
||||
@ -355,23 +542,31 @@ meta_background_actor_update (MetaBackgroundActor *self)
|
||||
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 (root_pixmap_id, FALSE);
|
||||
texture = cogl_texture_pixmap_x11_new (ctx, root_pixmap_id, FALSE, &error);
|
||||
meta_error_trap_pop (display);
|
||||
|
||||
if (texture != COGL_INVALID_HANDLE)
|
||||
{
|
||||
set_texture (self, texture);
|
||||
set_texture (background, texture);
|
||||
cogl_handle_unref (texture);
|
||||
|
||||
self->have_pixmap = True;
|
||||
background->have_pixmap = True;
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
g_warning ("Failed to create background texture from pixmap: %s",
|
||||
error->message);
|
||||
g_error_free (error);
|
||||
}
|
||||
}
|
||||
|
||||
self->have_pixmap = False;
|
||||
set_texture_to_stage_color (self);
|
||||
background->have_pixmap = False;
|
||||
set_texture_to_stage_color (background);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -387,37 +582,46 @@ void
|
||||
meta_background_actor_set_visible_region (MetaBackgroundActor *self,
|
||||
cairo_region_t *visible_region)
|
||||
{
|
||||
MetaBackgroundActorPrivate *priv;
|
||||
|
||||
g_return_if_fail (META_IS_BACKGROUND_ACTOR (self));
|
||||
|
||||
if (self->visible_region)
|
||||
priv = self->priv;
|
||||
|
||||
if (priv->visible_region)
|
||||
{
|
||||
cairo_region_destroy (self->visible_region);
|
||||
self->visible_region = NULL;
|
||||
cairo_region_destroy (priv->visible_region);
|
||||
priv->visible_region = NULL;
|
||||
}
|
||||
|
||||
if (visible_region)
|
||||
{
|
||||
cairo_rectangle_int_t screen_rect = { 0 };
|
||||
meta_screen_get_size (self->screen, &screen_rect.width, &screen_rect.height);
|
||||
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.
|
||||
*/
|
||||
self->visible_region = cairo_region_create_rectangle (&screen_rect);
|
||||
cairo_region_intersect (self->visible_region, visible_region);
|
||||
priv->visible_region = cairo_region_create_rectangle (&screen_rect);
|
||||
cairo_region_intersect (priv->visible_region, visible_region);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_background_actor_screen_size_changed:
|
||||
* @self: a #MetaBackgroundActor
|
||||
* @screen: a #MetaScreen
|
||||
*
|
||||
* Called by the compositor when the size of the #MetaScreen changes
|
||||
*/
|
||||
void
|
||||
meta_background_actor_screen_size_changed (MetaBackgroundActor *self)
|
||||
meta_background_actor_screen_size_changed (MetaScreen *screen)
|
||||
{
|
||||
update_wrap_mode (self);
|
||||
clutter_actor_queue_relayout (CLUTTER_ACTOR (self));
|
||||
MetaScreenBackground *background = meta_screen_background_get (screen);
|
||||
GSList *l;
|
||||
|
||||
update_wrap_mode (background);
|
||||
|
||||
for (l = background->actors; l; l = l->next)
|
||||
clutter_actor_queue_relayout (l->data);
|
||||
}
|
||||
|
@ -35,34 +35,32 @@
|
||||
|
||||
#include <clutter/x11/clutter-x11.h>
|
||||
|
||||
static GSList *plugin_types;
|
||||
|
||||
/*
|
||||
* We have one "default plugin manager" that acts for the first screen,
|
||||
* but also can be used before we open any screens, and additional
|
||||
* plugin managers for each screen. (This is ugly. Probably we should
|
||||
* have one plugin manager and only make the plugins per-screen.)
|
||||
*/
|
||||
static MetaPluginManager *default_plugin_manager;
|
||||
static GType plugin_type = G_TYPE_NONE;
|
||||
|
||||
struct MetaPluginManager
|
||||
{
|
||||
MetaScreen *screen;
|
||||
|
||||
GList /* MetaPlugin */ *plugins; /* TODO -- maybe use hash table */
|
||||
MetaScreen *screen;
|
||||
MetaPlugin *plugin;
|
||||
};
|
||||
|
||||
void
|
||||
meta_plugin_manager_set_plugin_type (GType gtype)
|
||||
{
|
||||
if (plugin_type != G_TYPE_NONE)
|
||||
meta_fatal ("Mutter plugin already set: %s", g_type_name (plugin_type));
|
||||
|
||||
plugin_type = gtype;
|
||||
}
|
||||
|
||||
/*
|
||||
* Loads the given plugin.
|
||||
*/
|
||||
void
|
||||
meta_plugin_manager_load (MetaPluginManager *plugin_mgr,
|
||||
const gchar *plugin_name)
|
||||
meta_plugin_manager_load (const gchar *plugin_name)
|
||||
{
|
||||
const gchar *dpath = MUTTER_PLUGIN_DIR "/";
|
||||
gchar *path;
|
||||
MetaModule *module;
|
||||
GType plugin_type;
|
||||
|
||||
if (g_path_is_absolute (plugin_name))
|
||||
path = g_strdup (plugin_name);
|
||||
@ -81,162 +79,57 @@ meta_plugin_manager_load (MetaPluginManager *plugin_mgr,
|
||||
exit (1);
|
||||
}
|
||||
|
||||
plugin_type = meta_module_get_plugin_type (module);
|
||||
meta_plugin_manager_register (plugin_mgr, plugin_type);
|
||||
meta_plugin_manager_set_plugin_type (meta_module_get_plugin_type (module));
|
||||
|
||||
g_type_module_unuse (G_TYPE_MODULE (module));
|
||||
g_free (path);
|
||||
}
|
||||
|
||||
/*
|
||||
* Registers the given plugin type
|
||||
*/
|
||||
void
|
||||
meta_plugin_manager_register (MetaPluginManager *plugin_mgr,
|
||||
GType plugin_type)
|
||||
{
|
||||
MetaPlugin *plugin;
|
||||
|
||||
plugin_types = g_slist_prepend (plugin_types, GSIZE_TO_POINTER (plugin_type));
|
||||
|
||||
plugin = g_object_new (plugin_type, NULL);
|
||||
plugin_mgr->plugins = g_list_prepend (plugin_mgr->plugins, plugin);
|
||||
}
|
||||
|
||||
void
|
||||
meta_plugin_manager_initialize (MetaPluginManager *plugin_mgr)
|
||||
{
|
||||
GList *iter;
|
||||
|
||||
if (!plugin_mgr->plugins)
|
||||
{
|
||||
/*
|
||||
* If no plugins are specified, load the default plugin.
|
||||
*/
|
||||
meta_plugin_manager_load (plugin_mgr, "default");
|
||||
}
|
||||
|
||||
for (iter = plugin_mgr->plugins; iter; iter = iter->next)
|
||||
{
|
||||
MetaPlugin *plugin = (MetaPlugin*) iter->data;
|
||||
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin);
|
||||
|
||||
g_object_set (plugin,
|
||||
"screen", plugin_mgr->screen,
|
||||
NULL);
|
||||
|
||||
if (klass->start)
|
||||
klass->start (plugin);
|
||||
}
|
||||
}
|
||||
|
||||
static MetaPluginManager *
|
||||
MetaPluginManager *
|
||||
meta_plugin_manager_new (MetaScreen *screen)
|
||||
{
|
||||
MetaPluginManager *plugin_mgr;
|
||||
MetaPluginClass *klass;
|
||||
MetaPlugin *plugin;
|
||||
|
||||
plugin_mgr = g_new0 (MetaPluginManager, 1);
|
||||
plugin_mgr->screen = screen;
|
||||
plugin_mgr->plugin = plugin = g_object_new (plugin_type, "screen", screen, NULL);
|
||||
|
||||
if (screen)
|
||||
g_object_set_data (G_OBJECT (screen), "meta-plugin-manager", plugin_mgr);
|
||||
klass = META_PLUGIN_GET_CLASS (plugin);
|
||||
|
||||
if (klass->start)
|
||||
klass->start (plugin);
|
||||
|
||||
return plugin_mgr;
|
||||
}
|
||||
|
||||
MetaPluginManager *
|
||||
meta_plugin_manager_get_default (void)
|
||||
{
|
||||
if (!default_plugin_manager)
|
||||
{
|
||||
default_plugin_manager = meta_plugin_manager_new (NULL);
|
||||
}
|
||||
|
||||
return default_plugin_manager;
|
||||
}
|
||||
|
||||
MetaPluginManager *
|
||||
meta_plugin_manager_get (MetaScreen *screen)
|
||||
{
|
||||
MetaPluginManager *plugin_mgr;
|
||||
|
||||
plugin_mgr = g_object_get_data (G_OBJECT (screen), "meta-plugin-manager");
|
||||
if (plugin_mgr)
|
||||
return plugin_mgr;
|
||||
|
||||
if (!default_plugin_manager)
|
||||
meta_plugin_manager_get_default ();
|
||||
|
||||
if (!default_plugin_manager->screen)
|
||||
{
|
||||
/* The default plugin manager is so far unused, we can recycle it */
|
||||
default_plugin_manager->screen = screen;
|
||||
g_object_set_data (G_OBJECT (screen), "meta-plugin-manager", default_plugin_manager);
|
||||
|
||||
return default_plugin_manager;
|
||||
}
|
||||
else
|
||||
{
|
||||
GSList *iter;
|
||||
GType plugin_type;
|
||||
MetaPlugin *plugin;
|
||||
|
||||
plugin_mgr = meta_plugin_manager_new (screen);
|
||||
|
||||
for (iter = plugin_types; iter; iter = iter->next)
|
||||
{
|
||||
plugin_type = (GType)GPOINTER_TO_SIZE (iter->data);
|
||||
plugin = g_object_new (plugin_type, "screen", screen, NULL);
|
||||
plugin_mgr->plugins = g_list_prepend (plugin_mgr->plugins, plugin);
|
||||
}
|
||||
|
||||
return plugin_mgr;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
meta_plugin_manager_kill_window_effects (MetaPluginManager *plugin_mgr,
|
||||
MetaWindowActor *actor)
|
||||
{
|
||||
GList *l = plugin_mgr->plugins;
|
||||
MetaPlugin *plugin = plugin_mgr->plugin;
|
||||
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin);
|
||||
|
||||
while (l)
|
||||
{
|
||||
MetaPlugin *plugin = l->data;
|
||||
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin);
|
||||
|
||||
if (!meta_plugin_disabled (plugin)
|
||||
&& klass->kill_window_effects)
|
||||
klass->kill_window_effects (plugin, actor);
|
||||
|
||||
l = l->next;
|
||||
}
|
||||
if (klass->kill_window_effects)
|
||||
klass->kill_window_effects (plugin, actor);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_plugin_manager_kill_switch_workspace (MetaPluginManager *plugin_mgr)
|
||||
{
|
||||
GList *l = plugin_mgr->plugins;
|
||||
MetaPlugin *plugin = plugin_mgr->plugin;
|
||||
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin);
|
||||
|
||||
while (l)
|
||||
{
|
||||
MetaPlugin *plugin = l->data;
|
||||
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin);
|
||||
|
||||
if (!meta_plugin_disabled (plugin)
|
||||
&& (meta_plugin_features (plugin) & META_PLUGIN_SWITCH_WORKSPACE)
|
||||
&& klass->kill_switch_workspace)
|
||||
klass->kill_switch_workspace (plugin);
|
||||
|
||||
l = l->next;
|
||||
}
|
||||
if (klass->kill_switch_workspace)
|
||||
klass->kill_switch_workspace (plugin);
|
||||
}
|
||||
|
||||
/*
|
||||
* Public method that the compositor hooks into for events that require
|
||||
* no additional parameters.
|
||||
*
|
||||
* Returns TRUE if at least one of the plugins handled the event type (i.e.,
|
||||
* 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.
|
||||
@ -246,60 +139,48 @@ meta_plugin_manager_event_simple (MetaPluginManager *plugin_mgr,
|
||||
MetaWindowActor *actor,
|
||||
unsigned long event)
|
||||
{
|
||||
GList *l = plugin_mgr->plugins;
|
||||
gboolean retval = FALSE;
|
||||
MetaPlugin *plugin = plugin_mgr->plugin;
|
||||
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin);
|
||||
MetaDisplay *display = meta_screen_get_display (plugin_mgr->screen);
|
||||
gboolean retval = FALSE;
|
||||
|
||||
if (display->display_opening)
|
||||
return FALSE;
|
||||
|
||||
while (l)
|
||||
switch (event)
|
||||
{
|
||||
MetaPlugin *plugin = l->data;
|
||||
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin);
|
||||
|
||||
if (!meta_plugin_disabled (plugin) &&
|
||||
(meta_plugin_features (plugin) & event))
|
||||
case META_PLUGIN_MINIMIZE:
|
||||
if (klass->minimize)
|
||||
{
|
||||
retval = TRUE;
|
||||
meta_plugin_manager_kill_window_effects (plugin_mgr,
|
||||
actor);
|
||||
|
||||
switch (event)
|
||||
{
|
||||
case META_PLUGIN_MINIMIZE:
|
||||
if (klass->minimize)
|
||||
{
|
||||
meta_plugin_manager_kill_window_effects (
|
||||
plugin_mgr,
|
||||
actor);
|
||||
|
||||
_meta_plugin_effect_started (plugin);
|
||||
klass->minimize (plugin, actor);
|
||||
}
|
||||
break;
|
||||
case META_PLUGIN_MAP:
|
||||
if (klass->map)
|
||||
{
|
||||
meta_plugin_manager_kill_window_effects (
|
||||
plugin_mgr,
|
||||
actor);
|
||||
|
||||
_meta_plugin_effect_started (plugin);
|
||||
klass->map (plugin, actor);
|
||||
}
|
||||
break;
|
||||
case META_PLUGIN_DESTROY:
|
||||
if (klass->destroy)
|
||||
{
|
||||
_meta_plugin_effect_started (plugin);
|
||||
klass->destroy (plugin, actor);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
g_warning ("Incorrect handler called for event %lu", event);
|
||||
}
|
||||
_meta_plugin_effect_started (plugin);
|
||||
klass->minimize (plugin, actor);
|
||||
}
|
||||
break;
|
||||
case META_PLUGIN_MAP:
|
||||
if (klass->map)
|
||||
{
|
||||
retval = TRUE;
|
||||
meta_plugin_manager_kill_window_effects (plugin_mgr,
|
||||
actor);
|
||||
|
||||
l = l->next;
|
||||
_meta_plugin_effect_started (plugin);
|
||||
klass->map (plugin, actor);
|
||||
}
|
||||
break;
|
||||
case META_PLUGIN_DESTROY:
|
||||
if (klass->destroy)
|
||||
{
|
||||
retval = TRUE;
|
||||
_meta_plugin_effect_started (plugin);
|
||||
klass->destroy (plugin, actor);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
g_warning ("Incorrect handler called for event %lu", event);
|
||||
}
|
||||
|
||||
return retval;
|
||||
@ -309,7 +190,7 @@ meta_plugin_manager_event_simple (MetaPluginManager *plugin_mgr,
|
||||
* The public method that the compositor hooks into for maximize and unmaximize
|
||||
* events.
|
||||
*
|
||||
* Returns TRUE if at least one of the plugins handled the event type (i.e.,
|
||||
* 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.
|
||||
@ -323,57 +204,44 @@ meta_plugin_manager_event_maximize (MetaPluginManager *plugin_mgr,
|
||||
gint target_width,
|
||||
gint target_height)
|
||||
{
|
||||
GList *l = plugin_mgr->plugins;
|
||||
MetaPlugin *plugin = plugin_mgr->plugin;
|
||||
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin);
|
||||
MetaDisplay *display = meta_screen_get_display (plugin_mgr->screen);
|
||||
gboolean retval = FALSE;
|
||||
MetaDisplay *display = meta_screen_get_display (plugin_mgr->screen);
|
||||
|
||||
if (display->display_opening)
|
||||
return FALSE;
|
||||
|
||||
while (l)
|
||||
switch (event)
|
||||
{
|
||||
MetaPlugin *plugin = l->data;
|
||||
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin);
|
||||
|
||||
if (!meta_plugin_disabled (plugin) &&
|
||||
(meta_plugin_features (plugin) & event))
|
||||
case META_PLUGIN_MAXIMIZE:
|
||||
if (klass->maximize)
|
||||
{
|
||||
retval = TRUE;
|
||||
meta_plugin_manager_kill_window_effects (plugin_mgr,
|
||||
actor);
|
||||
|
||||
switch (event)
|
||||
{
|
||||
case META_PLUGIN_MAXIMIZE:
|
||||
if (klass->maximize)
|
||||
{
|
||||
meta_plugin_manager_kill_window_effects (
|
||||
plugin_mgr,
|
||||
actor);
|
||||
|
||||
_meta_plugin_effect_started (plugin);
|
||||
klass->maximize (plugin, actor,
|
||||
target_x, target_y,
|
||||
target_width, target_height);
|
||||
}
|
||||
break;
|
||||
case META_PLUGIN_UNMAXIMIZE:
|
||||
if (klass->unmaximize)
|
||||
{
|
||||
meta_plugin_manager_kill_window_effects (
|
||||
plugin_mgr,
|
||||
actor);
|
||||
|
||||
_meta_plugin_effect_started (plugin);
|
||||
klass->unmaximize (plugin, actor,
|
||||
target_x, target_y,
|
||||
target_width, target_height);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
g_warning ("Incorrect handler called for event %lu", event);
|
||||
}
|
||||
_meta_plugin_effect_started (plugin);
|
||||
klass->maximize (plugin, actor,
|
||||
target_x, target_y,
|
||||
target_width, target_height);
|
||||
}
|
||||
break;
|
||||
case META_PLUGIN_UNMAXIMIZE:
|
||||
if (klass->unmaximize)
|
||||
{
|
||||
retval = TRUE;
|
||||
meta_plugin_manager_kill_window_effects (plugin_mgr,
|
||||
actor);
|
||||
|
||||
l = l->next;
|
||||
_meta_plugin_effect_started (plugin);
|
||||
klass->unmaximize (plugin, actor,
|
||||
target_x, target_y,
|
||||
target_width, target_height);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
g_warning ("Incorrect handler called for event %lu", event);
|
||||
}
|
||||
|
||||
return retval;
|
||||
@ -382,7 +250,7 @@ meta_plugin_manager_event_maximize (MetaPluginManager *plugin_mgr,
|
||||
/*
|
||||
* The public method that the compositor hooks into for desktop switching.
|
||||
*
|
||||
* Returns TRUE if at least one of the plugins handled the event type (i.e.,
|
||||
* 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.
|
||||
@ -393,32 +261,21 @@ meta_plugin_manager_switch_workspace (MetaPluginManager *plugin_mgr,
|
||||
gint to,
|
||||
MetaMotionDirection direction)
|
||||
{
|
||||
GList *l = plugin_mgr->plugins;
|
||||
MetaPlugin *plugin = plugin_mgr->plugin;
|
||||
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin);
|
||||
MetaDisplay *display = meta_screen_get_display (plugin_mgr->screen);
|
||||
gboolean retval = FALSE;
|
||||
MetaDisplay *display = meta_screen_get_display (plugin_mgr->screen);
|
||||
|
||||
if (display->display_opening)
|
||||
return FALSE;
|
||||
|
||||
while (l)
|
||||
if (klass->switch_workspace)
|
||||
{
|
||||
MetaPlugin *plugin = l->data;
|
||||
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin);
|
||||
retval = TRUE;
|
||||
meta_plugin_manager_kill_switch_workspace (plugin_mgr);
|
||||
|
||||
if (!meta_plugin_disabled (plugin) &&
|
||||
(meta_plugin_features (plugin) & META_PLUGIN_SWITCH_WORKSPACE))
|
||||
{
|
||||
if (klass->switch_workspace)
|
||||
{
|
||||
retval = TRUE;
|
||||
meta_plugin_manager_kill_switch_workspace (plugin_mgr);
|
||||
|
||||
_meta_plugin_effect_started (plugin);
|
||||
klass->switch_workspace (plugin, from, to, direction);
|
||||
}
|
||||
}
|
||||
|
||||
l = l->next;
|
||||
_meta_plugin_effect_started (plugin);
|
||||
klass->switch_workspace (plugin, from, to, direction);
|
||||
}
|
||||
|
||||
return retval;
|
||||
@ -427,7 +284,7 @@ meta_plugin_manager_switch_workspace (MetaPluginManager *plugin_mgr,
|
||||
/*
|
||||
* The public method that the compositor hooks into for desktop switching.
|
||||
*
|
||||
* Returns TRUE if at least one of the plugins handled the event type (i.e.,
|
||||
* 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.
|
||||
@ -436,49 +293,20 @@ gboolean
|
||||
meta_plugin_manager_xevent_filter (MetaPluginManager *plugin_mgr,
|
||||
XEvent *xev)
|
||||
{
|
||||
GList *l;
|
||||
gboolean have_plugin_xevent_func;
|
||||
MetaPlugin *plugin = plugin_mgr->plugin;
|
||||
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin);
|
||||
|
||||
if (!plugin_mgr)
|
||||
return FALSE;
|
||||
|
||||
l = plugin_mgr->plugins;
|
||||
|
||||
/* 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.
|
||||
*
|
||||
* What happens if there are two plugins with xevent_filter functions
|
||||
* is undefined; in general, multiple competing plugins are something
|
||||
* we don't support well or care much about.
|
||||
*
|
||||
* FIXME: Really, we should just always handle sending the event to
|
||||
* clutter if a plugin doesn't report the event as handled by
|
||||
* returning TRUE, but it doesn't seem worth breaking compatibility
|
||||
* of the plugin interface right now to achieve this; the way it is
|
||||
* now works fine in practice.
|
||||
*/
|
||||
have_plugin_xevent_func = FALSE;
|
||||
|
||||
while (l)
|
||||
{
|
||||
MetaPlugin *plugin = l->data;
|
||||
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin);
|
||||
|
||||
if (klass->xevent_filter)
|
||||
{
|
||||
have_plugin_xevent_func = TRUE;
|
||||
if (klass->xevent_filter (plugin, xev) == TRUE)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
l = l->next;
|
||||
}
|
||||
|
||||
if (!have_plugin_xevent_func)
|
||||
if (klass->xevent_filter && klass->xevent_filter (plugin, xev))
|
||||
return TRUE;
|
||||
else
|
||||
return clutter_x11_handle_event (xev) != CLUTTER_X11_FILTER_CONTINUE;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
@ -46,14 +46,9 @@
|
||||
*/
|
||||
typedef struct MetaPluginManager MetaPluginManager;
|
||||
|
||||
MetaPluginManager * meta_plugin_manager_get (MetaScreen *screen);
|
||||
MetaPluginManager * meta_plugin_manager_get_default (void);
|
||||
MetaPluginManager * meta_plugin_manager_new (MetaScreen *screen);
|
||||
|
||||
void meta_plugin_manager_load (MetaPluginManager *mgr,
|
||||
const gchar *plugin_name);
|
||||
void meta_plugin_manager_register (MetaPluginManager *mgr,
|
||||
GType plugin_type);
|
||||
void meta_plugin_manager_initialize (MetaPluginManager *mgr);
|
||||
void meta_plugin_manager_load (const gchar *plugin_name);
|
||||
|
||||
gboolean meta_plugin_manager_event_simple (MetaPluginManager *mgr,
|
||||
MetaWindowActor *actor,
|
||||
@ -66,10 +61,6 @@ gboolean meta_plugin_manager_event_maximize (MetaPluginManager *mgr,
|
||||
gint target_y,
|
||||
gint target_width,
|
||||
gint target_height);
|
||||
void meta_plugin_manager_update_workspaces (MetaPluginManager *mgr);
|
||||
|
||||
void meta_plugin_manager_update_workspace (MetaPluginManager *mgr,
|
||||
MetaWorkspace *w);
|
||||
|
||||
gboolean meta_plugin_manager_switch_workspace (MetaPluginManager *mgr,
|
||||
gint from,
|
||||
|
@ -44,74 +44,17 @@ enum
|
||||
{
|
||||
PROP_0,
|
||||
PROP_SCREEN,
|
||||
PROP_FEATURES,
|
||||
PROP_DISABLED,
|
||||
PROP_DEBUG_MODE,
|
||||
};
|
||||
|
||||
struct _MetaPluginPrivate
|
||||
{
|
||||
MetaScreen *screen;
|
||||
gulong features;
|
||||
|
||||
gint running;
|
||||
|
||||
gboolean disabled : 1;
|
||||
gboolean debug : 1;
|
||||
};
|
||||
|
||||
static void
|
||||
meta_plugin_set_features (MetaPlugin *plugin)
|
||||
{
|
||||
MetaPluginPrivate *priv = plugin->priv;
|
||||
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin);
|
||||
|
||||
priv->features = 0;
|
||||
|
||||
/*
|
||||
* Feature flags: identify events that the plugin can handle; a plugin can
|
||||
* handle one or more events.
|
||||
*/
|
||||
if (klass->minimize)
|
||||
priv->features |= META_PLUGIN_MINIMIZE;
|
||||
|
||||
if (klass->maximize)
|
||||
priv->features |= META_PLUGIN_MAXIMIZE;
|
||||
|
||||
if (klass->unmaximize)
|
||||
priv->features |= META_PLUGIN_UNMAXIMIZE;
|
||||
|
||||
if (klass->map)
|
||||
priv->features |= META_PLUGIN_MAP;
|
||||
|
||||
if (klass->destroy)
|
||||
priv->features |= META_PLUGIN_DESTROY;
|
||||
|
||||
if (klass->switch_workspace)
|
||||
priv->features |= META_PLUGIN_SWITCH_WORKSPACE;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_plugin_constructed (GObject *object)
|
||||
{
|
||||
meta_plugin_set_features (META_PLUGIN (object));
|
||||
|
||||
if (G_OBJECT_CLASS (meta_plugin_parent_class)->constructed)
|
||||
G_OBJECT_CLASS (meta_plugin_parent_class)->constructed (object);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_plugin_dispose (GObject *object)
|
||||
{
|
||||
G_OBJECT_CLASS (meta_plugin_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_plugin_finalize (GObject *object)
|
||||
{
|
||||
G_OBJECT_CLASS (meta_plugin_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_plugin_set_property (GObject *object,
|
||||
guint prop_id,
|
||||
@ -125,9 +68,6 @@ meta_plugin_set_property (GObject *object,
|
||||
case PROP_SCREEN:
|
||||
priv->screen = g_value_get_object (value);
|
||||
break;
|
||||
case PROP_DISABLED:
|
||||
priv->disabled = g_value_get_boolean (value);
|
||||
break;
|
||||
case PROP_DEBUG_MODE:
|
||||
priv->debug = g_value_get_boolean (value);
|
||||
break;
|
||||
@ -150,15 +90,9 @@ meta_plugin_get_property (GObject *object,
|
||||
case PROP_SCREEN:
|
||||
g_value_set_object (value, priv->screen);
|
||||
break;
|
||||
case PROP_DISABLED:
|
||||
g_value_set_boolean (value, priv->disabled);
|
||||
break;
|
||||
case PROP_DEBUG_MODE:
|
||||
g_value_set_boolean (value, priv->debug);
|
||||
break;
|
||||
case PROP_FEATURES:
|
||||
g_value_set_ulong (value, priv->features);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
@ -171,9 +105,6 @@ meta_plugin_class_init (MetaPluginClass *klass)
|
||||
{
|
||||
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||
|
||||
gobject_class->constructed = meta_plugin_constructed;
|
||||
gobject_class->finalize = meta_plugin_finalize;
|
||||
gobject_class->dispose = meta_plugin_dispose;
|
||||
gobject_class->set_property = meta_plugin_set_property;
|
||||
gobject_class->get_property = meta_plugin_get_property;
|
||||
|
||||
@ -185,22 +116,6 @@ meta_plugin_class_init (MetaPluginClass *klass)
|
||||
META_TYPE_SCREEN,
|
||||
G_PARAM_READWRITE));
|
||||
|
||||
g_object_class_install_property (gobject_class,
|
||||
PROP_FEATURES,
|
||||
g_param_spec_ulong ("features",
|
||||
"Features",
|
||||
"Plugin Features",
|
||||
0 , G_MAXULONG, 0,
|
||||
G_PARAM_READABLE));
|
||||
|
||||
g_object_class_install_property (gobject_class,
|
||||
PROP_DISABLED,
|
||||
g_param_spec_boolean ("disabled",
|
||||
"Plugin disabled",
|
||||
"Plugin disabled",
|
||||
FALSE,
|
||||
G_PARAM_READWRITE));
|
||||
|
||||
g_object_class_install_property (gobject_class,
|
||||
PROP_DEBUG_MODE,
|
||||
g_param_spec_boolean ("debug-mode",
|
||||
@ -220,22 +135,6 @@ meta_plugin_init (MetaPlugin *self)
|
||||
self->priv = priv = META_PLUGIN_GET_PRIVATE (self);
|
||||
}
|
||||
|
||||
gulong
|
||||
meta_plugin_features (MetaPlugin *plugin)
|
||||
{
|
||||
MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
|
||||
|
||||
return priv->features;
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_plugin_disabled (MetaPlugin *plugin)
|
||||
{
|
||||
MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
|
||||
|
||||
return priv->disabled;
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_plugin_running (MetaPlugin *plugin)
|
||||
{
|
||||
@ -263,38 +162,6 @@ meta_plugin_get_info (MetaPlugin *plugin)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ClutterActor *
|
||||
meta_plugin_get_overlay_group (MetaPlugin *plugin)
|
||||
{
|
||||
MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
|
||||
|
||||
return meta_get_overlay_group_for_screen (priv->screen);
|
||||
}
|
||||
|
||||
ClutterActor *
|
||||
meta_plugin_get_stage (MetaPlugin *plugin)
|
||||
{
|
||||
MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
|
||||
|
||||
return meta_get_stage_for_screen (priv->screen);
|
||||
}
|
||||
|
||||
ClutterActor *
|
||||
meta_plugin_get_window_group (MetaPlugin *plugin)
|
||||
{
|
||||
MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
|
||||
|
||||
return meta_get_window_group_for_screen (priv->screen);
|
||||
}
|
||||
|
||||
ClutterActor *
|
||||
meta_plugin_get_background_actor (MetaPlugin *plugin)
|
||||
{
|
||||
MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
|
||||
|
||||
return meta_get_background_actor_for_screen (priv->screen);
|
||||
}
|
||||
|
||||
/**
|
||||
* _meta_plugin_effect_started:
|
||||
* @plugin: the plugin
|
||||
@ -315,7 +182,7 @@ meta_plugin_switch_workspace_completed (MetaPlugin *plugin)
|
||||
{
|
||||
MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
|
||||
|
||||
MetaScreen *screen = meta_plugin_get_screen (plugin);
|
||||
MetaScreen *screen = priv->screen;
|
||||
|
||||
if (priv->running-- < 0)
|
||||
{
|
||||
@ -389,80 +256,6 @@ meta_plugin_destroy_completed (MetaPlugin *plugin,
|
||||
meta_plugin_window_effect_completed (plugin, actor, META_PLUGIN_DESTROY);
|
||||
}
|
||||
|
||||
void
|
||||
meta_plugin_query_screen_size (MetaPlugin *plugin,
|
||||
int *width,
|
||||
int *height)
|
||||
{
|
||||
MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
|
||||
|
||||
meta_screen_get_size (priv->screen, width, height);
|
||||
}
|
||||
|
||||
void
|
||||
meta_plugin_set_stage_reactive (MetaPlugin *plugin,
|
||||
gboolean reactive)
|
||||
{
|
||||
MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
|
||||
MetaScreen *screen = priv->screen;
|
||||
|
||||
if (reactive)
|
||||
meta_set_stage_input_region (screen, None);
|
||||
else
|
||||
meta_empty_stage_input_region (screen);
|
||||
}
|
||||
|
||||
void
|
||||
meta_plugin_set_stage_input_area (MetaPlugin *plugin,
|
||||
gint x, gint y, gint width, gint height)
|
||||
{
|
||||
MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
|
||||
MetaScreen *screen = priv->screen;
|
||||
MetaDisplay *display = meta_screen_get_display (screen);
|
||||
Display *xdpy = meta_display_get_xdisplay (display);
|
||||
XRectangle rect;
|
||||
XserverRegion region;
|
||||
|
||||
rect.x = x;
|
||||
rect.y = y;
|
||||
rect.width = width;
|
||||
rect.height = height;
|
||||
|
||||
region = XFixesCreateRegion (xdpy, &rect, 1);
|
||||
meta_set_stage_input_region (screen, region);
|
||||
XFixesDestroyRegion (xdpy, region);
|
||||
}
|
||||
|
||||
void
|
||||
meta_plugin_set_stage_input_region (MetaPlugin *plugin,
|
||||
XserverRegion region)
|
||||
{
|
||||
MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
|
||||
MetaScreen *screen = priv->screen;
|
||||
|
||||
meta_set_stage_input_region (screen, region);
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_plugin_get_window_actors:
|
||||
* @plugin: A #MetaPlugin
|
||||
*
|
||||
* This function returns all of the #MetaWindowActor objects referenced by Mutter, including
|
||||
* override-redirect windows. The returned list is a snapshot of Mutter's current
|
||||
* stacking order, with the topmost window last.
|
||||
*
|
||||
* The 'restacked' signal of #MetaScreen signals when this value has changed.
|
||||
*
|
||||
* Returns: (transfer none) (element-type MetaWindowActor): Windows in stacking order, topmost last
|
||||
*/
|
||||
GList *
|
||||
meta_plugin_get_window_actors (MetaPlugin *plugin)
|
||||
{
|
||||
MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
|
||||
|
||||
return meta_get_window_actors (priv->screen);
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_plugin_begin_modal:
|
||||
* @plugin: a #MetaPlugin
|
||||
@ -502,7 +295,7 @@ meta_plugin_begin_modal (MetaPlugin *plugin,
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_plugin_end_modal
|
||||
* meta_plugin_end_modal:
|
||||
* @plugin: a #MetaPlugin
|
||||
* @timestamp: the time used for releasing grabs
|
||||
*
|
||||
@ -521,16 +314,6 @@ meta_plugin_end_modal (MetaPlugin *plugin,
|
||||
meta_end_modal_for_plugin (priv->screen, plugin, timestamp);
|
||||
}
|
||||
|
||||
Display *
|
||||
meta_plugin_get_xdisplay (MetaPlugin *plugin)
|
||||
{
|
||||
MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
|
||||
MetaDisplay *display = meta_screen_get_display (priv->screen);
|
||||
Display *xdpy = meta_display_get_xdisplay (display);
|
||||
|
||||
return xdpy;
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_plugin_get_screen:
|
||||
* @plugin: a #MetaPlugin
|
||||
@ -548,19 +331,3 @@ meta_plugin_get_screen (MetaPlugin *plugin)
|
||||
|
||||
return priv->screen;
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_plugin_type_register:
|
||||
* @plugin_type: a #MetaPlugin type
|
||||
*
|
||||
* Register @plugin_type as a compositor plugin type to be used.
|
||||
* You must call this before calling meta_init().
|
||||
*/
|
||||
void
|
||||
meta_plugin_type_register (GType plugin_type)
|
||||
{
|
||||
MetaPluginManager *plugin_manager;
|
||||
|
||||
plugin_manager = meta_plugin_manager_get_default ();
|
||||
meta_plugin_manager_register (plugin_manager, plugin_type);
|
||||
}
|
||||
|
@ -130,7 +130,7 @@ MetaShadowClassInfo default_shadow_classes[] = {
|
||||
{ "popup-menu", { 1, -1, 0, 1, 128 }, { 1, -1, 0, 1, 128 } },
|
||||
|
||||
{ "dropdown-menu", { 1, 10, 0, 1, 128 }, { 1, 10, 0, 1, 128 } },
|
||||
{ "attached", { 2, 50, 0, 1, 255 }, { 1, 50, 0, 1, 128 } }
|
||||
{ "attached", { 1, -1, 0, 1, 128 }, { 1, -1, 0, 1, 128 } }
|
||||
};
|
||||
|
||||
G_DEFINE_TYPE (MetaShadowFactory, meta_shadow_factory, G_TYPE_OBJECT);
|
||||
@ -360,7 +360,7 @@ meta_shadow_paint (MetaShadow *shadow,
|
||||
* @window_height: actual height of the region to paint a shadow for
|
||||
*
|
||||
* Computes the bounds of the pixels that will be affected by
|
||||
* meta_shadow_paints()
|
||||
* meta_shadow_paint()
|
||||
*/
|
||||
void
|
||||
meta_shadow_get_bounds (MetaShadow *shadow,
|
||||
@ -442,8 +442,7 @@ meta_shadow_factory_class_init (MetaShadowFactoryClass *klass)
|
||||
G_TYPE_FROM_CLASS (object_class),
|
||||
G_SIGNAL_RUN_LAST,
|
||||
0,
|
||||
NULL, NULL,
|
||||
g_cclosure_marshal_VOID__VOID,
|
||||
NULL, NULL, NULL,
|
||||
G_TYPE_NONE, 0);
|
||||
}
|
||||
|
||||
|
@ -1,11 +1,13 @@
|
||||
/*
|
||||
* shaped texture
|
||||
*
|
||||
* An actor to draw a texture clipped to a list of rectangles
|
||||
* An actor to draw a masked texture.
|
||||
*
|
||||
* Authored By Neil Roberts <neil@linux.intel.com>
|
||||
* and Jasper St. Pierre <jstpierre@mecheye.net>
|
||||
*
|
||||
* Copyright (C) 2008 Intel Corporation
|
||||
* Copyright (C) 2012 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
|
||||
@ -25,37 +27,37 @@
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#include "meta-shaped-texture.h"
|
||||
#define CLUTTER_ENABLE_EXPERIMENTAL_API
|
||||
#define COGL_ENABLE_EXPERIMENTAL_API
|
||||
|
||||
#include <meta/meta-shaped-texture.h>
|
||||
#include "meta-texture-tower.h"
|
||||
|
||||
#include <clutter/clutter.h>
|
||||
#include <cogl/cogl.h>
|
||||
#include <string.h>
|
||||
#include <cogl/cogl-texture-pixmap-x11.h>
|
||||
#include <gdk/gdk.h> /* for gdk_rectangle_intersect() */
|
||||
|
||||
static void meta_shaped_texture_dispose (GObject *object);
|
||||
static void meta_shaped_texture_finalize (GObject *object);
|
||||
static void meta_shaped_texture_notify (GObject *object,
|
||||
GParamSpec *pspec);
|
||||
|
||||
static void meta_shaped_texture_paint (ClutterActor *actor);
|
||||
static void meta_shaped_texture_pick (ClutterActor *actor,
|
||||
const ClutterColor *color);
|
||||
|
||||
static void meta_shaped_texture_update_area (ClutterX11TexturePixmap *texture,
|
||||
int x,
|
||||
int y,
|
||||
int width,
|
||||
int height);
|
||||
static void meta_shaped_texture_get_preferred_width (ClutterActor *self,
|
||||
gfloat for_height,
|
||||
gfloat *min_width_p,
|
||||
gfloat *natural_width_p);
|
||||
|
||||
static void meta_shaped_texture_dirty_mask (MetaShapedTexture *stex);
|
||||
static void meta_shaped_texture_get_preferred_height (ClutterActor *self,
|
||||
gfloat for_width,
|
||||
gfloat *min_height_p,
|
||||
gfloat *natural_height_p);
|
||||
|
||||
static gboolean meta_shaped_texture_get_paint_volume (ClutterActor *self, ClutterPaintVolume *volume);
|
||||
|
||||
#ifdef HAVE_GLX_TEXTURE_PIXMAP
|
||||
G_DEFINE_TYPE (MetaShapedTexture, meta_shaped_texture,
|
||||
CLUTTER_GLX_TYPE_TEXTURE_PIXMAP);
|
||||
#else /* HAVE_GLX_TEXTURE_PIXMAP */
|
||||
G_DEFINE_TYPE (MetaShapedTexture, meta_shaped_texture,
|
||||
CLUTTER_X11_TYPE_TEXTURE_PIXMAP);
|
||||
#endif /* HAVE_GLX_TEXTURE_PIXMAP */
|
||||
CLUTTER_TYPE_ACTOR);
|
||||
|
||||
#define META_SHAPED_TEXTURE_GET_PRIVATE(obj) \
|
||||
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), META_TYPE_SHAPED_TEXTURE, \
|
||||
@ -64,15 +66,15 @@ G_DEFINE_TYPE (MetaShapedTexture, meta_shaped_texture,
|
||||
struct _MetaShapedTexturePrivate
|
||||
{
|
||||
MetaTextureTower *paint_tower;
|
||||
Pixmap pixmap;
|
||||
CoglHandle texture;
|
||||
CoglHandle mask_texture;
|
||||
CoglHandle material;
|
||||
CoglHandle material_unshaped;
|
||||
|
||||
cairo_region_t *clip_region;
|
||||
|
||||
guint mask_width, mask_height;
|
||||
|
||||
GArray *rectangles;
|
||||
guint tex_width, tex_height;
|
||||
|
||||
guint create_mipmaps : 1;
|
||||
};
|
||||
@ -82,16 +84,14 @@ meta_shaped_texture_class_init (MetaShapedTextureClass *klass)
|
||||
{
|
||||
GObjectClass *gobject_class = (GObjectClass *) klass;
|
||||
ClutterActorClass *actor_class = (ClutterActorClass *) klass;
|
||||
ClutterX11TexturePixmapClass *x11_texture_class = (ClutterX11TexturePixmapClass *) klass;
|
||||
|
||||
gobject_class->dispose = meta_shaped_texture_dispose;
|
||||
gobject_class->finalize = meta_shaped_texture_finalize;
|
||||
gobject_class->notify = meta_shaped_texture_notify;
|
||||
|
||||
actor_class->get_preferred_width = meta_shaped_texture_get_preferred_width;
|
||||
actor_class->get_preferred_height = meta_shaped_texture_get_preferred_height;
|
||||
actor_class->paint = meta_shaped_texture_paint;
|
||||
actor_class->pick = meta_shaped_texture_pick;
|
||||
|
||||
x11_texture_class->update_area = meta_shaped_texture_update_area;
|
||||
actor_class->get_paint_volume = meta_shaped_texture_get_paint_volume;
|
||||
|
||||
g_type_class_add_private (klass, sizeof (MetaShapedTexturePrivate));
|
||||
}
|
||||
@ -103,9 +103,8 @@ meta_shaped_texture_init (MetaShapedTexture *self)
|
||||
|
||||
priv = self->priv = META_SHAPED_TEXTURE_GET_PRIVATE (self);
|
||||
|
||||
priv->rectangles = g_array_new (FALSE, FALSE, sizeof (XRectangle));
|
||||
|
||||
priv->paint_tower = meta_texture_tower_new ();
|
||||
priv->texture = COGL_INVALID_HANDLE;
|
||||
priv->mask_texture = COGL_INVALID_HANDLE;
|
||||
priv->create_mipmaps = TRUE;
|
||||
}
|
||||
@ -120,8 +119,6 @@ meta_shaped_texture_dispose (GObject *object)
|
||||
meta_texture_tower_free (priv->paint_tower);
|
||||
priv->paint_tower = NULL;
|
||||
|
||||
meta_shaped_texture_dirty_mask (self);
|
||||
|
||||
if (priv->material != COGL_INVALID_HANDLE)
|
||||
{
|
||||
cogl_handle_unref (priv->material);
|
||||
@ -132,167 +129,18 @@ meta_shaped_texture_dispose (GObject *object)
|
||||
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;
|
||||
}
|
||||
|
||||
meta_shaped_texture_set_mask_texture (self, COGL_INVALID_HANDLE);
|
||||
meta_shaped_texture_set_clip_region (self, NULL);
|
||||
|
||||
G_OBJECT_CLASS (meta_shaped_texture_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_shaped_texture_finalize (GObject *object)
|
||||
{
|
||||
MetaShapedTexture *self = (MetaShapedTexture *) object;
|
||||
MetaShapedTexturePrivate *priv = self->priv;
|
||||
|
||||
g_array_free (priv->rectangles, TRUE);
|
||||
|
||||
G_OBJECT_CLASS (meta_shaped_texture_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_shaped_texture_notify (GObject *object,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
if (G_OBJECT_CLASS (meta_shaped_texture_parent_class)->notify)
|
||||
G_OBJECT_CLASS (meta_shaped_texture_parent_class)->notify (object, pspec);
|
||||
|
||||
/* It seems like we could just do this out of update_area(), but unfortunately,
|
||||
* clutter_glx_texture_pixmap() doesn't call through the vtable on the
|
||||
* initial update_area, so we need to look for changes to the texture
|
||||
* explicitly.
|
||||
*/
|
||||
if (strcmp (pspec->name, "cogl-texture") == 0)
|
||||
{
|
||||
MetaShapedTexture *stex = (MetaShapedTexture *) object;
|
||||
MetaShapedTexturePrivate *priv = stex->priv;
|
||||
|
||||
meta_shaped_texture_clear (stex);
|
||||
|
||||
if (priv->create_mipmaps)
|
||||
meta_texture_tower_set_base_texture (priv->paint_tower,
|
||||
clutter_texture_get_cogl_texture (CLUTTER_TEXTURE (stex)));
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
meta_shaped_texture_dirty_mask (MetaShapedTexture *stex)
|
||||
{
|
||||
MetaShapedTexturePrivate *priv = stex->priv;
|
||||
|
||||
if (priv->mask_texture != COGL_INVALID_HANDLE)
|
||||
{
|
||||
GLuint mask_gl_tex;
|
||||
GLenum mask_gl_target;
|
||||
|
||||
cogl_texture_get_gl_texture (priv->mask_texture,
|
||||
&mask_gl_tex, &mask_gl_target);
|
||||
|
||||
#ifdef GL_TEXTURE_RECTANGLE_ARB
|
||||
if (mask_gl_target == GL_TEXTURE_RECTANGLE_ARB)
|
||||
glDeleteTextures (1, &mask_gl_tex);
|
||||
#endif
|
||||
|
||||
cogl_handle_unref (priv->mask_texture);
|
||||
priv->mask_texture = COGL_INVALID_HANDLE;
|
||||
|
||||
if (priv->material != COGL_INVALID_HANDLE)
|
||||
cogl_material_set_layer (priv->material, 1, COGL_INVALID_HANDLE);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
meta_shaped_texture_ensure_mask (MetaShapedTexture *stex)
|
||||
{
|
||||
MetaShapedTexturePrivate *priv = stex->priv;
|
||||
CoglHandle paint_tex;
|
||||
guint tex_width, tex_height;
|
||||
|
||||
paint_tex = clutter_texture_get_cogl_texture (CLUTTER_TEXTURE (stex));
|
||||
|
||||
if (paint_tex == COGL_INVALID_HANDLE)
|
||||
return;
|
||||
|
||||
tex_width = cogl_texture_get_width (paint_tex);
|
||||
tex_height = cogl_texture_get_height (paint_tex);
|
||||
|
||||
/* If the mask texture we have was created for a different size then
|
||||
recreate it */
|
||||
if (priv->mask_texture != COGL_INVALID_HANDLE
|
||||
&& (priv->mask_width != tex_width || priv->mask_height != tex_height))
|
||||
meta_shaped_texture_dirty_mask (stex);
|
||||
|
||||
/* If we don't have a mask texture yet then create one */
|
||||
if (priv->mask_texture == COGL_INVALID_HANDLE)
|
||||
{
|
||||
guchar *mask_data;
|
||||
const XRectangle *rect;
|
||||
GLenum paint_gl_target;
|
||||
|
||||
/* Create data for an empty image */
|
||||
mask_data = g_malloc0 (tex_width * tex_height);
|
||||
|
||||
/* Cut out a hole for each rectangle */
|
||||
for (rect = (XRectangle *) priv->rectangles->data
|
||||
+ priv->rectangles->len;
|
||||
rect-- > (XRectangle *) priv->rectangles->data;)
|
||||
{
|
||||
gint x1 = rect->x, x2 = x1 + rect->width;
|
||||
gint y1 = rect->y, y2 = y1 + rect->height;
|
||||
guchar *p;
|
||||
|
||||
/* Clip the rectangle to the size of the texture */
|
||||
x1 = CLAMP (x1, 0, (gint) tex_width - 1);
|
||||
x2 = CLAMP (x2, x1, (gint) tex_width);
|
||||
y1 = CLAMP (y1, 0, (gint) tex_height - 1);
|
||||
y2 = CLAMP (y2, y1, (gint) tex_height);
|
||||
|
||||
/* Fill the rectangle */
|
||||
for (p = mask_data + y1 * tex_width + x1;
|
||||
y1 < y2;
|
||||
y1++, p += tex_width)
|
||||
memset (p, 255, x2 - x1);
|
||||
}
|
||||
|
||||
cogl_texture_get_gl_texture (paint_tex, NULL, &paint_gl_target);
|
||||
|
||||
#ifdef GL_TEXTURE_RECTANGLE_ARB
|
||||
if (paint_gl_target == GL_TEXTURE_RECTANGLE_ARB)
|
||||
{
|
||||
GLuint tex;
|
||||
|
||||
glGenTextures (1, &tex);
|
||||
glBindTexture (GL_TEXTURE_RECTANGLE_ARB, tex);
|
||||
glPixelStorei (GL_UNPACK_ROW_LENGTH, tex_width);
|
||||
glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
|
||||
glPixelStorei (GL_UNPACK_SKIP_ROWS, 0);
|
||||
glPixelStorei (GL_UNPACK_SKIP_PIXELS, 0);
|
||||
glTexImage2D (GL_TEXTURE_RECTANGLE_ARB, 0,
|
||||
GL_ALPHA, tex_width, tex_height,
|
||||
0, GL_ALPHA, GL_UNSIGNED_BYTE, mask_data);
|
||||
|
||||
priv->mask_texture
|
||||
= cogl_texture_new_from_foreign (tex,
|
||||
GL_TEXTURE_RECTANGLE_ARB,
|
||||
tex_width, tex_height,
|
||||
0, 0,
|
||||
COGL_PIXEL_FORMAT_A_8);
|
||||
}
|
||||
else
|
||||
#endif /* GL_TEXTURE_RECTANGLE_ARB */
|
||||
priv->mask_texture = cogl_texture_new_from_data (tex_width, tex_height,
|
||||
COGL_TEXTURE_NONE,
|
||||
COGL_PIXEL_FORMAT_A_8,
|
||||
COGL_PIXEL_FORMAT_ANY,
|
||||
tex_width,
|
||||
mask_data);
|
||||
|
||||
g_free (mask_data);
|
||||
|
||||
priv->mask_width = tex_width;
|
||||
priv->mask_height = tex_height;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
meta_shaped_texture_paint (ClutterActor *actor)
|
||||
{
|
||||
@ -331,20 +179,20 @@ meta_shaped_texture_paint (ClutterActor *actor)
|
||||
if (priv->create_mipmaps)
|
||||
paint_tex = meta_texture_tower_get_paint_texture (priv->paint_tower);
|
||||
else
|
||||
paint_tex = clutter_texture_get_cogl_texture (CLUTTER_TEXTURE (stex));
|
||||
paint_tex = priv->texture;
|
||||
|
||||
if (paint_tex == COGL_INVALID_HANDLE)
|
||||
return;
|
||||
|
||||
tex_width = cogl_texture_get_width (paint_tex);
|
||||
tex_height = cogl_texture_get_height (paint_tex);
|
||||
tex_width = priv->tex_width;
|
||||
tex_height = priv->tex_height;
|
||||
|
||||
if (tex_width == 0 || tex_height == 0) /* no contents yet */
|
||||
return;
|
||||
|
||||
if (priv->rectangles->len < 1)
|
||||
if (priv->mask_texture == COGL_INVALID_HANDLE)
|
||||
{
|
||||
/* If there are no rectangles use a single-layer texture */
|
||||
/* Use a single-layer texture if we don't have a mask. */
|
||||
|
||||
if (priv->material_unshaped == COGL_INVALID_HANDLE)
|
||||
{
|
||||
@ -357,8 +205,6 @@ meta_shaped_texture_paint (ClutterActor *actor)
|
||||
}
|
||||
else
|
||||
{
|
||||
meta_shaped_texture_ensure_mask (stex);
|
||||
|
||||
if (priv->material == COGL_INVALID_HANDLE)
|
||||
{
|
||||
if (G_UNLIKELY (material_template == COGL_INVALID_HANDLE))
|
||||
@ -392,6 +238,7 @@ meta_shaped_texture_paint (ClutterActor *actor)
|
||||
{
|
||||
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 */
|
||||
@ -409,6 +256,9 @@ meta_shaped_texture_paint (ClutterActor *actor)
|
||||
|
||||
cairo_region_get_rectangle (priv->clip_region, i, &rect);
|
||||
|
||||
if (!gdk_rectangle_intersect (&tex_rect, &rect, &rect))
|
||||
continue;
|
||||
|
||||
x1 = rect.x;
|
||||
y1 = rect.y;
|
||||
x2 = rect.x + rect.width;
|
||||
@ -444,8 +294,8 @@ meta_shaped_texture_pick (ClutterActor *actor,
|
||||
MetaShapedTexture *stex = (MetaShapedTexture *) actor;
|
||||
MetaShapedTexturePrivate *priv = stex->priv;
|
||||
|
||||
/* If there are no rectangles then use the regular pick */
|
||||
if (priv->rectangles->len < 1)
|
||||
/* 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);
|
||||
else if (clutter_actor_should_pick_paint (actor))
|
||||
@ -454,7 +304,7 @@ meta_shaped_texture_pick (ClutterActor *actor,
|
||||
ClutterActorBox alloc;
|
||||
guint tex_width, tex_height;
|
||||
|
||||
paint_tex = clutter_texture_get_cogl_texture (CLUTTER_TEXTURE (stex));
|
||||
paint_tex = priv->texture;
|
||||
|
||||
if (paint_tex == COGL_INVALID_HANDLE)
|
||||
return;
|
||||
@ -465,8 +315,6 @@ meta_shaped_texture_pick (ClutterActor *actor,
|
||||
if (tex_width == 0 || tex_height == 0) /* no contents yet */
|
||||
return;
|
||||
|
||||
meta_shaped_texture_ensure_mask (stex);
|
||||
|
||||
cogl_set_source_color4ub (color->red, color->green, color->blue,
|
||||
color->alpha);
|
||||
|
||||
@ -482,19 +330,48 @@ meta_shaped_texture_pick (ClutterActor *actor,
|
||||
}
|
||||
|
||||
static void
|
||||
meta_shaped_texture_update_area (ClutterX11TexturePixmap *texture,
|
||||
int x,
|
||||
int y,
|
||||
int width,
|
||||
int height)
|
||||
meta_shaped_texture_get_preferred_width (ClutterActor *self,
|
||||
gfloat for_height,
|
||||
gfloat *min_width_p,
|
||||
gfloat *natural_width_p)
|
||||
{
|
||||
MetaShapedTexture *stex = (MetaShapedTexture *) texture;
|
||||
MetaShapedTexturePrivate *priv = stex->priv;
|
||||
MetaShapedTexturePrivate *priv;
|
||||
|
||||
CLUTTER_X11_TEXTURE_PIXMAP_CLASS (meta_shaped_texture_parent_class)->update_area (texture,
|
||||
x, y, width, height);
|
||||
g_return_if_fail (META_IS_SHAPED_TEXTURE (self));
|
||||
|
||||
meta_texture_tower_update_area (priv->paint_tower, x, y, width, height);
|
||||
priv = META_SHAPED_TEXTURE (self)->priv;
|
||||
|
||||
if (min_width_p)
|
||||
*min_width_p = 0;
|
||||
|
||||
if (natural_width_p)
|
||||
*natural_width_p = priv->tex_width;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_shaped_texture_get_preferred_height (ClutterActor *self,
|
||||
gfloat for_width,
|
||||
gfloat *min_height_p,
|
||||
gfloat *natural_height_p)
|
||||
{
|
||||
MetaShapedTexturePrivate *priv;
|
||||
|
||||
g_return_if_fail (META_IS_SHAPED_TEXTURE (self));
|
||||
|
||||
priv = META_SHAPED_TEXTURE (self)->priv;
|
||||
|
||||
if (min_height_p)
|
||||
*min_height_p = 0;
|
||||
|
||||
if (natural_height_p)
|
||||
*natural_height_p = priv->tex_height;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
meta_shaped_texture_get_paint_volume (ClutterActor *self,
|
||||
ClutterPaintVolume *volume)
|
||||
{
|
||||
return clutter_paint_volume_set_from_allocation (volume, self);
|
||||
}
|
||||
|
||||
ClutterActor *
|
||||
@ -520,34 +397,16 @@ meta_shaped_texture_set_create_mipmaps (MetaShapedTexture *stex,
|
||||
if (create_mipmaps != priv->create_mipmaps)
|
||||
{
|
||||
CoglHandle base_texture;
|
||||
|
||||
priv->create_mipmaps = create_mipmaps;
|
||||
|
||||
base_texture = create_mipmaps ?
|
||||
clutter_texture_get_cogl_texture (CLUTTER_TEXTURE (stex)) : COGL_INVALID_HANDLE;
|
||||
|
||||
priv->texture : COGL_INVALID_HANDLE;
|
||||
meta_texture_tower_set_base_texture (priv->paint_tower, base_texture);
|
||||
}
|
||||
}
|
||||
|
||||
/* This is a workaround for deficiencies in the hack tower:
|
||||
*
|
||||
* When we call clutter_x11_texture_pixmap_set_pixmap(tp, None),
|
||||
* ClutterX11TexturePixmap knows that it has to get rid of the old texture, but
|
||||
* clutter_texture_set_cogl_texture(texture, COGL_INVALID_HANDLE) isn't allowed, so
|
||||
* it grabs the material for the texture and manually sets the texture in it. This means
|
||||
* that the "cogl-texture" property isn't notified, so we don't find out about it.
|
||||
*
|
||||
* And if we keep the CoglX11TexturePixmap around after the X pixmap is freed, then
|
||||
* we'll trigger X errors when we actually try to free it.
|
||||
*
|
||||
* The only correct thing to do here is to change our code to derive
|
||||
* from ClutterActor and get rid of the inheritance hack tower. Once
|
||||
* we want to depend on Clutter-1.4 (which has CoglTexturePixmapX11),
|
||||
* that will be very easy to do.
|
||||
*/
|
||||
void
|
||||
meta_shaped_texture_clear (MetaShapedTexture *stex)
|
||||
meta_shaped_texture_set_mask_texture (MetaShapedTexture *stex,
|
||||
CoglHandle mask_texture)
|
||||
{
|
||||
MetaShapedTexturePrivate *priv;
|
||||
|
||||
@ -555,61 +414,141 @@ meta_shaped_texture_clear (MetaShapedTexture *stex)
|
||||
|
||||
priv = stex->priv;
|
||||
|
||||
meta_texture_tower_set_base_texture (priv->paint_tower, COGL_INVALID_HANDLE);
|
||||
if (priv->mask_texture != COGL_INVALID_HANDLE)
|
||||
{
|
||||
cogl_handle_unref (priv->mask_texture);
|
||||
priv->mask_texture = COGL_INVALID_HANDLE;
|
||||
}
|
||||
|
||||
if (priv->material != COGL_INVALID_HANDLE)
|
||||
cogl_material_set_layer (priv->material, 0, COGL_INVALID_HANDLE);
|
||||
if (mask_texture != COGL_INVALID_HANDLE)
|
||||
{
|
||||
priv->mask_texture = mask_texture;
|
||||
cogl_handle_ref (priv->mask_texture);
|
||||
}
|
||||
|
||||
if (priv->material_unshaped != COGL_INVALID_HANDLE)
|
||||
cogl_material_set_layer (priv->material_unshaped, 0, COGL_INVALID_HANDLE);
|
||||
}
|
||||
|
||||
void
|
||||
meta_shaped_texture_clear_rectangles (MetaShapedTexture *stex)
|
||||
{
|
||||
MetaShapedTexturePrivate *priv;
|
||||
|
||||
g_return_if_fail (META_IS_SHAPED_TEXTURE (stex));
|
||||
|
||||
priv = stex->priv;
|
||||
|
||||
g_array_set_size (priv->rectangles, 0);
|
||||
meta_shaped_texture_dirty_mask (stex);
|
||||
clutter_actor_queue_redraw (CLUTTER_ACTOR (stex));
|
||||
}
|
||||
|
||||
void
|
||||
meta_shaped_texture_add_rectangle (MetaShapedTexture *stex,
|
||||
const XRectangle *rect)
|
||||
{
|
||||
g_return_if_fail (META_IS_SHAPED_TEXTURE (stex));
|
||||
|
||||
meta_shaped_texture_add_rectangles (stex, 1, rect);
|
||||
}
|
||||
|
||||
void
|
||||
meta_shaped_texture_add_rectangles (MetaShapedTexture *stex,
|
||||
size_t num_rects,
|
||||
const XRectangle *rects)
|
||||
meta_shaped_texture_update_area (MetaShapedTexture *stex,
|
||||
int x,
|
||||
int y,
|
||||
int width,
|
||||
int height)
|
||||
{
|
||||
MetaShapedTexturePrivate *priv;
|
||||
const cairo_rectangle_int_t clip = { x, y, width, height };
|
||||
|
||||
priv = stex->priv;
|
||||
|
||||
if (priv->texture == COGL_INVALID_HANDLE)
|
||||
return;
|
||||
|
||||
cogl_texture_pixmap_x11_update_area (priv->texture, x, y, width, height);
|
||||
|
||||
meta_texture_tower_update_area (priv->paint_tower, x, y, width, height);
|
||||
|
||||
clutter_actor_queue_redraw_with_clip (CLUTTER_ACTOR (stex), &clip);
|
||||
}
|
||||
|
||||
static void
|
||||
set_cogl_texture (MetaShapedTexture *stex,
|
||||
CoglHandle cogl_tex)
|
||||
{
|
||||
MetaShapedTexturePrivate *priv;
|
||||
guint width, height;
|
||||
|
||||
g_return_if_fail (META_IS_SHAPED_TEXTURE (stex));
|
||||
|
||||
priv = stex->priv;
|
||||
|
||||
g_array_append_vals (priv->rectangles, rects, num_rects);
|
||||
if (priv->texture != COGL_INVALID_HANDLE)
|
||||
cogl_handle_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)
|
||||
{
|
||||
width = cogl_texture_get_width (cogl_tex);
|
||||
height = cogl_texture_get_height (cogl_tex);
|
||||
|
||||
if (width != priv->tex_width ||
|
||||
height != priv->tex_height)
|
||||
{
|
||||
priv->tex_width = width;
|
||||
priv->tex_height = height;
|
||||
|
||||
clutter_actor_queue_relayout (CLUTTER_ACTOR (stex));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* size changed to 0 going to an invalid handle */
|
||||
priv->tex_width = 0;
|
||||
priv->tex_height = 0;
|
||||
clutter_actor_queue_relayout (CLUTTER_ACTOR (stex));
|
||||
}
|
||||
|
||||
meta_shaped_texture_dirty_mask (stex);
|
||||
clutter_actor_queue_redraw (CLUTTER_ACTOR (stex));
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_shaped_texture_set_pixmap:
|
||||
* @stex: The #MetaShapedTexture
|
||||
* @pixmap: The pixmap you want the stex to assume
|
||||
*/
|
||||
void
|
||||
meta_shaped_texture_set_pixmap (MetaShapedTexture *stex,
|
||||
Pixmap pixmap)
|
||||
{
|
||||
MetaShapedTexturePrivate *priv;
|
||||
|
||||
g_return_if_fail (META_IS_SHAPED_TEXTURE (stex));
|
||||
|
||||
priv = stex->priv;
|
||||
|
||||
if (priv->pixmap == pixmap)
|
||||
return;
|
||||
|
||||
priv->pixmap = pixmap;
|
||||
|
||||
if (pixmap != None)
|
||||
{
|
||||
CoglContext *ctx =
|
||||
clutter_backend_get_cogl_context (clutter_get_default_backend ());
|
||||
set_cogl_texture (stex, cogl_texture_pixmap_x11_new (ctx, pixmap, FALSE, NULL));
|
||||
}
|
||||
else
|
||||
set_cogl_texture (stex, COGL_INVALID_HANDLE);
|
||||
|
||||
if (priv->create_mipmaps)
|
||||
meta_texture_tower_set_base_texture (priv->paint_tower, priv->texture);
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_shaped_texture_get_texture:
|
||||
* @stex: The #MetaShapedTexture
|
||||
*
|
||||
* Returns: (transfer none): the unshaped texture
|
||||
*/
|
||||
CoglHandle
|
||||
meta_shaped_texture_get_texture (MetaShapedTexture *stex)
|
||||
{
|
||||
g_return_val_if_fail (META_IS_SHAPED_TEXTURE (stex), COGL_INVALID_HANDLE);
|
||||
return stex->priv->texture;
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_shaped_texture_set_clip_region:
|
||||
* @frame: a #TidyTextureframe
|
||||
* @stex: a #MetaShapedTexture
|
||||
* @clip_region: (transfer full): the region of the texture that
|
||||
* is visible and should be painted. OWNERSHIP IS ASSUMED BY
|
||||
* THE FUNCTION (for efficiency to avoid a copy.)
|
||||
* 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
|
||||
@ -635,5 +574,106 @@ meta_shaped_texture_set_clip_region (MetaShapedTexture *stex,
|
||||
priv->clip_region = NULL;
|
||||
}
|
||||
|
||||
priv->clip_region = clip_region;
|
||||
if (clip_region)
|
||||
priv->clip_region = cairo_region_copy (clip_region);
|
||||
else
|
||||
priv->clip_region = NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_shaped_texture_get_image:
|
||||
* @stex: A #MetaShapedTexture
|
||||
* @clip: A clipping rectangle, to help prevent extra processing.
|
||||
* In the case that the clipping rectangle is partially or fully
|
||||
* outside the bounds of the texture, the rectangle will be clipped.
|
||||
*
|
||||
* Flattens the two layers of the shaped texture into one ARGB32
|
||||
* image by alpha blending the two images, and returns the flattened
|
||||
* image.
|
||||
*
|
||||
* Returns: (transfer full): a new cairo surface to be freed with
|
||||
* cairo_surface_destroy().
|
||||
*/
|
||||
cairo_surface_t *
|
||||
meta_shaped_texture_get_image (MetaShapedTexture *stex,
|
||||
cairo_rectangle_int_t *clip)
|
||||
{
|
||||
CoglHandle 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;
|
||||
|
||||
if (texture == NULL)
|
||||
return NULL;
|
||||
|
||||
texture_rect.width = cogl_texture_get_width (texture);
|
||||
texture_rect.height = cogl_texture_get_height (texture);
|
||||
|
||||
if (clip != NULL)
|
||||
{
|
||||
/* GdkRectangle is just a typedef of cairo_rectangle_int_t,
|
||||
* so we can use the gdk_rectangle_* APIs on these. */
|
||||
if (!gdk_rectangle_intersect (&texture_rect, clip, clip))
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (clip != NULL)
|
||||
texture = cogl_texture_new_from_sub_texture (texture,
|
||||
clip->x,
|
||||
clip->y,
|
||||
clip->width,
|
||||
clip->height);
|
||||
|
||||
surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
|
||||
cogl_texture_get_width (texture),
|
||||
cogl_texture_get_height (texture));
|
||||
|
||||
cogl_texture_get_data (texture, CLUTTER_CAIRO_FORMAT_ARGB32,
|
||||
cairo_image_surface_get_stride (surface),
|
||||
cairo_image_surface_get_data (surface));
|
||||
|
||||
cairo_surface_mark_dirty (surface);
|
||||
|
||||
if (clip != NULL)
|
||||
cogl_object_unref (texture);
|
||||
|
||||
mask_texture = stex->priv->mask_texture;
|
||||
if (mask_texture != COGL_INVALID_HANDLE)
|
||||
{
|
||||
cairo_t *cr;
|
||||
cairo_surface_t *mask_surface;
|
||||
|
||||
if (clip != NULL)
|
||||
mask_texture = cogl_texture_new_from_sub_texture (mask_texture,
|
||||
clip->x,
|
||||
clip->y,
|
||||
clip->width,
|
||||
clip->height);
|
||||
|
||||
mask_surface = cairo_image_surface_create (CAIRO_FORMAT_A8,
|
||||
cogl_texture_get_width (mask_texture),
|
||||
cogl_texture_get_height (mask_texture));
|
||||
|
||||
cogl_texture_get_data (mask_texture, COGL_PIXEL_FORMAT_A_8,
|
||||
cairo_image_surface_get_stride (mask_surface),
|
||||
cairo_image_surface_get_data (mask_surface));
|
||||
|
||||
cairo_surface_mark_dirty (mask_surface);
|
||||
|
||||
cr = cairo_create (surface);
|
||||
cairo_set_source_surface (cr, mask_surface, 0, 0);
|
||||
cairo_set_operator (cr, CAIRO_OPERATOR_DEST_IN);
|
||||
cairo_paint (cr);
|
||||
cairo_destroy (cr);
|
||||
|
||||
cairo_surface_destroy (mask_surface);
|
||||
|
||||
if (clip != NULL)
|
||||
cogl_object_unref (mask_texture);
|
||||
}
|
||||
|
||||
return surface;
|
||||
}
|
||||
|
101
src/compositor/meta-texture-rectangle.c
Normal file
101
src/compositor/meta-texture-rectangle.c
Normal file
@ -0,0 +1,101 @@
|
||||
/*
|
||||
* texture rectangle
|
||||
*
|
||||
* A small utility function to help create a rectangle texture
|
||||
*
|
||||
* Authored By Neil Roberts <neil@linux.intel.com>
|
||||
*
|
||||
* Copyright (C) 2011, 2012 Intel Corporation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
* 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#define CLUTTER_ENABLE_EXPERIMENTAL_API
|
||||
#define COGL_ENABLE_EXPERIMENTAL_API
|
||||
|
||||
#include <clutter/clutter.h>
|
||||
#include "meta-texture-rectangle.h"
|
||||
|
||||
CoglTexture *
|
||||
meta_texture_rectangle_new (unsigned int width,
|
||||
unsigned int height,
|
||||
CoglPixelFormat format,
|
||||
CoglPixelFormat internal_format,
|
||||
unsigned int rowstride,
|
||||
const guint8 *data,
|
||||
GError **error)
|
||||
{
|
||||
ClutterBackend *backend =
|
||||
clutter_get_default_backend ();
|
||||
CoglContext *context =
|
||||
clutter_backend_get_cogl_context (backend);
|
||||
CoglTextureRectangle *tex_rect;
|
||||
|
||||
tex_rect = cogl_texture_rectangle_new_with_size (context,
|
||||
width, height,
|
||||
internal_format,
|
||||
error);
|
||||
if (tex_rect == NULL)
|
||||
return NULL;
|
||||
|
||||
if (data)
|
||||
cogl_texture_set_region (COGL_TEXTURE (tex_rect),
|
||||
0, 0, /* src_x/y */
|
||||
0, 0, /* dst_x/y */
|
||||
width, height, /* dst_width/height */
|
||||
width, height, /* width/height */
|
||||
format,
|
||||
rowstride,
|
||||
data);
|
||||
|
||||
return COGL_TEXTURE (tex_rect);
|
||||
}
|
||||
|
||||
static void
|
||||
texture_rectangle_check_cb (CoglTexture *sub_texture,
|
||||
const float *sub_texture_coords,
|
||||
const float *meta_coords,
|
||||
void *user_data)
|
||||
{
|
||||
gboolean *result = user_data;
|
||||
|
||||
if (cogl_is_texture_rectangle (sub_texture))
|
||||
*result = TRUE;
|
||||
}
|
||||
|
||||
/* Determines if the given texture is using a rectangle texture as its
|
||||
* primitive texture type. Eventually this function could be replaced
|
||||
* with cogl_texture_get_type if Cogl makes that public.
|
||||
*
|
||||
* http://git.gnome.org/browse/cogl/commit/?h=8012eee31
|
||||
*/
|
||||
gboolean
|
||||
meta_texture_rectangle_check (CoglTexture *texture)
|
||||
{
|
||||
gboolean result = FALSE;
|
||||
|
||||
cogl_meta_texture_foreach_in_region (COGL_META_TEXTURE (texture),
|
||||
0.0f, 0.0f, /* tx_1 / ty_1 */
|
||||
1.0f, 1.0f, /* tx_2 / ty_2 */
|
||||
COGL_PIPELINE_WRAP_MODE_REPEAT,
|
||||
COGL_PIPELINE_WRAP_MODE_REPEAT,
|
||||
texture_rectangle_check_cb,
|
||||
&result);
|
||||
|
||||
return result;
|
||||
}
|
47
src/compositor/meta-texture-rectangle.h
Normal file
47
src/compositor/meta-texture-rectangle.h
Normal file
@ -0,0 +1,47 @@
|
||||
/*
|
||||
* texture rectangle
|
||||
*
|
||||
* A small utility function to help create a rectangle texture
|
||||
*
|
||||
* Authored By Neil Roberts <neil@linux.intel.com>
|
||||
*
|
||||
* Copyright (C) 2011 Intel Corporation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
* 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __META_TEXTURE_RECTANGLE_H__
|
||||
#define __META_TEXTURE_RECTANGLE_H__
|
||||
|
||||
#include <cogl/cogl.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
CoglTexture *
|
||||
meta_texture_rectangle_new (unsigned int width,
|
||||
unsigned int height,
|
||||
CoglPixelFormat format,
|
||||
CoglPixelFormat internal_format,
|
||||
unsigned int rowstride,
|
||||
const guint8 *data,
|
||||
GError **error);
|
||||
|
||||
gboolean
|
||||
meta_texture_rectangle_check (CoglTexture *texture);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __META_TEXTURE_RECTANGLE_H__ */
|
@ -26,6 +26,7 @@
|
||||
#include <string.h>
|
||||
|
||||
#include "meta-texture-tower.h"
|
||||
#include "meta-texture-rectangle.h"
|
||||
|
||||
#ifndef M_LOG2E
|
||||
#define M_LOG2E 1.4426950408889634074
|
||||
@ -97,37 +98,9 @@ meta_texture_tower_free (MetaTextureTower *tower)
|
||||
g_slice_free (MetaTextureTower, tower);
|
||||
}
|
||||
|
||||
#ifdef GL_TEXTURE_RECTANGLE_ARB
|
||||
static gboolean
|
||||
texture_is_rectangle (CoglHandle texture)
|
||||
{
|
||||
GLuint gl_tex;
|
||||
GLenum gl_target;
|
||||
|
||||
cogl_texture_get_gl_texture (texture, &gl_tex, &gl_target);
|
||||
return gl_target == GL_TEXTURE_RECTANGLE_ARB;
|
||||
}
|
||||
#endif /* GL_TEXTURE_RECTANGLE_ARB */
|
||||
|
||||
static void
|
||||
free_texture (CoglHandle texture)
|
||||
{
|
||||
#ifdef GL_TEXTURE_RECTANGLE_ARB
|
||||
GLuint gl_tex;
|
||||
GLenum gl_target;
|
||||
|
||||
cogl_texture_get_gl_texture (texture, &gl_tex, &gl_target);
|
||||
|
||||
if (gl_target == GL_TEXTURE_RECTANGLE_ARB)
|
||||
glDeleteTextures (1, &gl_tex);
|
||||
#endif /* GL_TEXTURE_RECTANGLE_ARB */
|
||||
|
||||
cogl_handle_unref (texture);
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_texture_tower_update_area:
|
||||
* @tower: a MetaTextureTower
|
||||
* meta_texture_tower_set_base_texture:
|
||||
* @tower: a #MetaTextureTower
|
||||
* @texture: the new texture used as a base for scaled down versions
|
||||
*
|
||||
* Sets the base texture that is the scaled texture that the
|
||||
@ -152,7 +125,7 @@ meta_texture_tower_set_base_texture (MetaTextureTower *tower,
|
||||
{
|
||||
if (tower->textures[i] != COGL_INVALID_HANDLE)
|
||||
{
|
||||
free_texture (tower->textures[i]);
|
||||
cogl_handle_unref (tower->textures[i]);
|
||||
tower->textures[i] = COGL_INVALID_HANDLE;
|
||||
}
|
||||
|
||||
@ -190,7 +163,7 @@ meta_texture_tower_set_base_texture (MetaTextureTower *tower,
|
||||
|
||||
/**
|
||||
* meta_texture_tower_update_area:
|
||||
* @tower: a MetaTextureTower
|
||||
* @tower: a #MetaTextureTower
|
||||
* @x: X coordinate of upper left of rectangle that changed
|
||||
* @y: Y coordinate of upper left of rectangle that changed
|
||||
* @width: width of rectangle that changed
|
||||
@ -213,6 +186,9 @@ meta_texture_tower_update_area (MetaTextureTower *tower,
|
||||
|
||||
g_return_if_fail (tower != NULL);
|
||||
|
||||
if (tower->textures[0] == COGL_INVALID_HANDLE)
|
||||
return;
|
||||
|
||||
texture_width = cogl_texture_get_width (tower->textures[0]);
|
||||
texture_height = cogl_texture_get_height (tower->textures[0]);
|
||||
|
||||
@ -366,13 +342,11 @@ get_paint_level (int width, int height)
|
||||
return (int)(0.5 + lambda);
|
||||
}
|
||||
|
||||
#ifdef GL_TEXTURE_RECTANGLE_ARB
|
||||
static gboolean
|
||||
is_power_of_two (int x)
|
||||
{
|
||||
return (x & (x - 1)) == 0;
|
||||
}
|
||||
#endif /* GL_TEXTURE_RECTANGLE_ARB */
|
||||
|
||||
static void
|
||||
texture_tower_create_texture (MetaTextureTower *tower,
|
||||
@ -380,30 +354,23 @@ texture_tower_create_texture (MetaTextureTower *tower,
|
||||
int width,
|
||||
int height)
|
||||
{
|
||||
#ifdef GL_TEXTURE_RECTANGLE_ARB
|
||||
if ((!is_power_of_two (width) || !is_power_of_two (height)) &&
|
||||
texture_is_rectangle (tower->textures[level - 1]))
|
||||
meta_texture_rectangle_check (tower->textures[level - 1]))
|
||||
{
|
||||
GLuint tex = 0;
|
||||
|
||||
glGenTextures (1, &tex);
|
||||
glBindTexture (GL_TEXTURE_RECTANGLE_ARB, tex);
|
||||
glTexImage2D (GL_TEXTURE_RECTANGLE_ARB, 0,
|
||||
GL_RGBA, width,height,
|
||||
#if TEXTURE_FORMAT == COGL_PIXEL_FORMAT_BGRA_8888_PRE
|
||||
0, GL_BGRA, GL_UNSIGNED_BYTE,
|
||||
#else /* assume big endian */
|
||||
0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV,
|
||||
#endif
|
||||
NULL);
|
||||
|
||||
tower->textures[level] = cogl_texture_new_from_foreign (tex, GL_TEXTURE_RECTANGLE_ARB,
|
||||
width, height,
|
||||
0, 0,
|
||||
TEXTURE_FORMAT);
|
||||
tower->textures[level] =
|
||||
meta_texture_rectangle_new (width, height,
|
||||
/* data format */
|
||||
TEXTURE_FORMAT,
|
||||
/* internal cogl format */
|
||||
TEXTURE_FORMAT,
|
||||
/* rowstride */
|
||||
width * 4,
|
||||
/* data */
|
||||
NULL,
|
||||
/* error */
|
||||
NULL);
|
||||
}
|
||||
else
|
||||
#endif /* GL_TEXTURE_RECTANGLE_ARB */
|
||||
{
|
||||
tower->textures[level] = cogl_texture_new_with_size (width, height,
|
||||
COGL_TEXTURE_NO_AUTO_MIPMAP,
|
||||
@ -430,12 +397,7 @@ texture_tower_revalidate_fbo (MetaTextureTower *tower,
|
||||
CoglMatrix modelview;
|
||||
|
||||
if (tower->fbos[level] == COGL_INVALID_HANDLE)
|
||||
{
|
||||
/* Work around http://bugzilla.openedhand.com/show_bug.cgi?id=2110 */
|
||||
cogl_flush();
|
||||
|
||||
tower->fbos[level] = cogl_offscreen_new_to_texture (dest_texture);
|
||||
}
|
||||
tower->fbos[level] = cogl_offscreen_new_to_texture (dest_texture);
|
||||
|
||||
if (tower->fbos[level] == COGL_INVALID_HANDLE)
|
||||
return FALSE;
|
||||
@ -584,7 +546,7 @@ texture_tower_revalidate_client (MetaTextureTower *tower,
|
||||
4 * dest_width,
|
||||
dest_data);
|
||||
|
||||
if (dest_height < source_texture_height)
|
||||
if (dest_texture_height < source_texture_height)
|
||||
{
|
||||
g_free (source_tmp1);
|
||||
g_free (source_tmp2);
|
||||
@ -604,7 +566,7 @@ texture_tower_revalidate (MetaTextureTower *tower,
|
||||
|
||||
/**
|
||||
* meta_texture_tower_get_paint_texture:
|
||||
* @tower: a MetaTextureTower
|
||||
* @tower: a #MetaTextureTower
|
||||
*
|
||||
* Gets the texture from the tower that best matches the current
|
||||
* rendering scale. (On the assumption here the texture is going to
|
||||
|
@ -26,15 +26,22 @@ void meta_window_actor_unmaximize (MetaWindowActor *self,
|
||||
|
||||
void meta_window_actor_process_damage (MetaWindowActor *self,
|
||||
XDamageNotifyEvent *event);
|
||||
|
||||
void meta_window_actor_pre_paint (MetaWindowActor *self);
|
||||
|
||||
void meta_window_actor_invalidate_shadow (MetaWindowActor *self);
|
||||
|
||||
void meta_window_actor_set_redirected (MetaWindowActor *self, gboolean state);
|
||||
|
||||
gboolean meta_window_actor_should_unredirect (MetaWindowActor *self);
|
||||
|
||||
void meta_window_actor_get_shape_bounds (MetaWindowActor *self,
|
||||
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_visibility (MetaWindowActor *self);
|
||||
void meta_window_actor_update_shape (MetaWindowActor *self,
|
||||
gboolean shaped);
|
||||
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);
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -7,9 +7,10 @@
|
||||
|
||||
#include <gdk/gdk.h> /* for gdk_rectangle_intersect() */
|
||||
|
||||
#include "compositor-private.h"
|
||||
#include "meta-window-actor-private.h"
|
||||
#include "meta-window-group.h"
|
||||
#include "meta-background-actor.h"
|
||||
#include "meta-background-actor-private.h"
|
||||
|
||||
struct _MetaWindowGroupClass
|
||||
{
|
||||
@ -25,9 +26,28 @@ struct _MetaWindowGroup
|
||||
|
||||
G_DEFINE_TYPE (MetaWindowGroup, meta_window_group, CLUTTER_TYPE_GROUP);
|
||||
|
||||
/* We want to find out if the window is "close enough" to
|
||||
* 1:1 transform. We do that by converting the transformed coordinates
|
||||
* to 24.8 fixed-point before checking if they look right.
|
||||
/* 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)
|
||||
@ -35,41 +55,24 @@ round_to_fixed (float x)
|
||||
return roundf (x * 256);
|
||||
}
|
||||
|
||||
/* We can only (easily) apply our logic for figuring out what a window
|
||||
* obscures if is not transformed. This function does that check and
|
||||
* as a side effect gets the position of the upper-left corner of the
|
||||
* actors.
|
||||
*
|
||||
* (We actually could handle scaled and non-integrally positioned actors
|
||||
* too as long as they weren't shaped - no filtering is done at the
|
||||
* edges so a rectangle stays a rectangle. But the gain from that is
|
||||
* small, especally since most of our windows are shaped. The simple
|
||||
* case we handle here is the case that matters when the user is just
|
||||
* using the desktop normally.)
|
||||
*
|
||||
* If we assume that the window group is untransformed (it better not
|
||||
* be!) then we could also make this determination by checking directly
|
||||
* if the actor itself is rotated, scaled, or at a non-integral position.
|
||||
* However, the criterion for "close enough" in that case get trickier,
|
||||
* since, for example, the allowed rotation depends on the size of
|
||||
* actor. The approach we take here is to just require everything
|
||||
* to be within 1/256th of a pixel.
|
||||
/* 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
|
||||
actor_is_untransformed (ClutterActor *actor,
|
||||
int *x_origin,
|
||||
int *y_origin)
|
||||
vertices_are_untransformed (ClutterVertex *verts,
|
||||
float widthf,
|
||||
float heightf,
|
||||
int *x_origin,
|
||||
int *y_origin)
|
||||
{
|
||||
gfloat widthf, heightf;
|
||||
int width, height;
|
||||
ClutterVertex verts[4];
|
||||
int v0x, v0y, v1x, v1y, v2x, v2y, v3x, v3y;
|
||||
int x, y;
|
||||
|
||||
clutter_actor_get_size (actor, &widthf, &heightf);
|
||||
width = round_to_fixed (widthf); height = round_to_fixed (heightf);
|
||||
|
||||
clutter_actor_get_abs_allocation_vertices (actor, verts);
|
||||
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);
|
||||
@ -100,15 +103,117 @@ actor_is_untransformed (ClutterActor *actor,
|
||||
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);
|
||||
}
|
||||
|
||||
/* Help macros to scale from OpenGL <-1,1> coordinates system to
|
||||
* window coordinates ranging [0,window-size]. Borrowed from clutter-utils.c
|
||||
*/
|
||||
#define MTX_GL_SCALE_X(x,w,v1,v2) ((((((x) / (w)) + 1.0f) / 2.0f) * (v1)) + (v2))
|
||||
#define MTX_GL_SCALE_Y(y,w,v1,v2) ((v1) - (((((y) / (w)) + 1.0f) / 2.0f) * (v1)) + (v2))
|
||||
|
||||
/* Check if we're painting the MetaWindowGroup "untransformed". This can
|
||||
* differ from the result of actor_is_untransformed(window_group) if we're
|
||||
* inside a clone paint. The integer translation, if any, is returned.
|
||||
*/
|
||||
static gboolean
|
||||
painting_untransformed (MetaWindowGroup *window_group,
|
||||
int *x_origin,
|
||||
int *y_origin)
|
||||
{
|
||||
CoglMatrix modelview, projection, modelview_projection;
|
||||
ClutterVertex vertices[4];
|
||||
int width, height;
|
||||
float viewport[4];
|
||||
int i;
|
||||
|
||||
cogl_get_modelview_matrix (&modelview);
|
||||
cogl_get_projection_matrix (&projection);
|
||||
|
||||
cogl_matrix_multiply (&modelview_projection,
|
||||
&projection,
|
||||
&modelview);
|
||||
|
||||
meta_screen_get_size (window_group->screen, &width, &height);
|
||||
|
||||
vertices[0].x = 0;
|
||||
vertices[0].y = 0;
|
||||
vertices[0].z = 0;
|
||||
vertices[1].x = width;
|
||||
vertices[1].y = 0;
|
||||
vertices[1].z = 0;
|
||||
vertices[2].x = 0;
|
||||
vertices[2].y = height;
|
||||
vertices[2].z = 0;
|
||||
vertices[3].x = width;
|
||||
vertices[3].y = height;
|
||||
vertices[3].z = 0;
|
||||
|
||||
cogl_get_viewport (viewport);
|
||||
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
float w = 1;
|
||||
cogl_matrix_transform_point (&modelview_projection, &vertices[i].x, &vertices[i].y, &vertices[i].z, &w);
|
||||
vertices[i].x = MTX_GL_SCALE_X (vertices[i].x, w,
|
||||
viewport[2], viewport[0]);
|
||||
vertices[i].y = MTX_GL_SCALE_Y (vertices[i].y, w,
|
||||
viewport[3], viewport[1]);
|
||||
}
|
||||
|
||||
return vertices_are_untransformed (vertices, width, height, x_origin, y_origin);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_window_group_paint (ClutterActor *actor)
|
||||
{
|
||||
MetaWindowGroup *window_group = META_WINDOW_GROUP (actor);
|
||||
cairo_region_t *visible_region;
|
||||
GLboolean scissor_test;
|
||||
cairo_rectangle_int_t screen_rect = { 0 };
|
||||
cairo_rectangle_int_t scissor_rect;
|
||||
ClutterActor *stage;
|
||||
cairo_rectangle_int_t visible_rect;
|
||||
GList *children, *l;
|
||||
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);
|
||||
|
||||
/* 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
|
||||
* case and we need to compensate. We look at the position of the window
|
||||
* group under the current model-view matrix and the position of the actor.
|
||||
* If they are both simply integer translations, then we can compensate
|
||||
* easily, otherwise we give up.
|
||||
*
|
||||
* Possible cleanup: work entirely in paint space - we can compute the
|
||||
* combination of the model-view matrix with the local matrix for each child
|
||||
* actor and get a total transformation for that actor for how we are
|
||||
* painting currently, and never worry about how actors are positioned
|
||||
* on the stage.
|
||||
*/
|
||||
if (!painting_untransformed (window_group, &paint_x_origin, &paint_y_origin) ||
|
||||
!actor_is_untransformed (actor, &actor_x_origin, &actor_y_origin))
|
||||
{
|
||||
CLUTTER_ACTOR_CLASS (meta_window_group_parent_class)->paint (actor);
|
||||
return;
|
||||
}
|
||||
|
||||
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
|
||||
@ -117,53 +222,65 @@ meta_window_group_paint (ClutterActor *actor)
|
||||
children = clutter_container_get_children (CLUTTER_CONTAINER (actor));
|
||||
children = g_list_reverse (children);
|
||||
|
||||
/* Start off with the full screen area (for a multihead setup, we
|
||||
* might want to use a more accurate union of the monitors to avoid
|
||||
* painting in holes from mismatched monitor sizes. That's just an
|
||||
* optimization, however.)
|
||||
*/
|
||||
meta_screen_get_size (window_group->screen, &screen_rect.width, &screen_rect.height);
|
||||
/* 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
|
||||
* frame. In the case of a multihead setup with mismatched monitor
|
||||
* 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);
|
||||
|
||||
/* When doing a partial stage paint, Clutter will set the GL scissor
|
||||
* box to the clip rectangle for the partial repaint. We combine the screen
|
||||
* rectangle with the scissor box to get the region we need to
|
||||
* paint. (Strangely, the scissor box sometimes seems to be bigger
|
||||
* than the stage ... Clutter should probably be clampimg)
|
||||
*/
|
||||
glGetBooleanv (GL_SCISSOR_TEST, &scissor_test);
|
||||
visible_region = cairo_region_create_rectangle (&visible_rect);
|
||||
|
||||
if (scissor_test)
|
||||
if (info->unredirected_window != NULL)
|
||||
{
|
||||
GLint scissor_box[4];
|
||||
glGetIntegerv (GL_SCISSOR_BOX, scissor_box);
|
||||
cairo_rectangle_int_t unredirected_rect;
|
||||
MetaWindow *window = meta_window_actor_get_meta_window (info->unredirected_window);
|
||||
|
||||
scissor_rect.x = scissor_box[0];
|
||||
scissor_rect.y = screen_rect.height - (scissor_box[1] + scissor_box[3]);
|
||||
scissor_rect.width = scissor_box[2];
|
||||
scissor_rect.height = scissor_box[3];
|
||||
|
||||
gdk_rectangle_intersect (&scissor_rect, &screen_rect, &scissor_rect);
|
||||
meta_window_get_outer_rect (window, (MetaRectangle *)&unredirected_rect);
|
||||
cairo_region_subtract_rectangle (visible_region, &unredirected_rect);
|
||||
}
|
||||
else
|
||||
{
|
||||
scissor_rect = screen_rect;
|
||||
}
|
||||
|
||||
visible_region = cairo_region_create_rectangle (&scissor_rect);
|
||||
|
||||
for (l = children; l; l = l->next)
|
||||
{
|
||||
if (!CLUTTER_ACTOR_IS_VISIBLE (l->data))
|
||||
continue;
|
||||
|
||||
if (l->data == info->unredirected_window)
|
||||
continue;
|
||||
|
||||
/* If an actor has effects applied, then that can change the area
|
||||
* it paints and the opacity, so we no longer can figure out what
|
||||
* portion of the actor is obscured and what portion of the screen
|
||||
* it obscures, so we skip the actor.
|
||||
*
|
||||
* This has a secondary beneficial effect: if a ClutterOffscreenEffect
|
||||
* is applied to an actor, then our clipped redraws interfere with the
|
||||
* caching of the FBO - even if we only need to draw a small portion
|
||||
* of the window right now, ClutterOffscreenEffect may use other portions
|
||||
* of the FBO later. So, skipping actors with effects applied also
|
||||
* prevents these bugs.
|
||||
*
|
||||
* Theoretically, we should check clutter_actor_get_offscreen_redirect()
|
||||
* as well for the same reason, but omitted for simplicity in the
|
||||
* hopes that no-one will do that.
|
||||
*/
|
||||
if (clutter_actor_has_effects (l->data))
|
||||
continue;
|
||||
|
||||
if (META_IS_WINDOW_ACTOR (l->data))
|
||||
{
|
||||
MetaWindowActor *window_actor = l->data;
|
||||
gboolean x, y;
|
||||
int x, y;
|
||||
|
||||
if (!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);
|
||||
|
||||
@ -182,7 +299,17 @@ meta_window_group_paint (ClutterActor *actor)
|
||||
else if (META_IS_BACKGROUND_ACTOR (l->data))
|
||||
{
|
||||
MetaBackgroundActor *background_actor = l->data;
|
||||
int x, y;
|
||||
|
||||
if (!actor_is_untransformed (CLUTTER_ACTOR (background_actor), &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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -198,7 +325,6 @@ meta_window_group_paint (ClutterActor *actor)
|
||||
if (META_IS_WINDOW_ACTOR (l->data))
|
||||
{
|
||||
MetaWindowActor *window_actor = l->data;
|
||||
window_actor = l->data;
|
||||
meta_window_actor_reset_visible_regions (window_actor);
|
||||
}
|
||||
else if (META_IS_BACKGROUND_ACTOR (l->data))
|
||||
|
@ -16,3 +16,9 @@ pkglib_LTLIBRARIES = default.la
|
||||
install-exec-hook:
|
||||
-rm $(DESTDIR)$(pkglibdir)/*.a
|
||||
-rm $(DESTDIR)$(pkglibdir)/*.la
|
||||
|
||||
# Since we removed the .la file, 'make uninstall' doesn't work properly,
|
||||
# since it counts on libtool to remove the .la files, so just kill the
|
||||
# .so file manually.
|
||||
uninstall-local:
|
||||
-rm -f $(DESTDIR)$(pkglibdir)/default.so
|
||||
|
@ -112,8 +112,6 @@ struct _MetaDefaultPluginPrivate
|
||||
ClutterActor *desktop2;
|
||||
|
||||
MetaPluginInfo info;
|
||||
|
||||
gboolean debug_mode : 1;
|
||||
};
|
||||
|
||||
/*
|
||||
@ -182,34 +180,6 @@ meta_default_plugin_get_property (GObject *object,
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
start (MetaPlugin *plugin)
|
||||
{
|
||||
MetaDefaultPluginPrivate *priv = META_DEFAULT_PLUGIN (plugin)->priv;
|
||||
|
||||
guint destroy_timeout = DESTROY_TIMEOUT;
|
||||
guint minimize_timeout = MINIMIZE_TIMEOUT;
|
||||
guint maximize_timeout = MAXIMIZE_TIMEOUT;
|
||||
guint map_timeout = MAP_TIMEOUT;
|
||||
guint switch_timeout = SWITCH_TIMEOUT;
|
||||
|
||||
if (meta_plugin_debug_mode (plugin))
|
||||
{
|
||||
g_debug ("Plugin %s: Entering debug mode.", priv->info.name);
|
||||
|
||||
priv->debug_mode = TRUE;
|
||||
|
||||
/*
|
||||
* Double the effect duration to make them easier to observe.
|
||||
*/
|
||||
destroy_timeout *= 2;
|
||||
minimize_timeout *= 2;
|
||||
maximize_timeout *= 2;
|
||||
map_timeout *= 2;
|
||||
switch_timeout *= 2;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
meta_default_plugin_class_init (MetaDefaultPluginClass *klass)
|
||||
{
|
||||
@ -221,7 +191,6 @@ 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;
|
||||
@ -284,7 +253,8 @@ on_switch_workspace_effect_complete (ClutterTimeline *timeline, gpointer data)
|
||||
{
|
||||
MetaPlugin *plugin = META_PLUGIN (data);
|
||||
MetaDefaultPluginPrivate *priv = META_DEFAULT_PLUGIN (plugin)->priv;
|
||||
GList *l = meta_plugin_get_window_actors (plugin);
|
||||
MetaScreen *screen = meta_plugin_get_screen (plugin);
|
||||
GList *l = meta_get_window_actors (screen);
|
||||
|
||||
while (l)
|
||||
{
|
||||
@ -317,6 +287,7 @@ switch_workspace (MetaPlugin *plugin,
|
||||
gint from, gint to,
|
||||
MetaMotionDirection direction)
|
||||
{
|
||||
MetaScreen *screen;
|
||||
MetaDefaultPluginPrivate *priv = META_DEFAULT_PLUGIN (plugin)->priv;
|
||||
GList *l;
|
||||
ClutterActor *workspace0 = clutter_group_new ();
|
||||
@ -325,11 +296,13 @@ switch_workspace (MetaPlugin *plugin,
|
||||
int screen_width, screen_height;
|
||||
ClutterAnimation *animation;
|
||||
|
||||
stage = meta_plugin_get_stage (plugin);
|
||||
screen = meta_plugin_get_screen (plugin);
|
||||
stage = meta_get_stage_for_screen (screen);
|
||||
|
||||
meta_screen_get_size (screen,
|
||||
&screen_width,
|
||||
&screen_height);
|
||||
|
||||
meta_plugin_query_screen_size (plugin,
|
||||
&screen_width,
|
||||
&screen_height);
|
||||
clutter_actor_set_anchor_point (workspace1,
|
||||
screen_width,
|
||||
screen_height);
|
||||
@ -348,7 +321,7 @@ switch_workspace (MetaPlugin *plugin,
|
||||
return;
|
||||
}
|
||||
|
||||
l = g_list_last (meta_plugin_get_window_actors (plugin));
|
||||
l = g_list_last (meta_get_window_actors (screen));
|
||||
|
||||
while (l)
|
||||
{
|
||||
@ -446,12 +419,19 @@ static void
|
||||
minimize (MetaPlugin *plugin, MetaWindowActor *window_actor)
|
||||
{
|
||||
MetaWindowType type;
|
||||
MetaRectangle icon_geometry;
|
||||
MetaWindow *meta_window = meta_window_actor_get_meta_window (window_actor);
|
||||
ClutterActor *actor = CLUTTER_ACTOR (window_actor);
|
||||
|
||||
|
||||
type = meta_window_get_window_type (meta_window);
|
||||
|
||||
if (!meta_window_get_icon_geometry(meta_window, &icon_geometry))
|
||||
{
|
||||
icon_geometry.x = 0;
|
||||
icon_geometry.y = 0;
|
||||
}
|
||||
|
||||
if (type == META_WINDOW_NORMAL)
|
||||
{
|
||||
ClutterAnimation *animation;
|
||||
@ -468,6 +448,8 @@ minimize (MetaPlugin *plugin, MetaWindowActor *window_actor)
|
||||
MINIMIZE_TIMEOUT,
|
||||
"scale-x", 0.0,
|
||||
"scale-y", 0.0,
|
||||
"x", (double)icon_geometry.x,
|
||||
"y", (double)icon_geometry.y,
|
||||
NULL);
|
||||
apriv->tml_minimize = clutter_animation_get_timeline (animation);
|
||||
data->plugin = plugin;
|
||||
|
@ -43,34 +43,17 @@
|
||||
/* Optimium performance seems to be with MAX_CHUNK_RECTANGLES=4; 8 is about 10% slower.
|
||||
* But using 8 may be more robust to systems with slow malloc(). */
|
||||
#define MAX_CHUNK_RECTANGLES 8
|
||||
#define MAX_LEVELS 16
|
||||
|
||||
typedef struct
|
||||
{
|
||||
/* To merge regions in binary tree order, we need to keep track of
|
||||
* the regions that we've already merged together at different
|
||||
* levels of the tree. We fill in an array in the pattern:
|
||||
*
|
||||
* |a |
|
||||
* |b |a |
|
||||
* |c | |ab |
|
||||
* |d |c |ab |
|
||||
* |e | | |abcd|
|
||||
*/
|
||||
cairo_region_t *levels[MAX_LEVELS];
|
||||
int n_levels;
|
||||
} MetaRegionBuilder;
|
||||
|
||||
static void
|
||||
void
|
||||
meta_region_builder_init (MetaRegionBuilder *builder)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < MAX_LEVELS; i++)
|
||||
for (i = 0; i < META_REGION_BUILDER_MAX_LEVELS; i++)
|
||||
builder->levels[i] = NULL;
|
||||
builder->n_levels = 1;
|
||||
}
|
||||
|
||||
static void
|
||||
void
|
||||
meta_region_builder_add_rectangle (MetaRegionBuilder *builder,
|
||||
int x,
|
||||
int y,
|
||||
@ -95,7 +78,7 @@ meta_region_builder_add_rectangle (MetaRegionBuilder *builder,
|
||||
{
|
||||
if (builder->levels[i] == NULL)
|
||||
{
|
||||
if (i < MAX_LEVELS)
|
||||
if (i < META_REGION_BUILDER_MAX_LEVELS)
|
||||
{
|
||||
builder->levels[i] = builder->levels[i - 1];
|
||||
builder->levels[i - 1] = NULL;
|
||||
@ -115,7 +98,7 @@ meta_region_builder_add_rectangle (MetaRegionBuilder *builder,
|
||||
}
|
||||
}
|
||||
|
||||
static cairo_region_t *
|
||||
cairo_region_t *
|
||||
meta_region_builder_finish (MetaRegionBuilder *builder)
|
||||
{
|
||||
cairo_region_t *result = NULL;
|
||||
|
@ -63,6 +63,32 @@ struct _MetaRegionIterator {
|
||||
cairo_rectangle_int_t next_rectangle;
|
||||
};
|
||||
|
||||
typedef struct _MetaRegionBuilder MetaRegionBuilder;
|
||||
|
||||
#define META_REGION_BUILDER_MAX_LEVELS 16
|
||||
struct _MetaRegionBuilder {
|
||||
/* To merge regions in binary tree order, we need to keep track of
|
||||
* the regions that we've already merged together at different
|
||||
* levels of the tree. We fill in an array in the pattern:
|
||||
*
|
||||
* |a |
|
||||
* |b |a |
|
||||
* |c | |ab |
|
||||
* |d |c |ab |
|
||||
* |e | | |abcd|
|
||||
*/
|
||||
cairo_region_t *levels[META_REGION_BUILDER_MAX_LEVELS];
|
||||
int n_levels;
|
||||
};
|
||||
|
||||
void meta_region_builder_init (MetaRegionBuilder *builder);
|
||||
void meta_region_builder_add_rectangle (MetaRegionBuilder *builder,
|
||||
int x,
|
||||
int y,
|
||||
int width,
|
||||
int height);
|
||||
cairo_region_t * meta_region_builder_finish (MetaRegionBuilder *builder);
|
||||
|
||||
void meta_region_iterator_init (MetaRegionIterator *iter,
|
||||
cairo_region_t *region);
|
||||
gboolean meta_region_iterator_at_end (MetaRegionIterator *iter);
|
||||
|
@ -1,400 +0,0 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/*
|
||||
* Copyright (C) 2008 Thomas Thurman
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/**
|
||||
* A list of screen keybinding information.
|
||||
*
|
||||
* Each action which can have a keystroke bound to it is listed below.
|
||||
* To use this file, define keybind() to be a seven-argument macro (you can
|
||||
* throw any of the arguments you please away), include this file,
|
||||
* and then undefine the macro again.
|
||||
*
|
||||
* (If you aren't familiar with this technique, sometimes called "x-macros",
|
||||
* see DDJ of May 2001: <http://www.ddj.com/cpp/184401387>.)
|
||||
*
|
||||
* This makes it possible to keep all information about all the keybindings
|
||||
* in the same place. The only exception is the code to run when an action
|
||||
* is actually invoked; while we *could* have put that in this file, it would
|
||||
* have made debugging ridiculously difficult. Instead, each action should
|
||||
* have a corresponding static function named handle_<name>() in
|
||||
* keybindings.c.
|
||||
*
|
||||
* The arguments to keybind() are:
|
||||
* 1) the name of the binding; a bareword identifier
|
||||
* (it's fine if it happens to clash with a C reserved word)
|
||||
* 2) the name of the function which implements it.
|
||||
* Clearly we could have guessed this from the binding very often,
|
||||
* but we choose to write it in full for the benefit of grep.
|
||||
* 3) an integer parameter to pass to the handler
|
||||
* 4) a set of boolean flags, ORed together:
|
||||
* BINDING_PER_WINDOW - this is a window-based binding.
|
||||
* It is only valid if there is a
|
||||
* current window, and will operate in
|
||||
* some way on that window.
|
||||
* BINDING_REVERSES - the binding can reverse if you hold down Shift
|
||||
* BINDING_IS_REVERSED - the same, but the senses are reversed from the
|
||||
* handler's point of view (let me know if I should
|
||||
* explain this better)
|
||||
* or 0 if no flag applies.
|
||||
*
|
||||
* 5) a string representing the default binding.
|
||||
* If this is NULL, the action is unbound by default.
|
||||
* Please use NULL and not "disabled".
|
||||
* 6) a short description.
|
||||
* It must be marked translatable (i.e. inside "_(...)").
|
||||
*
|
||||
* Don't try to do XML entity escaping anywhere in the strings.
|
||||
*/
|
||||
|
||||
#ifndef keybind
|
||||
#error "keybind () must be defined when you include screen-bindings.h"
|
||||
#endif
|
||||
|
||||
/***********************************/
|
||||
|
||||
#ifndef _BINDINGS_DEFINED_CONSTANTS
|
||||
#define _BINDINGS_DEFINED_CONSTANTS 1
|
||||
|
||||
#define BINDING_PER_WINDOW 0x01
|
||||
#define BINDING_REVERSES 0x02
|
||||
#define BINDING_IS_REVERSED 0x04
|
||||
|
||||
#endif /* _BINDINGS_DEFINED_CONSTANTS */
|
||||
|
||||
/***********************************/
|
||||
|
||||
/* convenience, since in this file they must always be set together */
|
||||
#define REVERSES_AND_REVERSED (BINDING_REVERSES | BINDING_IS_REVERSED)
|
||||
|
||||
keybind (switch_to_workspace_1, handle_switch_to_workspace, 0, 0, NULL,
|
||||
_("Switch to workspace 1"))
|
||||
keybind (switch_to_workspace_2, handle_switch_to_workspace, 1, 0, NULL,
|
||||
_("Switch to workspace 2"))
|
||||
keybind (switch_to_workspace_3, handle_switch_to_workspace, 2, 0, NULL,
|
||||
_("Switch to workspace 3"))
|
||||
keybind (switch_to_workspace_4, handle_switch_to_workspace, 3, 0, NULL,
|
||||
_("Switch to workspace 4"))
|
||||
keybind (switch_to_workspace_5, handle_switch_to_workspace, 4, 0, NULL,
|
||||
_("Switch to workspace 5"))
|
||||
keybind (switch_to_workspace_6, handle_switch_to_workspace, 5, 0, NULL,
|
||||
_("Switch to workspace 6"))
|
||||
keybind (switch_to_workspace_7, handle_switch_to_workspace, 6, 0, NULL,
|
||||
_("Switch to workspace 7"))
|
||||
keybind (switch_to_workspace_8, handle_switch_to_workspace, 7, 0, NULL,
|
||||
_("Switch to workspace 8"))
|
||||
keybind (switch_to_workspace_9, handle_switch_to_workspace, 8, 0, NULL,
|
||||
_("Switch to workspace 9"))
|
||||
keybind (switch_to_workspace_10, handle_switch_to_workspace, 9, 0, NULL,
|
||||
_("Switch to workspace 10"))
|
||||
keybind (switch_to_workspace_11, handle_switch_to_workspace, 10, 0, NULL,
|
||||
_("Switch to workspace 11"))
|
||||
keybind (switch_to_workspace_12, handle_switch_to_workspace, 11, 0, NULL,
|
||||
_("Switch to workspace 12"))
|
||||
|
||||
/* META_MOTION_* are negative, and so distinct from workspace numbers,
|
||||
* which are always zero or positive.
|
||||
* If you make use of these constants, you will need to include workspace.h
|
||||
* (which you're probably using already for other reasons anyway).
|
||||
* If your definition of keybind() throws them away, you don't need to include
|
||||
* workspace.h, of course.
|
||||
*/
|
||||
|
||||
keybind (switch_to_workspace_left, handle_switch_to_workspace,
|
||||
META_MOTION_LEFT, 0, "<Control><Alt>Left",
|
||||
_("Switch to workspace on the left of the current workspace"))
|
||||
|
||||
keybind (switch_to_workspace_right, handle_switch_to_workspace,
|
||||
META_MOTION_RIGHT, 0, "<Control><Alt>Right",
|
||||
_("Switch to workspace on the right of the current workspace"))
|
||||
|
||||
keybind (switch_to_workspace_up, handle_switch_to_workspace,
|
||||
META_MOTION_UP, 0, "<Control><Alt>Up",
|
||||
_("Switch to workspace above the current workspace"))
|
||||
|
||||
keybind (switch_to_workspace_down, handle_switch_to_workspace,
|
||||
META_MOTION_DOWN, 0, "<Control><Alt>Down",
|
||||
_("Switch to workspace below the current workspace"))
|
||||
|
||||
/***********************************/
|
||||
|
||||
/* The ones which have inverses. These can't be bound to any keystroke
|
||||
* containing Shift because Shift will invert their "backward" state.
|
||||
*
|
||||
* TODO: "NORMAL" and "DOCKS" should be renamed to the same name as their
|
||||
* action, for obviousness.
|
||||
*
|
||||
* TODO: handle_switch and handle_cycle should probably really be the
|
||||
* same function checking a bit in the parameter for difference.
|
||||
*/
|
||||
|
||||
keybind (switch_group, handle_switch, META_TAB_LIST_GROUP,
|
||||
BINDING_REVERSES, "<Alt>Above_Tab",
|
||||
_("Move between windows of an application, using a popup window"))
|
||||
keybind (switch_group_backward, handle_switch, META_TAB_LIST_GROUP,
|
||||
REVERSES_AND_REVERSED, NULL,
|
||||
_("Move backward between windows of an application, "
|
||||
"using a popup window"))
|
||||
keybind (switch_windows, handle_switch, META_TAB_LIST_NORMAL,
|
||||
BINDING_REVERSES, "<Alt>Tab",
|
||||
_("Move between windows, using a popup window"))
|
||||
keybind (switch_windows_backward, handle_switch, META_TAB_LIST_NORMAL,
|
||||
REVERSES_AND_REVERSED, NULL,
|
||||
_("Move backward between windows, using a popup window"))
|
||||
keybind (switch_panels, handle_switch, META_TAB_LIST_DOCKS,
|
||||
BINDING_REVERSES, "<Control><Alt>Tab",
|
||||
_("Move between panels and the desktop, using a popup window"))
|
||||
keybind (switch_panels_backward, handle_switch, META_TAB_LIST_DOCKS,
|
||||
REVERSES_AND_REVERSED, NULL,
|
||||
_("Move backward between panels and the desktop, "
|
||||
"using a popup window"))
|
||||
|
||||
keybind (cycle_group, handle_cycle, META_TAB_LIST_GROUP,
|
||||
BINDING_REVERSES, "<Alt>F6",
|
||||
_("Move between windows of an application immediately"))
|
||||
keybind (cycle_group_backward, handle_cycle, META_TAB_LIST_GROUP,
|
||||
REVERSES_AND_REVERSED, NULL,
|
||||
_("Move backward between windows of an application immediately"))
|
||||
keybind (cycle_windows, handle_cycle, META_TAB_LIST_NORMAL,
|
||||
BINDING_REVERSES, "<Alt>Escape",
|
||||
_("Move between windows immediately"))
|
||||
keybind (cycle_windows_backward, handle_cycle, META_TAB_LIST_NORMAL,
|
||||
REVERSES_AND_REVERSED, NULL,
|
||||
_("Move backward between windows immediately"))
|
||||
keybind (cycle_panels, handle_cycle, META_TAB_LIST_DOCKS,
|
||||
BINDING_REVERSES, "<Control><Alt>Escape",
|
||||
_("Move between panels and the desktop immediately"))
|
||||
keybind (cycle_panels_backward, handle_cycle, META_TAB_LIST_DOCKS,
|
||||
REVERSES_AND_REVERSED, NULL,
|
||||
_("Move backward between panels and the desktop immediately"))
|
||||
|
||||
/***********************************/
|
||||
|
||||
/* These two are special pseudo-bindings that are provided for allowing
|
||||
* custom handlers, but will never be bound to a key. While a tab
|
||||
* grab is in effect, they are invoked for releasing the primary modifier
|
||||
* or pressing some unbound key, respectively.
|
||||
*/
|
||||
keybind (tab_popup_select, handle_tab_popup_select, 0, 0, NULL,
|
||||
"Select window from tab popup")
|
||||
keybind (tab_popup_cancel, handle_tab_popup_cancel, 0, 0, NULL,
|
||||
"Cancel tab popup")
|
||||
|
||||
/***********************************/
|
||||
|
||||
keybind (show_desktop, handle_show_desktop, 0, 0, "<Control><Alt>d",
|
||||
_("Hide all normal windows and set focus to the desktop"))
|
||||
keybind (panel_main_menu, handle_panel,
|
||||
META_KEYBINDING_ACTION_PANEL_MAIN_MENU, 0, "<Alt>F1",
|
||||
_("Show the panel's main menu"))
|
||||
keybind (panel_run_dialog, handle_panel,
|
||||
META_KEYBINDING_ACTION_PANEL_RUN_DIALOG, 0, "<Alt>F2",
|
||||
_("Show the panel's \"Run Application\" dialog box"))
|
||||
keybind (toggle_recording, handle_toggle_recording, 0, 0, "<Control><Shift><Alt>r",
|
||||
_("Start or stop recording the session"))
|
||||
|
||||
/* Yes, the param is offset by one. Historical reasons. (Maybe worth fixing
|
||||
* at some point.) The description is NULL here because the stanza is
|
||||
* irregularly shaped in mutter.schemas.in. This will probably be fixed
|
||||
* as well.
|
||||
*/
|
||||
keybind (run_command_1, handle_run_command, 0, 0, NULL, NULL)
|
||||
keybind (run_command_2, handle_run_command, 1, 0, NULL, NULL)
|
||||
keybind (run_command_3, handle_run_command, 2, 0, NULL, NULL)
|
||||
keybind (run_command_4, handle_run_command, 3, 0, NULL, NULL)
|
||||
keybind (run_command_5, handle_run_command, 4, 0, NULL, NULL)
|
||||
keybind (run_command_6, handle_run_command, 5, 0, NULL, NULL)
|
||||
keybind (run_command_7, handle_run_command, 6, 0, NULL, NULL)
|
||||
keybind (run_command_8, handle_run_command, 7, 0, NULL, NULL)
|
||||
keybind (run_command_9, handle_run_command, 8, 0, NULL, NULL)
|
||||
keybind (run_command_10, handle_run_command, 9, 0, NULL, NULL)
|
||||
keybind (run_command_11, handle_run_command, 10, 0, NULL, NULL)
|
||||
keybind (run_command_12, handle_run_command, 11, 0, NULL, NULL)
|
||||
keybind (run_command_13, handle_run_command, 12, 0, NULL, NULL)
|
||||
keybind (run_command_14, handle_run_command, 13, 0, NULL, NULL)
|
||||
keybind (run_command_15, handle_run_command, 14, 0, NULL, NULL)
|
||||
keybind (run_command_16, handle_run_command, 15, 0, NULL, NULL)
|
||||
keybind (run_command_17, handle_run_command, 16, 0, NULL, NULL)
|
||||
keybind (run_command_18, handle_run_command, 17, 0, NULL, NULL)
|
||||
keybind (run_command_19, handle_run_command, 18, 0, NULL, NULL)
|
||||
keybind (run_command_20, handle_run_command, 19, 0, NULL, NULL)
|
||||
keybind (run_command_21, handle_run_command, 20, 0, NULL, NULL)
|
||||
keybind (run_command_22, handle_run_command, 21, 0, NULL, NULL)
|
||||
keybind (run_command_23, handle_run_command, 22, 0, NULL, NULL)
|
||||
keybind (run_command_24, handle_run_command, 23, 0, NULL, NULL)
|
||||
keybind (run_command_25, handle_run_command, 24, 0, NULL, NULL)
|
||||
keybind (run_command_26, handle_run_command, 25, 0, NULL, NULL)
|
||||
keybind (run_command_27, handle_run_command, 26, 0, NULL, NULL)
|
||||
keybind (run_command_28, handle_run_command, 27, 0, NULL, NULL)
|
||||
keybind (run_command_29, handle_run_command, 28, 0, NULL, NULL)
|
||||
keybind (run_command_30, handle_run_command, 29, 0, NULL, NULL)
|
||||
keybind (run_command_31, handle_run_command, 30, 0, NULL, NULL)
|
||||
keybind (run_command_32, handle_run_command, 31, 0, NULL, NULL)
|
||||
|
||||
keybind (run_command_screenshot, handle_run_command, 32, 0, "Print",
|
||||
_("Take a screenshot"))
|
||||
keybind (run_command_window_screenshot, handle_run_command, 33, 0,"<Alt>Print",
|
||||
_("Take a screenshot of a window"))
|
||||
|
||||
keybind (run_command_terminal, handle_run_terminal, 0, 0, NULL, _("Run a terminal"))
|
||||
|
||||
/* No description because this is undocumented */
|
||||
keybind (set_spew_mark, handle_set_spew_mark, 0, 0, NULL, NULL)
|
||||
|
||||
#undef REVERSES_AND_REVERSED
|
||||
|
||||
/************************ PER WINDOW BINDINGS ************************/
|
||||
|
||||
/* These take a window as an extra parameter; they have no effect
|
||||
* if no window is active.
|
||||
*/
|
||||
|
||||
keybind (activate_window_menu, handle_activate_window_menu, 0,
|
||||
BINDING_PER_WINDOW, "<Alt>space",
|
||||
_("Activate the window menu"))
|
||||
keybind (toggle_fullscreen, handle_toggle_fullscreen, 0, BINDING_PER_WINDOW,
|
||||
NULL,
|
||||
_("Toggle fullscreen mode"))
|
||||
keybind (toggle_maximized, handle_toggle_maximized, 0, BINDING_PER_WINDOW, "<Alt>F10",
|
||||
_("Toggle maximization state"))
|
||||
keybind (toggle_above, handle_toggle_above, 0, BINDING_PER_WINDOW, NULL,
|
||||
_("Toggle whether a window will always be visible over other windows"))
|
||||
keybind (maximize, handle_maximize, 0, BINDING_PER_WINDOW, NULL,
|
||||
_("Maximize window"))
|
||||
keybind (unmaximize, handle_unmaximize, 0, BINDING_PER_WINDOW, "<Alt>F5",
|
||||
_("Restore window"))
|
||||
keybind (toggle_shaded, handle_toggle_shaded, 0, BINDING_PER_WINDOW, NULL,
|
||||
_("Toggle shaded state"))
|
||||
keybind (minimize, handle_minimize, 0, BINDING_PER_WINDOW, "<Alt>F9",
|
||||
_("Minimize window"))
|
||||
keybind (close, handle_close, 0, BINDING_PER_WINDOW, "<Alt>F4",
|
||||
_("Close window"))
|
||||
keybind (begin_move, handle_begin_move, 0, BINDING_PER_WINDOW, "<Alt>F7",
|
||||
_("Move window"))
|
||||
keybind (begin_resize, handle_begin_resize, 0, BINDING_PER_WINDOW, "<Alt>F8",
|
||||
_("Resize window"))
|
||||
keybind (toggle_on_all_workspaces, handle_toggle_on_all_workspaces, 0,
|
||||
BINDING_PER_WINDOW, NULL,
|
||||
_("Toggle whether window is on all workspaces or just one"))
|
||||
|
||||
keybind (move_to_workspace_1, handle_move_to_workspace, 0, BINDING_PER_WINDOW,
|
||||
NULL,
|
||||
_("Move window to workspace 1"))
|
||||
keybind (move_to_workspace_2, handle_move_to_workspace, 1, BINDING_PER_WINDOW,
|
||||
NULL,
|
||||
_("Move window to workspace 2"))
|
||||
keybind (move_to_workspace_3, handle_move_to_workspace, 2, BINDING_PER_WINDOW,
|
||||
NULL,
|
||||
_("Move window to workspace 3"))
|
||||
keybind (move_to_workspace_4, handle_move_to_workspace, 3, BINDING_PER_WINDOW,
|
||||
NULL,
|
||||
_("Move window to workspace 4"))
|
||||
keybind (move_to_workspace_5, handle_move_to_workspace, 4, BINDING_PER_WINDOW,
|
||||
NULL,
|
||||
_("Move window to workspace 5"))
|
||||
keybind (move_to_workspace_6, handle_move_to_workspace, 5, BINDING_PER_WINDOW,
|
||||
NULL,
|
||||
_("Move window to workspace 6"))
|
||||
keybind (move_to_workspace_7, handle_move_to_workspace, 6, BINDING_PER_WINDOW,
|
||||
NULL,
|
||||
_("Move window to workspace 7"))
|
||||
keybind (move_to_workspace_8, handle_move_to_workspace, 7, BINDING_PER_WINDOW,
|
||||
NULL,
|
||||
_("Move window to workspace 8"))
|
||||
keybind (move_to_workspace_9, handle_move_to_workspace, 8, BINDING_PER_WINDOW,
|
||||
NULL,
|
||||
_("Move window to workspace 9"))
|
||||
keybind (move_to_workspace_10, handle_move_to_workspace, 9, BINDING_PER_WINDOW,
|
||||
NULL,
|
||||
_("Move window to workspace 10"))
|
||||
keybind (move_to_workspace_11, handle_move_to_workspace, 10, BINDING_PER_WINDOW,
|
||||
NULL,
|
||||
_("Move window to workspace 11"))
|
||||
keybind (move_to_workspace_12, handle_move_to_workspace, 11, BINDING_PER_WINDOW,
|
||||
NULL,
|
||||
_("Move window to workspace 12"))
|
||||
|
||||
/* META_MOTION_* are negative, and so distinct from workspace numbers,
|
||||
* which are always zero or positive.
|
||||
* If you make use of these constants, you will need to include workspace.h
|
||||
* (which you're probably using already for other reasons anyway).
|
||||
* If your definition of keybind() throws them away, you don't need to include
|
||||
* workspace.h, of course.
|
||||
*/
|
||||
|
||||
keybind (move_to_workspace_left, handle_move_to_workspace,
|
||||
META_MOTION_LEFT, BINDING_PER_WINDOW, "<Control><Shift><Alt>Left",
|
||||
_("Move window one workspace to the left"))
|
||||
keybind (move_to_workspace_right, handle_move_to_workspace,
|
||||
META_MOTION_RIGHT, BINDING_PER_WINDOW, "<Control><Shift><Alt>Right",
|
||||
_("Move window one workspace to the right"))
|
||||
keybind (move_to_workspace_up, handle_move_to_workspace,
|
||||
META_MOTION_UP, BINDING_PER_WINDOW, "<Control><Shift><Alt>Up",
|
||||
_("Move window one workspace up"))
|
||||
keybind (move_to_workspace_down, handle_move_to_workspace,
|
||||
META_MOTION_DOWN, BINDING_PER_WINDOW, "<Control><Shift><Alt>Down",
|
||||
_("Move window one workspace down"))
|
||||
|
||||
keybind (raise_or_lower, handle_raise_or_lower, 0, BINDING_PER_WINDOW, NULL,
|
||||
_("Raise window if it's covered by another window, otherwise lower it"))
|
||||
keybind (raise, handle_raise, 0, BINDING_PER_WINDOW, NULL,
|
||||
_("Raise window above other windows"))
|
||||
keybind (lower, handle_lower, 0, BINDING_PER_WINDOW, NULL,
|
||||
_("Lower window below other windows"))
|
||||
|
||||
keybind (maximize_vertically, handle_maximize_vertically, 0,
|
||||
BINDING_PER_WINDOW, NULL,
|
||||
_("Maximize window vertically"))
|
||||
|
||||
keybind (maximize_horizontally, handle_maximize_horizontally, 0,
|
||||
BINDING_PER_WINDOW, NULL,
|
||||
_("Maximize window horizontally"))
|
||||
|
||||
keybind (move_to_corner_nw, handle_move_to_corner_nw, 0,
|
||||
BINDING_PER_WINDOW, NULL,
|
||||
_("Move window to north-west (top left) corner"))
|
||||
keybind (move_to_corner_ne, handle_move_to_corner_ne, 0,
|
||||
BINDING_PER_WINDOW, NULL,
|
||||
_("Move window to north-east (top right) corner"))
|
||||
keybind (move_to_corner_sw, handle_move_to_corner_sw, 0,
|
||||
BINDING_PER_WINDOW, NULL,
|
||||
_("Move window to south-west (bottom left) corner"))
|
||||
keybind (move_to_corner_se, handle_move_to_corner_se, 0,
|
||||
BINDING_PER_WINDOW, NULL,
|
||||
_("Move window to south-east (bottom right) corner"))
|
||||
|
||||
keybind (move_to_side_n, handle_move_to_side_n, 0,
|
||||
BINDING_PER_WINDOW, NULL,
|
||||
_("Move window to north (top) side of screen"))
|
||||
keybind (move_to_side_s, handle_move_to_side_s, 0,
|
||||
BINDING_PER_WINDOW, NULL,
|
||||
_("Move window to south (bottom) side of screen"))
|
||||
keybind (move_to_side_e, handle_move_to_side_e, 0,
|
||||
BINDING_PER_WINDOW, NULL,
|
||||
_("Move window to east (right) side of screen"))
|
||||
keybind (move_to_side_w, handle_move_to_side_w, 0,
|
||||
BINDING_PER_WINDOW, NULL,
|
||||
_("Move window to west (left) side of screen"))
|
||||
keybind (move_to_center, handle_move_to_center, 0,
|
||||
BINDING_PER_WINDOW, NULL,
|
||||
_("Move window to center of screen"))
|
||||
|
||||
/* eof all-keybindings.h */
|
||||
|
@ -23,7 +23,8 @@
|
||||
*/
|
||||
|
||||
/**
|
||||
* \file bell.c Ring the bell or flash the screen
|
||||
* SECTION:Bell
|
||||
* @short_description: Ring the bell or flash the screen
|
||||
*
|
||||
* Sometimes, X programs "ring the bell", whatever that means. Mutter lets
|
||||
* the user configure the bell to be audible or visible (aka visual), and
|
||||
@ -57,6 +58,10 @@
|
||||
#endif
|
||||
|
||||
/**
|
||||
* bell_flash_screen:
|
||||
* @display: The display which owns the screen (rather redundant)
|
||||
* @screen: The screen to flash
|
||||
*
|
||||
* Flashes one entire screen. This is done by making a window the size of the
|
||||
* whole screen (or reusing the old one, if it's still around), mapping it,
|
||||
* painting it white and then black, and then unmapping it. We set saveunder so
|
||||
@ -65,14 +70,12 @@
|
||||
* Unlike frame flashes, we don't do fullscreen flashes with a timeout; rather,
|
||||
* we do them in one go, because we don't have to rely on the theme code
|
||||
* redrawing the frame for us in order to do the flash.
|
||||
*
|
||||
* \param display The display which owns the screen (rather redundant)
|
||||
* \param screen The screen to flash
|
||||
*
|
||||
* \bug The way I read it, this appears not to do the flash
|
||||
*/
|
||||
/*
|
||||
* Bug: The way I read it, this appears not to do the flash
|
||||
* the first time we flash a particular display. Am I wrong?
|
||||
*
|
||||
* \bug This appears to destroy our current XSync status.
|
||||
* Bug: This appears to destroy our current XSync status.
|
||||
*/
|
||||
static void
|
||||
bell_flash_screen (MetaDisplay *display,
|
||||
@ -130,21 +133,22 @@ bell_flash_screen (MetaDisplay *display,
|
||||
XFreeGC (display->xdisplay, gc);
|
||||
}
|
||||
|
||||
if (meta_prefs_get_focus_mode () != META_FOCUS_MODE_CLICK &&
|
||||
if (meta_prefs_get_focus_mode () != G_DESKTOP_FOCUS_MODE_CLICK &&
|
||||
!display->mouse_mode)
|
||||
meta_display_increment_focus_sentinel (display);
|
||||
XFlush (display->xdisplay);
|
||||
}
|
||||
|
||||
/**
|
||||
* bell_flash_fullscreen:
|
||||
* @display: The display the event came in on
|
||||
* @xkb_ev: The bell event
|
||||
*
|
||||
* Flashes one screen, or all screens, in response to a bell event.
|
||||
* If the event is on a particular window, flash the screen that
|
||||
* window is on. Otherwise, flash every screen on this display.
|
||||
*
|
||||
* If the configure script found we had no XKB, this does not exist.
|
||||
*
|
||||
* \param display The display the event came in on
|
||||
* \param xkb_ev The bell event
|
||||
*/
|
||||
#ifdef HAVE_XKB
|
||||
static void
|
||||
@ -182,17 +186,21 @@ bell_flash_fullscreen (MetaDisplay *display,
|
||||
}
|
||||
|
||||
/**
|
||||
* bell_unflash_frame:
|
||||
* @data: The frame to unflash, cast to a gpointer so it can go into
|
||||
* a callback function.
|
||||
*
|
||||
* Makes a frame be not flashed; this is the timeout half of
|
||||
* bell_flash_window_frame(). This is done simply by clearing the
|
||||
* flash flag and queuing a redraw of the frame.
|
||||
*
|
||||
* If the configure script found we had no XKB, this does not exist.
|
||||
*
|
||||
* \param data The frame to unflash, cast to a gpointer so it can go into
|
||||
* a callback function.
|
||||
* \return Always FALSE, so we don't get called again.
|
||||
*
|
||||
* \bug This is the parallel to bell_flash_window_frame(), so it should
|
||||
* Returns: Always FALSE, so we don't get called again.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Bug: This is the parallel to bell_flash_window_frame(), so it should
|
||||
* really be called meta_bell_unflash_window_frame().
|
||||
*/
|
||||
static gboolean
|
||||
@ -205,6 +213,9 @@ bell_unflash_frame (gpointer data)
|
||||
}
|
||||
|
||||
/**
|
||||
* bell_flash_window_frame:
|
||||
* @window: The window to flash
|
||||
*
|
||||
* Makes a frame flash and then return to normal shortly afterwards.
|
||||
* This is done by setting a flag so that the theme
|
||||
* code will temporarily draw the frame as focussed if it's unfocussed and
|
||||
@ -212,8 +223,6 @@ bell_unflash_frame (gpointer data)
|
||||
* that the flag can be unset and the frame re-redrawn.
|
||||
*
|
||||
* If the configure script found we had no XKB, this does not exist.
|
||||
*
|
||||
* \param window The window to flash
|
||||
*/
|
||||
static void
|
||||
bell_flash_window_frame (MetaWindow *window)
|
||||
@ -231,11 +240,12 @@ bell_flash_window_frame (MetaWindow *window)
|
||||
}
|
||||
|
||||
/**
|
||||
* bell_flash_frame:
|
||||
* @display: The display the bell event came in on
|
||||
* @xkb_ev: The bell event we just received
|
||||
*
|
||||
* Flashes the frame of the focussed window. If there is no focussed window,
|
||||
* flashes the screen.
|
||||
*
|
||||
* \param display The display the bell event came in on
|
||||
* \param xkb_ev The bell event we just received
|
||||
*/
|
||||
static void
|
||||
bell_flash_frame (MetaDisplay *display,
|
||||
@ -261,15 +271,18 @@ bell_flash_frame (MetaDisplay *display,
|
||||
}
|
||||
|
||||
/**
|
||||
* bell_visual_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 substitute, in response to a
|
||||
* bell event. What this is depends on the "visual bell type" pref.
|
||||
*
|
||||
* 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
|
||||
*
|
||||
* \bug This should be merged with meta_bell_notify().
|
||||
*/
|
||||
|
||||
/*
|
||||
* Bug: This should be merged with meta_bell_notify().
|
||||
*/
|
||||
static void
|
||||
bell_visual_notify (MetaDisplay *display,
|
||||
@ -277,15 +290,12 @@ bell_visual_notify (MetaDisplay *display,
|
||||
{
|
||||
switch (meta_prefs_get_visual_bell_type ())
|
||||
{
|
||||
case META_VISUAL_BELL_FULLSCREEN_FLASH:
|
||||
case G_DESKTOP_VISUAL_BELL_FULLSCREEN_FLASH:
|
||||
bell_flash_fullscreen (display, xkb_ev);
|
||||
break;
|
||||
case META_VISUAL_BELL_FRAME_FLASH:
|
||||
case G_DESKTOP_VISUAL_BELL_FRAME_FLASH:
|
||||
bell_flash_frame (display, xkb_ev); /* does nothing yet */
|
||||
break;
|
||||
case META_VISUAL_BELL_INVALID:
|
||||
/* do nothing */
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -294,7 +304,7 @@ meta_bell_notify (MetaDisplay *display,
|
||||
XkbAnyEvent *xkb_ev)
|
||||
{
|
||||
/* flash something */
|
||||
if (meta_prefs_get_visual_bell ())
|
||||
if (meta_prefs_get_visual_bell ())
|
||||
bell_visual_notify (display, xkb_ev);
|
||||
|
||||
#ifdef HAVE_LIBCANBERRA
|
||||
@ -410,12 +420,13 @@ 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,17 +1,5 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/**
|
||||
* \file bell.h Ring the bell or flash the screen
|
||||
*
|
||||
* Sometimes, X programs "ring the bell", whatever that means. Mutter lets
|
||||
* the user configure the bell to be audible or visible (aka visual), and
|
||||
* if it's visual it can be configured to be frame-flash or fullscreen-flash.
|
||||
* We never get told about audible bells; X handles them just fine by itself.
|
||||
*
|
||||
* The visual bell was the result of a discussion in Bugzilla here:
|
||||
* <http://bugzilla.gnome.org/show_bug.cgi?id=99886>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2002 Sun Microsystems Inc.
|
||||
*
|
||||
|
@ -625,7 +625,6 @@ meta_rectangle_get_minimal_spanning_set_for_region (
|
||||
*temp_rect = *basic_rect;
|
||||
ret = g_list_prepend (NULL, temp_rect);
|
||||
|
||||
strut_iter = all_struts;
|
||||
for (strut_iter = all_struts; strut_iter; strut_iter = strut_iter->next)
|
||||
{
|
||||
GList *rect_iter;
|
||||
|
@ -118,7 +118,8 @@ typedef struct
|
||||
{
|
||||
MetaRectangle orig;
|
||||
MetaRectangle current;
|
||||
MetaFrameGeometry *fgeom;
|
||||
MetaFrameBorders *borders;
|
||||
gboolean must_free_borders;
|
||||
ActionType action_type;
|
||||
gboolean is_user_action;
|
||||
|
||||
@ -194,7 +195,7 @@ static gboolean constrain_partially_onscreen (MetaWindow *window,
|
||||
|
||||
static void setup_constraint_info (ConstraintInfo *info,
|
||||
MetaWindow *window,
|
||||
MetaFrameGeometry *orig_fgeom,
|
||||
MetaFrameBorders *orig_borders,
|
||||
MetaMoveResizeFlags flags,
|
||||
int resize_gravity,
|
||||
const MetaRectangle *orig,
|
||||
@ -204,11 +205,11 @@ static void place_window_if_needed (MetaWindow *window,
|
||||
static void update_onscreen_requirements (MetaWindow *window,
|
||||
ConstraintInfo *info);
|
||||
static void extend_by_frame (MetaRectangle *rect,
|
||||
const MetaFrameGeometry *fgeom);
|
||||
const MetaFrameBorders *borders);
|
||||
static void unextend_by_frame (MetaRectangle *rect,
|
||||
const MetaFrameGeometry *fgeom);
|
||||
const MetaFrameBorders *borders);
|
||||
static inline void get_size_limits (const MetaWindow *window,
|
||||
const MetaFrameGeometry *fgeom,
|
||||
const MetaFrameBorders *borders,
|
||||
gboolean include_frame,
|
||||
MetaRectangle *min_size,
|
||||
MetaRectangle *max_size);
|
||||
@ -279,7 +280,7 @@ do_all_constraints (MetaWindow *window,
|
||||
|
||||
void
|
||||
meta_window_constrain (MetaWindow *window,
|
||||
MetaFrameGeometry *orig_fgeom,
|
||||
MetaFrameBorders *orig_borders,
|
||||
MetaMoveResizeFlags flags,
|
||||
int resize_gravity,
|
||||
const MetaRectangle *orig,
|
||||
@ -302,7 +303,7 @@ meta_window_constrain (MetaWindow *window,
|
||||
|
||||
setup_constraint_info (&info,
|
||||
window,
|
||||
orig_fgeom,
|
||||
orig_borders,
|
||||
flags,
|
||||
resize_gravity,
|
||||
orig,
|
||||
@ -337,14 +338,14 @@ meta_window_constrain (MetaWindow *window,
|
||||
* not gobject-style--gobject would be more pain than it's worth) or
|
||||
* smart pointers would be so much nicer here. *shrug*
|
||||
*/
|
||||
if (!orig_fgeom)
|
||||
g_free (info.fgeom);
|
||||
if (info.must_free_borders)
|
||||
g_free (info.borders);
|
||||
}
|
||||
|
||||
static void
|
||||
setup_constraint_info (ConstraintInfo *info,
|
||||
MetaWindow *window,
|
||||
MetaFrameGeometry *orig_fgeom,
|
||||
MetaFrameBorders *orig_borders,
|
||||
MetaMoveResizeFlags flags,
|
||||
int resize_gravity,
|
||||
const MetaRectangle *orig,
|
||||
@ -357,10 +358,16 @@ setup_constraint_info (ConstraintInfo *info,
|
||||
info->current = *new;
|
||||
|
||||
/* Create a fake frame geometry if none really exists */
|
||||
if (orig_fgeom && !window->fullscreen)
|
||||
info->fgeom = orig_fgeom;
|
||||
if (orig_borders && !window->fullscreen)
|
||||
{
|
||||
info->borders = orig_borders;
|
||||
info->must_free_borders = FALSE;
|
||||
}
|
||||
else
|
||||
info->fgeom = g_new0 (MetaFrameGeometry, 1);
|
||||
{
|
||||
info->borders = g_new0 (MetaFrameBorders, 1);
|
||||
info->must_free_borders = TRUE;
|
||||
}
|
||||
|
||||
if (flags & META_IS_MOVE_ACTION && flags & META_IS_RESIZE_ACTION)
|
||||
info->action_type = ACTION_MOVE_AND_RESIZE;
|
||||
@ -439,9 +446,13 @@ setup_constraint_info (ConstraintInfo *info,
|
||||
monitor_info->number);
|
||||
|
||||
/* Workaround braindead legacy apps that don't know how to
|
||||
* fullscreen themselves properly.
|
||||
* fullscreen themselves properly - don't get fooled by
|
||||
* windows which hide their titlebar when maximized; that's
|
||||
* not the same as fullscreen, even if there are no struts
|
||||
* making the workarea smaller than the monitor.
|
||||
*/
|
||||
if (meta_prefs_get_force_fullscreen() &&
|
||||
!window->hide_titlebar_when_maximized &&
|
||||
meta_rectangle_equal (new, &monitor_info->rect) &&
|
||||
window->has_fullscreen_func &&
|
||||
!window->fullscreen)
|
||||
@ -461,7 +472,6 @@ setup_constraint_info (ConstraintInfo *info,
|
||||
"Setting up constraint info:\n"
|
||||
" orig: %d,%d +%d,%d\n"
|
||||
" new : %d,%d +%d,%d\n"
|
||||
" fgeom: %d,%d,%d,%d\n"
|
||||
" action_type : %s\n"
|
||||
" is_user_action : %s\n"
|
||||
" resize_gravity : %s\n"
|
||||
@ -471,8 +481,6 @@ setup_constraint_info (ConstraintInfo *info,
|
||||
info->orig.x, info->orig.y, info->orig.width, info->orig.height,
|
||||
info->current.x, info->current.y,
|
||||
info->current.width, info->current.height,
|
||||
info->fgeom->left_width, info->fgeom->right_width,
|
||||
info->fgeom->top_height, info->fgeom->bottom_height,
|
||||
(info->action_type == ACTION_MOVE) ? "Move" :
|
||||
(info->action_type == ACTION_RESIZE) ? "Resize" :
|
||||
(info->action_type == ACTION_MOVE_AND_RESIZE) ? "Move&Resize" :
|
||||
@ -513,7 +521,7 @@ place_window_if_needed(MetaWindow *window,
|
||||
MetaWorkspace *cur_workspace;
|
||||
const MetaMonitorInfo *monitor_info;
|
||||
|
||||
meta_window_place (window, info->fgeom, info->orig.x, info->orig.y,
|
||||
meta_window_place (window, info->borders, info->orig.x, info->orig.y,
|
||||
&placed_rect.x, &placed_rect.y);
|
||||
did_placement = TRUE;
|
||||
|
||||
@ -563,6 +571,11 @@ place_window_if_needed(MetaWindow *window,
|
||||
.083 * info->work_area_monitor.height;
|
||||
}
|
||||
|
||||
/* idle_move_resize() uses the user_rect, so make sure it uses the
|
||||
* placed coordinates (bug #556696).
|
||||
*/
|
||||
window->user_rect = info->current;
|
||||
|
||||
if (window->maximize_horizontally_after_placement ||
|
||||
window->maximize_vertically_after_placement)
|
||||
meta_window_maximize_internal (window,
|
||||
@ -572,8 +585,8 @@ place_window_if_needed(MetaWindow *window,
|
||||
META_MAXIMIZE_VERTICAL : 0), &info->current);
|
||||
|
||||
/* maximization may have changed frame geometry */
|
||||
if (window->frame && !window->fullscreen)
|
||||
meta_frame_calc_geometry (window->frame, info->fgeom);
|
||||
if (!window->fullscreen)
|
||||
meta_frame_calc_borders (window->frame, info->borders);
|
||||
|
||||
if (window->fullscreen_after_placement)
|
||||
{
|
||||
@ -634,7 +647,7 @@ update_onscreen_requirements (MetaWindow *window,
|
||||
/* The require onscreen/on-single-monitor and titlebar_visible
|
||||
* stuff is relative to the outer window, not the inner
|
||||
*/
|
||||
extend_by_frame (&info->current, info->fgeom);
|
||||
extend_by_frame (&info->current, info->borders);
|
||||
|
||||
/* Update whether we want future constraint runs to require the
|
||||
* window to be on fully onscreen.
|
||||
@ -670,7 +683,7 @@ update_onscreen_requirements (MetaWindow *window,
|
||||
MetaRectangle titlebar_rect;
|
||||
|
||||
titlebar_rect = info->current;
|
||||
titlebar_rect.height = info->fgeom->top_height;
|
||||
titlebar_rect.height = info->borders->visible.top;
|
||||
old = window->require_titlebar_visible;
|
||||
window->require_titlebar_visible =
|
||||
meta_rectangle_overlaps_with_region (info->usable_screen_region,
|
||||
@ -683,32 +696,32 @@ update_onscreen_requirements (MetaWindow *window,
|
||||
}
|
||||
|
||||
/* Don't forget to restore the position of the window */
|
||||
unextend_by_frame (&info->current, info->fgeom);
|
||||
unextend_by_frame (&info->current, info->borders);
|
||||
}
|
||||
|
||||
static void
|
||||
extend_by_frame (MetaRectangle *rect,
|
||||
const MetaFrameGeometry *fgeom)
|
||||
const MetaFrameBorders *borders)
|
||||
{
|
||||
rect->x -= fgeom->left_width;
|
||||
rect->y -= fgeom->top_height;
|
||||
rect->width += fgeom->left_width + fgeom->right_width;
|
||||
rect->height += fgeom->top_height + fgeom->bottom_height;
|
||||
rect->x -= borders->visible.left;
|
||||
rect->y -= borders->visible.top;
|
||||
rect->width += borders->visible.left + borders->visible.right;
|
||||
rect->height += borders->visible.top + borders->visible.bottom;
|
||||
}
|
||||
|
||||
static void
|
||||
unextend_by_frame (MetaRectangle *rect,
|
||||
const MetaFrameGeometry *fgeom)
|
||||
const MetaFrameBorders *borders)
|
||||
{
|
||||
rect->x += fgeom->left_width;
|
||||
rect->y += fgeom->top_height;
|
||||
rect->width -= fgeom->left_width + fgeom->right_width;
|
||||
rect->height -= fgeom->top_height + fgeom->bottom_height;
|
||||
rect->x += borders->visible.left;
|
||||
rect->y += borders->visible.top;
|
||||
rect->width -= borders->visible.left + borders->visible.right;
|
||||
rect->height -= borders->visible.top + borders->visible.bottom;
|
||||
}
|
||||
|
||||
static inline void
|
||||
get_size_limits (const MetaWindow *window,
|
||||
const MetaFrameGeometry *fgeom,
|
||||
const MetaFrameBorders *borders,
|
||||
gboolean include_frame,
|
||||
MetaRectangle *min_size,
|
||||
MetaRectangle *max_size)
|
||||
@ -723,8 +736,8 @@ get_size_limits (const MetaWindow *window,
|
||||
|
||||
if (include_frame)
|
||||
{
|
||||
int fw = fgeom->left_width + fgeom->right_width;
|
||||
int fh = fgeom->top_height + fgeom->bottom_height;
|
||||
int fw = borders->visible.left + borders->visible.right;
|
||||
int fh = borders->visible.top + borders->visible.bottom;
|
||||
|
||||
min_size->width += fw;
|
||||
min_size->height += fh;
|
||||
@ -752,27 +765,16 @@ constrain_modal_dialog (MetaWindow *window,
|
||||
MetaWindow *parent = meta_window_get_transient_for (window);
|
||||
gboolean constraint_already_satisfied;
|
||||
|
||||
if (!meta_prefs_get_attach_modal_dialogs ())
|
||||
return TRUE;
|
||||
if (window->type != META_WINDOW_MODAL_DIALOG || !parent)
|
||||
if (!meta_window_is_attached_dialog (window))
|
||||
return TRUE;
|
||||
|
||||
x = parent->rect.x + (parent->rect.width / 2 - info->current.width / 2);
|
||||
y = 0;
|
||||
y = parent->rect.y + (parent->rect.height / 2 - info->current.height / 2);
|
||||
if (parent->frame)
|
||||
{
|
||||
MetaFrameGeometry fgeom;
|
||||
|
||||
x += parent->frame->rect.x;
|
||||
y += parent->frame->rect.y;
|
||||
|
||||
meta_frame_calc_geometry (parent->frame, &fgeom);
|
||||
y += fgeom.top_height;
|
||||
|
||||
y += info->fgeom->top_height;
|
||||
}
|
||||
else
|
||||
y = parent->rect.y + info->fgeom->top_height;
|
||||
|
||||
constraint_already_satisfied = (x == info->current.x) && (y == info->current.y);
|
||||
|
||||
@ -810,8 +812,14 @@ constrain_maximization (MetaWindow *window,
|
||||
return TRUE;
|
||||
|
||||
/* Calculate target_size = maximized size of (window + frame) */
|
||||
if (window->maximized_horizontally && window->maximized_vertically)
|
||||
target_size = info->work_area_monitor;
|
||||
if (META_WINDOW_TILED_MAXIMIZED (window))
|
||||
{
|
||||
meta_window_get_current_tile_area (window, &target_size);
|
||||
}
|
||||
else if (META_WINDOW_MAXIMIZED (window))
|
||||
{
|
||||
target_size = info->work_area_monitor;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Amount of maximization possible in a single direction depends
|
||||
@ -831,19 +839,19 @@ constrain_maximization (MetaWindow *window,
|
||||
active_workspace_struts = window->screen->active_workspace->all_struts;
|
||||
|
||||
target_size = info->current;
|
||||
extend_by_frame (&target_size, info->fgeom);
|
||||
extend_by_frame (&target_size, info->borders);
|
||||
meta_rectangle_expand_to_avoiding_struts (&target_size,
|
||||
&info->entire_monitor,
|
||||
direction,
|
||||
active_workspace_struts);
|
||||
}
|
||||
/* Now make target_size = maximized size of client window */
|
||||
unextend_by_frame (&target_size, info->fgeom);
|
||||
unextend_by_frame (&target_size, info->borders);
|
||||
|
||||
/* Check min size constraints; max size constraints are ignored for maximized
|
||||
* windows, as per bug 327543.
|
||||
*/
|
||||
get_size_limits (window, info->fgeom, FALSE, &min_size, &max_size);
|
||||
get_size_limits (window, info->borders, FALSE, &min_size, &max_size);
|
||||
hminbad = target_size.width < min_size.width && window->maximized_horizontally;
|
||||
vminbad = target_size.height < min_size.height && window->maximized_vertically;
|
||||
if (hminbad || vminbad)
|
||||
@ -897,12 +905,12 @@ constrain_tiling (MetaWindow *window,
|
||||
* use an external function for the actual calculation
|
||||
*/
|
||||
meta_window_get_current_tile_area (window, &target_size);
|
||||
unextend_by_frame (&target_size, info->fgeom);
|
||||
unextend_by_frame (&target_size, info->borders);
|
||||
|
||||
/* Check min size constraints; max size constraints are ignored as for
|
||||
* maximized windows.
|
||||
*/
|
||||
get_size_limits (window, info->fgeom, FALSE, &min_size, &max_size);
|
||||
get_size_limits (window, info->borders, FALSE, &min_size, &max_size);
|
||||
hminbad = target_size.width < min_size.width;
|
||||
vminbad = target_size.height < min_size.height;
|
||||
if (hminbad || vminbad)
|
||||
@ -945,7 +953,7 @@ constrain_fullscreen (MetaWindow *window,
|
||||
|
||||
monitor = info->entire_monitor;
|
||||
|
||||
get_size_limits (window, info->fgeom, FALSE, &min_size, &max_size);
|
||||
get_size_limits (window, info->borders, FALSE, &min_size, &max_size);
|
||||
too_big = !meta_rectangle_could_fit_rect (&monitor, &min_size);
|
||||
too_small = !meta_rectangle_could_fit_rect (&max_size, &monitor);
|
||||
if (too_big || too_small)
|
||||
@ -1054,7 +1062,7 @@ constrain_size_limits (MetaWindow *window,
|
||||
return TRUE;
|
||||
|
||||
/* Determine whether constraint is already satisfied; exit if it is */
|
||||
get_size_limits (window, info->fgeom, FALSE, &min_size, &max_size);
|
||||
get_size_limits (window, info->borders, FALSE, &min_size, &max_size);
|
||||
/* We ignore max-size limits for maximized windows; see #327543 */
|
||||
if (window->maximized_horizontally)
|
||||
max_size.width = MAX (max_size.width, info->current.width);
|
||||
@ -1246,8 +1254,8 @@ do_screen_and_monitor_relative_constraints (
|
||||
|
||||
/* Determine whether constraint applies; exit if it doesn't */
|
||||
how_far_it_can_be_smushed = info->current;
|
||||
get_size_limits (window, info->fgeom, TRUE, &min_size, &max_size);
|
||||
extend_by_frame (&info->current, info->fgeom);
|
||||
get_size_limits (window, info->borders, TRUE, &min_size, &max_size);
|
||||
extend_by_frame (&info->current, info->borders);
|
||||
|
||||
if (info->action_type != ACTION_MOVE)
|
||||
{
|
||||
@ -1267,7 +1275,7 @@ do_screen_and_monitor_relative_constraints (
|
||||
&info->current);
|
||||
if (exit_early || constraint_satisfied || check_only)
|
||||
{
|
||||
unextend_by_frame (&info->current, info->fgeom);
|
||||
unextend_by_frame (&info->current, info->borders);
|
||||
return constraint_satisfied;
|
||||
}
|
||||
|
||||
@ -1291,7 +1299,7 @@ do_screen_and_monitor_relative_constraints (
|
||||
info->fixed_directions,
|
||||
&info->current);
|
||||
|
||||
unextend_by_frame (&info->current, info->fgeom);
|
||||
unextend_by_frame (&info->current, info->borders);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@ -1404,8 +1412,8 @@ constrain_titlebar_visible (MetaWindow *window,
|
||||
*/
|
||||
if (window->frame)
|
||||
{
|
||||
bottom_amount = info->current.height + info->fgeom->bottom_height;
|
||||
vert_amount_onscreen = info->fgeom->top_height;
|
||||
bottom_amount = info->current.height + info->borders->visible.bottom;
|
||||
vert_amount_onscreen = info->borders->visible.top;
|
||||
}
|
||||
else
|
||||
bottom_amount = vert_amount_offscreen;
|
||||
@ -1479,8 +1487,8 @@ constrain_partially_onscreen (MetaWindow *window,
|
||||
*/
|
||||
if (window->frame)
|
||||
{
|
||||
bottom_amount = info->current.height + info->fgeom->bottom_height;
|
||||
vert_amount_onscreen = info->fgeom->top_height;
|
||||
bottom_amount = info->current.height + info->borders->visible.bottom;
|
||||
vert_amount_onscreen = info->borders->visible.top;
|
||||
}
|
||||
else
|
||||
bottom_amount = vert_amount_offscreen;
|
||||
|
@ -39,7 +39,7 @@ typedef enum
|
||||
} MetaMoveResizeFlags;
|
||||
|
||||
void meta_window_constrain (MetaWindow *window,
|
||||
MetaFrameGeometry *orig_fgeom,
|
||||
MetaFrameBorders *orig_borders,
|
||||
MetaMoveResizeFlags flags,
|
||||
int resize_gravity,
|
||||
const MetaRectangle *orig,
|
||||
|
@ -212,7 +212,7 @@ lower_window_and_transients (MetaWindow *window,
|
||||
|
||||
meta_window_foreach_transient (window, lower_window_and_transients, NULL);
|
||||
|
||||
if (meta_prefs_get_focus_mode () == META_FOCUS_MODE_CLICK &&
|
||||
if (meta_prefs_get_focus_mode () == G_DESKTOP_FOCUS_MODE_CLICK &&
|
||||
meta_prefs_get_raise_on_click ())
|
||||
{
|
||||
/* Move window to the back of the focusing workspace's MRU list.
|
||||
@ -538,70 +538,70 @@ meta_core_get_menu_accelerator (MetaMenuOp menu_op,
|
||||
break;
|
||||
case META_MENU_OP_UNSTICK:
|
||||
case META_MENU_OP_STICK:
|
||||
name = "toggle_on_all_workspaces";
|
||||
name = "toggle-on-all-workspaces";
|
||||
break;
|
||||
case META_MENU_OP_ABOVE:
|
||||
case META_MENU_OP_UNABOVE:
|
||||
name = "toggle_above";
|
||||
name = "toggle-above";
|
||||
break;
|
||||
case META_MENU_OP_WORKSPACES:
|
||||
switch (workspace)
|
||||
{
|
||||
case 1:
|
||||
name = "move_to_workspace_1";
|
||||
name = "move-to-workspace-1";
|
||||
break;
|
||||
case 2:
|
||||
name = "move_to_workspace_2";
|
||||
name = "move-to-workspace-2";
|
||||
break;
|
||||
case 3:
|
||||
name = "move_to_workspace_3";
|
||||
name = "move-to-workspace-3";
|
||||
break;
|
||||
case 4:
|
||||
name = "move_to_workspace_4";
|
||||
name = "move-to-workspace-4";
|
||||
break;
|
||||
case 5:
|
||||
name = "move_to_workspace_5";
|
||||
name = "move-to-workspace-5";
|
||||
break;
|
||||
case 6:
|
||||
name = "move_to_workspace_6";
|
||||
name = "move-to-workspace-6";
|
||||
break;
|
||||
case 7:
|
||||
name = "move_to_workspace_7";
|
||||
name = "move-to-workspace-7";
|
||||
break;
|
||||
case 8:
|
||||
name = "move_to_workspace_8";
|
||||
name = "move-to-workspace-8";
|
||||
break;
|
||||
case 9:
|
||||
name = "move_to_workspace_9";
|
||||
name = "move-to-workspace-9";
|
||||
break;
|
||||
case 10:
|
||||
name = "move_to_workspace_10";
|
||||
name = "move-to-workspace-10";
|
||||
break;
|
||||
case 11:
|
||||
name = "move_to_workspace_11";
|
||||
name = "move-to-workspace-11";
|
||||
break;
|
||||
case 12:
|
||||
name = "move_to_workspace_12";
|
||||
name = "move-to-workspace-12";
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case META_MENU_OP_MOVE:
|
||||
name = "begin_move";
|
||||
name = "begin-move";
|
||||
break;
|
||||
case META_MENU_OP_RESIZE:
|
||||
name = "begin_resize";
|
||||
name = "begin-resize";
|
||||
break;
|
||||
case META_MENU_OP_MOVE_LEFT:
|
||||
name = "move_to_workspace_left";
|
||||
name = "move-to-workspace-left";
|
||||
break;
|
||||
case META_MENU_OP_MOVE_RIGHT:
|
||||
name = "move_to_workspace_right";
|
||||
name = "move-to-workspace-right";
|
||||
break;
|
||||
case META_MENU_OP_MOVE_UP:
|
||||
name = "move_to_workspace_up";
|
||||
name = "move-to-workspace-up";
|
||||
break;
|
||||
case META_MENU_OP_MOVE_DOWN:
|
||||
name = "move_to_workspace_down";
|
||||
name = "move-to-workspace-down";
|
||||
break;
|
||||
case META_MENU_OP_RECOVER:
|
||||
/* No keybinding for this one */
|
||||
|
@ -108,13 +108,16 @@ delete_ping_timeout_func (MetaDisplay *display,
|
||||
|
||||
/* Translators: %s is a window title */
|
||||
if (window_title)
|
||||
tmp = g_markup_printf_escaped (_("<tt>%s</tt> is not responding."),
|
||||
window_title);
|
||||
{
|
||||
char *title = g_strdup_printf ("“%s”", window_title);
|
||||
tmp = g_strdup_printf (_("%s is not responding."), title);
|
||||
g_free (title);
|
||||
}
|
||||
else
|
||||
tmp = g_strdup (_("Application is not responding."));
|
||||
|
||||
window_content = g_strdup_printf (
|
||||
"<big><b>%s</b></big>\n\n<i>%s</i>",
|
||||
"<big><b>%s</b></big>\n\n%s",
|
||||
tmp,
|
||||
_("You may choose to wait a short while for it to "
|
||||
"continue or force the application to quit entirely."));
|
||||
@ -123,7 +126,8 @@ delete_ping_timeout_func (MetaDisplay *display,
|
||||
meta_show_dialog ("--question",
|
||||
window_content, NULL,
|
||||
window->screen->screen_name,
|
||||
_("_Wait"), _("_Force Quit"), window->xwindow,
|
||||
_("_Wait"), _("_Force Quit"),
|
||||
"face-sad-symbolic", window->xwindow,
|
||||
NULL, NULL);
|
||||
|
||||
g_free (window_content);
|
||||
|
@ -73,9 +73,11 @@ typedef enum {
|
||||
/* This is basically a bogus number, just has to be large enough
|
||||
* to handle the expected case of the alt+tab operation, where
|
||||
* we want to ignore serials from UnmapNotify on the tab popup,
|
||||
* and the LeaveNotify/EnterNotify from the pointer ungrab
|
||||
* and the LeaveNotify/EnterNotify from the pointer ungrab. It
|
||||
* also has to be big enough to hold ignored serials from the point
|
||||
* where we reshape the stage to the point where we get events back.
|
||||
*/
|
||||
#define N_IGNORED_SERIALS 4
|
||||
#define N_IGNORED_CROSSING_SERIALS 10
|
||||
|
||||
typedef enum {
|
||||
META_TILE_NONE,
|
||||
@ -153,7 +155,7 @@ struct _MetaDisplay
|
||||
* correspond to an enter event we should
|
||||
* ignore
|
||||
*/
|
||||
unsigned long ignored_serials[N_IGNORED_SERIALS];
|
||||
unsigned long ignored_crossing_serials[N_IGNORED_CROSSING_SERIALS];
|
||||
Window ungrab_should_not_cause_focus_window;
|
||||
|
||||
guint32 current_time;
|
||||
@ -170,6 +172,9 @@ struct _MetaDisplay
|
||||
/* Pings which we're waiting for a reply from */
|
||||
GSList *pending_pings;
|
||||
|
||||
/* Pending focus change */
|
||||
guint focus_timeout_id;
|
||||
|
||||
/* Pending autoraise */
|
||||
guint autoraise_timeout_id;
|
||||
MetaWindow* autoraise_window;
|
||||
@ -187,6 +192,7 @@ struct _MetaDisplay
|
||||
int grab_anchor_root_y;
|
||||
MetaRectangle grab_anchor_window_pos;
|
||||
MetaTileMode grab_tile_mode;
|
||||
int grab_tile_monitor_number;
|
||||
int grab_latest_motion_x;
|
||||
int grab_latest_motion_y;
|
||||
gulong grab_mask;
|
||||
@ -341,10 +347,6 @@ MetaScreen* meta_display_screen_for_xwindow (MetaDisplay *display,
|
||||
void meta_display_grab (MetaDisplay *display);
|
||||
void meta_display_ungrab (MetaDisplay *display);
|
||||
|
||||
void meta_display_unmanage_screen (MetaDisplay *display,
|
||||
MetaScreen *screen,
|
||||
guint32 timestamp);
|
||||
|
||||
void meta_display_unmanage_windows_for_screen (MetaDisplay *display,
|
||||
MetaScreen *screen,
|
||||
guint32 timestamp);
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -67,7 +67,6 @@ meta_window_ensure_frame (MetaWindow *window)
|
||||
frame->current_cursor = 0;
|
||||
|
||||
frame->mapped = FALSE;
|
||||
frame->need_reapply_frame_shape = TRUE;
|
||||
frame->is_flashing = FALSE;
|
||||
|
||||
meta_verbose ("Framing window %s: visual %s default, depth %d default depth %d\n",
|
||||
@ -167,14 +166,6 @@ meta_window_ensure_frame (MetaWindow *window)
|
||||
/* Move keybindings to frame instead of window */
|
||||
meta_window_grab_keys (window);
|
||||
|
||||
/* Shape mask */
|
||||
meta_ui_apply_frame_shape (frame->window->screen->ui,
|
||||
frame->xwindow,
|
||||
frame->rect.width,
|
||||
frame->rect.height,
|
||||
frame->window->has_shape);
|
||||
frame->need_reapply_frame_shape = FALSE;
|
||||
|
||||
meta_display_ungrab (window->display);
|
||||
}
|
||||
|
||||
@ -182,6 +173,7 @@ void
|
||||
meta_window_destroy_frame (MetaWindow *window)
|
||||
{
|
||||
MetaFrame *frame;
|
||||
MetaFrameBorders borders;
|
||||
|
||||
if (window->frame == NULL)
|
||||
return;
|
||||
@ -189,6 +181,8 @@ meta_window_destroy_frame (MetaWindow *window)
|
||||
meta_verbose ("Unframing window %s\n", window->desc);
|
||||
|
||||
frame = window->frame;
|
||||
|
||||
meta_frame_calc_borders (frame, &borders);
|
||||
|
||||
meta_bell_notify_frame_destroy (frame);
|
||||
|
||||
@ -216,8 +210,8 @@ meta_window_destroy_frame (MetaWindow *window)
|
||||
* coordinates here means we'll need to ensure a configure
|
||||
* notify event is sent; see bug 399552.
|
||||
*/
|
||||
window->frame->rect.x,
|
||||
window->frame->rect.y);
|
||||
window->frame->rect.x + borders.invisible.left,
|
||||
window->frame->rect.y + borders.invisible.top);
|
||||
meta_error_trap_pop (window->display);
|
||||
|
||||
meta_ui_destroy_frame_window (window->screen->ui, frame->xwindow);
|
||||
@ -226,6 +220,11 @@ meta_window_destroy_frame (MetaWindow *window)
|
||||
frame->xwindow);
|
||||
|
||||
window->frame = NULL;
|
||||
if (window->frame_bounds)
|
||||
{
|
||||
cairo_region_destroy (window->frame_bounds);
|
||||
window->frame_bounds = NULL;
|
||||
}
|
||||
|
||||
/* Move keybindings to window instead of frame */
|
||||
meta_window_grab_keys (window);
|
||||
@ -311,40 +310,39 @@ meta_frame_get_flags (MetaFrame *frame)
|
||||
}
|
||||
|
||||
void
|
||||
meta_frame_calc_geometry (MetaFrame *frame,
|
||||
MetaFrameGeometry *geomp)
|
||||
meta_frame_borders_clear (MetaFrameBorders *self)
|
||||
{
|
||||
MetaFrameGeometry geom;
|
||||
MetaWindow *window;
|
||||
|
||||
window = frame->window;
|
||||
|
||||
meta_ui_get_frame_geometry (window->screen->ui,
|
||||
frame->xwindow,
|
||||
&geom.top_height,
|
||||
&geom.bottom_height,
|
||||
&geom.left_width,
|
||||
&geom.right_width);
|
||||
|
||||
*geomp = geom;
|
||||
self->visible.top = self->invisible.top = self->total.top = 0;
|
||||
self->visible.bottom = self->invisible.bottom = self->total.bottom = 0;
|
||||
self->visible.left = self->invisible.left = self->total.left = 0;
|
||||
self->visible.right = self->invisible.right = self->total.right = 0;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
update_shape (MetaFrame *frame)
|
||||
void
|
||||
meta_frame_calc_borders (MetaFrame *frame,
|
||||
MetaFrameBorders *borders)
|
||||
{
|
||||
if (frame->need_reapply_frame_shape)
|
||||
{
|
||||
meta_ui_apply_frame_shape (frame->window->screen->ui,
|
||||
frame->xwindow,
|
||||
frame->rect.width,
|
||||
frame->rect.height,
|
||||
frame->window->has_shape);
|
||||
frame->need_reapply_frame_shape = FALSE;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
/* Save on if statements and potential uninitialized values
|
||||
* in callers -- if there's no frame, then zero the borders. */
|
||||
if (frame == NULL)
|
||||
meta_frame_borders_clear (borders);
|
||||
else
|
||||
return FALSE;
|
||||
meta_ui_get_frame_borders (frame->window->screen->ui,
|
||||
frame->xwindow,
|
||||
borders);
|
||||
}
|
||||
|
||||
void
|
||||
meta_frame_get_corner_radiuses (MetaFrame *frame,
|
||||
float *top_left,
|
||||
float *top_right,
|
||||
float *bottom_left,
|
||||
float *bottom_right)
|
||||
{
|
||||
meta_ui_get_corner_radiuses (frame->window->screen->ui,
|
||||
frame->xwindow,
|
||||
top_left, top_right,
|
||||
bottom_left, bottom_right);
|
||||
}
|
||||
|
||||
gboolean
|
||||
@ -353,11 +351,6 @@ meta_frame_sync_to_window (MetaFrame *frame,
|
||||
gboolean need_move,
|
||||
gboolean need_resize)
|
||||
{
|
||||
if (!(need_move || need_resize))
|
||||
{
|
||||
return update_shape (frame);
|
||||
}
|
||||
|
||||
meta_topic (META_DEBUG_GEOMETRY,
|
||||
"Syncing frame geometry %d,%d %dx%d (SE: %d,%d)\n",
|
||||
frame->rect.x, frame->rect.y,
|
||||
@ -372,19 +365,8 @@ meta_frame_sync_to_window (MetaFrame *frame,
|
||||
frame->xwindow,
|
||||
frame->rect.width,
|
||||
frame->rect.height);
|
||||
|
||||
/* we need new shape if we're resized */
|
||||
frame->need_reapply_frame_shape = TRUE;
|
||||
}
|
||||
|
||||
/* Done before the window resize, because doing it before means
|
||||
* part of the window being resized becomes unshaped, which may
|
||||
* be sort of hard to see with bg = None. If we did it after
|
||||
* window resize, part of the window being resized would become
|
||||
* shaped, which might be more visible.
|
||||
*/
|
||||
update_shape (frame);
|
||||
|
||||
meta_ui_move_resize_frame (frame->window->screen->ui,
|
||||
frame->xwindow,
|
||||
frame->rect.x,
|
||||
|
@ -26,17 +26,6 @@
|
||||
|
||||
#include "window-private.h"
|
||||
|
||||
typedef struct _MetaFrameGeometry MetaFrameGeometry;
|
||||
|
||||
struct _MetaFrameGeometry
|
||||
{
|
||||
/* border sizes (space between frame and child) */
|
||||
int left_width;
|
||||
int right_width;
|
||||
int top_height;
|
||||
int bottom_height;
|
||||
};
|
||||
|
||||
struct _MetaFrame
|
||||
{
|
||||
/* window we frame */
|
||||
@ -71,8 +60,15 @@ MetaFrameFlags meta_frame_get_flags (MetaFrame *frame);
|
||||
Window meta_frame_get_xwindow (MetaFrame *frame);
|
||||
|
||||
/* These should ONLY be called from meta_window_move_resize_internal */
|
||||
void meta_frame_calc_geometry (MetaFrame *frame,
|
||||
MetaFrameGeometry *geomp);
|
||||
void meta_frame_calc_borders (MetaFrame *frame,
|
||||
MetaFrameBorders *borders);
|
||||
|
||||
void meta_frame_get_corner_radiuses (MetaFrame *frame,
|
||||
float *top_left,
|
||||
float *top_right,
|
||||
float *bottom_left,
|
||||
float *bottom_right);
|
||||
|
||||
gboolean meta_frame_sync_to_window (MetaFrame *frame,
|
||||
int gravity,
|
||||
gboolean need_move,
|
||||
|
@ -29,8 +29,29 @@
|
||||
#ifndef META_KEYBINDINGS_PRIVATE_H
|
||||
#define META_KEYBINDINGS_PRIVATE_H
|
||||
|
||||
#include <gio/gio.h>
|
||||
#include <meta/keybindings.h>
|
||||
|
||||
struct _MetaKeyHandler
|
||||
{
|
||||
char *name;
|
||||
MetaKeyHandlerFunc func;
|
||||
MetaKeyHandlerFunc default_func;
|
||||
gint data, flags;
|
||||
gpointer user_data;
|
||||
GDestroyNotify user_data_free_func;
|
||||
};
|
||||
|
||||
struct _MetaKeyBinding
|
||||
{
|
||||
const char *name;
|
||||
KeySym keysym;
|
||||
KeyCode keycode;
|
||||
unsigned int mask;
|
||||
MetaVirtualModifier modifiers;
|
||||
MetaKeyHandler *handler;
|
||||
};
|
||||
|
||||
void meta_display_init_keys (MetaDisplay *display);
|
||||
void meta_display_shutdown_keys (MetaDisplay *display);
|
||||
void meta_screen_grab_keys (MetaScreen *screen);
|
||||
@ -52,6 +73,14 @@ void meta_set_keybindings_disabled (gboolean setting);
|
||||
void meta_display_process_mapping_event (MetaDisplay *display,
|
||||
XEvent *event);
|
||||
|
||||
gboolean meta_prefs_add_keybinding (const char *name,
|
||||
GSettings *settings,
|
||||
MetaKeyBindingAction action,
|
||||
MetaKeyBindingFlags flags);
|
||||
|
||||
gboolean meta_prefs_remove_keybinding (const char *name);
|
||||
|
||||
|
||||
#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