Compare commits
433 Commits
3.7.2
...
wip/displa
Author | SHA1 | Date | |
---|---|---|---|
78b41e542b | |||
13557b39d0 | |||
39aecd2dde | |||
c564515ef6 | |||
d7b2ea37b1 | |||
0a1e0fe132 | |||
1a0513ea61 | |||
028fa6cd4e | |||
194b11186c | |||
40f064abc3 | |||
27b8716795 | |||
50b44d0445 | |||
c74d40ac41 | |||
c21f7d43bd | |||
80e0b4aac9 | |||
12cd4c216b | |||
91d193e5e8 | |||
f82f3ef67b | |||
6125b3fa7e | |||
169780346b | |||
9b255f9292 | |||
60e11fbae3 | |||
355f0258b1 | |||
09984bb56d | |||
f48ddb3683 | |||
9ac92336c9 | |||
2bc5e89a5e | |||
a413bc106f | |||
b04ac57f02 | |||
c3a08ee589 | |||
1fdb161f54 | |||
f3d1653f13 | |||
3093b5c95d | |||
c3e8646af3 | |||
8c17b670fb | |||
12d2e1f600 | |||
c20b007985 | |||
ef480e9120 | |||
8c1c77482d | |||
e633606ca9 | |||
6fdc23d0b7 | |||
4862872c78 | |||
ae2e4c5114 | |||
06b5be2d13 | |||
56fb8a81b3 | |||
90a3d613ca | |||
c2af13cf31 | |||
b0cf0b2442 | |||
1c569c2d0e | |||
e3855c77af | |||
21fe5be026 | |||
57bc974a57 | |||
3b51405255 | |||
73dbb4b9a5 | |||
51acc3ee31 | |||
a6f206f07c | |||
9504fdd2cb | |||
b76c3312e9 | |||
fd7db8e6b3 | |||
b7840bec7d | |||
f743539886 | |||
15e01152da | |||
2103ff6a5c | |||
8ab136b7ea | |||
5205821fb9 | |||
7187206ef5 | |||
96221e6c04 | |||
7fdfbad6d4 | |||
2a5b068863 | |||
0c505faded | |||
b2dd4f33f7 | |||
47b21b3547 | |||
c119f98bac | |||
d20078574e | |||
26bd4fde5c | |||
2af49e503f | |||
6ea6af6eb4 | |||
10df80762c | |||
f86032d700 | |||
a8eb33f6fd | |||
bd19de9429 | |||
2ca2838548 | |||
df8234c5e3 | |||
d03ffd801e | |||
7a4c808e43 | |||
4f1d62170b | |||
e10804727d | |||
e430e051b7 | |||
696d9d2fa9 | |||
f6dd081acd | |||
eddd6f8e9b | |||
dfa4c7d670 | |||
a487d4dd01 | |||
c2ecdd0524 | |||
50b9042ac2 | |||
f5e75de330 | |||
1ffe1eae4d | |||
970a446bd8 | |||
8880dffbdb | |||
5b6621811c | |||
c2a9ccb7e2 | |||
4608cb6027 | |||
ad61676af0 | |||
c7c1225393 | |||
c7dc6928a9 | |||
7cfaa6a6a8 | |||
673a9e2521 | |||
9ef4ac00df | |||
46f0cffa53 | |||
b6203192b5 | |||
992a15e640 | |||
f1620abfad | |||
591523e473 | |||
72769e113a | |||
387cb83c8a | |||
577e5e2e1a | |||
47cf63bebe | |||
0e58906194 | |||
13c7020b80 | |||
5ed6e37e3c | |||
9ed3a77102 | |||
acd99927f9 | |||
13c92f63bb | |||
12400caef8 | |||
a1b3fdfbd6 | |||
4b47c59a04 | |||
5d223c189c | |||
c5d0923453 | |||
41f8fccf6b | |||
e02ad64fef | |||
8db53af1f8 | |||
defaa5876c | |||
e7870cb665 | |||
64eb42023c | |||
e7faef860b | |||
4dfbe9a493 | |||
6a17bb4cf5 | |||
58496de595 | |||
f80a15f312 | |||
9df2d83aa0 | |||
1582448553 | |||
eefa62bcd4 | |||
e216b6ca0f | |||
8a33880c00 | |||
7a8c45dda8 | |||
af01ddaf5d | |||
5ceffe86ee | |||
49df033b4e | |||
ac3465ffbb | |||
884ab602cb | |||
d944bda7b9 | |||
11f7cfb27b | |||
64358d9901 | |||
2efed44257 | |||
69c72ebb26 | |||
00a842f41b | |||
460dc9f2ef | |||
be46869782 | |||
2863eba2e7 | |||
e0b698d365 | |||
edeac1de09 | |||
9281a1c191 | |||
a3826987e6 | |||
e46c7fd27b | |||
0bb8d29be4 | |||
1f905bd0e2 | |||
cce5ad7cc0 | |||
97a4cc8c9b | |||
592374bc62 | |||
2e0f979613 | |||
6d365a700c | |||
72a9eb6a3e | |||
ae3cfe6c01 | |||
da557cb712 | |||
c1e41d558f | |||
889844b004 | |||
6311a3ebc1 | |||
0f6c1db2ba | |||
e6ec1abbfa | |||
42621c960e | |||
8e9ae2eb50 | |||
ca7843372c | |||
1202714428 | |||
45addabe5d | |||
31abad0ea5 | |||
c169d29836 | |||
df8ad83cec | |||
381a9c2650 | |||
dc3529d98a | |||
e15bc37225 | |||
160150d127 | |||
6e02fb80c4 | |||
98b0a37442 | |||
4d437e32e0 | |||
7db236b2a4 | |||
377e2ed8a5 | |||
99cfbac473 | |||
34f06ee9e5 | |||
f212723e71 | |||
660eceb61a | |||
d395d75e26 | |||
2aea49a8d0 | |||
c996dde5cb | |||
4bdd985faf | |||
6e831c88a6 | |||
0e3d164117 | |||
ec6460382c | |||
436d3ff8a9 | |||
e4269002ce | |||
4f2bb583bf | |||
702f3fc691 | |||
4cad9513b4 | |||
24974816a6 | |||
773ae8dc65 | |||
7f14298126 | |||
a39cabfadb | |||
4df3e987c6 | |||
64c523c534 | |||
fba2c49aae | |||
e623406c99 | |||
de36d51b91 | |||
e6d5e98c9d | |||
832b7f9431 | |||
171a273d11 | |||
45b0765f2f | |||
2a773e0c85 | |||
b5152c3327 | |||
d4f8c29221 | |||
1b83e8a64c | |||
36eb5c305d | |||
c72dbeb611 | |||
63aec4566d | |||
2cafb8be2d | |||
64544fa0ed | |||
51ccaaaff0 | |||
b09f47d17f | |||
1dbefc4e36 | |||
7f6a77232f | |||
580feb0c85 | |||
842bc4421c | |||
aba87407e9 | |||
112ef93e19 | |||
c4efd1c789 | |||
7e61ef0936 | |||
e9709b7ff9 | |||
027593faa5 | |||
491c5b622e | |||
5e9621ed80 | |||
f5de1c78af | |||
b0774d795c | |||
034ab77c30 | |||
a6a9d3f448 | |||
a215852d3c | |||
264a0bbd15 | |||
55a4d0e0cb | |||
d900d83522 | |||
e8b0c11703 | |||
3d337a98d9 | |||
3e38a48c40 | |||
5876f2e3e5 | |||
aeb589c176 | |||
14dd766e11 | |||
24ff4b5622 | |||
7f3362bdce | |||
6b5cf2eb61 | |||
fb0cd80332 | |||
579bf2105e | |||
995e8040dd | |||
0503f6bb9a | |||
87fe9685b5 | |||
2d9b8bb2d0 | |||
74b1a9e2b9 | |||
fcc178ee8c | |||
d8696c17be | |||
b07aea467e | |||
04ef448927 | |||
790bfcad9a | |||
fbfab93c63 | |||
70c0d39fa7 | |||
7d43bde019 | |||
7743c70d47 | |||
c9343e3ee3 | |||
3abaf506a6 | |||
9de142db09 | |||
2942b22ccf | |||
94e6e55ef7 | |||
34fc234fd7 | |||
c3ffd28bb6 | |||
1c680be11a | |||
a362c08f4e | |||
380154af0a | |||
d482590c84 | |||
b3c572b8e3 | |||
c64eb94724 | |||
d8f569eaf5 | |||
57c31a56f4 | |||
8b21df92f0 | |||
e914595062 | |||
a2a3188331 | |||
453020c315 | |||
d794db876a | |||
b33b4a8e2c | |||
6f74a63bbd | |||
5298d1c8d0 | |||
493f619adc | |||
a613a55658 | |||
3fe5a676c2 | |||
19420f147f | |||
32b7743735 | |||
093e101252 | |||
6f873be7fa | |||
f37dd25e92 | |||
d48df249c9 | |||
e48c3dac87 | |||
3516902fae | |||
66185a468c | |||
84930f1d78 | |||
07273a075d | |||
3900aa10f8 | |||
d8058138ab | |||
ac49259fc7 | |||
12dbb90a5a | |||
90f2a3ae4c | |||
867e10dbcc | |||
9a57626556 | |||
b9e21b76ae | |||
2ecc50af53 | |||
1cebe19bbe | |||
71055556ee | |||
4d9d66da65 | |||
30bdadb519 | |||
c388ccf477 | |||
a2d54bb2ab | |||
cefadb55b1 | |||
06e31e4c03 | |||
869a137c2f | |||
f4e4a05a9e | |||
df15843407 | |||
d8eb47e2b7 | |||
e28a36affd | |||
53534b4ded | |||
079dd60e3d | |||
5d12f00b3b | |||
95f3bb3b81 | |||
2bfe6d2da5 | |||
27e0e44d8b | |||
7e5fb3e1a0 | |||
2ac17cc7ba | |||
7b32b7fcd1 | |||
2fcd75eadd | |||
8094c0ab23 | |||
831cf9a83a | |||
47be4fdf07 | |||
9b34545bd5 | |||
e5317cc7a0 | |||
b8887a6c3a | |||
a6c51addac | |||
54a3847a5e | |||
5a8473e226 | |||
5c33b0d768 | |||
22a3126a2b | |||
9596c24f83 | |||
86d6baf30f | |||
3a3be74e37 | |||
f57d64337b | |||
e69fcc860c | |||
afbca61524 | |||
66d37e06ba | |||
7e2d6cb6ec | |||
b9f775fe02 | |||
90cf43da9f | |||
bab51cbbe4 | |||
e782426736 | |||
1071e9970f | |||
5d64bdf3d9 | |||
8012a315e3 | |||
acd6df34da | |||
6431abbc85 | |||
57ff0f7071 | |||
2a2ac52726 | |||
a91eeb24d4 | |||
581960abc8 | |||
3a307b5d24 | |||
4e21d5d610 | |||
02c2cf1960 | |||
748064678f | |||
982d554450 | |||
0e5f8997cf | |||
6111d3ee4a | |||
3876a1a192 | |||
6f3ae06362 | |||
7d7b859b40 | |||
d78de379cc | |||
576384a73b | |||
2fcbc467e8 | |||
6139bc77ec | |||
c1ac9d1dff | |||
945c530354 | |||
774ceec243 | |||
7c20621112 | |||
afcdfd158f | |||
8fb9e0072c | |||
c1b8e0ac8f | |||
c90765370d | |||
8931b8026e | |||
55251aa986 | |||
946a42f13e | |||
0fd4059927 | |||
1d827049d6 | |||
881d256ce0 | |||
6b31bd402a | |||
129c729c50 | |||
8bf8f3ea55 | |||
f0c1e39fb7 | |||
dd4e655e2b | |||
b3073bc3bc | |||
54603f4d95 | |||
aab65a768e | |||
37c037278c | |||
9d904f9a85 | |||
8830814d70 | |||
c0958090b4 | |||
7f9e4e47c5 | |||
2282326f30 | |||
8703daccbe | |||
3797ecaa65 | |||
c6fcc79e6a | |||
d588de635a | |||
e5b46747d6 | |||
62d85f2e41 | |||
5ea6bf3b46 | |||
90d0bb96b4 | |||
ff64cba616 |
19
.gitignore
vendored
19
.gitignore
vendored
@ -46,7 +46,6 @@ POTFILES
|
||||
po/*.pot
|
||||
50-metacity-desktop-key.xml
|
||||
50-metacity-key.xml
|
||||
inlinepixbufs.h
|
||||
libmutter.pc
|
||||
mutter
|
||||
mutter-theme-viewer
|
||||
@ -62,6 +61,7 @@ mutter-message
|
||||
mutter-window-demo
|
||||
focus-window
|
||||
test-attached
|
||||
test-focus
|
||||
test-gravity
|
||||
test-resizing
|
||||
test-size-hints
|
||||
@ -75,3 +75,20 @@ src/stamp-mutter-enum-types.h
|
||||
src/mutter-marshal.[ch]
|
||||
src/stamp-mutter-marshal.h
|
||||
src/mutter-plugins.pc
|
||||
doc/reference/*.args
|
||||
doc/reference/*.bak
|
||||
doc/reference/*.hierarchy
|
||||
doc/reference/*.interfaces
|
||||
doc/reference/*.prerequisites
|
||||
doc/reference/*.signals
|
||||
doc/reference/*.stamp
|
||||
doc/reference/html/
|
||||
doc/reference/xml/
|
||||
doc/reference/meta-decl-list.txt
|
||||
doc/reference/meta-decl.txt
|
||||
doc/reference/meta-overrides.txt
|
||||
doc/reference/meta-undeclared.txt
|
||||
doc/reference/meta-undocumented.txt
|
||||
doc/reference/meta-unused.txt
|
||||
doc/reference/meta-docs.sgml
|
||||
doc/reference/meta.types
|
||||
|
@ -4,3 +4,5 @@ SUBDIRS=src po doc
|
||||
EXTRA_DIST = HACKING MAINTAINERS rationales.txt
|
||||
|
||||
DISTCLEANFILES = intltool-extract intltool-merge intltool-update po/stamp-it po/.intltool-merge-cache
|
||||
|
||||
DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc
|
||||
|
212
NEWS
212
NEWS
@ -1,3 +1,215 @@
|
||||
3.9.5
|
||||
=====
|
||||
* Don't select for touch events on the stage [Jasper; #697192]
|
||||
* Don't queue redraws for obscured regions [Adel; #703332]
|
||||
* Export timestamp of global keybinding events [Bastien; #704858]
|
||||
* Misc bug fixes and cleanups [Jasper, Rico; #703970]
|
||||
|
||||
Contributors:
|
||||
Adel Gadllah, Bastien Nocera, Jasper St. Pierre, Rico Tzschichholz
|
||||
|
||||
3.9.4
|
||||
=====
|
||||
* Tweak window shadows [Allan; #702141]
|
||||
* Ignore our own focus events for focus prediction [Jasper; #701017]
|
||||
* Add API to query if the stage is focused [Jasper; #700735]
|
||||
* Add API to query the monitor for a given position [Adel]
|
||||
* Don't force attached dialogs to be border-only [Florian; #702764]
|
||||
* Allow slicing of backgrounds to avoid texture size limits [Ray; #702283]
|
||||
* Miscellaneous bug fixes and cleanups [Adel; #701224, #702564]
|
||||
|
||||
Contributors:
|
||||
Allan Day, Adel Gadllah, Florian Müllner, Jasper St. Pierre, Ray Strode
|
||||
|
||||
3.9.3
|
||||
=====
|
||||
* Ensure events are always reported to the grab window [Rui; #701219]
|
||||
* Use new clutter_stage_set_paint_callback() function to prevent dropping
|
||||
frames with frame synced toolkits [Owen; #698794]
|
||||
|
||||
Contributors:
|
||||
Rui Matos, Owen W. Taylor
|
||||
|
||||
3.9.2
|
||||
=====
|
||||
* Add meta_window_can_close() function [Jasper; #699269]
|
||||
* Add support for string-array preferences [Florian; #700223]
|
||||
* Fix a potential race condition with _NET_WM_MOVERESIZE [Jasper; #699777]
|
||||
* Fix shade window action [Stef; #693714]
|
||||
* Remove overlay_group [Giovanni; #700735]
|
||||
* Improve tracking of the focus window [Dan, Jasper; #647706]
|
||||
* Add API to freeze/unfreeze the keyboard [Rui; #697001]
|
||||
* Grab and emit a signal when XK_ISO_Next_Group is pressed [Rui; #697002]
|
||||
* Misc bug fixes and cleanups [Dieter, Jasper, Rui; #699636, #700735, #697000]
|
||||
|
||||
Contributors:
|
||||
Giovanni Campagna, Rui Matos, Florian Müllner, Jasper St. Pierre,
|
||||
Dieter Verfaillie, Stef Walter, Dan Winship
|
||||
|
||||
Translations:
|
||||
Kjartan Maraas [nb], Ján Kyselica [sk]
|
||||
|
||||
3.9.1
|
||||
=====
|
||||
* Fix miscellaneous memory leaks [Pavel; #698710]
|
||||
* Misc fixes and cleanups [Stef, Simon; #698179, #697758]
|
||||
|
||||
Contributors:
|
||||
Simon McVittie, Pavel Vasin, Stef Walter
|
||||
|
||||
3.8.1
|
||||
=====
|
||||
* Fix crash when getting default font [Bastien; #696814]
|
||||
* Fix ungrabbing of keybindings [Rui; #697003]
|
||||
* Misc fixes and cleanups [Jasper, Simon; #697758]
|
||||
|
||||
Contributors:
|
||||
Jasper Lievisse Adriaanse, Rui Matos, Simon McVittie, Bastien Nocera
|
||||
|
||||
Translations:
|
||||
Guillaume Desmottes [fr], Shankar Prasad [kn], Bruce Cowan [en_GB],
|
||||
Andika Triwidada [id], Yaron Shahrabani [he], Kjartan Maraas [nb],
|
||||
Gheyret Kenji [ug]
|
||||
|
||||
3.8.0
|
||||
=====
|
||||
* Address major memory leak when changing backgrounds [Ray; #696157]
|
||||
|
||||
Contributors:
|
||||
Ray Strode
|
||||
|
||||
Translations:
|
||||
Sandeep Sheshrao Shedmake [mr], Victor Ibragimov [tg], Gabor Kelemen [hu],
|
||||
Ville-Pekka Vainio [fi], Rajesh Ranjan [hi], Dr.T.Vasudevan [ta],
|
||||
ManojKumar Giri [or], Yuri Myasoedov [ru], Petr Kovar [cs],
|
||||
Jiro Matsuzawa [ja], Krishnababu Krothapalli [te], Ani Peter [ml],
|
||||
Inaki Larranaga Murgoitio [eu]
|
||||
|
||||
3.7.92
|
||||
======
|
||||
* Build and improve reference docs [Tomeu; #676856, #695641, #695935]
|
||||
* Add tracking of whether there are fullscreen windows [Owen; 649748]
|
||||
* Misc bug fixes and cleanups [Adel, Giovanni, Owen, Jasper, Florian; #695269,
|
||||
#695711, #694046, #695813, #695881, #676856, #696053, #682779, #696089,
|
||||
#696091, #696087]
|
||||
|
||||
Contributors:
|
||||
Giovanni Campagna, Adel Gadllah, Florian Müllner, Jasper St. Pierre,
|
||||
Tomeu Vizoso, Owen W. Taylor
|
||||
|
||||
Translations:
|
||||
Chao-Hsiung Liao [zh_HK, zh_TW], Rafael Ferreira [pt_BR],
|
||||
Ihar Hrachyshka [be], Nilamdyuti Goswami [as], Matej Urbančič [sl],
|
||||
Dimitris Spingos [el], Jan Kyselica [sk], Khaled Hosny [ar],
|
||||
Мирослав Николић [sr, sr@latin], Duarte Loreto [pt], Sweta Kothari [gu],
|
||||
Milo Casagrande [it], Changwoo Ryu [ko], Gil Forcada [ca],
|
||||
Carles Ferrando [ca@valencia], Mattias Põldaru [et], Alexandre Franke [fr],
|
||||
Ask H. Larsen [da], Rūdolfs Mazurs [lv], Nguyễn Thái Ngọc Duy [vi]
|
||||
|
||||
3.7.91
|
||||
======
|
||||
* Fix windows being treated as remote after hostname changes [Ray; #688716]
|
||||
* Add meta_window_get_all_monitors() method [Adel; #646861]
|
||||
* Add grab API for externally defined accelerators [Florian; #643111]
|
||||
* Make session registration an explicit step [Ray; #694876]
|
||||
* Avoid unnecessary stage redraws [Adel; #694988, #695006]
|
||||
* Misc fixes [Giovanni, Ray, Jasper, Rui, Pavel, Owen; #694801, #694725,
|
||||
#694641, #694393, #678917, #695093, #694837, #695135, #694771, #694321]
|
||||
|
||||
Contributors:
|
||||
Giovanni Campagna, Adel Gadllah, Rui Matos, Florian Müllner,
|
||||
Jasper St. Pierre, Ray Strode, Owen Taylor, Pavel Vasin
|
||||
|
||||
Translations:
|
||||
Daniel Mustieles [es], Yaron Shahrabani [he], A S Alam [pa], Piotr Drąg [pl],
|
||||
Gheyret Kenji [ug], Alexandre Franke [fr], Milo Casagrande [it],
|
||||
Fran Diéguez [gl], Dimitris Spingos [el], Мирослав Николић [sr, sr@latin],
|
||||
Chao-Hsiung Liao [zh_HK, zh_TW], Nguyễn Thái Ngọc Duy [vi],
|
||||
Aurimas Černius [lt], Mario Blättermann [de], Kjartan Maraas [nb]
|
||||
|
||||
3.7.90
|
||||
======
|
||||
* Support _NET_WM_OPAQUE_REGION [Jasper, Adel; #679901]
|
||||
* Add wrapper for XI2.3 pointer barriers [Jasper; #677215]
|
||||
* Update style of resize popups [Cosimo; #692741]
|
||||
* Implement compositor <-> application frame synchronization [Owen; #685463]
|
||||
* Handle animated backgrounds [Ray; #682427]
|
||||
* Add a new window group for override-redirect windows [Gayan; #633620]
|
||||
* Pass on pointer events on guard window to Clutter [Jasper; #681540]
|
||||
* Show correct shortcut in window menus [Giovanni; #694045]
|
||||
* Don't put minimized windows at the back of alt-tab [Jasper; #693991]
|
||||
* Misc bug fixes and cleanups [Jasper, Rico, Adel, Florian, Rui, Giovanni,
|
||||
Owen; #692679, #693354, #690581, #693439, #692718, #693475, #693482, #693540,
|
||||
#690580, #680990, #693833, #693922, #693854, #694224]
|
||||
|
||||
Contributors:
|
||||
Giovanni Campagna, Cosimo Cecchi, Adel Gadllah, Rui Matos, Florian Müllner,
|
||||
Gayan Perera, Jasper St. Pierre, Ray Strode, Owen Taylor, Rico Tzschichholz
|
||||
|
||||
Translations:
|
||||
Fran Diéguez [gl], A S Alam [pa], Alexandre Franke [fr], Aurimas Černius [lt],
|
||||
Мирослав Николић [sr, sr@latin], Fran Diéguez [gl], Piotr Drąg [pl],
|
||||
Luca Ferretti [it], Daniel Mustieles [es]
|
||||
|
||||
3.7.5
|
||||
=====
|
||||
* Don't allow multiline window titles [Jon; #683056]
|
||||
* Make meta_window_located_on_workspace() public [Jasper; #691744]
|
||||
* Request XI2.3 [Colin; #692877]
|
||||
* Add meta_window_set_icon_geometry() method [Florian; #692997]
|
||||
* Require XFixes 5.0 [Jasper; #677215]
|
||||
* Change unredirection hints to match spec changes [Adel; #693064]
|
||||
* Improve unredict heuristicts [Adel; #683786]
|
||||
* Misc bug fixes and cleanups [Florian, Jasper, Adel; #691874, #679901,
|
||||
#692952, #693042]
|
||||
|
||||
Contributors:
|
||||
Adel Gadllah, William Jon McCann, Florian Müllner, Jasper St. Pierre,
|
||||
Colin Walters
|
||||
|
||||
Translations:
|
||||
Daniel Mustieles [es], Ihar Hrachyshka [be], Nilamdyuti Goswami [as],
|
||||
Gheyret Kenji [ug], Kjartan Maraas [nb], Yaron Shahrabani [he],
|
||||
Piotr Drąg [pl], Chao-Hsiung Liao [zh_HK,zh_TW], Milo Casagrande [it]
|
||||
|
||||
3.7.4
|
||||
=====
|
||||
* Add support for bypass compositor hints [Adel; #683020]
|
||||
* Make automaximization optional [Adel; #680990]
|
||||
* Add method for checking if the application is responding [Giovanni; #684340]
|
||||
* Expose the xinput opcode [Jasper; #690590]
|
||||
* Rebrand "minimize" as "hide" [Florian; #682887]
|
||||
* Misc bug fixes and cleanups [Giovanni, Ray, Jasper, Matthias, Debarshi,
|
||||
Florian, Rui; #690454, #690573, #690593, #690956, #691363, #690609, #690317,
|
||||
#689263]
|
||||
|
||||
Contributors:
|
||||
Giovanni Campagna, Matthias Clasen, Adel Gadllah, Rui Matos, Florian Müllner,
|
||||
Debarshi Ray, Jasper St. Pierre, Ray Strode
|
||||
|
||||
Translations:
|
||||
Mattias Põldaru [et], Yaron Shahrabani [he], Daniel Mustieles [es],
|
||||
Khaled Hosny [ar], Fran Diéguez [gl], A S Alam [pa], Piotr Drąg [pl],
|
||||
Rafael Ferreira [pt_BR], Nilamdyuti Goswami [as], Alexander Shopov [bg],
|
||||
Matej Urbančič [sl]
|
||||
|
||||
3.7.3
|
||||
=====
|
||||
* Fix maximized windows jumping to other monitors [Alban; #556696]
|
||||
* Add 'switch-applications' keybinding [Florian; #688913]
|
||||
* Add a convenience method to focus the default window [Jasper; #689652]
|
||||
* Increase typical icon size to 96 [Jasper; #689651]
|
||||
* Port to XInput2 [Jasper; #688779]
|
||||
* Give dynamic keybindings a keybinding action [Florian; #682315]
|
||||
* Misc. fixes and cleanups [Jasper, Rui; #688777]
|
||||
|
||||
Contributors:
|
||||
Alban Crequy, Rui Matos, Florian Müllner, Jasper St. Pierre
|
||||
|
||||
Translations:
|
||||
Nilamdyuti Goswami [as], Piotr Drąg [pl], Yaron Shahrabani [he],
|
||||
Dr.T.Vasudevan [ta], ManojKumar Giri [or], Shankar Prasad [kn]
|
||||
|
||||
3.7.2
|
||||
=====
|
||||
* Fix spurious focus changes when showing desktop [Florian; #686928]
|
||||
|
18
README
18
README
@ -1,16 +1,10 @@
|
||||
Metacity is not a meta-City as in an urban center, but rather
|
||||
Meta-ness as in the state of being meta. i.e. metacity : meta as
|
||||
opacity : opaque. Also it may have something to do with the Meta key
|
||||
on UNIX keyboards.
|
||||
The original codebase named "Metacity" is not a meta-City as in an
|
||||
urban center, but rather Meta-ness as in the state of being
|
||||
meta. i.e. metacity : meta as opacity : opaque. Also it may have
|
||||
something to do with the Meta key on UNIX keyboards.
|
||||
|
||||
The first release of Metacity was version 2.3. Metacity has no need for
|
||||
your petty hangups about version numbers.
|
||||
|
||||
The stable releases so far are 2.4.x, 2.6.x, 2.8.[01], 2.8.1.x, 2.8.5-,
|
||||
2.10.x, 2.12.x, 2.14.x, 2.16.x.
|
||||
|
||||
Unstable branches are 2.3.x, 2.5.x, 2.8.2-4, 2.9.x, 2.11.x, 2.13.x,
|
||||
2.15.x, 2.17.x.
|
||||
Since then, it has been renamed mutter after a rebase on top of
|
||||
clutter as a compositing manager.
|
||||
|
||||
COMPILING MUTTER
|
||||
===
|
||||
|
@ -7,7 +7,7 @@ test -z "$srcdir" && srcdir=.
|
||||
PKG_NAME="mutter"
|
||||
REQUIRED_AUTOMAKE_VERSION=1.10
|
||||
|
||||
(test -f $srcdir/configure.in \
|
||||
(test -f $srcdir/configure.ac \
|
||||
&& test -d $srcdir/src) || {
|
||||
echo -n "**Error**: Directory "\`$srcdir\'" does not look like the"
|
||||
echo " top-level metacity directory"
|
||||
|
@ -1,8 +1,8 @@
|
||||
AC_PREREQ(2.50)
|
||||
|
||||
m4_define([mutter_major_version], [3])
|
||||
m4_define([mutter_minor_version], [7])
|
||||
m4_define([mutter_micro_version], [2])
|
||||
m4_define([mutter_minor_version], [9])
|
||||
m4_define([mutter_micro_version], [5])
|
||||
|
||||
m4_define([mutter_version],
|
||||
[mutter_major_version.mutter_minor_version.mutter_micro_version])
|
||||
@ -71,10 +71,12 @@ MUTTER_PC_MODULES="
|
||||
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
|
||||
gsettings-desktop-schemas >= 3.7.3
|
||||
xcomposite >= 0.2 xfixes xrender xdamage xi >= 1.6.0
|
||||
$CLUTTER_PACKAGE >= 1.14.3
|
||||
cogl-1.0 >= 1.13.3
|
||||
upower-glib > 0.9.11
|
||||
gnome-desktop-3.0
|
||||
"
|
||||
|
||||
GLIB_GSETTINGS
|
||||
@ -118,9 +120,6 @@ AM_GLIB_GNU_GETTEXT
|
||||
## here we get the flags we'll actually use
|
||||
# GRegex requires Glib-2.14.0
|
||||
PKG_CHECK_MODULES(ALL, glib-2.0 >= 2.14.0)
|
||||
# gtk_window_set_icon_name requires gtk2+-2.6.0
|
||||
PKG_CHECK_MODULES(MUTTER_MESSAGE, gtk+-3.0)
|
||||
PKG_CHECK_MODULES(MUTTER_WINDOW_DEMO, gtk+-3.0)
|
||||
|
||||
# Unconditionally use this dir to avoid a circular dep with gnomecc
|
||||
GNOME_KEYBINDINGS_KEYSDIR="${datadir}/gnome-control-center/keybindings"
|
||||
@ -201,6 +200,9 @@ fi
|
||||
|
||||
PKG_CHECK_MODULES(MUTTER, $MUTTER_PC_MODULES)
|
||||
|
||||
PKG_CHECK_EXISTS([xi >= 1.6.99.1],
|
||||
AC_DEFINE([HAVE_XI23],[1],[Define if you have support for XInput 2.3 or greater]))
|
||||
|
||||
# This is used for plugins
|
||||
AC_SUBST(CLUTTER_PACKAGE)
|
||||
PKG_CHECK_MODULES(CLUTTER, $CLUTTER_PACKAGE)
|
||||
@ -304,9 +306,6 @@ if test "x$found_xsync" = "xyes"; then
|
||||
fi
|
||||
|
||||
MUTTER_LIBS="$MUTTER_LIBS $XSYNC_LIBS $RANDR_LIBS $SHAPE_LIBS $X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS -lm"
|
||||
MUTTER_MESSAGE_LIBS="$MUTTER_MESSAGE_LIBS $X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS"
|
||||
MUTTER_WINDOW_DEMO_LIBS="$MUTTER_WINDOW_DEMO_LIBS $X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS -lm"
|
||||
MUTTER_PROPS_LIBS="$MUTTER_PROPS_LIBS $X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS"
|
||||
|
||||
found_sm=no
|
||||
case "$MUTTER_LIBS" in
|
||||
@ -361,8 +360,7 @@ if test "x$enable_debug" = "xyes"; then
|
||||
CFLAGS="$CFLAGS -g -O"
|
||||
fi
|
||||
|
||||
# For fix-meta-rectangle.py
|
||||
AM_PATH_PYTHON([2.5])
|
||||
GTK_DOC_CHECK([1.15], [--flavour no-tmpl])
|
||||
|
||||
#### Warnings (last since -Werror can disturb other tests)
|
||||
|
||||
@ -434,11 +432,11 @@ AC_CONFIG_FILES([
|
||||
Makefile
|
||||
doc/Makefile
|
||||
doc/man/Makefile
|
||||
doc/reference/Makefile
|
||||
doc/reference/meta-docs.sgml
|
||||
src/Makefile
|
||||
src/wm-tester/Makefile
|
||||
src/libmutter.pc
|
||||
src/mutter-plugins.pc
|
||||
src/tools/Makefile
|
||||
src/compositor/plugins/Makefile
|
||||
po/Makefile.in
|
||||
])
|
@ -1,4 +1,4 @@
|
||||
SUBDIRS = man
|
||||
SUBDIRS = man reference
|
||||
|
||||
EXTRA_DIST=theme-format.txt dialogs.txt code-overview.txt \
|
||||
how-to-get-focus-right.txt
|
||||
|
166
doc/reference/Makefile.am
Normal file
166
doc/reference/Makefile.am
Normal file
@ -0,0 +1,166 @@
|
||||
## Process this file with automake to produce Makefile.in
|
||||
|
||||
# We require automake 1.6 at least.
|
||||
AUTOMAKE_OPTIONS = 1.6
|
||||
|
||||
# This is a blank Makefile.am for using gtk-doc.
|
||||
# Copy this to your project's API docs directory and modify the variables to
|
||||
# suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples
|
||||
# of using the various options.
|
||||
|
||||
# The name of the module, e.g. 'glib'.
|
||||
DOC_MODULE=meta
|
||||
|
||||
# Uncomment for versioned docs and specify the version of the module, e.g. '2'.
|
||||
#DOC_MODULE_VERSION=2
|
||||
|
||||
|
||||
# The top-level SGML file. You can change this if you want to.
|
||||
DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.sgml
|
||||
|
||||
# Directories containing the source code, relative to $(srcdir).
|
||||
# gtk-doc will search all .c and .h files beneath these paths
|
||||
# for inline comments documenting functions and macros.
|
||||
# e.g. DOC_SOURCE_DIR=../../../gtk ../../../gdk
|
||||
DOC_SOURCE_DIR=../../src/
|
||||
|
||||
# Extra options to pass to gtkdoc-scangobj. Not normally needed.
|
||||
SCANGOBJ_OPTIONS=
|
||||
|
||||
# Extra options to supply to gtkdoc-scan.
|
||||
# e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED"
|
||||
SCAN_OPTIONS=--rebuild-types
|
||||
|
||||
# Extra options to supply to gtkdoc-mkdb.
|
||||
# e.g. MKDB_OPTIONS=--xml-mode --output-format=xml
|
||||
MKDB_OPTIONS=--xml-mode --output-format=xml
|
||||
|
||||
# Extra options to supply to gtkdoc-mktmpl
|
||||
# e.g. MKTMPL_OPTIONS=--only-section-tmpl
|
||||
MKTMPL_OPTIONS=
|
||||
|
||||
# Extra options to supply to gtkdoc-mkhtml
|
||||
MKHTML_OPTIONS=
|
||||
|
||||
# Extra options to supply to gtkdoc-fixref. Not normally needed.
|
||||
# e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html
|
||||
FIXXREF_OPTIONS=
|
||||
|
||||
# Used for dependencies. The docs will be rebuilt if any of these change.
|
||||
# e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h
|
||||
# e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c
|
||||
HFILE_GLOB=$(top_srcdir)/src/*.h
|
||||
CFILE_GLOB=$(top_srcdir)/src/*.c
|
||||
|
||||
# Extra header to include when scanning, which are not under DOC_SOURCE_DIR
|
||||
# e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h
|
||||
EXTRA_HFILES=
|
||||
|
||||
# Header files or dirs to ignore when scanning. Use base file/dir names
|
||||
# e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h private_code
|
||||
IGNORE_HFILES= \
|
||||
async-getprop.h \
|
||||
atoms.h \
|
||||
bell.h \
|
||||
boxes-private.h \
|
||||
clutter-utils.h \
|
||||
cogl-utils.h \
|
||||
compositor-private.h \
|
||||
constraints.h \
|
||||
core.h \
|
||||
display-private.h \
|
||||
draw-workspace.h \
|
||||
edge-resistance.h \
|
||||
eventqueue.h \
|
||||
frame.h \
|
||||
frames.h \
|
||||
group-private.h \
|
||||
group-props.h \
|
||||
iconcache.h \
|
||||
inlinepixbufs.h \
|
||||
keybindings-private.h \
|
||||
menu.h \
|
||||
metaaccellabel.h \
|
||||
meta-background-actor-private.h \
|
||||
meta-background-group-private.h \
|
||||
meta-module.h \
|
||||
meta-plugin-manager.h \
|
||||
meta-shadow-factory-private.h \
|
||||
meta-texture-rectangle.h \
|
||||
meta-texture-tower.h \
|
||||
meta-window-actor-private.h \
|
||||
meta-window-group.h \
|
||||
meta-window-shape.h \
|
||||
mutter-enum-types.h \
|
||||
mutter-Xatomtype.h \
|
||||
place.h \
|
||||
preview-widget.h \
|
||||
region-utils.h \
|
||||
resizepopup.h \
|
||||
screen-private.h \
|
||||
session.h \
|
||||
stack.h \
|
||||
stack-tracker.h \
|
||||
stamp-mutter-enum-types.h \
|
||||
tabpopup.h \
|
||||
theme.h \
|
||||
theme-private.h \
|
||||
tile-preview.h \
|
||||
ui.h \
|
||||
window-private.h \
|
||||
window-props.h \
|
||||
workspace-private.h \
|
||||
xprops.h \
|
||||
$(NULL)
|
||||
|
||||
MKDB_OPTIONS+=--ignore-files="$(IGNORE_HFILES)"
|
||||
|
||||
# Images to copy into HTML directory.
|
||||
# e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png
|
||||
HTML_IMAGES=
|
||||
|
||||
# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE).
|
||||
# e.g. content_files=running.sgml building.sgml changes-2.0.sgml
|
||||
content_files= \
|
||||
mutter-overview.xml \
|
||||
running-mutter.xml \
|
||||
$(NULL)
|
||||
|
||||
# SGML files where gtk-doc abbrevations (#GtkWidget) are expanded
|
||||
# These files must be listed here *and* in content_files
|
||||
# e.g. expand_content_files=running.sgml
|
||||
expand_content_files= \
|
||||
mutter-overview.xml \
|
||||
running-mutter.xml \
|
||||
$(NULL)
|
||||
|
||||
# CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library.
|
||||
# Only needed if you are using gtkdoc-scangobj to dynamically query widget
|
||||
# signals and properties.
|
||||
# e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS)
|
||||
# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib)
|
||||
GTKDOC_CFLAGS=$(MUTTER_CFLAGS)
|
||||
GTKDOC_LIBS=$(MUTTER_LIBS) $(top_builddir)/src/libmutter.la
|
||||
|
||||
# This includes the standard gtk-doc make rules, copied by gtkdocize.
|
||||
include $(top_srcdir)/gtk-doc.make
|
||||
|
||||
# Other files to distribute
|
||||
# e.g. EXTRA_DIST += version.xml.in
|
||||
EXTRA_DIST +=
|
||||
|
||||
# Files not to distribute
|
||||
# for --rebuild-types in $(SCAN_OPTIONS), e.g. $(DOC_MODULE).types
|
||||
# for --rebuild-sections in $(SCAN_OPTIONS) e.g. $(DOC_MODULE)-sections.txt
|
||||
DISTCLEANFILES = $(DOC_MODULES).types
|
||||
|
||||
# Comment this out if you want 'make check' to test you doc status
|
||||
# and run some sanity checks
|
||||
if ENABLE_GTK_DOC
|
||||
TESTS_ENVIRONMENT = cd $(srcdir) && \
|
||||
DOC_MODULE=$(DOC_MODULE) DOC_MAIN_SGML_FILE=$(DOC_MAIN_SGML_FILE) \
|
||||
SRCDIR=$(abs_srcdir) BUILDDIR=$(abs_builddir)
|
||||
#TESTS = $(GTKDOC_CHECK)
|
||||
endif
|
||||
|
||||
-include $(top_srcdir)/git.mk
|
59
doc/reference/meta-docs.sgml.in
Normal file
59
doc/reference/meta-docs.sgml.in
Normal file
@ -0,0 +1,59 @@
|
||||
<?xml version="1.0"?>
|
||||
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
|
||||
"http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd"
|
||||
[
|
||||
<!ENTITY % local.common.attrib "xmlns:xi CDATA #FIXED 'http://www.w3.org/2003/XInclude'">
|
||||
<!ENTITY version "@VERSION@">
|
||||
]>
|
||||
<book id="index">
|
||||
<bookinfo>
|
||||
<title>Mutter Reference Manual</title>
|
||||
<releaseinfo>
|
||||
This document is for Mutter &version;.
|
||||
The latest version of this documentation can be found on-line at
|
||||
<ulink role="online-location" url="http://developer.gnome.org/meta/">http://developer.gnome.org/meta/</ulink>.
|
||||
</releaseinfo>
|
||||
</bookinfo>
|
||||
|
||||
<xi:include href="xml/mutter-overview.xml"/>
|
||||
<xi:include href="xml/running-mutter.xml"/>
|
||||
|
||||
<part id="core-reference">
|
||||
<title>Mutter Core Reference</title>
|
||||
<xi:include href="xml/main.xml"/>
|
||||
<xi:include href="xml/common.xml"/>
|
||||
<xi:include href="xml/gradient.xml"/>
|
||||
<xi:include href="xml/prefs.xml"/>
|
||||
<xi:include href="xml/util.xml"/>
|
||||
<xi:include href="xml/errors.xml"/>
|
||||
<xi:include href="xml/meta-plugin.xml"/>
|
||||
<xi:include href="xml/barrier.xml"/>
|
||||
<xi:include href="xml/boxes.xml"/>
|
||||
<xi:include href="xml/compositor.xml"/>
|
||||
<xi:include href="xml/display.xml"/>
|
||||
<xi:include href="xml/group.xml"/>
|
||||
<xi:include href="xml/keybindings.xml"/>
|
||||
<xi:include href="xml/meta-background-actor.xml"/>
|
||||
<xi:include href="xml/meta-shadow-factory.xml"/>
|
||||
<xi:include href="xml/meta-shaped-texture.xml"/>
|
||||
<xi:include href="xml/meta-window-actor.xml"/>
|
||||
<xi:include href="xml/screen.xml"/>
|
||||
<xi:include href="xml/window.xml"/>
|
||||
<xi:include href="xml/workspace.xml"/>
|
||||
</part>
|
||||
|
||||
<chapter id="object-tree">
|
||||
<title>Object Hierarchy</title>
|
||||
<xi:include href="xml/tree_index.sgml"/>
|
||||
</chapter>
|
||||
<index id="api-index-full">
|
||||
<title>API Index</title>
|
||||
<xi:include href="xml/api-index-full.xml"><xi:fallback /></xi:include>
|
||||
</index>
|
||||
<index id="deprecated-api-index" role="deprecated">
|
||||
<title>Index of deprecated API</title>
|
||||
<xi:include href="xml/api-index-deprecated.xml"><xi:fallback /></xi:include>
|
||||
</index>
|
||||
|
||||
<xi:include href="xml/annotation-glossary.xml"><xi:fallback /></xi:include>
|
||||
</book>
|
666
doc/reference/meta-sections.txt
Normal file
666
doc/reference/meta-sections.txt
Normal file
@ -0,0 +1,666 @@
|
||||
<SECTION>
|
||||
<FILE>barrier</FILE>
|
||||
<TITLE>MetaBarrier</TITLE>
|
||||
MetaBarrier
|
||||
MetaBarrierClass
|
||||
meta_barrier_is_active
|
||||
meta_barrier_destroy
|
||||
meta_barrier_release
|
||||
MetaBarrierDirection
|
||||
MetaBarrierEvent
|
||||
<SUBSECTION Standard>
|
||||
META_BARRIER
|
||||
META_BARRIER_CLASS
|
||||
META_BARRIER_GET_CLASS
|
||||
META_IS_BARRIER
|
||||
META_IS_BARRIER_CLASS
|
||||
META_TYPE_BARRIER
|
||||
META_TYPE_BARRIER_EVENT
|
||||
MetaBarrierPrivate
|
||||
meta_barrier_event_get_type
|
||||
meta_barrier_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>boxes</FILE>
|
||||
MetaRectangle
|
||||
MetaStrut
|
||||
MetaEdgeType
|
||||
MetaEdge
|
||||
meta_rectangle_copy
|
||||
meta_rectangle_free
|
||||
meta_rect
|
||||
meta_rectangle_area
|
||||
meta_rectangle_intersect
|
||||
meta_rectangle_equal
|
||||
meta_rectangle_union
|
||||
meta_rectangle_overlap
|
||||
meta_rectangle_vert_overlap
|
||||
meta_rectangle_horiz_overlap
|
||||
meta_rectangle_could_fit_rect
|
||||
meta_rectangle_contains_rect
|
||||
<SUBSECTION Standard>
|
||||
META_TYPE_RECTANGLE
|
||||
meta_rectangle_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>common</FILE>
|
||||
META_VIRTUAL_CORE_POINTER_ID
|
||||
META_VIRTUAL_CORE_KEYBOARD_ID
|
||||
MetaFrameFlags
|
||||
MetaMenuOp
|
||||
MetaWindowMenuFunc
|
||||
MetaGrabOp
|
||||
MetaCursor
|
||||
MetaFrameType
|
||||
MetaVirtualModifier
|
||||
MetaDirection
|
||||
MetaMotionDirection
|
||||
MetaSide
|
||||
MetaButtonFunction
|
||||
MAX_BUTTONS_PER_CORNER
|
||||
MetaButtonLayout
|
||||
MetaFrameBorders
|
||||
meta_frame_borders_clear
|
||||
META_ICON_WIDTH
|
||||
META_ICON_HEIGHT
|
||||
META_MINI_ICON_WIDTH
|
||||
META_MINI_ICON_HEIGHT
|
||||
META_DEFAULT_ICON_NAME
|
||||
META_PRIORITY_RESIZE
|
||||
META_PRIORITY_BEFORE_REDRAW
|
||||
META_PRIORITY_REDRAW
|
||||
META_PRIORITY_PREFS_NOTIFY
|
||||
POINT_IN_RECT
|
||||
MetaStackLayer
|
||||
MetaWindowMenu
|
||||
MetaResizePopup
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>compositor</FILE>
|
||||
MetaCompEffect
|
||||
MetaCompositor
|
||||
meta_compositor_new
|
||||
meta_compositor_destroy
|
||||
meta_compositor_manage_screen
|
||||
meta_compositor_unmanage_screen
|
||||
meta_compositor_window_shape_changed
|
||||
meta_compositor_process_event
|
||||
meta_compositor_filter_keybinding
|
||||
meta_compositor_add_window
|
||||
meta_compositor_remove_window
|
||||
meta_compositor_show_window
|
||||
meta_compositor_hide_window
|
||||
meta_compositor_switch_workspace
|
||||
meta_compositor_maximize_window
|
||||
meta_compositor_unmaximize_window
|
||||
meta_compositor_window_mapped
|
||||
meta_compositor_window_unmapped
|
||||
meta_compositor_sync_window_geometry
|
||||
meta_compositor_set_updates_frozen
|
||||
meta_compositor_queue_frame_drawn
|
||||
meta_compositor_sync_stack
|
||||
meta_compositor_sync_screen_size
|
||||
meta_compositor_flash_screen
|
||||
meta_get_stage_for_screen
|
||||
meta_get_overlay_group_for_screen
|
||||
meta_get_overlay_window
|
||||
meta_get_window_actors
|
||||
meta_get_window_group_for_screen
|
||||
meta_get_top_window_group_for_screen
|
||||
meta_disable_unredirect_for_screen
|
||||
meta_enable_unredirect_for_screen
|
||||
meta_set_stage_input_region
|
||||
meta_empty_stage_input_region
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>display</FILE>
|
||||
MetaTabList
|
||||
MetaTabShowType
|
||||
meta_XFree
|
||||
meta_display_get_compositor_version
|
||||
meta_display_get_xinput_opcode
|
||||
meta_display_supports_extended_barriers
|
||||
meta_display_get_xdisplay
|
||||
meta_display_get_compositor
|
||||
meta_display_get_screens
|
||||
meta_display_has_shape
|
||||
meta_display_screen_for_root
|
||||
meta_display_get_focus_window
|
||||
meta_display_xwindow_is_a_no_focus_window
|
||||
meta_display_get_damage_event_base
|
||||
meta_display_get_shape_event_base
|
||||
meta_display_xserver_time_is_before
|
||||
meta_display_get_last_user_time
|
||||
meta_display_get_current_time
|
||||
meta_display_get_current_time_roundtrip
|
||||
meta_display_get_ignored_modifier_mask
|
||||
meta_display_get_tab_list
|
||||
meta_display_get_tab_next
|
||||
meta_display_get_tab_current
|
||||
meta_display_begin_grab_op
|
||||
meta_display_end_grab_op
|
||||
meta_display_get_grab_op
|
||||
meta_display_add_keybinding
|
||||
meta_display_remove_keybinding
|
||||
meta_display_get_keybinding_action
|
||||
meta_display_set_input_focus_window
|
||||
meta_display_focus_the_no_focus_window
|
||||
meta_display_sort_windows_by_stacking
|
||||
meta_display_get_leader_window
|
||||
meta_display_add_ignored_crossing_serial
|
||||
meta_display_unmanage_screen
|
||||
meta_display_clear_mouse_mode
|
||||
MetaDisplay
|
||||
MetaDisplayClass
|
||||
<SUBSECTION Standard>
|
||||
META_DISPLAY
|
||||
META_DISPLAY_CLASS
|
||||
META_DISPLAY_GET_CLASS
|
||||
META_IS_DISPLAY
|
||||
META_IS_DISPLAY_CLASS
|
||||
META_TYPE_DISPLAY
|
||||
meta_display_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>errors</FILE>
|
||||
meta_error_trap_push
|
||||
meta_error_trap_pop
|
||||
meta_error_trap_push_with_return
|
||||
meta_error_trap_pop_with_return
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>gradient</FILE>
|
||||
MetaGradientType
|
||||
meta_gradient_create_simple
|
||||
meta_gradient_create_multi
|
||||
meta_gradient_create_interwoven
|
||||
meta_gradient_add_alpha
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>group</FILE>
|
||||
MetaGroup
|
||||
meta_window_get_group
|
||||
meta_window_compute_group
|
||||
meta_window_shutdown_group
|
||||
meta_window_group_leader_changed
|
||||
meta_display_lookup_group
|
||||
meta_group_list_windows
|
||||
meta_group_update_layers
|
||||
meta_group_get_startup_id
|
||||
meta_group_get_size
|
||||
meta_group_property_notify
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>keybindings</FILE>
|
||||
MetaKeyBinding
|
||||
META_TYPE_KEY_BINDING
|
||||
meta_key_binding_get_name
|
||||
meta_key_binding_get_modifiers
|
||||
meta_key_binding_get_mask
|
||||
meta_key_binding_is_builtin
|
||||
meta_keybindings_set_custom_handler
|
||||
meta_keybindings_switch_window
|
||||
meta_screen_ungrab_all_keys
|
||||
meta_screen_grab_all_keys
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>main</FILE>
|
||||
meta_get_option_context
|
||||
meta_init
|
||||
meta_run
|
||||
meta_get_replace_current_wm
|
||||
meta_set_wm_name
|
||||
meta_set_gnome_wm_keybindings
|
||||
MetaExitCode
|
||||
meta_exit
|
||||
meta_quit
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>meta-background</FILE>
|
||||
<TITLE>MetaBackground</TITLE>
|
||||
MetaBackgroundEffects
|
||||
MetaBackground
|
||||
MetaBackgroundClass
|
||||
meta_background_new
|
||||
meta_background_copy
|
||||
meta_background_load_gradient
|
||||
meta_background_load_color
|
||||
meta_background_load_still_frame
|
||||
meta_background_load_file_async
|
||||
meta_background_load_file_finish
|
||||
meta_background_get_filename
|
||||
meta_background_get_style
|
||||
meta_background_get_shading
|
||||
meta_background_get_color
|
||||
meta_background_get_second_color
|
||||
<SUBSECTION Standard>
|
||||
META_BACKGROUND
|
||||
META_BACKGROUND_CLASS
|
||||
META_BACKGROUND_GET_CLASS
|
||||
META_IS_BACKGROUND
|
||||
META_IS_BACKGROUND_CLASS
|
||||
META_TYPE_BACKGROUND
|
||||
MetaBackgroundPrivate
|
||||
meta_background_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>meta-background-actor</FILE>
|
||||
<TITLE>MetaBackgroundActor</TITLE>
|
||||
MetaBackgroundActor
|
||||
MetaBackgroundActorClass
|
||||
meta_background_actor_new_for_screen
|
||||
MetaSnippetHook
|
||||
meta_background_actor_add_glsl_snippet
|
||||
meta_background_actor_set_uniform_float
|
||||
<SUBSECTION Standard>
|
||||
META_BACKGROUND_ACTOR
|
||||
META_BACKGROUND_ACTOR_CLASS
|
||||
META_BACKGROUND_ACTOR_GET_CLASS
|
||||
META_IS_BACKGROUND_ACTOR
|
||||
META_IS_BACKGROUND_ACTOR_CLASS
|
||||
META_TYPE_BACKGROUND_ACTOR
|
||||
MetaBackgroundActorPrivate
|
||||
meta_background_actor_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>meta-background-group</FILE>
|
||||
<TITLE>MetaBackgroundGroup</TITLE>
|
||||
MetaBackgroundGroupClass
|
||||
meta_background_group_new
|
||||
<SUBSECTION Standard>
|
||||
META_BACKGROUND_GROUP
|
||||
META_BACKGROUND_GROUP_CLASS
|
||||
META_BACKGROUND_GROUP_GET_CLASS
|
||||
META_IS_BACKGROUND_GROUP
|
||||
META_IS_BACKGROUND_GROUP_CLASS
|
||||
META_TYPE_BACKGROUND_GROUP
|
||||
MetaBackgroundGroupPrivate
|
||||
meta_background_group_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>meta-plugin</FILE>
|
||||
<TITLE>MetaPlugin</TITLE>
|
||||
MetaPlugin
|
||||
MetaPluginClass
|
||||
MetaPluginInfo
|
||||
meta_plugin_running
|
||||
meta_plugin_debug_mode
|
||||
meta_plugin_get_info
|
||||
MetaPluginVersion
|
||||
META_PLUGIN_DECLARE
|
||||
meta_plugin_switch_workspace_completed
|
||||
meta_plugin_minimize_completed
|
||||
meta_plugin_maximize_completed
|
||||
meta_plugin_unmaximize_completed
|
||||
meta_plugin_map_completed
|
||||
meta_plugin_destroy_completed
|
||||
MetaModalOptions
|
||||
meta_plugin_begin_modal
|
||||
meta_plugin_end_modal
|
||||
meta_plugin_get_screen
|
||||
meta_plugin_manager_set_plugin_type
|
||||
<SUBSECTION Standard>
|
||||
META_IS_PLUGIN
|
||||
META_IS_PLUGIN_CLASS
|
||||
META_PLUGIN
|
||||
META_PLUGIN_CLASS
|
||||
META_PLUGIN_GET_CLASS
|
||||
META_TYPE_PLUGIN
|
||||
MetaPluginPrivate
|
||||
meta_plugin_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>meta-shadow-factory</FILE>
|
||||
MetaShadowParams
|
||||
meta_shadow_factory_get_default
|
||||
meta_shadow_factory_set_params
|
||||
meta_shadow_factory_get_params
|
||||
MetaShadowFactory
|
||||
MetaShadowFactoryClass
|
||||
<SUBSECTION Standard>
|
||||
META_IS_SHADOW_FACTORY
|
||||
META_IS_SHADOW_FACTORY_CLASS
|
||||
META_SHADOW_FACTORY
|
||||
META_SHADOW_FACTORY_CLASS
|
||||
META_SHADOW_FACTORY_GET_CLASS
|
||||
META_TYPE_SHADOW_FACTORY
|
||||
meta_shadow_factory_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>meta-shaped-texture</FILE>
|
||||
<TITLE>MetaShapedTexture</TITLE>
|
||||
MetaShapedTexture
|
||||
MetaShapedTextureClass
|
||||
meta_shaped_texture_new
|
||||
meta_shaped_texture_set_create_mipmaps
|
||||
meta_shaped_texture_update_area
|
||||
meta_shaped_texture_set_pixmap
|
||||
meta_shaped_texture_get_texture
|
||||
meta_shaped_texture_set_mask_texture
|
||||
meta_shaped_texture_set_clip_region
|
||||
meta_shaped_texture_get_image
|
||||
<SUBSECTION Standard>
|
||||
META_IS_SHAPED_TEXTURE
|
||||
META_IS_SHAPED_TEXTURE_CLASS
|
||||
META_SHAPED_TEXTURE
|
||||
META_SHAPED_TEXTURE_CLASS
|
||||
META_SHAPED_TEXTURE_GET_CLASS
|
||||
META_TYPE_SHAPED_TEXTURE
|
||||
MetaShapedTexturePrivate
|
||||
meta_shaped_texture_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>meta-window-actor</FILE>
|
||||
<TITLE>MetaWindowActor</TITLE>
|
||||
MetaWindowActor
|
||||
MetaWindowActorClass
|
||||
meta_window_actor_get_x_window
|
||||
meta_window_actor_get_workspace
|
||||
meta_window_actor_get_meta_window
|
||||
meta_window_actor_get_texture
|
||||
meta_window_actor_is_override_redirect
|
||||
meta_window_actor_get_description
|
||||
meta_window_actor_showing_on_its_workspace
|
||||
meta_window_actor_is_destroyed
|
||||
<SUBSECTION Standard>
|
||||
META_IS_WINDOW_ACTOR
|
||||
META_IS_WINDOW_ACTOR_CLASS
|
||||
META_TYPE_WINDOW_ACTOR
|
||||
META_WINDOW_ACTOR
|
||||
META_WINDOW_ACTOR_CLASS
|
||||
META_WINDOW_ACTOR_GET_CLASS
|
||||
MetaWindowActorPrivate
|
||||
meta_window_actor_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>prefs</FILE>
|
||||
MetaPreference
|
||||
MetaPrefsChangedFunc
|
||||
meta_prefs_add_listener
|
||||
meta_prefs_remove_listener
|
||||
meta_prefs_init
|
||||
meta_prefs_override_preference_schema
|
||||
meta_preference_to_string
|
||||
meta_prefs_get_mouse_button_mods
|
||||
meta_prefs_get_mouse_button_resize
|
||||
meta_prefs_get_mouse_button_menu
|
||||
meta_prefs_get_focus_mode
|
||||
meta_prefs_get_focus_new_windows
|
||||
meta_prefs_get_attach_modal_dialogs
|
||||
meta_prefs_get_raise_on_click
|
||||
meta_prefs_get_theme
|
||||
meta_prefs_get_titlebar_font
|
||||
meta_prefs_get_num_workspaces
|
||||
meta_prefs_get_dynamic_workspaces
|
||||
meta_prefs_get_disable_workarounds
|
||||
meta_prefs_get_auto_raise
|
||||
meta_prefs_get_auto_raise_delay
|
||||
meta_prefs_get_focus_change_on_pointer_rest
|
||||
meta_prefs_get_gnome_accessibility
|
||||
meta_prefs_get_gnome_animations
|
||||
meta_prefs_get_edge_tiling
|
||||
meta_prefs_get_auto_maximize
|
||||
meta_prefs_get_button_layout
|
||||
meta_prefs_get_action_double_click_titlebar
|
||||
meta_prefs_get_action_middle_click_titlebar
|
||||
meta_prefs_get_action_right_click_titlebar
|
||||
meta_prefs_set_num_workspaces
|
||||
meta_prefs_get_workspace_name
|
||||
meta_prefs_change_workspace_name
|
||||
meta_prefs_get_cursor_theme
|
||||
meta_prefs_get_cursor_size
|
||||
meta_prefs_get_compositing_manager
|
||||
meta_prefs_get_force_fullscreen
|
||||
meta_prefs_set_force_fullscreen
|
||||
meta_prefs_get_workspaces_only_on_primary
|
||||
meta_prefs_get_no_tab_popup
|
||||
meta_prefs_set_no_tab_popup
|
||||
meta_prefs_get_draggable_border_width
|
||||
meta_prefs_get_ignore_request_hide_titlebar
|
||||
meta_prefs_set_ignore_request_hide_titlebar
|
||||
MetaKeyBindingAction
|
||||
MetaKeyBindingFlags
|
||||
MetaKeyCombo
|
||||
MetaKeyHandlerFunc
|
||||
meta_prefs_get_keybindings
|
||||
meta_prefs_get_keybinding_action
|
||||
meta_prefs_get_window_binding
|
||||
meta_prefs_get_overlay_binding
|
||||
meta_prefs_get_visual_bell
|
||||
meta_prefs_bell_is_audible
|
||||
meta_prefs_get_visual_bell_type
|
||||
MetaKeyHandler
|
||||
<SUBSECTION Standard>
|
||||
meta_key_binding_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>screen</FILE>
|
||||
MetaScreen
|
||||
MetaScreenClass
|
||||
meta_screen_get_screen_number
|
||||
meta_screen_get_display
|
||||
meta_screen_get_xroot
|
||||
meta_screen_get_size
|
||||
meta_screen_get_compositor_data
|
||||
meta_screen_set_compositor_data
|
||||
meta_screen_for_x_screen
|
||||
meta_screen_set_cm_selection
|
||||
meta_screen_unset_cm_selection
|
||||
meta_screen_get_startup_sequences
|
||||
meta_screen_get_workspaces
|
||||
meta_screen_get_n_workspaces
|
||||
meta_screen_get_workspace_by_index
|
||||
meta_screen_remove_workspace
|
||||
meta_screen_append_new_workspace
|
||||
meta_screen_get_active_workspace_index
|
||||
meta_screen_get_active_workspace
|
||||
meta_screen_get_n_monitors
|
||||
meta_screen_get_primary_monitor
|
||||
meta_screen_get_current_monitor
|
||||
meta_screen_get_monitor_geometry
|
||||
meta_screen_get_monitor_index_for_rect
|
||||
meta_screen_focus_default_window
|
||||
MetaScreenCorner
|
||||
meta_screen_override_workspace_layout
|
||||
<SUBSECTION Standard>
|
||||
META_IS_SCREEN
|
||||
META_IS_SCREEN_CLASS
|
||||
META_SCREEN
|
||||
META_SCREEN_CLASS
|
||||
META_SCREEN_GET_CLASS
|
||||
META_TYPE_SCREEN
|
||||
meta_screen_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>util</FILE>
|
||||
meta_is_verbose
|
||||
meta_set_verbose
|
||||
meta_is_debugging
|
||||
meta_set_debugging
|
||||
meta_is_syncing
|
||||
meta_set_syncing
|
||||
meta_set_replace_current_wm
|
||||
meta_debug_spew_real
|
||||
meta_verbose_real
|
||||
meta_bug
|
||||
meta_warning
|
||||
meta_fatal
|
||||
MetaDebugTopic
|
||||
meta_topic_real
|
||||
meta_add_verbose_topic
|
||||
meta_remove_verbose_topic
|
||||
meta_push_no_msg_prefix
|
||||
meta_pop_no_msg_prefix
|
||||
meta_unsigned_long_equal
|
||||
meta_unsigned_long_hash
|
||||
meta_frame_type_to_string
|
||||
meta_gravity_to_string
|
||||
_
|
||||
N_
|
||||
meta_g_utf8_strndup
|
||||
meta_free_gslist_and_elements
|
||||
meta_show_dialog
|
||||
meta_debug_spew
|
||||
meta_verbose
|
||||
meta_topic
|
||||
MetaLaterType
|
||||
meta_later_add
|
||||
meta_later_remove
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>window</FILE>
|
||||
MetaWindow
|
||||
MetaWindowClass
|
||||
MetaWindowType
|
||||
MetaMaximizeFlags
|
||||
meta_window_get_frame
|
||||
meta_window_has_focus
|
||||
meta_window_appears_focused
|
||||
meta_window_is_shaded
|
||||
meta_window_is_monitor_sized
|
||||
meta_window_is_override_redirect
|
||||
meta_window_is_skip_taskbar
|
||||
meta_window_get_rect
|
||||
meta_window_get_input_rect
|
||||
meta_window_get_outer_rect
|
||||
meta_window_get_screen
|
||||
meta_window_get_display
|
||||
meta_window_get_xwindow
|
||||
meta_window_get_window_type
|
||||
meta_window_get_window_type_atom
|
||||
meta_window_get_workspace
|
||||
meta_window_get_monitor
|
||||
meta_window_is_on_all_workspaces
|
||||
meta_window_located_on_workspace
|
||||
meta_window_is_hidden
|
||||
meta_window_activate
|
||||
meta_window_activate_with_workspace
|
||||
meta_window_get_description
|
||||
meta_window_get_wm_class
|
||||
meta_window_get_wm_class_instance
|
||||
meta_window_showing_on_its_workspace
|
||||
meta_window_get_gtk_application_id
|
||||
meta_window_get_gtk_unique_bus_name
|
||||
meta_window_get_gtk_application_object_path
|
||||
meta_window_get_gtk_window_object_path
|
||||
meta_window_get_gtk_app_menu_object_path
|
||||
meta_window_get_gtk_menubar_object_path
|
||||
meta_window_move
|
||||
meta_window_move_frame
|
||||
meta_window_move_resize_frame
|
||||
meta_window_move_to_monitor
|
||||
meta_window_resize
|
||||
meta_window_set_demands_attention
|
||||
meta_window_unset_demands_attention
|
||||
meta_window_get_startup_id
|
||||
meta_window_change_workspace_by_index
|
||||
meta_window_change_workspace
|
||||
meta_window_get_compositor_private
|
||||
meta_window_set_compositor_private
|
||||
meta_window_configure_notify
|
||||
meta_window_get_role
|
||||
meta_window_get_layer
|
||||
meta_window_find_root_ancestor
|
||||
meta_window_is_ancestor_of_transient
|
||||
MetaWindowForeachFunc
|
||||
meta_window_foreach_transient
|
||||
meta_window_foreach_ancestor
|
||||
meta_window_get_maximized
|
||||
meta_window_is_fullscreen
|
||||
meta_window_is_on_primary_monitor
|
||||
meta_window_requested_bypass_compositor
|
||||
meta_window_requested_dont_bypass_compositor
|
||||
meta_window_is_mapped
|
||||
meta_window_toplevel_is_mapped
|
||||
meta_window_get_icon_geometry
|
||||
meta_window_set_icon_geometry
|
||||
meta_window_maximize
|
||||
meta_window_unmaximize
|
||||
meta_window_minimize
|
||||
meta_window_unminimize
|
||||
meta_window_raise
|
||||
meta_window_lower
|
||||
meta_window_get_title
|
||||
meta_window_get_transient_for
|
||||
meta_window_get_transient_for_as_xid
|
||||
meta_window_delete
|
||||
meta_window_get_stable_sequence
|
||||
meta_window_get_user_time
|
||||
meta_window_get_pid
|
||||
meta_window_get_client_machine
|
||||
meta_window_is_remote
|
||||
meta_window_is_modal
|
||||
meta_window_is_attached_dialog
|
||||
meta_window_get_mutter_hints
|
||||
meta_window_get_frame_type
|
||||
meta_window_get_frame_bounds
|
||||
meta_window_get_tile_match
|
||||
meta_window_make_fullscreen
|
||||
meta_window_unmake_fullscreen
|
||||
meta_window_make_above
|
||||
meta_window_unmake_above
|
||||
meta_window_shade
|
||||
meta_window_unshade
|
||||
meta_window_stick
|
||||
meta_window_unstick
|
||||
meta_window_kill
|
||||
meta_window_focus
|
||||
meta_window_check_alive
|
||||
meta_window_get_work_area_current_monitor
|
||||
meta_window_get_work_area_for_monitor
|
||||
meta_window_get_work_area_all_monitors
|
||||
meta_window_begin_grab_op
|
||||
<SUBSECTION Standard>
|
||||
META_IS_WINDOW
|
||||
META_IS_WINDOW_CLASS
|
||||
META_TYPE_WINDOW
|
||||
META_WINDOW
|
||||
META_WINDOW_CLASS
|
||||
META_WINDOW_GET_CLASS
|
||||
meta_window_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>workspace</FILE>
|
||||
MetaWorkspace
|
||||
MetaWorkspaceClass
|
||||
meta_workspace_index
|
||||
meta_workspace_get_screen
|
||||
meta_workspace_list_windows
|
||||
meta_workspace_get_work_area_for_monitor
|
||||
meta_workspace_get_work_area_all_monitors
|
||||
meta_workspace_activate
|
||||
meta_workspace_activate_with_focus
|
||||
meta_workspace_update_window_hints
|
||||
meta_workspace_set_builtin_struts
|
||||
meta_workspace_get_neighbor
|
||||
<SUBSECTION Standard>
|
||||
META_IS_WORKSPACE
|
||||
META_IS_WORKSPACE_CLASS
|
||||
META_TYPE_WORKSPACE
|
||||
META_WORKSPACE
|
||||
META_WORKSPACE_CLASS
|
||||
META_WORKSPACE_GET_CLASS
|
||||
meta_workspace_get_type
|
||||
</SECTION>
|
||||
|
15
doc/reference/mutter-overview.xml
Normal file
15
doc/reference/mutter-overview.xml
Normal file
@ -0,0 +1,15 @@
|
||||
<part id="mutter-overview">
|
||||
|
||||
<title>Overview</title>
|
||||
|
||||
<partintro>
|
||||
|
||||
<para>Mutter is a GObject-based library for creating compositing window managers.</para>
|
||||
|
||||
<para>Compositors that wish to use Mutter must implement a subclass of #MetaPlugin and register it with meta_plugin_manager_set_plugin_type() before calling meta_init() but after g_type_init().</para>
|
||||
|
||||
<para>#MetaPlugin provides virtual functions that allow to override default behavior in the window management code, such as the effect to perform when a window is created or when switching workspaces.</para>
|
||||
|
||||
</partintro>
|
||||
|
||||
</part>
|
100
doc/reference/running-mutter.xml
Normal file
100
doc/reference/running-mutter.xml
Normal file
@ -0,0 +1,100 @@
|
||||
<part id="running-mutter">
|
||||
|
||||
<title>Running Mutter</title>
|
||||
|
||||
<partintro>
|
||||
|
||||
<section id="environment-variables">
|
||||
<title>Environment Variables</title>
|
||||
|
||||
<para>
|
||||
Mutter automatically checks environment variables during
|
||||
its initialization. These environment variables are meant
|
||||
as debug tools or overrides for default behaviours:
|
||||
</para>
|
||||
|
||||
<variablelist>
|
||||
<varlistentry>
|
||||
<term>MUTTER_VERBOSE</term>
|
||||
<listitem>
|
||||
<para>Enable verbose mode, in which more information is printed to the console. Mutter needs to be built with the --enable-verbose-mode option (enabled by default). For more fine-grained control of the output, see meta_add_verbose_topic().</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>MUTTER_DEBUG</term>
|
||||
<listitem>
|
||||
<para>Traps and prints X errors to the console.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>MUTTER_G_FATAL_WARNINGS</term>
|
||||
<listitem>
|
||||
<para>Causes any logging from the domains Mutter, Gtk, Gdk, Pango or GLib to terminate the process (only when using the log functions in GLib).</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>MUTTER_USE_LOGFILE</term>
|
||||
<listitem>
|
||||
<para>Log all messages to a temporary file.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>MUTTER_DEBUG_XINERAMA</term>
|
||||
<listitem>
|
||||
<para>Log extra information about support of the XINERAMA extension.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>MUTTER_DEBUG_SM</term>
|
||||
<listitem>
|
||||
<para>Log extra information about session management.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>MUTTER_DEBUG_BUTTON_GRABS</term>
|
||||
<listitem>
|
||||
<para>Log extra information about button grabs.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>MUTTER_SYNC</term>
|
||||
<listitem>
|
||||
<para>Call XSync after each X call.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>MUTTER_DISPLAY</term>
|
||||
<listitem>
|
||||
<para>Name of the X11 display to use.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>META_DISABLE_MIPMAPS</term>
|
||||
<listitem>
|
||||
<para>Disable use of mipmaps for the textures that back window pixmaps.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>MUTTER_USE_STATIC_GRAVITY</term>
|
||||
<listitem>
|
||||
<para>Enable support for clients with static bit-gravity.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>MUTTER_WM_CLASS_FILTER</term>
|
||||
<listitem>
|
||||
<para>Comma-separated list of WM_CLASS names to which to restrict Mutter to.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>MUTTER_DISABLE_FALLBACK_COLOR</term>
|
||||
<listitem>
|
||||
<para>Disable fallback for themed colors, for easier detection of typographical errors.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
|
||||
</section>
|
||||
|
||||
</partintro>
|
||||
</part>
|
@ -80,6 +80,7 @@ sr@latin
|
||||
sv
|
||||
ta
|
||||
te
|
||||
tg
|
||||
th
|
||||
tk
|
||||
tr
|
||||
|
@ -4,6 +4,7 @@ src/50-mutter-navigation.xml.in
|
||||
src/50-mutter-system.xml.in
|
||||
src/50-mutter-windows.xml.in
|
||||
src/compositor/compositor.c
|
||||
src/compositor/meta-background.c
|
||||
src/core/bell.c
|
||||
src/core/core.c
|
||||
src/core/delete.c
|
||||
@ -22,12 +23,9 @@ src/core/xprops.c
|
||||
src/mutter.desktop.in
|
||||
src/mutter-wm.desktop.in
|
||||
src/org.gnome.mutter.gschema.xml.in
|
||||
src/tools/mutter-message.c
|
||||
src/ui/frames.c
|
||||
src/ui/menu.c
|
||||
src/ui/metaaccellabel.c
|
||||
src/ui/resizepopup.c
|
||||
src/ui/theme.c
|
||||
src/ui/theme-parser.c
|
||||
src/ui/theme-viewer.c
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
664
po/en_GB.po
664
po/en_GB.po
File diff suppressed because it is too large
Load Diff
158
po/et.po
158
po/et.po
@ -7,15 +7,15 @@
|
||||
#
|
||||
# Tõivo Leedjärv <toivo linux ee>, 2004.
|
||||
# Ivar Smolin <okul linux ee>, 2005, 2006, 2009–2011.
|
||||
# Mattias Põldaru <mahfiaz@gmail.com>, 2008–2011, 2012.
|
||||
# Mattias Põldaru <mahfiaz@gmail.com>, 2008–2011, 2012, 2013.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: mutter MASTER\n"
|
||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
|
||||
"product=mutter&keywords=I18N+L10N&component=general\n"
|
||||
"POT-Creation-Date: 2012-10-17 20:44+0000\n"
|
||||
"PO-Revision-Date: 2012-10-21 20:48+0300\n"
|
||||
"POT-Creation-Date: 2013-03-12 18:53+0000\n"
|
||||
"PO-Revision-Date: 2013-03-12 20:55+0300\n"
|
||||
"Last-Translator: Mattias Põldaru <mahfiaz@gmail.com>\n"
|
||||
"Language-Team: Estonian <>\n"
|
||||
"Language: et\n"
|
||||
@ -24,9 +24,141 @@ msgstr ""
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n!=1);\n"
|
||||
|
||||
msgid "Navigation"
|
||||
msgstr "Navigeerimine"
|
||||
|
||||
msgid "Move window to workspace 1"
|
||||
msgstr "Akna liigutamine 1. tööalale"
|
||||
|
||||
msgid "Move window to workspace 2"
|
||||
msgstr "Akna liigutamine 2. tööalale"
|
||||
|
||||
msgid "Move window to workspace 3"
|
||||
msgstr "Akna liigutamine 3. tööalale"
|
||||
|
||||
msgid "Move window to workspace 4"
|
||||
msgstr "Akna liigutamine 4. tööalale"
|
||||
|
||||
msgid "Move window one workspace to the left"
|
||||
msgstr "Akna tõstmine vasakpoolsele tööalale"
|
||||
|
||||
msgid "Move window one workspace to the right"
|
||||
msgstr "Akna tõstmine parempoolsele tööalale"
|
||||
|
||||
msgid "Move window one workspace up"
|
||||
msgstr "Akna tõstmine ülemisele tööalale"
|
||||
|
||||
msgid "Move window one workspace down"
|
||||
msgstr "Akna tõstmine alumisele tööalale"
|
||||
|
||||
msgid "Switch applications"
|
||||
msgstr "Rakenduste vahetamine"
|
||||
|
||||
msgid "Switch windows"
|
||||
msgstr "Akende vahetamine"
|
||||
|
||||
msgid "Switch windows of an application"
|
||||
msgstr "Rakenduse akende vahetamine"
|
||||
|
||||
msgid "Switch system controls"
|
||||
msgstr "Süsteemi juhtalade vahetamine"
|
||||
|
||||
msgid "Switch windows directly"
|
||||
msgstr "Akende kohene vahetamine"
|
||||
|
||||
msgid "Switch windows of an app directly"
|
||||
msgstr "Rakenduse akende kohene vahetamine"
|
||||
|
||||
msgid "Switch system controls directly"
|
||||
msgstr "Süsteemi juhtalade kohene vahetamine"
|
||||
|
||||
msgid "Hide all normal windows"
|
||||
msgstr "Kõigi tavaliste akende peitmine"
|
||||
|
||||
msgid "Switch to workspace 1"
|
||||
msgstr "1. tööalale liikumine"
|
||||
|
||||
msgid "Switch to workspace 2"
|
||||
msgstr "2. tööalale liikumine"
|
||||
|
||||
msgid "Switch to workspace 3"
|
||||
msgstr "3. tööalale liikumine"
|
||||
|
||||
msgid "Switch to workspace 4"
|
||||
msgstr "4. tööalale liikumine"
|
||||
|
||||
msgid "Move to workspace left"
|
||||
msgstr "Vasakpoolsele tööalale liikumine"
|
||||
|
||||
msgid "Move to workspace right"
|
||||
msgstr "Parempoolsele tööalale liikumine"
|
||||
|
||||
msgid "Move to workspace above"
|
||||
msgstr "Ülemisele tööalale liikumine"
|
||||
|
||||
msgid "Move to workspace below"
|
||||
msgstr "Alumisele tööalale liikumine"
|
||||
|
||||
msgid "System"
|
||||
msgstr "Süsteem"
|
||||
|
||||
msgid "Show the run command prompt"
|
||||
msgstr "Käsuviiba kuvamine"
|
||||
|
||||
msgid "Show the activities overview"
|
||||
msgstr "Tegevuste ülevaate avamine"
|
||||
|
||||
msgid "Windows"
|
||||
msgstr "Aknad"
|
||||
|
||||
msgid "Activate the window menu"
|
||||
msgstr "Aknamenüü avamine"
|
||||
|
||||
msgid "Toggle fullscreen mode"
|
||||
msgstr "Täisekraanoleku vahetamine"
|
||||
|
||||
msgid "Toggle maximization state"
|
||||
msgstr "Maksimeeritud oleku vahetamine"
|
||||
|
||||
msgid "Maximize window"
|
||||
msgstr "Akna maksimeerimine"
|
||||
|
||||
msgid "Restore window"
|
||||
msgstr "Akna taastamine"
|
||||
|
||||
msgid "Toggle shaded state"
|
||||
msgstr "Varjatud oleku vahetamine"
|
||||
|
||||
msgid "Close window"
|
||||
msgstr "Akna sulgemine"
|
||||
|
||||
msgid "Hide window"
|
||||
msgstr "Peida aken"
|
||||
|
||||
msgid "Move window"
|
||||
msgstr "Akna liigutamine"
|
||||
|
||||
msgid "Resize window"
|
||||
msgstr "Akna suuruse muutmine"
|
||||
|
||||
msgid "Toggle window on all workspaces or one"
|
||||
msgstr "Akna kõigil või ühel tööalal olemise vahetamine"
|
||||
|
||||
msgid "Raise window if covered, otherwise lower it"
|
||||
msgstr "Akna tõstmine, kui see on kaetud, muul juhul langetamine"
|
||||
|
||||
msgid "Raise window above other windows"
|
||||
msgstr "Akna tõstmine teiste kohale"
|
||||
|
||||
msgid "Lower window below other windows"
|
||||
msgstr "Akna langetamine teiste taha"
|
||||
|
||||
msgid "Maximize window vertically"
|
||||
msgstr "Akna vertikaalne maksimeerimine"
|
||||
|
||||
msgid "Maximize window horizontally"
|
||||
msgstr "Akna horisontaalne maksimeerimine"
|
||||
|
||||
msgid "View split on left"
|
||||
msgstr "Vaade poolitatakse vasakult"
|
||||
|
||||
@ -41,6 +173,9 @@ msgid ""
|
||||
"\"."
|
||||
msgstr "Teine komposiithaldur juba töötab ekraani %i kuval \"%s\"."
|
||||
|
||||
msgid "background texture could not be created from file"
|
||||
msgstr "failist polnud võimalik taustatekstuuri luua"
|
||||
|
||||
msgid "Bell event"
|
||||
msgstr "Helina sündmus"
|
||||
|
||||
@ -82,6 +217,10 @@ msgstr ""
|
||||
"Mõni teine programm juba kasutab klahvi %s koos muuteklahvidega %x "
|
||||
"kiirklahvina\n"
|
||||
|
||||
#, c-format
|
||||
msgid "\"%s\" is not a valid accelerator\n"
|
||||
msgstr "\"%s\" pole sobiv kiirklahv\n"
|
||||
|
||||
msgid "Disable connection to session manager"
|
||||
msgstr "Seansihalduriga ühendumise keelamine"
|
||||
|
||||
@ -417,6 +556,16 @@ msgstr ""
|
||||
"Lohistatava äärise laius. Kui kujunduse nähtavatest ääristest ei piisa, "
|
||||
"lisatakse puuduoleva osa jaoks nähtamatu ääris."
|
||||
|
||||
msgid "Auto maximize nearly monitor sized windows"
|
||||
msgstr "Peaaegu monitori suurused ekraanid maksimeeritakse automaatselt"
|
||||
|
||||
msgid ""
|
||||
"If enabled, new windows that are initially the size of the monitor "
|
||||
"automatically get maximized."
|
||||
msgstr ""
|
||||
"Kui lubatud, maksimeeritakse automaatselt aknad, mis on avanedes monitori "
|
||||
"suurused."
|
||||
|
||||
msgid "Select window from tab popup"
|
||||
msgstr "Akna valimine tabulaatori hüpikaknalt"
|
||||
|
||||
@ -1285,3 +1434,6 @@ msgstr "y väärtus oli %d, oodati väärtust %d"
|
||||
msgid "%d coordinate expressions parsed in %g seconds (%g seconds average)\n"
|
||||
msgstr ""
|
||||
"%d koordinaatide avaldis töödeldi %g sekundiga (keskmine %g sekundit)\n"
|
||||
|
||||
#~ msgid "Minimize window"
|
||||
#~ msgstr "Akna minimeerimine"
|
||||
|
642
po/pt_BR.po
642
po/pt_BR.po
File diff suppressed because it is too large
Load Diff
559
po/sr@latin.po
559
po/sr@latin.po
File diff suppressed because it is too large
Load Diff
590
po/zh_HK.po
590
po/zh_HK.po
File diff suppressed because it is too large
Load Diff
592
po/zh_TW.po
592
po/zh_TW.po
File diff suppressed because it is too large
Load Diff
@ -29,9 +29,12 @@
|
||||
<KeyListEntry name="move-to-workspace-down"
|
||||
_description="Move window one workspace down" />
|
||||
|
||||
<KeyListEntry name="switch-windows"
|
||||
<KeyListEntry name="switch-applications"
|
||||
_description="Switch applications"/>
|
||||
|
||||
<KeyListEntry name="switch-windows"
|
||||
_description="Switch windows"/>
|
||||
|
||||
<KeyListEntry name="switch-group"
|
||||
_description="Switch windows of an application"/>
|
||||
|
||||
|
@ -19,7 +19,7 @@
|
||||
|
||||
<KeyListEntry name="close" _description="Close window"/>
|
||||
|
||||
<KeyListEntry name="minimize" _description="Minimize window"/>
|
||||
<KeyListEntry name="minimize" _description="Hide window"/>
|
||||
|
||||
<KeyListEntry name="begin-move" _description="Move window"/>
|
||||
|
||||
|
@ -3,9 +3,12 @@
|
||||
|
||||
lib_LTLIBRARIES = libmutter.la
|
||||
|
||||
SUBDIRS=wm-tester tools compositor/plugins
|
||||
SUBDIRS=compositor/plugins
|
||||
|
||||
INCLUDES= \
|
||||
-DCLUTTER_ENABLE_EXPERIMENTAL_API \
|
||||
-DCOGL_ENABLE_EXPERIMENTAL_API \
|
||||
-DCOGL_ENABLE_EXPERIMENTAL_2_0_API \
|
||||
$(MUTTER_CFLAGS) \
|
||||
-I$(srcdir) \
|
||||
-I$(srcdir)/core \
|
||||
@ -16,7 +19,7 @@ INCLUDES= \
|
||||
-DMUTTER_LOCALEDIR=\"$(prefix)/@DATADIRNAME@/locale\" \
|
||||
-DMUTTER_PKGDATADIR=\"$(pkgdatadir)\" \
|
||||
-DMUTTER_DATADIR=\"$(datadir)\" \
|
||||
-DG_LOG_DOMAIN=\"mutter\" \
|
||||
-DG_LOG_DOMAIN=\"Mutter\" \
|
||||
-DSN_API_NOT_YET_FROZEN=1 \
|
||||
-DMUTTER_MAJOR_VERSION=$(MUTTER_MAJOR_VERSION) \
|
||||
-DMUTTER_MINOR_VERSION=$(MUTTER_MINOR_VERSION) \
|
||||
@ -27,23 +30,31 @@ INCLUDES= \
|
||||
-DGETTEXT_PACKAGE=\"$(GETTEXT_PACKAGE)\"
|
||||
|
||||
mutter_built_sources = \
|
||||
$(dbus_xrandr_built_sources) \
|
||||
mutter-enum-types.h \
|
||||
mutter-enum-types.c
|
||||
|
||||
libmutter_la_SOURCES = \
|
||||
core/async-getprop.c \
|
||||
core/async-getprop.h \
|
||||
core/barrier.c \
|
||||
meta/barrier.h \
|
||||
core/bell.c \
|
||||
core/bell.h \
|
||||
core/boxes.c \
|
||||
core/boxes-private.h \
|
||||
meta/boxes.h \
|
||||
compositor/clutter-utils.c \
|
||||
compositor/clutter-utils.h \
|
||||
compositor/cogl-utils.c \
|
||||
compositor/cogl-utils.h \
|
||||
compositor/compositor.c \
|
||||
compositor/compositor-private.h \
|
||||
compositor/meta-background.c \
|
||||
compositor/meta-background-actor.c \
|
||||
compositor/meta-background-actor-private.h \
|
||||
compositor/meta-background-group.c \
|
||||
compositor/meta-background-group-private.h \
|
||||
compositor/meta-module.c \
|
||||
compositor/meta-module.h \
|
||||
compositor/meta-plugin.c \
|
||||
@ -65,7 +76,9 @@ libmutter_la_SOURCES = \
|
||||
compositor/region-utils.c \
|
||||
compositor/region-utils.h \
|
||||
meta/compositor.h \
|
||||
meta/meta-background.h \
|
||||
meta/meta-background-actor.h \
|
||||
meta/meta-background-group.h \
|
||||
meta/meta-plugin.h \
|
||||
meta/meta-shadow-factory.h \
|
||||
meta/meta-window-actor.h \
|
||||
@ -82,10 +95,10 @@ libmutter_la_SOURCES = \
|
||||
ui/draw-workspace.h \
|
||||
core/edge-resistance.c \
|
||||
core/edge-resistance.h \
|
||||
core/edid-parse.c \
|
||||
core/edid.h \
|
||||
core/errors.c \
|
||||
meta/errors.h \
|
||||
core/eventqueue.c \
|
||||
core/eventqueue.h \
|
||||
core/frame.c \
|
||||
core/frame.h \
|
||||
ui/gradient.c \
|
||||
@ -100,6 +113,11 @@ libmutter_la_SOURCES = \
|
||||
core/keybindings.c \
|
||||
core/keybindings-private.h \
|
||||
core/main.c \
|
||||
core/meta-xrandr-shared.h \
|
||||
core/monitor.c \
|
||||
core/monitor-config.c \
|
||||
core/monitor-private.h \
|
||||
core/monitor-xrandr.c \
|
||||
core/mutter-Xatomtype.h \
|
||||
core/place.c \
|
||||
core/place.h \
|
||||
@ -129,7 +147,6 @@ libmutter_la_SOURCES = \
|
||||
meta/common.h \
|
||||
core/core.h \
|
||||
ui/ui.h \
|
||||
inlinepixbufs.h \
|
||||
ui/frames.c \
|
||||
ui/frames.h \
|
||||
ui/menu.c \
|
||||
@ -147,8 +164,6 @@ libmutter_la_SOURCES = \
|
||||
meta/theme.h \
|
||||
ui/theme-private.h \
|
||||
ui/ui.c \
|
||||
meta/preview-widget.h \
|
||||
ui/preview-widget.c \
|
||||
$(mutter_built_sources)
|
||||
|
||||
libmutter_la_LDFLAGS = -no-undefined
|
||||
@ -157,6 +172,7 @@ libmutter_la_LIBADD = $(MUTTER_LIBS)
|
||||
# Headers installed for plugins; introspected information will
|
||||
# be extracted into Mutter-<version>.gir
|
||||
libmutterinclude_base_headers = \
|
||||
meta/barrier.h \
|
||||
meta/boxes.h \
|
||||
meta/common.h \
|
||||
meta/compositor-mutter.h \
|
||||
@ -168,6 +184,8 @@ libmutterinclude_base_headers = \
|
||||
meta/keybindings.h \
|
||||
meta/main.h \
|
||||
meta/meta-background-actor.h \
|
||||
meta/meta-background-group.h \
|
||||
meta/meta-background.h \
|
||||
meta/meta-plugin.h \
|
||||
meta/meta-shaped-texture.h \
|
||||
meta/meta-shadow-factory.h \
|
||||
@ -183,7 +201,6 @@ libmutterinclude_base_headers = \
|
||||
# Excluded from scanning for introspection but installed
|
||||
# atomnames.h: macros cause problems for scanning process
|
||||
libmutterinclude_extra_headers = \
|
||||
meta/preview-widget.h \
|
||||
meta/atomnames.h
|
||||
|
||||
libmutterincludedir = $(includedir)/mutter/meta
|
||||
@ -192,10 +209,7 @@ libmutterinclude_HEADERS = \
|
||||
$(libmutterinclude_base_headers) \
|
||||
$(libmutterinclude_extra_headers)
|
||||
|
||||
mutter_theme_viewer_SOURCES= \
|
||||
ui/theme-viewer.c
|
||||
|
||||
bin_PROGRAMS=mutter mutter-theme-viewer
|
||||
bin_PROGRAMS=mutter
|
||||
|
||||
mutter_SOURCES = core/mutter.c
|
||||
mutter_LDADD = $(MUTTER_LIBS) libmutter.la
|
||||
@ -233,8 +247,6 @@ Meta-$(api_version).gir: libmutter.la
|
||||
|
||||
endif
|
||||
|
||||
mutter_theme_viewer_LDADD= $(MUTTER_LIBS) libmutter.la
|
||||
|
||||
testboxes_SOURCES = core/testboxes.c
|
||||
testgradient_SOURCES = ui/testgradient.c
|
||||
testasyncgetprop_SOURCES = core/testasyncgetprop.c
|
||||
@ -271,14 +283,7 @@ gsettings_SCHEMAS = org.gnome.mutter.gschema.xml
|
||||
convertdir = $(datadir)/GConf/gsettings
|
||||
convert_DATA = mutter-schemas.convert
|
||||
|
||||
IMAGES=stock_maximize.png stock_minimize.png stock_delete.png
|
||||
VARIABLES=stock_maximize_data $(srcdir)/stock_maximize.png \
|
||||
stock_minimize_data $(srcdir)/stock_minimize.png \
|
||||
stock_delete_data $(srcdir)/stock_delete.png
|
||||
|
||||
BUILT_SOURCES = inlinepixbufs.h
|
||||
CLEANFILES = \
|
||||
inlinepixbufs.h \
|
||||
mutter.desktop \
|
||||
mutter-wm.desktop \
|
||||
org.gnome.mutter.gschema.xml \
|
||||
@ -287,9 +292,6 @@ CLEANFILES = \
|
||||
$(typelib_DATA) \
|
||||
$(gir_DATA)
|
||||
|
||||
inlinepixbufs.h: $(IMAGES)
|
||||
$(GDK_PIXBUF_CSOURCE) --raw --build-list $(VARIABLES) >$(srcdir)/inlinepixbufs.h
|
||||
|
||||
pkgconfigdir = $(libdir)/pkgconfig
|
||||
|
||||
pkgconfig_DATA = libmutter.pc mutter-plugins.pc
|
||||
@ -307,7 +309,7 @@ EXTRA_DIST=$(desktopfiles_files) \
|
||||
mutter-enum-types.h.in \
|
||||
mutter-enum-types.c.in
|
||||
|
||||
BUILT_SOURCES += $(mutter_built_sources)
|
||||
BUILT_SOURCES = $(mutter_built_sources)
|
||||
MUTTER_STAMP_FILES = stamp-mutter-enum-types.h
|
||||
CLEANFILES += $(MUTTER_STAMP_FILES)
|
||||
|
||||
@ -329,3 +331,12 @@ mutter-enum-types.c: stamp-mutter-enum-types.h mutter-enum-types.c.in
|
||||
$(libmutterinclude_base_headers) ) >> xgen-tetc && \
|
||||
cp xgen-tetc mutter-enum-types.c && \
|
||||
rm -f xgen-tetc
|
||||
|
||||
dbus_xrandr_built_sources = meta-dbus-xrandr.c meta-dbus-xrandr.h
|
||||
|
||||
$(dbus_xrandr_built_sources) : Makefile.am xrandr.xml
|
||||
$(AM_V_GEN)gdbus-codegen \
|
||||
--interface-prefix org.gnome.Mutter \
|
||||
--c-namespace MetaDBus \
|
||||
--generate-c-code meta-dbus-xrandr \
|
||||
xrandr.xml
|
||||
|
120
src/compositor/clutter-utils.c
Normal file
120
src/compositor/clutter-utils.c
Normal file
@ -0,0 +1,120 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
/*
|
||||
* Utilities for use with Cogl
|
||||
*
|
||||
* Copyright 2010 Red Hat, Inc.
|
||||
* Copyright 2010 Intel Corporation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
* 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include "clutter-utils.h"
|
||||
#include <math.h>
|
||||
|
||||
/* This file uses pixel-aligned region computation to determine what
|
||||
* can be clipped out. This only really works if everything is aligned
|
||||
* to the pixel grid - not scaled or rotated and at integer offsets.
|
||||
*
|
||||
* (This could be relaxed - if we turned off filtering for unscaled
|
||||
* windows then windows would be, by definition aligned to the pixel
|
||||
* grid. And for rectangular windows without a shape, the outline that
|
||||
* we draw for an unrotated window is always a rectangle because we
|
||||
* don't use antialasing for the window boundary - with or without
|
||||
* filtering, with or without a scale. But figuring out exactly
|
||||
* what pixels will be drawn by the graphics system in these cases
|
||||
* gets tricky, so we just go for the easiest part - no scale,
|
||||
* and at integer offsets.)
|
||||
*
|
||||
* The way we check for pixel-aligned is by looking at the
|
||||
* transformation into screen space of the allocation box of an actor
|
||||
* and and checking if the corners are "close enough" to integral
|
||||
* pixel values.
|
||||
*/
|
||||
|
||||
/* The definition of "close enough" to integral pixel values is
|
||||
* equality when we convert to 24.8 fixed-point.
|
||||
*/
|
||||
static inline int
|
||||
round_to_fixed (float x)
|
||||
{
|
||||
return roundf (x * 256);
|
||||
}
|
||||
|
||||
/* This helper function checks if (according to our fixed point precision)
|
||||
* the vertices @verts form a box of width @widthf and height @heightf
|
||||
* located at integral coordinates. These coordinates are returned
|
||||
* in @x_origin and @y_origin.
|
||||
*/
|
||||
gboolean
|
||||
meta_actor_vertices_are_untransformed (ClutterVertex *verts,
|
||||
float widthf,
|
||||
float heightf,
|
||||
int *x_origin,
|
||||
int *y_origin)
|
||||
{
|
||||
int width, height;
|
||||
int v0x, v0y, v1x, v1y, v2x, v2y, v3x, v3y;
|
||||
int x, y;
|
||||
|
||||
width = round_to_fixed (widthf); height = round_to_fixed (heightf);
|
||||
|
||||
v0x = round_to_fixed (verts[0].x); v0y = round_to_fixed (verts[0].y);
|
||||
v1x = round_to_fixed (verts[1].x); v1y = round_to_fixed (verts[1].y);
|
||||
v2x = round_to_fixed (verts[2].x); v2y = round_to_fixed (verts[2].y);
|
||||
v3x = round_to_fixed (verts[3].x); v3y = round_to_fixed (verts[3].y);
|
||||
|
||||
/* Using shifting for converting fixed => int, gets things right for
|
||||
* negative values. / 256. wouldn't do the same
|
||||
*/
|
||||
x = v0x >> 8;
|
||||
y = v0y >> 8;
|
||||
|
||||
/* At integral coordinates? */
|
||||
if (x * 256 != v0x || y * 256 != v0y)
|
||||
return FALSE;
|
||||
|
||||
/* Not scaled? */
|
||||
if (v1x - v0x != width || v2y - v0y != height)
|
||||
return FALSE;
|
||||
|
||||
/* Not rotated/skewed? */
|
||||
if (v0x != v2x || v0y != v1y ||
|
||||
v3x != v1x || v3y != v2y)
|
||||
return FALSE;
|
||||
|
||||
*x_origin = x;
|
||||
*y_origin = y;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* Check if an actor is "untransformed" - which actually means transformed by
|
||||
* at most a integer-translation. The integer translation, if any, is returned.
|
||||
*/
|
||||
gboolean
|
||||
meta_actor_is_untransformed (ClutterActor *actor,
|
||||
int *x_origin,
|
||||
int *y_origin)
|
||||
{
|
||||
gfloat widthf, heightf;
|
||||
ClutterVertex verts[4];
|
||||
|
||||
clutter_actor_get_size (actor, &widthf, &heightf);
|
||||
clutter_actor_get_abs_allocation_vertices (actor, verts);
|
||||
|
||||
return meta_actor_vertices_are_untransformed (verts, widthf, heightf, x_origin, y_origin);
|
||||
}
|
||||
|
36
src/compositor/clutter-utils.h
Normal file
36
src/compositor/clutter-utils.h
Normal file
@ -0,0 +1,36 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
/*
|
||||
* Utilities for use with Clutter
|
||||
*
|
||||
* Copyright 2010 Red Hat, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
* 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __META_CLUTTER_UTILS_H__
|
||||
#define __META_CLUTTER_UTILS_H__
|
||||
|
||||
#include <clutter/clutter.h>
|
||||
gboolean meta_actor_vertices_are_untransformed (ClutterVertex *verts,
|
||||
float widthf,
|
||||
float heightf,
|
||||
int *x_origin,
|
||||
int *y_origin);
|
||||
gboolean meta_actor_is_untransformed (ClutterActor *actor,
|
||||
int *x_origin,
|
||||
int *y_origin);
|
||||
|
||||
#endif /* __META_CLUTTER_UTILS_H__ */
|
@ -21,14 +21,15 @@
|
||||
* 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include <clutter/clutter.h>
|
||||
#include "cogl-utils.h"
|
||||
|
||||
/**
|
||||
* meta_create_color_texture_4ub:
|
||||
* @red:
|
||||
* @green:
|
||||
* @blue:
|
||||
* @alpha:
|
||||
* @red: red component
|
||||
* @green: green component
|
||||
* @blue: blue component
|
||||
* @alpha: alpha component
|
||||
* @flags: Optional flags for the texture, or %COGL_TEXTURE_NONE;
|
||||
* %COGL_TEXTURE_NO_SLICING is useful if the texture will be
|
||||
* repeated to create a constant color fill, since hardware
|
||||
@ -39,7 +40,7 @@
|
||||
*
|
||||
* Return value: (transfer full): a newly created Cogl texture
|
||||
*/
|
||||
CoglHandle
|
||||
CoglTexture *
|
||||
meta_create_color_texture_4ub (guint8 red,
|
||||
guint8 green,
|
||||
guint8 blue,
|
||||
@ -68,43 +69,45 @@ meta_create_color_texture_4ub (guint8 red,
|
||||
/* Based on gnome-shell/src/st/st-private.c:_st_create_texture_material.c */
|
||||
|
||||
/**
|
||||
* meta_create_texture_material:
|
||||
* meta_create_texture_pipeline:
|
||||
* @src_texture: (allow-none): texture to use initially for the layer
|
||||
*
|
||||
* Creates a material with a single layer. Using a common template
|
||||
* Creates a pipeline with a single layer. Using a common template
|
||||
* allows sharing a shader for different uses in Mutter. To share the same
|
||||
* shader with all other materials that are just texture plus opacity
|
||||
* shader with all other pipelines that are just texture plus opacity
|
||||
* would require Cogl fixes.
|
||||
* (See http://bugzilla.clutter-project.org/show_bug.cgi?id=2425)
|
||||
*
|
||||
* Return value: (transfer full): a newly created Cogl material
|
||||
* Return value: (transfer full): a newly created #CoglPipeline
|
||||
*/
|
||||
CoglHandle
|
||||
meta_create_texture_material (CoglHandle src_texture)
|
||||
CoglPipeline *
|
||||
meta_create_texture_pipeline (CoglTexture *src_texture)
|
||||
{
|
||||
static CoglHandle texture_material_template = COGL_INVALID_HANDLE;
|
||||
CoglHandle material;
|
||||
static CoglPipeline *texture_pipeline_template = NULL;
|
||||
CoglPipeline *pipeline;
|
||||
|
||||
/* We use a material that has a dummy texture as a base for all
|
||||
texture materials. The idea is that only the Cogl texture object
|
||||
/* We use a pipeline that has a dummy texture as a base for all
|
||||
texture pipelines. The idea is that only the Cogl texture object
|
||||
would be different in the children so it is likely that Cogl will
|
||||
be able to share GL programs between all the textures. */
|
||||
if (G_UNLIKELY (texture_material_template == COGL_INVALID_HANDLE))
|
||||
if (G_UNLIKELY (texture_pipeline_template == NULL))
|
||||
{
|
||||
CoglHandle dummy_texture;
|
||||
CoglTexture *dummy_texture;
|
||||
CoglContext *ctx = clutter_backend_get_cogl_context (clutter_get_default_backend ());
|
||||
|
||||
dummy_texture = meta_create_color_texture_4ub (0xff, 0xff, 0xff, 0xff,
|
||||
COGL_TEXTURE_NONE);
|
||||
|
||||
texture_material_template = cogl_material_new ();
|
||||
cogl_material_set_layer (texture_material_template, 0, dummy_texture);
|
||||
cogl_handle_unref (dummy_texture);
|
||||
|
||||
texture_pipeline_template = cogl_pipeline_new (ctx);
|
||||
cogl_pipeline_set_layer_texture (texture_pipeline_template, 0, dummy_texture);
|
||||
cogl_object_unref (dummy_texture);
|
||||
}
|
||||
|
||||
material = cogl_material_copy (texture_material_template);
|
||||
pipeline = cogl_pipeline_copy (texture_pipeline_template);
|
||||
|
||||
if (src_texture != COGL_INVALID_HANDLE)
|
||||
cogl_material_set_layer (material, 0, src_texture);
|
||||
if (src_texture != NULL)
|
||||
cogl_pipeline_set_layer_texture (pipeline, 0, src_texture);
|
||||
|
||||
return material;
|
||||
return pipeline;
|
||||
}
|
||||
|
@ -25,11 +25,11 @@
|
||||
|
||||
#include <cogl/cogl.h>
|
||||
|
||||
CoglHandle meta_create_color_texture_4ub (guint8 red,
|
||||
guint8 green,
|
||||
guint8 blue,
|
||||
guint8 alpha,
|
||||
CoglTextureFlags flags);
|
||||
CoglHandle meta_create_texture_material (CoglHandle src_texture);
|
||||
CoglTexture * meta_create_color_texture_4ub (guint8 red,
|
||||
guint8 green,
|
||||
guint8 blue,
|
||||
guint8 alpha,
|
||||
CoglTextureFlags flags);
|
||||
CoglPipeline * meta_create_texture_pipeline (CoglTexture *texture);
|
||||
|
||||
#endif /* __META_COGL_UTILS_H__ */
|
||||
|
@ -18,7 +18,6 @@ struct _MetaCompositor
|
||||
MetaDisplay *display;
|
||||
|
||||
Atom atom_x_root_pixmap;
|
||||
Atom atom_x_set_root;
|
||||
Atom atom_net_wm_window_opacity;
|
||||
guint repaint_func_id;
|
||||
|
||||
@ -26,22 +25,28 @@ struct _MetaCompositor
|
||||
|
||||
MetaPlugin *modal_plugin;
|
||||
|
||||
gboolean show_redraw : 1;
|
||||
gboolean debug : 1;
|
||||
gboolean no_mipmaps : 1;
|
||||
gint64 server_time_query_time;
|
||||
gint64 server_time_offset;
|
||||
|
||||
guint server_time_is_monotonic_time : 1;
|
||||
guint show_redraw : 1;
|
||||
guint debug : 1;
|
||||
guint no_mipmaps : 1;
|
||||
};
|
||||
|
||||
struct _MetaCompScreen
|
||||
{
|
||||
MetaScreen *screen;
|
||||
|
||||
ClutterActor *stage, *window_group, *overlay_group;
|
||||
ClutterActor *stage, *window_group, *top_window_group, *overlay_group;
|
||||
ClutterActor *background_actor;
|
||||
ClutterActor *hidden_group;
|
||||
GList *windows;
|
||||
GHashTable *windows_by_xid;
|
||||
Window output;
|
||||
|
||||
CoglOnscreen *onscreen;
|
||||
CoglFrameClosure *frame_closure;
|
||||
|
||||
/* Used for unredirecting fullscreen windows */
|
||||
guint disable_unredirect_count;
|
||||
MetaWindowActor *unredirected_window;
|
||||
@ -54,6 +59,9 @@ struct _MetaCompScreen
|
||||
MetaPluginManager *plugin_mgr;
|
||||
};
|
||||
|
||||
/* Wait 2ms after vblank before starting to draw next frame */
|
||||
#define META_SYNC_DELAY 2
|
||||
|
||||
void meta_switch_workspace_completed (MetaScreen *screen);
|
||||
|
||||
gboolean meta_begin_modal_for_plugin (MetaScreen *screen,
|
||||
@ -66,6 +74,9 @@ void meta_end_modal_for_plugin (MetaScreen *screen,
|
||||
MetaPlugin *plugin,
|
||||
guint32 timestamp);
|
||||
|
||||
gint64 meta_compositor_monotonic_time_to_server_time (MetaDisplay *display,
|
||||
gint64 monotonic_time);
|
||||
|
||||
void meta_check_end_modal (MetaScreen *screen);
|
||||
|
||||
#endif /* META_COMPOSITOR_PRIVATE_H */
|
||||
|
@ -1,9 +1,74 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/**
|
||||
* SECTION:compositor
|
||||
* @Title: MetaCompositor
|
||||
* @Short_Description: Compositor API
|
||||
*
|
||||
* At a high-level, a window is not-visible or visible. When a
|
||||
* window is added (with meta_compositor_add_window()) it is not visible.
|
||||
* meta_compositor_show_window() indicates a transition from not-visible to
|
||||
* visible. Some of the reasons for this:
|
||||
*
|
||||
* - Window newly created
|
||||
* - Window is unminimized
|
||||
* - Window is moved to the current desktop
|
||||
* - Window was made sticky
|
||||
*
|
||||
* meta_compositor_hide_window() indicates that the window has transitioned from
|
||||
* visible to not-visible. Some reasons include:
|
||||
*
|
||||
* - Window was destroyed
|
||||
* - Window is minimized
|
||||
* - Window is moved to a different desktop
|
||||
* - Window no longer sticky.
|
||||
*
|
||||
* Note that combinations are possible - a window might have first
|
||||
* been minimized and then moved to a different desktop. The 'effect' parameter
|
||||
* to meta_compositor_show_window() and meta_compositor_hide_window() is a hint
|
||||
* as to the appropriate effect to show the user and should not
|
||||
* be considered to be indicative of a state change.
|
||||
*
|
||||
* When the active workspace is changed, meta_compositor_switch_workspace() is
|
||||
* called first, then meta_compositor_show_window() and
|
||||
* meta_compositor_hide_window() are called individually for each window
|
||||
* affected, with an effect of META_COMP_EFFECT_NONE.
|
||||
* If hiding windows will affect the switch workspace animation, the
|
||||
* compositor needs to delay hiding the windows until the switch
|
||||
* workspace animation completes.
|
||||
*
|
||||
* meta_compositor_maximize_window() and meta_compositor_unmaximize_window()
|
||||
* are transitions within the visible state. The window is resized __before__
|
||||
* the call, so it may be necessary to readjust the display based on the
|
||||
* old_rect to start the animation.
|
||||
*
|
||||
* meta_compositor_window_mapped() and meta_compositor_window_unmapped() are
|
||||
* notifications when the toplevel window (frame or client window) is mapped or
|
||||
* unmapped. That is, when the result of meta_window_toplevel_is_mapped()
|
||||
* changes. The main use of this is to drop resources when a window is unmapped.
|
||||
* A window will always be mapped before meta_compositor_show_window()
|
||||
* is called and will not be unmapped until after meta_compositor_hide_window()
|
||||
* is called. If the live_hidden_windows preference is set, windows will never
|
||||
* be unmapped.
|
||||
*
|
||||
* # Containers #
|
||||
*
|
||||
* There's two containers in the stage that are used to place window actors, here
|
||||
* are listed in the order in which they are painted:
|
||||
*
|
||||
* - window group, accessible with meta_get_window_group_for_screen()
|
||||
* - top window group, accessible with meta_get_top_window_group_for_screen()
|
||||
*
|
||||
* Mutter will place actors representing windows in the window group, except for
|
||||
* override-redirect windows (ie. popups and menus) which will be placed in the
|
||||
* top window group.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#include <clutter/x11/clutter-x11.h>
|
||||
|
||||
#include "core.h"
|
||||
#include <meta/screen.h>
|
||||
#include <meta/errors.h>
|
||||
#include <meta/window.h>
|
||||
@ -12,10 +77,11 @@
|
||||
#include "xprops.h"
|
||||
#include <meta/prefs.h>
|
||||
#include <meta/main.h>
|
||||
#include <meta/meta-background-actor.h>
|
||||
#include <meta/meta-background-group.h>
|
||||
#include <meta/meta-shadow-factory.h>
|
||||
#include "meta-window-actor-private.h"
|
||||
#include "meta-window-group.h"
|
||||
#include "meta-background-actor-private.h"
|
||||
#include "window-private.h" /* to check window->hidden */
|
||||
#include "display-private.h" /* for meta_display_lookup_x_window() */
|
||||
#include <X11/extensions/shape.h>
|
||||
@ -116,21 +182,6 @@ process_property_notify (MetaCompositor *compositor,
|
||||
{
|
||||
MetaWindowActor *window_actor;
|
||||
|
||||
if (event->atom == compositor->atom_x_root_pixmap)
|
||||
{
|
||||
GSList *l;
|
||||
|
||||
for (l = meta_display_get_screens (compositor->display); l; l = l->next)
|
||||
{
|
||||
MetaScreen *screen = l->data;
|
||||
if (event->window == meta_screen_get_xroot (screen))
|
||||
{
|
||||
meta_background_actor_update (screen);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (window == NULL)
|
||||
return;
|
||||
|
||||
@ -157,23 +208,28 @@ get_output_window (MetaScreen *screen)
|
||||
Window output, xroot;
|
||||
XWindowAttributes attr;
|
||||
long event_mask;
|
||||
unsigned char mask_bits[XIMaskLen (XI_LASTEVENT)] = { 0 };
|
||||
XIEventMask mask = { XIAllMasterDevices, sizeof (mask_bits), mask_bits };
|
||||
|
||||
xroot = meta_screen_get_xroot (screen);
|
||||
|
||||
event_mask = FocusChangeMask |
|
||||
ExposureMask |
|
||||
EnterWindowMask | LeaveWindowMask |
|
||||
PointerMotionMask |
|
||||
PropertyChangeMask |
|
||||
ButtonPressMask | ButtonReleaseMask |
|
||||
KeyPressMask | KeyReleaseMask;
|
||||
|
||||
output = XCompositeGetOverlayWindow (xdisplay, xroot);
|
||||
|
||||
meta_core_add_old_event_mask (xdisplay, output, &mask);
|
||||
|
||||
XISetMask (mask.mask, XI_KeyPress);
|
||||
XISetMask (mask.mask, XI_KeyRelease);
|
||||
XISetMask (mask.mask, XI_ButtonPress);
|
||||
XISetMask (mask.mask, XI_ButtonRelease);
|
||||
XISetMask (mask.mask, XI_Enter);
|
||||
XISetMask (mask.mask, XI_Leave);
|
||||
XISetMask (mask.mask, XI_FocusIn);
|
||||
XISetMask (mask.mask, XI_FocusOut);
|
||||
XISetMask (mask.mask, XI_Motion);
|
||||
XISelectEvents (xdisplay, output, &mask, 1);
|
||||
|
||||
event_mask = ExposureMask | PropertyChangeMask;
|
||||
if (XGetWindowAttributes (xdisplay, output, &attr))
|
||||
{
|
||||
event_mask |= attr.your_event_mask;
|
||||
}
|
||||
event_mask |= attr.your_event_mask;
|
||||
|
||||
XSelectInput (xdisplay, output, event_mask);
|
||||
|
||||
@ -197,23 +253,6 @@ meta_get_stage_for_screen (MetaScreen *screen)
|
||||
return info->stage;
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_get_overlay_group_for_screen:
|
||||
* @screen: a #MetaScreen
|
||||
*
|
||||
* Returns: (transfer none): The overlay group corresponding to @screen
|
||||
*/
|
||||
ClutterActor *
|
||||
meta_get_overlay_group_for_screen (MetaScreen *screen)
|
||||
{
|
||||
MetaCompScreen *info = meta_screen_get_compositor_data (screen);
|
||||
|
||||
if (!info)
|
||||
return NULL;
|
||||
|
||||
return info->overlay_group;
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_get_window_group_for_screen:
|
||||
* @screen: a #MetaScreen
|
||||
@ -232,24 +271,20 @@ meta_get_window_group_for_screen (MetaScreen *screen)
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_get_background_actor_for_screen:
|
||||
* meta_get_top_window_group_for_screen:
|
||||
* @screen: a #MetaScreen
|
||||
*
|
||||
* Gets the actor that draws the root window background under the windows.
|
||||
* The root window background automatically tracks the image or color set
|
||||
* by the environment.
|
||||
*
|
||||
* Returns: (transfer none): The background actor corresponding to @screen
|
||||
* Returns: (transfer none): The top window group corresponding to @screen
|
||||
*/
|
||||
ClutterActor *
|
||||
meta_get_background_actor_for_screen (MetaScreen *screen)
|
||||
meta_get_top_window_group_for_screen (MetaScreen *screen)
|
||||
{
|
||||
MetaCompScreen *info = meta_screen_get_compositor_data (screen);
|
||||
|
||||
if (!info)
|
||||
return NULL;
|
||||
|
||||
return info->background_actor;
|
||||
return info->top_window_group;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -334,6 +369,46 @@ meta_empty_stage_input_region (MetaScreen *screen)
|
||||
meta_set_stage_input_region (screen, region);
|
||||
}
|
||||
|
||||
void
|
||||
meta_focus_stage_window (MetaScreen *screen,
|
||||
guint32 timestamp)
|
||||
{
|
||||
ClutterStage *stage;
|
||||
Window window;
|
||||
|
||||
stage = CLUTTER_STAGE (meta_get_stage_for_screen (screen));
|
||||
if (!stage)
|
||||
return;
|
||||
|
||||
window = clutter_x11_get_stage_window (stage);
|
||||
|
||||
if (window == None)
|
||||
return;
|
||||
|
||||
meta_display_set_input_focus_xwindow (screen->display,
|
||||
screen,
|
||||
window,
|
||||
timestamp);
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_stage_is_focused (MetaScreen *screen)
|
||||
{
|
||||
ClutterStage *stage;
|
||||
Window window;
|
||||
|
||||
stage = CLUTTER_STAGE (meta_get_stage_for_screen (screen));
|
||||
if (!stage)
|
||||
return FALSE;
|
||||
|
||||
window = clutter_x11_get_stage_window (stage);
|
||||
|
||||
if (window == None)
|
||||
return FALSE;
|
||||
|
||||
return (screen->display->focus_xwindow == window);
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_begin_modal_for_plugin (MetaScreen *screen,
|
||||
MetaPlugin *plugin,
|
||||
@ -358,14 +433,23 @@ meta_begin_modal_for_plugin (MetaScreen *screen,
|
||||
|
||||
if ((options & META_MODAL_POINTER_ALREADY_GRABBED) == 0)
|
||||
{
|
||||
result = XGrabPointer (xdpy, grab_window,
|
||||
False, /* owner_events */
|
||||
(ButtonPressMask | ButtonReleaseMask |
|
||||
EnterWindowMask | LeaveWindowMask | PointerMotionMask),
|
||||
GrabModeAsync, GrabModeAsync,
|
||||
None, /* confine to */
|
||||
unsigned char mask_bits[XIMaskLen (XI_LASTEVENT)] = { 0 };
|
||||
XIEventMask mask = { XIAllMasterDevices, sizeof (mask_bits), mask_bits };
|
||||
|
||||
XISetMask (mask.mask, XI_ButtonPress);
|
||||
XISetMask (mask.mask, XI_ButtonRelease);
|
||||
XISetMask (mask.mask, XI_Enter);
|
||||
XISetMask (mask.mask, XI_Leave);
|
||||
XISetMask (mask.mask, XI_Motion);
|
||||
|
||||
result = XIGrabDevice (xdpy,
|
||||
META_VIRTUAL_CORE_POINTER_ID,
|
||||
grab_window,
|
||||
timestamp,
|
||||
cursor,
|
||||
timestamp);
|
||||
XIGrabModeAsync, XIGrabModeAsync,
|
||||
False, /* owner_events */
|
||||
&mask);
|
||||
if (result != Success)
|
||||
goto fail;
|
||||
|
||||
@ -374,10 +458,20 @@ meta_begin_modal_for_plugin (MetaScreen *screen,
|
||||
|
||||
if ((options & META_MODAL_KEYBOARD_ALREADY_GRABBED) == 0)
|
||||
{
|
||||
result = XGrabKeyboard (xdpy, grab_window,
|
||||
False, /* owner_events */
|
||||
GrabModeAsync, GrabModeAsync,
|
||||
timestamp);
|
||||
unsigned char mask_bits[XIMaskLen (XI_LASTEVENT)] = { 0 };
|
||||
XIEventMask mask = { XIAllMasterDevices, sizeof (mask_bits), mask_bits };
|
||||
|
||||
XISetMask (mask.mask, XI_KeyPress);
|
||||
XISetMask (mask.mask, XI_KeyRelease);
|
||||
|
||||
result = XIGrabDevice (xdpy,
|
||||
META_VIRTUAL_CORE_KEYBOARD_ID,
|
||||
grab_window,
|
||||
timestamp,
|
||||
None,
|
||||
XIGrabModeAsync, XIGrabModeAsync,
|
||||
False, /* owner_events */
|
||||
&mask);
|
||||
|
||||
if (result != Success)
|
||||
goto fail;
|
||||
@ -397,9 +491,9 @@ meta_begin_modal_for_plugin (MetaScreen *screen,
|
||||
|
||||
fail:
|
||||
if (pointer_grabbed)
|
||||
XUngrabPointer (xdpy, timestamp);
|
||||
XIUngrabDevice (xdpy, META_VIRTUAL_CORE_POINTER_ID, timestamp);
|
||||
if (keyboard_grabbed)
|
||||
XUngrabKeyboard (xdpy, timestamp);
|
||||
XIUngrabDevice (xdpy, META_VIRTUAL_CORE_KEYBOARD_ID, timestamp);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
@ -415,8 +509,8 @@ meta_end_modal_for_plugin (MetaScreen *screen,
|
||||
|
||||
g_return_if_fail (compositor->modal_plugin == plugin);
|
||||
|
||||
XUngrabPointer (xdpy, timestamp);
|
||||
XUngrabKeyboard (xdpy, timestamp);
|
||||
XIUngrabDevice (xdpy, META_VIRTUAL_CORE_POINTER_ID, timestamp);
|
||||
XIUngrabDevice (xdpy, META_VIRTUAL_CORE_KEYBOARD_ID, timestamp);
|
||||
|
||||
display->grab_op = META_GRAB_OP_NONE;
|
||||
display->grab_window = NULL;
|
||||
@ -441,29 +535,32 @@ meta_check_end_modal (MetaScreen *screen)
|
||||
{
|
||||
meta_end_modal_for_plugin (screen,
|
||||
compositor->modal_plugin,
|
||||
CurrentTime);
|
||||
|
||||
CurrentTime);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
meta_compositor_manage_screen (MetaCompositor *compositor,
|
||||
MetaScreen *screen)
|
||||
static void
|
||||
after_stage_paint (ClutterStage *stage,
|
||||
gpointer data)
|
||||
{
|
||||
MetaCompScreen *info;
|
||||
MetaDisplay *display = meta_screen_get_display (screen);
|
||||
Display *xdisplay = meta_display_get_xdisplay (display);
|
||||
int screen_number = meta_screen_get_screen_number (screen);
|
||||
Window xroot = meta_screen_get_xroot (screen);
|
||||
Window xwin;
|
||||
gint width, height;
|
||||
XWindowAttributes attr;
|
||||
long event_mask;
|
||||
guint n_retries;
|
||||
guint max_retries;
|
||||
MetaCompScreen *info = (MetaCompScreen*) data;
|
||||
GList *l;
|
||||
|
||||
/* Check if the screen is already managed */
|
||||
if (meta_screen_get_compositor_data (screen))
|
||||
return;
|
||||
for (l = info->windows; l; l = l->next)
|
||||
meta_window_actor_post_paint (l->data);
|
||||
}
|
||||
|
||||
static void
|
||||
redirect_windows (MetaCompositor *compositor,
|
||||
MetaScreen *screen)
|
||||
{
|
||||
MetaDisplay *display = meta_screen_get_display (screen);
|
||||
Display *xdisplay = meta_display_get_xdisplay (display);
|
||||
Window xroot = meta_screen_get_xroot (screen);
|
||||
int screen_number = meta_screen_get_screen_number (screen);
|
||||
guint n_retries;
|
||||
guint max_retries;
|
||||
|
||||
if (meta_get_replace_current_wm ())
|
||||
max_retries = 5;
|
||||
@ -496,6 +593,21 @@ meta_compositor_manage_screen (MetaCompositor *compositor,
|
||||
n_retries++;
|
||||
g_usleep (G_USEC_PER_SEC);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
meta_compositor_manage_screen (MetaCompositor *compositor,
|
||||
MetaScreen *screen)
|
||||
{
|
||||
MetaCompScreen *info;
|
||||
MetaDisplay *display = meta_screen_get_display (screen);
|
||||
Display *xdisplay = meta_display_get_xdisplay (display);
|
||||
Window xwin;
|
||||
gint width, height;
|
||||
|
||||
/* Check if the screen is already managed */
|
||||
if (meta_screen_get_compositor_data (screen))
|
||||
return;
|
||||
|
||||
info = g_new0 (MetaCompScreen, 1);
|
||||
/*
|
||||
@ -517,6 +629,13 @@ meta_compositor_manage_screen (MetaCompositor *compositor,
|
||||
|
||||
info->stage = clutter_stage_new ();
|
||||
|
||||
clutter_stage_set_paint_callback (CLUTTER_STAGE (info->stage),
|
||||
after_stage_paint,
|
||||
info,
|
||||
NULL);
|
||||
|
||||
clutter_stage_set_sync_delay (CLUTTER_STAGE (info->stage), META_SYNC_DELAY);
|
||||
|
||||
meta_screen_get_size (screen, &width, &height);
|
||||
clutter_actor_realize (info->stage);
|
||||
|
||||
@ -524,38 +643,40 @@ meta_compositor_manage_screen (MetaCompositor *compositor,
|
||||
|
||||
XResizeWindow (xdisplay, xwin, width, height);
|
||||
|
||||
event_mask = FocusChangeMask |
|
||||
ExposureMask |
|
||||
EnterWindowMask | LeaveWindowMask |
|
||||
PointerMotionMask |
|
||||
PropertyChangeMask |
|
||||
ButtonPressMask | ButtonReleaseMask |
|
||||
KeyPressMask | KeyReleaseMask |
|
||||
StructureNotifyMask;
|
||||
{
|
||||
long event_mask;
|
||||
unsigned char mask_bits[XIMaskLen (XI_LASTEVENT)] = { 0 };
|
||||
XIEventMask mask = { XIAllMasterDevices, sizeof (mask_bits), mask_bits };
|
||||
XWindowAttributes attr;
|
||||
|
||||
if (XGetWindowAttributes (xdisplay, xwin, &attr))
|
||||
{
|
||||
event_mask |= attr.your_event_mask;
|
||||
}
|
||||
meta_core_add_old_event_mask (xdisplay, xwin, &mask);
|
||||
|
||||
XSelectInput (xdisplay, xwin, event_mask);
|
||||
XISetMask (mask.mask, XI_KeyPress);
|
||||
XISetMask (mask.mask, XI_KeyRelease);
|
||||
XISetMask (mask.mask, XI_ButtonPress);
|
||||
XISetMask (mask.mask, XI_ButtonRelease);
|
||||
XISetMask (mask.mask, XI_Enter);
|
||||
XISetMask (mask.mask, XI_Leave);
|
||||
XISetMask (mask.mask, XI_FocusIn);
|
||||
XISetMask (mask.mask, XI_FocusOut);
|
||||
XISetMask (mask.mask, XI_Motion);
|
||||
XIClearMask (mask.mask, XI_TouchBegin);
|
||||
XIClearMask (mask.mask, XI_TouchEnd);
|
||||
XIClearMask (mask.mask, XI_TouchUpdate);
|
||||
XISelectEvents (xdisplay, xwin, &mask, 1);
|
||||
|
||||
event_mask = ExposureMask | PropertyChangeMask | StructureNotifyMask;
|
||||
if (XGetWindowAttributes (xdisplay, xwin, &attr))
|
||||
event_mask |= attr.your_event_mask;
|
||||
|
||||
XSelectInput (xdisplay, xwin, event_mask);
|
||||
}
|
||||
|
||||
info->window_group = meta_window_group_new (screen);
|
||||
info->background_actor = meta_background_actor_new_for_screen (screen);
|
||||
info->overlay_group = clutter_group_new ();
|
||||
info->hidden_group = clutter_group_new ();
|
||||
info->top_window_group = meta_window_group_new (screen);
|
||||
|
||||
clutter_container_add (CLUTTER_CONTAINER (info->window_group),
|
||||
info->background_actor,
|
||||
NULL);
|
||||
|
||||
clutter_container_add (CLUTTER_CONTAINER (info->stage),
|
||||
info->window_group,
|
||||
info->overlay_group,
|
||||
info->hidden_group,
|
||||
NULL);
|
||||
|
||||
clutter_actor_hide (info->hidden_group);
|
||||
clutter_actor_add_child (info->stage, info->window_group);
|
||||
clutter_actor_add_child (info->stage, info->top_window_group);
|
||||
|
||||
info->plugin_mgr = meta_plugin_manager_new (screen);
|
||||
|
||||
@ -586,8 +707,12 @@ meta_compositor_manage_screen (MetaCompositor *compositor,
|
||||
info->pending_input_region = None;
|
||||
}
|
||||
|
||||
clutter_actor_show (info->overlay_group);
|
||||
clutter_actor_show (info->stage);
|
||||
/* Map overlay window before redirecting windows offscreen so we catch their
|
||||
* contents until we show the stage.
|
||||
*/
|
||||
XMapWindow (xdisplay, info->output);
|
||||
|
||||
redirect_windows (compositor, screen);
|
||||
}
|
||||
|
||||
void
|
||||
@ -688,25 +813,53 @@ meta_compositor_remove_window (MetaCompositor *compositor,
|
||||
}
|
||||
|
||||
void
|
||||
meta_compositor_set_updates (MetaCompositor *compositor,
|
||||
MetaWindow *window,
|
||||
gboolean updates)
|
||||
meta_compositor_set_updates_frozen (MetaCompositor *compositor,
|
||||
MetaWindow *window,
|
||||
gboolean updates_frozen)
|
||||
{
|
||||
MetaWindowActor *window_actor;
|
||||
|
||||
DEBUG_TRACE ("meta_compositor_set_updates_frozen\n");
|
||||
window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (window));
|
||||
if (!window_actor)
|
||||
return;
|
||||
|
||||
meta_window_actor_set_updates_frozen (window_actor, updates_frozen);
|
||||
}
|
||||
|
||||
void
|
||||
meta_compositor_queue_frame_drawn (MetaCompositor *compositor,
|
||||
MetaWindow *window,
|
||||
gboolean no_delay_frame)
|
||||
{
|
||||
MetaWindowActor *window_actor;
|
||||
|
||||
DEBUG_TRACE ("meta_compositor_queue_frame_drawn\n");
|
||||
window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (window));
|
||||
if (!window_actor)
|
||||
return;
|
||||
|
||||
meta_window_actor_queue_frame_drawn (window_actor, no_delay_frame);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
is_grabbed_event (XEvent *event)
|
||||
is_grabbed_event (MetaDisplay *display,
|
||||
XEvent *event)
|
||||
{
|
||||
switch (event->xany.type)
|
||||
if (event->type == GenericEvent &&
|
||||
event->xcookie.extension == display->xinput_opcode)
|
||||
{
|
||||
case ButtonPress:
|
||||
case ButtonRelease:
|
||||
case EnterNotify:
|
||||
case LeaveNotify:
|
||||
case MotionNotify:
|
||||
case KeyPress:
|
||||
case KeyRelease:
|
||||
return TRUE;
|
||||
XIEvent *xev = (XIEvent *) event->xcookie.data;
|
||||
|
||||
switch (xev->evtype)
|
||||
{
|
||||
case XI_Motion:
|
||||
case XI_ButtonPress:
|
||||
case XI_ButtonRelease:
|
||||
case XI_KeyPress:
|
||||
case XI_KeyRelease:
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
@ -718,11 +871,63 @@ meta_compositor_window_shape_changed (MetaCompositor *compositor,
|
||||
{
|
||||
MetaWindowActor *window_actor;
|
||||
window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (window));
|
||||
if (!window_actor)
|
||||
return;
|
||||
|
||||
meta_window_actor_update_shape (window_actor);
|
||||
}
|
||||
|
||||
/* Clutter makes the assumption that there is only one X window
|
||||
* per stage, which is a valid assumption to make for a generic
|
||||
* application toolkit. As such, it will ignore any events sent
|
||||
* to the a stage that isn't its X window.
|
||||
*
|
||||
* When a user clicks on what she thinks is the wallpaper, she
|
||||
* is actually clicking on the guard window, which is an entirely
|
||||
* separate top-level override-redirect window in the hierarchy.
|
||||
* We want to recieve events on this guard window so that users
|
||||
* can right-click on the background actor. We do this by telling
|
||||
* Clutter a little white lie, by transforming clicks on the guard
|
||||
* window to become clicks on the stage window, allowing Clutter
|
||||
* to process the event normally.
|
||||
*/
|
||||
static void
|
||||
maybe_spoof_guard_window_event_as_stage_event (MetaCompScreen *info,
|
||||
XEvent *event)
|
||||
{
|
||||
MetaDisplay *display = meta_screen_get_display (info->screen);
|
||||
|
||||
if (event->type == GenericEvent &&
|
||||
event->xcookie.extension == display->xinput_opcode)
|
||||
{
|
||||
XIEvent *input_event = (XIEvent *) event->xcookie.data;
|
||||
|
||||
/* Only care about pointer events for now. */
|
||||
switch (input_event->evtype)
|
||||
{
|
||||
case XI_Motion:
|
||||
case XI_ButtonPress:
|
||||
case XI_ButtonRelease:
|
||||
{
|
||||
XIDeviceEvent *device_event = ((XIDeviceEvent *) input_event);
|
||||
if (device_event->event == info->screen->guard_window)
|
||||
{
|
||||
Window xwin = clutter_x11_get_stage_window (CLUTTER_STAGE (info->stage));
|
||||
device_event->event = xwin;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_compositor_process_event: (skip)
|
||||
* @compositor:
|
||||
* @event:
|
||||
* @window:
|
||||
*
|
||||
*/
|
||||
gboolean
|
||||
@ -730,7 +935,7 @@ meta_compositor_process_event (MetaCompositor *compositor,
|
||||
XEvent *event,
|
||||
MetaWindow *window)
|
||||
{
|
||||
if (compositor->modal_plugin && is_grabbed_event (event))
|
||||
if (compositor->modal_plugin && is_grabbed_event (compositor->display, event))
|
||||
{
|
||||
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (compositor->modal_plugin);
|
||||
|
||||
@ -769,6 +974,8 @@ meta_compositor_process_event (MetaCompositor *compositor,
|
||||
|
||||
info = meta_screen_get_compositor_data (screen);
|
||||
|
||||
maybe_spoof_guard_window_event_as_stage_event (info, event);
|
||||
|
||||
if (meta_plugin_manager_xevent_filter (info->plugin_mgr, event))
|
||||
{
|
||||
DEBUG_TRACE ("meta_compositor_process_event (filtered,window==NULL)\n");
|
||||
@ -924,8 +1131,11 @@ static void
|
||||
sync_actor_stacking (MetaCompScreen *info)
|
||||
{
|
||||
GList *children;
|
||||
GList *expected_window_node;
|
||||
GList *tmp;
|
||||
GList *old;
|
||||
GList *backgrounds;
|
||||
gboolean has_windows;
|
||||
gboolean reordered;
|
||||
|
||||
/* NB: The first entries in the lists are stacked the lowest */
|
||||
@ -934,60 +1144,74 @@ sync_actor_stacking (MetaCompScreen *info)
|
||||
* little effort to make sure we actually need to restack before
|
||||
* we go ahead and do it */
|
||||
|
||||
children = clutter_container_get_children (CLUTTER_CONTAINER (info->window_group));
|
||||
children = clutter_actor_get_children (info->window_group);
|
||||
reordered = FALSE;
|
||||
|
||||
old = children;
|
||||
|
||||
/* We allow for actors in the window group other than the actors we
|
||||
* know about, but it's up to a plugin to try and keep them stacked correctly
|
||||
* (we really need extra API to make that reliable.)
|
||||
*/
|
||||
|
||||
/* Of the actors we know, the bottom actor should be the background actor */
|
||||
|
||||
while (old && old->data != info->background_actor && !META_IS_WINDOW_ACTOR (old->data))
|
||||
old = old->next;
|
||||
if (old == NULL || old->data != info->background_actor)
|
||||
/* First we collect a list of all backgrounds, and check if they're at the
|
||||
* bottom. Then we check if the window actors are in the correct sequence */
|
||||
backgrounds = NULL;
|
||||
expected_window_node = info->windows;
|
||||
for (old = children; old != NULL; old = old->next)
|
||||
{
|
||||
reordered = TRUE;
|
||||
goto done_with_check;
|
||||
}
|
||||
ClutterActor *actor = old->data;
|
||||
|
||||
/* Then the window actors should follow in sequence */
|
||||
|
||||
old = old->next;
|
||||
for (tmp = info->windows; tmp != NULL; tmp = tmp->next)
|
||||
{
|
||||
while (old && !META_IS_WINDOW_ACTOR (old->data))
|
||||
old = old->next;
|
||||
|
||||
/* old == NULL: someone reparented a window out of the window group,
|
||||
* order undefined, always restack */
|
||||
if (old == NULL || old->data != tmp->data)
|
||||
if (META_IS_BACKGROUND_GROUP (actor) ||
|
||||
META_IS_BACKGROUND_ACTOR (actor))
|
||||
{
|
||||
reordered = TRUE;
|
||||
goto done_with_check;
|
||||
backgrounds = g_list_prepend (backgrounds, actor);
|
||||
|
||||
if (has_windows)
|
||||
reordered = TRUE;
|
||||
}
|
||||
else if (META_IS_WINDOW_ACTOR (actor) && !reordered)
|
||||
{
|
||||
has_windows = TRUE;
|
||||
|
||||
old = old->next;
|
||||
if (expected_window_node != NULL && actor == expected_window_node->data)
|
||||
expected_window_node = expected_window_node->next;
|
||||
else
|
||||
reordered = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
done_with_check:
|
||||
|
||||
g_list_free (children);
|
||||
|
||||
if (!reordered)
|
||||
return;
|
||||
|
||||
for (tmp = g_list_last (info->windows); tmp != NULL; tmp = tmp->prev)
|
||||
{
|
||||
MetaWindowActor *window_actor = tmp->data;
|
||||
|
||||
clutter_actor_lower_bottom (CLUTTER_ACTOR (window_actor));
|
||||
g_list_free (backgrounds);
|
||||
return;
|
||||
}
|
||||
|
||||
clutter_actor_lower_bottom (info->background_actor);
|
||||
/* reorder the actors by lowering them in turn to the bottom of the stack.
|
||||
* windows first, then background.
|
||||
*
|
||||
* We reorder the actors even if they're not parented to the window group,
|
||||
* to allow stacking to work with intermediate actors (eg during effects)
|
||||
*/
|
||||
for (tmp = g_list_last (info->windows); tmp != NULL; tmp = tmp->prev)
|
||||
{
|
||||
ClutterActor *actor = tmp->data, *parent;
|
||||
|
||||
parent = clutter_actor_get_parent (actor);
|
||||
clutter_actor_set_child_below_sibling (parent, actor, NULL);
|
||||
}
|
||||
|
||||
/* we prepended the backgrounds above so the last actor in the list
|
||||
* should get lowered to the bottom last.
|
||||
*/
|
||||
for (tmp = backgrounds; tmp != NULL; tmp = tmp->next)
|
||||
{
|
||||
ClutterActor *actor = tmp->data, *parent;
|
||||
|
||||
parent = clutter_actor_get_parent (actor);
|
||||
clutter_actor_set_child_below_sibling (parent, actor, NULL);
|
||||
}
|
||||
g_list_free (backgrounds);
|
||||
}
|
||||
|
||||
void
|
||||
@ -1108,7 +1332,8 @@ meta_compositor_window_unmapped (MetaCompositor *compositor,
|
||||
|
||||
void
|
||||
meta_compositor_sync_window_geometry (MetaCompositor *compositor,
|
||||
MetaWindow *window)
|
||||
MetaWindow *window,
|
||||
gboolean did_placement)
|
||||
{
|
||||
MetaWindowActor *window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (window));
|
||||
MetaScreen *screen = meta_window_get_screen (window);
|
||||
@ -1120,7 +1345,7 @@ meta_compositor_sync_window_geometry (MetaCompositor *compositor,
|
||||
if (!window_actor)
|
||||
return;
|
||||
|
||||
meta_window_actor_sync_actor_position (window_actor);
|
||||
meta_window_actor_sync_actor_geometry (window_actor, did_placement);
|
||||
}
|
||||
|
||||
void
|
||||
@ -1142,13 +1367,53 @@ meta_compositor_sync_screen_size (MetaCompositor *compositor,
|
||||
|
||||
XResizeWindow (xdisplay, xwin, width, height);
|
||||
|
||||
meta_background_actor_screen_size_changed (screen);
|
||||
|
||||
meta_verbose ("Changed size for stage on screen %d to %dx%d\n",
|
||||
meta_screen_get_screen_number (screen),
|
||||
width, height);
|
||||
}
|
||||
|
||||
static void
|
||||
frame_callback (CoglOnscreen *onscreen,
|
||||
CoglFrameEvent event,
|
||||
CoglFrameInfo *frame_info,
|
||||
void *user_data)
|
||||
{
|
||||
MetaCompScreen *info = user_data;
|
||||
GList *l;
|
||||
|
||||
if (event == COGL_FRAME_EVENT_COMPLETE)
|
||||
{
|
||||
gint64 presentation_time_cogl = cogl_frame_info_get_presentation_time (frame_info);
|
||||
gint64 presentation_time;
|
||||
|
||||
if (presentation_time_cogl != 0)
|
||||
{
|
||||
/* Cogl reports presentation in terms of its own clock, which is
|
||||
* guaranteed to be in nanoseconds but with no specified base. The
|
||||
* normal case with the open source GPU drivers on Linux 3.8 and
|
||||
* newer is that the base of cogl_get_clock_time() is that of
|
||||
* clock_gettime(CLOCK_MONOTONIC), so the same as g_get_monotonic_time),
|
||||
* but there's no exposure of that through the API. clock_gettime()
|
||||
* is fairly fast, so calling it twice and subtracting to get a
|
||||
* nearly-zero number is acceptable, if a litle ugly.
|
||||
*/
|
||||
CoglContext *context = cogl_framebuffer_get_context (COGL_FRAMEBUFFER (onscreen));
|
||||
gint64 current_cogl_time = cogl_get_clock_time (context);
|
||||
gint64 current_monotonic_time = g_get_monotonic_time ();
|
||||
|
||||
presentation_time =
|
||||
current_monotonic_time + (presentation_time_cogl - current_cogl_time) / 1000;
|
||||
}
|
||||
else
|
||||
{
|
||||
presentation_time = 0;
|
||||
}
|
||||
|
||||
for (l = info->windows; l; l = l->next)
|
||||
meta_window_actor_frame_complete (l->data, frame_info, presentation_time);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
pre_paint_windows (MetaCompScreen *info)
|
||||
{
|
||||
@ -1156,6 +1421,15 @@ pre_paint_windows (MetaCompScreen *info)
|
||||
MetaWindowActor *top_window;
|
||||
MetaWindowActor *expected_unredirected_window = NULL;
|
||||
|
||||
if (info->onscreen == NULL)
|
||||
{
|
||||
info->onscreen = COGL_ONSCREEN (cogl_get_draw_framebuffer ());
|
||||
info->frame_closure = cogl_onscreen_add_frame_callback (info->onscreen,
|
||||
frame_callback,
|
||||
info,
|
||||
NULL);
|
||||
}
|
||||
|
||||
if (info->windows == NULL)
|
||||
return;
|
||||
|
||||
@ -1230,6 +1504,7 @@ on_shadow_factory_changed (MetaShadowFactory *factory,
|
||||
|
||||
/**
|
||||
* meta_compositor_new: (skip)
|
||||
* @display:
|
||||
*
|
||||
*/
|
||||
MetaCompositor *
|
||||
@ -1237,7 +1512,6 @@ meta_compositor_new (MetaDisplay *display)
|
||||
{
|
||||
char *atom_names[] = {
|
||||
"_XROOTPMAP_ID",
|
||||
"_XSETROOT_ID",
|
||||
"_NET_WM_WINDOW_OPACITY",
|
||||
};
|
||||
Atom atoms[G_N_ELEMENTS(atom_names)];
|
||||
@ -1264,8 +1538,7 @@ meta_compositor_new (MetaDisplay *display)
|
||||
compositor);
|
||||
|
||||
compositor->atom_x_root_pixmap = atoms[0];
|
||||
compositor->atom_x_set_root = atoms[1];
|
||||
compositor->atom_net_wm_window_opacity = atoms[2];
|
||||
compositor->atom_net_wm_window_opacity = atoms[1];
|
||||
|
||||
compositor->repaint_func_id = clutter_threads_add_repaint_func (meta_repaint_func,
|
||||
compositor,
|
||||
@ -1276,6 +1549,7 @@ meta_compositor_new (MetaDisplay *display)
|
||||
|
||||
/**
|
||||
* meta_get_overlay_window: (skip)
|
||||
* @screen: a #MetaScreen
|
||||
*
|
||||
*/
|
||||
Window
|
||||
@ -1313,50 +1587,100 @@ void
|
||||
meta_enable_unredirect_for_screen (MetaScreen *screen)
|
||||
{
|
||||
MetaCompScreen *info = meta_screen_get_compositor_data (screen);
|
||||
if (info != NULL)
|
||||
info->disable_unredirect_count = MAX(0, info->disable_unredirect_count - 1);
|
||||
if (info != NULL && info->disable_unredirect_count == 0)
|
||||
g_warning ("Called enable_unredirect_for_screen while unredirection is enabled.");
|
||||
if (info != NULL && info->disable_unredirect_count > 0)
|
||||
info->disable_unredirect_count = info->disable_unredirect_count - 1;
|
||||
}
|
||||
|
||||
#define FLASH_TIME_MS 50
|
||||
|
||||
static void
|
||||
flash_out_completed (ClutterAnimation *animation,
|
||||
ClutterActor *flash)
|
||||
flash_out_completed (ClutterTimeline *timeline,
|
||||
gboolean is_finished,
|
||||
gpointer user_data)
|
||||
{
|
||||
ClutterActor *flash = CLUTTER_ACTOR (user_data);
|
||||
clutter_actor_destroy (flash);
|
||||
}
|
||||
|
||||
static void
|
||||
flash_in_completed (ClutterAnimation *animation,
|
||||
ClutterActor *flash)
|
||||
{
|
||||
clutter_actor_animate (flash, CLUTTER_EASE_IN_QUAD,
|
||||
FLASH_TIME_MS,
|
||||
"opacity", 0,
|
||||
"signal-after::completed", flash_out_completed, flash,
|
||||
NULL);
|
||||
}
|
||||
|
||||
void
|
||||
meta_compositor_flash_screen (MetaCompositor *compositor,
|
||||
MetaScreen *screen)
|
||||
{
|
||||
ClutterActor *stage;
|
||||
ClutterActor *flash;
|
||||
ClutterColor black = { 0, 0, 0, 255 };
|
||||
ClutterTransition *transition;
|
||||
gfloat width, height;
|
||||
|
||||
stage = meta_get_stage_for_screen (screen);
|
||||
clutter_actor_get_size (stage, &width, &height);
|
||||
|
||||
flash = clutter_rectangle_new_with_color (&black);
|
||||
flash = clutter_actor_new ();
|
||||
clutter_actor_set_background_color (flash, CLUTTER_COLOR_Black);
|
||||
clutter_actor_set_size (flash, width, height);
|
||||
clutter_actor_set_opacity (flash, 0);
|
||||
clutter_container_add_actor (CLUTTER_CONTAINER (stage), flash);
|
||||
clutter_actor_add_child (stage, flash);
|
||||
|
||||
clutter_actor_animate (flash, CLUTTER_EASE_OUT_QUAD,
|
||||
FLASH_TIME_MS,
|
||||
"opacity", 192,
|
||||
"signal-after::completed", flash_in_completed, flash,
|
||||
NULL);
|
||||
clutter_actor_save_easing_state (flash);
|
||||
clutter_actor_set_easing_mode (flash, CLUTTER_EASE_IN_QUAD);
|
||||
clutter_actor_set_easing_duration (flash, FLASH_TIME_MS);
|
||||
clutter_actor_set_opacity (flash, 192);
|
||||
|
||||
transition = clutter_actor_get_transition (flash, "opacity");
|
||||
clutter_timeline_set_auto_reverse (CLUTTER_TIMELINE (transition), TRUE);
|
||||
clutter_timeline_set_repeat_count (CLUTTER_TIMELINE (transition), 2);
|
||||
|
||||
g_signal_connect (transition, "stopped",
|
||||
G_CALLBACK (flash_out_completed), flash);
|
||||
|
||||
clutter_actor_restore_easing_state (flash);
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_compositor_monotonic_time_to_server_time:
|
||||
* @display: a #MetaDisplay
|
||||
* @monotonic_time: time in the units of g_get_monotonic_time()
|
||||
*
|
||||
* _NET_WM_FRAME_DRAWN and _NET_WM_FRAME_TIMINGS messages represent time
|
||||
* as a "high resolution server time" - this is the server time interpolated
|
||||
* to microsecond resolution. The advantage of this time representation
|
||||
* is that if X server is running on the same computer as a client, and
|
||||
* the Xserver uses 'clock_gettime(CLOCK_MONOTONIC, ...)' for the server
|
||||
* time, the client can detect this, and all such clients will share a
|
||||
* a time representation with high accuracy. If there is not a common
|
||||
* time source, then the time synchronization will be less accurate.
|
||||
*/
|
||||
gint64
|
||||
meta_compositor_monotonic_time_to_server_time (MetaDisplay *display,
|
||||
gint64 monotonic_time)
|
||||
{
|
||||
MetaCompositor *compositor = display->compositor;
|
||||
|
||||
if (compositor->server_time_query_time == 0 ||
|
||||
(!compositor->server_time_is_monotonic_time &&
|
||||
monotonic_time > compositor->server_time_query_time + 10*1000*1000)) /* 10 seconds */
|
||||
{
|
||||
guint32 server_time = meta_display_get_current_time_roundtrip (display);
|
||||
gint64 server_time_usec = (gint64)server_time * 1000;
|
||||
gint64 current_monotonic_time = g_get_monotonic_time ();
|
||||
compositor->server_time_query_time = current_monotonic_time;
|
||||
|
||||
/* If the server time is within a second of the monotonic time,
|
||||
* we assume that they are identical. This seems like a big margin,
|
||||
* but we want to be as robust as possible even if the system
|
||||
* is under load and our processing of the server response is
|
||||
* delayed.
|
||||
*/
|
||||
if (server_time_usec > current_monotonic_time - 1000*1000 &&
|
||||
server_time_usec < current_monotonic_time + 1000*1000)
|
||||
compositor->server_time_is_monotonic_time = TRUE;
|
||||
|
||||
compositor->server_time_offset = server_time_usec - current_monotonic_time;
|
||||
}
|
||||
|
||||
if (compositor->server_time_is_monotonic_time)
|
||||
return monotonic_time;
|
||||
else
|
||||
return monotonic_time + compositor->server_time_offset;
|
||||
}
|
||||
|
@ -9,7 +9,6 @@
|
||||
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);
|
||||
cairo_region_t *meta_background_actor_get_visible_region (MetaBackgroundActor *self);
|
||||
|
||||
#endif /* META_BACKGROUND_ACTOR_PRIVATE_H */
|
||||
|
@ -1,7 +1,5 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
/*
|
||||
* meta-background-actor.c: Actor for painting the root window background
|
||||
*
|
||||
* Copyright 2009 Sander Dijkhuis
|
||||
* Copyright 2010 Red Hat, Inc.
|
||||
*
|
||||
@ -23,12 +21,17 @@
|
||||
* Portions adapted from gnome-shell/src/shell-global.c
|
||||
*/
|
||||
|
||||
/**
|
||||
* SECTION:meta-background-actor
|
||||
* @title: MetaBackgroundActor
|
||||
* @short_description: Actor for painting the root window background
|
||||
*
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#define COGL_ENABLE_EXPERIMENTAL_API
|
||||
#include <cogl/cogl-texture-pixmap-x11.h>
|
||||
|
||||
#define CLUTTER_ENABLE_EXPERIMENTAL_API
|
||||
#include <clutter/clutter.h>
|
||||
|
||||
#include <X11/Xatom.h>
|
||||
@ -36,223 +39,23 @@
|
||||
#include "cogl-utils.h"
|
||||
#include "compositor-private.h"
|
||||
#include <meta/errors.h>
|
||||
#include <meta/meta-background.h>
|
||||
#include "meta-background-actor-private.h"
|
||||
|
||||
/* We allow creating multiple MetaBackgroundActors for the same MetaScreen to
|
||||
* allow different rendering options to be set for different copies.
|
||||
* But we want to share the same underlying CoglTexture for efficiency and
|
||||
* to avoid driver bugs that might occur if we created multiple CoglTexturePixmaps
|
||||
* for the same pixmap.
|
||||
*
|
||||
* This structure holds common information.
|
||||
*/
|
||||
typedef struct _MetaScreenBackground MetaScreenBackground;
|
||||
|
||||
struct _MetaScreenBackground
|
||||
{
|
||||
MetaScreen *screen;
|
||||
GSList *actors;
|
||||
|
||||
float texture_width;
|
||||
float texture_height;
|
||||
CoglTexture *texture;
|
||||
CoglMaterialWrapMode wrap_mode;
|
||||
guint have_pixmap : 1;
|
||||
};
|
||||
|
||||
struct _MetaBackgroundActorPrivate
|
||||
{
|
||||
MetaScreenBackground *background;
|
||||
CoglPipeline *pipeline;
|
||||
|
||||
cairo_region_t *visible_region;
|
||||
float dim_factor;
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
PROP_0,
|
||||
|
||||
PROP_DIM_FACTOR,
|
||||
|
||||
PROP_LAST
|
||||
};
|
||||
|
||||
static GParamSpec *obj_props[PROP_LAST];
|
||||
|
||||
G_DEFINE_TYPE (MetaBackgroundActor, meta_background_actor, CLUTTER_TYPE_ACTOR);
|
||||
|
||||
static void set_texture (MetaScreenBackground *background,
|
||||
CoglHandle texture);
|
||||
static void set_texture_to_stage_color (MetaScreenBackground *background);
|
||||
|
||||
static void
|
||||
on_notify_stage_color (GObject *stage,
|
||||
GParamSpec *pspec,
|
||||
MetaScreenBackground *background)
|
||||
{
|
||||
if (!background->have_pixmap)
|
||||
set_texture_to_stage_color (background);
|
||||
}
|
||||
|
||||
static void
|
||||
free_screen_background (MetaScreenBackground *background)
|
||||
{
|
||||
set_texture (background, COGL_INVALID_HANDLE);
|
||||
|
||||
if (background->screen != NULL)
|
||||
{
|
||||
ClutterActor *stage = meta_get_stage_for_screen (background->screen);
|
||||
g_signal_handlers_disconnect_by_func (stage,
|
||||
(gpointer) on_notify_stage_color,
|
||||
background);
|
||||
background->screen = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static MetaScreenBackground *
|
||||
meta_screen_background_get (MetaScreen *screen)
|
||||
{
|
||||
MetaScreenBackground *background;
|
||||
|
||||
background = g_object_get_data (G_OBJECT (screen), "meta-screen-background");
|
||||
if (background == NULL)
|
||||
{
|
||||
ClutterActor *stage;
|
||||
|
||||
background = g_new0 (MetaScreenBackground, 1);
|
||||
|
||||
background->screen = screen;
|
||||
g_object_set_data_full (G_OBJECT (screen), "meta-screen-background",
|
||||
background, (GDestroyNotify) free_screen_background);
|
||||
|
||||
stage = meta_get_stage_for_screen (screen);
|
||||
g_signal_connect (stage, "notify::color",
|
||||
G_CALLBACK (on_notify_stage_color), background);
|
||||
|
||||
meta_background_actor_update (screen);
|
||||
}
|
||||
|
||||
return background;
|
||||
}
|
||||
|
||||
static void
|
||||
update_wrap_mode_of_actor (MetaBackgroundActor *self)
|
||||
{
|
||||
MetaBackgroundActorPrivate *priv = self->priv;
|
||||
|
||||
cogl_pipeline_set_layer_wrap_mode (priv->pipeline, 0, priv->background->wrap_mode);
|
||||
}
|
||||
|
||||
static void
|
||||
update_wrap_mode (MetaScreenBackground *background)
|
||||
{
|
||||
GSList *l;
|
||||
int width, height;
|
||||
|
||||
meta_screen_get_size (background->screen, &width, &height);
|
||||
|
||||
/* We turn off repeating when we have a full-screen pixmap to keep from
|
||||
* getting artifacts from one side of the image sneaking into the other
|
||||
* side of the image via bilinear filtering.
|
||||
*/
|
||||
if (width == background->texture_width && height == background->texture_height)
|
||||
background->wrap_mode = COGL_MATERIAL_WRAP_MODE_CLAMP_TO_EDGE;
|
||||
else
|
||||
background->wrap_mode = COGL_MATERIAL_WRAP_MODE_REPEAT;
|
||||
|
||||
for (l = background->actors; l; l = l->next)
|
||||
update_wrap_mode_of_actor (l->data);
|
||||
}
|
||||
|
||||
static void
|
||||
set_texture_on_actor (MetaBackgroundActor *self)
|
||||
{
|
||||
MetaBackgroundActorPrivate *priv = self->priv;
|
||||
MetaDisplay *display = meta_screen_get_display (priv->background->screen);
|
||||
|
||||
/* This may trigger destruction of an old texture pixmap, which, if
|
||||
* the underlying X pixmap is already gone has the tendency to trigger
|
||||
* X errors inside DRI. For safety, trap errors */
|
||||
meta_error_trap_push (display);
|
||||
cogl_pipeline_set_layer_texture (priv->pipeline, 0, priv->background->texture);
|
||||
meta_error_trap_pop (display);
|
||||
|
||||
clutter_actor_queue_redraw (CLUTTER_ACTOR (self));
|
||||
}
|
||||
|
||||
static void
|
||||
set_texture (MetaScreenBackground *background,
|
||||
CoglHandle texture)
|
||||
{
|
||||
MetaDisplay *display = meta_screen_get_display (background->screen);
|
||||
GSList *l;
|
||||
|
||||
/* This may trigger destruction of an old texture pixmap, which, if
|
||||
* the underlying X pixmap is already gone has the tendency to trigger
|
||||
* X errors inside DRI. For safety, trap errors */
|
||||
meta_error_trap_push (display);
|
||||
if (background->texture != COGL_INVALID_HANDLE)
|
||||
{
|
||||
cogl_handle_unref (background->texture);
|
||||
background->texture = COGL_INVALID_HANDLE;
|
||||
}
|
||||
meta_error_trap_pop (display);
|
||||
|
||||
if (texture != COGL_INVALID_HANDLE)
|
||||
background->texture = cogl_handle_ref (texture);
|
||||
|
||||
background->texture_width = cogl_texture_get_width (background->texture);
|
||||
background->texture_height = cogl_texture_get_height (background->texture);
|
||||
|
||||
for (l = background->actors; l; l = l->next)
|
||||
set_texture_on_actor (l->data);
|
||||
|
||||
update_wrap_mode (background);
|
||||
}
|
||||
|
||||
/* Sets our pipeline to paint with a 1x1 texture of the stage's background
|
||||
* color; doing this when we have no pixmap allows the application to turn
|
||||
* off painting the stage. There might be a performance benefit to
|
||||
* painting in this case with a solid color, but the normal solid color
|
||||
* case is a 1x1 root pixmap, so we'd have to reverse-engineer that to
|
||||
* actually pick up the (small?) performance win. This is just a fallback.
|
||||
*/
|
||||
static void
|
||||
set_texture_to_stage_color (MetaScreenBackground *background)
|
||||
{
|
||||
ClutterActor *stage = meta_get_stage_for_screen (background->screen);
|
||||
ClutterColor color;
|
||||
CoglHandle texture;
|
||||
|
||||
clutter_stage_get_color (CLUTTER_STAGE (stage), &color);
|
||||
|
||||
/* Slicing will prevent COGL from using hardware texturing for
|
||||
* the tiled 1x1 pixmap, and will cause it to draw the window
|
||||
* background in millions of separate 1x1 rectangles */
|
||||
texture = meta_create_color_texture_4ub (color.red, color.green,
|
||||
color.blue, 0xff,
|
||||
COGL_TEXTURE_NO_SLICING);
|
||||
set_texture (background, texture);
|
||||
cogl_handle_unref (texture);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_background_actor_dispose (GObject *object)
|
||||
{
|
||||
MetaBackgroundActor *self = META_BACKGROUND_ACTOR (object);
|
||||
MetaBackgroundActorPrivate *priv = self->priv;
|
||||
|
||||
meta_background_actor_set_visible_region (self, NULL);
|
||||
|
||||
if (priv->background != NULL)
|
||||
{
|
||||
priv->background->actors = g_slist_remove (priv->background->actors, self);
|
||||
priv->background = NULL;
|
||||
}
|
||||
|
||||
g_clear_pointer(&priv->pipeline, cogl_object_unref);
|
||||
|
||||
G_OBJECT_CLASS (meta_background_actor_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
@ -262,11 +65,15 @@ meta_background_actor_get_preferred_width (ClutterActor *actor,
|
||||
gfloat *min_width_p,
|
||||
gfloat *natural_width_p)
|
||||
{
|
||||
MetaBackgroundActor *self = META_BACKGROUND_ACTOR (actor);
|
||||
MetaBackgroundActorPrivate *priv = self->priv;
|
||||
int width, height;
|
||||
ClutterContent *content;
|
||||
gfloat width;
|
||||
|
||||
meta_screen_get_size (priv->background->screen, &width, &height);
|
||||
content = clutter_actor_get_content (actor);
|
||||
|
||||
if (content)
|
||||
clutter_content_get_preferred_size (content, &width, NULL);
|
||||
else
|
||||
width = 0;
|
||||
|
||||
if (min_width_p)
|
||||
*min_width_p = width;
|
||||
@ -281,11 +88,15 @@ meta_background_actor_get_preferred_height (ClutterActor *actor,
|
||||
gfloat *natural_height_p)
|
||||
|
||||
{
|
||||
MetaBackgroundActor *self = META_BACKGROUND_ACTOR (actor);
|
||||
MetaBackgroundActorPrivate *priv = self->priv;
|
||||
int width, height;
|
||||
ClutterContent *content;
|
||||
gfloat height;
|
||||
|
||||
meta_screen_get_size (priv->background->screen, &width, &height);
|
||||
content = clutter_actor_get_content (actor);
|
||||
|
||||
if (content)
|
||||
clutter_content_get_preferred_size (content, NULL, &height);
|
||||
else
|
||||
height = 0;
|
||||
|
||||
if (min_height_p)
|
||||
*min_height_p = height;
|
||||
@ -293,64 +104,19 @@ meta_background_actor_get_preferred_height (ClutterActor *actor,
|
||||
*natural_height_p = height;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_background_actor_paint (ClutterActor *actor)
|
||||
{
|
||||
MetaBackgroundActor *self = META_BACKGROUND_ACTOR (actor);
|
||||
MetaBackgroundActorPrivate *priv = self->priv;
|
||||
guint8 opacity = clutter_actor_get_paint_opacity (actor);
|
||||
guint8 color_component;
|
||||
int width, height;
|
||||
|
||||
meta_screen_get_size (priv->background->screen, &width, &height);
|
||||
|
||||
color_component = (int)(0.5 + opacity * priv->dim_factor);
|
||||
|
||||
cogl_pipeline_set_color4ub (priv->pipeline,
|
||||
color_component,
|
||||
color_component,
|
||||
color_component,
|
||||
opacity);
|
||||
|
||||
cogl_set_source (priv->pipeline);
|
||||
|
||||
if (priv->visible_region)
|
||||
{
|
||||
int n_rectangles = cairo_region_num_rectangles (priv->visible_region);
|
||||
int i;
|
||||
|
||||
for (i = 0; i < n_rectangles; i++)
|
||||
{
|
||||
cairo_rectangle_int_t rect;
|
||||
cairo_region_get_rectangle (priv->visible_region, i, &rect);
|
||||
|
||||
cogl_rectangle_with_texture_coords (rect.x, rect.y,
|
||||
rect.x + rect.width, rect.y + rect.height,
|
||||
rect.x / priv->background->texture_width,
|
||||
rect.y / priv->background->texture_height,
|
||||
(rect.x + rect.width) / priv->background->texture_width,
|
||||
(rect.y + rect.height) / priv->background->texture_height);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
cogl_rectangle_with_texture_coords (0.0f, 0.0f,
|
||||
width, height,
|
||||
0.0f, 0.0f,
|
||||
width / priv->background->texture_width,
|
||||
height / priv->background->texture_height);
|
||||
}
|
||||
}
|
||||
|
||||
static gboolean
|
||||
meta_background_actor_get_paint_volume (ClutterActor *actor,
|
||||
ClutterPaintVolume *volume)
|
||||
{
|
||||
MetaBackgroundActor *self = META_BACKGROUND_ACTOR (actor);
|
||||
MetaBackgroundActorPrivate *priv = self->priv;
|
||||
int width, height;
|
||||
ClutterContent *content;
|
||||
gfloat width, height;
|
||||
|
||||
meta_screen_get_size (priv->background->screen, &width, &height);
|
||||
content = clutter_actor_get_content (actor);
|
||||
|
||||
if (!content)
|
||||
return FALSE;
|
||||
|
||||
clutter_content_get_preferred_size (content, &width, &height);
|
||||
|
||||
clutter_paint_volume_set_width (volume, width);
|
||||
clutter_paint_volume_set_height (volume, height);
|
||||
@ -358,215 +124,48 @@ meta_background_actor_get_paint_volume (ClutterActor *actor,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_background_actor_set_dim_factor (MetaBackgroundActor *self,
|
||||
gfloat dim_factor)
|
||||
{
|
||||
MetaBackgroundActorPrivate *priv = self->priv;
|
||||
|
||||
if (priv->dim_factor == dim_factor)
|
||||
return;
|
||||
|
||||
priv->dim_factor = dim_factor;
|
||||
|
||||
clutter_actor_queue_redraw (CLUTTER_ACTOR (self));
|
||||
|
||||
g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_DIM_FACTOR]);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_background_actor_get_property(GObject *object,
|
||||
guint prop_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
MetaBackgroundActor *self = META_BACKGROUND_ACTOR (object);
|
||||
MetaBackgroundActorPrivate *priv = self->priv;
|
||||
|
||||
switch (prop_id)
|
||||
{
|
||||
case PROP_DIM_FACTOR:
|
||||
g_value_set_float (value, priv->dim_factor);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
meta_background_actor_set_property(GObject *object,
|
||||
guint prop_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
MetaBackgroundActor *self = META_BACKGROUND_ACTOR (object);
|
||||
|
||||
switch (prop_id)
|
||||
{
|
||||
case PROP_DIM_FACTOR:
|
||||
meta_background_actor_set_dim_factor (self, g_value_get_float (value));
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
meta_background_actor_class_init (MetaBackgroundActorClass *klass)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass);
|
||||
GParamSpec *pspec;
|
||||
|
||||
g_type_class_add_private (klass, sizeof (MetaBackgroundActorPrivate));
|
||||
|
||||
object_class->dispose = meta_background_actor_dispose;
|
||||
object_class->get_property = meta_background_actor_get_property;
|
||||
object_class->set_property = meta_background_actor_set_property;
|
||||
|
||||
actor_class->get_preferred_width = meta_background_actor_get_preferred_width;
|
||||
actor_class->get_preferred_height = meta_background_actor_get_preferred_height;
|
||||
actor_class->paint = meta_background_actor_paint;
|
||||
actor_class->get_paint_volume = meta_background_actor_get_paint_volume;
|
||||
|
||||
/**
|
||||
* MetaBackgroundActor:dim-factor:
|
||||
*
|
||||
* Factor to dim the background by, between 0.0 (black) and 1.0 (original
|
||||
* colors)
|
||||
*/
|
||||
pspec = g_param_spec_float ("dim-factor",
|
||||
"Dim factor",
|
||||
"Factor to dim the background by",
|
||||
0.0, 1.0,
|
||||
1.0,
|
||||
G_PARAM_READWRITE);
|
||||
obj_props[PROP_DIM_FACTOR] = pspec;
|
||||
g_object_class_install_property (object_class, PROP_DIM_FACTOR, pspec);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_background_actor_init (MetaBackgroundActor *self)
|
||||
{
|
||||
MetaBackgroundActorPrivate *priv;
|
||||
|
||||
priv = self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
|
||||
META_TYPE_BACKGROUND_ACTOR,
|
||||
MetaBackgroundActorPrivate);
|
||||
priv->dim_factor = 1.0;
|
||||
self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
|
||||
META_TYPE_BACKGROUND_ACTOR,
|
||||
MetaBackgroundActorPrivate);
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_background_actor_new:
|
||||
* @screen: the #MetaScreen
|
||||
*
|
||||
* Creates a new actor to draw the background for the given screen.
|
||||
* Creates a new actor to draw the background for the given monitor.
|
||||
* This actor should be associated with a #MetaBackground using
|
||||
* clutter_actor_set_content()
|
||||
*
|
||||
* Return value: the newly created background actor
|
||||
*/
|
||||
ClutterActor *
|
||||
meta_background_actor_new_for_screen (MetaScreen *screen)
|
||||
meta_background_actor_new (void)
|
||||
{
|
||||
MetaBackgroundActor *self;
|
||||
MetaBackgroundActorPrivate *priv;
|
||||
|
||||
g_return_val_if_fail (META_IS_SCREEN (screen), NULL);
|
||||
|
||||
self = g_object_new (META_TYPE_BACKGROUND_ACTOR, NULL);
|
||||
priv = self->priv;
|
||||
|
||||
priv->background = meta_screen_background_get (screen);
|
||||
priv->background->actors = g_slist_prepend (priv->background->actors, self);
|
||||
|
||||
/* A CoglMaterial and a CoglPipeline are the same thing */
|
||||
priv->pipeline = (CoglPipeline*) meta_create_texture_material (NULL);
|
||||
|
||||
set_texture_on_actor (self);
|
||||
update_wrap_mode_of_actor (self);
|
||||
|
||||
return CLUTTER_ACTOR (self);
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_background_actor_update:
|
||||
* @screen: a #MetaScreen
|
||||
*
|
||||
* Refetches the _XROOTPMAP_ID property for the root window and updates
|
||||
* the contents of the background actor based on that. There's no attempt
|
||||
* to optimize out pixmap values that don't change (since a root pixmap
|
||||
* could be replaced by with another pixmap with the same ID under some
|
||||
* circumstances), so this should only be called when we actually receive
|
||||
* a PropertyNotify event for the property.
|
||||
*/
|
||||
void
|
||||
meta_background_actor_update (MetaScreen *screen)
|
||||
{
|
||||
MetaScreenBackground *background;
|
||||
MetaDisplay *display;
|
||||
MetaCompositor *compositor;
|
||||
Atom type;
|
||||
int format;
|
||||
gulong nitems;
|
||||
gulong bytes_after;
|
||||
guchar *data;
|
||||
Pixmap root_pixmap_id;
|
||||
|
||||
background = meta_screen_background_get (screen);
|
||||
display = meta_screen_get_display (screen);
|
||||
compositor = meta_display_get_compositor (display);
|
||||
|
||||
root_pixmap_id = None;
|
||||
if (!XGetWindowProperty (meta_display_get_xdisplay (display),
|
||||
meta_screen_get_xroot (screen),
|
||||
compositor->atom_x_root_pixmap,
|
||||
0, LONG_MAX,
|
||||
False,
|
||||
AnyPropertyType,
|
||||
&type, &format, &nitems, &bytes_after, &data) &&
|
||||
type != None)
|
||||
{
|
||||
/* Got a property. */
|
||||
if (type == XA_PIXMAP && format == 32 && nitems == 1)
|
||||
{
|
||||
/* Was what we expected. */
|
||||
root_pixmap_id = *(Pixmap *)data;
|
||||
}
|
||||
|
||||
XFree(data);
|
||||
}
|
||||
|
||||
if (root_pixmap_id != None)
|
||||
{
|
||||
CoglHandle texture;
|
||||
CoglContext *ctx = clutter_backend_get_cogl_context (clutter_get_default_backend ());
|
||||
GError *error = NULL;
|
||||
|
||||
meta_error_trap_push (display);
|
||||
texture = cogl_texture_pixmap_x11_new (ctx, root_pixmap_id, FALSE, &error);
|
||||
meta_error_trap_pop (display);
|
||||
|
||||
if (texture != COGL_INVALID_HANDLE)
|
||||
{
|
||||
set_texture (background, texture);
|
||||
cogl_handle_unref (texture);
|
||||
|
||||
background->have_pixmap = True;
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
g_warning ("Failed to create background texture from pixmap: %s",
|
||||
error->message);
|
||||
g_error_free (error);
|
||||
}
|
||||
}
|
||||
|
||||
background->have_pixmap = False;
|
||||
set_texture_to_stage_color (background);
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_background_actor_set_visible_region:
|
||||
* @self: a #MetaBackgroundActor
|
||||
@ -586,120 +185,44 @@ meta_background_actor_set_visible_region (MetaBackgroundActor *self,
|
||||
|
||||
priv = self->priv;
|
||||
|
||||
if (priv->visible_region)
|
||||
{
|
||||
cairo_region_destroy (priv->visible_region);
|
||||
priv->visible_region = NULL;
|
||||
}
|
||||
g_clear_pointer (&priv->visible_region,
|
||||
(GDestroyNotify)
|
||||
cairo_region_destroy);
|
||||
|
||||
if (visible_region)
|
||||
{
|
||||
cairo_rectangle_int_t screen_rect = { 0 };
|
||||
meta_screen_get_size (priv->background->screen, &screen_rect.width, &screen_rect.height);
|
||||
|
||||
/* Doing the intersection here is probably unnecessary - MetaWindowGroup
|
||||
* should never compute a visible area that's larger than the root screen!
|
||||
* but it's not that expensive and adds some extra robustness.
|
||||
*/
|
||||
priv->visible_region = cairo_region_create_rectangle (&screen_rect);
|
||||
cairo_region_intersect (priv->visible_region, visible_region);
|
||||
}
|
||||
priv->visible_region = cairo_region_copy (visible_region);
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_background_actor_screen_size_changed:
|
||||
* @screen: a #MetaScreen
|
||||
* meta_background_actor_get_visible_region:
|
||||
* @self: a #MetaBackgroundActor
|
||||
*
|
||||
* Called by the compositor when the size of the #MetaScreen changes
|
||||
* Return value (transfer full): a #cairo_region_t that represents the part of
|
||||
* the background not obscured by other #MetaBackgroundActor or
|
||||
* #MetaWindowActor objects.
|
||||
*/
|
||||
void
|
||||
meta_background_actor_screen_size_changed (MetaScreen *screen)
|
||||
cairo_region_t *
|
||||
meta_background_actor_get_visible_region (MetaBackgroundActor *self)
|
||||
{
|
||||
MetaScreenBackground *background = meta_screen_background_get (screen);
|
||||
GSList *l;
|
||||
MetaBackgroundActorPrivate *priv = self->priv;
|
||||
ClutterActorBox content_box;
|
||||
cairo_rectangle_int_t content_area = { 0 };
|
||||
cairo_region_t *visible_region;
|
||||
|
||||
update_wrap_mode (background);
|
||||
g_return_val_if_fail (META_IS_BACKGROUND_ACTOR (self), NULL);
|
||||
|
||||
for (l = background->actors; l; l = l->next)
|
||||
clutter_actor_queue_relayout (l->data);
|
||||
if (!priv->visible_region)
|
||||
return NULL;
|
||||
|
||||
clutter_actor_get_content_box (CLUTTER_ACTOR (self), &content_box);
|
||||
|
||||
content_area.x = content_box.x1;
|
||||
content_area.y = content_box.y1;
|
||||
content_area.width = content_box.x2 - content_box.x1;
|
||||
content_area.height = content_box.y2 - content_box.y1;
|
||||
|
||||
visible_region = cairo_region_create_rectangle (&content_area);
|
||||
cairo_region_intersect (visible_region, priv->visible_region);
|
||||
|
||||
return visible_region;
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_background_actor_add_glsl_snippet:
|
||||
* @actor: a #MetaBackgroundActor
|
||||
* @hook: where to insert the code
|
||||
* @declarations: GLSL declarations
|
||||
* @code: GLSL code
|
||||
* @is_replace: wheter Cogl code should be replaced by the custom shader
|
||||
*
|
||||
* Adds a GLSL snippet to the pipeline used for drawing the background.
|
||||
* See #CoglSnippet for details.
|
||||
*/
|
||||
void
|
||||
meta_background_actor_add_glsl_snippet (MetaBackgroundActor *actor,
|
||||
MetaSnippetHook hook,
|
||||
const char *declarations,
|
||||
const char *code,
|
||||
gboolean is_replace)
|
||||
{
|
||||
MetaBackgroundActorPrivate *priv;
|
||||
CoglSnippet *snippet;
|
||||
|
||||
g_return_if_fail (META_IS_BACKGROUND_ACTOR (actor));
|
||||
|
||||
priv = actor->priv;
|
||||
|
||||
if (is_replace)
|
||||
{
|
||||
snippet = cogl_snippet_new (hook, declarations, NULL);
|
||||
cogl_snippet_set_replace (snippet, code);
|
||||
}
|
||||
else
|
||||
{
|
||||
snippet = cogl_snippet_new (hook, declarations, code);
|
||||
}
|
||||
|
||||
if (hook == META_SNIPPET_HOOK_VERTEX ||
|
||||
hook == META_SNIPPET_HOOK_FRAGMENT)
|
||||
cogl_pipeline_add_snippet (priv->pipeline, snippet);
|
||||
else
|
||||
cogl_pipeline_add_layer_snippet (priv->pipeline, 0, snippet);
|
||||
|
||||
cogl_object_unref (snippet);
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_background_actor_set_uniform_float:
|
||||
* @actor: a #MetaBackgroundActor
|
||||
* @uniform_name:
|
||||
* @n_components: number of components (for vector uniforms)
|
||||
* @count: number of uniforms (for array uniforms)
|
||||
* @uniform: (array length=uniform_length): the float values to set
|
||||
* @uniform_length: the length of @uniform. Must be exactly @n_components x @count,
|
||||
* and is provided mainly for language bindings.
|
||||
*
|
||||
* Sets a new GLSL uniform to the provided value. This is mostly
|
||||
* useful in congiunction with meta_background_actor_add_glsl_snippet().
|
||||
*/
|
||||
|
||||
void
|
||||
meta_background_actor_set_uniform_float (MetaBackgroundActor *actor,
|
||||
const char *uniform_name,
|
||||
int n_components,
|
||||
int count,
|
||||
const float *uniform,
|
||||
int uniform_length)
|
||||
{
|
||||
MetaBackgroundActorPrivate *priv;
|
||||
|
||||
g_return_if_fail (META_IS_BACKGROUND_ACTOR (actor));
|
||||
g_return_if_fail (uniform_length == n_components * count);
|
||||
|
||||
priv = actor->priv;
|
||||
|
||||
cogl_pipeline_set_uniform_float (priv->pipeline,
|
||||
cogl_pipeline_get_uniform_location (priv->pipeline,
|
||||
uniform_name),
|
||||
n_components, count, uniform);
|
||||
}
|
||||
|
||||
|
11
src/compositor/meta-background-group-private.h
Normal file
11
src/compositor/meta-background-group-private.h
Normal file
@ -0,0 +1,11 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
#ifndef META_BACKGROUND_GROUP_PRIVATE_H
|
||||
#define META_BACKGROUND_GROUP_PRIVATE_H
|
||||
|
||||
#include <meta/screen.h>
|
||||
#include <meta/meta-background-group.h>
|
||||
|
||||
void meta_background_group_set_visible_region (MetaBackgroundGroup *self,
|
||||
cairo_region_t *visible_region);
|
||||
#endif /* META_BACKGROUND_GROUP_PRIVATE_H */
|
108
src/compositor/meta-background-group.c
Normal file
108
src/compositor/meta-background-group.c
Normal file
@ -0,0 +1,108 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/**
|
||||
* SECTION:meta-background-group
|
||||
* @title: MetaBackgroundGroup
|
||||
* @short_description: Container for background actors
|
||||
*
|
||||
* This class is a subclass of ClutterActor with special handling for
|
||||
* MetaBackgroundActor/MetaBackgroundGroup when painting children.
|
||||
* It makes sure to only draw the parts of the backgrounds not
|
||||
* occluded by opaque windows.
|
||||
*
|
||||
* See #MetaWindowGroup for more information behind the motivation,
|
||||
* and details on implementation.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#include "compositor-private.h"
|
||||
#include "clutter-utils.h"
|
||||
#include "meta-background-actor-private.h"
|
||||
#include "meta-background-group-private.h"
|
||||
|
||||
G_DEFINE_TYPE (MetaBackgroundGroup, meta_background_group, CLUTTER_TYPE_ACTOR);
|
||||
|
||||
struct _MetaBackgroundGroupPrivate
|
||||
{
|
||||
gpointer dummy;
|
||||
};
|
||||
|
||||
static void
|
||||
meta_background_group_dispose (GObject *object)
|
||||
{
|
||||
G_OBJECT_CLASS (meta_background_group_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
meta_background_group_get_paint_volume (ClutterActor *actor,
|
||||
ClutterPaintVolume *volume)
|
||||
{
|
||||
return clutter_paint_volume_set_from_allocation (volume, actor);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_background_group_class_init (MetaBackgroundGroupClass *klass)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass);
|
||||
|
||||
actor_class->get_paint_volume = meta_background_group_get_paint_volume;
|
||||
object_class->dispose = meta_background_group_dispose;
|
||||
|
||||
g_type_class_add_private (klass, sizeof (MetaBackgroundGroupPrivate));
|
||||
}
|
||||
|
||||
static void
|
||||
meta_background_group_init (MetaBackgroundGroup *self)
|
||||
{
|
||||
self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
|
||||
META_TYPE_BACKGROUND_GROUP,
|
||||
MetaBackgroundGroupPrivate);
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_background_group_set_visible_region:
|
||||
* @self: a #MetaBackgroundGroup
|
||||
* @visible_region: (allow-none): the parts of the background to paint
|
||||
*
|
||||
* Sets the area of the backgrounds that is unobscured by overlapping windows.
|
||||
* This is used to optimize and only paint the visible portions.
|
||||
*/
|
||||
void
|
||||
meta_background_group_set_visible_region (MetaBackgroundGroup *self,
|
||||
cairo_region_t *region)
|
||||
{
|
||||
ClutterActorIter iter;
|
||||
ClutterActor *actor;
|
||||
|
||||
clutter_actor_iter_init (&iter, CLUTTER_ACTOR (self));
|
||||
while (clutter_actor_iter_next (&iter, &actor))
|
||||
{
|
||||
if (META_IS_BACKGROUND_ACTOR (actor))
|
||||
{
|
||||
meta_background_actor_set_visible_region (META_BACKGROUND_ACTOR (actor), region);
|
||||
}
|
||||
else if (META_IS_BACKGROUND_GROUP (actor))
|
||||
{
|
||||
int x, y;
|
||||
|
||||
if (!meta_actor_is_untransformed (actor, &x, &y))
|
||||
continue;
|
||||
|
||||
cairo_region_translate (region, -x, -y);
|
||||
meta_background_group_set_visible_region (META_BACKGROUND_GROUP (actor), region);
|
||||
cairo_region_translate (region, x, y);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ClutterActor *
|
||||
meta_background_group_new (void)
|
||||
{
|
||||
MetaBackgroundGroup *background_group;
|
||||
|
||||
background_group = g_object_new (META_TYPE_BACKGROUND_GROUP, NULL);
|
||||
|
||||
return CLUTTER_ACTOR (background_group);
|
||||
}
|
1282
src/compositor/meta-background.c
Normal file
1282
src/compositor/meta-background.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -85,12 +85,20 @@ meta_plugin_manager_load (const gchar *plugin_name)
|
||||
g_free (path);
|
||||
}
|
||||
|
||||
static void
|
||||
on_confirm_display_change (MetaMonitorManager *monitors,
|
||||
MetaPluginManager *plugin_mgr)
|
||||
{
|
||||
meta_plugin_manager_confirm_display_change (plugin_mgr);
|
||||
}
|
||||
|
||||
MetaPluginManager *
|
||||
meta_plugin_manager_new (MetaScreen *screen)
|
||||
{
|
||||
MetaPluginManager *plugin_mgr;
|
||||
MetaPluginClass *klass;
|
||||
MetaPlugin *plugin;
|
||||
MetaMonitorManager *monitors;
|
||||
|
||||
plugin_mgr = g_new0 (MetaPluginManager, 1);
|
||||
plugin_mgr->screen = screen;
|
||||
@ -101,6 +109,10 @@ meta_plugin_manager_new (MetaScreen *screen)
|
||||
if (klass->start)
|
||||
klass->start (plugin);
|
||||
|
||||
monitors = meta_monitor_manager_get ();
|
||||
g_signal_connect (monitors, "confirm-display-change",
|
||||
G_CALLBACK (on_confirm_display_change), plugin_mgr);
|
||||
|
||||
return plugin_mgr;
|
||||
}
|
||||
|
||||
@ -309,9 +321,6 @@ meta_plugin_manager_xevent_filter (MetaPluginManager *plugin_mgr,
|
||||
MetaPlugin *plugin = plugin_mgr->plugin;
|
||||
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin);
|
||||
|
||||
if (!plugin_mgr)
|
||||
return FALSE;
|
||||
|
||||
/* 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
|
||||
@ -323,3 +332,15 @@ meta_plugin_manager_xevent_filter (MetaPluginManager *plugin_mgr,
|
||||
else
|
||||
return clutter_x11_handle_event (xev) != CLUTTER_X11_FILTER_CONTINUE;
|
||||
}
|
||||
|
||||
void
|
||||
meta_plugin_manager_confirm_display_change (MetaPluginManager *plugin_mgr)
|
||||
{
|
||||
MetaPlugin *plugin = plugin_mgr->plugin;
|
||||
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin);
|
||||
|
||||
if (klass->confirm_display_change)
|
||||
return klass->confirm_display_change (plugin);
|
||||
else
|
||||
return meta_plugin_complete_display_change (plugin, TRUE);
|
||||
}
|
||||
|
@ -73,4 +73,6 @@ gboolean meta_plugin_manager_filter_keybinding (MetaPluginManager *mgr,
|
||||
gboolean meta_plugin_manager_xevent_filter (MetaPluginManager *mgr,
|
||||
XEvent *xev);
|
||||
|
||||
void meta_plugin_manager_confirm_display_change (MetaPluginManager *mgr);
|
||||
|
||||
#endif
|
||||
|
@ -21,6 +21,13 @@
|
||||
* 02111-1307, USA.
|
||||
*/
|
||||
|
||||
/**
|
||||
* SECTION:meta-plugin
|
||||
* @title: MetaPlugin
|
||||
* @short_description: Entry point for plugins
|
||||
*
|
||||
*/
|
||||
|
||||
#include <meta/meta-plugin.h>
|
||||
#include "meta-plugin-manager.h"
|
||||
#include <meta/screen.h>
|
||||
@ -34,6 +41,7 @@
|
||||
|
||||
#include "compositor-private.h"
|
||||
#include "meta-window-actor-private.h"
|
||||
#include "monitor-private.h"
|
||||
|
||||
G_DEFINE_ABSTRACT_TYPE (MetaPlugin, meta_plugin, G_TYPE_OBJECT);
|
||||
|
||||
@ -331,3 +339,13 @@ meta_plugin_get_screen (MetaPlugin *plugin)
|
||||
|
||||
return priv->screen;
|
||||
}
|
||||
|
||||
void
|
||||
meta_plugin_complete_display_change (MetaPlugin *plugin,
|
||||
gboolean ok)
|
||||
{
|
||||
MetaMonitorManager *manager;
|
||||
|
||||
manager = meta_monitor_manager_get ();
|
||||
meta_monitor_manager_confirm_configuration (manager, ok);
|
||||
}
|
||||
|
@ -40,7 +40,7 @@ typedef struct _MetaShadow MetaShadow;
|
||||
|
||||
MetaShadow *meta_shadow_ref (MetaShadow *shadow);
|
||||
void meta_shadow_unref (MetaShadow *shadow);
|
||||
CoglHandle meta_shadow_get_texture (MetaShadow *shadow);
|
||||
CoglTexture*meta_shadow_get_texture (MetaShadow *shadow);
|
||||
void meta_shadow_paint (MetaShadow *shadow,
|
||||
int window_x,
|
||||
int window_y,
|
||||
|
@ -1,9 +1,5 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
/*
|
||||
* MetaShadowFactory:
|
||||
*
|
||||
* Create and cache shadow textures for abritrary window shapes
|
||||
*
|
||||
* Copyright 2010 Red Hat, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
@ -21,6 +17,13 @@
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
* 02111-1307, USA.
|
||||
*/
|
||||
|
||||
/**
|
||||
* SECTION:meta-shadow-factory
|
||||
* @title: MetaShadowFactory
|
||||
* @short_description: Create and cache shadow textures for abritrary window shapes
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <math.h>
|
||||
#include <string.h>
|
||||
@ -65,8 +68,8 @@ struct _MetaShadow
|
||||
|
||||
MetaShadowFactory *factory;
|
||||
MetaShadowCacheKey key;
|
||||
CoglHandle texture;
|
||||
CoglHandle material;
|
||||
CoglTexture *texture;
|
||||
CoglPipeline *pipeline;
|
||||
|
||||
/* The outer order is the distance the shadow extends outside the window
|
||||
* shape; the inner border is the unscaled portion inside the window
|
||||
@ -120,12 +123,12 @@ static guint signals[LAST_SIGNAL] = { 0 };
|
||||
/* The first element in this array also defines the default parameters
|
||||
* for newly created classes */
|
||||
MetaShadowClassInfo default_shadow_classes[] = {
|
||||
{ "normal", { 6, -1, 0, 3, 255 }, { 3, -1, 0, 3, 128 } },
|
||||
{ "dialog", { 6, -1, 0, 3, 255 }, { 3, -1, 0, 3, 128 } },
|
||||
{ "modal_dialog", { 6, -1, 0, 1, 255 }, { 3, -1, 0, 3, 128 } },
|
||||
{ "utility", { 3, -1, 0, 1, 255 }, { 3, -1, 0, 1, 128 } },
|
||||
{ "border", { 6, -1, 0, 3, 255 }, { 3, -1, 0, 3, 128 } },
|
||||
{ "menu", { 6, -1, 0, 3, 255 }, { 3, -1, 0, 0, 128 } },
|
||||
{ "normal", { 6, -1, 0, 3, 128 }, { 3, -1, 0, 3, 32 } },
|
||||
{ "dialog", { 6, -1, 0, 3, 128 }, { 3, -1, 0, 3, 32 } },
|
||||
{ "modal_dialog", { 6, -1, 0, 1, 128 }, { 3, -1, 0, 3, 32 } },
|
||||
{ "utility", { 3, -1, 0, 1, 128 }, { 3, -1, 0, 1, 32 } },
|
||||
{ "border", { 6, -1, 0, 3, 128 }, { 3, -1, 0, 3, 32 } },
|
||||
{ "menu", { 6, -1, 0, 3, 128 }, { 3, -1, 0, 0, 32 } },
|
||||
|
||||
{ "popup-menu", { 1, -1, 0, 1, 128 }, { 1, -1, 0, 1, 128 } },
|
||||
|
||||
@ -175,8 +178,8 @@ meta_shadow_unref (MetaShadow *shadow)
|
||||
}
|
||||
|
||||
meta_window_shape_unref (shadow->key.shape);
|
||||
cogl_handle_unref (shadow->texture);
|
||||
cogl_handle_unref (shadow->material);
|
||||
cogl_object_unref (shadow->texture);
|
||||
cogl_object_unref (shadow->pipeline);
|
||||
|
||||
g_slice_free (MetaShadow, shadow);
|
||||
}
|
||||
@ -218,10 +221,10 @@ meta_shadow_paint (MetaShadow *shadow,
|
||||
int dest_y[4];
|
||||
int n_x, n_y;
|
||||
|
||||
cogl_material_set_color4ub (shadow->material,
|
||||
cogl_pipeline_set_color4ub (shadow->pipeline,
|
||||
opacity, opacity, opacity, opacity);
|
||||
|
||||
cogl_set_source (shadow->material);
|
||||
cogl_set_source (shadow->pipeline);
|
||||
|
||||
if (shadow->scale_width)
|
||||
{
|
||||
@ -801,7 +804,7 @@ make_shadow (MetaShadow *shadow,
|
||||
cairo_region_destroy (column_convolve_region);
|
||||
g_free (buffer);
|
||||
|
||||
shadow->material = meta_create_texture_material (shadow->texture);
|
||||
shadow->pipeline = meta_create_texture_pipeline (shadow->texture);
|
||||
}
|
||||
|
||||
static MetaShadowParams *
|
||||
|
@ -1,8 +1,4 @@
|
||||
/*
|
||||
* shaped texture
|
||||
*
|
||||
* An actor to draw a masked texture.
|
||||
*
|
||||
* Authored By Neil Roberts <neil@linux.intel.com>
|
||||
* and Jasper St. Pierre <jstpierre@mecheye.net>
|
||||
*
|
||||
@ -25,10 +21,13 @@
|
||||
* 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
/**
|
||||
* SECTION:meta-shaped-texture
|
||||
* @title: MetaShapedTexture
|
||||
* @short_description: An actor to draw a masked texture.
|
||||
*/
|
||||
|
||||
#define CLUTTER_ENABLE_EXPERIMENTAL_API
|
||||
#define COGL_ENABLE_EXPERIMENTAL_API
|
||||
#include <config.h>
|
||||
|
||||
#include <meta/meta-shaped-texture.h>
|
||||
#include "meta-texture-tower.h"
|
||||
@ -67,10 +66,10 @@ struct _MetaShapedTexturePrivate
|
||||
{
|
||||
MetaTextureTower *paint_tower;
|
||||
Pixmap pixmap;
|
||||
CoglHandle texture;
|
||||
CoglHandle mask_texture;
|
||||
CoglHandle material;
|
||||
CoglHandle material_unshaped;
|
||||
CoglTexturePixmapX11 *texture;
|
||||
CoglTexture *mask_texture;
|
||||
CoglPipeline *pipeline;
|
||||
CoglPipeline *pipeline_unshaped;
|
||||
|
||||
cairo_region_t *clip_region;
|
||||
|
||||
@ -104,8 +103,8 @@ meta_shaped_texture_init (MetaShapedTexture *self)
|
||||
priv = self->priv = META_SHAPED_TEXTURE_GET_PRIVATE (self);
|
||||
|
||||
priv->paint_tower = meta_texture_tower_new ();
|
||||
priv->texture = COGL_INVALID_HANDLE;
|
||||
priv->mask_texture = COGL_INVALID_HANDLE;
|
||||
priv->texture = NULL;
|
||||
priv->mask_texture = NULL;
|
||||
priv->create_mipmaps = TRUE;
|
||||
}
|
||||
|
||||
@ -119,23 +118,11 @@ meta_shaped_texture_dispose (GObject *object)
|
||||
meta_texture_tower_free (priv->paint_tower);
|
||||
priv->paint_tower = NULL;
|
||||
|
||||
if (priv->material != COGL_INVALID_HANDLE)
|
||||
{
|
||||
cogl_handle_unref (priv->material);
|
||||
priv->material = COGL_INVALID_HANDLE;
|
||||
}
|
||||
if (priv->material_unshaped != COGL_INVALID_HANDLE)
|
||||
{
|
||||
cogl_handle_unref (priv->material_unshaped);
|
||||
priv->material_unshaped = COGL_INVALID_HANDLE;
|
||||
}
|
||||
if (priv->texture != COGL_INVALID_HANDLE)
|
||||
{
|
||||
cogl_handle_unref (priv->texture);
|
||||
priv->texture = COGL_INVALID_HANDLE;
|
||||
}
|
||||
g_clear_pointer (&priv->pipeline, cogl_object_unref);
|
||||
g_clear_pointer (&priv->pipeline_unshaped, cogl_object_unref);
|
||||
g_clear_pointer (&priv->texture, cogl_object_unref);
|
||||
|
||||
meta_shaped_texture_set_mask_texture (self, COGL_INVALID_HANDLE);
|
||||
meta_shaped_texture_set_mask_texture (self, NULL);
|
||||
meta_shaped_texture_set_clip_region (self, NULL);
|
||||
|
||||
G_OBJECT_CLASS (meta_shaped_texture_parent_class)->dispose (object);
|
||||
@ -146,14 +133,14 @@ meta_shaped_texture_paint (ClutterActor *actor)
|
||||
{
|
||||
MetaShapedTexture *stex = (MetaShapedTexture *) actor;
|
||||
MetaShapedTexturePrivate *priv = stex->priv;
|
||||
CoglHandle paint_tex;
|
||||
CoglTexture *paint_tex;
|
||||
guint tex_width, tex_height;
|
||||
ClutterActorBox alloc;
|
||||
|
||||
static CoglHandle material_template = COGL_INVALID_HANDLE;
|
||||
static CoglHandle material_unshaped_template = COGL_INVALID_HANDLE;
|
||||
static CoglPipeline *pipeline_template = NULL;
|
||||
static CoglPipeline *pipeline_unshaped_template = NULL;
|
||||
|
||||
CoglHandle material;
|
||||
CoglPipeline *pipeline;
|
||||
|
||||
if (priv->clip_region && cairo_region_is_empty (priv->clip_region))
|
||||
return;
|
||||
@ -179,9 +166,9 @@ meta_shaped_texture_paint (ClutterActor *actor)
|
||||
if (priv->create_mipmaps)
|
||||
paint_tex = meta_texture_tower_get_paint_texture (priv->paint_tower);
|
||||
else
|
||||
paint_tex = priv->texture;
|
||||
paint_tex = COGL_TEXTURE (priv->texture);
|
||||
|
||||
if (paint_tex == COGL_INVALID_HANDLE)
|
||||
if (paint_tex == NULL)
|
||||
return;
|
||||
|
||||
tex_width = priv->tex_width;
|
||||
@ -190,47 +177,51 @@ meta_shaped_texture_paint (ClutterActor *actor)
|
||||
if (tex_width == 0 || tex_height == 0) /* no contents yet */
|
||||
return;
|
||||
|
||||
if (priv->mask_texture == COGL_INVALID_HANDLE)
|
||||
if (priv->mask_texture == NULL)
|
||||
{
|
||||
/* Use a single-layer texture if we don't have a mask. */
|
||||
|
||||
if (priv->material_unshaped == COGL_INVALID_HANDLE)
|
||||
if (priv->pipeline_unshaped == NULL)
|
||||
{
|
||||
if (G_UNLIKELY (material_unshaped_template == COGL_INVALID_HANDLE))
|
||||
material_unshaped_template = cogl_material_new ();
|
||||
if (G_UNLIKELY (pipeline_unshaped_template == NULL))
|
||||
{
|
||||
CoglContext *ctx = clutter_backend_get_cogl_context (clutter_get_default_backend ());
|
||||
pipeline_unshaped_template = cogl_pipeline_new (ctx);
|
||||
}
|
||||
|
||||
priv->material_unshaped = cogl_material_copy (material_unshaped_template);
|
||||
priv->pipeline_unshaped = cogl_pipeline_copy (pipeline_unshaped_template);
|
||||
}
|
||||
material = priv->material_unshaped;
|
||||
pipeline = priv->pipeline_unshaped;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (priv->material == COGL_INVALID_HANDLE)
|
||||
if (priv->pipeline == NULL)
|
||||
{
|
||||
if (G_UNLIKELY (material_template == COGL_INVALID_HANDLE))
|
||||
if (G_UNLIKELY (pipeline_template == NULL))
|
||||
{
|
||||
material_template = cogl_material_new ();
|
||||
cogl_material_set_layer_combine (material_template, 1,
|
||||
CoglContext *ctx = clutter_backend_get_cogl_context (clutter_get_default_backend ());
|
||||
pipeline_template = cogl_pipeline_new (ctx);
|
||||
cogl_pipeline_set_layer_combine (pipeline_template, 1,
|
||||
"RGBA = MODULATE (PREVIOUS, TEXTURE[A])",
|
||||
NULL);
|
||||
}
|
||||
priv->material = cogl_material_copy (material_template);
|
||||
priv->pipeline = cogl_pipeline_copy (pipeline_template);
|
||||
}
|
||||
material = priv->material;
|
||||
pipeline = priv->pipeline;
|
||||
|
||||
cogl_material_set_layer (material, 1, priv->mask_texture);
|
||||
cogl_pipeline_set_layer_texture (pipeline, 1, priv->mask_texture);
|
||||
}
|
||||
|
||||
cogl_material_set_layer (material, 0, paint_tex);
|
||||
cogl_pipeline_set_layer_texture (pipeline, 0, paint_tex);
|
||||
|
||||
{
|
||||
CoglColor color;
|
||||
guchar opacity = clutter_actor_get_paint_opacity (actor);
|
||||
cogl_color_set_from_4ub (&color, opacity, opacity, opacity, opacity);
|
||||
cogl_material_set_color (material, &color);
|
||||
cogl_pipeline_set_color (pipeline, &color);
|
||||
}
|
||||
|
||||
cogl_set_source (material);
|
||||
cogl_set_source (pipeline);
|
||||
|
||||
clutter_actor_get_allocation_box (actor, &alloc);
|
||||
|
||||
@ -295,18 +286,18 @@ meta_shaped_texture_pick (ClutterActor *actor,
|
||||
MetaShapedTexturePrivate *priv = stex->priv;
|
||||
|
||||
/* If there is no region then use the regular pick */
|
||||
if (priv->mask_texture == COGL_INVALID_HANDLE)
|
||||
if (priv->mask_texture == NULL)
|
||||
CLUTTER_ACTOR_CLASS (meta_shaped_texture_parent_class)
|
||||
->pick (actor, color);
|
||||
else if (clutter_actor_should_pick_paint (actor))
|
||||
{
|
||||
CoglHandle paint_tex;
|
||||
CoglTexture *paint_tex;
|
||||
ClutterActorBox alloc;
|
||||
guint tex_width, tex_height;
|
||||
|
||||
paint_tex = priv->texture;
|
||||
paint_tex = COGL_TEXTURE (priv->texture);
|
||||
|
||||
if (paint_tex == COGL_INVALID_HANDLE)
|
||||
if (paint_tex == NULL)
|
||||
return;
|
||||
|
||||
tex_width = cogl_texture_get_width (paint_tex);
|
||||
@ -396,17 +387,17 @@ meta_shaped_texture_set_create_mipmaps (MetaShapedTexture *stex,
|
||||
|
||||
if (create_mipmaps != priv->create_mipmaps)
|
||||
{
|
||||
CoglHandle base_texture;
|
||||
CoglTexture *base_texture;
|
||||
priv->create_mipmaps = create_mipmaps;
|
||||
base_texture = create_mipmaps ?
|
||||
priv->texture : COGL_INVALID_HANDLE;
|
||||
COGL_TEXTURE (priv->texture) : NULL;
|
||||
meta_texture_tower_set_base_texture (priv->paint_tower, base_texture);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
meta_shaped_texture_set_mask_texture (MetaShapedTexture *stex,
|
||||
CoglHandle mask_texture)
|
||||
CoglTexture *mask_texture)
|
||||
{
|
||||
MetaShapedTexturePrivate *priv;
|
||||
|
||||
@ -414,16 +405,12 @@ meta_shaped_texture_set_mask_texture (MetaShapedTexture *stex,
|
||||
|
||||
priv = stex->priv;
|
||||
|
||||
if (priv->mask_texture != COGL_INVALID_HANDLE)
|
||||
{
|
||||
cogl_handle_unref (priv->mask_texture);
|
||||
priv->mask_texture = COGL_INVALID_HANDLE;
|
||||
}
|
||||
g_clear_pointer (&priv->mask_texture, cogl_object_unref);
|
||||
|
||||
if (mask_texture != COGL_INVALID_HANDLE)
|
||||
if (mask_texture != NULL)
|
||||
{
|
||||
priv->mask_texture = mask_texture;
|
||||
cogl_handle_ref (priv->mask_texture);
|
||||
cogl_object_ref (priv->mask_texture);
|
||||
}
|
||||
|
||||
clutter_actor_queue_redraw (CLUTTER_ACTOR (stex));
|
||||
@ -441,10 +428,11 @@ meta_shaped_texture_update_area (MetaShapedTexture *stex,
|
||||
|
||||
priv = stex->priv;
|
||||
|
||||
if (priv->texture == COGL_INVALID_HANDLE)
|
||||
if (priv->texture == NULL)
|
||||
return;
|
||||
|
||||
cogl_texture_pixmap_x11_update_area (priv->texture, x, y, width, height);
|
||||
cogl_texture_pixmap_x11_update_area (priv->texture,
|
||||
x, y, width, height);
|
||||
|
||||
meta_texture_tower_update_area (priv->paint_tower, x, y, width, height);
|
||||
|
||||
@ -452,8 +440,8 @@ meta_shaped_texture_update_area (MetaShapedTexture *stex,
|
||||
}
|
||||
|
||||
static void
|
||||
set_cogl_texture (MetaShapedTexture *stex,
|
||||
CoglHandle cogl_tex)
|
||||
set_cogl_texture (MetaShapedTexture *stex,
|
||||
CoglTexturePixmapX11 *cogl_tex)
|
||||
{
|
||||
MetaShapedTexturePrivate *priv;
|
||||
guint width, height;
|
||||
@ -462,21 +450,21 @@ set_cogl_texture (MetaShapedTexture *stex,
|
||||
|
||||
priv = stex->priv;
|
||||
|
||||
if (priv->texture != COGL_INVALID_HANDLE)
|
||||
cogl_handle_unref (priv->texture);
|
||||
if (priv->texture != NULL)
|
||||
cogl_object_unref (priv->texture);
|
||||
|
||||
priv->texture = cogl_tex;
|
||||
|
||||
if (priv->material != COGL_INVALID_HANDLE)
|
||||
cogl_material_set_layer (priv->material, 0, cogl_tex);
|
||||
if (priv->pipeline != NULL)
|
||||
cogl_pipeline_set_layer_texture (priv->pipeline, 0, COGL_TEXTURE (cogl_tex));
|
||||
|
||||
if (priv->material_unshaped != COGL_INVALID_HANDLE)
|
||||
cogl_material_set_layer (priv->material_unshaped, 0, cogl_tex);
|
||||
if (priv->pipeline_unshaped != NULL)
|
||||
cogl_pipeline_set_layer_texture (priv->pipeline_unshaped, 0, COGL_TEXTURE (cogl_tex));
|
||||
|
||||
if (cogl_tex != COGL_INVALID_HANDLE)
|
||||
if (cogl_tex != NULL)
|
||||
{
|
||||
width = cogl_texture_get_width (cogl_tex);
|
||||
height = cogl_texture_get_height (cogl_tex);
|
||||
width = cogl_texture_get_width (COGL_TEXTURE (cogl_tex));
|
||||
height = cogl_texture_get_height (COGL_TEXTURE (cogl_tex));
|
||||
|
||||
if (width != priv->tex_width ||
|
||||
height != priv->tex_height)
|
||||
@ -489,7 +477,7 @@ set_cogl_texture (MetaShapedTexture *stex,
|
||||
}
|
||||
else
|
||||
{
|
||||
/* size changed to 0 going to an invalid handle */
|
||||
/* size changed to 0 going to an inavlid texture */
|
||||
priv->tex_width = 0;
|
||||
priv->tex_height = 0;
|
||||
clutter_actor_queue_relayout (CLUTTER_ACTOR (stex));
|
||||
@ -525,10 +513,11 @@ meta_shaped_texture_set_pixmap (MetaShapedTexture *stex,
|
||||
set_cogl_texture (stex, cogl_texture_pixmap_x11_new (ctx, pixmap, FALSE, NULL));
|
||||
}
|
||||
else
|
||||
set_cogl_texture (stex, COGL_INVALID_HANDLE);
|
||||
set_cogl_texture (stex, NULL);
|
||||
|
||||
if (priv->create_mipmaps)
|
||||
meta_texture_tower_set_base_texture (priv->paint_tower, priv->texture);
|
||||
meta_texture_tower_set_base_texture (priv->paint_tower,
|
||||
COGL_TEXTURE (priv->texture));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -537,11 +526,11 @@ meta_shaped_texture_set_pixmap (MetaShapedTexture *stex,
|
||||
*
|
||||
* Returns: (transfer none): the unshaped texture
|
||||
*/
|
||||
CoglHandle
|
||||
CoglTexture *
|
||||
meta_shaped_texture_get_texture (MetaShapedTexture *stex)
|
||||
{
|
||||
g_return_val_if_fail (META_IS_SHAPED_TEXTURE (stex), COGL_INVALID_HANDLE);
|
||||
return stex->priv->texture;
|
||||
g_return_val_if_fail (META_IS_SHAPED_TEXTURE (stex), NULL);
|
||||
return COGL_TEXTURE (stex->priv->texture);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -598,13 +587,13 @@ cairo_surface_t *
|
||||
meta_shaped_texture_get_image (MetaShapedTexture *stex,
|
||||
cairo_rectangle_int_t *clip)
|
||||
{
|
||||
CoglHandle texture, mask_texture;
|
||||
CoglTexture *texture, *mask_texture;
|
||||
cairo_rectangle_int_t texture_rect = { 0, 0, 0, 0 };
|
||||
cairo_surface_t *surface;
|
||||
|
||||
g_return_val_if_fail (META_IS_SHAPED_TEXTURE (stex), NULL);
|
||||
|
||||
texture = stex->priv->texture;
|
||||
texture = COGL_TEXTURE (stex->priv->texture);
|
||||
|
||||
if (texture == NULL)
|
||||
return NULL;
|
||||
@ -641,7 +630,7 @@ meta_shaped_texture_get_image (MetaShapedTexture *stex,
|
||||
cogl_object_unref (texture);
|
||||
|
||||
mask_texture = stex->priv->mask_texture;
|
||||
if (mask_texture != COGL_INVALID_HANDLE)
|
||||
if (mask_texture != NULL)
|
||||
{
|
||||
cairo_t *cr;
|
||||
cairo_surface_t *mask_surface;
|
||||
|
@ -25,9 +25,6 @@
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#define CLUTTER_ENABLE_EXPERIMENTAL_API
|
||||
#define COGL_ENABLE_EXPERIMENTAL_API
|
||||
|
||||
#include <clutter/clutter.h>
|
||||
#include "meta-texture-rectangle.h"
|
||||
|
||||
|
@ -59,8 +59,8 @@ typedef struct
|
||||
struct _MetaTextureTower
|
||||
{
|
||||
int n_levels;
|
||||
CoglHandle textures[MAX_TEXTURE_LEVELS];
|
||||
CoglHandle fbos[MAX_TEXTURE_LEVELS];
|
||||
CoglTexture *textures[MAX_TEXTURE_LEVELS];
|
||||
CoglOffscreen *fbos[MAX_TEXTURE_LEVELS];
|
||||
Box invalid[MAX_TEXTURE_LEVELS];
|
||||
};
|
||||
|
||||
@ -93,7 +93,7 @@ meta_texture_tower_free (MetaTextureTower *tower)
|
||||
{
|
||||
g_return_if_fail (tower != NULL);
|
||||
|
||||
meta_texture_tower_set_base_texture (tower, COGL_INVALID_HANDLE);
|
||||
meta_texture_tower_set_base_texture (tower, NULL);
|
||||
|
||||
g_slice_free (MetaTextureTower, tower);
|
||||
}
|
||||
@ -110,7 +110,7 @@ meta_texture_tower_free (MetaTextureTower *tower)
|
||||
*/
|
||||
void
|
||||
meta_texture_tower_set_base_texture (MetaTextureTower *tower,
|
||||
CoglHandle texture)
|
||||
CoglTexture *texture)
|
||||
{
|
||||
int i;
|
||||
|
||||
@ -119,33 +119,33 @@ meta_texture_tower_set_base_texture (MetaTextureTower *tower,
|
||||
if (texture == tower->textures[0])
|
||||
return;
|
||||
|
||||
if (tower->textures[0] != COGL_INVALID_HANDLE)
|
||||
if (tower->textures[0] != NULL)
|
||||
{
|
||||
for (i = 1; i < tower->n_levels; i++)
|
||||
{
|
||||
if (tower->textures[i] != COGL_INVALID_HANDLE)
|
||||
if (tower->textures[i] != NULL)
|
||||
{
|
||||
cogl_handle_unref (tower->textures[i]);
|
||||
tower->textures[i] = COGL_INVALID_HANDLE;
|
||||
cogl_object_unref (tower->textures[i]);
|
||||
tower->textures[i] = NULL;
|
||||
}
|
||||
|
||||
if (tower->fbos[i] != COGL_INVALID_HANDLE)
|
||||
if (tower->fbos[i] != NULL)
|
||||
{
|
||||
cogl_handle_unref (tower->fbos[i]);
|
||||
tower->fbos[i] = COGL_INVALID_HANDLE;
|
||||
cogl_object_unref (tower->fbos[i]);
|
||||
tower->fbos[i] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
cogl_handle_unref (tower->textures[0]);
|
||||
cogl_object_unref (tower->textures[0]);
|
||||
}
|
||||
|
||||
tower->textures[0] = texture;
|
||||
|
||||
if (tower->textures[0] != COGL_INVALID_HANDLE)
|
||||
if (tower->textures[0] != NULL)
|
||||
{
|
||||
int width, height;
|
||||
|
||||
cogl_handle_ref (tower->textures[0]);
|
||||
cogl_object_ref (tower->textures[0]);
|
||||
|
||||
width = cogl_texture_get_width (tower->textures[0]);
|
||||
height = cogl_texture_get_height (tower->textures[0]);
|
||||
@ -186,7 +186,7 @@ meta_texture_tower_update_area (MetaTextureTower *tower,
|
||||
|
||||
g_return_if_fail (tower != NULL);
|
||||
|
||||
if (tower->textures[0] == COGL_INVALID_HANDLE)
|
||||
if (tower->textures[0] == NULL)
|
||||
return;
|
||||
|
||||
texture_width = cogl_texture_get_width (tower->textures[0]);
|
||||
@ -387,22 +387,22 @@ static gboolean
|
||||
texture_tower_revalidate_fbo (MetaTextureTower *tower,
|
||||
int level)
|
||||
{
|
||||
CoglHandle source_texture = tower->textures[level - 1];
|
||||
CoglTexture *source_texture = tower->textures[level - 1];
|
||||
int source_texture_width = cogl_texture_get_width (source_texture);
|
||||
int source_texture_height = cogl_texture_get_height (source_texture);
|
||||
CoglHandle dest_texture = tower->textures[level];
|
||||
CoglTexture *dest_texture = tower->textures[level];
|
||||
int dest_texture_width = cogl_texture_get_width (dest_texture);
|
||||
int dest_texture_height = cogl_texture_get_height (dest_texture);
|
||||
Box *invalid = &tower->invalid[level];
|
||||
CoglMatrix modelview;
|
||||
|
||||
if (tower->fbos[level] == COGL_INVALID_HANDLE)
|
||||
if (tower->fbos[level] == NULL)
|
||||
tower->fbos[level] = cogl_offscreen_new_to_texture (dest_texture);
|
||||
|
||||
if (tower->fbos[level] == COGL_INVALID_HANDLE)
|
||||
if (tower->fbos[level] == NULL)
|
||||
return FALSE;
|
||||
|
||||
cogl_push_framebuffer (tower->fbos[level]);
|
||||
cogl_push_framebuffer (COGL_FRAMEBUFFER (tower->fbos[level]));
|
||||
|
||||
cogl_ortho (0, dest_texture_width, dest_texture_height, 0, -1., 1.);
|
||||
|
||||
@ -460,12 +460,12 @@ static void
|
||||
texture_tower_revalidate_client (MetaTextureTower *tower,
|
||||
int level)
|
||||
{
|
||||
CoglHandle source_texture = tower->textures[level - 1];
|
||||
CoglTexture *source_texture = tower->textures[level - 1];
|
||||
int source_texture_width = cogl_texture_get_width (source_texture);
|
||||
int source_texture_height = cogl_texture_get_height (source_texture);
|
||||
guint source_rowstride;
|
||||
guchar *source_data;
|
||||
CoglHandle dest_texture = tower->textures[level];
|
||||
CoglTexture *dest_texture = tower->textures[level];
|
||||
int dest_texture_width = cogl_texture_get_width (dest_texture);
|
||||
int dest_texture_height = cogl_texture_get_height (dest_texture);
|
||||
int dest_x = tower->invalid[level].x1;
|
||||
@ -575,28 +575,28 @@ texture_tower_revalidate (MetaTextureTower *tower,
|
||||
* rectangle (0, 0, 200, 200).
|
||||
*
|
||||
* Return value: the COGL texture handle to use for painting, or
|
||||
* %COGL_INVALID_HANDLE if no base texture has yet been set.
|
||||
* %NULL if no base texture has yet been set.
|
||||
*/
|
||||
CoglHandle
|
||||
CoglTexture *
|
||||
meta_texture_tower_get_paint_texture (MetaTextureTower *tower)
|
||||
{
|
||||
int texture_width, texture_height;
|
||||
int level;
|
||||
|
||||
g_return_val_if_fail (tower != NULL, COGL_INVALID_HANDLE);
|
||||
g_return_val_if_fail (tower != NULL, NULL);
|
||||
|
||||
if (tower->textures[0] == COGL_INVALID_HANDLE)
|
||||
return COGL_INVALID_HANDLE;
|
||||
if (tower->textures[0] == NULL)
|
||||
return NULL;
|
||||
|
||||
texture_width = cogl_texture_get_width (tower->textures[0]);
|
||||
texture_height = cogl_texture_get_height (tower->textures[0]);
|
||||
|
||||
level = get_paint_level(texture_width, texture_height);
|
||||
if (level < 0) /* singular paint matrix, scaled to nothing */
|
||||
return COGL_INVALID_HANDLE;
|
||||
return NULL;
|
||||
level = MIN (level, tower->n_levels - 1);
|
||||
|
||||
if (tower->textures[level] == COGL_INVALID_HANDLE ||
|
||||
if (tower->textures[level] == NULL ||
|
||||
(tower->invalid[level].x2 != tower->invalid[level].x1 &&
|
||||
tower->invalid[level].y2 != tower->invalid[level].y1))
|
||||
{
|
||||
@ -608,7 +608,7 @@ meta_texture_tower_get_paint_texture (MetaTextureTower *tower)
|
||||
texture_width = MAX (1, texture_width / 2);
|
||||
texture_height = MAX (1, texture_height / 2);
|
||||
|
||||
if (tower->textures[i] == COGL_INVALID_HANDLE)
|
||||
if (tower->textures[i] == NULL)
|
||||
texture_tower_create_texture (tower, i, texture_width, texture_height);
|
||||
}
|
||||
|
||||
|
@ -56,13 +56,13 @@ typedef struct _MetaTextureTower MetaTextureTower;
|
||||
MetaTextureTower *meta_texture_tower_new (void);
|
||||
void meta_texture_tower_free (MetaTextureTower *tower);
|
||||
void meta_texture_tower_set_base_texture (MetaTextureTower *tower,
|
||||
CoglHandle texture);
|
||||
CoglTexture *texture);
|
||||
void meta_texture_tower_update_area (MetaTextureTower *tower,
|
||||
int x,
|
||||
int y,
|
||||
int width,
|
||||
int height);
|
||||
CoglHandle meta_texture_tower_get_paint_texture (MetaTextureTower *tower);
|
||||
CoglTexture *meta_texture_tower_get_paint_texture (MetaTextureTower *tower);
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
|
@ -28,6 +28,10 @@ void meta_window_actor_process_damage (MetaWindowActor *self,
|
||||
XDamageNotifyEvent *event);
|
||||
|
||||
void meta_window_actor_pre_paint (MetaWindowActor *self);
|
||||
void meta_window_actor_post_paint (MetaWindowActor *self);
|
||||
void meta_window_actor_frame_complete (MetaWindowActor *self,
|
||||
CoglFrameInfo *frame_info,
|
||||
gint64 presentation_time);
|
||||
|
||||
void meta_window_actor_invalidate_shadow (MetaWindowActor *self);
|
||||
|
||||
@ -39,12 +43,17 @@ void meta_window_actor_get_shape_bounds (MetaWindowActor *self,
|
||||
cairo_rectangle_int_t *bounds);
|
||||
|
||||
gboolean meta_window_actor_effect_in_progress (MetaWindowActor *self);
|
||||
void meta_window_actor_sync_actor_position (MetaWindowActor *self);
|
||||
void meta_window_actor_sync_actor_geometry (MetaWindowActor *self,
|
||||
gboolean did_placement);
|
||||
void meta_window_actor_sync_visibility (MetaWindowActor *self);
|
||||
void meta_window_actor_update_shape (MetaWindowActor *self);
|
||||
void meta_window_actor_update_opacity (MetaWindowActor *self);
|
||||
void meta_window_actor_mapped (MetaWindowActor *self);
|
||||
void meta_window_actor_unmapped (MetaWindowActor *self);
|
||||
void meta_window_actor_set_updates_frozen (MetaWindowActor *self,
|
||||
gboolean updates_frozen);
|
||||
void meta_window_actor_queue_frame_drawn (MetaWindowActor *self,
|
||||
gboolean no_delay_frame);
|
||||
|
||||
cairo_region_t *meta_window_actor_get_obscured_region (MetaWindowActor *self);
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -7,118 +7,26 @@
|
||||
|
||||
#include <gdk/gdk.h> /* for gdk_rectangle_intersect() */
|
||||
|
||||
#include "clutter-utils.h"
|
||||
#include "compositor-private.h"
|
||||
#include "meta-window-actor-private.h"
|
||||
#include "meta-window-group.h"
|
||||
#include "meta-background-actor-private.h"
|
||||
#include "meta-background-group-private.h"
|
||||
|
||||
struct _MetaWindowGroupClass
|
||||
{
|
||||
ClutterGroupClass parent_class;
|
||||
ClutterActorClass parent_class;
|
||||
};
|
||||
|
||||
struct _MetaWindowGroup
|
||||
{
|
||||
ClutterGroup parent;
|
||||
ClutterActor parent;
|
||||
|
||||
MetaScreen *screen;
|
||||
};
|
||||
|
||||
G_DEFINE_TYPE (MetaWindowGroup, meta_window_group, CLUTTER_TYPE_GROUP);
|
||||
|
||||
/* This file uses pixel-aligned region computation to determine what
|
||||
* can be clipped out. This only really works if everything is aligned
|
||||
* to the pixel grid - not scaled or rotated and at integer offsets.
|
||||
*
|
||||
* (This could be relaxed - if we turned off filtering for unscaled
|
||||
* windows then windows would be, by definition aligned to the pixel
|
||||
* grid. And for rectangular windows without a shape, the outline that
|
||||
* we draw for an unrotated window is always a rectangle because we
|
||||
* don't use antialasing for the window boundary - with or without
|
||||
* filtering, with or without a scale. But figuring out exactly
|
||||
* what pixels will be drawn by the graphics system in these cases
|
||||
* gets tricky, so we just go for the easiest part - no scale,
|
||||
* and at integer offsets.)
|
||||
*
|
||||
* The way we check for pixel-aligned is by looking at the
|
||||
* transformation into screen space of the allocation box of an actor
|
||||
* and and checking if the corners are "close enough" to integral
|
||||
* pixel values.
|
||||
*/
|
||||
|
||||
/* The definition of "close enough" to integral pixel values is
|
||||
* equality when we convert to 24.8 fixed-point.
|
||||
*/
|
||||
static inline int
|
||||
round_to_fixed (float x)
|
||||
{
|
||||
return roundf (x * 256);
|
||||
}
|
||||
|
||||
/* This helper function checks if (according to our fixed point precision)
|
||||
* the vertices @verts form a box of width @widthf and height @heightf
|
||||
* located at integral coordinates. These coordinates are returned
|
||||
* in @x_origin and @y_origin.
|
||||
*/
|
||||
static gboolean
|
||||
vertices_are_untransformed (ClutterVertex *verts,
|
||||
float widthf,
|
||||
float heightf,
|
||||
int *x_origin,
|
||||
int *y_origin)
|
||||
{
|
||||
int width, height;
|
||||
int v0x, v0y, v1x, v1y, v2x, v2y, v3x, v3y;
|
||||
int x, y;
|
||||
|
||||
width = round_to_fixed (widthf); height = round_to_fixed (heightf);
|
||||
|
||||
v0x = round_to_fixed (verts[0].x); v0y = round_to_fixed (verts[0].y);
|
||||
v1x = round_to_fixed (verts[1].x); v1y = round_to_fixed (verts[1].y);
|
||||
v2x = round_to_fixed (verts[2].x); v2y = round_to_fixed (verts[2].y);
|
||||
v3x = round_to_fixed (verts[3].x); v3y = round_to_fixed (verts[3].y);
|
||||
|
||||
/* Using shifting for converting fixed => int, gets things right for
|
||||
* negative values. / 256. wouldn't do the same
|
||||
*/
|
||||
x = v0x >> 8;
|
||||
y = v0y >> 8;
|
||||
|
||||
/* At integral coordinates? */
|
||||
if (x * 256 != v0x || y * 256 != v0y)
|
||||
return FALSE;
|
||||
|
||||
/* Not scaled? */
|
||||
if (v1x - v0x != width || v2y - v0y != height)
|
||||
return FALSE;
|
||||
|
||||
/* Not rotated/skewed? */
|
||||
if (v0x != v2x || v0y != v1y ||
|
||||
v3x != v1x || v3y != v2y)
|
||||
return FALSE;
|
||||
|
||||
*x_origin = x;
|
||||
*y_origin = y;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* Check if an actor is "untransformed" - which actually means transformed by
|
||||
* at most a integer-translation. The integer translation, if any, is returned.
|
||||
*/
|
||||
static gboolean
|
||||
actor_is_untransformed (ClutterActor *actor,
|
||||
int *x_origin,
|
||||
int *y_origin)
|
||||
{
|
||||
gfloat widthf, heightf;
|
||||
ClutterVertex verts[4];
|
||||
|
||||
clutter_actor_get_size (actor, &widthf, &heightf);
|
||||
clutter_actor_get_abs_allocation_vertices (actor, verts);
|
||||
|
||||
return vertices_are_untransformed (verts, widthf, heightf, x_origin, y_origin);
|
||||
}
|
||||
G_DEFINE_TYPE (MetaWindowGroup, meta_window_group, CLUTTER_TYPE_ACTOR);
|
||||
|
||||
/* Help macros to scale from OpenGL <-1,1> coordinates system to
|
||||
* window coordinates ranging [0,window-size]. Borrowed from clutter-utils.c
|
||||
@ -175,7 +83,7 @@ painting_untransformed (MetaWindowGroup *window_group,
|
||||
viewport[3], viewport[1]);
|
||||
}
|
||||
|
||||
return vertices_are_untransformed (vertices, width, height, x_origin, y_origin);
|
||||
return meta_actor_vertices_are_untransformed (vertices, width, height, x_origin, y_origin);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -183,8 +91,9 @@ meta_window_group_paint (ClutterActor *actor)
|
||||
{
|
||||
cairo_region_t *visible_region;
|
||||
ClutterActor *stage;
|
||||
ClutterActorIter iter;
|
||||
ClutterActor *child;
|
||||
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;
|
||||
@ -206,7 +115,7 @@ meta_window_group_paint (ClutterActor *actor)
|
||||
* on the stage.
|
||||
*/
|
||||
if (!painting_untransformed (window_group, &paint_x_origin, &paint_y_origin) ||
|
||||
!actor_is_untransformed (actor, &actor_x_origin, &actor_y_origin))
|
||||
!meta_actor_is_untransformed (actor, &actor_x_origin, &actor_y_origin))
|
||||
{
|
||||
CLUTTER_ACTOR_CLASS (meta_window_group_parent_class)->paint (actor);
|
||||
return;
|
||||
@ -215,13 +124,6 @@ meta_window_group_paint (ClutterActor *actor)
|
||||
paint_x_offset = paint_x_origin - actor_x_origin;
|
||||
paint_y_offset = paint_y_origin - actor_y_origin;
|
||||
|
||||
/* We walk the list from top to bottom (opposite of painting order),
|
||||
* and subtract the opaque area of each window out of the visible
|
||||
* region that we pass to the windows below.
|
||||
*/
|
||||
children = clutter_container_get_children (CLUTTER_CONTAINER (actor));
|
||||
children = g_list_reverse (children);
|
||||
|
||||
/* 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
|
||||
@ -243,12 +145,18 @@ meta_window_group_paint (ClutterActor *actor)
|
||||
cairo_region_subtract_rectangle (visible_region, &unredirected_rect);
|
||||
}
|
||||
|
||||
for (l = children; l; l = l->next)
|
||||
/* We walk the list from top to bottom (opposite of painting order),
|
||||
* and subtract the opaque area of each window out of the visible
|
||||
* region that we pass to the windows below.
|
||||
*/
|
||||
clutter_actor_iter_init (&iter, actor);
|
||||
while (clutter_actor_iter_prev (&iter, &child))
|
||||
{
|
||||
if (!CLUTTER_ACTOR_IS_VISIBLE (l->data))
|
||||
if (!CLUTTER_ACTOR_IS_VISIBLE (child))
|
||||
continue;
|
||||
|
||||
if (l->data == info->unredirected_window)
|
||||
if (info->unredirected_window != NULL &&
|
||||
child == CLUTTER_ACTOR (info->unredirected_window))
|
||||
continue;
|
||||
|
||||
/* If an actor has effects applied, then that can change the area
|
||||
@ -267,15 +175,15 @@ meta_window_group_paint (ClutterActor *actor)
|
||||
* as well for the same reason, but omitted for simplicity in the
|
||||
* hopes that no-one will do that.
|
||||
*/
|
||||
if (clutter_actor_has_effects (l->data))
|
||||
if (clutter_actor_has_effects (child))
|
||||
continue;
|
||||
|
||||
if (META_IS_WINDOW_ACTOR (l->data))
|
||||
if (META_IS_WINDOW_ACTOR (child))
|
||||
{
|
||||
MetaWindowActor *window_actor = l->data;
|
||||
MetaWindowActor *window_actor = META_WINDOW_ACTOR (child);
|
||||
int x, y;
|
||||
|
||||
if (!actor_is_untransformed (CLUTTER_ACTOR (window_actor), &x, &y))
|
||||
if (!meta_actor_is_untransformed (CLUTTER_ACTOR (window_actor), &x, &y))
|
||||
continue;
|
||||
|
||||
x += paint_x_offset;
|
||||
@ -296,19 +204,23 @@ meta_window_group_paint (ClutterActor *actor)
|
||||
meta_window_actor_set_visible_region_beneath (window_actor, visible_region);
|
||||
cairo_region_translate (visible_region, x, y);
|
||||
}
|
||||
else if (META_IS_BACKGROUND_ACTOR (l->data))
|
||||
else if (META_IS_BACKGROUND_ACTOR (child) ||
|
||||
META_IS_BACKGROUND_GROUP (child))
|
||||
{
|
||||
MetaBackgroundActor *background_actor = l->data;
|
||||
int x, y;
|
||||
|
||||
if (!actor_is_untransformed (CLUTTER_ACTOR (background_actor), &x, &y))
|
||||
if (!meta_actor_is_untransformed (child, &x, &y))
|
||||
continue;
|
||||
|
||||
x += paint_x_offset;
|
||||
y += paint_y_offset;
|
||||
|
||||
cairo_region_translate (visible_region, - x, - y);
|
||||
meta_background_actor_set_visible_region (background_actor, visible_region);
|
||||
|
||||
if (META_IS_BACKGROUND_GROUP (child))
|
||||
meta_background_group_set_visible_region (META_BACKGROUND_GROUP (child), visible_region);
|
||||
else
|
||||
meta_background_actor_set_visible_region (META_BACKGROUND_ACTOR (child), visible_region);
|
||||
cairo_region_translate (visible_region, x, y);
|
||||
}
|
||||
}
|
||||
@ -320,21 +232,27 @@ meta_window_group_paint (ClutterActor *actor)
|
||||
/* Now that we are done painting, unset the visible regions (they will
|
||||
* mess up painting clones of our actors)
|
||||
*/
|
||||
for (l = children; l; l = l->next)
|
||||
clutter_actor_iter_init (&iter, actor);
|
||||
while (clutter_actor_iter_next (&iter, &child))
|
||||
{
|
||||
if (META_IS_WINDOW_ACTOR (l->data))
|
||||
if (META_IS_WINDOW_ACTOR (child))
|
||||
{
|
||||
MetaWindowActor *window_actor = l->data;
|
||||
MetaWindowActor *window_actor = META_WINDOW_ACTOR (child);
|
||||
meta_window_actor_reset_visible_regions (window_actor);
|
||||
}
|
||||
else if (META_IS_BACKGROUND_ACTOR (l->data))
|
||||
else if (META_IS_BACKGROUND_ACTOR (child))
|
||||
{
|
||||
MetaBackgroundActor *background_actor = l->data;
|
||||
MetaBackgroundActor *background_actor = META_BACKGROUND_ACTOR (child);
|
||||
meta_background_actor_set_visible_region (background_actor, NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
g_list_free (children);
|
||||
static gboolean
|
||||
meta_window_group_get_paint_volume (ClutterActor *actor,
|
||||
ClutterPaintVolume *volume)
|
||||
{
|
||||
return clutter_paint_volume_set_from_allocation (volume, actor);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -343,6 +261,7 @@ meta_window_group_class_init (MetaWindowGroupClass *klass)
|
||||
ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass);
|
||||
|
||||
actor_class->paint = meta_window_group_paint;
|
||||
actor_class->get_paint_volume = meta_window_group_get_paint_volume;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -10,13 +10,15 @@
|
||||
/**
|
||||
* MetaWindowGroup:
|
||||
*
|
||||
* This class is a subclass of ClutterGroup with special handling for
|
||||
* MetaWindowActor when painting the group. When we are painting a stack
|
||||
* of 5-10 maximized windows, the standard bottom-to-top method of
|
||||
* drawing every actor results in a tremendous amount of overdraw
|
||||
* and can easily max out the available memory bandwidth on a low-end
|
||||
* graphics chipset. It's even worse if window textures are being accessed
|
||||
* over the AGP bus.
|
||||
* This class is a subclass of ClutterActor with special handling for
|
||||
* MetaWindowActor/MetaBackgroundActor/MetaBackgroundGroup when painting
|
||||
* children.
|
||||
*
|
||||
* When we are painting a stack of 5-10 maximized windows, the
|
||||
* standard bottom-to-top method of drawing every actor results in a
|
||||
* tremendous amount of overdraw and can easily max out the available
|
||||
* memory bandwidth on a low-end graphics chipset. It's even worse if
|
||||
* window textures are being accessed over the AGP bus.
|
||||
*
|
||||
* The basic technique applied here is to do a pre-pass before painting
|
||||
* where we walk window from top to bottom and compute the visible area
|
||||
@ -49,4 +51,7 @@ GType meta_window_group_get_type (void);
|
||||
|
||||
ClutterActor *meta_window_group_new (MetaScreen *screen);
|
||||
|
||||
gboolean meta_window_group_actor_is_untransformed (ClutterActor *actor,
|
||||
int *x_origin,
|
||||
int *y_origin);
|
||||
#endif /* META_WINDOW_GROUP_H */
|
||||
|
@ -23,6 +23,9 @@
|
||||
|
||||
#include <meta/meta-plugin.h>
|
||||
#include <meta/window.h>
|
||||
#include <meta/util.h>
|
||||
#include <meta/meta-background-group.h>
|
||||
#include <meta/meta-background-actor.h>
|
||||
|
||||
#include <libintl.h>
|
||||
#define _(x) dgettext (GETTEXT_PACKAGE, x)
|
||||
@ -68,6 +71,7 @@ struct _MetaDefaultPluginClass
|
||||
|
||||
static GQuark actor_data_quark = 0;
|
||||
|
||||
static void start (MetaPlugin *plugin);
|
||||
static void minimize (MetaPlugin *plugin,
|
||||
MetaWindowActor *actor);
|
||||
static void map (MetaPlugin *plugin,
|
||||
@ -96,6 +100,8 @@ static void kill_window_effects (MetaPlugin *plugin,
|
||||
MetaWindowActor *actor);
|
||||
static void kill_switch_workspace (MetaPlugin *plugin);
|
||||
|
||||
static void confirm_display_change (MetaPlugin *plugin);
|
||||
|
||||
static const MetaPluginInfo * plugin_info (MetaPlugin *plugin);
|
||||
|
||||
META_PLUGIN_DECLARE(MetaDefaultPlugin, meta_default_plugin);
|
||||
@ -111,6 +117,8 @@ struct _MetaDefaultPluginPrivate
|
||||
ClutterActor *desktop1;
|
||||
ClutterActor *desktop2;
|
||||
|
||||
ClutterActor *background_group;
|
||||
|
||||
MetaPluginInfo info;
|
||||
};
|
||||
|
||||
@ -191,6 +199,7 @@ meta_default_plugin_class_init (MetaDefaultPluginClass *klass)
|
||||
gobject_class->set_property = meta_default_plugin_set_property;
|
||||
gobject_class->get_property = meta_default_plugin_get_property;
|
||||
|
||||
plugin_class->start = start;
|
||||
plugin_class->map = map;
|
||||
plugin_class->minimize = minimize;
|
||||
plugin_class->maximize = maximize;
|
||||
@ -200,6 +209,7 @@ meta_default_plugin_class_init (MetaDefaultPluginClass *klass)
|
||||
plugin_class->plugin_info = plugin_info;
|
||||
plugin_class->kill_window_effects = kill_window_effects;
|
||||
plugin_class->kill_switch_workspace = kill_switch_workspace;
|
||||
plugin_class->confirm_display_change = confirm_display_change;
|
||||
|
||||
g_type_class_add_private (gobject_class, sizeof (MetaDefaultPluginPrivate));
|
||||
}
|
||||
@ -282,6 +292,78 @@ on_switch_workspace_effect_complete (ClutterTimeline *timeline, gpointer data)
|
||||
meta_plugin_switch_workspace_completed (plugin);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
show_stage (MetaPlugin *plugin)
|
||||
{
|
||||
MetaScreen *screen;
|
||||
ClutterActor *stage;
|
||||
|
||||
screen = meta_plugin_get_screen (plugin);
|
||||
stage = meta_get_stage_for_screen (screen);
|
||||
|
||||
clutter_actor_show (stage);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
on_monitors_changed (MetaScreen *screen,
|
||||
MetaPlugin *plugin)
|
||||
{
|
||||
MetaDefaultPlugin *self = META_DEFAULT_PLUGIN (plugin);
|
||||
int i, n;
|
||||
|
||||
clutter_actor_destroy_all_children (self->priv->background_group);
|
||||
|
||||
n = meta_screen_get_n_monitors (screen);
|
||||
for (i = 0; i < n; i++)
|
||||
{
|
||||
MetaRectangle rect;
|
||||
ClutterActor *background;
|
||||
ClutterColor color;
|
||||
|
||||
meta_screen_get_monitor_geometry (screen, i, &rect);
|
||||
|
||||
background = meta_background_actor_new ();
|
||||
|
||||
clutter_actor_set_position (background, rect.x, rect.y);
|
||||
clutter_actor_set_size (background, rect.width, rect.height);
|
||||
|
||||
/* Don't use rand() here, mesa calls srand() internally when
|
||||
parsing the driconf XML, but it's nice if the colors are
|
||||
reproducible.
|
||||
*/
|
||||
clutter_color_init (&color,
|
||||
g_random_int () % 255,
|
||||
g_random_int () % 255,
|
||||
g_random_int () % 255,
|
||||
255);
|
||||
clutter_actor_set_background_color (background, &color);
|
||||
|
||||
clutter_actor_add_child (self->priv->background_group, background);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
start (MetaPlugin *plugin)
|
||||
{
|
||||
MetaDefaultPlugin *self = META_DEFAULT_PLUGIN (plugin);
|
||||
MetaScreen *screen = meta_plugin_get_screen (plugin);
|
||||
|
||||
self->priv->background_group = meta_background_group_new ();
|
||||
clutter_actor_insert_child_below (meta_get_window_group_for_screen (screen),
|
||||
self->priv->background_group, NULL);
|
||||
|
||||
g_signal_connect (screen, "monitors-changed",
|
||||
G_CALLBACK (on_monitors_changed), plugin);
|
||||
on_monitors_changed (screen, plugin);
|
||||
|
||||
meta_later_add (META_LATER_BEFORE_REDRAW,
|
||||
(GSourceFunc) show_stage,
|
||||
plugin,
|
||||
NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
switch_workspace (MetaPlugin *plugin,
|
||||
gint from, gint to,
|
||||
@ -756,3 +838,33 @@ plugin_info (MetaPlugin *plugin)
|
||||
|
||||
return &priv->info;
|
||||
}
|
||||
|
||||
static void
|
||||
on_dialog_closed (GPid pid,
|
||||
gint status,
|
||||
gpointer user_data)
|
||||
{
|
||||
MetaPlugin *plugin = user_data;
|
||||
gboolean ok;
|
||||
|
||||
ok = g_spawn_check_exit_status (status, NULL);
|
||||
meta_plugin_complete_display_change (plugin, ok);
|
||||
}
|
||||
|
||||
static void
|
||||
confirm_display_change (MetaPlugin *plugin)
|
||||
{
|
||||
GPid pid;
|
||||
|
||||
pid = meta_show_dialog ("--question",
|
||||
"Does the display look OK?",
|
||||
"20",
|
||||
NULL,
|
||||
"_Keep This Configuration",
|
||||
"_Restore Previous Configuration",
|
||||
"preferences-desktop-display",
|
||||
0,
|
||||
NULL, NULL);
|
||||
|
||||
g_child_watch_add (pid, on_dialog_closed, plugin);
|
||||
}
|
||||
|
408
src/core/barrier.c
Normal file
408
src/core/barrier.c
Normal file
@ -0,0 +1,408 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; c-basic-offset: 2; -*- */
|
||||
|
||||
/**
|
||||
* SECTION:barrier
|
||||
* @Title: MetaBarrier
|
||||
* @Short_Description: Pointer barriers
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <glib-object.h>
|
||||
|
||||
#include <X11/extensions/XInput2.h>
|
||||
#include <X11/extensions/Xfixes.h>
|
||||
#include <meta/util.h>
|
||||
#include <meta/barrier.h>
|
||||
#include "display-private.h"
|
||||
#include "mutter-enum-types.h"
|
||||
#include "core.h"
|
||||
|
||||
G_DEFINE_TYPE (MetaBarrier, meta_barrier, G_TYPE_OBJECT)
|
||||
|
||||
enum {
|
||||
PROP_0,
|
||||
|
||||
PROP_DISPLAY,
|
||||
|
||||
PROP_X1,
|
||||
PROP_Y1,
|
||||
PROP_X2,
|
||||
PROP_Y2,
|
||||
PROP_DIRECTIONS,
|
||||
|
||||
PROP_LAST,
|
||||
};
|
||||
|
||||
static GParamSpec *obj_props[PROP_LAST];
|
||||
|
||||
enum {
|
||||
HIT,
|
||||
LEFT,
|
||||
|
||||
LAST_SIGNAL,
|
||||
};
|
||||
|
||||
static guint obj_signals[LAST_SIGNAL];
|
||||
|
||||
struct _MetaBarrierPrivate
|
||||
{
|
||||
MetaDisplay *display;
|
||||
|
||||
int x1;
|
||||
int y1;
|
||||
int x2;
|
||||
int y2;
|
||||
|
||||
MetaBarrierDirection directions;
|
||||
|
||||
PointerBarrier xbarrier;
|
||||
};
|
||||
|
||||
static void meta_barrier_event_unref (MetaBarrierEvent *event);
|
||||
|
||||
static void
|
||||
meta_barrier_get_property (GObject *object,
|
||||
guint prop_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
MetaBarrier *barrier = META_BARRIER (object);
|
||||
MetaBarrierPrivate *priv = barrier->priv;
|
||||
switch (prop_id)
|
||||
{
|
||||
case PROP_DISPLAY:
|
||||
g_value_set_object (value, priv->display);
|
||||
break;
|
||||
case PROP_X1:
|
||||
g_value_set_int (value, priv->x1);
|
||||
break;
|
||||
case PROP_Y1:
|
||||
g_value_set_int (value, priv->y1);
|
||||
break;
|
||||
case PROP_X2:
|
||||
g_value_set_int (value, priv->x2);
|
||||
break;
|
||||
case PROP_Y2:
|
||||
g_value_set_int (value, priv->y2);
|
||||
break;
|
||||
case PROP_DIRECTIONS:
|
||||
g_value_set_flags (value, priv->directions);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
meta_barrier_set_property (GObject *object,
|
||||
guint prop_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
MetaBarrier *barrier = META_BARRIER (object);
|
||||
MetaBarrierPrivate *priv = barrier->priv;
|
||||
switch (prop_id)
|
||||
{
|
||||
case PROP_DISPLAY:
|
||||
priv->display = g_value_get_object (value);
|
||||
break;
|
||||
case PROP_X1:
|
||||
priv->x1 = g_value_get_int (value);
|
||||
break;
|
||||
case PROP_Y1:
|
||||
priv->y1 = g_value_get_int (value);
|
||||
break;
|
||||
case PROP_X2:
|
||||
priv->x2 = g_value_get_int (value);
|
||||
break;
|
||||
case PROP_Y2:
|
||||
priv->y2 = g_value_get_int (value);
|
||||
break;
|
||||
case PROP_DIRECTIONS:
|
||||
priv->directions = g_value_get_flags (value);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
meta_barrier_dispose (GObject *object)
|
||||
{
|
||||
MetaBarrier *barrier = META_BARRIER (object);
|
||||
MetaBarrierPrivate *priv = barrier->priv;
|
||||
|
||||
if (meta_barrier_is_active (barrier))
|
||||
{
|
||||
meta_bug ("MetaBarrier wrapper %p for X barrier %ld was destroyed"
|
||||
" while the X barrier is still active.",
|
||||
barrier, priv->xbarrier);
|
||||
}
|
||||
|
||||
G_OBJECT_CLASS (meta_barrier_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_barrier_is_active (MetaBarrier *barrier)
|
||||
{
|
||||
return barrier->priv->xbarrier != 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_barrier_release:
|
||||
* @barrier: The barrier to release
|
||||
* @event: The event to release the pointer for
|
||||
*
|
||||
* In XI2.3, pointer barriers provide a feature where they can
|
||||
* be temporarily released so that the pointer goes through
|
||||
* them. Pass a #MetaBarrierEvent to release the barrier for
|
||||
* this event sequence.
|
||||
*/
|
||||
void
|
||||
meta_barrier_release (MetaBarrier *barrier,
|
||||
MetaBarrierEvent *event)
|
||||
{
|
||||
#ifdef HAVE_XI23
|
||||
MetaBarrierPrivate *priv = barrier->priv;
|
||||
if (META_DISPLAY_HAS_XINPUT_23 (priv->display))
|
||||
{
|
||||
XIBarrierReleasePointer (priv->display->xdisplay,
|
||||
META_VIRTUAL_CORE_POINTER_ID,
|
||||
priv->xbarrier, event->event_id);
|
||||
}
|
||||
#endif /* HAVE_XI23 */
|
||||
}
|
||||
|
||||
static void
|
||||
meta_barrier_constructed (GObject *object)
|
||||
{
|
||||
MetaBarrier *barrier = META_BARRIER (object);
|
||||
MetaBarrierPrivate *priv = barrier->priv;
|
||||
Display *dpy;
|
||||
Window root;
|
||||
|
||||
g_return_if_fail (priv->x1 == priv->x2 || priv->y1 == priv->y2);
|
||||
|
||||
if (priv->display == NULL)
|
||||
{
|
||||
g_warning ("A display must be provided when constructing a barrier.");
|
||||
return;
|
||||
}
|
||||
|
||||
dpy = priv->display->xdisplay;
|
||||
root = DefaultRootWindow (dpy);
|
||||
|
||||
priv->xbarrier = XFixesCreatePointerBarrier (dpy, root,
|
||||
priv->x1, priv->y1,
|
||||
priv->x2, priv->y2,
|
||||
priv->directions, 0, NULL);
|
||||
|
||||
/* Take a ref that we'll release when the XID dies inside destroy(),
|
||||
* so that the object stays alive and doesn't get GC'd. */
|
||||
g_object_ref (barrier);
|
||||
|
||||
g_hash_table_insert (priv->display->xids, &priv->xbarrier, barrier);
|
||||
|
||||
G_OBJECT_CLASS (meta_barrier_parent_class)->constructed (object);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_barrier_class_init (MetaBarrierClass *klass)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
|
||||
object_class->get_property = meta_barrier_get_property;
|
||||
object_class->set_property = meta_barrier_set_property;
|
||||
object_class->dispose = meta_barrier_dispose;
|
||||
object_class->constructed = meta_barrier_constructed;
|
||||
|
||||
obj_props[PROP_DISPLAY] =
|
||||
g_param_spec_object ("display",
|
||||
"Display",
|
||||
"The display to construct the pointer barrier on",
|
||||
META_TYPE_DISPLAY,
|
||||
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
|
||||
|
||||
obj_props[PROP_X1] =
|
||||
g_param_spec_int ("x1",
|
||||
"X1",
|
||||
"The first X coordinate of the barrier",
|
||||
0, G_MAXSHORT, 0,
|
||||
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
|
||||
|
||||
obj_props[PROP_Y1] =
|
||||
g_param_spec_int ("y1",
|
||||
"Y1",
|
||||
"The first Y coordinate of the barrier",
|
||||
0, G_MAXSHORT, 0,
|
||||
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
|
||||
|
||||
obj_props[PROP_X2] =
|
||||
g_param_spec_int ("x2",
|
||||
"X2",
|
||||
"The second X coordinate of the barrier",
|
||||
0, G_MAXSHORT, G_MAXSHORT,
|
||||
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
|
||||
|
||||
obj_props[PROP_Y2] =
|
||||
g_param_spec_int ("y2",
|
||||
"Y2",
|
||||
"The second Y coordinate of the barrier",
|
||||
0, G_MAXSHORT, G_MAXSHORT,
|
||||
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
|
||||
|
||||
obj_props[PROP_DIRECTIONS] =
|
||||
g_param_spec_flags ("directions",
|
||||
"Directions",
|
||||
"A set of directions to let the pointer through",
|
||||
META_TYPE_BARRIER_DIRECTION,
|
||||
0,
|
||||
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
|
||||
|
||||
g_object_class_install_properties (object_class, PROP_LAST, obj_props);
|
||||
|
||||
/**
|
||||
* MetaBarrier::hit:
|
||||
* @barrier: The #MetaBarrier that was hit
|
||||
* @event: A #MetaBarrierEvent that has the details of how
|
||||
* the barrier was hit.
|
||||
*
|
||||
* When a pointer barrier is hit, this will trigger. This
|
||||
* requires an XI2-enabled server.
|
||||
*/
|
||||
obj_signals[HIT] =
|
||||
g_signal_new ("hit",
|
||||
G_TYPE_FROM_CLASS (object_class),
|
||||
G_SIGNAL_RUN_FIRST,
|
||||
0,
|
||||
NULL, NULL, NULL,
|
||||
G_TYPE_NONE, 1,
|
||||
META_TYPE_BARRIER_EVENT);
|
||||
|
||||
/**
|
||||
* MetaBarrier::left:
|
||||
* @barrier: The #MetaBarrier that was left
|
||||
* @event: A #MetaBarrierEvent that has the details of how
|
||||
* the barrier was left.
|
||||
*
|
||||
* When a pointer barrier hitbox was left, this will trigger.
|
||||
* This requires an XI2-enabled server.
|
||||
*/
|
||||
obj_signals[LEFT] =
|
||||
g_signal_new ("left",
|
||||
G_TYPE_FROM_CLASS (object_class),
|
||||
G_SIGNAL_RUN_FIRST,
|
||||
0,
|
||||
NULL, NULL, NULL,
|
||||
G_TYPE_NONE, 1,
|
||||
META_TYPE_BARRIER_EVENT);
|
||||
|
||||
g_type_class_add_private (object_class, sizeof(MetaBarrierPrivate));
|
||||
}
|
||||
|
||||
void
|
||||
meta_barrier_destroy (MetaBarrier *barrier)
|
||||
{
|
||||
MetaBarrierPrivate *priv = barrier->priv;
|
||||
Display *dpy;
|
||||
|
||||
if (priv->display == NULL)
|
||||
return;
|
||||
|
||||
dpy = priv->display->xdisplay;
|
||||
|
||||
if (!meta_barrier_is_active (barrier))
|
||||
return;
|
||||
|
||||
XFixesDestroyPointerBarrier (dpy, priv->xbarrier);
|
||||
g_hash_table_remove (priv->display->xids, &priv->xbarrier);
|
||||
priv->xbarrier = 0;
|
||||
|
||||
g_object_unref (barrier);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_barrier_init (MetaBarrier *barrier)
|
||||
{
|
||||
barrier->priv = G_TYPE_INSTANCE_GET_PRIVATE (barrier, META_TYPE_BARRIER, MetaBarrierPrivate);
|
||||
}
|
||||
|
||||
#ifdef HAVE_XI23
|
||||
static void
|
||||
meta_barrier_fire_event (MetaBarrier *barrier,
|
||||
XIBarrierEvent *xevent)
|
||||
{
|
||||
MetaBarrierEvent *event = g_slice_new0 (MetaBarrierEvent);
|
||||
|
||||
event->ref_count = 1;
|
||||
event->event_id = xevent->eventid;
|
||||
event->time = xevent->time;
|
||||
event->dt = xevent->dtime;
|
||||
|
||||
event->x = xevent->root_x;
|
||||
event->y = xevent->root_y;
|
||||
event->dx = xevent->dx;
|
||||
event->dy = xevent->dy;
|
||||
|
||||
event->released = (xevent->flags & XIBarrierPointerReleased) != 0;
|
||||
event->grabbed = (xevent->flags & XIBarrierDeviceIsGrabbed) != 0;
|
||||
|
||||
switch (xevent->evtype)
|
||||
{
|
||||
case XI_BarrierHit:
|
||||
g_signal_emit (barrier, obj_signals[HIT], 0, event);
|
||||
break;
|
||||
case XI_BarrierLeave:
|
||||
g_signal_emit (barrier, obj_signals[LEFT], 0, event);
|
||||
break;
|
||||
default:
|
||||
g_assert_not_reached ();
|
||||
}
|
||||
|
||||
meta_barrier_event_unref (event);
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_display_process_barrier_event (MetaDisplay *display,
|
||||
XIBarrierEvent *xev)
|
||||
{
|
||||
MetaBarrier *barrier;
|
||||
|
||||
barrier = g_hash_table_lookup (display->xids, &xev->barrier);
|
||||
if (barrier != NULL)
|
||||
{
|
||||
meta_barrier_fire_event (barrier, xev);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
#endif /* HAVE_XI23 */
|
||||
|
||||
static MetaBarrierEvent *
|
||||
meta_barrier_event_ref (MetaBarrierEvent *event)
|
||||
{
|
||||
g_return_val_if_fail (event != NULL, NULL);
|
||||
g_return_val_if_fail (event->ref_count > 0, NULL);
|
||||
|
||||
g_atomic_int_inc ((volatile int *)&event->ref_count);
|
||||
return event;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_barrier_event_unref (MetaBarrierEvent *event)
|
||||
{
|
||||
g_return_if_fail (event != NULL);
|
||||
g_return_if_fail (event->ref_count > 0);
|
||||
|
||||
if (g_atomic_int_dec_and_test ((volatile int *)&event->ref_count))
|
||||
g_slice_free (MetaBarrierEvent, event);
|
||||
}
|
||||
|
||||
G_DEFINE_BOXED_TYPE (MetaBarrierEvent,
|
||||
meta_barrier_event,
|
||||
meta_barrier_event_ref,
|
||||
meta_barrier_event_unref)
|
@ -22,8 +22,8 @@
|
||||
* 02111-1307, USA.
|
||||
*/
|
||||
|
||||
/**
|
||||
* SECTION:Bell
|
||||
/*
|
||||
* SECTION:bell
|
||||
* @short_description: Ring the bell or flash the screen
|
||||
*
|
||||
* Sometimes, X programs "ring the bell", whatever that means. Mutter lets
|
||||
@ -52,7 +52,9 @@
|
||||
#include <config.h>
|
||||
#include "bell.h"
|
||||
#include "screen-private.h"
|
||||
#include "window-private.h"
|
||||
#include <meta/prefs.h>
|
||||
#include <meta/compositor.h>
|
||||
#ifdef HAVE_LIBCANBERRA
|
||||
#include <canberra-gtk.h>
|
||||
#endif
|
||||
|
@ -28,30 +28,35 @@
|
||||
|
||||
#ifdef HAVE_XKB
|
||||
/**
|
||||
* meta_bell_notify:
|
||||
* @display: The display the bell event came in on
|
||||
* @xkb_ev: The bell event we just received
|
||||
*
|
||||
* Gives the user some kind of visual bell; in fact, this is our response
|
||||
* to any kind of bell request, but we set it up so that we only get
|
||||
* notified about visual bells, and X deals with audible ones.
|
||||
*
|
||||
* If the configure script found we had no XKB, this does not exist.
|
||||
*
|
||||
* \param display The display the bell event came in on
|
||||
* \param xkb_ev The bell event we just received
|
||||
*/
|
||||
void meta_bell_notify (MetaDisplay *display, XkbAnyEvent *xkb_ev);
|
||||
#endif
|
||||
|
||||
/**
|
||||
* meta_bell_set_audible:
|
||||
* @display: The display we're configuring
|
||||
* @audible: True for an audible bell, false for a visual bell
|
||||
*
|
||||
* Turns the bell to audible or visual. This tells X what to do, but
|
||||
* not Mutter; you will need to set the "visual bell" pref for that.
|
||||
*
|
||||
* If the configure script found we had no XKB, this is a no-op.
|
||||
*
|
||||
* \param display The display we're configuring
|
||||
* \param audible True for an audible bell, false for a visual bell
|
||||
*/
|
||||
void meta_bell_set_audible (MetaDisplay *display, gboolean audible);
|
||||
|
||||
/**
|
||||
* meta_bell_init:
|
||||
* @display: The display which is opening
|
||||
*
|
||||
* Initialises the bell subsystem. This involves intialising
|
||||
* XKB (which, despite being a keyboard extension, is the
|
||||
* place to look for bell notifications), then asking it
|
||||
@ -64,8 +69,6 @@ void meta_bell_set_audible (MetaDisplay *display, gboolean audible);
|
||||
* we will have HAVE_XKB undefined, which will cause this
|
||||
* function to be a no-op.
|
||||
*
|
||||
* \param display The display which is opening
|
||||
*
|
||||
* \bug There is a line of code that's never run that tells
|
||||
* XKB to reset the bell status after we quit. Bill H said
|
||||
* (<http://bugzilla.gnome.org/show_bug.cgi?id=99886#c12>)
|
||||
@ -75,9 +78,10 @@ void meta_bell_set_audible (MetaDisplay *display, gboolean audible);
|
||||
gboolean meta_bell_init (MetaDisplay *display);
|
||||
|
||||
/**
|
||||
* Shuts down the bell subsystem.
|
||||
* meta_bell_shutdown:
|
||||
* @display: The display which is closing
|
||||
*
|
||||
* \param display The display which is closing
|
||||
* Shuts down the bell subsystem.
|
||||
*
|
||||
* \bug This is never called! If we had XkbSetAutoResetControls
|
||||
* enabled in meta_bell_init(), this wouldn't be a problem, but
|
||||
@ -86,11 +90,12 @@ gboolean meta_bell_init (MetaDisplay *display);
|
||||
void meta_bell_shutdown (MetaDisplay *display);
|
||||
|
||||
/**
|
||||
* meta_bell_notify_frame_destroy:
|
||||
* @frame: The frame which is being destroyed
|
||||
*
|
||||
* Deals with a frame being destroyed. This is important because if we're
|
||||
* using a visual bell, we might be flashing the edges of the frame, and
|
||||
* so we'd have a timeout function waiting ready to un-flash them. If the
|
||||
* frame's going away, we can tell the timeout not to bother.
|
||||
*
|
||||
* \param frame The frame which is being destroyed
|
||||
*/
|
||||
void meta_bell_notify_frame_destroy (MetaFrame *frame);
|
||||
|
@ -1,6 +1,10 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/* Simple box operations */
|
||||
/**
|
||||
* SECTION:boxes
|
||||
* @Title: MetaRectangle
|
||||
* @Short_Description: Simple box operations
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2005, 2006 Elijah Newren
|
||||
|
@ -571,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,
|
||||
|
@ -775,3 +775,24 @@ meta_invalidate_default_icons (void)
|
||||
g_slist_free (windows);
|
||||
}
|
||||
|
||||
void
|
||||
meta_core_add_old_event_mask (Display *xdisplay,
|
||||
Window xwindow,
|
||||
XIEventMask *mask)
|
||||
{
|
||||
XIEventMask *prev;
|
||||
gint n_masks, i, j;
|
||||
|
||||
prev = XIGetSelectedEvents (xdisplay, xwindow, &n_masks);
|
||||
|
||||
for (i = 0; i < n_masks; i++)
|
||||
{
|
||||
if (prev[i].deviceid != XIAllMasterDevices)
|
||||
continue;
|
||||
|
||||
for (j = 0; j < MIN (mask->mask_len, prev[i].mask_len); j++)
|
||||
mask->mask[j] |= prev[i].mask[j];
|
||||
}
|
||||
|
||||
XFree (prev);
|
||||
}
|
||||
|
@ -205,8 +205,8 @@ void meta_core_increment_event_serial (Display *display);
|
||||
|
||||
void meta_invalidate_default_icons (void);
|
||||
|
||||
void meta_core_add_old_event_mask (Display *xdisplay,
|
||||
Window xwindow,
|
||||
XIEventMask *mask);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -133,6 +133,18 @@ delete_ping_timeout_func (MetaDisplay *display,
|
||||
g_child_watch_add (dialog_pid, dialog_exited, window);
|
||||
}
|
||||
|
||||
void
|
||||
meta_window_check_alive (MetaWindow *window,
|
||||
guint32 timestamp)
|
||||
{
|
||||
meta_display_ping_window (window->display,
|
||||
window,
|
||||
timestamp,
|
||||
delete_ping_reply_func,
|
||||
delete_ping_timeout_func,
|
||||
window);
|
||||
}
|
||||
|
||||
void
|
||||
meta_window_delete (MetaWindow *window,
|
||||
guint32 timestamp)
|
||||
@ -156,13 +168,8 @@ meta_window_delete (MetaWindow *window,
|
||||
}
|
||||
meta_error_trap_pop (window->display);
|
||||
|
||||
meta_display_ping_window (window->display,
|
||||
window,
|
||||
timestamp,
|
||||
delete_ping_reply_func,
|
||||
delete_ping_timeout_func,
|
||||
window);
|
||||
|
||||
meta_window_check_alive (window, timestamp);
|
||||
|
||||
if (window->has_focus)
|
||||
{
|
||||
/* FIXME Clean this up someday
|
||||
|
@ -33,12 +33,12 @@
|
||||
|
||||
#include <glib.h>
|
||||
#include <X11/Xlib.h>
|
||||
#include "eventqueue.h"
|
||||
#include <meta/common.h>
|
||||
#include <meta/boxes.h>
|
||||
#include <meta/display.h>
|
||||
#include "keybindings-private.h"
|
||||
#include <meta/prefs.h>
|
||||
#include <meta/barrier.h>
|
||||
|
||||
#ifdef HAVE_STARTUP_NOTIFICATION
|
||||
#include <libsn/sn.h>
|
||||
@ -92,7 +92,6 @@ struct _MetaDisplay
|
||||
|
||||
char *name;
|
||||
Display *xdisplay;
|
||||
char *hostname;
|
||||
|
||||
Window leader_window;
|
||||
Window timestamp_pinging_window;
|
||||
@ -104,19 +103,20 @@ struct _MetaDisplay
|
||||
#include <meta/atomnames.h>
|
||||
#undef item
|
||||
|
||||
/* This is the actual window from focus events,
|
||||
* not the one we last set
|
||||
/* The window and serial of the most recent FocusIn event. */
|
||||
Window server_focus_window;
|
||||
gulong server_focus_serial;
|
||||
|
||||
/* Our best guess as to the "currently" focused window (that is, the
|
||||
* window that we expect will be focused at the point when the X
|
||||
* server processes our next request), and the serial of the request
|
||||
* or event that caused this.
|
||||
*/
|
||||
MetaWindow *focus_window;
|
||||
|
||||
/* window we are expecting a FocusIn event for or the current focus
|
||||
* window if we are not expecting any FocusIn/FocusOut events; not
|
||||
* perfect because applications can call XSetInputFocus directly.
|
||||
* (It could also be messed up if a timestamp later than current
|
||||
* time is sent to meta_display_set_input_focus_window, though that
|
||||
* would be a programming error). See bug 154598 for more info.
|
||||
*/
|
||||
MetaWindow *expected_focus_window;
|
||||
/* For windows we've focused that don't necessarily have an X window,
|
||||
* like the no_focus_window or the stage X window. */
|
||||
Window focus_xwindow;
|
||||
gulong focus_serial;
|
||||
|
||||
/* last timestamp passed to XSetInputFocus */
|
||||
guint32 last_focus_time;
|
||||
@ -142,10 +142,9 @@ struct _MetaDisplay
|
||||
|
||||
/*< private-ish >*/
|
||||
guint error_trap_synced_at_last_pop : 1;
|
||||
MetaEventQueue *events;
|
||||
GSList *screens;
|
||||
MetaScreen *active_screen;
|
||||
GHashTable *window_ids;
|
||||
GHashTable *xids;
|
||||
int error_traps;
|
||||
int (* error_trap_handler) (Display *display,
|
||||
XErrorEvent *error);
|
||||
@ -211,6 +210,7 @@ struct _MetaDisplay
|
||||
GList* grab_old_window_stacking;
|
||||
MetaEdgeResistanceData *grab_edge_resistance_data;
|
||||
unsigned int grab_last_user_action_was_snap;
|
||||
guint32 grab_timestamp;
|
||||
|
||||
/* we use property updates as sentinels for certain window focus events
|
||||
* to avoid some race conditions on EnterNotify events
|
||||
@ -220,10 +220,6 @@ struct _MetaDisplay
|
||||
#ifdef HAVE_XKB
|
||||
int xkb_base_event_type;
|
||||
guint32 last_bell_time;
|
||||
#endif
|
||||
#ifdef HAVE_XSYNC
|
||||
/* alarm monitoring client's _NET_WM_SYNC_REQUEST_COUNTER */
|
||||
XSyncAlarm grab_sync_request_alarm;
|
||||
#endif
|
||||
int grab_resize_timeout_id;
|
||||
|
||||
@ -244,6 +240,8 @@ struct _MetaDisplay
|
||||
unsigned int meta_mask;
|
||||
MetaKeyCombo overlay_key_combo;
|
||||
gboolean overlay_key_only_pressed;
|
||||
MetaKeyCombo *iso_next_group_combos;
|
||||
int n_iso_next_group_combos;
|
||||
|
||||
/* Monitor cache */
|
||||
unsigned int monitor_cache_invalidated : 1;
|
||||
@ -283,7 +281,10 @@ struct _MetaDisplay
|
||||
int damage_error_base;
|
||||
int xfixes_event_base;
|
||||
int xfixes_error_base;
|
||||
|
||||
int xinput_error_base;
|
||||
int xinput_event_base;
|
||||
int xinput_opcode;
|
||||
|
||||
#ifdef HAVE_STARTUP_NOTIFICATION
|
||||
SnDisplay *sn_display;
|
||||
#endif
|
||||
@ -311,10 +312,14 @@ struct _MetaDisplay
|
||||
#define META_DISPLAY_HAS_RENDER(display) ((display)->have_render)
|
||||
unsigned int have_composite : 1;
|
||||
unsigned int have_damage : 1;
|
||||
unsigned int have_xfixes : 1;
|
||||
#define META_DISPLAY_HAS_COMPOSITE(display) ((display)->have_composite)
|
||||
#define META_DISPLAY_HAS_DAMAGE(display) ((display)->have_damage)
|
||||
#define META_DISPLAY_HAS_XFIXES(display) ((display)->have_xfixes)
|
||||
#ifdef HAVE_XI23
|
||||
gboolean have_xinput_23 : 1;
|
||||
#define META_DISPLAY_HAS_XINPUT_23(display) ((display)->have_xinput_23)
|
||||
#else
|
||||
#define META_DISPLAY_HAS_XINPUT_23(display) FALSE
|
||||
#endif /* HAVE_XI23 */
|
||||
};
|
||||
|
||||
struct _MetaDisplayClass
|
||||
@ -366,6 +371,16 @@ void meta_display_register_x_window (MetaDisplay *display,
|
||||
void meta_display_unregister_x_window (MetaDisplay *display,
|
||||
Window xwindow);
|
||||
|
||||
#ifdef HAVE_XSYNC
|
||||
MetaWindow* meta_display_lookup_sync_alarm (MetaDisplay *display,
|
||||
XSyncAlarm alarm);
|
||||
void meta_display_register_sync_alarm (MetaDisplay *display,
|
||||
XSyncAlarm *alarmp,
|
||||
MetaWindow *window);
|
||||
void meta_display_unregister_sync_alarm (MetaDisplay *display,
|
||||
XSyncAlarm alarm);
|
||||
#endif /* HAVE_XSYNC */
|
||||
|
||||
void meta_display_notify_window_created (MetaDisplay *display,
|
||||
MetaWindow *window);
|
||||
|
||||
@ -381,7 +396,6 @@ Cursor meta_display_create_x_cursor (MetaDisplay *display,
|
||||
void meta_display_set_grab_op_cursor (MetaDisplay *display,
|
||||
MetaScreen *screen,
|
||||
MetaGrabOp op,
|
||||
gboolean change_pointer,
|
||||
Window grab_xwindow,
|
||||
guint32 timestamp);
|
||||
|
||||
@ -429,6 +443,7 @@ int meta_resize_gravity_from_grab_op (MetaGrabOp op);
|
||||
|
||||
gboolean meta_grab_op_is_moving (MetaGrabOp op);
|
||||
gboolean meta_grab_op_is_resizing (MetaGrabOp op);
|
||||
gboolean meta_grab_op_is_mouse (MetaGrabOp op);
|
||||
|
||||
void meta_display_devirtualize_modifiers (MetaDisplay *display,
|
||||
MetaVirtualModifier modifiers,
|
||||
@ -443,8 +458,23 @@ void meta_display_queue_autoraise_callback (MetaDisplay *display,
|
||||
void meta_display_remove_autoraise_callback (MetaDisplay *display);
|
||||
|
||||
void meta_display_overlay_key_activate (MetaDisplay *display);
|
||||
void meta_display_accelerator_activate (MetaDisplay *display,
|
||||
guint action,
|
||||
guint deviceid,
|
||||
guint timestamp);
|
||||
gboolean meta_display_modifiers_accelerator_activate (MetaDisplay *display);
|
||||
|
||||
/* In above-tab-keycode.c */
|
||||
guint meta_display_get_above_tab_keycode (MetaDisplay *display);
|
||||
|
||||
#ifdef HAVE_XI23
|
||||
gboolean meta_display_process_barrier_event (MetaDisplay *display,
|
||||
XIBarrierEvent *event);
|
||||
#endif /* HAVE_XI23 */
|
||||
|
||||
void meta_display_set_input_focus_xwindow (MetaDisplay *display,
|
||||
MetaScreen *screen,
|
||||
Window window,
|
||||
guint32 timestamp);
|
||||
|
||||
#endif
|
||||
|
3032
src/core/display.c
3032
src/core/display.c
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