Compare commits
	
		
			497 Commits
		
	
	
		
			3.7.2
			...
			wip/waylan
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 7f07b4a0fc | ||
|   | c9a9c5fe79 | ||
|   | 04aff06876 | ||
|   | 1cb5284113 | ||
|   | b1e758b341 | ||
|   | 96753bb703 | ||
|   | 33b06f97e3 | ||
|   | c9830c13b4 | ||
|   | 9a4783e364 | ||
|   | aa15c09d54 | ||
|   | 62d908be42 | ||
|   | 6526e9882b | ||
|   | ab72352c47 | ||
|   | f09b9573f0 | ||
|   | 3d3ae40f79 | ||
|   | ea3d2b4759 | ||
|   | 542a0886cf | ||
|   | bd3d5df9ce | ||
|   | 91cdfab495 | ||
|   | 1617323dca | ||
|   | bbf9358eba | ||
|   | 9682a2aea4 | ||
|   | c9fbb51775 | ||
|   | aa6d887214 | ||
|   | 13312527de | ||
|   | 9bd366f2a6 | ||
|   | 5de346bfef | ||
|   | 2af20b77b6 | ||
|   | 9affbf10a6 | ||
|   | c0acf3ae6d | ||
|   | 2c1b20e15f | ||
|   | 77290b6736 | ||
|   | 876f81db12 | ||
|   | 75f3ae14b5 | ||
|   | d26f248b0f | ||
|   | eeb3dfc991 | ||
|   | e66db2eab3 | ||
|   | 2ae7454f36 | ||
|   | 4fd3c63da9 | ||
|   | 909a6607c5 | ||
|   | 1bde397edf | ||
|   | 015c05fbf6 | ||
|   | 8ad5ccd2f8 | ||
|   | 115cc870c7 | ||
|   | 3112794d83 | ||
|   | 3528b067d0 | ||
|   | 0986b660be | ||
|   | 3bb5086173 | ||
|   | 69467842ab | ||
|   | 57077435ed | ||
|   | 46de0ed462 | ||
|   | 5086626805 | ||
|   | bbbcd8c631 | ||
|   | 3b61b85f2c | ||
|   | cd20f1bc0b | ||
|   | 8b52782ed4 | ||
|   | 849050be95 | ||
|   | 5c27a91684 | ||
|   | 764c472edb | ||
|   | d0529b7482 | ||
|   | 8f4621240a | ||
|   | e039add240 | ||
|   | dbd8d4d598 | ||
|   | 522542c486 | ||
|   | fc67c707e4 | ||
|   | c354e7e81b | ||
|   | bf40409d97 | ||
|   | 57d083730e | ||
|   | dc242e46c2 | ||
|   | 7e1d1003c9 | ||
|   | 3bb33d384f | ||
|   | 214f31257b | ||
|   | bfc87d13cb | ||
|   | 506ddc3d6c | ||
|   | 24564c77d6 | ||
|   | 18a21b67c2 | ||
|   | 3803fd9511 | ||
|   | 152d896f75 | ||
|   | 2f3a5f2001 | ||
|   | c3e8646af3 | ||
|   | 8c17b670fb | ||
|   | 0e098249b1 | ||
|   | 12d2e1f600 | ||
|   | c20b007985 | ||
|   | ef480e9120 | ||
|   | 8c1c77482d | ||
|   | e633606ca9 | ||
|   | 9a5f243f73 | ||
|   | 03f55b9485 | ||
|   | ef9ef87d91 | ||
|   | 0ee2c21da7 | ||
|   | 9b966561c4 | ||
|   | 8c0779a9db | ||
|   | 2c901cc015 | ||
|   | 85e66f69fa | ||
|   | a5585327dc | ||
|   | 268ebb1b18 | ||
|   | 40e820f551 | ||
|   | f9a11b3b18 | ||
|   | bd3c357212 | ||
|   | b4d108dac6 | ||
|   | 6585a5760b | ||
|   | 531be6c413 | ||
|   | f0c503b5a9 | ||
|   | 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 | 
							
								
								
									
										29
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										29
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -23,7 +23,7 @@ src/50-mutter-navigation.xml | ||||
| src/50-mutter-system.xml | ||||
| src/50-mutter-windows.xml | ||||
| src/mutter-wm.desktop | ||||
| src/mutter.desktop | ||||
| src/mutter-wayland.desktop | ||||
| *.o | ||||
| *.a | ||||
| *.lo | ||||
| @@ -46,11 +46,10 @@ POTFILES | ||||
| po/*.pot | ||||
| 50-metacity-desktop-key.xml | ||||
| 50-metacity-key.xml | ||||
| inlinepixbufs.h | ||||
| libmutter.pc | ||||
| mutter | ||||
| libmutter-wayland.pc | ||||
| mutter-wayland | ||||
| mutter-theme-viewer | ||||
| mutter.desktop | ||||
| mutter-wayland.desktop | ||||
| org.gnome.mutter.gschema.valid | ||||
| org.gnome.mutter.gschema.xml | ||||
| testasyncgetprop | ||||
| @@ -62,6 +61,7 @@ mutter-message | ||||
| mutter-window-demo | ||||
| focus-window | ||||
| test-attached | ||||
| test-focus | ||||
| test-gravity | ||||
| test-resizing | ||||
| test-size-hints | ||||
| @@ -74,4 +74,23 @@ src/mutter-enum-types.[ch] | ||||
| src/stamp-mutter-enum-types.h | ||||
| src/mutter-marshal.[ch] | ||||
| src/stamp-mutter-marshal.h | ||||
| src/meta-dbus-xrandr.[ch] | ||||
| src/meta-dbus-idle-monitor.[ch] | ||||
| src/mutter-plugins.pc | ||||
| doc/reference/*.args | ||||
| doc/reference/*.bak | ||||
| doc/reference/*.hierarchy | ||||
| doc/reference/*.interfaces | ||||
| doc/reference/*.prerequisites | ||||
| doc/reference/*.signals | ||||
| doc/reference/*.stamp | ||||
| doc/reference/html/ | ||||
| doc/reference/xml/ | ||||
| doc/reference/meta-decl-list.txt | ||||
| doc/reference/meta-decl.txt | ||||
| doc/reference/meta-overrides.txt | ||||
| doc/reference/meta-undeclared.txt | ||||
| doc/reference/meta-undocumented.txt | ||||
| doc/reference/meta-unused.txt | ||||
| doc/reference/meta-docs.sgml | ||||
| doc/reference/meta.types | ||||
|   | ||||
| @@ -1,6 +1,8 @@ | ||||
|  | ||||
| SUBDIRS=src po doc | ||||
| SUBDIRS=src protocol data 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 | ||||
|   | ||||
							
								
								
									
										238
									
								
								NEWS
									
									
									
									
									
								
							
							
						
						
									
										238
									
								
								NEWS
									
									
									
									
									
								
							| @@ -1,3 +1,241 @@ | ||||
| 3.9.90 | ||||
| ====== | ||||
| * First release from the wayland branch, includes basic support for running | ||||
|   as a wayland compositor [Robert, Neil, Giovanni] | ||||
| * Add support for _GTK_FRAME_EXTENTS [Jasper; #705766] | ||||
| * Fix quick consecutive <super> presses breaking keyboard input [Alban; #666101] | ||||
| * Work towards running as wayland compositor [Giovanni] | ||||
|  - Add DBus API for display configuration | ||||
|    [#705670, #706231, #706233, #706322, #706382] | ||||
|  - Add abstraction layer for cursor tracking [#705911] | ||||
|  - Add support for plugin modality under wayland [#705917] | ||||
| * Disable GTK+ scaling [Alexander; #706388] | ||||
| * Disable blending while updating tower [Robert] | ||||
| * Misc bug fixes and cleanups [Adel, Jasper, Giovanni, Colin, Rico, Florian; | ||||
|   #703332, #704437, #706207] | ||||
|  | ||||
| Contributors: | ||||
|   Robert Bragg, Giovanni Campagna, Alban Crequy, Adel Gadllah, | ||||
|   Alexander Larsson, Florian Müllner, Jasper St. Pierre, Neil Roberts, | ||||
|   Rico Tzschichholz, Colin Walters | ||||
|  | ||||
| Translations: | ||||
|   Jiro Matsuzawa [ja], Kjartan Maraas [nb], Matej Urbančič [sl], | ||||
|   Marek Černocký [cs], Daniel Mustieles [es], Rafael Ferreira [pt_BR], | ||||
|   Yaron Shahrabani [he], Ján Kyselica [sk] | ||||
|  | ||||
| 3.9.5 | ||||
| ===== | ||||
| * Don't select for touch events on the stage [Jasper; #697192] | ||||
| * Don't queue redraws for obscured regions [Adel; #703332] | ||||
| * Export timestamp of global keybinding events [Bastien; #704858] | ||||
| * Misc bug fixes and cleanups [Jasper, Rico; #703970] | ||||
|  | ||||
| Contributors: | ||||
|   Adel Gadllah, Bastien Nocera, Jasper St. Pierre, Rico Tzschichholz | ||||
|  | ||||
| 3.9.4 | ||||
| ===== | ||||
| * Tweak window shadows [Allan; #702141] | ||||
| * Ignore our own focus events for focus prediction [Jasper; #701017] | ||||
| * Add API to query if the stage is focused [Jasper; #700735] | ||||
| * Add API to query the monitor for a given position [Adel] | ||||
| * Don't force attached dialogs to be border-only [Florian; #702764] | ||||
| * Allow slicing of backgrounds to avoid texture size limits [Ray; #702283] | ||||
| * Miscellaneous bug fixes and cleanups [Adel; #701224, #702564] | ||||
|  | ||||
| Contributors: | ||||
|   Allan Day, Adel Gadllah, Florian Müllner, Jasper St. Pierre, Ray Strode | ||||
|  | ||||
| 3.9.3 | ||||
| ===== | ||||
| * Ensure events are always reported to the grab window [Rui; #701219] | ||||
| * Use new clutter_stage_set_paint_callback() function to prevent dropping | ||||
|   frames with frame synced toolkits [Owen; #698794] | ||||
|  | ||||
| Contributors: | ||||
|   Rui Matos, Owen W. Taylor | ||||
|  | ||||
| 3.9.2 | ||||
| ===== | ||||
| * Add meta_window_can_close() function [Jasper; #699269] | ||||
| * Add support for string-array preferences [Florian; #700223] | ||||
| * Fix a potential race condition with _NET_WM_MOVERESIZE [Jasper; #699777] | ||||
| * Fix shade window action [Stef; #693714] | ||||
| * Remove overlay_group [Giovanni; #700735] | ||||
| * Improve tracking of the focus window [Dan, Jasper; #647706] | ||||
| * Add API to freeze/unfreeze the keyboard [Rui; #697001] | ||||
| * Grab and emit a signal when XK_ISO_Next_Group is pressed [Rui; #697002] | ||||
| * Misc bug fixes and cleanups [Dieter, Jasper, Rui; #699636, #700735, #697000] | ||||
|  | ||||
| Contributors: | ||||
|   Giovanni Campagna, Rui Matos, Florian Müllner, Jasper St. Pierre, | ||||
|   Dieter Verfaillie, Stef Walter, Dan Winship | ||||
|  | ||||
| Translations: | ||||
|   Kjartan Maraas [nb], Ján Kyselica [sk] | ||||
|  | ||||
| 3.9.1 | ||||
| ===== | ||||
| * Fix miscellaneous memory leaks [Pavel; #698710] | ||||
| * Misc fixes and cleanups [Stef, Simon; #698179, #697758] | ||||
|  | ||||
| Contributors: | ||||
|   Simon McVittie, Pavel Vasin, Stef Walter | ||||
|  | ||||
| 3.8.1 | ||||
| ===== | ||||
| * Fix crash when getting default font [Bastien; #696814] | ||||
| * Fix ungrabbing of keybindings [Rui; #697003] | ||||
| * Misc fixes and cleanups [Jasper, Simon; #697758] | ||||
|  | ||||
| Contributors: | ||||
|   Jasper Lievisse Adriaanse, Rui Matos, Simon McVittie, Bastien Nocera | ||||
|  | ||||
| Translations: | ||||
|   Guillaume Desmottes [fr], Shankar Prasad [kn], Bruce Cowan [en_GB], | ||||
|   Andika Triwidada [id], Yaron Shahrabani [he], Kjartan Maraas [nb], | ||||
|   Gheyret Kenji [ug] | ||||
|  | ||||
| 3.8.0 | ||||
| ===== | ||||
| * Address major memory leak when changing backgrounds [Ray; #696157] | ||||
|  | ||||
| Contributors: | ||||
|   Ray Strode | ||||
|  | ||||
| Translations: | ||||
|   Sandeep Sheshrao Shedmake [mr], Victor Ibragimov [tg], Gabor Kelemen [hu], | ||||
|   Ville-Pekka Vainio [fi], Rajesh Ranjan [hi], Dr.T.Vasudevan [ta], | ||||
|   ManojKumar Giri [or], Yuri Myasoedov [ru], Petr Kovar [cs], | ||||
|   Jiro Matsuzawa [ja], Krishnababu Krothapalli [te], Ani Peter [ml], | ||||
|   Inaki Larranaga Murgoitio [eu] | ||||
|  | ||||
| 3.7.92 | ||||
| ====== | ||||
| * Build and improve reference docs [Tomeu; #676856, #695641, #695935] | ||||
| * Add tracking of whether there are fullscreen windows [Owen; 649748] | ||||
| * Misc bug fixes and cleanups [Adel, Giovanni, Owen, Jasper, Florian; #695269, | ||||
|   #695711, #694046, #695813, #695881, #676856, #696053, #682779, #696089, | ||||
|   #696091, #696087] | ||||
|  | ||||
| Contributors: | ||||
|   Giovanni Campagna, Adel Gadllah, Florian Müllner, Jasper St. Pierre, | ||||
|   Tomeu Vizoso, Owen W. Taylor | ||||
|  | ||||
| Translations: | ||||
|   Chao-Hsiung Liao [zh_HK, zh_TW], Rafael Ferreira [pt_BR], | ||||
|   Ihar Hrachyshka [be], Nilamdyuti Goswami [as], Matej Urbančič [sl], | ||||
|   Dimitris Spingos [el], Jan Kyselica [sk], Khaled Hosny [ar], | ||||
|   Мирослав Николић [sr, sr@latin], Duarte Loreto [pt], Sweta Kothari [gu], | ||||
|   Milo Casagrande [it], Changwoo Ryu [ko], Gil Forcada [ca], | ||||
|   Carles Ferrando [ca@valencia], Mattias Põldaru [et], Alexandre Franke [fr], | ||||
|   Ask H. Larsen [da], Rūdolfs Mazurs [lv], Nguyễn Thái Ngọc Duy [vi] | ||||
|  | ||||
| 3.7.91 | ||||
| ====== | ||||
| * Fix windows being treated as remote after hostname changes [Ray; #688716] | ||||
| * Add meta_window_get_all_monitors() method [Adel; #646861] | ||||
| * Add grab API for externally defined accelerators [Florian; #643111] | ||||
| * Make session registration an explicit step [Ray; #694876] | ||||
| * Avoid unnecessary stage redraws [Adel; #694988, #695006] | ||||
| * Misc fixes [Giovanni, Ray, Jasper, Rui, Pavel, Owen; #694801, #694725, | ||||
|   #694641, #694393, #678917, #695093, #694837, #695135, #694771, #694321] | ||||
|  | ||||
| Contributors: | ||||
|   Giovanni Campagna, Adel Gadllah, Rui Matos, Florian Müllner, | ||||
|   Jasper St. Pierre, Ray Strode, Owen Taylor, Pavel Vasin | ||||
|  | ||||
| Translations: | ||||
|   Daniel Mustieles [es], Yaron Shahrabani [he], A S Alam [pa], Piotr Drąg [pl], | ||||
|   Gheyret Kenji [ug], Alexandre Franke [fr], Milo Casagrande [it], | ||||
|   Fran Diéguez [gl], Dimitris Spingos [el], Мирослав Николић [sr, sr@latin], | ||||
|   Chao-Hsiung Liao [zh_HK, zh_TW], Nguyễn Thái Ngọc Duy [vi], | ||||
|   Aurimas Černius [lt], Mario Blättermann [de], Kjartan Maraas [nb] | ||||
|  | ||||
| 3.7.90 | ||||
| ====== | ||||
| * Support _NET_WM_OPAQUE_REGION [Jasper, Adel; #679901] | ||||
| * Add wrapper for XI2.3 pointer barriers [Jasper; #677215] | ||||
| * Update style of resize popups [Cosimo; #692741] | ||||
| * Implement compositor <-> application frame synchronization [Owen; #685463] | ||||
| * Handle animated backgrounds [Ray; #682427] | ||||
| * Add a new window group for override-redirect windows [Gayan; #633620] | ||||
| * Pass on pointer events on guard window to Clutter [Jasper; #681540] | ||||
| * Show correct shortcut in window menus [Giovanni; #694045] | ||||
| * Don't put minimized windows at the back of alt-tab [Jasper; #693991] | ||||
| * Misc bug fixes and cleanups [Jasper, Rico, Adel, Florian, Rui, Giovanni, | ||||
|   Owen; #692679, #693354, #690581, #693439, #692718, #693475, #693482, #693540, | ||||
|   #690580, #680990, #693833, #693922, #693854, #694224] | ||||
|  | ||||
| Contributors: | ||||
|   Giovanni Campagna, Cosimo Cecchi, Adel Gadllah, Rui Matos, Florian Müllner, | ||||
|   Gayan Perera, Jasper St. Pierre, Ray Strode, Owen Taylor, Rico Tzschichholz | ||||
|  | ||||
| Translations: | ||||
|   Fran Diéguez [gl], A S Alam [pa], Alexandre Franke [fr], Aurimas Černius [lt], | ||||
|   Мирослав Николић [sr, sr@latin], Fran Diéguez [gl], Piotr Drąg [pl], | ||||
|   Luca Ferretti [it], Daniel Mustieles [es] | ||||
|  | ||||
| 3.7.5 | ||||
| ===== | ||||
| * Don't allow multiline window titles [Jon; #683056] | ||||
| * Make meta_window_located_on_workspace() public [Jasper; #691744] | ||||
| * Request XI2.3 [Colin; #692877] | ||||
| * Add meta_window_set_icon_geometry() method [Florian; #692997] | ||||
| * Require XFixes 5.0 [Jasper; #677215] | ||||
| * Change unredirection hints to match spec changes [Adel; #693064] | ||||
| * Improve unredict heuristicts [Adel; #683786] | ||||
| * Misc bug fixes and cleanups [Florian, Jasper, Adel; #691874, #679901, | ||||
|   #692952, #693042] | ||||
|  | ||||
| Contributors: | ||||
|   Adel Gadllah, William Jon McCann, Florian Müllner, Jasper St. Pierre, | ||||
|   Colin Walters | ||||
|  | ||||
| Translations: | ||||
|   Daniel Mustieles [es], Ihar Hrachyshka [be], Nilamdyuti Goswami [as], | ||||
|   Gheyret Kenji [ug], Kjartan Maraas [nb], Yaron Shahrabani [he], | ||||
|   Piotr Drąg [pl], Chao-Hsiung Liao [zh_HK,zh_TW], Milo Casagrande [it] | ||||
|  | ||||
| 3.7.4 | ||||
| ===== | ||||
| * Add support for bypass compositor hints [Adel; #683020] | ||||
| * 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 | ||||
| === | ||||
|   | ||||
| @@ -5,9 +5,9 @@ srcdir=`dirname $0` | ||||
| test -z "$srcdir" && srcdir=. | ||||
|  | ||||
| PKG_NAME="mutter" | ||||
| REQUIRED_AUTOMAKE_VERSION=1.10 | ||||
| REQUIRED_AUTOMAKE_VERSION=1.13 | ||||
|  | ||||
| (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], [90]) | ||||
| 
 | ||||
| m4_define([mutter_version], | ||||
|           [mutter_major_version.mutter_minor_version.mutter_micro_version]) | ||||
| @@ -15,10 +15,14 @@ AC_INIT([mutter], [mutter_version], | ||||
| AC_CONFIG_SRCDIR(src/core/display.c) | ||||
| AC_CONFIG_HEADERS(config.h) | ||||
| 
 | ||||
| AM_INIT_AUTOMAKE([1.11 no-dist-gzip dist-xz tar-ustar]) | ||||
| AM_INIT_AUTOMAKE([1.11 foreign no-dist-gzip dist-xz tar-ustar]) | ||||
| m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])],) | ||||
| AM_MAINTAINER_MODE([enable]) | ||||
| 
 | ||||
| # Change pkglibdir and pkgdatadir to mutter-wayland instead of mutter | ||||
| PACKAGE="mutter-wayland" | ||||
| AC_SUBST([PACKAGE], [$PACKAGE]) | ||||
| 
 | ||||
| MUTTER_MAJOR_VERSION=mutter_major_version | ||||
| MUTTER_MINOR_VERSION=mutter_minor_version | ||||
| MUTTER_MICRO_VERSION=mutter_micro_version | ||||
| @@ -34,7 +38,7 @@ AC_SUBST(MUTTER_PLUGIN_DIR) | ||||
| # Honor aclocal flags | ||||
| AC_SUBST(ACLOCAL_AMFLAGS, "\${ACLOCAL_FLAGS}") | ||||
| 
 | ||||
| GETTEXT_PACKAGE=mutter | ||||
| GETTEXT_PACKAGE=mutter-wayland | ||||
| AC_SUBST(GETTEXT_PACKAGE) | ||||
| AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE",[Name of default gettext domain]) | ||||
| 
 | ||||
| @@ -71,10 +75,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 | ||||
| @@ -113,14 +119,32 @@ AC_ARG_ENABLE(shape, | ||||
|                  [disable mutter's use of the shaped window extension]),, | ||||
|   enable_shape=auto) | ||||
| 
 | ||||
| ## Wayland support requires the xserver.xml protocol extension found in the weston | ||||
| ## repository but since there aren't currently established conventions for | ||||
| ## installing and discovering these we simply require a location to be given | ||||
| ## explicitly... | ||||
| AC_ARG_WITH([wayland-protocols], | ||||
|             [AS_HELP_STRING([--with-wayland-protocols], [Location for wayland extension protocol specs])], | ||||
|             [ | ||||
|             ], | ||||
|             []) | ||||
| 
 | ||||
| AC_ARG_WITH([xwayland-path], | ||||
|             [AS_HELP_STRING([--with-xwayland-path], [Absolute path for an X Wayland server])], | ||||
|             [XWAYLAND_PATH="$withval"], | ||||
|             [XWAYLAND_PATH="$bindir/Xorg"]) | ||||
| 
 | ||||
| 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) | ||||
| PKG_CHECK_MODULES(MUTTER_LAUNCH, libdrm libsystemd-login) | ||||
| 
 | ||||
| saved_LIBS="$LIBS" | ||||
| LIBS="$LIBS $MUTTER_LAUNCH" | ||||
| AC_CHECK_FUNCS([sd_session_get_vt]) | ||||
| LIBS="$saved_LIBS" | ||||
| 
 | ||||
| # Unconditionally use this dir to avoid a circular dep with gnomecc | ||||
| GNOME_KEYBINDINGS_KEYSDIR="${datadir}/gnome-control-center/keybindings" | ||||
| @@ -199,8 +223,21 @@ if test x$have_xcursor = xyes; then | ||||
|   AC_DEFINE(HAVE_XCURSOR, , [Building with Xcursor support]) | ||||
| fi | ||||
| 
 | ||||
| # We always build with wayland enabled | ||||
| AC_DEFINE(HAVE_WAYLAND, , [Building with Wayland support]) | ||||
| 
 | ||||
| AC_PATH_PROG([WAYLAND_SCANNER],[wayland-scanner],[no]) | ||||
| AS_IF([test "x$WAYLAND_SCANNER" = "xno"], | ||||
|   AC_MSG_ERROR([Could not find wayland-scanner in your PATH, required for parsing wayland extension protocols])) | ||||
| AC_SUBST([WAYLAND_SCANNER]) | ||||
| AC_SUBST(XWAYLAND_PATH) | ||||
| 
 | ||||
| MUTTER_PC_MODULES="$MUTTER_PC_MODULES wayland-server libdrm" | ||||
| 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 +341,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 +395,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,12 +467,13 @@ 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/libmutter-wayland.pc | ||||
| src/compositor/plugins/Makefile | ||||
| protocol/Makefile | ||||
| data/Makefile | ||||
| po/Makefile.in | ||||
| ]) | ||||
| 
 | ||||
| @@ -455,7 +489,7 @@ fi | ||||
| 
 | ||||
| dnl ========================================================================== | ||||
| echo " | ||||
| mutter-$VERSION | ||||
| mutter-wayland-$VERSION | ||||
| 
 | ||||
| 	prefix:                   ${prefix} | ||||
| 	source code location:	  ${srcdir} | ||||
							
								
								
									
										3
									
								
								data/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								data/Makefile.am
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| defaultcursordir = $(pkgdatadir)/cursors | ||||
|  | ||||
| dist_defaultcursor_DATA = left_ptr.png | ||||
							
								
								
									
										
											BIN
										
									
								
								data/left_ptr.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								data/left_ptr.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 736 B | 
| @@ -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-wayland.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 | ||||
| @@ -11,6 +12,7 @@ src/core/display.c | ||||
| src/core/errors.c | ||||
| src/core/keybindings.c | ||||
| src/core/main.c | ||||
| src/core/monitor.c | ||||
| src/core/mutter.c | ||||
| src/core/prefs.c | ||||
| src/core/screen.c | ||||
| @@ -22,12 +24,9 @@ src/core/xprops.c | ||||
| src/mutter.desktop.in | ||||
| src/mutter-wm.desktop.in | ||||
| src/org.gnome.mutter.gschema.xml.in | ||||
| src/tools/mutter-message.c | ||||
| src/ui/frames.c | ||||
| src/ui/menu.c | ||||
| src/ui/metaaccellabel.c | ||||
| src/ui/resizepopup.c | ||||
| src/ui/theme.c | ||||
| src/ui/theme-parser.c | ||||
| src/ui/theme-viewer.c | ||||
|  | ||||
|   | ||||
										
											
												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
											
										
									
								
							
							
								
								
									
										1
									
								
								protocol/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								protocol/Makefile.am
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| EXTRA_DIST = xserver.xml | ||||
							
								
								
									
										18
									
								
								protocol/xserver.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								protocol/xserver.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | ||||
| <protocol name="xserver"> | ||||
|  | ||||
|   <interface name="xserver" version="1"> | ||||
|     <request name="set_window_id"> | ||||
|       <arg name="surface" type="object" interface="wl_surface"/> | ||||
|       <arg name="id" type="uint"/> | ||||
|     </request> | ||||
|  | ||||
|     <event name="client"> | ||||
|       <arg name="fd" type="fd"/> | ||||
|     </event> | ||||
|  | ||||
|     <event name="listen_socket"> | ||||
|       <arg name="fd" type="fd"/> | ||||
|     </event> | ||||
|   </interface> | ||||
|  | ||||
| </protocol> | ||||
| @@ -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"/> | ||||
|  | ||||
|   | ||||
							
								
								
									
										175
									
								
								src/Makefile.am
									
									
									
									
									
								
							
							
						
						
									
										175
									
								
								src/Makefile.am
									
									
									
									
									
								
							| @@ -1,12 +1,16 @@ | ||||
| # Flag build for parallelism; see https://savannah.gnu.org/patch/?6905 | ||||
| .AUTOPARALLEL: | ||||
|  | ||||
| lib_LTLIBRARIES = libmutter.la | ||||
| lib_LTLIBRARIES = libmutter-wayland.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$(top_builddir)						\ | ||||
| 	-I$(srcdir)							\ | ||||
| 	-I$(srcdir)/core						\ | ||||
| 	-I$(srcdir)/ui							\ | ||||
| @@ -26,24 +30,41 @@ INCLUDES=								\ | ||||
| 	-DMUTTER_PLUGIN_DIR=\"@MUTTER_PLUGIN_DIR@\"			\ | ||||
| 	-DGETTEXT_PACKAGE=\"$(GETTEXT_PACKAGE)\" | ||||
|  | ||||
| mutter_built_sources = \ | ||||
| 	mutter-enum-types.h \ | ||||
| 	mutter-enum-types.c | ||||
| INCLUDES += \ | ||||
| 	-I$(srcdir)/wayland						\ | ||||
| 	-I$(builddir)/wayland						\ | ||||
| 	-DXWAYLAND_PATH='"@XWAYLAND_PATH@"' | ||||
|  | ||||
| libmutter_la_SOURCES =				\ | ||||
| mutter_built_sources = \ | ||||
| 	$(dbus_idle_built_sources)		\ | ||||
| 	$(dbus_xrandr_built_sources)		\ | ||||
| 	mutter-enum-types.h 			\ | ||||
| 	mutter-enum-types.c			\ | ||||
| 	wayland/xserver-protocol.c		\ | ||||
| 	wayland/xserver-server-protocol.h	\ | ||||
| 	wayland/xserver-client-protocol.h | ||||
|  | ||||
| libmutter_wayland_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		\ | ||||
| @@ -52,6 +73,7 @@ libmutter_la_SOURCES =				\ | ||||
| 	compositor/meta-shadow-factory.c	\ | ||||
| 	compositor/meta-shadow-factory-private.h	\ | ||||
| 	compositor/meta-shaped-texture.c	\ | ||||
| 	compositor/meta-shaped-texture-private.h 	\ | ||||
| 	compositor/meta-texture-rectangle.c	\ | ||||
| 	compositor/meta-texture-rectangle.h	\ | ||||
| 	compositor/meta-texture-tower.c		\ | ||||
| @@ -65,7 +87,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 +106,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 +124,15 @@ libmutter_la_SOURCES =				\ | ||||
| 	core/keybindings.c			\ | ||||
| 	core/keybindings-private.h		\ | ||||
| 	core/main.c				\ | ||||
| 	core/meta-cursor-tracker.c		\ | ||||
| 	core/meta-cursor-tracker-private.h	\ | ||||
| 	core/meta-idle-monitor.c		\ | ||||
| 	core/meta-idle-monitor-private.h	\ | ||||
| 	core/meta-xrandr-shared.h		\ | ||||
| 	core/monitor.c				\ | ||||
| 	core/monitor-config.c			\ | ||||
| 	core/monitor-private.h			\ | ||||
| 	core/monitor-xrandr.c			\ | ||||
| 	core/mutter-Xatomtype.h			\ | ||||
| 	core/place.c				\ | ||||
| 	core/place.h				\ | ||||
| @@ -129,7 +162,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,16 +179,33 @@ 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 | ||||
| libmutter_la_LIBADD  = $(MUTTER_LIBS) | ||||
| libmutter_wayland_la_SOURCES +=			\ | ||||
| 	wayland/meta-wayland.c			\ | ||||
| 	wayland/meta-wayland-private.h		\ | ||||
| 	wayland/meta-xwayland-private.h		\ | ||||
| 	wayland/meta-xwayland.c			\ | ||||
| 	wayland/meta-wayland-data-device.c      \ | ||||
| 	wayland/meta-wayland-data-device.h      \ | ||||
| 	wayland/meta-wayland-keyboard.c		\ | ||||
| 	wayland/meta-wayland-keyboard.h		\ | ||||
| 	wayland/meta-wayland-pointer.c		\ | ||||
| 	wayland/meta-wayland-pointer.h		\ | ||||
| 	wayland/meta-wayland-seat.c		\ | ||||
| 	wayland/meta-wayland-seat.h		\ | ||||
| 	wayland/meta-wayland-stage.h		\ | ||||
| 	wayland/meta-wayland-stage.c		\ | ||||
| 	wayland/meta-weston-launch.c		\ | ||||
| 	wayland/meta-weston-launch.h | ||||
|  | ||||
| libmutter_wayland_la_LDFLAGS = -no-undefined | ||||
| libmutter_wayland_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 +217,10 @@ libmutterinclude_base_headers =		\ | ||||
| 	meta/keybindings.h			\ | ||||
| 	meta/main.h				\ | ||||
| 	meta/meta-background-actor.h		\ | ||||
| 	meta/meta-background-group.h		\ | ||||
| 	meta/meta-background.h			\ | ||||
| 	meta/meta-cursor-tracker.h		\ | ||||
| 	meta/meta-idle-monitor.h		\ | ||||
| 	meta/meta-plugin.h			\ | ||||
| 	meta/meta-shaped-texture.h		\ | ||||
| 	meta/meta-shadow-factory.h		\ | ||||
| @@ -183,22 +236,29 @@ 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 | ||||
| libmutterincludedir = $(includedir)/mutter-wayland/meta | ||||
|  | ||||
| libmutterinclude_HEADERS =			\ | ||||
| 	$(libmutterinclude_base_headers)	\ | ||||
| 	$(libmutterinclude_extra_headers) | ||||
|  | ||||
| mutter_theme_viewer_SOURCES=  \ | ||||
| 	ui/theme-viewer.c | ||||
| bin_PROGRAMS=mutter-wayland | ||||
|  | ||||
| bin_PROGRAMS=mutter mutter-theme-viewer | ||||
| mutter_wayland_SOURCES = core/mutter.c | ||||
| mutter_wayland_LDADD = $(MUTTER_LIBS) libmutter-wayland.la | ||||
|  | ||||
| mutter_SOURCES = core/mutter.c | ||||
| mutter_LDADD = $(MUTTER_LIBS) libmutter.la | ||||
| bin_PROGRAMS+=mutter-launch | ||||
|  | ||||
| mutter_launch_SOURCES = wayland/weston-launch.c wayland/weston-launch.h | ||||
|  | ||||
| mutter_launch_CFLAGS = $(MUTTER_LAUNCH_CFLAGS) -DLIBDIR=\"$(libdir)\" | ||||
| mutter_launch_LDFLAGS = $(MUTTER_LAUNCH_LIBS) -lpam | ||||
|  | ||||
| install-exec-hook: | ||||
| 	-chown root $(DESTDIR)$(bindir)/mutter-launch | ||||
| 	-chmod u+s $(DESTDIR)$(bindir)/mutter-launch | ||||
|  | ||||
| if HAVE_INTROSPECTION | ||||
| include $(INTROSPECTION_MAKEFILE) | ||||
| @@ -220,43 +280,36 @@ typelib_DATA = Meta-$(api_version).typelib | ||||
|  | ||||
| INTROSPECTION_GIRS = Meta-$(api_version).gir | ||||
|  | ||||
| Meta-$(api_version).gir: libmutter.la | ||||
| Meta-$(api_version).gir: libmutter-wayland.la | ||||
| @META_GIR@_INCLUDES = GObject-2.0 GDesktopEnums-3.0 Gdk-3.0 Gtk-3.0 Clutter-1.0 xlib-2.0 xfixes-4.0 Cogl-1.0 | ||||
| @META_GIR@_EXPORT_PACKAGES = libmutter | ||||
| @META_GIR@_EXPORT_PACKAGES = libmutter-wayland | ||||
| @META_GIR@_CFLAGS = $(INCLUDES) | ||||
| @META_GIR@_LIBS = libmutter.la | ||||
| @META_GIR@_LIBS = libmutter-wayland.la | ||||
| @META_GIR@_FILES =				\ | ||||
| 	mutter-enum-types.h			\ | ||||
| 	$(libmutterinclude_base_headers)	\ | ||||
| 	$(filter %.c,$(libmutter_la_SOURCES)) | ||||
| 	$(filter %.c,$(libmutter_wayland_la_SOURCES)) | ||||
| @META_GIR@_SCANNERFLAGS = --warn-all --warn-error | ||||
|  | ||||
| endif | ||||
|  | ||||
| mutter_theme_viewer_LDADD= $(MUTTER_LIBS) libmutter.la | ||||
|  | ||||
| testboxes_SOURCES = core/testboxes.c | ||||
| testgradient_SOURCES = ui/testgradient.c | ||||
| testasyncgetprop_SOURCES = core/testasyncgetprop.c | ||||
|  | ||||
| noinst_PROGRAMS=testboxes testgradient testasyncgetprop | ||||
|  | ||||
| testboxes_LDADD = $(MUTTER_LIBS) libmutter.la | ||||
| testgradient_LDADD = $(MUTTER_LIBS) libmutter.la | ||||
| testasyncgetprop_LDADD = $(MUTTER_LIBS) libmutter.la | ||||
| testboxes_LDADD = $(MUTTER_LIBS) libmutter-wayland.la | ||||
| testgradient_LDADD = $(MUTTER_LIBS) libmutter-wayland.la | ||||
| testasyncgetprop_LDADD = $(MUTTER_LIBS) libmutter-wayland.la | ||||
|  | ||||
| @INTLTOOL_DESKTOP_RULE@ | ||||
|  | ||||
| desktopfilesdir=$(datadir)/applications | ||||
| desktopfiles_in_files=mutter.desktop.in | ||||
| desktopfiles_in_files=mutter-wayland.desktop.in | ||||
| desktopfiles_files=$(desktopfiles_in_files:.desktop.in=.desktop) | ||||
| desktopfiles_DATA = $(desktopfiles_files) | ||||
|  | ||||
| wmpropertiesdir=$(datadir)/gnome/wm-properties | ||||
| wmproperties_in_files=mutter-wm.desktop.in | ||||
| wmproperties_files=$(wmproperties_in_files:.desktop.in=.desktop) | ||||
| wmproperties_DATA = $(wmproperties_files) | ||||
|  | ||||
| xmldir       = @GNOME_KEYBINDINGS_KEYSDIR@ | ||||
| xml_in_files = \ | ||||
|         50-mutter-navigation.xml.in	\ | ||||
| @@ -264,22 +317,17 @@ xml_in_files = \ | ||||
|         50-mutter-windows.xml.in | ||||
| xml_DATA     = $(xml_in_files:.xml.in=.xml) | ||||
|  | ||||
| gsettings_SCHEMAS = org.gnome.mutter.gschema.xml | ||||
| dbus_idle_built_sources = meta-dbus-idle-monitor.c meta-dbus-idle-monitor.h | ||||
|  | ||||
| gsettings_SCHEMAS = org.gnome.mutter.gschema.xml org.gnome.mutter.wayland.gschema.xml | ||||
| @INTLTOOL_XML_NOMERGE_RULE@ | ||||
| @GSETTINGS_RULES@ | ||||
|  | ||||
| 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-wayland.desktop			\ | ||||
| 	mutter-wm.desktop			\ | ||||
| 	org.gnome.mutter.gschema.xml		\ | ||||
| 	$(xml_DATA)				\ | ||||
| @@ -287,12 +335,9 @@ 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 | ||||
| pkgconfig_DATA = libmutter-wayland.pc | ||||
|  | ||||
| EXTRA_DIST=$(desktopfiles_files) 	\ | ||||
| 	$(wmproperties_files)		\ | ||||
| @@ -302,12 +347,11 @@ EXTRA_DIST=$(desktopfiles_files) 	\ | ||||
| 	$(xml_in_files)			\ | ||||
| 	org.gnome.mutter.gschema.xml.in \ | ||||
| 	mutter-schemas.convert \ | ||||
| 	libmutter.pc.in \ | ||||
| 	mutter-plugins.pc.in  \ | ||||
| 	libmutter-wayland.pc.in \ | ||||
| 	mutter-enum-types.h.in \ | ||||
| 	mutter-enum-types.c.in | ||||
|  | ||||
| BUILT_SOURCES += $(mutter_built_sources) | ||||
| BUILT_SOURCES = $(mutter_built_sources) | ||||
| MUTTER_STAMP_FILES = stamp-mutter-enum-types.h | ||||
| CLEANFILES += $(MUTTER_STAMP_FILES) | ||||
|  | ||||
| @@ -329,3 +373,32 @@ mutter-enum-types.c: stamp-mutter-enum-types.h mutter-enum-types.c.in | ||||
| 	  $(libmutterinclude_base_headers) ) >> xgen-tetc && \ | ||||
| 	cp xgen-tetc mutter-enum-types.c && \ | ||||
| 	rm -f xgen-tetc | ||||
|  | ||||
| dbus_xrandr_built_sources = meta-dbus-xrandr.c meta-dbus-xrandr.h | ||||
|  | ||||
| $(dbus_xrandr_built_sources) : Makefile.am xrandr.xml | ||||
| 	$(AM_V_GEN)gdbus-codegen							\ | ||||
| 		--interface-prefix org.gnome.Mutter					\ | ||||
| 		--c-namespace MetaDBus							\ | ||||
| 		--generate-c-code meta-dbus-xrandr					\ | ||||
| 		$(srcdir)/xrandr.xml | ||||
|  | ||||
| dbus_idle_built_sources = meta-dbus-idle-monitor.c meta-dbus-idle-monitor.h | ||||
|  | ||||
| $(dbus_idle_built_sources) : Makefile.am idle-monitor.xml | ||||
| 	$(AM_V_GEN)gdbus-codegen							\ | ||||
| 		--interface-prefix org.gnome.Mutter					\ | ||||
| 		--c-namespace MetaDBus							\ | ||||
| 		--generate-c-code meta-dbus-idle-monitor				\ | ||||
| 		--c-generate-object-manager						\ | ||||
| 		$(srcdir)/idle-monitor.xml | ||||
|  | ||||
| wayland/%-protocol.c : $(top_builddir)/protocol/%.xml | ||||
| 	mkdir -p wayland | ||||
| 	$(AM_V_GEN)$(WAYLAND_SCANNER) code < $< > $@ | ||||
| wayland/%-server-protocol.h : $(top_builddir)/protocol/%.xml | ||||
| 	mkdir -p wayland | ||||
| 	$(AM_V_GEN)$(WAYLAND_SCANNER) server-header < $< > $@ | ||||
| wayland/%-client-protocol.h : $(top_builddir)/protocol/%.xml | ||||
| 	mkdir -p wayland | ||||
| 	$(AM_V_GEN)$(WAYLAND_SCANNER) client-header < $< > $@ | ||||
|   | ||||
							
								
								
									
										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,18 +59,22 @@ struct _MetaCompScreen | ||||
|   MetaPluginManager *plugin_mgr; | ||||
| }; | ||||
|  | ||||
| /* Wait 2ms after vblank before starting to draw next frame */ | ||||
| #define META_SYNC_DELAY 2 | ||||
|  | ||||
| void meta_switch_workspace_completed (MetaScreen    *screen); | ||||
|  | ||||
| gboolean meta_begin_modal_for_plugin (MetaScreen       *screen, | ||||
|                                       MetaPlugin       *plugin, | ||||
|                                       Window            grab_window, | ||||
|                                       Cursor            cursor, | ||||
|                                       MetaModalOptions  options, | ||||
|                                       guint32           timestamp); | ||||
| void     meta_end_modal_for_plugin   (MetaScreen       *screen, | ||||
|                                       MetaPlugin       *plugin, | ||||
|                                       guint32           timestamp); | ||||
|  | ||||
| gint64 meta_compositor_monotonic_time_to_server_time (MetaDisplay *display, | ||||
|                                                       gint64       monotonic_time); | ||||
|  | ||||
| void meta_check_end_modal (MetaScreen *screen); | ||||
|  | ||||
| #endif /* META_COMPOSITOR_PRIVATE_H */ | ||||
|   | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -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 */ | ||||
							
								
								
									
										110
									
								
								src/compositor/meta-background-group.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										110
									
								
								src/compositor/meta-background-group.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,110 @@ | ||||
| /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ | ||||
|  | ||||
| /** | ||||
|  * SECTION:meta-background-group | ||||
|  * @title: MetaBackgroundGroup | ||||
|  * @short_description: Container for background actors | ||||
|  * | ||||
|  * This class is a subclass of ClutterActor with special handling for | ||||
|  * MetaBackgroundActor/MetaBackgroundGroup when painting children. | ||||
|  * It makes sure to only draw the parts of the backgrounds not | ||||
|  * occluded by opaque windows. | ||||
|  * | ||||
|  * See #MetaWindowGroup for more information behind the motivation, | ||||
|  * and details on implementation. | ||||
|  */ | ||||
|  | ||||
| #include <config.h> | ||||
|  | ||||
| #include "compositor-private.h" | ||||
| #include "clutter-utils.h" | ||||
| #include "meta-background-actor-private.h" | ||||
| #include "meta-background-group-private.h" | ||||
|  | ||||
| G_DEFINE_TYPE (MetaBackgroundGroup, meta_background_group, CLUTTER_TYPE_ACTOR); | ||||
|  | ||||
| struct _MetaBackgroundGroupPrivate | ||||
| { | ||||
|   gpointer dummy; | ||||
| }; | ||||
|  | ||||
| static void | ||||
| meta_background_group_dispose (GObject *object) | ||||
| { | ||||
|   G_OBJECT_CLASS (meta_background_group_parent_class)->dispose (object); | ||||
| } | ||||
|  | ||||
| static gboolean | ||||
| meta_background_group_get_paint_volume (ClutterActor       *actor, | ||||
|                                         ClutterPaintVolume *volume) | ||||
| { | ||||
|   return clutter_paint_volume_set_from_allocation (volume, actor); | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_background_group_class_init (MetaBackgroundGroupClass *klass) | ||||
| { | ||||
|   GObjectClass *object_class = G_OBJECT_CLASS (klass); | ||||
|   ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass); | ||||
|  | ||||
|   actor_class->get_paint_volume = meta_background_group_get_paint_volume; | ||||
|   object_class->dispose = meta_background_group_dispose; | ||||
|  | ||||
|   g_type_class_add_private (klass, sizeof (MetaBackgroundGroupPrivate)); | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_background_group_init (MetaBackgroundGroup *self) | ||||
| { | ||||
|   self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, | ||||
|                                             META_TYPE_BACKGROUND_GROUP, | ||||
|                                             MetaBackgroundGroupPrivate); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * meta_background_group_set_visible_region: | ||||
|  * @self: a #MetaBackgroundGroup | ||||
|  * @visible_region: (allow-none): the parts of the background to paint | ||||
|  * | ||||
|  * Sets the area of the backgrounds that is unobscured by overlapping windows. | ||||
|  * This is used to optimize and only paint the visible portions. | ||||
|  */ | ||||
| void | ||||
| meta_background_group_set_visible_region (MetaBackgroundGroup *self, | ||||
|                                           cairo_region_t      *region) | ||||
| { | ||||
|   GList *children, *l; | ||||
|  | ||||
|   children = clutter_actor_get_children (CLUTTER_ACTOR (self)); | ||||
|   for (l = children; l; l = l->next) | ||||
|     { | ||||
|       ClutterActor *actor = l->data; | ||||
|  | ||||
|       if (META_IS_BACKGROUND_ACTOR (actor)) | ||||
|         { | ||||
|           meta_background_actor_set_visible_region (META_BACKGROUND_ACTOR (actor), region); | ||||
|         } | ||||
|       else if (META_IS_BACKGROUND_GROUP (actor)) | ||||
|         { | ||||
|           int x, y; | ||||
|  | ||||
|           if (!meta_actor_is_untransformed (actor, &x, &y)) | ||||
|             continue; | ||||
|  | ||||
|           cairo_region_translate (region, -x, -y); | ||||
|           meta_background_group_set_visible_region (META_BACKGROUND_GROUP (actor), region); | ||||
|           cairo_region_translate (region, x, y); | ||||
|         } | ||||
|     } | ||||
|   g_list_free (children); | ||||
| } | ||||
|  | ||||
| ClutterActor * | ||||
| meta_background_group_new (void) | ||||
| { | ||||
|   MetaBackgroundGroup *background_group; | ||||
|  | ||||
|   background_group = g_object_new (META_TYPE_BACKGROUND_GROUP, NULL); | ||||
|  | ||||
|   return CLUTTER_ACTOR (background_group); | ||||
| } | ||||
							
								
								
									
										1275
									
								
								src/compositor/meta-background.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1275
									
								
								src/compositor/meta-background.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -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 | ||||
| @@ -320,6 +329,28 @@ meta_plugin_manager_xevent_filter (MetaPluginManager *plugin_mgr, | ||||
|    */ | ||||
|   if (klass->xevent_filter) | ||||
|     return klass->xevent_filter (plugin, xev); | ||||
|   else | ||||
|     return clutter_x11_handle_event (xev) != CLUTTER_X11_FILTER_CONTINUE; | ||||
|  | ||||
|   /* When mutter is running as a wayland compositor, things like input | ||||
|    * events just come directly from clutter so it won't have disabled | ||||
|    * clutter's event retrieval and won't need to forward it events (if | ||||
|    * it did it would lead to recursion). Also when running as a | ||||
|    * wayland compositor we shouldn't be assuming that we're running | ||||
|    * with the clutter x11 backend. | ||||
|    */ | ||||
|   if (meta_is_wayland_compositor ()) | ||||
|     return FALSE; | ||||
|  | ||||
|   return clutter_x11_handle_event (xev) != CLUTTER_X11_FILTER_CONTINUE; | ||||
| } | ||||
|  | ||||
| void | ||||
| 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); | ||||
|  | ||||
| @@ -259,10 +267,6 @@ meta_plugin_destroy_completed (MetaPlugin      *plugin, | ||||
| /** | ||||
|  * meta_plugin_begin_modal: | ||||
|  * @plugin: a #MetaPlugin | ||||
|  * @grab_window: the X window to grab the keyboard and mouse on | ||||
|  * @cursor: the cursor to use for the pointer grab, or None, | ||||
|  *          to use the normal cursor for the grab window and | ||||
|  *          its descendants. | ||||
|  * @options: flags that modify the behavior of the modal grab | ||||
|  * @timestamp: the timestamp used for establishing grabs | ||||
|  * | ||||
| @@ -283,15 +287,13 @@ meta_plugin_destroy_completed (MetaPlugin      *plugin, | ||||
|  */ | ||||
| gboolean | ||||
| meta_plugin_begin_modal (MetaPlugin       *plugin, | ||||
|                          Window            grab_window, | ||||
|                          Cursor            cursor, | ||||
|                          MetaModalOptions  options, | ||||
|                          guint32           timestamp) | ||||
| { | ||||
|   MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv; | ||||
|  | ||||
|   return meta_begin_modal_for_plugin (priv->screen, plugin, | ||||
|                                       grab_window, cursor, options, timestamp); | ||||
|                                       options, timestamp); | ||||
| } | ||||
|  | ||||
| /** | ||||
| @@ -331,3 +333,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 * | ||||
|   | ||||
							
								
								
									
										44
									
								
								src/compositor/meta-shaped-texture-private.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								src/compositor/meta-shaped-texture-private.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,44 @@ | ||||
| /* | ||||
|  * shaped texture | ||||
|  * | ||||
|  * An actor to draw a texture clipped to a list of rectangles | ||||
|  * | ||||
|  * Authored By Neil Roberts  <neil@linux.intel.com> | ||||
|  * | ||||
|  * Copyright (C) 2008 Intel Corporation | ||||
|  *               2013 Red Hat, Inc. | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or | ||||
|  * modify it under the terms of the GNU General Public License as | ||||
|  * published by the Free Software Foundation; either version 2 of the | ||||
|  * License, or (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, but | ||||
|  * WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  * General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with this program; if not, write to the Free Software | ||||
|  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA | ||||
|  * 02111-1307, USA. | ||||
|  */ | ||||
|  | ||||
| #ifndef __META_SHAPED_TEXTURE_PRIVATE_H__ | ||||
| #define __META_SHAPED_TEXTURE_PRIVATE_H__ | ||||
|  | ||||
| #include <meta/meta-shaped-texture.h> | ||||
| #include "meta-wayland-private.h" | ||||
|  | ||||
| ClutterActor *meta_shaped_texture_new_with_xwindow (Window xwindow); | ||||
| ClutterActor *meta_shaped_texture_new_with_wayland_surface  (MetaWaylandSurface *surface); | ||||
| void meta_shaped_texture_set_wayland_surface                (MetaShapedTexture  *stex, | ||||
|                                                              MetaWaylandSurface *surface); | ||||
| MetaWaylandSurface *meta_shaped_texture_get_wayland_surface (MetaShapedTexture *stex); | ||||
|  | ||||
| void meta_shaped_texture_set_pixmap (MetaShapedTexture *stex, | ||||
|                                      Pixmap             pixmap); | ||||
| void meta_shaped_texture_attach_wayland_buffer (MetaShapedTexture  *stex, | ||||
|                                                 MetaWaylandBuffer  *buffer); | ||||
|  | ||||
| #endif | ||||
| @@ -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,14 +21,22 @@ | ||||
|  * 02111-1307, USA. | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * SECTION:meta-shaped-texture | ||||
|  * @title: MetaShapedTexture | ||||
|  * @short_description: An actor to draw a masked texture. | ||||
|  */ | ||||
|  | ||||
| #include <config.h> | ||||
|  | ||||
| #define CLUTTER_ENABLE_EXPERIMENTAL_API | ||||
| #define COGL_ENABLE_EXPERIMENTAL_API | ||||
|  | ||||
| #include <meta/meta-shaped-texture.h> | ||||
| #include <meta/util.h> | ||||
| #include "meta-texture-tower.h" | ||||
|  | ||||
| #include "meta-shaped-texture-private.h" | ||||
| #include "meta-wayland-private.h" | ||||
| #include <cogl/cogl-wayland-server.h> | ||||
|  | ||||
| #include <clutter/clutter.h> | ||||
| #include <cogl/cogl.h> | ||||
| #include <cogl/cogl-texture-pixmap-x11.h> | ||||
| @@ -56,6 +60,13 @@ static void meta_shaped_texture_get_preferred_height (ClutterActor *self, | ||||
|  | ||||
| static gboolean meta_shaped_texture_get_paint_volume (ClutterActor *self, ClutterPaintVolume *volume); | ||||
|  | ||||
| typedef enum _MetaShapedTextureType | ||||
| { | ||||
|   META_SHAPED_TEXTURE_TYPE_X11_PIXMAP, | ||||
|   META_SHAPED_TEXTURE_TYPE_WAYLAND_SURFACE, | ||||
| } MetaShapedTextureType; | ||||
|  | ||||
|  | ||||
| G_DEFINE_TYPE (MetaShapedTexture, meta_shaped_texture, | ||||
|                CLUTTER_TYPE_ACTOR); | ||||
|  | ||||
| @@ -66,13 +77,25 @@ G_DEFINE_TYPE (MetaShapedTexture, meta_shaped_texture, | ||||
| struct _MetaShapedTexturePrivate | ||||
| { | ||||
|   MetaTextureTower *paint_tower; | ||||
|   Pixmap pixmap; | ||||
|   CoglHandle texture; | ||||
|   CoglHandle mask_texture; | ||||
|   CoglHandle material; | ||||
|   CoglHandle material_unshaped; | ||||
|  | ||||
|   MetaShapedTextureType type; | ||||
|   union { | ||||
|     struct { | ||||
|       Pixmap pixmap; | ||||
|     } x11; | ||||
|     struct { | ||||
|       MetaWaylandSurface *surface; | ||||
|     } wayland; | ||||
|   }; | ||||
|  | ||||
|   CoglTexture *texture; | ||||
|  | ||||
|   CoglTexture *mask_texture; | ||||
|   CoglPipeline *pipeline; | ||||
|   CoglPipeline *pipeline_unshaped; | ||||
|  | ||||
|   cairo_region_t *clip_region; | ||||
|   cairo_region_t *input_shape_region; | ||||
|  | ||||
|   guint tex_width, tex_height; | ||||
|  | ||||
| @@ -104,8 +127,11 @@ 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->type = META_SHAPED_TEXTURE_TYPE_X11_PIXMAP; | ||||
|   priv->texture = NULL; | ||||
|  | ||||
|   priv->mask_texture = NULL; | ||||
|   priv->create_mipmaps = TRUE; | ||||
| } | ||||
|  | ||||
| @@ -119,41 +145,79 @@ 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); | ||||
| } | ||||
|  | ||||
| static void | ||||
| set_cogl_texture (MetaShapedTexture *stex, | ||||
|                   CoglTexture       *cogl_tex) | ||||
| { | ||||
|   MetaShapedTexturePrivate *priv; | ||||
|   guint width, height; | ||||
|  | ||||
|   g_return_if_fail (META_IS_SHAPED_TEXTURE (stex)); | ||||
|  | ||||
|   priv = stex->priv; | ||||
|  | ||||
|   if (priv->texture) | ||||
|     cogl_object_unref (priv->texture); | ||||
|  | ||||
|   priv->texture = cogl_tex; | ||||
|  | ||||
|   if (priv->pipeline != NULL) | ||||
|     cogl_pipeline_set_layer_texture (priv->pipeline, 0, COGL_TEXTURE (cogl_tex)); | ||||
|  | ||||
|   if (priv->pipeline_unshaped != NULL) | ||||
|     cogl_pipeline_set_layer_texture (priv->pipeline_unshaped, 0, COGL_TEXTURE (cogl_tex)); | ||||
|  | ||||
|   if (cogl_tex != NULL) | ||||
|     { | ||||
|       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) | ||||
|         { | ||||
|           priv->tex_width = width; | ||||
|           priv->tex_height = height; | ||||
|  | ||||
|           clutter_actor_queue_relayout (CLUTTER_ACTOR (stex)); | ||||
|         } | ||||
|     } | ||||
|   else | ||||
|     { | ||||
|       /* size changed to 0 going to an invalid handle */ | ||||
|       priv->tex_width = 0; | ||||
|       priv->tex_height = 0; | ||||
|       clutter_actor_queue_relayout (CLUTTER_ACTOR (stex)); | ||||
|     } | ||||
|  | ||||
|   /* NB: We don't queue a redraw of the actor here because we don't | ||||
|    * know how much of the buffer has changed with respect to the | ||||
|    * previous buffer. We only queue a redraw in response to surface | ||||
|    * damage. */ | ||||
| } | ||||
|  | ||||
| static void | ||||
| 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 +243,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 +254,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); | ||||
|  | ||||
| @@ -294,38 +362,53 @@ meta_shaped_texture_pick (ClutterActor       *actor, | ||||
|   MetaShapedTexture *stex = (MetaShapedTexture *) actor; | ||||
|   MetaShapedTexturePrivate *priv = stex->priv; | ||||
|  | ||||
|   if (!clutter_actor_should_pick_paint (actor) || | ||||
|       (priv->clip_region && cairo_region_is_empty (priv->clip_region))) | ||||
|     return; | ||||
|  | ||||
|   /* If there is no region then use the regular pick */ | ||||
|   if (priv->mask_texture == COGL_INVALID_HANDLE) | ||||
|   if (priv->input_shape_region == NULL) | ||||
|     CLUTTER_ACTOR_CLASS (meta_shaped_texture_parent_class) | ||||
|       ->pick (actor, color); | ||||
|   else if (clutter_actor_should_pick_paint (actor)) | ||||
|   else | ||||
|     { | ||||
|       CoglHandle paint_tex; | ||||
|       ClutterActorBox alloc; | ||||
|       guint tex_width, tex_height; | ||||
|       int n_rects; | ||||
|       float *rectangles; | ||||
|       int i; | ||||
|  | ||||
|       paint_tex = priv->texture; | ||||
|       /* Note: We don't bother trying to intersect the pick and clip regions | ||||
|        * since needing to copy the region, do the intersection, and probably | ||||
|        * increase the number of rectangles seems more likely to have a negative | ||||
|        * effect. | ||||
|        * | ||||
|        * NB: Most of the time when just using rectangles for picking then | ||||
|        * picking shouldn't involve any rendering, and minimizing the number of | ||||
|        * rectangles has more benefit than reducing the area of the pick | ||||
|        * region. | ||||
|        */ | ||||
|  | ||||
|       if (paint_tex == COGL_INVALID_HANDLE) | ||||
|         return; | ||||
|       n_rects = cairo_region_num_rectangles (priv->input_shape_region); | ||||
|       rectangles = g_alloca (sizeof (float) * 4 * n_rects); | ||||
|  | ||||
|       tex_width = cogl_texture_get_width (paint_tex); | ||||
|       tex_height = cogl_texture_get_height (paint_tex); | ||||
|       for (i = 0; i < n_rects; i++) | ||||
|         { | ||||
|           cairo_rectangle_int_t rect; | ||||
|           int pos = i * 4; | ||||
|  | ||||
|       if (tex_width == 0 || tex_height == 0) /* no contents yet */ | ||||
|         return; | ||||
|           cairo_region_get_rectangle (priv->input_shape_region, i, &rect); | ||||
|  | ||||
|       cogl_set_source_color4ub (color->red, color->green, color->blue, | ||||
|                                  color->alpha); | ||||
|           rectangles[pos] = rect.x; | ||||
|           rectangles[pos + 1] = rect.y; | ||||
|           rectangles[pos + 2] = rect.x + rect.width; | ||||
|           rectangles[pos + 3] = rect.y + rect.height; | ||||
|         } | ||||
|  | ||||
|       clutter_actor_get_allocation_box (actor, &alloc); | ||||
|       cogl_set_source_color4ub (color->red, | ||||
|                                 color->green, | ||||
|                                 color->blue, | ||||
|                                 color->alpha); | ||||
|  | ||||
|       /* Paint the mask rectangle in the given color */ | ||||
|       cogl_set_source_texture (priv->mask_texture); | ||||
|       cogl_rectangle_with_texture_coords (0, 0, | ||||
|                                           alloc.x2 - alloc.x1, | ||||
|                                           alloc.y2 - alloc.y1, | ||||
|                                           0, 0, 1, 1); | ||||
|       cogl_rectangles (rectangles, n_rects); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @@ -375,11 +458,45 @@ meta_shaped_texture_get_paint_volume (ClutterActor *self, | ||||
| } | ||||
|  | ||||
| ClutterActor * | ||||
| meta_shaped_texture_new (void) | ||||
| meta_shaped_texture_new_with_wayland_surface (MetaWaylandSurface *surface) | ||||
| { | ||||
|   ClutterActor *self = g_object_new (META_TYPE_SHAPED_TEXTURE, NULL); | ||||
|   ClutterActor *actor = g_object_new (META_TYPE_SHAPED_TEXTURE, NULL); | ||||
|   MetaShapedTexturePrivate *priv = META_SHAPED_TEXTURE (actor)->priv; | ||||
|  | ||||
|   return self; | ||||
|   /* XXX: it could probably be better to have a "type" construct-only | ||||
|    * property or create wayland/x11 subclasses */ | ||||
|   priv->type = META_SHAPED_TEXTURE_TYPE_WAYLAND_SURFACE; | ||||
|  | ||||
|   meta_shaped_texture_set_wayland_surface (META_SHAPED_TEXTURE (actor), | ||||
|                                            surface); | ||||
|  | ||||
|   return actor; | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_shaped_texture_set_wayland_surface (MetaShapedTexture *stex, | ||||
|                                          MetaWaylandSurface *surface) | ||||
| { | ||||
|   MetaShapedTexturePrivate *priv = stex->priv; | ||||
|  | ||||
|   priv->wayland.surface = surface; | ||||
|  | ||||
|   if (surface && surface->buffer_ref.buffer) | ||||
|     meta_shaped_texture_attach_wayland_buffer (stex, | ||||
|                                                surface->buffer_ref.buffer); | ||||
| } | ||||
|  | ||||
| MetaWaylandSurface * | ||||
| meta_shaped_texture_get_wayland_surface (MetaShapedTexture *stex) | ||||
| { | ||||
|   MetaShapedTexturePrivate *priv = stex->priv; | ||||
|   return priv->wayland.surface; | ||||
| } | ||||
|  | ||||
| ClutterActor * | ||||
| meta_shaped_texture_new_with_xwindow (Window xwindow) | ||||
| { | ||||
|   return g_object_new (META_TYPE_SHAPED_TEXTURE, NULL); | ||||
| } | ||||
|  | ||||
| void | ||||
| @@ -396,17 +513,16 @@ 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; | ||||
|       base_texture = create_mipmaps ? 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,88 +530,153 @@ 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)); | ||||
| } | ||||
|  | ||||
| static void | ||||
| wayland_surface_update_area (MetaShapedTexture *stex, | ||||
|                              int                x, | ||||
|                              int                y, | ||||
|                              int                width, | ||||
|                              int                height) | ||||
| { | ||||
|   MetaShapedTexturePrivate *priv; | ||||
|   MetaWaylandBuffer *buffer; | ||||
|  | ||||
|   priv = stex->priv; | ||||
|  | ||||
|   g_return_if_fail (priv->type == META_SHAPED_TEXTURE_TYPE_WAYLAND_SURFACE); | ||||
|   g_return_if_fail (priv->texture != NULL); | ||||
|  | ||||
|   buffer = priv->wayland.surface->buffer_ref.buffer; | ||||
|  | ||||
|   if (buffer) | ||||
|     { | ||||
|       struct wl_resource *resource = buffer->resource; | ||||
|       struct wl_shm_buffer *shm_buffer = wl_shm_buffer_get (resource); | ||||
|  | ||||
|       if (shm_buffer) | ||||
|         { | ||||
|           CoglPixelFormat format; | ||||
|  | ||||
|           switch (wl_shm_buffer_get_format (shm_buffer)) | ||||
|             { | ||||
| #if G_BYTE_ORDER == G_BIG_ENDIAN | ||||
|             case WL_SHM_FORMAT_ARGB8888: | ||||
|               format = COGL_PIXEL_FORMAT_ARGB_8888_PRE; | ||||
|               break; | ||||
|             case WL_SHM_FORMAT_XRGB8888: | ||||
|               format = COGL_PIXEL_FORMAT_ARGB_8888; | ||||
|               break; | ||||
| #elif G_BYTE_ORDER == G_LITTLE_ENDIAN | ||||
|             case WL_SHM_FORMAT_ARGB8888: | ||||
|               format = COGL_PIXEL_FORMAT_BGRA_8888_PRE; | ||||
|               break; | ||||
|             case WL_SHM_FORMAT_XRGB8888: | ||||
|               format = COGL_PIXEL_FORMAT_BGRA_8888; | ||||
|               break; | ||||
| #endif | ||||
|             default: | ||||
|               g_warn_if_reached (); | ||||
|               format = COGL_PIXEL_FORMAT_ARGB_8888; | ||||
|             } | ||||
|  | ||||
|           cogl_texture_set_region (priv->texture, | ||||
|                                    x, y, | ||||
|                                    x, y, | ||||
|                                    width, height, | ||||
|                                    width, height, | ||||
|                                    format, | ||||
|                                    wl_shm_buffer_get_stride (shm_buffer), | ||||
|                                    wl_shm_buffer_get_data (shm_buffer)); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void | ||||
| queue_damage_redraw_with_clip (MetaShapedTexture *stex, | ||||
|                                int x, | ||||
|                                int y, | ||||
|                                int width, | ||||
|                                int height) | ||||
| { | ||||
|   ClutterActor *self = CLUTTER_ACTOR (stex); | ||||
|   MetaShapedTexturePrivate *priv; | ||||
|   ClutterActorBox allocation; | ||||
|   float scale_x; | ||||
|   float scale_y; | ||||
|   cairo_rectangle_int_t clip; | ||||
|  | ||||
|   /* NB: clutter_actor_queue_redraw_with_clip expects a box in the actor's | ||||
|    * coordinate space so we need to convert from surface coordinates to | ||||
|    * actor coordinates... | ||||
|    */ | ||||
|  | ||||
|   /* Calling clutter_actor_get_allocation_box() is enormously expensive | ||||
|    * if the actor has an out-of-date allocation, since it triggers | ||||
|    * a full redraw. clutter_actor_queue_redraw_with_clip() would redraw | ||||
|    * the whole stage anyways in that case, so just go ahead and do | ||||
|    * it here. | ||||
|    */ | ||||
|   if (!clutter_actor_has_allocation (self)) | ||||
|     { | ||||
|       clutter_actor_queue_redraw (self); | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|   priv = stex->priv; | ||||
|  | ||||
|   if (priv->tex_width == 0 || priv->tex_height == 0) | ||||
|     return; | ||||
|  | ||||
|   clutter_actor_get_allocation_box (self, &allocation); | ||||
|  | ||||
|   scale_x = (allocation.x2 - allocation.x1) / priv->tex_width; | ||||
|   scale_y = (allocation.y2 - allocation.y1) / priv->tex_height; | ||||
|  | ||||
|   clip.x = x * scale_x; | ||||
|   clip.y = y * scale_y; | ||||
|   clip.width = width * scale_x; | ||||
|   clip.height = height * scale_y; | ||||
|   clutter_actor_queue_redraw_with_clip (self, &clip); | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_shaped_texture_update_area (MetaShapedTexture *stex, | ||||
| 				 int                x, | ||||
| 				 int                y, | ||||
| 				 int                width, | ||||
| 				 int                height) | ||||
|                                  int                x, | ||||
|                                  int                y, | ||||
|                                  int                width, | ||||
|                                  int                height) | ||||
| { | ||||
|   MetaShapedTexturePrivate *priv; | ||||
|   const cairo_rectangle_int_t clip = { x, y, width, height }; | ||||
|  | ||||
|   priv = stex->priv; | ||||
|  | ||||
|   if (priv->texture == COGL_INVALID_HANDLE) | ||||
|   if (priv->texture == NULL) | ||||
|     return; | ||||
|  | ||||
|   cogl_texture_pixmap_x11_update_area (priv->texture, x, y, width, height); | ||||
|   switch (priv->type) | ||||
|     { | ||||
|     case META_SHAPED_TEXTURE_TYPE_X11_PIXMAP: | ||||
|       cogl_texture_pixmap_x11_update_area (COGL_TEXTURE_PIXMAP_X11 (priv->texture), | ||||
|                                            x, y, width, height); | ||||
|       break; | ||||
|     case META_SHAPED_TEXTURE_TYPE_WAYLAND_SURFACE: | ||||
|       wayland_surface_update_area (stex, x, y, width, height); | ||||
|       break; | ||||
|     } | ||||
|  | ||||
|   meta_texture_tower_update_area (priv->paint_tower, x, y, width, height); | ||||
|  | ||||
|   clutter_actor_queue_redraw_with_clip (CLUTTER_ACTOR (stex), &clip); | ||||
| } | ||||
|  | ||||
| static void | ||||
| set_cogl_texture (MetaShapedTexture *stex, | ||||
|                   CoglHandle         cogl_tex) | ||||
| { | ||||
|   MetaShapedTexturePrivate *priv; | ||||
|   guint width, height; | ||||
|  | ||||
|   g_return_if_fail (META_IS_SHAPED_TEXTURE (stex)); | ||||
|  | ||||
|   priv = stex->priv; | ||||
|  | ||||
|   if (priv->texture != COGL_INVALID_HANDLE) | ||||
|     cogl_handle_unref (priv->texture); | ||||
|  | ||||
|   priv->texture = cogl_tex; | ||||
|  | ||||
|   if (priv->material != COGL_INVALID_HANDLE) | ||||
|     cogl_material_set_layer (priv->material, 0, cogl_tex); | ||||
|  | ||||
|   if (priv->material_unshaped != COGL_INVALID_HANDLE) | ||||
|     cogl_material_set_layer (priv->material_unshaped, 0, cogl_tex); | ||||
|  | ||||
|   if (cogl_tex != COGL_INVALID_HANDLE) | ||||
|     { | ||||
|       width = cogl_texture_get_width (cogl_tex); | ||||
|       height = cogl_texture_get_height (cogl_tex); | ||||
|  | ||||
|       if (width != priv->tex_width || | ||||
|           height != priv->tex_height) | ||||
|         { | ||||
|           priv->tex_width = width; | ||||
|           priv->tex_height = height; | ||||
|  | ||||
|           clutter_actor_queue_relayout (CLUTTER_ACTOR (stex)); | ||||
|         } | ||||
|     } | ||||
|   else | ||||
|     { | ||||
|       /* size changed to 0 going to an invalid handle */ | ||||
|       priv->tex_width = 0; | ||||
|       priv->tex_height = 0; | ||||
|       clutter_actor_queue_relayout (CLUTTER_ACTOR (stex)); | ||||
|     } | ||||
|  | ||||
|   clutter_actor_queue_redraw (CLUTTER_ACTOR (stex)); | ||||
|   queue_damage_redraw_with_clip (stex, x, y, width, height); | ||||
| } | ||||
|  | ||||
| /** | ||||
| @@ -513,22 +694,71 @@ meta_shaped_texture_set_pixmap (MetaShapedTexture *stex, | ||||
|  | ||||
|   priv = stex->priv; | ||||
|  | ||||
|   if (priv->pixmap == pixmap) | ||||
|   if (priv->x11.pixmap == pixmap) | ||||
|     return; | ||||
|  | ||||
|   priv->pixmap = pixmap; | ||||
|   priv->x11.pixmap = pixmap; | ||||
|  | ||||
|   if (pixmap != None) | ||||
|     { | ||||
|       CoglContext *ctx = | ||||
|         clutter_backend_get_cogl_context (clutter_get_default_backend ()); | ||||
|       set_cogl_texture (stex, cogl_texture_pixmap_x11_new (ctx, pixmap, FALSE, NULL)); | ||||
|       CoglTexture *texture = | ||||
|         COGL_TEXTURE (cogl_texture_pixmap_x11_new (ctx, pixmap, FALSE, NULL)); | ||||
|       set_cogl_texture (stex, texture); | ||||
|     } | ||||
|   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)); | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_shaped_texture_attach_wayland_buffer (MetaShapedTexture  *stex, | ||||
|                                            MetaWaylandBuffer  *buffer) | ||||
| { | ||||
|   MetaShapedTexturePrivate *priv; | ||||
|  | ||||
|   g_return_if_fail (META_IS_SHAPED_TEXTURE (stex)); | ||||
|  | ||||
|   priv = stex->priv; | ||||
|  | ||||
|   /* TODO: we should change this api to be something like | ||||
|    * meta_shaped_texture_notify_buffer_attach() since we now maintain | ||||
|    * a reference to the MetaWaylandSurface where we can access the | ||||
|    * buffer without it being explicitly passed as an argument. | ||||
|    */ | ||||
|   g_return_if_fail (priv->wayland.surface->buffer_ref.buffer == buffer); | ||||
|  | ||||
|   if (buffer) | ||||
|     { | ||||
|       CoglContext *ctx = | ||||
|         clutter_backend_get_cogl_context (clutter_get_default_backend ()); | ||||
|       CoglError *catch_error = NULL; | ||||
|       CoglTexture *texture = | ||||
|         COGL_TEXTURE (cogl_wayland_texture_2d_new_from_buffer (ctx, | ||||
|                                                                buffer->resource, | ||||
|                                                                &catch_error)); | ||||
|       if (!texture) | ||||
|         { | ||||
|           cogl_error_free (catch_error); | ||||
|         } | ||||
|       else | ||||
|         { | ||||
|           buffer->width = cogl_texture_get_width (texture); | ||||
|           buffer->height = cogl_texture_get_height (texture); | ||||
|         } | ||||
|  | ||||
|       set_cogl_texture (stex, texture); | ||||
|     } | ||||
|   else | ||||
|     set_cogl_texture (stex, NULL); | ||||
|  | ||||
|   if (priv->create_mipmaps) | ||||
|     meta_texture_tower_set_base_texture (priv->paint_tower, | ||||
|                                          COGL_TEXTURE (priv->texture)); | ||||
| } | ||||
|  | ||||
| /** | ||||
| @@ -537,11 +767,46 @@ meta_shaped_texture_set_pixmap (MetaShapedTexture *stex, | ||||
|  * | ||||
|  * Returns: (transfer none): the unshaped texture | ||||
|  */ | ||||
| CoglHandle | ||||
| CoglTexture * | ||||
| meta_shaped_texture_get_texture (MetaShapedTexture *stex) | ||||
| { | ||||
|   g_return_val_if_fail (META_IS_SHAPED_TEXTURE (stex), COGL_INVALID_HANDLE); | ||||
|   return stex->priv->texture; | ||||
|   g_return_val_if_fail (META_IS_SHAPED_TEXTURE (stex), NULL); | ||||
|   return COGL_TEXTURE (stex->priv->texture); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * meta_shaped_texture_set_input_shape_region: | ||||
|  * @stex: a #MetaShapedTexture | ||||
|  * @shape_region: the region of the texture that should respond to | ||||
|  *    input. | ||||
|  * | ||||
|  * Determines what region of the texture should accept input. For | ||||
|  * X based windows this is defined by the ShapeInput region of the | ||||
|  * window. | ||||
|  */ | ||||
| void | ||||
| meta_shaped_texture_set_input_shape_region (MetaShapedTexture *stex, | ||||
|                                             cairo_region_t    *shape_region) | ||||
| { | ||||
|   MetaShapedTexturePrivate *priv; | ||||
|  | ||||
|   g_return_if_fail (META_IS_SHAPED_TEXTURE (stex)); | ||||
|  | ||||
|   priv = stex->priv; | ||||
|  | ||||
|   if (priv->input_shape_region != NULL) | ||||
|     { | ||||
|       cairo_region_destroy (priv->input_shape_region); | ||||
|       priv->input_shape_region = NULL; | ||||
|     } | ||||
|  | ||||
|   if (shape_region != NULL) | ||||
|     { | ||||
|       cairo_region_reference (shape_region); | ||||
|       priv->input_shape_region = shape_region; | ||||
|     } | ||||
|  | ||||
|   clutter_actor_queue_redraw (CLUTTER_ACTOR (stex)); | ||||
| } | ||||
|  | ||||
| /** | ||||
| @@ -598,13 +863,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 +906,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 | ||||
|  | ||||
|   | ||||
| @@ -5,6 +5,9 @@ | ||||
|  | ||||
| #include <config.h> | ||||
|  | ||||
| #include <wayland-server.h> | ||||
| #include <meta-wayland-private.h> | ||||
|  | ||||
| #include <X11/extensions/Xdamage.h> | ||||
| #include <meta/compositor-mutter.h> | ||||
|  | ||||
| @@ -24,10 +27,24 @@ void meta_window_actor_unmaximize (MetaWindowActor *self, | ||||
|                                    MetaRectangle   *old_rect, | ||||
|                                    MetaRectangle   *new_rect); | ||||
|  | ||||
| void meta_window_actor_process_damage (MetaWindowActor    *self, | ||||
|                                        XDamageNotifyEvent *event); | ||||
| void meta_window_actor_process_x11_damage (MetaWindowActor    *self, | ||||
|                                            XDamageNotifyEvent *event); | ||||
|  | ||||
| void meta_window_actor_process_wayland_damage (MetaWindowActor *self, | ||||
|                                                int              x, | ||||
|                                                int              y, | ||||
|                                                int              width, | ||||
|                                                int              height); | ||||
| void meta_window_actor_set_wayland_surface    (MetaWindowActor    *self, | ||||
|                                                MetaWaylandSurface *surface); | ||||
| void meta_window_actor_attach_wayland_buffer  (MetaWindowActor   *self, | ||||
|                                                MetaWaylandBuffer *buffer); | ||||
|  | ||||
| void meta_window_actor_pre_paint      (MetaWindowActor    *self); | ||||
| void meta_window_actor_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 +56,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,27 @@ | ||||
|  | ||||
| #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" | ||||
| #include "window-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 +84,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,14 +92,15 @@ 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; | ||||
|  | ||||
|   MetaWindowGroup *window_group = META_WINDOW_GROUP (actor); | ||||
|   MetaCompScreen *info = meta_screen_get_compositor_data (window_group->screen); | ||||
|   MetaCompScreen *info; | ||||
|  | ||||
|   /* Normally we expect an actor to be drawn at it's position on the screen. | ||||
|    * However, if we're inside the paint of a ClutterClone, that won't be the | ||||
| @@ -206,7 +116,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 +125,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 | ||||
| @@ -234,21 +137,32 @@ meta_window_group_paint (ClutterActor *actor) | ||||
|  | ||||
|   visible_region = cairo_region_create_rectangle (&visible_rect); | ||||
|  | ||||
|   if (info->unredirected_window != NULL) | ||||
|   if (!meta_is_wayland_compositor ()) | ||||
|     { | ||||
|       cairo_rectangle_int_t unredirected_rect; | ||||
|       MetaWindow *window = meta_window_actor_get_meta_window (info->unredirected_window); | ||||
|       info = meta_screen_get_compositor_data (window_group->screen); | ||||
|       if (info->unredirected_window != NULL) | ||||
|         { | ||||
|           cairo_rectangle_int_t unredirected_rect; | ||||
|           MetaWindow *window = meta_window_actor_get_meta_window (info->unredirected_window); | ||||
|  | ||||
|       meta_window_get_outer_rect (window, (MetaRectangle *)&unredirected_rect); | ||||
|       cairo_region_subtract_rectangle (visible_region, &unredirected_rect); | ||||
|           meta_window_get_outer_rect (window, (MetaRectangle *)&unredirected_rect); | ||||
|           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 (!meta_is_wayland_compositor () && | ||||
|           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 +181,16 @@ 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; | ||||
|           MetaWindow *meta_window; | ||||
|           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; | ||||
| @@ -286,7 +201,14 @@ meta_window_group_paint (ClutterActor *actor) | ||||
|  | ||||
|           meta_window_actor_set_visible_region (window_actor, visible_region); | ||||
|  | ||||
|           if (clutter_actor_get_paint_opacity (CLUTTER_ACTOR (window_actor)) == 0xff) | ||||
|           /* TODO: Track the opaque regions of wayland clients. | ||||
|            * Although wayland clients can report opaque window | ||||
|            * regions, for now we assume that all wayland clients are | ||||
|            * transparent... */ | ||||
|           meta_window = meta_window_actor_get_meta_window (window_actor); | ||||
|  | ||||
|           if (meta_window->client_type != META_WINDOW_CLIENT_TYPE_WAYLAND && | ||||
|               clutter_actor_get_paint_opacity (CLUTTER_ACTOR (window_actor)) == 0xff) | ||||
|             { | ||||
|               cairo_region_t *obscured_region = meta_window_actor_get_obscured_region (window_actor); | ||||
|               if (obscured_region) | ||||
| @@ -296,19 +218,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 +246,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 +275,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,    | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user