Compare commits
	
		
			393 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					457df4c926 | ||
| 
						 | 
					2f3debb4ac | ||
| 
						 | 
					d06b00402c | ||
| 
						 | 
					0836a878d4 | ||
| 
						 | 
					13eddc1314 | ||
| 
						 | 
					8adc8c3898 | ||
| 
						 | 
					5ad3260bb8 | ||
| 
						 | 
					a16506cd67 | ||
| 
						 | 
					9a1e36f458 | ||
| 
						 | 
					81ac19a984 | ||
| 
						 | 
					88def45498 | ||
| 
						 | 
					d8503275ac | ||
| 
						 | 
					d48ddff50c | ||
| 
						 | 
					0dee738a43 | ||
| 
						 | 
					846d7618d2 | ||
| 
						 | 
					36722a8bdc | ||
| 
						 | 
					8297678e11 | ||
| 
						 | 
					9d37afc9e6 | ||
| 
						 | 
					8685dba611 | ||
| 
						 | 
					de051b2548 | ||
| 
						 | 
					de9e93e469 | ||
| 
						 | 
					79e54d1766 | ||
| 
						 | 
					b0dfdf15fa | ||
| 
						 | 
					2688d15d17 | ||
| 
						 | 
					a2253a3e77 | ||
| 
						 | 
					c828db5c8b | ||
| 
						 | 
					ad293b7214 | ||
| 
						 | 
					9c5ac65311 | ||
| 
						 | 
					ce8d36a5db | ||
| 
						 | 
					27b00d6f63 | ||
| 
						 | 
					c441364bd3 | ||
| 
						 | 
					1a521e10c3 | ||
| 
						 | 
					e22d941f06 | ||
| 
						 | 
					787d22dcd0 | ||
| 
						 | 
					22d9182322 | ||
| 
						 | 
					38295e8202 | ||
| 
						 | 
					fe57f7572d | ||
| 
						 | 
					aade16a9eb | ||
| 
						 | 
					e31a97759e | ||
| 
						 | 
					472662d099 | ||
| 
						 | 
					027f16b096 | ||
| 
						 | 
					5c7fdd67e8 | ||
| 
						 | 
					4a0b6793bf | ||
| 
						 | 
					228d1bf9aa | ||
| 
						 | 
					85bcb9c121 | ||
| 
						 | 
					989a38767e | ||
| 
						 | 
					78e72f0a47 | ||
| 
						 | 
					0faa623043 | ||
| 
						 | 
					ecd7e662ff | ||
| 
						 | 
					7d9925ba2e | ||
| 
						 | 
					95c6547631 | ||
| 
						 | 
					b5235d5a46 | ||
| 
						 | 
					f3b1e8b3bd | ||
| 
						 | 
					59bc5b7975 | ||
| 
						 | 
					99cbe762d7 | ||
| 
						 | 
					7a2c019514 | ||
| 
						 | 
					c02e1b6f56 | ||
| 
						 | 
					7938458eb8 | ||
| 
						 | 
					165e117028 | ||
| 
						 | 
					32cb4a178e | ||
| 
						 | 
					7b69780d9a | ||
| 
						 | 
					be500e33f9 | ||
| 
						 | 
					427c5cc42b | ||
| 
						 | 
					3f444cb2fe | ||
| 
						 | 
					02bc4b54eb | ||
| 
						 | 
					85c46be205 | ||
| 
						 | 
					f97db0215b | ||
| 
						 | 
					dc79d8aa3d | ||
| 
						 | 
					00fecb6cea | ||
| 
						 | 
					f0e97b540f | ||
| 
						 | 
					37266aabfe | ||
| 
						 | 
					6cc423cca6 | ||
| 
						 | 
					ce820702e3 | ||
| 
						 | 
					5eb72743dd | ||
| 
						 | 
					ae1be578ba | ||
| 
						 | 
					7e1e9320bc | ||
| 
						 | 
					18a1ed6ec5 | ||
| 
						 | 
					09713c5fd4 | ||
| 
						 | 
					909cd82bea | ||
| 
						 | 
					0593df8fe0 | ||
| 
						 | 
					29b3e69dfa | ||
| 
						 | 
					639d5e4710 | ||
| 
						 | 
					8c36cf5939 | ||
| 
						 | 
					cc107c0eda | ||
| 
						 | 
					c7f70d71f7 | ||
| 
						 | 
					9c6ccf96a5 | ||
| 
						 | 
					11262b76df | ||
| 
						 | 
					8fcc0db0c1 | ||
| 
						 | 
					7c999a9d13 | ||
| 
						 | 
					efc55347e0 | ||
| 
						 | 
					5f11158721 | ||
| 
						 | 
					88ee5a68d9 | ||
| 
						 | 
					e1870a41b1 | ||
| 
						 | 
					bb74499188 | ||
| 
						 | 
					079822c3f4 | ||
| 
						 | 
					bfacd9d420 | ||
| 
						 | 
					36361b86d4 | ||
| 
						 | 
					7c9c232d14 | ||
| 
						 | 
					14c460c7fd | ||
| 
						 | 
					0371194191 | ||
| 
						 | 
					3b0c7c568d | ||
| 
						 | 
					08893400a0 | ||
| 
						 | 
					03cde43646 | ||
| 
						 | 
					8617efb544 | ||
| 
						 | 
					db4298502e | ||
| 
						 | 
					9f90f25e80 | ||
| 
						 | 
					1fdde85f53 | ||
| 
						 | 
					0e529fba00 | ||
| 
						 | 
					6a32fa9452 | ||
| 
						 | 
					b422b6f06e | ||
| 
						 | 
					bc96a14185 | ||
| 
						 | 
					fbcddbcf3e | ||
| 
						 | 
					dfe8979a90 | ||
| 
						 | 
					c3a6de749b | ||
| 
						 | 
					935e820a1d | ||
| 
						 | 
					f4125b95ca | ||
| 
						 | 
					d8bc7f7aa1 | ||
| 
						 | 
					6d67ee3965 | ||
| 
						 | 
					991ea50038 | ||
| 
						 | 
					885a6afdcd | ||
| 
						 | 
					0106f8bab1 | ||
| 
						 | 
					d27bccd0ba | ||
| 
						 | 
					c66488210c | ||
| 
						 | 
					6c3985220e | ||
| 
						 | 
					802c1ac427 | ||
| 
						 | 
					7a2a6e2675 | ||
| 
						 | 
					c27b4b7cfc | ||
| 
						 | 
					0ab572d511 | ||
| 
						 | 
					1c8d45e89c | ||
| 
						 | 
					4e2c2cb1ab | ||
| 
						 | 
					07dd4d3f93 | ||
| 
						 | 
					22370bef09 | ||
| 
						 | 
					f8d443b5b8 | ||
| 
						 | 
					f22ecd1c57 | ||
| 
						 | 
					b85be9312b | ||
| 
						 | 
					cd0870730f | ||
| 
						 | 
					d6be75ae99 | ||
| 
						 | 
					c1be7f1a60 | ||
| 
						 | 
					fccd5fd4ca | ||
| 
						 | 
					1e5ef70fe3 | ||
| 
						 | 
					1347a06e38 | ||
| 
						 | 
					b5d5934e5a | ||
| 
						 | 
					64b1c0f953 | ||
| 
						 | 
					10d53fc7d2 | ||
| 
						 | 
					eb1292ea99 | ||
| 
						 | 
					e257580b94 | ||
| 
						 | 
					42261156ec | ||
| 
						 | 
					89e31f0d9d | ||
| 
						 | 
					c805e397fd | ||
| 
						 | 
					760a36aeee | ||
| 
						 | 
					5d57a2594d | ||
| 
						 | 
					1a5132d391 | ||
| 
						 | 
					0fe0534c85 | ||
| 
						 | 
					fe942049da | ||
| 
						 | 
					e6ed29f0e2 | ||
| 
						 | 
					15f11f879d | ||
| 
						 | 
					f517eaf81e | ||
| 
						 | 
					255347f876 | ||
| 
						 | 
					e4ae7d7b1b | ||
| 
						 | 
					2be943d1d9 | ||
| 
						 | 
					0a50488bef | ||
| 
						 | 
					78c966321a | ||
| 
						 | 
					f65b7c59d3 | ||
| 
						 | 
					e31f55e146 | ||
| 
						 | 
					dc232b6cad | ||
| 
						 | 
					a2f2e07e9b | ||
| 
						 | 
					f5e48223c9 | ||
| 
						 | 
					1478510392 | ||
| 
						 | 
					18b38320a6 | ||
| 
						 | 
					16be31b514 | ||
| 
						 | 
					accc183474 | ||
| 
						 | 
					81699619e8 | ||
| 
						 | 
					75c87e5876 | ||
| 
						 | 
					50bc4ad0e1 | ||
| 
						 | 
					277e8bdad9 | ||
| 
						 | 
					dc50ccf9b7 | ||
| 
						 | 
					4595209346 | ||
| 
						 | 
					50cf3dd1a5 | ||
| 
						 | 
					66eac7824a | ||
| 
						 | 
					4041f96ed3 | ||
| 
						 | 
					3a15d637da | ||
| 
						 | 
					5c3c7df948 | ||
| 
						 | 
					f9454e29db | ||
| 
						 | 
					574c0c3287 | ||
| 
						 | 
					9fa5aa9889 | ||
| 
						 | 
					80a70a4ad1 | ||
| 
						 | 
					7c1b734053 | ||
| 
						 | 
					33e1017403 | ||
| 
						 | 
					f143fe3710 | ||
| 
						 | 
					66406b3035 | ||
| 
						 | 
					042ddc5637 | ||
| 
						 | 
					5b04ab4473 | ||
| 
						 | 
					16b86ae7f7 | ||
| 
						 | 
					49400657ca | ||
| 
						 | 
					30bc8bc6ce | ||
| 
						 | 
					ac18f41ed1 | ||
| 
						 | 
					60c05a0dac | ||
| 
						 | 
					c47de98c88 | ||
| 
						 | 
					f1aada0fae | ||
| 
						 | 
					4de492eb20 | ||
| 
						 | 
					9ca00d5cce | ||
| 
						 | 
					b98e4e37ad | ||
| 
						 | 
					8b64a951c9 | ||
| 
						 | 
					c2a0719e44 | ||
| 
						 | 
					8cb7a450ae | ||
| 
						 | 
					6fb857cb23 | ||
| 
						 | 
					fc87a635b2 | ||
| 
						 | 
					81930ca76e | ||
| 
						 | 
					da65738901 | ||
| 
						 | 
					4528e1216a | ||
| 
						 | 
					d56ecde39b | ||
| 
						 | 
					4148a5cc6a | ||
| 
						 | 
					8a6a568aca | ||
| 
						 | 
					12cc0cee29 | ||
| 
						 | 
					878b1012b4 | ||
| 
						 | 
					a78fec7951 | ||
| 
						 | 
					a24c512caa | ||
| 
						 | 
					c669a3892e | ||
| 
						 | 
					ba4f008d40 | ||
| 
						 | 
					b0a099935b | ||
| 
						 | 
					aba39ef953 | ||
| 
						 | 
					ebf8c460e1 | ||
| 
						 | 
					25d3432eee | ||
| 
						 | 
					cd7a74fbcd | ||
| 
						 | 
					c64188c67f | ||
| 
						 | 
					4c2371f2e7 | ||
| 
						 | 
					ff6c31dcc0 | ||
| 
						 | 
					1b649c18ed | ||
| 
						 | 
					93037e4c6b | ||
| 
						 | 
					ed358c8f4b | ||
| 
						 | 
					a22859a64a | ||
| 
						 | 
					c44438b19f | ||
| 
						 | 
					b58366d3ad | ||
| 
						 | 
					6900128b2f | ||
| 
						 | 
					c0b4d68390 | ||
| 
						 | 
					0d794f28f0 | ||
| 
						 | 
					e389eff79d | ||
| 
						 | 
					41adbdda12 | ||
| 
						 | 
					2d6555ca4d | ||
| 
						 | 
					044d58951e | ||
| 
						 | 
					9c97e8999e | ||
| 
						 | 
					e97b38b38e | ||
| 
						 | 
					8809673a74 | ||
| 
						 | 
					68321d9bf4 | ||
| 
						 | 
					65390e50a4 | ||
| 
						 | 
					f8d32661b5 | ||
| 
						 | 
					d84911fdf9 | ||
| 
						 | 
					4147ea4660 | ||
| 
						 | 
					2dd7c98641 | ||
| 
						 | 
					3aad30143c | ||
| 
						 | 
					93d06d4368 | ||
| 
						 | 
					b19c061db5 | ||
| 
						 | 
					497258f6e5 | ||
| 
						 | 
					977e6388ad | ||
| 
						 | 
					0879cf0d8d | ||
| 
						 | 
					4aab7fb7b9 | ||
| 
						 | 
					839fee19ef | ||
| 
						 | 
					46a56bafbd | ||
| 
						 | 
					c8b4939c7e | ||
| 
						 | 
					fc3e82421a | ||
| 
						 | 
					23046f6e28 | ||
| 
						 | 
					823208120d | ||
| 
						 | 
					d12c507b12 | ||
| 
						 | 
					2157c238b6 | ||
| 
						 | 
					423bda908e | ||
| 
						 | 
					98d427ddba | ||
| 
						 | 
					7a35579c3f | ||
| 
						 | 
					adc89fbb2c | ||
| 
						 | 
					a6ca3f768f | ||
| 
						 | 
					9362fbdcde | ||
| 
						 | 
					47099f4a87 | ||
| 
						 | 
					2e6e5b068c | ||
| 
						 | 
					ee840bc832 | ||
| 
						 | 
					6333c174dc | ||
| 
						 | 
					a3bf9b01aa | ||
| 
						 | 
					402b477458 | ||
| 
						 | 
					6b273ca713 | ||
| 
						 | 
					c3ec6b34a3 | ||
| 
						 | 
					78dc480e86 | ||
| 
						 | 
					53364f986c | ||
| 
						 | 
					5770b5b3c3 | ||
| 
						 | 
					f16f47bd38 | ||
| 
						 | 
					58a57185b7 | ||
| 
						 | 
					8fb361cb26 | ||
| 
						 | 
					335d211204 | ||
| 
						 | 
					7f64d6b92e | ||
| 
						 | 
					8c1b2d5eda | ||
| 
						 | 
					578b1c06c7 | ||
| 
						 | 
					6dfde43786 | ||
| 
						 | 
					a8ead4d447 | ||
| 
						 | 
					2926323a9a | ||
| 
						 | 
					13bc8f7a76 | ||
| 
						 | 
					ad516492d2 | ||
| 
						 | 
					6677c61db3 | ||
| 
						 | 
					f26f61ed7d | ||
| 
						 | 
					8ca86fa8bf | ||
| 
						 | 
					f2f500836e | ||
| 
						 | 
					c39998efee | ||
| 
						 | 
					3b811f33c7 | ||
| 
						 | 
					beea2f7acd | ||
| 
						 | 
					fb4c50478d | ||
| 
						 | 
					ac0602a02e | ||
| 
						 | 
					5361e0259f | ||
| 
						 | 
					04bf73ff6d | ||
| 
						 | 
					047b9de1c6 | ||
| 
						 | 
					39b3244a3e | ||
| 
						 | 
					63f982eb72 | ||
| 
						 | 
					c689306dae | ||
| 
						 | 
					0b7f2f8cd3 | ||
| 
						 | 
					efc90173b1 | ||
| 
						 | 
					9e439a22b5 | ||
| 
						 | 
					848c1f52f3 | ||
| 
						 | 
					1b84be7031 | ||
| 
						 | 
					eb08a65b4c | ||
| 
						 | 
					43ba596a0e | ||
| 
						 | 
					2e1de1a037 | ||
| 
						 | 
					81ede6abf8 | ||
| 
						 | 
					1d98f1fee8 | ||
| 
						 | 
					f0582d1a86 | ||
| 
						 | 
					607dbf0f43 | ||
| 
						 | 
					584cd3e684 | ||
| 
						 | 
					90ec5b05f3 | ||
| 
						 | 
					7253a75b18 | ||
| 
						 | 
					cdbe3b274f | ||
| 
						 | 
					3f3e3ce37e | ||
| 
						 | 
					5e3d93da87 | ||
| 
						 | 
					82b1d0d7e5 | ||
| 
						 | 
					3583e57ec3 | ||
| 
						 | 
					2ddde04678 | ||
| 
						 | 
					feda493fbf | ||
| 
						 | 
					fc72309b71 | ||
| 
						 | 
					860c2a6282 | ||
| 
						 | 
					e6b4a34daf | ||
| 
						 | 
					3319cdfec0 | ||
| 
						 | 
					fc5594faad | ||
| 
						 | 
					7c9e0c2ebc | ||
| 
						 | 
					9157cc2b70 | ||
| 
						 | 
					69e7b32b54 | ||
| 
						 | 
					04835eccb5 | ||
| 
						 | 
					01c363bb6a | ||
| 
						 | 
					7649772394 | ||
| 
						 | 
					ca3dc2e876 | ||
| 
						 | 
					70d85049b1 | ||
| 
						 | 
					29f6f5e0ad | ||
| 
						 | 
					d249cfd040 | ||
| 
						 | 
					3cb912aee2 | ||
| 
						 | 
					7df823132c | ||
| 
						 | 
					41353d642b | ||
| 
						 | 
					c47039db82 | ||
| 
						 | 
					0dab6df25a | ||
| 
						 | 
					c844bab232 | ||
| 
						 | 
					848f9d1399 | ||
| 
						 | 
					2e63de5c0a | ||
| 
						 | 
					7319b10d72 | ||
| 
						 | 
					1265efcf78 | ||
| 
						 | 
					3e0ef03fd9 | ||
| 
						 | 
					37076941ad | ||
| 
						 | 
					25e43618a4 | ||
| 
						 | 
					fd404bafc8 | ||
| 
						 | 
					3b3b26b000 | ||
| 
						 | 
					33498f6b84 | ||
| 
						 | 
					c0a440b852 | ||
| 
						 | 
					1772a2a59c | ||
| 
						 | 
					44f362ad87 | ||
| 
						 | 
					478f1020a4 | ||
| 
						 | 
					e8209e7b22 | ||
| 
						 | 
					2d20c9ecad | ||
| 
						 | 
					f35160c30f | ||
| 
						 | 
					7fad591d6e | ||
| 
						 | 
					a364cea779 | ||
| 
						 | 
					2eb3ff4bfb | ||
| 
						 | 
					796ca6746d | ||
| 
						 | 
					0a79fb8d62 | ||
| 
						 | 
					ac7ec585c8 | ||
| 
						 | 
					264c555af0 | ||
| 
						 | 
					bbbb0e6002 | ||
| 
						 | 
					41ae760454 | ||
| 
						 | 
					9729a99ec5 | ||
| 
						 | 
					d64c5bfc11 | ||
| 
						 | 
					e4ed433e18 | ||
| 
						 | 
					8ab5cc8f19 | ||
| 
						 | 
					35261808a9 | ||
| 
						 | 
					3a4512cd91 | ||
| 
						 | 
					eb0185c1b1 | ||
| 
						 | 
					34f6ffd1ad | ||
| 
						 | 
					baeb9fbc4b | ||
| 
						 | 
					c3d76aead6 | ||
| 
						 | 
					bed9cb1648 | ||
| 
						 | 
					4ca552785f | ||
| 
						 | 
					b26b11c74d | ||
| 
						 | 
					b3114bb9e5 | ||
| 
						 | 
					497f9be61e | ||
| 
						 | 
					a88365df9b | 
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -19,6 +19,7 @@ libtool
 | 
			
		||||
ltmain.sh
 | 
			
		||||
missing
 | 
			
		||||
.deps
 | 
			
		||||
src/50-mutter-windows.xml
 | 
			
		||||
src/mutter-wm.desktop
 | 
			
		||||
src/mutter.desktop
 | 
			
		||||
*.o
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										311
									
								
								NEWS
									
									
									
									
									
								
							
							
						
						
									
										311
									
								
								NEWS
									
									
									
									
									
								
							@@ -1,3 +1,314 @@
 | 
			
		||||
3.6.3
 | 
			
		||||
=====
 | 
			
		||||
* Fix maximized windows jumping between monitors [Alban; #556696]
 | 
			
		||||
* Fix windows turning black when redirected again [Adel; #693042]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
  Alban Crequy, Adel Gadllah
 | 
			
		||||
 | 
			
		||||
Translations:
 | 
			
		||||
  Runa Bhattacharjee [bn_IN], Rajesh Ranjan [hi], Krishnababu Krothapalli [te],
 | 
			
		||||
  ManojKumar Giri [or], Dr.T.Vasudevan [ta], Shankar Prasad [kn],
 | 
			
		||||
  Rafael Ferreira [pt_BR]
 | 
			
		||||
 | 
			
		||||
3.6.2
 | 
			
		||||
=====
 | 
			
		||||
* Only process keyboard mapping events for the core X keyboard [Rui; #674859]
 | 
			
		||||
 | 
			
		||||
Contributor:
 | 
			
		||||
  Rui Matos
 | 
			
		||||
 | 
			
		||||
Translations:
 | 
			
		||||
  Marek Černocký [cs], Мирослав Николић [sr, sr@latin], Mattias Põldaru [et],
 | 
			
		||||
  Nilamdyuti Goswami [as], Sweta Kothari [gu], Tobias Endrigkeit [de],
 | 
			
		||||
  A S Alam [pa]
 | 
			
		||||
 | 
			
		||||
3.6.1
 | 
			
		||||
=====
 | 
			
		||||
* Fix crash when opening large popup menus [Jasper; #681676]
 | 
			
		||||
* window: Don't move the desktop window after monitor hotplug [Jasper; #681159]
 | 
			
		||||
* Expose MetaPlugin to introspection [Evan; #671098]
 | 
			
		||||
* Optionally delay focus changes in focus-follows-mouse mode [Florian; #678169]
 | 
			
		||||
* Resize the guard window when the X screen is resized [Benjamin; #670396]
 | 
			
		||||
* display: Only manage the default X screen [Jürg; #648156]
 | 
			
		||||
* Misc cleanups: [Owen; #587255]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
  Benjamin Berg, Jürg Billeter, Evan Broder, Florian Müllner, Jasper St. Pierre,
 | 
			
		||||
  Owen Taylor
 | 
			
		||||
 | 
			
		||||
Translations:
 | 
			
		||||
  Alexandre Franke [fr], Theppitak Karoonboonyanan [th], Sayak Sarkar [bn_IN],
 | 
			
		||||
  Sandeep Sheshrao Shedmake [mr], Ask H. Larsen [da], Shankar Prasad [kn],
 | 
			
		||||
  Alexander Shopov [bg], Aurimas Černius [lt], Ihar Hrachyshka [be],
 | 
			
		||||
  Kjartan Maraas [nb], Daniel Mustieles [es], Changwoo Ryu [ko],
 | 
			
		||||
  Yuri Myasoedov [ru], Tom Tryfonidis [el], Rūdolfs Mazurs [lv],
 | 
			
		||||
  Chris Leonard [en_GB], Piotr Drąg [pl], Fran Diéguez [gl], Gil Forcada [ca],
 | 
			
		||||
  Matej Urbančič [sl], Andika Triwidada [id], Carles Ferrando [ca]
 | 
			
		||||
 | 
			
		||||
3.6.0
 | 
			
		||||
=====
 | 
			
		||||
 | 
			
		||||
Translations:
 | 
			
		||||
  Alexander Shopov [bg], Daniel Korostil [uk], Rajesh Ranjan [hi],
 | 
			
		||||
  Krishnababu Krothapalli [te], Ani Peter [ml], Rūdolfs Mazurs [lv],
 | 
			
		||||
  Sweta Kothari [gu], Ihar Hrachyshka [be], Noriko Mizumoto [ja],
 | 
			
		||||
  Timo Jyrinki [fi], Mattias Põldaru [et]
 | 
			
		||||
 | 
			
		||||
3.5.92
 | 
			
		||||
======
 | 
			
		||||
* screen: Allow NULL out arguments in meta_screen_get_size [Tomeu]
 | 
			
		||||
* display: Add API to set wm_name / wm_keybindings [Florian; #671010]
 | 
			
		||||
* Improve the not responding dialog [Jon, Florian; #684306]
 | 
			
		||||
* Misc. bugfixes [Jasper]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
  William Jon McCann, Florian Müllner, Jasper St. Pierre, Tomeu Vizoso
 | 
			
		||||
 | 
			
		||||
Translations:
 | 
			
		||||
  Gabor Kelemen [hu], Piotr Drąg [pl], Dr.T.Vasudevan [ta], Bruce Cowan [en_GB],
 | 
			
		||||
  Alexandre Franke [fr], Theppitak Karoonboonyanan [th], Gil Forcada [ca],
 | 
			
		||||
  Carles Ferrando [ca@valencia], Tobias Endrigkeit [de], Tom Tryfonidis [el],
 | 
			
		||||
  Nguyễn Thái Ngọc Duy [vi], Changwoo Ryu [ko], Ask H. Larsen [da],
 | 
			
		||||
  Rafael Ferreira [pt_BR], Marek Černocký [cs]
 | 
			
		||||
 | 
			
		||||
3.5.91
 | 
			
		||||
======
 | 
			
		||||
* Do not include markup in app not responding dialog [Alex]
 | 
			
		||||
* Fix subtracting unredirected windows from visible region [Jasper; #677116]
 | 
			
		||||
* Minor improvements and bugfixes [Jasper, Florian; #682648, #682993]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
  Alexander Larsson, Florian Müllner, Jasper St. Pierre
 | 
			
		||||
 | 
			
		||||
Translations:
 | 
			
		||||
  Dirgita [id], Piotr Drąg [pl], A S Alam [pa], Yuri Myasoedov [ru],
 | 
			
		||||
  Milo Casagrande [it], Nilamdyuti Goswami [as], Tom Tryfonidis [el],
 | 
			
		||||
  Duarte Loreto [pt], Fran Diéguez [gl], Nguyễn Thái Ngọc Duy [vi],
 | 
			
		||||
  Aurimas Černius [lt], Daniel Nylander [sv]
 | 
			
		||||
 | 
			
		||||
3.5.90
 | 
			
		||||
======
 | 
			
		||||
* Fix logic for handling translations of the windows group [Owen; #681221]
 | 
			
		||||
* Handle painting inside a Clutter clone [Owen; #681953]
 | 
			
		||||
* Update overlay-key on settings changes [Florian; #681906]
 | 
			
		||||
* Add keybinding for overlay-key [Florian; #665547]
 | 
			
		||||
* Minor fixes and improvements [Javier, Florian]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
  Javier Jardón, Florian Müllner, Owen Taylor
 | 
			
		||||
 | 
			
		||||
Translations:
 | 
			
		||||
  Sweta Kothari [gu], Muhammet Kara [tr], Khaled Hosny [ar],
 | 
			
		||||
  Sandeep Sheshrao Shedmake [mr]
 | 
			
		||||
 | 
			
		||||
3.5.5
 | 
			
		||||
=====
 | 
			
		||||
* Fix flickering around windows when using window group [Tom; #681221]
 | 
			
		||||
 | 
			
		||||
Contributor(s):
 | 
			
		||||
  Tom Beckmann
 | 
			
		||||
 | 
			
		||||
Translations:
 | 
			
		||||
  Chao-Hsiung Liao [zh_HK, zh_TW], Matej Urbančič [sl], Fran Diéguez [gl],
 | 
			
		||||
  Мирослав Николић [sr, sr@latin], Yaron Shahrabani [he], Kjartan Maraas [nb]
 | 
			
		||||
 | 
			
		||||
3.5.4
 | 
			
		||||
=====
 | 
			
		||||
* Make it possible to reimplement move-to-workspace keybindings from plugins
 | 
			
		||||
  [Giovanni; #674104]
 | 
			
		||||
* Add a preference to ignore hide-titlebar-when-maximized hint [Rico; #678947]
 | 
			
		||||
* window: Also use hide-titlebar-when-maximized when tiled [Florian; #679290]
 | 
			
		||||
* Center modal dialogs on their parent instead [Florian; #674499]
 | 
			
		||||
* Reduce amount of markup in translated messages [Matthias; #679660]
 | 
			
		||||
* Fix focus problem after closing a window with focus-follows-mouse
 | 
			
		||||
  [Jasper; #675982]
 | 
			
		||||
* Handle changes of the attach-modal-dialogs preference [Florian; #679904]
 | 
			
		||||
* Do not restore tiling on unmaximize [Florian; #677565]
 | 
			
		||||
* Misc. fixes and cleanups [Jasper Adriaanse, Jasper, Debarshi, Pavel;
 | 
			
		||||
  #679153, 673824]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
 Jasper Lievisse Adriaanse, Giovanni Campagna, Matthias Clasen, Florian Müllner,
 | 
			
		||||
 Debarshi Ray, Jasper St. Pierre, Rico Tzschichholz, Pavel Vasin
 | 
			
		||||
 | 
			
		||||
Translations:
 | 
			
		||||
 Alexander Shopov [bg], Kjartan Maraas [nb], Yaron Shahrabani [he],
 | 
			
		||||
 Nilamdyuti Goswami [as], Ihar Hrachyshka [be], Daniel Mustieles [es]
 | 
			
		||||
 | 
			
		||||
3.5.3
 | 
			
		||||
=====
 | 
			
		||||
* Simplify plugin system [Jasper; #676855]
 | 
			
		||||
* meta-window-actor: Don't unredirect shaped windows [Jasper; #677657]
 | 
			
		||||
* screen: Add new public meta_screen_get_current_monitor API [Tim; #642591]
 | 
			
		||||
* frames: Increase the size of resize corners [Jasper; #677669]
 | 
			
		||||
* window: Make some window methods public [Jasper; #678126]
 | 
			
		||||
* Fix crash when running mutter stand-alone [Jasper; #678238]
 | 
			
		||||
* meta-window-actor: Fix potential crash in shaping code [Jasper; #677977]
 | 
			
		||||
* Misc. fixes [Jasper, Marc-Antoine, Rico]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
 Tim L, Marc-Antoine Perennou, Jasper St. Pierre, Rico Tzschichholz
 | 
			
		||||
 | 
			
		||||
Translations:
 | 
			
		||||
 | 
			
		||||
 Daniel Mustieles [es], Matej Urbančič [sl], Khaled Hosny [ar],
 | 
			
		||||
 Bruno Brouard [fr], Fran Diéguez [gl]
 | 
			
		||||
 | 
			
		||||
3.5.2
 | 
			
		||||
=====
 | 
			
		||||
* keybindings: Remove 'toggle-recording' binding [Florian; #674376]
 | 
			
		||||
* Switch to gtk-doc syntax [Jasper; #673752]
 | 
			
		||||
* shaped-texture: never slice shape mask texture [Robert; #674731]
 | 
			
		||||
* Make Mutter stop relying on Cogl including a GL header [Neil; #672711]
 | 
			
		||||
* Make support for "XFree86" Xinerama mandatory [Owen; #674727]
 | 
			
		||||
* meta_window_move_frame(): fix crash when frame is NULL [Owen; #675254]
 | 
			
		||||
* Fix memory leaks [Pavel; #672640]
 | 
			
		||||
* Code cleanups [Jasper; #671104 #674876 #676052]
 | 
			
		||||
* Look for themes in XDG user data dir [Jasper; #675316]
 | 
			
		||||
* Remove frame pixel caching [Jasper; #675111]
 | 
			
		||||
* stack: Ignore keep-on-top property on maximized windows [Florian; #673581]
 | 
			
		||||
* Misc. fixes [Javier, Jasper, Owen, Rico]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
 Robert Bragg, Javier Járdon, Florian Müllner, Neil Roberts, Jasper St. Pierre, 
 | 
			
		||||
 Owen Taylor, Rico Tzschichholz, Pavel Vasin
 | 
			
		||||
 | 
			
		||||
Translations:
 | 
			
		||||
 Praveen Illa [te], Luca Ferretti [it], Daniel Mustieles [es]
 | 
			
		||||
 | 
			
		||||
3.4.1
 | 
			
		||||
=====
 | 
			
		||||
* API change: the meta_display_add_keybinding() function added in 3.4
 | 
			
		||||
  wasn't usable from a GNOME Shell extension, so has been changed to take
 | 
			
		||||
  a GSettings object rather than the name of a schema [Jasper; #673014]
 | 
			
		||||
* Don't try to auto-maximize not-maximizable windows; this fixes the problem
 | 
			
		||||
  with the Nautilus desktop window being mis-positioned when enabled
 | 
			
		||||
  [Owen; #673566]
 | 
			
		||||
* Fix a crash in the default plugin (not used in GNOME) [Giovanni; #673809]
 | 
			
		||||
* Make the <Super> key work when set as the mouse button modifier
 | 
			
		||||
  [Florian; #662476]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
 Giovanni Campagna, Florian Muellner, Jasper St. Pierre, Owen Taylor
 | 
			
		||||
 | 
			
		||||
Translations:
 | 
			
		||||
 Khaled Hosny [ar], Jordi Serratosa [ca], Carles Ferrando [ca@valencia],
 | 
			
		||||
 Christian Kirbach [de], Kristjan Schmidt [eo], Arash Mousavi [fa],
 | 
			
		||||
 Jiro Matsuzawa [ja], Shankar Prasad [kn], Aurimas Černius [lt],
 | 
			
		||||
 Yinghua Wang [zh_CN]
 | 
			
		||||
 | 
			
		||||
3.4.0
 | 
			
		||||
=====
 | 
			
		||||
* Fix crash when a full-screen window is opened [Jasper; #672797]
 | 
			
		||||
* Fix memory leaks [Pavel; #672640]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
 Jasper St. Pierre, Pavel Vasin
 | 
			
		||||
 | 
			
		||||
Translations:
 | 
			
		||||
 Marek Černocký, Petr Kovar [cz], Bruno Brouard [fr], Sweta Kothari [gu],
 | 
			
		||||
 Yaron Shahrabani [he], Changwoo Ryu [kr], Enrico Nicoletto [pt_BR],
 | 
			
		||||
 Yuri Myasoedov [ru], Muhammet Kara [tr], Nguyễn Thái Ngọc Duy [vi]
 | 
			
		||||
 | 
			
		||||
3.3.92
 | 
			
		||||
======
 | 
			
		||||
* Automaximize large windows on map [Adel; #671677]
 | 
			
		||||
* When unmaximizing windows, make sure the unminimized size
 | 
			
		||||
  is signficantly less than the maximized size [Adel; #671677]
 | 
			
		||||
* Don't offer maximize option for windows larger than the screen
 | 
			
		||||
  [Jasper; #643606]
 | 
			
		||||
* Always focus the window immediately underneath without restacking
 | 
			
		||||
  when closing a window [Jasper; #620744]
 | 
			
		||||
* Avoid drawing shadows when two windows are tiled together [Rui; #643075]
 | 
			
		||||
* Remove tooltips for window decorations [Florian; #645101]
 | 
			
		||||
* Add org.gnome.mutter.dynamic-workspaces GSetting - when this is set
 | 
			
		||||
  to true, workspace counts are never saved to GSettings, avoiding
 | 
			
		||||
  pointless disk traffic for GNOME dynamic workspaces [Florian; #671568]
 | 
			
		||||
* Add ::grab-op-begin, ::grab-op-end signals to MetaDisplay [Jasper; #670658]
 | 
			
		||||
* Add meta_display_get_ignored_modifier_mask() [Florian; #665215]
 | 
			
		||||
* Remove pointless wrapper methods on MetaPlugin [Jasper; #671103]
 | 
			
		||||
* Fix frame drawing with 3.3.x GTK+ releases [Florian; #671796]
 | 
			
		||||
* Build fixes [Jasper, Rico, Rui]
 | 
			
		||||
* Misc bug fixes [Damien, Jasper, Lionel, Marius, Owen, Rui;
 | 
			
		||||
  #661256, #667437, #671601, #671087, #672374]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
 Stefano Facchini, Adel Gadllah, Lionel Landwerlin, Mariusz Libera,
 | 
			
		||||
 Rui Matos, Florian Müllner, Jasper St. Pierre, Damien Radtke, Owen Taylor,
 | 
			
		||||
 Rico Tzschichholz
 | 
			
		||||
 | 
			
		||||
Translations:
 | 
			
		||||
 Nilamdyuti Goswami [as], Ihar Hrachyshka [be], Alexander Shopov [bg],
 | 
			
		||||
 David Planella [ca], Carles Ferrando [ca@valencia], Kenneth Nielsen [dk],
 | 
			
		||||
 Bruce Cowan [en_GB], Daniel Mustieles [es], Mattias Põldaru [et],
 | 
			
		||||
 Inaki Larranaga Murgoitio [eu], Timo Jyrinki [fi], Fran Diéguez [gl],
 | 
			
		||||
 Gabor Kelemen [hu], Changwoo Ryu [ko], Anita Reitere [lv],
 | 
			
		||||
 Kjartan Maraas [nb], Wouter Bolsterlee [nl], A S Alam [pa], Piotr Drąg [pl],
 | 
			
		||||
 Duarte Loreto [pt], Yuri Myasoedov [ru], Daniel Nylander [se],
 | 
			
		||||
 Matej Urbančič [sl], Miroslav Nikolić [sr], Tirumurti Vasudevan [ta],
 | 
			
		||||
 Sasi Bhushan [te], Daniel Korostil [uk], Nguyễn Thái Ngọc Duy [vi],
 | 
			
		||||
 YunQiang Su [zh_CN], Chao-Hsiung Liao [zh_HK, zh_TW]
 | 
			
		||||
 | 
			
		||||
3.3.90
 | 
			
		||||
======
 | 
			
		||||
* Update for Cogl API changes [Robert]
 | 
			
		||||
* Bug fixes [Adel, Jasper;  #659643]
 | 
			
		||||
* Build fixes [Jasper, Owen]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
 Robert Bragg, Adel Gadllah, Jasper St. Pierre, Owen Taylor
 | 
			
		||||
 | 
			
		||||
Translations:
 | 
			
		||||
 Ask H. Larsen [dk], Miroslav Nikolić [sr]
 | 
			
		||||
 | 
			
		||||
3.3.5
 | 
			
		||||
=====
 | 
			
		||||
* MetaShapedTexture no longer is a ClutterTexture subclass [Jasper; #660941]
 | 
			
		||||
* Add meta_shaped_texture_get_image() [Jasper; #660941]
 | 
			
		||||
* Cleanups [Rui, Jasper; #657639]
 | 
			
		||||
* Depend on GTK+ 3.3.7 [Rico]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
 Rui Matos, Jasper St. Pierre, Rico Tzschichholz
 | 
			
		||||
 | 
			
		||||
Translations:
 | 
			
		||||
 Kjartan Maraas [nb], Chao-Hsiung Liao [zh_HK, zh_TW]
 | 
			
		||||
 | 
			
		||||
3.3.4
 | 
			
		||||
=====
 | 
			
		||||
* Adapt to changes in GtkStateFlags [Owen]
 | 
			
		||||
* Redo properties for applications menu corresponding to GTK+ changes -
 | 
			
		||||
  they are now _GTK_* not DBUS_*. [Ryan]
 | 
			
		||||
* Fix crash on gnome-shell restart when a modal dialog is open [Owen; #668299]
 | 
			
		||||
* Code cleanup [Florian; #666039]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
 Ryan Lortie, Florian Müllner, Owen Taylor
 | 
			
		||||
 | 
			
		||||
Translations:
 | 
			
		||||
 Alexander Shopov [bg], Fran Diéguez [gl]
 | 
			
		||||
 | 
			
		||||
3.3.3
 | 
			
		||||
=====
 | 
			
		||||
* Add keybindings for tiling to left or right [Florian; #648700]
 | 
			
		||||
* Support GTK+'s hide-titlebar-when-maximized hint [Florian; #665617]
 | 
			
		||||
* Load _DBUS_APPLICATION_ID, _DBUS_UNIQUE_NAME, _DBUS_OBJECT_PATH
 | 
			
		||||
  property [Colin, Ryan; #664851]
 | 
			
		||||
* Handle changes to workspaces-only-on-primary GSetting [Florian; #664853]
 | 
			
		||||
* Don't use the Clutter default stage [Jasper; #664028]
 | 
			
		||||
* Fix compilation with --disable-introspection [Lionel; #661871]
 | 
			
		||||
* Fix problem where stage could end up mis-sized on startup with
 | 
			
		||||
  multiple monitors [Lionel]
 | 
			
		||||
* Misc bug fixes [Adel, Lionel, Jasper; #666015]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
 Adel Gadllah, Lionel Landwerlin, Florian Müllner, Jasper St. Pierre
 | 
			
		||||
 | 
			
		||||
Translations:
 | 
			
		||||
 Daniel Mustieles [es], Yaron Shahrabani [he], Kjartan Maraas [nb],
 | 
			
		||||
 Matej Urbančič [sk], Muhammet Kara [tr]
 | 
			
		||||
 | 
			
		||||
3.3.2
 | 
			
		||||
=====
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										133
									
								
								configure.in
									
									
									
									
									
								
							
							
						
						
									
										133
									
								
								configure.in
									
									
									
									
									
								
							@@ -1,8 +1,8 @@
 | 
			
		||||
AC_PREREQ(2.50)
 | 
			
		||||
 | 
			
		||||
m4_define([mutter_major_version], [3])
 | 
			
		||||
m4_define([mutter_minor_version], [3])
 | 
			
		||||
m4_define([mutter_micro_version], [2])
 | 
			
		||||
m4_define([mutter_minor_version], [6])
 | 
			
		||||
m4_define([mutter_micro_version], [3])
 | 
			
		||||
 | 
			
		||||
m4_define([mutter_version],
 | 
			
		||||
          [mutter_major_version.mutter_minor_version.mutter_micro_version])
 | 
			
		||||
@@ -61,12 +61,21 @@ AC_CHECK_SIZEOF(__int64)
 | 
			
		||||
## byte order
 | 
			
		||||
AC_C_BIGENDIAN
 | 
			
		||||
 | 
			
		||||
GTK_MIN_VERSION=3.3.3
 | 
			
		||||
GIO_MIN_VERSION=2.25.10
 | 
			
		||||
CANBERRA_GTK=libcanberra-gtk3
 | 
			
		||||
CANBERRA_GTK_VERSION=0.26
 | 
			
		||||
 | 
			
		||||
MUTTER_PC_MODULES="gtk+-3.0 >= $GTK_MIN_VERSION gio-2.0 >= $GIO_MIN_VERSION pango >= 1.2.0 cairo >= 1.10.0 gsettings-desktop-schemas >= 3.3.0"
 | 
			
		||||
CLUTTER_PACKAGE=clutter-1.0
 | 
			
		||||
 | 
			
		||||
MUTTER_PC_MODULES="
 | 
			
		||||
   gtk+-3.0 >= 3.3.7
 | 
			
		||||
   gio-2.0 >= 2.25.10
 | 
			
		||||
   pango >= 1.2.0
 | 
			
		||||
   cairo >= 1.10.0
 | 
			
		||||
   gsettings-desktop-schemas >= 3.3.0
 | 
			
		||||
   xcomposite >= 0.2 xfixes xrender xdamage
 | 
			
		||||
   $CLUTTER_PACKAGE >= 1.9.10
 | 
			
		||||
   cogl-1.0 >= 1.9.6
 | 
			
		||||
"
 | 
			
		||||
 | 
			
		||||
GLIB_GSETTINGS
 | 
			
		||||
 | 
			
		||||
@@ -104,17 +113,14 @@ AC_ARG_ENABLE(shape,
 | 
			
		||||
                 [disable mutter's use of the shaped window extension]),,
 | 
			
		||||
  enable_shape=auto)
 | 
			
		||||
 | 
			
		||||
## try definining HAVE_BACKTRACE
 | 
			
		||||
AC_CHECK_HEADERS(execinfo.h, [AC_CHECK_FUNCS(backtrace)])
 | 
			
		||||
 | 
			
		||||
AM_GLIB_GNU_GETTEXT
 | 
			
		||||
 | 
			
		||||
## here we get the flags we'll actually use
 | 
			
		||||
# GRegex requires Glib-2.14.0
 | 
			
		||||
PKG_CHECK_MODULES(ALL, glib-2.0 >= 2.14.0)
 | 
			
		||||
# gtk_window_set_icon_name requires gtk2+-2.6.0
 | 
			
		||||
PKG_CHECK_MODULES(MUTTER_MESSAGE, gtk+-3.0 >= $GTK_MIN_VERSION)
 | 
			
		||||
PKG_CHECK_MODULES(MUTTER_WINDOW_DEMO, gtk+-3.0 >= $GTK_MIN_VERSION)
 | 
			
		||||
PKG_CHECK_MODULES(MUTTER_MESSAGE, gtk+-3.0)
 | 
			
		||||
PKG_CHECK_MODULES(MUTTER_WINDOW_DEMO, gtk+-3.0)
 | 
			
		||||
 | 
			
		||||
# Unconditionally use this dir to avoid a circular dep with gnomecc
 | 
			
		||||
GNOME_KEYBINDINGS_KEYSDIR="${datadir}/gnome-control-center/keybindings"
 | 
			
		||||
@@ -164,31 +170,6 @@ else
 | 
			
		||||
  fi
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
XCOMPOSITE_VERSION=0.2
 | 
			
		||||
 | 
			
		||||
AC_MSG_CHECKING([Xcomposite >= $XCOMPOSITE_VERSION])
 | 
			
		||||
if $PKG_CONFIG --atleast-version $XCOMPOSITE_VERSION xcomposite; then
 | 
			
		||||
  MUTTER_PC_MODULES="$MUTTER_PC_MODULES xcomposite >= $XCOMPOSITE_VERSION xfixes xrender xdamage"
 | 
			
		||||
  AC_DEFINE(HAVE_COMPOSITE_EXTENSIONS, 1, [Building with compositing manager support])
 | 
			
		||||
  echo "Building with compositing manager"
 | 
			
		||||
 | 
			
		||||
  ## force on render also
 | 
			
		||||
  have_xrender=yes
 | 
			
		||||
else
 | 
			
		||||
  AC_MSG_ERROR([no. Mutter requires the Xcomposite extension to build.])
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
CLUTTER_VERSION=1.7.5
 | 
			
		||||
CLUTTER_PACKAGE=clutter-1.0
 | 
			
		||||
AC_SUBST(CLUTTER_PACKAGE)
 | 
			
		||||
if $PKG_CONFIG --atleast-version $CLUTTER_VERSION $CLUTTER_PACKAGE ; then
 | 
			
		||||
  MUTTER_PC_MODULES="$MUTTER_PC_MODULES $CLUTTER_PACKAGE "
 | 
			
		||||
  PKG_CHECK_MODULES(CLUTTER, $CLUTTER_PACKAGE)
 | 
			
		||||
  AC_DEFINE(WITH_CLUTTER, , [Building with Clutter compositor])
 | 
			
		||||
else
 | 
			
		||||
  AC_MSG_ERROR([no. Mutter requires Clutter version $CLUTTER_VERSION.])
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
INTROSPECTION_VERSION=0.9.5
 | 
			
		||||
GOBJECT_INTROSPECTION_CHECK([$INTROSPECTION_VERSION])
 | 
			
		||||
 | 
			
		||||
@@ -220,64 +201,39 @@ fi
 | 
			
		||||
 | 
			
		||||
PKG_CHECK_MODULES(MUTTER, $MUTTER_PC_MODULES)
 | 
			
		||||
 | 
			
		||||
# This is used for plugins
 | 
			
		||||
AC_SUBST(CLUTTER_PACKAGE)
 | 
			
		||||
PKG_CHECK_MODULES(CLUTTER, $CLUTTER_PACKAGE)
 | 
			
		||||
 | 
			
		||||
AC_PATH_XTRA
 | 
			
		||||
 | 
			
		||||
ALL_X_LIBS="$X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS"
 | 
			
		||||
 | 
			
		||||
# Check for Xinerama extension (Solaris impl or Xfree impl)
 | 
			
		||||
# Check for Xinerama extension - we only support the "XFree86" style,
 | 
			
		||||
# and not the older Solaris-only version; recent Solaris supports the
 | 
			
		||||
# XFree86 style.
 | 
			
		||||
mutter_save_cppflags="$CPPFLAGS"
 | 
			
		||||
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
 | 
			
		||||
 | 
			
		||||
AC_ARG_ENABLE(xinerama,
 | 
			
		||||
  AC_HELP_STRING([--disable-xinerama],
 | 
			
		||||
                 [disable mutter's use of the Xinerama extension]),
 | 
			
		||||
  try_xinerama=$enable_xinerama,try_xinerama=yes)
 | 
			
		||||
 | 
			
		||||
use_solaris_xinerama=no
 | 
			
		||||
use_xfree_xinerama=no
 | 
			
		||||
if test "${try_xinerama}" != no; then
 | 
			
		||||
    case "$host" in
 | 
			
		||||
        *-*-solaris*)
 | 
			
		||||
            # Check for solaris
 | 
			
		||||
            use_solaris_xinerama=yes
 | 
			
		||||
            AC_CHECK_LIB(Xext, XineramaGetInfo,
 | 
			
		||||
                         use_solaris_xinerama=yes, use_solaris_xinerama=no,
 | 
			
		||||
                         $ALL_X_LIBS)
 | 
			
		||||
            if test "x$use_solaris_xinerama" = "xyes"; then
 | 
			
		||||
                AC_CHECK_HEADER(X11/extensions/xinerama.h,
 | 
			
		||||
                                if test -z "`echo $ALL_X_LIBS | grep "\-lXext" 2> /dev/null`"; then
 | 
			
		||||
                                    X_EXTRA_LIBS="-lXext $X_EXTRA_LIBS"
 | 
			
		||||
                                fi
 | 
			
		||||
                                AC_DEFINE(HAVE_SOLARIS_XINERAMA, , [Have Solaris-style Xinerama])
 | 
			
		||||
                                AC_DEFINE(HAVE_XINERAMA, , [Have some version of Xinerama]),
 | 
			
		||||
                                use_solaris_xinerama=no,
 | 
			
		||||
                                [#include <X11/Xlib.h>])
 | 
			
		||||
            fi
 | 
			
		||||
            AC_MSG_CHECKING(for Xinerama support on Solaris)
 | 
			
		||||
            AC_MSG_RESULT($use_solaris_xinerama);
 | 
			
		||||
            ;;
 | 
			
		||||
        *)
 | 
			
		||||
            # Check for XFree
 | 
			
		||||
            use_xfree_xinerama=yes
 | 
			
		||||
            AC_CHECK_LIB(Xinerama, XineramaQueryExtension,
 | 
			
		||||
                [AC_CHECK_HEADER(X11/extensions/Xinerama.h,
 | 
			
		||||
                                 X_EXTRA_LIBS="-lXinerama $X_EXTRA_LIBS"
 | 
			
		||||
                                 if test -z "`echo $ALL_X_LIBS | grep "\-lXext" 2> /dev/null`"; then
 | 
			
		||||
                                     X_EXTRA_LIBS="-lXext $X_EXTRA_LIBS"
 | 
			
		||||
                                 fi
 | 
			
		||||
                                 AC_DEFINE(HAVE_XFREE_XINERAMA, , [Have XFree86-style Xinerama])
 | 
			
		||||
                                 AC_DEFINE(HAVE_XINERAMA,, [Have some version of Xinerama]),
 | 
			
		||||
                                 use_xfree_xinerama=no,
 | 
			
		||||
                                 [#include <X11/Xlib.h>])],
 | 
			
		||||
                use_xfree_xinerama=no, -lXext $ALL_X_LIBS)
 | 
			
		||||
            AC_MSG_CHECKING(for Xinerama support on XFree86)
 | 
			
		||||
            AC_MSG_RESULT($use_xfree_xinerama);
 | 
			
		||||
            ;;
 | 
			
		||||
    esac
 | 
			
		||||
fi
 | 
			
		||||
have_xinerama=yes
 | 
			
		||||
AC_CHECK_LIB(Xinerama, XineramaQueryExtension,
 | 
			
		||||
    [AC_CHECK_HEADER(X11/extensions/Xinerama.h,
 | 
			
		||||
		     [X_EXTRA_LIBS="-lXinerama $X_EXTRA_LIBS"
 | 
			
		||||
		     if test -z "`echo $ALL_X_LIBS | grep "\-lXext" 2> /dev/null`"; then
 | 
			
		||||
			 X_EXTRA_LIBS="-lXext $X_EXTRA_LIBS"
 | 
			
		||||
		     fi],
 | 
			
		||||
		     have_xinerama=no,
 | 
			
		||||
		     [#include <X11/Xlib.h>])],
 | 
			
		||||
    have_xinerama=no, -lXext $ALL_X_LIBS)
 | 
			
		||||
AC_MSG_CHECKING(for Xinerama support)
 | 
			
		||||
AC_MSG_RESULT($have_xinerama)
 | 
			
		||||
 | 
			
		||||
CPPFLAGS="$mutter_save_cppflags"
 | 
			
		||||
 | 
			
		||||
if test x$have_xinerama = xno; then
 | 
			
		||||
   AC_MSG_ERROR([Xinerama extension was not found])
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
SHAPE_LIBS=
 | 
			
		||||
found_shape=no
 | 
			
		||||
AC_CHECK_LIB(Xext, XShapeQueryExtension,
 | 
			
		||||
@@ -408,9 +364,6 @@ fi
 | 
			
		||||
# For fix-meta-rectangle.py
 | 
			
		||||
AM_PATH_PYTHON([2.5])
 | 
			
		||||
 | 
			
		||||
# Use gnome-doc-utils:
 | 
			
		||||
GNOME_DOC_INIT([0.8.0])
 | 
			
		||||
 | 
			
		||||
#### Warnings (last since -Werror can disturb other tests)
 | 
			
		||||
 | 
			
		||||
# Stay command-line compatible with the gnome-common configure option. Here
 | 
			
		||||
@@ -470,7 +423,7 @@ if test "$enable_compile_warnings" != no ; then
 | 
			
		||||
    if test "$enable_compile_warnings" = error; then
 | 
			
		||||
      case " $CFLAGS " in
 | 
			
		||||
      *[\ \	]-Werror[\ \	]*) ;;
 | 
			
		||||
      *) CFLAGS="$CFLAGS -Werror" ;;
 | 
			
		||||
      *) CFLAGS="$CFLAGS -Werror -Wno-error=deprecated-declarations" ;;
 | 
			
		||||
      esac
 | 
			
		||||
    fi
 | 
			
		||||
  fi
 | 
			
		||||
@@ -508,8 +461,6 @@ mutter-$VERSION
 | 
			
		||||
	source code location:	  ${srcdir}
 | 
			
		||||
	compiler:		  ${CC}
 | 
			
		||||
 | 
			
		||||
	XFree86 Xinerama:         ${use_xfree_xinerama}
 | 
			
		||||
	Solaris Xinerama:         ${use_solaris_xinerama}
 | 
			
		||||
	Startup notification:     ${have_startup_notification}
 | 
			
		||||
	libcanberra:              ${have_libcanberra}
 | 
			
		||||
	Introspection:            ${found_introspection}
 | 
			
		||||
@@ -524,8 +475,8 @@ MUTTER_MINOR_VERSION=mutter_minor_version
 | 
			
		||||
if expr $MUTTER_MINOR_VERSION % 2 > /dev/null ; then
 | 
			
		||||
   stable_version=`expr $MUTTER_MINOR_VERSION - 1`
 | 
			
		||||
   echo "This is the UNSTABLE branch of mutter"
 | 
			
		||||
   echo -n "Use 2.$stable_version.x for stable "
 | 
			
		||||
   echo    "(gnome-2-$stable_version branch in git)"
 | 
			
		||||
   echo -n "Use 3.$stable_version.x for stable "
 | 
			
		||||
   echo    "(gnome-3-$stable_version branch in git)"
 | 
			
		||||
else
 | 
			
		||||
   echo "This is the stable branch of mutter"
 | 
			
		||||
fi
 | 
			
		||||
 
 | 
			
		||||
@@ -31,8 +31,7 @@ workspaces.  In these cases, there needs to be a rule consistent with
 | 
			
		||||
the above about the new window to choose.
 | 
			
		||||
 | 
			
		||||
Focus method  Behavior
 | 
			
		||||
    click     Focus the most recently used window (same as the window
 | 
			
		||||
              on top)
 | 
			
		||||
    click     Focus the window on top
 | 
			
		||||
   sloppy     Focus the window containing the pointer if there is such
 | 
			
		||||
              a window, otherwise focus the most recently used window.
 | 
			
		||||
    mouse     Focus the non-DESKTOP window containing the pointer if
 | 
			
		||||
 
 | 
			
		||||
@@ -39,4 +39,11 @@ environment.</description>
 | 
			
		||||
      <gnome:userid>otaylor</gnome:userid>
 | 
			
		||||
    </foaf:Person>
 | 
			
		||||
  </maintainer>
 | 
			
		||||
  <maintainer>
 | 
			
		||||
    <foaf:Person>
 | 
			
		||||
      <foaf:name>Florian Müllner</foaf:name>
 | 
			
		||||
      <foaf:mbox rdf:resource="mailto:fmuellner@gnome.org" />
 | 
			
		||||
      <gnome:userid>fmuellner</gnome:userid>
 | 
			
		||||
    </foaf:Person>
 | 
			
		||||
  </maintainer>
 | 
			
		||||
</Project>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
# List of source files containing translatable strings.
 | 
			
		||||
# Please keep this file sorted alphabetically.
 | 
			
		||||
src/50-mutter-windows.xml.in
 | 
			
		||||
src/compositor/compositor.c
 | 
			
		||||
src/core/bell.c
 | 
			
		||||
src/core/core.c
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2892
									
								
								po/bn_IN.po
									
									
									
									
									
								
							
							
						
						
									
										2892
									
								
								po/bn_IN.po
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1259
									
								
								po/ca@valencia.po
									
									
									
									
									
								
							
							
						
						
									
										1259
									
								
								po/ca@valencia.po
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1219
									
								
								po/en_GB.po
									
									
									
									
									
								
							
							
						
						
									
										1219
									
								
								po/en_GB.po
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										522
									
								
								po/et.po
									
									
									
									
									
								
							
							
						
						
									
										522
									
								
								po/et.po
									
									
									
									
									
								
							@@ -7,253 +7,39 @@
 | 
			
		||||
#
 | 
			
		||||
# Tõivo Leedjärv <toivo linux ee>, 2004.
 | 
			
		||||
# Ivar Smolin <okul linux ee>, 2005, 2006, 2009–2011.
 | 
			
		||||
# Mattias Põldaru <mahfiaz gmail com>, 2008–2011.
 | 
			
		||||
# Mattias Põldaru <mahfiaz@gmail.com>, 2008–2011, 2012.
 | 
			
		||||
#
 | 
			
		||||
msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: mutter MASTER\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
 | 
			
		||||
"product=mutter&component=general\n"
 | 
			
		||||
"POT-Creation-Date: 2011-03-07 23:35+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2011-03-09 06:41+0200\n"
 | 
			
		||||
"Last-Translator: Ivar Smolin <okul@linux.ee>\n"
 | 
			
		||||
"Language-Team: Estonian <gnome-et@linux.ee>\n"
 | 
			
		||||
"product=mutter&keywords=I18N+L10N&component=general\n"
 | 
			
		||||
"POT-Creation-Date: 2012-10-17 08:23+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2012-10-21 20:52+0300\n"
 | 
			
		||||
"Last-Translator: Mattias Põldaru <mahfiaz@gmail.com>\n"
 | 
			
		||||
"Language-Team: Estonian <>\n"
 | 
			
		||||
"Language: et\n"
 | 
			
		||||
"MIME-Version: 1.0\n"
 | 
			
		||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
"Content-Transfer-Encoding: 8bit\n"
 | 
			
		||||
"Language: et\n"
 | 
			
		||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
 | 
			
		||||
"Plural-Forms: nplurals=2; plural=(n!=1);\n"
 | 
			
		||||
 | 
			
		||||
msgid "Switch to workspace 1"
 | 
			
		||||
msgstr "Lülitumine 1. tööalale"
 | 
			
		||||
msgid "Windows"
 | 
			
		||||
msgstr "Aknad"
 | 
			
		||||
 | 
			
		||||
msgid "Switch to workspace 2"
 | 
			
		||||
msgstr "Lülitumine 2. tööalale"
 | 
			
		||||
msgid "View split on left"
 | 
			
		||||
msgstr "Vaade poolitatakse vasakult"
 | 
			
		||||
 | 
			
		||||
msgid "Switch to workspace 3"
 | 
			
		||||
msgstr "Lülitumine 3. tööalale"
 | 
			
		||||
msgid "View split on right"
 | 
			
		||||
msgstr "Vaade poolitatakse paremalt"
 | 
			
		||||
 | 
			
		||||
msgid "Switch to workspace 4"
 | 
			
		||||
msgstr "Lülitumine 4. tööalale"
 | 
			
		||||
 | 
			
		||||
msgid "Switch to workspace 5"
 | 
			
		||||
msgstr "Lülitumine 5. tööalale"
 | 
			
		||||
 | 
			
		||||
msgid "Switch to workspace 6"
 | 
			
		||||
msgstr "Lülitumine 6. tööalale"
 | 
			
		||||
 | 
			
		||||
msgid "Switch to workspace 7"
 | 
			
		||||
msgstr "Lülitumine 7. tööalale"
 | 
			
		||||
 | 
			
		||||
msgid "Switch to workspace 8"
 | 
			
		||||
msgstr "Lülitumine 8. tööalale"
 | 
			
		||||
 | 
			
		||||
msgid "Switch to workspace 9"
 | 
			
		||||
msgstr "Lülitumine 9. tööalale"
 | 
			
		||||
 | 
			
		||||
msgid "Switch to workspace 10"
 | 
			
		||||
msgstr "Lülitumine 10. tööalale"
 | 
			
		||||
 | 
			
		||||
msgid "Switch to workspace 11"
 | 
			
		||||
msgstr "Lülitumine 11. tööalale"
 | 
			
		||||
 | 
			
		||||
msgid "Switch to workspace 12"
 | 
			
		||||
msgstr "Lülitumine 12. tööalale"
 | 
			
		||||
 | 
			
		||||
msgid "Switch to workspace on the left of the current workspace"
 | 
			
		||||
msgstr "Lülitumine sellest tööalast vasakul olevale tööalale"
 | 
			
		||||
 | 
			
		||||
msgid "Switch to workspace on the right of the current workspace"
 | 
			
		||||
msgstr "Lülitumine sellest tööalast paremal olevale tööalale"
 | 
			
		||||
 | 
			
		||||
msgid "Switch to workspace above the current workspace"
 | 
			
		||||
msgstr "Lülitumine selle tööala kohal olevale tööalale"
 | 
			
		||||
 | 
			
		||||
msgid "Switch to workspace below the current workspace"
 | 
			
		||||
msgstr "Lülitumine selle tööala all olevale tööalale"
 | 
			
		||||
 | 
			
		||||
msgid "Move between windows of an application, using a popup window"
 | 
			
		||||
msgstr "Liigu rakenduse akende vahel, hüpikaknaga"
 | 
			
		||||
 | 
			
		||||
msgid "Move backward between windows of an application, using a popup window"
 | 
			
		||||
msgstr "Liigu rakenduse akende vahel tagasisuunas, hüpikaknaga"
 | 
			
		||||
 | 
			
		||||
msgid "Move between windows, using a popup window"
 | 
			
		||||
msgstr "Liigu akende vahel, hüpikaknaga"
 | 
			
		||||
 | 
			
		||||
msgid "Move backward between windows, using a popup window"
 | 
			
		||||
msgstr "Liigu akende vahel tagasisuunas, hüpikaknaga"
 | 
			
		||||
 | 
			
		||||
msgid "Move between panels and the desktop, using a popup window"
 | 
			
		||||
msgstr "Liigu paneelide ja töölaua vahel, hüpikaknaga"
 | 
			
		||||
 | 
			
		||||
msgid "Move backward between panels and the desktop, using a popup window"
 | 
			
		||||
msgstr "Liigu tagasisuunas paneelide ja töölaua vahel, hüpikaknaga"
 | 
			
		||||
 | 
			
		||||
msgid "Move between windows of an application immediately"
 | 
			
		||||
msgstr "Liigu koheselt rakenduse akende vahel"
 | 
			
		||||
 | 
			
		||||
msgid "Move backward between windows of an application immediately"
 | 
			
		||||
msgstr "Liigu koheselt rakenduse akende vahel tagasisuunas"
 | 
			
		||||
 | 
			
		||||
msgid "Move between windows immediately"
 | 
			
		||||
msgstr "Liigu koheselt akende vahel"
 | 
			
		||||
 | 
			
		||||
msgid "Move backward between windows immediately"
 | 
			
		||||
msgstr "Liigu koheselt akende vahel tagasisuunas"
 | 
			
		||||
 | 
			
		||||
msgid "Move between panels and the desktop immediately"
 | 
			
		||||
msgstr "Liigu koheselt paneeli ja töölaua vahel"
 | 
			
		||||
 | 
			
		||||
msgid "Move backward between panels and the desktop immediately"
 | 
			
		||||
msgstr "Liigu koheselt tagasisuunas paneelide ja töölaua vahel"
 | 
			
		||||
 | 
			
		||||
msgid "Hide all normal windows and set focus to the desktop"
 | 
			
		||||
msgstr "Peida kõik tavalised aknad ja fokuseeri töölaud"
 | 
			
		||||
 | 
			
		||||
msgid "Show the panel's main menu"
 | 
			
		||||
msgstr "Paneeli peamenüü näitamine"
 | 
			
		||||
 | 
			
		||||
msgid "Show the panel's \"Run Application\" dialog box"
 | 
			
		||||
msgstr "Paneeli dialoogi \"Käivita rakendus\" näitamine"
 | 
			
		||||
 | 
			
		||||
msgid "Start or stop recording the session"
 | 
			
		||||
msgstr "Seansi salvestamise käivitamine või seiskamine"
 | 
			
		||||
 | 
			
		||||
msgid "Take a screenshot"
 | 
			
		||||
msgstr "Kuvatõmmise võtmine"
 | 
			
		||||
 | 
			
		||||
msgid "Take a screenshot of a window"
 | 
			
		||||
msgstr "Kuvatõmmise võtmine aknast"
 | 
			
		||||
 | 
			
		||||
msgid "Run a terminal"
 | 
			
		||||
msgstr "Terminali käivitamine"
 | 
			
		||||
 | 
			
		||||
msgid "Activate the window menu"
 | 
			
		||||
msgstr "Aknamenüü aktiveerimine"
 | 
			
		||||
 | 
			
		||||
msgid "Toggle fullscreen mode"
 | 
			
		||||
msgstr "Täisekraanivaate sisse- ja väljalülitamine"
 | 
			
		||||
 | 
			
		||||
msgid "Toggle maximization state"
 | 
			
		||||
msgstr "Maksimeeritud oleku sisse- ja väljalülitamine"
 | 
			
		||||
 | 
			
		||||
msgid "Toggle whether a window will always be visible over other windows"
 | 
			
		||||
msgstr "Lüliti määrab, kas aken on alati teiste akende kohal nähtav"
 | 
			
		||||
 | 
			
		||||
msgid "Maximize window"
 | 
			
		||||
msgstr "Akna maksimeerimine"
 | 
			
		||||
 | 
			
		||||
msgid "Restore window"
 | 
			
		||||
msgstr "Taasta akna suurus"
 | 
			
		||||
 | 
			
		||||
msgid "Toggle shaded state"
 | 
			
		||||
msgstr "Varjatud oleku lüliti"
 | 
			
		||||
 | 
			
		||||
msgid "Minimize window"
 | 
			
		||||
msgstr "Akna minimeerimine"
 | 
			
		||||
 | 
			
		||||
msgid "Close window"
 | 
			
		||||
msgstr "Akna sulgemine"
 | 
			
		||||
 | 
			
		||||
msgid "Move window"
 | 
			
		||||
msgstr "Teisalda aken"
 | 
			
		||||
 | 
			
		||||
msgid "Resize window"
 | 
			
		||||
msgstr "Muuda akna suurust"
 | 
			
		||||
 | 
			
		||||
msgid "Toggle whether window is on all workspaces or just one"
 | 
			
		||||
msgstr "Lüliti määrab, kas aken on kõigil tööaladel või ainult ühel"
 | 
			
		||||
 | 
			
		||||
msgid "Move window to workspace 1"
 | 
			
		||||
msgstr "Akna tõstmine 1. tööalale"
 | 
			
		||||
 | 
			
		||||
msgid "Move window to workspace 2"
 | 
			
		||||
msgstr "Akna tõstmine 2. tööalale"
 | 
			
		||||
 | 
			
		||||
msgid "Move window to workspace 3"
 | 
			
		||||
msgstr "Akna tõstmine 3. tööalale"
 | 
			
		||||
 | 
			
		||||
msgid "Move window to workspace 4"
 | 
			
		||||
msgstr "Akna tõstmine 4. tööalale"
 | 
			
		||||
 | 
			
		||||
msgid "Move window to workspace 5"
 | 
			
		||||
msgstr "Akna tõstmine 5. tööalale"
 | 
			
		||||
 | 
			
		||||
msgid "Move window to workspace 6"
 | 
			
		||||
msgstr "Akna tõstmine 6. tööalale"
 | 
			
		||||
 | 
			
		||||
msgid "Move window to workspace 7"
 | 
			
		||||
msgstr "Akna tõstmine 7. tööalale"
 | 
			
		||||
 | 
			
		||||
msgid "Move window to workspace 8"
 | 
			
		||||
msgstr "Akna tõstmine 8. tööalale"
 | 
			
		||||
 | 
			
		||||
msgid "Move window to workspace 9"
 | 
			
		||||
msgstr "Akna tõstmine 9. tööalale"
 | 
			
		||||
 | 
			
		||||
msgid "Move window to workspace 10"
 | 
			
		||||
msgstr "Akna tõstmine 10. tööalale"
 | 
			
		||||
 | 
			
		||||
msgid "Move window to workspace 11"
 | 
			
		||||
msgstr "Akna tõstmine 11. tööalale"
 | 
			
		||||
 | 
			
		||||
msgid "Move window to workspace 12"
 | 
			
		||||
msgstr "Akna tõstmine 12. tööalale"
 | 
			
		||||
 | 
			
		||||
msgid "Move window one workspace to the left"
 | 
			
		||||
msgstr "Akna tõstmine ühe tööala võrra vasakule"
 | 
			
		||||
 | 
			
		||||
msgid "Move window one workspace to the right"
 | 
			
		||||
msgstr "Akna tõstmine ühe tööala võrra paremale"
 | 
			
		||||
 | 
			
		||||
msgid "Move window one workspace up"
 | 
			
		||||
msgstr "Akna tõstmine ühe tööala võrra ülespoole"
 | 
			
		||||
 | 
			
		||||
msgid "Move window one workspace down"
 | 
			
		||||
msgstr "Akna tõstmine ühe tööala võrra allapoole"
 | 
			
		||||
 | 
			
		||||
msgid "Raise window if it's covered by another window, otherwise lower it"
 | 
			
		||||
msgstr "Tõsta aken, kui seda katab teine aken, muul juhul vii tahapoole"
 | 
			
		||||
 | 
			
		||||
msgid "Raise window above other windows"
 | 
			
		||||
msgstr "Akna tõstmine teiste akende kohale"
 | 
			
		||||
 | 
			
		||||
msgid "Lower window below other windows"
 | 
			
		||||
msgstr "Saada aken teiste taha"
 | 
			
		||||
 | 
			
		||||
msgid "Maximize window vertically"
 | 
			
		||||
msgstr "Maksimeeri aken vertikaalselt"
 | 
			
		||||
 | 
			
		||||
msgid "Maximize window horizontally"
 | 
			
		||||
msgstr "Maksimeeri aken horisontaalselt"
 | 
			
		||||
 | 
			
		||||
msgid "Move window to north-west (top left) corner"
 | 
			
		||||
msgstr "Akna tõstmine ekraani loodepoolsesse (ülemisse vasakusse) nurka"
 | 
			
		||||
 | 
			
		||||
msgid "Move window to north-east (top right) corner"
 | 
			
		||||
msgstr "Akna tõstmine ekraani kirdepoolsesse (ülemisse paremasse) nurka"
 | 
			
		||||
 | 
			
		||||
msgid "Move window to south-west (bottom left) corner"
 | 
			
		||||
msgstr "Akna tõstmine ekraani edelapoolsesse (alumisse vasakusse) nurka"
 | 
			
		||||
 | 
			
		||||
msgid "Move window to south-east (bottom right) corner"
 | 
			
		||||
msgstr "Akna tõstmine ekraani kagupoolsesse (alumisse paremasse) nurka"
 | 
			
		||||
 | 
			
		||||
msgid "Move window to north (top) side of screen"
 | 
			
		||||
msgstr "Akna tõstmine ekraani põhjapoolsesse (ülemisse) serva"
 | 
			
		||||
 | 
			
		||||
msgid "Move window to south (bottom) side of screen"
 | 
			
		||||
msgstr "Akna tõstmine ekraani lõunapoolsesse (alumisse) serva"
 | 
			
		||||
 | 
			
		||||
msgid "Move window to east (right) side of screen"
 | 
			
		||||
msgstr "Akna tõstmine ekraani idapoolsesse (paremasse) serva"
 | 
			
		||||
 | 
			
		||||
msgid "Move window to west (left) side of screen"
 | 
			
		||||
msgstr "Akna tõstmine ekraani läänepoolsesse (vasakusse) serva"
 | 
			
		||||
 | 
			
		||||
msgid "Move window to center of screen"
 | 
			
		||||
msgstr "Akna tõstmine ekraani keskele"
 | 
			
		||||
#. This probably means that a non-WM compositor like xcompmgr is running;
 | 
			
		||||
#. * we have no way to get it to exit
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid ""
 | 
			
		||||
"Another compositing manager is already running on screen %i on display \"%s"
 | 
			
		||||
"\"."
 | 
			
		||||
msgstr "Teine komposiithaldur juba töötab ekraani %i kuval \"%s\"."
 | 
			
		||||
 | 
			
		||||
msgid "Bell event"
 | 
			
		||||
msgstr "Helina sündmus"
 | 
			
		||||
@@ -262,10 +48,12 @@ msgstr "Helina sündmus"
 | 
			
		||||
msgid "Unknown window information request: %d"
 | 
			
		||||
msgstr "Tundmatu aknateabe päring: %d"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a window title
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "<tt>%s</tt> is not responding."
 | 
			
		||||
msgstr "<tt>%s</tt> ei vasta."
 | 
			
		||||
msgid "%s is not responding."
 | 
			
		||||
msgstr "%s ei vasta."
 | 
			
		||||
 | 
			
		||||
msgid "Application is not responding."
 | 
			
		||||
msgstr "Rakendus ei vasta."
 | 
			
		||||
 | 
			
		||||
msgid ""
 | 
			
		||||
"You may choose to wait a short while for it to continue or force the "
 | 
			
		||||
@@ -294,27 +82,6 @@ msgstr ""
 | 
			
		||||
"Mõni teine programm juba kasutab klahvi %s koos muuteklahvidega %x "
 | 
			
		||||
"kiirklahvina\n"
 | 
			
		||||
 | 
			
		||||
#. Displayed when a keybinding which is
 | 
			
		||||
#. * supposed to launch a program fails.
 | 
			
		||||
#.
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid ""
 | 
			
		||||
"There was an error running <tt>%s</tt>:\n"
 | 
			
		||||
"\n"
 | 
			
		||||
"%s"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"<tt>%s</tt> käivitamisel esines viga:\n"
 | 
			
		||||
"\n"
 | 
			
		||||
"%s"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "No command %d has been defined.\n"
 | 
			
		||||
msgstr "Käsku %d pole defineeritud.\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "No terminal command has been defined.\n"
 | 
			
		||||
msgstr "Terminalikäsku pole defineeritud.\n"
 | 
			
		||||
 | 
			
		||||
msgid "Disable connection to session manager"
 | 
			
		||||
msgstr "Seansihalduriga ühendumise keelamine"
 | 
			
		||||
 | 
			
		||||
@@ -361,41 +128,8 @@ msgstr ""
 | 
			
		||||
msgid "Print version"
 | 
			
		||||
msgstr "Versiooni printimine"
 | 
			
		||||
 | 
			
		||||
msgid "Comma-separated list of compositor plugins"
 | 
			
		||||
msgstr "Komaga eraldatud nimekiri komposiitmontaaži pluginatest"
 | 
			
		||||
 | 
			
		||||
#.
 | 
			
		||||
#. * We found it, but it was invalid.  Complain.
 | 
			
		||||
#. *
 | 
			
		||||
#. * FIXME: This replicates the original behaviour, but in the future
 | 
			
		||||
#. * we might consider reverting invalid keys to their original values.
 | 
			
		||||
#. * (We know the old value, so we can look up a suitable string in
 | 
			
		||||
#. * the symtab.)
 | 
			
		||||
#. *
 | 
			
		||||
#. * (Empty comment follows so the translators don't see this.)
 | 
			
		||||
#.
 | 
			
		||||
#.
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "GConf key '%s' is set to an invalid value\n"
 | 
			
		||||
msgstr "GConf võtme '%s' väärtus on vigane\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "%d stored in GConf key %s is out of range %d to %d\n"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"%d, mis on salvestatud GConf võtmes %s, on väljaspool piirkonda %d - %d\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "GConf key \"%s\" is set to an invalid type\n"
 | 
			
		||||
msgstr "GConf-i võti \"%s\" on määratud vigase tüübiga\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "GConf key %s is already in use and can't be used to override %s\n"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"GConfi võti %s on juba kasutusel ja sellega ei saa tühistada võtit %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Can't override GConf key, %s not found\n"
 | 
			
		||||
msgstr "GConfi võtit pole võimalik tühistada, võtit %s ei leitud\n"
 | 
			
		||||
msgid "Mutter plugin to use"
 | 
			
		||||
msgstr "Millist Mutteri pluginat kasutada"
 | 
			
		||||
 | 
			
		||||
msgid ""
 | 
			
		||||
"Workarounds for broken applications disabled. Some applications may not "
 | 
			
		||||
@@ -405,8 +139,8 @@ msgstr ""
 | 
			
		||||
"ei pruugi õigesti käituda.\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Could not parse font description \"%s\" from GConf key %s\n"
 | 
			
		||||
msgstr "Fondi kirjeldust \"%s\" GConf võtmest %s ei saa töödelda\n"
 | 
			
		||||
msgid "Could not parse font description \"%s\" from GSettings key %s\n"
 | 
			
		||||
msgstr "Fondi kirjeldust \"%s\" GSettings võtmest %s pole võimalik töödelda\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid ""
 | 
			
		||||
@@ -416,14 +150,6 @@ msgstr ""
 | 
			
		||||
"Seadistuste andmebaasist leitud \"%s\" ei ole sobiv väärtus hiireklahvi "
 | 
			
		||||
"modifikaatoriks\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Error setting number of workspaces to %d: %s\n"
 | 
			
		||||
msgstr "Viga tööalade arvuks %d määramisel: %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Workspace %d"
 | 
			
		||||
msgstr "Tööala %d"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid ""
 | 
			
		||||
"\"%s\" found in configuration database is not a valid value for keybinding "
 | 
			
		||||
@@ -433,16 +159,8 @@ msgstr ""
 | 
			
		||||
"\"\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Error setting name for workspace %d to \"%s\": %s\n"
 | 
			
		||||
msgstr "Viga tööalale %d nime \"%s\" määramisel: %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Error setting live hidden windows status status: %s\n"
 | 
			
		||||
msgstr "Viga varjus elushoitavate akende oleku määramisel: %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Error setting no tab popup status: %s\n"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgid "Workspace %d"
 | 
			
		||||
msgstr "Tööala %d"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Screen %d on display '%s' is invalid\n"
 | 
			
		||||
@@ -540,10 +258,6 @@ msgstr "Aknahalduri hoiatus: "
 | 
			
		||||
msgid "Window manager error: "
 | 
			
		||||
msgstr "Aknahalduri viga: "
 | 
			
		||||
 | 
			
		||||
#. Translators: This is the title used on dialog boxes
 | 
			
		||||
msgid "Mutter"
 | 
			
		||||
msgstr "Mutter"
 | 
			
		||||
 | 
			
		||||
#. first time through
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid ""
 | 
			
		||||
@@ -581,6 +295,12 @@ msgstr "%s (masinas %s)"
 | 
			
		||||
msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
 | 
			
		||||
msgstr "Vigane WM_TRANSIENT_FOR aknale 0x%lx määratud %s jaoks.\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "WM_TRANSIENT_FOR window 0x%lx for %s would create loop.\n"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"WM_TRANSIENT_FOR aknale 0x%lx määratud %s jaoks tekitaks tsüklilise "
 | 
			
		||||
"korduse.\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid ""
 | 
			
		||||
"Window 0x%lx has property %s\n"
 | 
			
		||||
@@ -604,18 +324,8 @@ msgid ""
 | 
			
		||||
"Property %s on window 0x%lx contained invalid UTF-8 for item %d in the list\n"
 | 
			
		||||
msgstr "Omadus %s aknal 0x%lx sisaldab vigast UTF-8 %d kirjele nimekirjas\n"
 | 
			
		||||
 | 
			
		||||
msgid "Attach modal dialogs"
 | 
			
		||||
msgstr "Modaaldialoogide kinnistamine"
 | 
			
		||||
 | 
			
		||||
msgid ""
 | 
			
		||||
"Determines whether hidden windows (i.e., minimized windows and windows on "
 | 
			
		||||
"other workspaces than the current one) should be kept alive."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Määrab, kas varjatud aknaid (nt minimeeritud ja teistel tööaladel aknad) "
 | 
			
		||||
"hoitakse elus."
 | 
			
		||||
 | 
			
		||||
msgid "Live Hidden Windows"
 | 
			
		||||
msgstr "Varjatud akende aktiivsus"
 | 
			
		||||
msgid "Mutter"
 | 
			
		||||
msgstr "Mutter"
 | 
			
		||||
 | 
			
		||||
msgid "Modifier to use for extended window management operations"
 | 
			
		||||
msgstr "Laiendatud aknaoperatsioonide korral kasutatav muuteklahv"
 | 
			
		||||
@@ -632,6 +342,9 @@ msgstr ""
 | 
			
		||||
"klahv\". Eeldatavasti määratakse selle seose väärtuseks vaikimisi või tühi "
 | 
			
		||||
"sõne."
 | 
			
		||||
 | 
			
		||||
msgid "Attach modal dialogs"
 | 
			
		||||
msgstr "Modaaldialoogide kinnistamine"
 | 
			
		||||
 | 
			
		||||
msgid ""
 | 
			
		||||
"When true, instead of having independent titlebars, modal dialogs appear "
 | 
			
		||||
"attached to the titlebar of the parent window and are moved together with "
 | 
			
		||||
@@ -640,43 +353,80 @@ msgstr ""
 | 
			
		||||
"Kui märgitud, siis eraldi tiitliribade asemel on moodaalsed dialoogid "
 | 
			
		||||
"emaakna tiitliribade küljes ning liiguvad koos emaaknaga."
 | 
			
		||||
 | 
			
		||||
msgid "Enable edge tiling when dropping windows on screen edges"
 | 
			
		||||
msgstr "Akna ümberpaigutamine selle lohistamisel ekraani serva"
 | 
			
		||||
 | 
			
		||||
msgid ""
 | 
			
		||||
"If enabled, dropping windows on vertical screen edges maximizes them "
 | 
			
		||||
"vertically and resizes them horizontally to cover half of the available "
 | 
			
		||||
"area. Dropping windows on the top screen edge maximizes them completely."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Kui märgitud, siis akna lohistamine ekraani külgservale maksimeerib selle "
 | 
			
		||||
"vertikaalselt ja laius katab pool saadaolevast laiusest. Akna lohistamine "
 | 
			
		||||
"ekraani ülaserva maksimeerib akna täielikult."
 | 
			
		||||
 | 
			
		||||
msgid "Workspaces are managed dynamically"
 | 
			
		||||
msgstr "Tööalade dünaamiline haldus"
 | 
			
		||||
 | 
			
		||||
msgid ""
 | 
			
		||||
"Determines whether workspaces are managed dynamically or whether there's a "
 | 
			
		||||
"static number of workspaces (determined by the num-workspaces key in org."
 | 
			
		||||
"gnome.desktop.wm.preferences)."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Määrab, kas tööalasid hallatakse dünaamiliselt või on nende arv staatiline "
 | 
			
		||||
"(arvu määrab org.gnome.desktop.wm.preferences all võti num-workspaces)."
 | 
			
		||||
 | 
			
		||||
msgid "Workspaces only on primary"
 | 
			
		||||
msgstr "Tööalad ainult peamisel"
 | 
			
		||||
 | 
			
		||||
msgid ""
 | 
			
		||||
"Determines whether workspace switching should happen for windows on all "
 | 
			
		||||
"monitors or only for windows on the primary monitor."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Määrab, kas tööalade vahetamine mõjutab kõiki aknaid kõigil monitoridel või "
 | 
			
		||||
"ainult aknaid peamisel monitoril."
 | 
			
		||||
 | 
			
		||||
msgid "No tab popup"
 | 
			
		||||
msgstr "Tabulaatoril pole hüpikakent"
 | 
			
		||||
 | 
			
		||||
msgid ""
 | 
			
		||||
"Determines whether the use of popup and highlight frame should be disabled "
 | 
			
		||||
"for window cycling."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Kui märgitud, siis on hüpikaken ja esiletõstmise raam keelatud akende "
 | 
			
		||||
"vahetamisel."
 | 
			
		||||
 | 
			
		||||
msgid "Delay focus changes until the pointer stops moving"
 | 
			
		||||
msgstr "Fookusemuutused lükatakse edasi kuni kursor peatub"
 | 
			
		||||
 | 
			
		||||
msgid ""
 | 
			
		||||
"If set to true, and the focus mode is either \"sloppy\" or \"mouse\" then "
 | 
			
		||||
"the focus will not be changed immediately when entering a window, but only "
 | 
			
		||||
"after the pointer stops moving."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Kui tõene ning fookusrežiim on kas \"sloppy\" või \"mouse\", siis fookust ei "
 | 
			
		||||
"vahetata kohe, kui kursor aknale liigub, vaid alles pärast kursori peatumist."
 | 
			
		||||
 | 
			
		||||
msgid "Draggable border width"
 | 
			
		||||
msgstr "Lohistatava äärise laius."
 | 
			
		||||
 | 
			
		||||
msgid ""
 | 
			
		||||
"The amount of total draggable borders. If the theme's visible borders are "
 | 
			
		||||
"not enough, invisible borders will be added to meet this value."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Lohistatava äärise laius. Kui kujunduse nähtavatest ääristest ei piisa, "
 | 
			
		||||
"lisatakse puuduoleva osa jaoks nähtamatu ääris."
 | 
			
		||||
 | 
			
		||||
msgid "Select window from tab popup"
 | 
			
		||||
msgstr "Akna valimine tabulaatori hüpikaknalt"
 | 
			
		||||
 | 
			
		||||
msgid "Cancel tab popup"
 | 
			
		||||
msgstr "Tabulaatori hüpikakna katkestamine"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Usage: %s\n"
 | 
			
		||||
msgstr "Kasutamine: %s\n"
 | 
			
		||||
 | 
			
		||||
msgid "Close Window"
 | 
			
		||||
msgstr "Sulge aken"
 | 
			
		||||
 | 
			
		||||
msgid "Window Menu"
 | 
			
		||||
msgstr "Aknamenüü"
 | 
			
		||||
 | 
			
		||||
msgid "Minimize Window"
 | 
			
		||||
msgstr "Akna minimeerimine"
 | 
			
		||||
 | 
			
		||||
msgid "Maximize Window"
 | 
			
		||||
msgstr "Akna maksimeerimine"
 | 
			
		||||
 | 
			
		||||
msgid "Restore Window"
 | 
			
		||||
msgstr "Akna taastamine"
 | 
			
		||||
 | 
			
		||||
msgid "Roll Up Window"
 | 
			
		||||
msgstr "Akna kokkukerimine"
 | 
			
		||||
 | 
			
		||||
msgid "Unroll Window"
 | 
			
		||||
msgstr "Akna lahtikerimine"
 | 
			
		||||
 | 
			
		||||
msgid "Keep Window On Top"
 | 
			
		||||
msgstr "Akna kõige pealmiseks määramine"
 | 
			
		||||
 | 
			
		||||
msgid "Remove Window From Top"
 | 
			
		||||
msgstr "Eemalda aken kõige pealmise kohalt"
 | 
			
		||||
 | 
			
		||||
msgid "Always On Visible Workspace"
 | 
			
		||||
msgstr "Alati nähtaval tööalal"
 | 
			
		||||
 | 
			
		||||
msgid "Put Window On Only One Workspace"
 | 
			
		||||
msgstr "Tõsta aken ainult ühele tööalale"
 | 
			
		||||
 | 
			
		||||
#. Translators: Translate this string the same way as you do in libwnck!
 | 
			
		||||
msgid "Mi_nimize"
 | 
			
		||||
msgstr "_Minimeeri"
 | 
			
		||||
@@ -877,6 +627,30 @@ msgstr "Raami geomeetria ei määra nuppude suurust"
 | 
			
		||||
msgid "Gradients should have at least two colors"
 | 
			
		||||
msgstr "Värviüleminekus peaks olema vähemalt kaks värvi"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid ""
 | 
			
		||||
"GTK custom color specification must have color name and fallback in "
 | 
			
		||||
"parentheses, e.g. gtk:custom(foo,bar); could not parse \"%s\""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"GTK kohandatud värvi määrang peab sisaldama sulgudes värvi nimetust ning "
 | 
			
		||||
"varuvärvi, nt gtk:custom(foo,bar); väärtust \"%s\" pole võimalik töödelda"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid ""
 | 
			
		||||
"Invalid character '%c' in color_name parameter of gtk:custom, only A-Za-z0-9-"
 | 
			
		||||
"_ are valid"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"gtk:custom color_name parameetris sobimatu märk '%c', lubatud on ainult A-Za-"
 | 
			
		||||
"z0-9-_"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid ""
 | 
			
		||||
"Gtk:custom format is \"gtk:custom(color_name,fallback)\", \"%s\" does not "
 | 
			
		||||
"fit the format"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Gtk:custom vorming on \"gtk:custom(värvi_nimi,varuvärv)\", \"%s\" ei sobi "
 | 
			
		||||
"selle vorminguga"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid ""
 | 
			
		||||
"GTK color specification must have the state in brackets, e.g. gtk:fg[NORMAL] "
 | 
			
		||||
@@ -1511,25 +1285,3 @@ msgstr "y väärtus oli %d, oodati väärtust %d"
 | 
			
		||||
msgid "%d coordinate expressions parsed in %g seconds (%g seconds average)\n"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"%d koordinaatide avaldis töödeldi %g sekundiga (keskmine %g sekundit)\n"
 | 
			
		||||
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "Don't make fullscreen windows that are maximized and have no decorations"
 | 
			
		||||
#~ msgstr "Ei tehta maksimeeritud ilma raamita täisekraanaknaid."
 | 
			
		||||
 | 
			
		||||
#~ msgid "Whether window popup/frame should be shown when cycling windows."
 | 
			
		||||
#~ msgstr "Kas hüpikakent/raami näidatakse akende vahetamisel."
 | 
			
		||||
 | 
			
		||||
#~ msgid "Internal argument for GObject introspection"
 | 
			
		||||
#~ msgstr "GObject enesevaatluse siseargument"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Failed to restart: %s\n"
 | 
			
		||||
#~ msgstr "Tõrge taaskäivitamisel: %s\n"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Error setting clutter plugin list: %s\n"
 | 
			
		||||
#~ msgstr "Viga clutteri pluginate nimekirja määramisel: %s\n"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Clutter Plugins"
 | 
			
		||||
#~ msgstr "Clutteri pluginad"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Plugins to load for the Clutter-based compositing manager."
 | 
			
		||||
#~ msgstr "Clutteril põhineva komposiitmontaažihalduri laadimise pluginad."
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										415
									
								
								po/nb.po
									
									
									
									
									
								
							
							
						
						
									
										415
									
								
								po/nb.po
									
									
									
									
									
								
							@@ -1,13 +1,13 @@
 | 
			
		||||
# Norwegian (bokmål) translation of mutter.
 | 
			
		||||
# Norwegian bokmål translation of mutter.
 | 
			
		||||
# Copyright © 2002-2004 Free Software Foundation, Inc.
 | 
			
		||||
# Kjartan Maraas <kmaraas@gnome.org>, 2002-2011.
 | 
			
		||||
# Kjartan Maraas <kmaraas@gnome.org>, 2002-2012.
 | 
			
		||||
#
 | 
			
		||||
msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: mutter 3.3.x\n"
 | 
			
		||||
"Project-Id-Version: mutter 3.6.x\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: \n"
 | 
			
		||||
"POT-Creation-Date: 2011-11-13 11:14+0100\n"
 | 
			
		||||
"PO-Revision-Date: 2011-11-13 11:15+0100\n"
 | 
			
		||||
"POT-Creation-Date: 2012-10-13 12:51+0200\n"
 | 
			
		||||
"PO-Revision-Date: 2012-10-13 12:51+0200\n"
 | 
			
		||||
"Last-Translator: Kjartan Maraas <kmaraas@gnome.org>\n"
 | 
			
		||||
"Language-Team: Norwegian bokmål <i18n-no@lister.ping.uio.no>\n"
 | 
			
		||||
"Language: \n"
 | 
			
		||||
@@ -15,6 +15,18 @@ msgstr ""
 | 
			
		||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
"Content-Transfer-Encoding: 8bit\n"
 | 
			
		||||
 | 
			
		||||
#: ../src/50-mutter-windows.xml.in.h:1
 | 
			
		||||
msgid "Windows"
 | 
			
		||||
msgstr "Vinduer"
 | 
			
		||||
 | 
			
		||||
#: ../src/50-mutter-windows.xml.in.h:2
 | 
			
		||||
msgid "View split on left"
 | 
			
		||||
msgstr "Visning delt til venstre"
 | 
			
		||||
 | 
			
		||||
#: ../src/50-mutter-windows.xml.in.h:3
 | 
			
		||||
msgid "View split on right"
 | 
			
		||||
msgstr "Visning delt til høyre"
 | 
			
		||||
 | 
			
		||||
#. This probably means that a non-WM compositor like xcompmgr is running;
 | 
			
		||||
#. * we have no way to get it to exit
 | 
			
		||||
#: ../src/compositor/compositor.c:492
 | 
			
		||||
@@ -24,7 +36,7 @@ msgid ""
 | 
			
		||||
"\"."
 | 
			
		||||
msgstr "En annen compositing manager kjører skjerm %i på display «%s»."
 | 
			
		||||
 | 
			
		||||
#: ../src/core/bell.c:309
 | 
			
		||||
#: ../src/core/bell.c:320
 | 
			
		||||
msgid "Bell event"
 | 
			
		||||
msgstr "Klokkehendelse"
 | 
			
		||||
 | 
			
		||||
@@ -33,16 +45,16 @@ msgstr "Klokkehendelse"
 | 
			
		||||
msgid "Unknown window information request: %d"
 | 
			
		||||
msgstr "Ukjent forespørsel om vindusinformasjon: %d"
 | 
			
		||||
 | 
			
		||||
#: ../src/core/delete.c:111
 | 
			
		||||
#: ../src/core/delete.c:113
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "<tt>%s</tt> is not responding."
 | 
			
		||||
msgstr "<tt>%s</tt> svarer ikke."
 | 
			
		||||
msgid "%s is not responding."
 | 
			
		||||
msgstr "%s svarer ikke."
 | 
			
		||||
 | 
			
		||||
#: ../src/core/delete.c:114
 | 
			
		||||
#: ../src/core/delete.c:117
 | 
			
		||||
msgid "Application is not responding."
 | 
			
		||||
msgstr "Programmet svarer ikke."
 | 
			
		||||
 | 
			
		||||
#: ../src/core/delete.c:119
 | 
			
		||||
#: ../src/core/delete.c:122
 | 
			
		||||
msgid ""
 | 
			
		||||
"You may choose to wait a short while for it to continue or force the "
 | 
			
		||||
"application to quit entirely."
 | 
			
		||||
@@ -50,25 +62,25 @@ msgstr ""
 | 
			
		||||
"Du kan velge å vente en kort stund for å se om det fortsetter eller tvinge "
 | 
			
		||||
"programmet til å avslutte helt."
 | 
			
		||||
 | 
			
		||||
#: ../src/core/delete.c:126
 | 
			
		||||
#: ../src/core/delete.c:129
 | 
			
		||||
msgid "_Wait"
 | 
			
		||||
msgstr "_Vent"
 | 
			
		||||
 | 
			
		||||
#: ../src/core/delete.c:126
 | 
			
		||||
#: ../src/core/delete.c:129
 | 
			
		||||
msgid "_Force Quit"
 | 
			
		||||
msgstr "_Tvungen nedstenging"
 | 
			
		||||
 | 
			
		||||
#: ../src/core/display.c:365
 | 
			
		||||
#: ../src/core/display.c:396
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Missing %s extension required for compositing"
 | 
			
		||||
msgstr "Mangler utvidelsen %s som kreves for komposittfunksjon"
 | 
			
		||||
 | 
			
		||||
#: ../src/core/display.c:431
 | 
			
		||||
#: ../src/core/display.c:492
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Failed to open X Window System display '%s'\n"
 | 
			
		||||
msgstr "Feil under åpning av X Window System skjerm «%s»\n"
 | 
			
		||||
 | 
			
		||||
#: ../src/core/keybindings.c:759
 | 
			
		||||
#: ../src/core/keybindings.c:853
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid ""
 | 
			
		||||
"Some other program is already using the key %s with modifiers %x as a "
 | 
			
		||||
@@ -77,36 +89,36 @@ msgstr ""
 | 
			
		||||
"Et annet program bruker allerede nøkkelen %s med modifikatorer %x som "
 | 
			
		||||
"binding\n"
 | 
			
		||||
 | 
			
		||||
#: ../src/core/main.c:206
 | 
			
		||||
#: ../src/core/main.c:196
 | 
			
		||||
msgid "Disable connection to session manager"
 | 
			
		||||
msgstr "Deaktiver tilkobling til sesjonshåndtereren"
 | 
			
		||||
 | 
			
		||||
#: ../src/core/main.c:212
 | 
			
		||||
#: ../src/core/main.c:202
 | 
			
		||||
msgid "Replace the running window manager"
 | 
			
		||||
msgstr "Erstatt kjørende vindushåndterer"
 | 
			
		||||
 | 
			
		||||
#: ../src/core/main.c:218
 | 
			
		||||
#: ../src/core/main.c:208
 | 
			
		||||
msgid "Specify session management ID"
 | 
			
		||||
msgstr "Oppgi sesjonshåndterings-ID"
 | 
			
		||||
 | 
			
		||||
#: ../src/core/main.c:223
 | 
			
		||||
#: ../src/core/main.c:213
 | 
			
		||||
msgid "X Display to use"
 | 
			
		||||
msgstr "X-skjerm som skal brukes"
 | 
			
		||||
 | 
			
		||||
#: ../src/core/main.c:229
 | 
			
		||||
#: ../src/core/main.c:219
 | 
			
		||||
msgid "Initialize session from savefile"
 | 
			
		||||
msgstr "Initier sesjonen fra en lagret fil"
 | 
			
		||||
 | 
			
		||||
#: ../src/core/main.c:235
 | 
			
		||||
#: ../src/core/main.c:225
 | 
			
		||||
msgid "Make X calls synchronous"
 | 
			
		||||
msgstr "Gjør X-kall synkrone"
 | 
			
		||||
 | 
			
		||||
#: ../src/core/main.c:504
 | 
			
		||||
#: ../src/core/main.c:494
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Failed to scan themes directory: %s\n"
 | 
			
		||||
msgstr "Feil under søk i temakatalog: %s\n"
 | 
			
		||||
 | 
			
		||||
#: ../src/core/main.c:520
 | 
			
		||||
#: ../src/core/main.c:510
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid ""
 | 
			
		||||
"Could not find a theme! Be sure %s exists and contains the usual themes.\n"
 | 
			
		||||
@@ -114,7 +126,7 @@ msgstr ""
 | 
			
		||||
"Kunne ikke finne et tema! Sjekk at %s eksisterer og inneholder de vanlige "
 | 
			
		||||
"temaene.\n"
 | 
			
		||||
 | 
			
		||||
#: ../src/core/mutter.c:42
 | 
			
		||||
#: ../src/core/mutter.c:40
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid ""
 | 
			
		||||
"mutter %s\n"
 | 
			
		||||
@@ -128,15 +140,15 @@ msgstr ""
 | 
			
		||||
"Dette er fri programvare; se i kildekoden for kopibetingelser.\n"
 | 
			
		||||
"Det gis INGEN garanti.\n"
 | 
			
		||||
 | 
			
		||||
#: ../src/core/mutter.c:56
 | 
			
		||||
#: ../src/core/mutter.c:54
 | 
			
		||||
msgid "Print version"
 | 
			
		||||
msgstr "Skriv versjonsnummer"
 | 
			
		||||
 | 
			
		||||
#: ../src/core/mutter.c:62
 | 
			
		||||
msgid "Comma-separated list of compositor plugins"
 | 
			
		||||
msgstr "Kommaseparert liste av tillegg for compositor"
 | 
			
		||||
#: ../src/core/mutter.c:60
 | 
			
		||||
msgid "Mutter plugin to use"
 | 
			
		||||
msgstr "Mutter-tillegg som skal brukes"
 | 
			
		||||
 | 
			
		||||
#: ../src/core/prefs.c:1072
 | 
			
		||||
#: ../src/core/prefs.c:1079
 | 
			
		||||
msgid ""
 | 
			
		||||
"Workarounds for broken applications disabled. Some applications may not "
 | 
			
		||||
"behave properly.\n"
 | 
			
		||||
@@ -144,12 +156,12 @@ msgstr ""
 | 
			
		||||
"Funksjonalitet for å gå rundt ødelagte programmer er deaktivert. Noen "
 | 
			
		||||
"programmer vil kanskje ikke oppføre seg korrekt.\n"
 | 
			
		||||
 | 
			
		||||
#: ../src/core/prefs.c:1147
 | 
			
		||||
#: ../src/core/prefs.c:1154
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Could not parse font description \"%s\" from GSettings key %s\n"
 | 
			
		||||
msgstr "Kunne ikke tolke skriftbeskrivelsen «%s» fra GSettings-nøkkel %s\n"
 | 
			
		||||
 | 
			
		||||
#: ../src/core/prefs.c:1213
 | 
			
		||||
#: ../src/core/prefs.c:1220
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid ""
 | 
			
		||||
"\"%s\" found in configuration database is not a valid value for mouse button "
 | 
			
		||||
@@ -158,7 +170,7 @@ msgstr ""
 | 
			
		||||
"«%s» funnet i konfigurasjonsdatabasen er ikke en gyldig verdi for endring av "
 | 
			
		||||
"musknapp\n"
 | 
			
		||||
 | 
			
		||||
#: ../src/core/prefs.c:1746
 | 
			
		||||
#: ../src/core/prefs.c:1747
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid ""
 | 
			
		||||
"\"%s\" found in configuration database is not a valid value for keybinding "
 | 
			
		||||
@@ -167,17 +179,17 @@ msgstr ""
 | 
			
		||||
"«%s» funnet i konfigurasjonsdatabasen er ikke en gyldig verdi for "
 | 
			
		||||
"tastaturbinding «%s»\n"
 | 
			
		||||
 | 
			
		||||
#: ../src/core/prefs.c:1848
 | 
			
		||||
#: ../src/core/prefs.c:1844
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Workspace %d"
 | 
			
		||||
msgstr "Arbeidsområde %d"
 | 
			
		||||
 | 
			
		||||
#: ../src/core/screen.c:741
 | 
			
		||||
#: ../src/core/screen.c:652
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Screen %d on display '%s' is invalid\n"
 | 
			
		||||
msgstr "Skjerm %d på display «%s» er ugyldig\n"
 | 
			
		||||
 | 
			
		||||
#: ../src/core/screen.c:757
 | 
			
		||||
#: ../src/core/screen.c:668
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid ""
 | 
			
		||||
"Screen %d on display \"%s\" already has a window manager; try using the --"
 | 
			
		||||
@@ -186,19 +198,19 @@ msgstr ""
 | 
			
		||||
"Skjerm %d på display «%s» har allerede en vindushåndterer; prøv å bruke "
 | 
			
		||||
"flagget --replace for å erstatte aktiv vindushåndterer.\n"
 | 
			
		||||
 | 
			
		||||
#: ../src/core/screen.c:784
 | 
			
		||||
#: ../src/core/screen.c:695
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid ""
 | 
			
		||||
"Could not acquire window manager selection on screen %d display \"%s\"\n"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Kunne ikke hente utvalg fra vinduhåndterer på skjerm %d, display «%s»\n"
 | 
			
		||||
 | 
			
		||||
#: ../src/core/screen.c:839
 | 
			
		||||
#: ../src/core/screen.c:750
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Screen %d on display \"%s\" already has a window manager\n"
 | 
			
		||||
msgstr "Skjerm %d på display «%s» har allerede en vinduhåndterer\n"
 | 
			
		||||
 | 
			
		||||
#: ../src/core/screen.c:1024
 | 
			
		||||
#: ../src/core/screen.c:935
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Could not release screen %d on display \"%s\"\n"
 | 
			
		||||
msgstr "Kunne ikke slippe skjerm %d på display «%s»\n"
 | 
			
		||||
@@ -258,44 +270,44 @@ msgstr ""
 | 
			
		||||
"Disse vinduene støtter ikke "lagre aktiv konfigurasjon"og vil "
 | 
			
		||||
"måtte startes på nytt manuelt neste gang du logger inn."
 | 
			
		||||
 | 
			
		||||
#: ../src/core/util.c:111
 | 
			
		||||
#: ../src/core/util.c:80
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Failed to open debug log: %s\n"
 | 
			
		||||
msgstr "Feil under åpning av feilsøkingslogg: %s\n"
 | 
			
		||||
 | 
			
		||||
#: ../src/core/util.c:121
 | 
			
		||||
#: ../src/core/util.c:90
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Failed to fdopen() log file %s: %s\n"
 | 
			
		||||
msgstr "Feil under fdopen() av loggfil %s: %s\n"
 | 
			
		||||
 | 
			
		||||
#: ../src/core/util.c:127
 | 
			
		||||
#: ../src/core/util.c:96
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Opened log file %s\n"
 | 
			
		||||
msgstr "Åpnet loggfil %s\n"
 | 
			
		||||
 | 
			
		||||
#: ../src/core/util.c:146 ../src/tools/mutter-message.c:149
 | 
			
		||||
#: ../src/core/util.c:115 ../src/tools/mutter-message.c:149
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Mutter was compiled without support for verbose mode\n"
 | 
			
		||||
msgstr "Mutter er kompilert uten støtte for «verbose» modus\n"
 | 
			
		||||
 | 
			
		||||
#: ../src/core/util.c:290
 | 
			
		||||
#: ../src/core/util.c:259
 | 
			
		||||
msgid "Window manager: "
 | 
			
		||||
msgstr "Vindushåndterer: "
 | 
			
		||||
 | 
			
		||||
#: ../src/core/util.c:438
 | 
			
		||||
#: ../src/core/util.c:407
 | 
			
		||||
msgid "Bug in window manager: "
 | 
			
		||||
msgstr "Feil i vindushåndterer: "
 | 
			
		||||
 | 
			
		||||
#: ../src/core/util.c:471
 | 
			
		||||
#: ../src/core/util.c:438
 | 
			
		||||
msgid "Window manager warning: "
 | 
			
		||||
msgstr "Advarsel fra vindushåndterer: "
 | 
			
		||||
 | 
			
		||||
#: ../src/core/util.c:499
 | 
			
		||||
#: ../src/core/util.c:466
 | 
			
		||||
msgid "Window manager error: "
 | 
			
		||||
msgstr "Feil i vindushåndterer: "
 | 
			
		||||
 | 
			
		||||
#. first time through
 | 
			
		||||
#: ../src/core/window.c:7124
 | 
			
		||||
#: ../src/core/window.c:7237
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid ""
 | 
			
		||||
"Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER "
 | 
			
		||||
@@ -311,7 +323,7 @@ msgstr ""
 | 
			
		||||
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
 | 
			
		||||
#. * about these apps but make them work.
 | 
			
		||||
#.
 | 
			
		||||
#: ../src/core/window.c:7787
 | 
			
		||||
#: ../src/core/window.c:7902
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid ""
 | 
			
		||||
"Window %s sets an MWM hint indicating it isn't resizable, but sets min size "
 | 
			
		||||
@@ -321,22 +333,22 @@ msgstr ""
 | 
			
		||||
"men setter minste størrelse %d x %d og maks størrelse %d x %d; dette virker "
 | 
			
		||||
"ikke fornuftig.\n"
 | 
			
		||||
 | 
			
		||||
#: ../src/core/window-props.c:309
 | 
			
		||||
#: ../src/core/window-props.c:274
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Application set a bogus _NET_WM_PID %lu\n"
 | 
			
		||||
msgstr "Programmet satte en feil _NET_WM_PID %lu\n"
 | 
			
		||||
 | 
			
		||||
#: ../src/core/window-props.c:426
 | 
			
		||||
#: ../src/core/window-props.c:393
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "%s (on %s)"
 | 
			
		||||
msgstr "%s (på %s)"
 | 
			
		||||
 | 
			
		||||
#: ../src/core/window-props.c:1481
 | 
			
		||||
#: ../src/core/window-props.c:1448
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
 | 
			
		||||
msgstr "Ugyldig WM_TRANSIENT_FOR vindu 0x%lx oppgitt for %s.\n"
 | 
			
		||||
 | 
			
		||||
#: ../src/core/window-props.c:1492
 | 
			
		||||
#: ../src/core/window-props.c:1459
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "WM_TRANSIENT_FOR window 0x%lx for %s would create loop.\n"
 | 
			
		||||
msgstr "WM_TRANSIENT_FOR vindu 0x%lx for %s ville skapt en løkke.\n"
 | 
			
		||||
@@ -374,75 +386,10 @@ msgid "Mutter"
 | 
			
		||||
msgstr "Mutter"
 | 
			
		||||
 | 
			
		||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:1
 | 
			
		||||
msgid "Attach modal dialogs"
 | 
			
		||||
msgstr "Fest modale dialoger"
 | 
			
		||||
 | 
			
		||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:2
 | 
			
		||||
msgid "Cancel tab popup"
 | 
			
		||||
msgstr "Avbryt tabulatordialog"
 | 
			
		||||
 | 
			
		||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:3
 | 
			
		||||
msgid ""
 | 
			
		||||
"Determines whether hidden windows (i.e., minimized windows and windows on "
 | 
			
		||||
"other workspaces than the current one) should be kept alive."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Bestemmer om skjulte vinduer, f.eks minimerte vinduer og vinduer på andre "
 | 
			
		||||
"arbeidsområder enn aktivt arbeidsområde, skal holdes i live."
 | 
			
		||||
 | 
			
		||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:4
 | 
			
		||||
msgid ""
 | 
			
		||||
"Determines whether the use of popup and highlight frame should be disabled "
 | 
			
		||||
"for window cycling."
 | 
			
		||||
msgstr "Bestemmer om bruk av dialog og uthevingsramme skal slås av for bytting mellom vinduer."
 | 
			
		||||
 | 
			
		||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:5
 | 
			
		||||
msgid ""
 | 
			
		||||
"Determines whether workspace switching should happen for windows on all "
 | 
			
		||||
"monitors or only for windows on the primary monitor."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Bestemmer om bytting mellom arbeidsområder skal skje for vinduer på alle "
 | 
			
		||||
"skjermer eller kun på primær skjerm."
 | 
			
		||||
 | 
			
		||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:6
 | 
			
		||||
msgid "Draggable border width"
 | 
			
		||||
msgstr "Bredde på drakant"
 | 
			
		||||
 | 
			
		||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:7
 | 
			
		||||
msgid "Enable edge tiling when dropping windows on screen edges"
 | 
			
		||||
msgstr "Slå på kantflising ved slipp av vinduer på skjermkantene"
 | 
			
		||||
 | 
			
		||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:8
 | 
			
		||||
msgid ""
 | 
			
		||||
"If enabled, dropping windows on vertical screen edges maximizes them "
 | 
			
		||||
"vertically and resizes them horizontally to cover half of the available "
 | 
			
		||||
"area. Dropping windows on the top screen edge maximizes them completely."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:9
 | 
			
		||||
msgid "Live Hidden Windows"
 | 
			
		||||
msgstr "Levende skjulte vinduer"
 | 
			
		||||
 | 
			
		||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:10
 | 
			
		||||
msgid "Modifier to use for extended window management operations"
 | 
			
		||||
msgstr "Endringstast som skal brukes for utvidede vindushåndteringsoperasjoner"
 | 
			
		||||
 | 
			
		||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:11
 | 
			
		||||
msgid "No tab popup"
 | 
			
		||||
msgstr "Ingen tabulatordialog"
 | 
			
		||||
 | 
			
		||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:12
 | 
			
		||||
msgid "Select window from tab popup"
 | 
			
		||||
msgstr "Fjern vindu fra tabulatordialog"
 | 
			
		||||
 | 
			
		||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:13
 | 
			
		||||
msgid ""
 | 
			
		||||
"The amount of total draggable borders. If the theme's visible borders are "
 | 
			
		||||
"not enough, invisible borders will be added to meet this value."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Total mengde med drakant. Hvis temas synlige kanter ikke er nok vil usynlige "
 | 
			
		||||
"kanter legges til for å imøtekomme denne verdien."
 | 
			
		||||
 | 
			
		||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:14
 | 
			
		||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:2
 | 
			
		||||
msgid ""
 | 
			
		||||
"This key will initiate the \"overlay\", which is a combination window "
 | 
			
		||||
"overview and application launching system. The default is intended to be the "
 | 
			
		||||
@@ -454,7 +401,11 @@ msgstr ""
 | 
			
		||||
"tasten» på PC-maskinvare. Det forventes at denne bindingen er satt til "
 | 
			
		||||
"forvalg eller en tom streng."
 | 
			
		||||
 | 
			
		||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:15
 | 
			
		||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:3
 | 
			
		||||
msgid "Attach modal dialogs"
 | 
			
		||||
msgstr "Fest modale dialoger"
 | 
			
		||||
 | 
			
		||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:4
 | 
			
		||||
msgid ""
 | 
			
		||||
"When true, instead of having independent titlebars, modal dialogs appear "
 | 
			
		||||
"attached to the titlebar of the parent window and are moved together with "
 | 
			
		||||
@@ -464,59 +415,95 @@ msgstr ""
 | 
			
		||||
"tittellinjen på opphavsvinduet og flyttes sammen med dette i stedet for å ha "
 | 
			
		||||
"individuelle tittellinjer."
 | 
			
		||||
 | 
			
		||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:16
 | 
			
		||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:5
 | 
			
		||||
msgid "Enable edge tiling when dropping windows on screen edges"
 | 
			
		||||
msgstr "Slå på kantflising ved slipp av vinduer på skjermkantene"
 | 
			
		||||
 | 
			
		||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:6
 | 
			
		||||
msgid ""
 | 
			
		||||
"If enabled, dropping windows on vertical screen edges maximizes them "
 | 
			
		||||
"vertically and resizes them horizontally to cover half of the available "
 | 
			
		||||
"area. Dropping windows on the top screen edge maximizes them completely."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Maksimerer vinduer vertikalt og endrer størrelse horisontalt slik at de "
 | 
			
		||||
"dekker halve det tilgjengeligeområdet hvis de slippes på vertikale "
 | 
			
		||||
"skjermkanter. Hvis vindu slippes på øverste kant av skjermen maksimeres de "
 | 
			
		||||
"fullstendig."
 | 
			
		||||
 | 
			
		||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:7
 | 
			
		||||
msgid "Workspaces are managed dynamically"
 | 
			
		||||
msgstr "Arbeidsområder håndteres dynamisk"
 | 
			
		||||
 | 
			
		||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:8
 | 
			
		||||
msgid ""
 | 
			
		||||
"Determines whether workspaces are managed dynamically or whether there's a "
 | 
			
		||||
"static number of workspaces (determined by the num-workspaces key in org."
 | 
			
		||||
"gnome.desktop.wm.preferences)."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Bestemmer om arbeidsområder skal håndteres dynamisk eller om det er et fast "
 | 
			
		||||
"antall arbeidsområder (bestemt av num-workspaces nøkkelen i org.gnome."
 | 
			
		||||
"desktop.wm.preferences)."
 | 
			
		||||
 | 
			
		||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:9
 | 
			
		||||
msgid "Workspaces only on primary"
 | 
			
		||||
msgstr "Arbeidsområder kun på primær skjerm"
 | 
			
		||||
 | 
			
		||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:10
 | 
			
		||||
msgid ""
 | 
			
		||||
"Determines whether workspace switching should happen for windows on all "
 | 
			
		||||
"monitors or only for windows on the primary monitor."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Bestemmer om bytting mellom arbeidsområder skal skje for vinduer på alle "
 | 
			
		||||
"skjermer eller kun på primær skjerm."
 | 
			
		||||
 | 
			
		||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:11
 | 
			
		||||
msgid "No tab popup"
 | 
			
		||||
msgstr "Ingen tabulatordialog"
 | 
			
		||||
 | 
			
		||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:12
 | 
			
		||||
msgid ""
 | 
			
		||||
"Determines whether the use of popup and highlight frame should be disabled "
 | 
			
		||||
"for window cycling."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Bestemmer om bruk av dialog og uthevingsramme skal slås av for bytting "
 | 
			
		||||
"mellom vinduer."
 | 
			
		||||
 | 
			
		||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:13
 | 
			
		||||
msgid "Delay focus changes until the pointer stops moving"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:14
 | 
			
		||||
msgid ""
 | 
			
		||||
"If set to true, and the focus mode is either \"sloppy\" or \"mouse\" then "
 | 
			
		||||
"the focus will not be changed immediately when entering a window, but only "
 | 
			
		||||
"after the pointer stops moving."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:15
 | 
			
		||||
msgid "Draggable border width"
 | 
			
		||||
msgstr "Bredde på drakant"
 | 
			
		||||
 | 
			
		||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:16
 | 
			
		||||
msgid ""
 | 
			
		||||
"The amount of total draggable borders. If the theme's visible borders are "
 | 
			
		||||
"not enough, invisible borders will be added to meet this value."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Total mengde med drakant. Hvis temas synlige kanter ikke er nok vil usynlige "
 | 
			
		||||
"kanter legges til for å imøtekomme denne verdien."
 | 
			
		||||
 | 
			
		||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:17
 | 
			
		||||
msgid "Select window from tab popup"
 | 
			
		||||
msgstr "Fjern vindu fra tabulatordialog"
 | 
			
		||||
 | 
			
		||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:18
 | 
			
		||||
msgid "Cancel tab popup"
 | 
			
		||||
msgstr "Avbryt tabulatordialog"
 | 
			
		||||
 | 
			
		||||
#: ../src/tools/mutter-message.c:123
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Usage: %s\n"
 | 
			
		||||
msgstr " Bruk: %s\n"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/frames.c:1157
 | 
			
		||||
msgid "Close Window"
 | 
			
		||||
msgstr "Lukk vindu"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/frames.c:1160
 | 
			
		||||
msgid "Window Menu"
 | 
			
		||||
msgstr "Vindumeny"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/frames.c:1163
 | 
			
		||||
msgid "Minimize Window"
 | 
			
		||||
msgstr "Minimer vindu"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/frames.c:1166
 | 
			
		||||
msgid "Maximize Window"
 | 
			
		||||
msgstr "Maksimer vindu"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/frames.c:1169
 | 
			
		||||
msgid "Restore Window"
 | 
			
		||||
msgstr "Gjenopprett vindu"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/frames.c:1172
 | 
			
		||||
msgid "Roll Up Window"
 | 
			
		||||
msgstr "Rull opp vindu"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/frames.c:1175
 | 
			
		||||
msgid "Unroll Window"
 | 
			
		||||
msgstr "Rull ned vindu"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/frames.c:1178
 | 
			
		||||
msgid "Keep Window On Top"
 | 
			
		||||
msgstr "Plasser vindu i forgrunnen"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/frames.c:1181
 | 
			
		||||
msgid "Remove Window From Top"
 | 
			
		||||
msgstr "Fjern vindu fra forgrunnen"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/frames.c:1184
 | 
			
		||||
msgid "Always On Visible Workspace"
 | 
			
		||||
msgstr "Alltid på synlig arbeidsområde"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/frames.c:1187
 | 
			
		||||
msgid "Put Window On Only One Workspace"
 | 
			
		||||
msgstr "Plasser vindu kun på ett arbeidsområde"
 | 
			
		||||
 | 
			
		||||
#. Translators: Translate this string the same way as you do in libwnck!
 | 
			
		||||
#: ../src/ui/menu.c:69
 | 
			
		||||
msgid "Mi_nimize"
 | 
			
		||||
@@ -716,48 +703,48 @@ msgstr "Mod5"
 | 
			
		||||
msgid "%d x %d"
 | 
			
		||||
msgstr "%d x %d"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/theme.c:253
 | 
			
		||||
#: ../src/ui/theme.c:234
 | 
			
		||||
msgid "top"
 | 
			
		||||
msgstr "topp"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/theme.c:255
 | 
			
		||||
#: ../src/ui/theme.c:236
 | 
			
		||||
msgid "bottom"
 | 
			
		||||
msgstr "bunn"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/theme.c:257
 | 
			
		||||
#: ../src/ui/theme.c:238
 | 
			
		||||
msgid "left"
 | 
			
		||||
msgstr "venstre"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/theme.c:259
 | 
			
		||||
#: ../src/ui/theme.c:240
 | 
			
		||||
msgid "right"
 | 
			
		||||
msgstr "høyre"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/theme.c:286
 | 
			
		||||
#: ../src/ui/theme.c:268
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "frame geometry does not specify \"%s\" dimension"
 | 
			
		||||
msgstr "rammegeometrien spesifiserer ikke «%s»-dimensjon"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/theme.c:305
 | 
			
		||||
#: ../src/ui/theme.c:287
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "frame geometry does not specify dimension \"%s\" for border \"%s\""
 | 
			
		||||
msgstr "rammegeometri spesifiserer ikke dimensjon «%s» for kant «%s»"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/theme.c:342
 | 
			
		||||
#: ../src/ui/theme.c:324
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Button aspect ratio %g is not reasonable"
 | 
			
		||||
msgstr "Aspektrate %g for knapp er ikke fornuftig"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/theme.c:354
 | 
			
		||||
#: ../src/ui/theme.c:336
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Frame geometry does not specify size of buttons"
 | 
			
		||||
msgstr "Rammegeometrien spesifiserer ikke størrelse på knapper"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/theme.c:1067
 | 
			
		||||
#: ../src/ui/theme.c:1049
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Gradients should have at least two colors"
 | 
			
		||||
msgstr "Gradienter må ha minst to farger"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/theme.c:1219
 | 
			
		||||
#: ../src/ui/theme.c:1201
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid ""
 | 
			
		||||
"GTK custom color specification must have color name and fallback in "
 | 
			
		||||
@@ -766,7 +753,7 @@ msgstr ""
 | 
			
		||||
"Egendefinert GTK-fargespesifikasjon må ha fargenavn og reserve i parantes, f."
 | 
			
		||||
"eks gtk:custom(foo,bar); kunne ikke lese «%s»"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/theme.c:1235
 | 
			
		||||
#: ../src/ui/theme.c:1217
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid ""
 | 
			
		||||
"Invalid character '%c' in color_name parameter of gtk:custom, only A-Za-z0-9-"
 | 
			
		||||
@@ -775,7 +762,7 @@ msgstr ""
 | 
			
		||||
"Ugyldig tegn «%c» i parameter color_name for gtk:custom, kun A-Za-z0-9-_ er "
 | 
			
		||||
"gyldig"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/theme.c:1249
 | 
			
		||||
#: ../src/ui/theme.c:1231
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid ""
 | 
			
		||||
"Gtk:custom format is \"gtk:custom(color_name,fallback)\", \"%s\" does not "
 | 
			
		||||
@@ -784,7 +771,7 @@ msgstr ""
 | 
			
		||||
"Gtk:custom-format er «gtk:custom(color_name,fallback)», «%s» passer ikke i "
 | 
			
		||||
"formatet"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/theme.c:1294
 | 
			
		||||
#: ../src/ui/theme.c:1276
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid ""
 | 
			
		||||
"GTK color specification must have the state in brackets, e.g. gtk:fg[NORMAL] "
 | 
			
		||||
@@ -793,7 +780,7 @@ msgstr ""
 | 
			
		||||
"GTK-fargespesifikasjon må ha tilstand i klammer, f.eks. gtk:fg[NORMAL], hvor "
 | 
			
		||||
"NORMAL er tilstanden; kunne ikke lese «%s»"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/theme.c:1308
 | 
			
		||||
#: ../src/ui/theme.c:1290
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid ""
 | 
			
		||||
"GTK color specification must have a close bracket after the state, e.g. gtk:"
 | 
			
		||||
@@ -802,17 +789,17 @@ msgstr ""
 | 
			
		||||
"GTK-fargespesifikasjon må ha en avsluttende klamme etter tilstanden, f.eks. "
 | 
			
		||||
"gtk:fg[NORMAL], hvor NORMAL er tilstanden; kunne ikke lese «%s»"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/theme.c:1319
 | 
			
		||||
#: ../src/ui/theme.c:1301
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Did not understand state \"%s\" in color specification"
 | 
			
		||||
msgstr "Forsto ikke tilstand «%s» i fargespesifikasjonen"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/theme.c:1332
 | 
			
		||||
#: ../src/ui/theme.c:1314
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Did not understand color component \"%s\" in color specification"
 | 
			
		||||
msgstr "Forsto ikke fargekomponent «%s» i fargespesifikasjonen"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/theme.c:1361
 | 
			
		||||
#: ../src/ui/theme.c:1343
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid ""
 | 
			
		||||
"Blend format is \"blend/bg_color/fg_color/alpha\", \"%s\" does not fit the "
 | 
			
		||||
@@ -821,56 +808,56 @@ msgstr ""
 | 
			
		||||
"Blandingsformat er «blend/bg_color/fg_color/alpha», «%s» passer ikke i "
 | 
			
		||||
"formatet"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/theme.c:1372
 | 
			
		||||
#: ../src/ui/theme.c:1354
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Could not parse alpha value \"%s\" in blended color"
 | 
			
		||||
msgstr "Kunne ikke lese alpha-verdi «%s» i blandet farge"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/theme.c:1382
 | 
			
		||||
#: ../src/ui/theme.c:1364
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Alpha value \"%s\" in blended color is not between 0.0 and 1.0"
 | 
			
		||||
msgstr "Alpha-verdi «%s» i blandet farge er ikke mellom 0.0 og 1.0"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/theme.c:1429
 | 
			
		||||
#: ../src/ui/theme.c:1411
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid ""
 | 
			
		||||
"Shade format is \"shade/base_color/factor\", \"%s\" does not fit the format"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Skyggeformatet er «shade/base_color/factor», «%s» passer ikke i formatet"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/theme.c:1440
 | 
			
		||||
#: ../src/ui/theme.c:1422
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Could not parse shade factor \"%s\" in shaded color"
 | 
			
		||||
msgstr "Kunne ikke lese skyggefaktor «%s» i skyggelagt farge"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/theme.c:1450
 | 
			
		||||
#: ../src/ui/theme.c:1432
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Shade factor \"%s\" in shaded color is negative"
 | 
			
		||||
msgstr "Skyggefaktor «%s» i skyggelagt farge er negativ"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/theme.c:1479
 | 
			
		||||
#: ../src/ui/theme.c:1461
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Could not parse color \"%s\""
 | 
			
		||||
msgstr "Kunne ikke lese farge «%s»"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/theme.c:1790
 | 
			
		||||
#: ../src/ui/theme.c:1778
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Coordinate expression contains character '%s' which is not allowed"
 | 
			
		||||
msgstr "Koordinatuttrykk inneholder tegn «%s» som ikke er tillatt"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/theme.c:1817
 | 
			
		||||
#: ../src/ui/theme.c:1805
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid ""
 | 
			
		||||
"Coordinate expression contains floating point number '%s' which could not be "
 | 
			
		||||
"parsed"
 | 
			
		||||
msgstr "Koordinatuttrykk inneholder flyttall «%s» som ikke kunne tolkes"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/theme.c:1831
 | 
			
		||||
#: ../src/ui/theme.c:1819
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Coordinate expression contains integer '%s' which could not be parsed"
 | 
			
		||||
msgstr "Koordinatuttrykk inneholder heltall «%s» som ikke kunne tolkes"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/theme.c:1953
 | 
			
		||||
#: ../src/ui/theme.c:1940
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid ""
 | 
			
		||||
"Coordinate expression contained unknown operator at the start of this text: "
 | 
			
		||||
@@ -879,39 +866,39 @@ msgstr ""
 | 
			
		||||
"Koordinatuttrykket inneholdt en ukjent operator ved begynnelsen av denne "
 | 
			
		||||
"teksten: «%s»"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/theme.c:2010
 | 
			
		||||
#: ../src/ui/theme.c:1997
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Coordinate expression was empty or not understood"
 | 
			
		||||
msgstr "Koordinatuttrykket var tomt eller ble ikke forstått"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/theme.c:2121 ../src/ui/theme.c:2131 ../src/ui/theme.c:2165
 | 
			
		||||
#: ../src/ui/theme.c:2110 ../src/ui/theme.c:2120 ../src/ui/theme.c:2154
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Coordinate expression results in division by zero"
 | 
			
		||||
msgstr "Koordinatuttrykket resulterer i divisjon med null"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/theme.c:2173
 | 
			
		||||
#: ../src/ui/theme.c:2162
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid ""
 | 
			
		||||
"Coordinate expression tries to use mod operator on a floating-point number"
 | 
			
		||||
msgstr "Koordinatuttrykket prøver å bruke mod-operator på et flyttall"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/theme.c:2229
 | 
			
		||||
#: ../src/ui/theme.c:2218
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid ""
 | 
			
		||||
"Coordinate expression has an operator \"%s\" where an operand was expected"
 | 
			
		||||
msgstr "Koordinatuttrykket har en operator «%s» hvor en operand var ventet"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/theme.c:2238
 | 
			
		||||
#: ../src/ui/theme.c:2227
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Coordinate expression had an operand where an operator was expected"
 | 
			
		||||
msgstr "Koordinatuttrykket hadde en operand hvor en operator var ventet"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/theme.c:2246
 | 
			
		||||
#: ../src/ui/theme.c:2235
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Coordinate expression ended with an operator instead of an operand"
 | 
			
		||||
msgstr "Koordinatuttrykket sluttet med en operator i stedet for en operand"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/theme.c:2256
 | 
			
		||||
#: ../src/ui/theme.c:2245
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid ""
 | 
			
		||||
"Coordinate expression has operator \"%c\" following operator \"%c\" with no "
 | 
			
		||||
@@ -920,38 +907,38 @@ msgstr ""
 | 
			
		||||
"Koordinatuttrykket har en operator «%c» etter en operator «%c» og ingen "
 | 
			
		||||
"operand mellom dem."
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/theme.c:2407 ../src/ui/theme.c:2452
 | 
			
		||||
#: ../src/ui/theme.c:2396 ../src/ui/theme.c:2441
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Coordinate expression had unknown variable or constant \"%s\""
 | 
			
		||||
msgstr "Koordinatuttrykket haddeen ukjent variabel eller konstant «%s»"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/theme.c:2506
 | 
			
		||||
#: ../src/ui/theme.c:2495
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Coordinate expression parser overflowed its buffer."
 | 
			
		||||
msgstr "Tolkeren for koordinatuttrykk oversteg buffergrensen."
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/theme.c:2535
 | 
			
		||||
#: ../src/ui/theme.c:2524
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Coordinate expression had a close parenthesis with no open parenthesis"
 | 
			
		||||
msgstr "Koordinatuttrykket hadde en parantes slutt uten parantes start"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/theme.c:2599
 | 
			
		||||
#: ../src/ui/theme.c:2588
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Coordinate expression had an open parenthesis with no close parenthesis"
 | 
			
		||||
msgstr "Koordinatuttrykket hadde en åpen parantes uten en avsluttende parantes"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/theme.c:2610
 | 
			
		||||
#: ../src/ui/theme.c:2599
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Coordinate expression doesn't seem to have any operators or operands"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Koordinatuttrykket ser ikke ut til å ha noen operatorer eller operander"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/theme.c:2822 ../src/ui/theme.c:2842 ../src/ui/theme.c:2862
 | 
			
		||||
#: ../src/ui/theme.c:2812 ../src/ui/theme.c:2832 ../src/ui/theme.c:2852
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Theme contained an expression that resulted in an error: %s\n"
 | 
			
		||||
msgstr "Tema inneholdt et uttrykk som resulterte i en feil: %s\n"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/theme.c:4533
 | 
			
		||||
#: ../src/ui/theme.c:4498
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid ""
 | 
			
		||||
"<button function=\"%s\" state=\"%s\" draw_ops=\"whatever\"/> must be "
 | 
			
		||||
@@ -960,25 +947,25 @@ msgstr ""
 | 
			
		||||
"<button function=«%s» state=«%s» draw_ops=«ett-eller-annet»/> må "
 | 
			
		||||
"spesifiseres for denne rammestilen"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/theme.c:5066 ../src/ui/theme.c:5091
 | 
			
		||||
#: ../src/ui/theme.c:5009 ../src/ui/theme.c:5034
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid ""
 | 
			
		||||
"Missing <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/>"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Mangler <frame state=«%s» resize=«%s» focus=«%s» stil=«ett-eller-annet»/>"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/theme.c:5139
 | 
			
		||||
#: ../src/ui/theme.c:5082
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Failed to load theme \"%s\": %s\n"
 | 
			
		||||
msgstr "Klarte ikke å laste tema «%s»: %s\n"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/theme.c:5275 ../src/ui/theme.c:5282 ../src/ui/theme.c:5289
 | 
			
		||||
#: ../src/ui/theme.c:5296 ../src/ui/theme.c:5303
 | 
			
		||||
#: ../src/ui/theme.c:5218 ../src/ui/theme.c:5225 ../src/ui/theme.c:5232
 | 
			
		||||
#: ../src/ui/theme.c:5239 ../src/ui/theme.c:5246
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "No <%s> set for theme \"%s\""
 | 
			
		||||
msgstr "<%s> er ikke satt for tema «%s»"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/theme.c:5311
 | 
			
		||||
#: ../src/ui/theme.c:5254
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid ""
 | 
			
		||||
"No frame style set for window type \"%s\" in theme \"%s\", add a <window "
 | 
			
		||||
@@ -987,14 +974,14 @@ msgstr ""
 | 
			
		||||
"Ingen rammestil satt for vindutype «%s» i tema «%s», legg til et <window "
 | 
			
		||||
"type=«%s» style_set=«ett-eller-annet»/>-element"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/theme.c:5709 ../src/ui/theme.c:5771 ../src/ui/theme.c:5834
 | 
			
		||||
#: ../src/ui/theme.c:5650 ../src/ui/theme.c:5712 ../src/ui/theme.c:5775
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid ""
 | 
			
		||||
"User-defined constants must begin with a capital letter; \"%s\" does not"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Brukerdefinerte konstanter må begynne med stor bokstav; «%s» gjør ikke det"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/theme.c:5717 ../src/ui/theme.c:5779 ../src/ui/theme.c:5842
 | 
			
		||||
#: ../src/ui/theme.c:5658 ../src/ui/theme.c:5720 ../src/ui/theme.c:5783
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Constant \"%s\" has already been defined"
 | 
			
		||||
msgstr "Konstant «%s» er allerede definert"
 | 
			
		||||
@@ -1375,7 +1362,7 @@ msgstr "Ingen tekst er tillatt inne i element <%s>"
 | 
			
		||||
msgid "<%s> specified twice for this theme"
 | 
			
		||||
msgstr "<%s> spesifisert to ganger for dette temaet"
 | 
			
		||||
 | 
			
		||||
#: ../src/ui/theme-parser.c:4348
 | 
			
		||||
#: ../src/ui/theme-parser.c:4334
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Failed to find a valid file for theme %s\n"
 | 
			
		||||
msgstr "Fant ikke en gyldig fil for tema %s\n"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1263
									
								
								po/pt_BR.po
									
									
									
									
									
								
							
							
						
						
									
										1263
									
								
								po/pt_BR.po
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										2996
									
								
								po/sr@latin.po
									
									
									
									
									
								
							
							
						
						
									
										2996
									
								
								po/sr@latin.po
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1100
									
								
								po/zh_CN.po
									
									
									
									
									
								
							
							
						
						
									
										1100
									
								
								po/zh_CN.po
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1294
									
								
								po/zh_HK.po
									
									
									
									
									
								
							
							
						
						
									
										1294
									
								
								po/zh_HK.po
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1301
									
								
								po/zh_TW.po
									
									
									
									
									
								
							
							
						
						
									
										1301
									
								
								po/zh_TW.po
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										15
									
								
								src/50-mutter-windows.xml.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								src/50-mutter-windows.xml.in
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8" ?>
 | 
			
		||||
<KeyListEntries schema="org.gnome.mutter.keybindings"
 | 
			
		||||
                group="system"
 | 
			
		||||
                _name="Windows"
 | 
			
		||||
                wm_name="Mutter"
 | 
			
		||||
                package="mutter">
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="toggle-tiled-left"
 | 
			
		||||
                      _description="View split on left"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="toggle-tiled-right"
 | 
			
		||||
                      _description="View split on right"/>
 | 
			
		||||
 | 
			
		||||
</KeyListEntries>
 | 
			
		||||
 | 
			
		||||
@@ -27,8 +27,6 @@ INCLUDES=								\
 | 
			
		||||
	-DGETTEXT_PACKAGE=\"$(GETTEXT_PACKAGE)\"
 | 
			
		||||
 | 
			
		||||
mutter_built_sources = \
 | 
			
		||||
	mutter-marshal.h \
 | 
			
		||||
	mutter-marshal.c \
 | 
			
		||||
	mutter-enum-types.h \
 | 
			
		||||
	mutter-enum-types.c
 | 
			
		||||
 | 
			
		||||
@@ -54,7 +52,6 @@ libmutter_la_SOURCES =				\
 | 
			
		||||
	compositor/meta-shadow-factory.c	\
 | 
			
		||||
	compositor/meta-shadow-factory-private.h	\
 | 
			
		||||
	compositor/meta-shaped-texture.c	\
 | 
			
		||||
	compositor/meta-shaped-texture.h	\
 | 
			
		||||
	compositor/meta-texture-rectangle.c	\
 | 
			
		||||
	compositor/meta-texture-rectangle.h	\
 | 
			
		||||
	compositor/meta-texture-tower.c		\
 | 
			
		||||
@@ -133,8 +130,6 @@ libmutter_la_SOURCES =				\
 | 
			
		||||
	core/core.h				\
 | 
			
		||||
	ui/ui.h					\
 | 
			
		||||
	inlinepixbufs.h				\
 | 
			
		||||
	ui/fixedtip.c				\
 | 
			
		||||
	ui/fixedtip.h				\
 | 
			
		||||
	ui/frames.c				\
 | 
			
		||||
	ui/frames.h				\
 | 
			
		||||
	ui/menu.c				\
 | 
			
		||||
@@ -174,6 +169,7 @@ libmutterinclude_base_headers =		\
 | 
			
		||||
	meta/main.h				\
 | 
			
		||||
	meta/meta-background-actor.h		\
 | 
			
		||||
	meta/meta-plugin.h			\
 | 
			
		||||
	meta/meta-shaped-texture.h		\
 | 
			
		||||
	meta/meta-shadow-factory.h		\
 | 
			
		||||
	meta/meta-window-actor.h		\
 | 
			
		||||
	meta/prefs.h				\
 | 
			
		||||
@@ -226,7 +222,7 @@ INTROSPECTION_GIRS = Meta-$(api_version).gir
 | 
			
		||||
 | 
			
		||||
Meta-$(api_version).gir: libmutter.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
 | 
			
		||||
@META_GIR@_PACKAGES = clutter-1.0 gtk+-3.0
 | 
			
		||||
@META_GIR@_EXPORT_PACKAGES = libmutter
 | 
			
		||||
@META_GIR@_CFLAGS = $(INCLUDES)
 | 
			
		||||
@META_GIR@_LIBS = libmutter.la
 | 
			
		||||
@META_GIR@_FILES =				\
 | 
			
		||||
@@ -261,6 +257,11 @@ 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-windows.xml.in
 | 
			
		||||
xml_DATA     = $(xml_in_files:.xml.in=.xml)
 | 
			
		||||
 | 
			
		||||
gsettings_SCHEMAS = org.gnome.mutter.gschema.xml
 | 
			
		||||
@INTLTOOL_XML_NOMERGE_RULE@
 | 
			
		||||
@GSETTINGS_RULES@
 | 
			
		||||
@@ -279,6 +280,7 @@ CLEANFILES =					\
 | 
			
		||||
	mutter.desktop				\
 | 
			
		||||
	mutter-wm.desktop			\
 | 
			
		||||
	org.gnome.mutter.gschema.xml		\
 | 
			
		||||
	$(xml_DATA)				\
 | 
			
		||||
	$(mutter_built_sources)			\
 | 
			
		||||
	$(typelib_DATA)				\
 | 
			
		||||
	$(gir_DATA)
 | 
			
		||||
@@ -295,38 +297,18 @@ EXTRA_DIST=$(desktopfiles_files) 	\
 | 
			
		||||
	$(IMAGES) 			\
 | 
			
		||||
	$(desktopfiles_in_files)	\
 | 
			
		||||
	$(wmproperties_in_files)	\
 | 
			
		||||
	$(xml_in_files)			\
 | 
			
		||||
	org.gnome.mutter.gschema.xml.in \
 | 
			
		||||
	mutter-schemas.convert \
 | 
			
		||||
	libmutter.pc.in \
 | 
			
		||||
	mutter-plugins.pc.in  \
 | 
			
		||||
	mutter-enum-types.h.in \
 | 
			
		||||
	mutter-enum-types.c.in \
 | 
			
		||||
	mutter-marshal.list
 | 
			
		||||
	mutter-enum-types.c.in
 | 
			
		||||
 | 
			
		||||
BUILT_SOURCES += $(mutter_built_sources)
 | 
			
		||||
MUTTER_STAMP_FILES = stamp-mutter-marshal.h stamp-mutter-enum-types.h
 | 
			
		||||
MUTTER_STAMP_FILES = stamp-mutter-enum-types.h
 | 
			
		||||
CLEANFILES += $(MUTTER_STAMP_FILES)
 | 
			
		||||
 | 
			
		||||
mutter-marshal.h: stamp-mutter-marshal.h
 | 
			
		||||
	@true
 | 
			
		||||
stamp-mutter-marshal.h: Makefile mutter-marshal.list
 | 
			
		||||
	$(AM_V_GEN) $(GLIB_GENMARSHAL) \
 | 
			
		||||
		--prefix=_mutter_marshal \
 | 
			
		||||
		--header \
 | 
			
		||||
	$(srcdir)/mutter-marshal.list > xgen-tmh && \
 | 
			
		||||
	(cmp -s xgen-tmh mutter-marshal.h || cp -f xgen-tmh mutter-marshal.h) && \
 | 
			
		||||
	rm -f xgen-tmh && \
 | 
			
		||||
	echo timestamp > $(@F)
 | 
			
		||||
 | 
			
		||||
mutter-marshal.c: Makefile mutter-marshal.list
 | 
			
		||||
	 $(AM_V_GEN) (echo "#include \"mutter-marshal.h\"" ; \
 | 
			
		||||
	 $(GLIB_GENMARSHAL) \
 | 
			
		||||
		--prefix=_mutter_marshal \
 | 
			
		||||
		--body \
 | 
			
		||||
	 $(srcdir)/mutter-marshal.list ) > xgen-tmc && \
 | 
			
		||||
	cp -f xgen-tmc mutter-marshal.c && \
 | 
			
		||||
	rm -f xgen-tmc
 | 
			
		||||
 | 
			
		||||
mutter-enum-types.h: stamp-mutter-enum-types.h Makefile
 | 
			
		||||
	@true
 | 
			
		||||
stamp-mutter-enum-types.h: $(libmutterinclude_base_headers) mutter-enum-types.h.in
 | 
			
		||||
 
 | 
			
		||||
@@ -55,9 +55,6 @@ struct _MetaCompScreen
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void meta_switch_workspace_completed (MetaScreen    *screen);
 | 
			
		||||
void meta_set_stage_input_region     (MetaScreen    *screen,
 | 
			
		||||
                                      XserverRegion  region);
 | 
			
		||||
void meta_empty_stage_input_region   (MetaScreen    *screen);
 | 
			
		||||
 | 
			
		||||
gboolean meta_begin_modal_for_plugin (MetaScreen       *screen,
 | 
			
		||||
                                      MetaPlugin       *plugin,
 | 
			
		||||
 
 | 
			
		||||
@@ -515,13 +515,15 @@ meta_compositor_manage_screen (MetaCompositor *compositor,
 | 
			
		||||
 | 
			
		||||
  meta_screen_set_cm_selection (screen);
 | 
			
		||||
 | 
			
		||||
  info->stage = clutter_stage_get_default ();
 | 
			
		||||
  info->stage = clutter_stage_new ();
 | 
			
		||||
 | 
			
		||||
  meta_screen_get_size (screen, &width, &height);
 | 
			
		||||
  clutter_actor_set_size (info->stage, width, height);
 | 
			
		||||
  clutter_actor_realize (info->stage);
 | 
			
		||||
 | 
			
		||||
  xwin = clutter_x11_get_stage_window (CLUTTER_STAGE (info->stage));
 | 
			
		||||
 | 
			
		||||
  XResizeWindow (xdisplay, xwin, width, height);
 | 
			
		||||
 | 
			
		||||
  event_mask = FocusChangeMask |
 | 
			
		||||
               ExposureMask |
 | 
			
		||||
               EnterWindowMask | LeaveWindowMask |
 | 
			
		||||
@@ -555,9 +557,7 @@ meta_compositor_manage_screen (MetaCompositor *compositor,
 | 
			
		||||
 | 
			
		||||
  clutter_actor_hide (info->hidden_group);
 | 
			
		||||
 | 
			
		||||
  info->plugin_mgr =
 | 
			
		||||
    meta_plugin_manager_get (screen);
 | 
			
		||||
  meta_plugin_manager_initialize (info->plugin_mgr);
 | 
			
		||||
  info->plugin_mgr = meta_plugin_manager_new (screen);
 | 
			
		||||
 | 
			
		||||
  /*
 | 
			
		||||
   * Delay the creation of the overlay window as long as we can, to avoid
 | 
			
		||||
@@ -869,29 +869,6 @@ meta_compositor_unmaximize_window (MetaCompositor    *compositor,
 | 
			
		||||
  meta_window_actor_unmaximize (window_actor, old_rect, new_rect);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
meta_compositor_update_workspace_geometry (MetaCompositor *compositor,
 | 
			
		||||
                                           MetaWorkspace  *workspace)
 | 
			
		||||
{
 | 
			
		||||
#if 0
 | 
			
		||||
  /* FIXME -- should do away with this function in favour of MetaWorkspace
 | 
			
		||||
   * signal.
 | 
			
		||||
   */
 | 
			
		||||
  MetaScreen     *screen = meta_workspace_get_screen (workspace);
 | 
			
		||||
  MetaCompScreen *info;
 | 
			
		||||
  MetaPluginManager *mgr;
 | 
			
		||||
 | 
			
		||||
  DEBUG_TRACE ("meta_compositor_update_workspace_geometry\n");
 | 
			
		||||
  info = meta_screen_get_compositor_data (screen);
 | 
			
		||||
  mgr  = info->plugin_mgr;
 | 
			
		||||
 | 
			
		||||
  if (!mgr || !workspace)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  meta_plugin_manager_update_workspace (mgr, workspace);
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
meta_compositor_switch_workspace (MetaCompositor     *compositor,
 | 
			
		||||
                                  MetaScreen         *screen,
 | 
			
		||||
@@ -1139,12 +1116,18 @@ meta_compositor_sync_screen_size (MetaCompositor  *compositor,
 | 
			
		||||
				  guint		   width,
 | 
			
		||||
				  guint		   height)
 | 
			
		||||
{
 | 
			
		||||
  MetaCompScreen *info = meta_screen_get_compositor_data (screen);
 | 
			
		||||
  MetaDisplay    *display = meta_screen_get_display (screen);
 | 
			
		||||
  MetaCompScreen *info    = meta_screen_get_compositor_data (screen);
 | 
			
		||||
  Display        *xdisplay;
 | 
			
		||||
  Window          xwin;
 | 
			
		||||
 | 
			
		||||
  DEBUG_TRACE ("meta_compositor_sync_screen_size\n");
 | 
			
		||||
  g_return_if_fail (info);
 | 
			
		||||
 | 
			
		||||
  clutter_actor_set_size (info->stage, width, height);
 | 
			
		||||
  xdisplay = meta_display_get_xdisplay (display);
 | 
			
		||||
  xwin = clutter_x11_get_stage_window (CLUTTER_STAGE (info->stage));
 | 
			
		||||
 | 
			
		||||
  XResizeWindow (xdisplay, xwin, width, height);
 | 
			
		||||
 | 
			
		||||
  meta_background_actor_screen_size_changed (screen);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -28,6 +28,9 @@
 | 
			
		||||
#define COGL_ENABLE_EXPERIMENTAL_API
 | 
			
		||||
#include <cogl/cogl-texture-pixmap-x11.h>
 | 
			
		||||
 | 
			
		||||
#define CLUTTER_ENABLE_EXPERIMENTAL_API
 | 
			
		||||
#include <clutter/clutter.h>
 | 
			
		||||
 | 
			
		||||
#include <X11/Xatom.h>
 | 
			
		||||
 | 
			
		||||
#include "cogl-utils.h"
 | 
			
		||||
@@ -252,6 +255,8 @@ meta_background_actor_dispose (GObject *object)
 | 
			
		||||
      cogl_handle_unref (priv->material);
 | 
			
		||||
      priv->material = COGL_INVALID_HANDLE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  G_OBJECT_CLASS (meta_background_actor_parent_class)->dispose (object);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
@@ -537,9 +542,11 @@ meta_background_actor_update (MetaScreen *screen)
 | 
			
		||||
  if (root_pixmap_id != None)
 | 
			
		||||
    {
 | 
			
		||||
      CoglHandle texture;
 | 
			
		||||
      CoglContext *ctx = clutter_backend_get_cogl_context (clutter_get_default_backend ());
 | 
			
		||||
      GError *error = NULL;
 | 
			
		||||
 | 
			
		||||
      meta_error_trap_push (display);
 | 
			
		||||
      texture = cogl_texture_pixmap_x11_new (root_pixmap_id, FALSE);
 | 
			
		||||
      texture = cogl_texture_pixmap_x11_new (ctx, root_pixmap_id, FALSE, &error);
 | 
			
		||||
      meta_error_trap_pop (display);
 | 
			
		||||
 | 
			
		||||
      if (texture != COGL_INVALID_HANDLE)
 | 
			
		||||
@@ -550,6 +557,12 @@ meta_background_actor_update (MetaScreen *screen)
 | 
			
		||||
          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;
 | 
			
		||||
 
 | 
			
		||||
@@ -35,34 +35,32 @@
 | 
			
		||||
 | 
			
		||||
#include <clutter/x11/clutter-x11.h>
 | 
			
		||||
 | 
			
		||||
static GSList *plugin_types;
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * We have one "default plugin manager" that acts for the first screen,
 | 
			
		||||
 * but also can be used before we open any screens, and additional
 | 
			
		||||
 * plugin managers for each screen. (This is ugly. Probably we should
 | 
			
		||||
 * have one plugin manager and only make the plugins per-screen.)
 | 
			
		||||
 */
 | 
			
		||||
static MetaPluginManager *default_plugin_manager;
 | 
			
		||||
static GType plugin_type = G_TYPE_NONE;
 | 
			
		||||
 | 
			
		||||
struct MetaPluginManager
 | 
			
		||||
{
 | 
			
		||||
  MetaScreen   *screen;
 | 
			
		||||
 | 
			
		||||
  GList /* MetaPlugin */ *plugins;  /* TODO -- maybe use hash table */
 | 
			
		||||
  MetaScreen *screen;
 | 
			
		||||
  MetaPlugin *plugin;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
meta_plugin_manager_set_plugin_type (GType gtype)
 | 
			
		||||
{
 | 
			
		||||
  if (plugin_type != G_TYPE_NONE)
 | 
			
		||||
    meta_fatal ("Mutter plugin already set: %s", g_type_name (plugin_type));
 | 
			
		||||
 | 
			
		||||
  plugin_type = gtype;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Loads the given plugin.
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
meta_plugin_manager_load (MetaPluginManager *plugin_mgr,
 | 
			
		||||
                          const gchar       *plugin_name)
 | 
			
		||||
meta_plugin_manager_load (const gchar       *plugin_name)
 | 
			
		||||
{
 | 
			
		||||
  const gchar *dpath = MUTTER_PLUGIN_DIR "/";
 | 
			
		||||
  gchar       *path;
 | 
			
		||||
  MetaModule  *module;
 | 
			
		||||
  GType        plugin_type;
 | 
			
		||||
 | 
			
		||||
  if (g_path_is_absolute (plugin_name))
 | 
			
		||||
    path = g_strdup (plugin_name);
 | 
			
		||||
@@ -81,162 +79,57 @@ meta_plugin_manager_load (MetaPluginManager *plugin_mgr,
 | 
			
		||||
      exit (1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  plugin_type = meta_module_get_plugin_type (module);
 | 
			
		||||
  meta_plugin_manager_register (plugin_mgr, plugin_type);
 | 
			
		||||
  meta_plugin_manager_set_plugin_type (meta_module_get_plugin_type (module));
 | 
			
		||||
 | 
			
		||||
  g_type_module_unuse (G_TYPE_MODULE (module));
 | 
			
		||||
  g_free (path);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Registers the given plugin type
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
meta_plugin_manager_register (MetaPluginManager *plugin_mgr,
 | 
			
		||||
                              GType              plugin_type)
 | 
			
		||||
{
 | 
			
		||||
  MetaPlugin  *plugin;
 | 
			
		||||
 | 
			
		||||
  plugin_types = g_slist_prepend (plugin_types, GSIZE_TO_POINTER (plugin_type));
 | 
			
		||||
 | 
			
		||||
  plugin = g_object_new (plugin_type, NULL);
 | 
			
		||||
  plugin_mgr->plugins = g_list_prepend (plugin_mgr->plugins, plugin);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
meta_plugin_manager_initialize (MetaPluginManager *plugin_mgr)
 | 
			
		||||
{
 | 
			
		||||
  GList *iter;
 | 
			
		||||
 | 
			
		||||
  if (!plugin_mgr->plugins)
 | 
			
		||||
    {
 | 
			
		||||
      /*
 | 
			
		||||
       * If no plugins are specified, load the default plugin.
 | 
			
		||||
       */
 | 
			
		||||
      meta_plugin_manager_load (plugin_mgr, "default");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  for (iter = plugin_mgr->plugins; iter; iter = iter->next)
 | 
			
		||||
    {
 | 
			
		||||
      MetaPlugin *plugin = (MetaPlugin*) iter->data;
 | 
			
		||||
      MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin);
 | 
			
		||||
 | 
			
		||||
      g_object_set (plugin,
 | 
			
		||||
                    "screen", plugin_mgr->screen,
 | 
			
		||||
                    NULL);
 | 
			
		||||
 | 
			
		||||
      if (klass->start)
 | 
			
		||||
        klass->start (plugin);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static MetaPluginManager *
 | 
			
		||||
MetaPluginManager *
 | 
			
		||||
meta_plugin_manager_new (MetaScreen *screen)
 | 
			
		||||
{
 | 
			
		||||
  MetaPluginManager *plugin_mgr;
 | 
			
		||||
  MetaPluginClass *klass;
 | 
			
		||||
  MetaPlugin *plugin;
 | 
			
		||||
 | 
			
		||||
  plugin_mgr = g_new0 (MetaPluginManager, 1);
 | 
			
		||||
  plugin_mgr->screen = screen;
 | 
			
		||||
  plugin_mgr->plugin = plugin = g_object_new (plugin_type, "screen", screen, NULL);
 | 
			
		||||
 | 
			
		||||
  if (screen)
 | 
			
		||||
    g_object_set_data (G_OBJECT (screen), "meta-plugin-manager", plugin_mgr);
 | 
			
		||||
  klass = META_PLUGIN_GET_CLASS (plugin);
 | 
			
		||||
 | 
			
		||||
  if (klass->start)
 | 
			
		||||
    klass->start (plugin);
 | 
			
		||||
 | 
			
		||||
  return plugin_mgr;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
MetaPluginManager *
 | 
			
		||||
meta_plugin_manager_get_default (void)
 | 
			
		||||
{
 | 
			
		||||
  if (!default_plugin_manager)
 | 
			
		||||
    {
 | 
			
		||||
      default_plugin_manager = meta_plugin_manager_new (NULL);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return default_plugin_manager;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
MetaPluginManager *
 | 
			
		||||
meta_plugin_manager_get (MetaScreen *screen)
 | 
			
		||||
{
 | 
			
		||||
  MetaPluginManager *plugin_mgr;
 | 
			
		||||
 | 
			
		||||
  plugin_mgr = g_object_get_data (G_OBJECT (screen), "meta-plugin-manager");
 | 
			
		||||
  if (plugin_mgr)
 | 
			
		||||
    return plugin_mgr;
 | 
			
		||||
 | 
			
		||||
  if (!default_plugin_manager)
 | 
			
		||||
    meta_plugin_manager_get_default ();
 | 
			
		||||
 | 
			
		||||
  if (!default_plugin_manager->screen)
 | 
			
		||||
    {
 | 
			
		||||
      /* The default plugin manager is so far unused, we can recycle it */
 | 
			
		||||
      default_plugin_manager->screen = screen;
 | 
			
		||||
      g_object_set_data (G_OBJECT (screen), "meta-plugin-manager", default_plugin_manager);
 | 
			
		||||
 | 
			
		||||
      return default_plugin_manager;
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      GSList *iter;
 | 
			
		||||
      GType plugin_type;
 | 
			
		||||
      MetaPlugin *plugin;
 | 
			
		||||
 | 
			
		||||
      plugin_mgr = meta_plugin_manager_new (screen);
 | 
			
		||||
 | 
			
		||||
      for (iter = plugin_types; iter; iter = iter->next)
 | 
			
		||||
        {
 | 
			
		||||
          plugin_type = (GType)GPOINTER_TO_SIZE (iter->data);
 | 
			
		||||
          plugin = g_object_new (plugin_type, "screen", screen,  NULL);
 | 
			
		||||
          plugin_mgr->plugins = g_list_prepend (plugin_mgr->plugins, plugin);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      return plugin_mgr;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
meta_plugin_manager_kill_window_effects (MetaPluginManager *plugin_mgr,
 | 
			
		||||
                                         MetaWindowActor   *actor)
 | 
			
		||||
{
 | 
			
		||||
  GList *l = plugin_mgr->plugins;
 | 
			
		||||
  MetaPlugin        *plugin = plugin_mgr->plugin;
 | 
			
		||||
  MetaPluginClass   *klass = META_PLUGIN_GET_CLASS (plugin);
 | 
			
		||||
 | 
			
		||||
  while (l)
 | 
			
		||||
    {
 | 
			
		||||
      MetaPlugin        *plugin = l->data;
 | 
			
		||||
      MetaPluginClass   *klass = META_PLUGIN_GET_CLASS (plugin);
 | 
			
		||||
 | 
			
		||||
      if (!meta_plugin_disabled (plugin)
 | 
			
		||||
	  && klass->kill_window_effects)
 | 
			
		||||
        klass->kill_window_effects (plugin, actor);
 | 
			
		||||
 | 
			
		||||
      l = l->next;
 | 
			
		||||
    }
 | 
			
		||||
  if (klass->kill_window_effects)
 | 
			
		||||
    klass->kill_window_effects (plugin, actor);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
meta_plugin_manager_kill_switch_workspace (MetaPluginManager *plugin_mgr)
 | 
			
		||||
{
 | 
			
		||||
  GList *l = plugin_mgr->plugins;
 | 
			
		||||
  MetaPlugin        *plugin = plugin_mgr->plugin;
 | 
			
		||||
  MetaPluginClass   *klass = META_PLUGIN_GET_CLASS (plugin);
 | 
			
		||||
 | 
			
		||||
  while (l)
 | 
			
		||||
    {
 | 
			
		||||
      MetaPlugin        *plugin = l->data;
 | 
			
		||||
      MetaPluginClass   *klass = META_PLUGIN_GET_CLASS (plugin);
 | 
			
		||||
 | 
			
		||||
      if (!meta_plugin_disabled (plugin)
 | 
			
		||||
          && (meta_plugin_features (plugin) & META_PLUGIN_SWITCH_WORKSPACE)
 | 
			
		||||
	  && klass->kill_switch_workspace)
 | 
			
		||||
        klass->kill_switch_workspace (plugin);
 | 
			
		||||
 | 
			
		||||
      l = l->next;
 | 
			
		||||
    }
 | 
			
		||||
  if (klass->kill_switch_workspace)
 | 
			
		||||
    klass->kill_switch_workspace (plugin);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Public method that the compositor hooks into for events that require
 | 
			
		||||
 * no additional parameters.
 | 
			
		||||
 *
 | 
			
		||||
 * Returns TRUE if at least one of the plugins handled the event type (i.e.,
 | 
			
		||||
 * Returns TRUE if the plugin handled the event type (i.e.,
 | 
			
		||||
 * if the return value is FALSE, there will be no subsequent call to the
 | 
			
		||||
 * manager completed() callback, and the compositor must ensure that any
 | 
			
		||||
 * appropriate post-effect cleanup is carried out.
 | 
			
		||||
@@ -246,60 +139,48 @@ meta_plugin_manager_event_simple (MetaPluginManager *plugin_mgr,
 | 
			
		||||
                                  MetaWindowActor   *actor,
 | 
			
		||||
                                  unsigned long      event)
 | 
			
		||||
{
 | 
			
		||||
  GList *l = plugin_mgr->plugins;
 | 
			
		||||
  gboolean retval = FALSE;
 | 
			
		||||
  MetaPlugin *plugin = plugin_mgr->plugin;
 | 
			
		||||
  MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin);
 | 
			
		||||
  MetaDisplay *display  = meta_screen_get_display (plugin_mgr->screen);
 | 
			
		||||
  gboolean retval = FALSE;
 | 
			
		||||
 | 
			
		||||
  if (display->display_opening)
 | 
			
		||||
    return FALSE;
 | 
			
		||||
 | 
			
		||||
  while (l)
 | 
			
		||||
  switch (event)
 | 
			
		||||
    {
 | 
			
		||||
      MetaPlugin        *plugin = l->data;
 | 
			
		||||
      MetaPluginClass   *klass = META_PLUGIN_GET_CLASS (plugin);
 | 
			
		||||
 | 
			
		||||
      if (!meta_plugin_disabled (plugin) &&
 | 
			
		||||
          (meta_plugin_features (plugin) & event))
 | 
			
		||||
    case META_PLUGIN_MINIMIZE:
 | 
			
		||||
      if (klass->minimize)
 | 
			
		||||
        {
 | 
			
		||||
          retval = TRUE;
 | 
			
		||||
          meta_plugin_manager_kill_window_effects (plugin_mgr,
 | 
			
		||||
                                                   actor);
 | 
			
		||||
 | 
			
		||||
          switch (event)
 | 
			
		||||
            {
 | 
			
		||||
            case META_PLUGIN_MINIMIZE:
 | 
			
		||||
              if (klass->minimize)
 | 
			
		||||
                {
 | 
			
		||||
                  meta_plugin_manager_kill_window_effects (
 | 
			
		||||
		      plugin_mgr,
 | 
			
		||||
		      actor);
 | 
			
		||||
 | 
			
		||||
                  _meta_plugin_effect_started (plugin);
 | 
			
		||||
                  klass->minimize (plugin, actor);
 | 
			
		||||
                }
 | 
			
		||||
              break;
 | 
			
		||||
            case META_PLUGIN_MAP:
 | 
			
		||||
              if (klass->map)
 | 
			
		||||
                {
 | 
			
		||||
                  meta_plugin_manager_kill_window_effects (
 | 
			
		||||
		      plugin_mgr,
 | 
			
		||||
		      actor);
 | 
			
		||||
 | 
			
		||||
                  _meta_plugin_effect_started (plugin);
 | 
			
		||||
                  klass->map (plugin, actor);
 | 
			
		||||
                }
 | 
			
		||||
              break;
 | 
			
		||||
            case META_PLUGIN_DESTROY:
 | 
			
		||||
              if (klass->destroy)
 | 
			
		||||
                {
 | 
			
		||||
                  _meta_plugin_effect_started (plugin);
 | 
			
		||||
                  klass->destroy (plugin, actor);
 | 
			
		||||
                }
 | 
			
		||||
              break;
 | 
			
		||||
            default:
 | 
			
		||||
              g_warning ("Incorrect handler called for event %lu", event);
 | 
			
		||||
            }
 | 
			
		||||
          _meta_plugin_effect_started (plugin);
 | 
			
		||||
          klass->minimize (plugin, actor);
 | 
			
		||||
        }
 | 
			
		||||
      break;
 | 
			
		||||
    case META_PLUGIN_MAP:
 | 
			
		||||
      if (klass->map)
 | 
			
		||||
        {
 | 
			
		||||
          retval = TRUE;
 | 
			
		||||
          meta_plugin_manager_kill_window_effects (plugin_mgr,
 | 
			
		||||
                                                   actor);
 | 
			
		||||
 | 
			
		||||
      l = l->next;
 | 
			
		||||
          _meta_plugin_effect_started (plugin);
 | 
			
		||||
          klass->map (plugin, actor);
 | 
			
		||||
        }
 | 
			
		||||
      break;
 | 
			
		||||
    case META_PLUGIN_DESTROY:
 | 
			
		||||
      if (klass->destroy)
 | 
			
		||||
        {
 | 
			
		||||
          retval = TRUE;
 | 
			
		||||
          _meta_plugin_effect_started (plugin);
 | 
			
		||||
          klass->destroy (plugin, actor);
 | 
			
		||||
        }
 | 
			
		||||
      break;
 | 
			
		||||
    default:
 | 
			
		||||
      g_warning ("Incorrect handler called for event %lu", event);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return retval;
 | 
			
		||||
@@ -309,7 +190,7 @@ meta_plugin_manager_event_simple (MetaPluginManager *plugin_mgr,
 | 
			
		||||
 * The public method that the compositor hooks into for maximize and unmaximize
 | 
			
		||||
 * events.
 | 
			
		||||
 *
 | 
			
		||||
 * Returns TRUE if at least one of the plugins handled the event type (i.e.,
 | 
			
		||||
 * Returns TRUE if the plugin handled the event type (i.e.,
 | 
			
		||||
 * if the return value is FALSE, there will be no subsequent call to the
 | 
			
		||||
 * manager completed() callback, and the compositor must ensure that any
 | 
			
		||||
 * appropriate post-effect cleanup is carried out.
 | 
			
		||||
@@ -323,57 +204,44 @@ meta_plugin_manager_event_maximize (MetaPluginManager *plugin_mgr,
 | 
			
		||||
                                    gint               target_width,
 | 
			
		||||
                                    gint               target_height)
 | 
			
		||||
{
 | 
			
		||||
  GList *l = plugin_mgr->plugins;
 | 
			
		||||
  MetaPlugin *plugin = plugin_mgr->plugin;
 | 
			
		||||
  MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin);
 | 
			
		||||
  MetaDisplay *display = meta_screen_get_display (plugin_mgr->screen);
 | 
			
		||||
  gboolean retval = FALSE;
 | 
			
		||||
  MetaDisplay *display  = meta_screen_get_display (plugin_mgr->screen);
 | 
			
		||||
 | 
			
		||||
  if (display->display_opening)
 | 
			
		||||
    return FALSE;
 | 
			
		||||
 | 
			
		||||
  while (l)
 | 
			
		||||
  switch (event)
 | 
			
		||||
    {
 | 
			
		||||
      MetaPlugin        *plugin = l->data;
 | 
			
		||||
      MetaPluginClass   *klass = META_PLUGIN_GET_CLASS (plugin);
 | 
			
		||||
 | 
			
		||||
      if (!meta_plugin_disabled (plugin) &&
 | 
			
		||||
          (meta_plugin_features (plugin) & event))
 | 
			
		||||
    case META_PLUGIN_MAXIMIZE:
 | 
			
		||||
      if (klass->maximize)
 | 
			
		||||
        {
 | 
			
		||||
          retval = TRUE;
 | 
			
		||||
          meta_plugin_manager_kill_window_effects (plugin_mgr,
 | 
			
		||||
                                                   actor);
 | 
			
		||||
 | 
			
		||||
          switch (event)
 | 
			
		||||
            {
 | 
			
		||||
            case META_PLUGIN_MAXIMIZE:
 | 
			
		||||
              if (klass->maximize)
 | 
			
		||||
                {
 | 
			
		||||
                  meta_plugin_manager_kill_window_effects (
 | 
			
		||||
		      plugin_mgr,
 | 
			
		||||
		      actor);
 | 
			
		||||
 | 
			
		||||
                  _meta_plugin_effect_started (plugin);
 | 
			
		||||
                  klass->maximize (plugin, actor,
 | 
			
		||||
                                   target_x, target_y,
 | 
			
		||||
                                   target_width, target_height);
 | 
			
		||||
                }
 | 
			
		||||
              break;
 | 
			
		||||
            case META_PLUGIN_UNMAXIMIZE:
 | 
			
		||||
              if (klass->unmaximize)
 | 
			
		||||
                {
 | 
			
		||||
                  meta_plugin_manager_kill_window_effects (
 | 
			
		||||
		      plugin_mgr,
 | 
			
		||||
		      actor);
 | 
			
		||||
 | 
			
		||||
                  _meta_plugin_effect_started (plugin);
 | 
			
		||||
                  klass->unmaximize (plugin, actor,
 | 
			
		||||
                                     target_x, target_y,
 | 
			
		||||
                                     target_width, target_height);
 | 
			
		||||
                }
 | 
			
		||||
              break;
 | 
			
		||||
            default:
 | 
			
		||||
              g_warning ("Incorrect handler called for event %lu", event);
 | 
			
		||||
            }
 | 
			
		||||
          _meta_plugin_effect_started (plugin);
 | 
			
		||||
          klass->maximize (plugin, actor,
 | 
			
		||||
                           target_x, target_y,
 | 
			
		||||
                           target_width, target_height);
 | 
			
		||||
        }
 | 
			
		||||
      break;
 | 
			
		||||
    case META_PLUGIN_UNMAXIMIZE:
 | 
			
		||||
      if (klass->unmaximize)
 | 
			
		||||
        {
 | 
			
		||||
          retval = TRUE;
 | 
			
		||||
          meta_plugin_manager_kill_window_effects (plugin_mgr,
 | 
			
		||||
                                                   actor);
 | 
			
		||||
 | 
			
		||||
      l = l->next;
 | 
			
		||||
          _meta_plugin_effect_started (plugin);
 | 
			
		||||
          klass->unmaximize (plugin, actor,
 | 
			
		||||
                             target_x, target_y,
 | 
			
		||||
                             target_width, target_height);
 | 
			
		||||
        }
 | 
			
		||||
      break;
 | 
			
		||||
    default:
 | 
			
		||||
      g_warning ("Incorrect handler called for event %lu", event);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return retval;
 | 
			
		||||
@@ -382,7 +250,7 @@ meta_plugin_manager_event_maximize (MetaPluginManager *plugin_mgr,
 | 
			
		||||
/*
 | 
			
		||||
 * The public method that the compositor hooks into for desktop switching.
 | 
			
		||||
 *
 | 
			
		||||
 * Returns TRUE if at least one of the plugins handled the event type (i.e.,
 | 
			
		||||
 * Returns TRUE if the plugin handled the event type (i.e.,
 | 
			
		||||
 * if the return value is FALSE, there will be no subsequent call to the
 | 
			
		||||
 * manager completed() callback, and the compositor must ensure that any
 | 
			
		||||
 * appropriate post-effect cleanup is carried out.
 | 
			
		||||
@@ -393,32 +261,21 @@ meta_plugin_manager_switch_workspace (MetaPluginManager   *plugin_mgr,
 | 
			
		||||
                                      gint                 to,
 | 
			
		||||
                                      MetaMotionDirection  direction)
 | 
			
		||||
{
 | 
			
		||||
  GList *l = plugin_mgr->plugins;
 | 
			
		||||
  MetaPlugin *plugin = plugin_mgr->plugin;
 | 
			
		||||
  MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin);
 | 
			
		||||
  MetaDisplay *display = meta_screen_get_display (plugin_mgr->screen);
 | 
			
		||||
  gboolean retval = FALSE;
 | 
			
		||||
  MetaDisplay *display  = meta_screen_get_display (plugin_mgr->screen);
 | 
			
		||||
 | 
			
		||||
  if (display->display_opening)
 | 
			
		||||
    return FALSE;
 | 
			
		||||
 | 
			
		||||
  while (l)
 | 
			
		||||
  if (klass->switch_workspace)
 | 
			
		||||
    {
 | 
			
		||||
      MetaPlugin        *plugin = l->data;
 | 
			
		||||
      MetaPluginClass   *klass = META_PLUGIN_GET_CLASS (plugin);
 | 
			
		||||
      retval = TRUE;
 | 
			
		||||
      meta_plugin_manager_kill_switch_workspace (plugin_mgr);
 | 
			
		||||
 | 
			
		||||
      if (!meta_plugin_disabled (plugin) &&
 | 
			
		||||
          (meta_plugin_features (plugin) & META_PLUGIN_SWITCH_WORKSPACE))
 | 
			
		||||
        {
 | 
			
		||||
          if (klass->switch_workspace)
 | 
			
		||||
            {
 | 
			
		||||
              retval = TRUE;
 | 
			
		||||
              meta_plugin_manager_kill_switch_workspace (plugin_mgr);
 | 
			
		||||
 | 
			
		||||
              _meta_plugin_effect_started (plugin);
 | 
			
		||||
              klass->switch_workspace (plugin, from, to, direction);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      l = l->next;
 | 
			
		||||
      _meta_plugin_effect_started (plugin);
 | 
			
		||||
      klass->switch_workspace (plugin, from, to, direction);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return retval;
 | 
			
		||||
@@ -427,7 +284,7 @@ meta_plugin_manager_switch_workspace (MetaPluginManager   *plugin_mgr,
 | 
			
		||||
/*
 | 
			
		||||
 * The public method that the compositor hooks into for desktop switching.
 | 
			
		||||
 *
 | 
			
		||||
 * Returns TRUE if at least one of the plugins handled the event type (i.e.,
 | 
			
		||||
 * Returns TRUE if the plugin handled the event type (i.e.,
 | 
			
		||||
 * if the return value is FALSE, there will be no subsequent call to the
 | 
			
		||||
 * manager completed() callback, and the compositor must ensure that any
 | 
			
		||||
 * appropriate post-effect cleanup is carried out.
 | 
			
		||||
@@ -436,49 +293,20 @@ gboolean
 | 
			
		||||
meta_plugin_manager_xevent_filter (MetaPluginManager *plugin_mgr,
 | 
			
		||||
                                   XEvent            *xev)
 | 
			
		||||
{
 | 
			
		||||
  GList *l;
 | 
			
		||||
  gboolean have_plugin_xevent_func;
 | 
			
		||||
  MetaPlugin *plugin = plugin_mgr->plugin;
 | 
			
		||||
  MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin);
 | 
			
		||||
 | 
			
		||||
  if (!plugin_mgr)
 | 
			
		||||
    return FALSE;
 | 
			
		||||
 | 
			
		||||
  l = plugin_mgr->plugins;
 | 
			
		||||
 | 
			
		||||
  /* We need to make sure that clutter gets certain events, like
 | 
			
		||||
   * ConfigureNotify on the stage window. If there is a plugin that
 | 
			
		||||
   * provides an xevent_filter function, then it's the responsibility
 | 
			
		||||
   * of that plugin to pass events to Clutter. Otherwise, we send the
 | 
			
		||||
   * event directly to Clutter ourselves.
 | 
			
		||||
   *
 | 
			
		||||
   * What happens if there are two plugins with xevent_filter functions
 | 
			
		||||
   * is undefined; in general, multiple competing plugins are something
 | 
			
		||||
   * we don't support well or care much about.
 | 
			
		||||
   *
 | 
			
		||||
   * FIXME: Really, we should just always handle sending the event to
 | 
			
		||||
   *  clutter if a plugin doesn't report the event as handled by
 | 
			
		||||
   *  returning TRUE, but it doesn't seem worth breaking compatibility
 | 
			
		||||
   *  of the plugin interface right now to achieve this; the way it is
 | 
			
		||||
   *  now works fine in practice.
 | 
			
		||||
   */
 | 
			
		||||
  have_plugin_xevent_func = FALSE;
 | 
			
		||||
 | 
			
		||||
  while (l)
 | 
			
		||||
    {
 | 
			
		||||
      MetaPlugin      *plugin = l->data;
 | 
			
		||||
      MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin);
 | 
			
		||||
 | 
			
		||||
      if (klass->xevent_filter)
 | 
			
		||||
        {
 | 
			
		||||
          have_plugin_xevent_func = TRUE;
 | 
			
		||||
          if (klass->xevent_filter (plugin, xev) == TRUE)
 | 
			
		||||
            return TRUE;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      l = l->next;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (!have_plugin_xevent_func)
 | 
			
		||||
  if (klass->xevent_filter && klass->xevent_filter (plugin, xev))
 | 
			
		||||
    return TRUE;
 | 
			
		||||
  else
 | 
			
		||||
    return clutter_x11_handle_event (xev) != CLUTTER_X11_FILTER_CONTINUE;
 | 
			
		||||
 | 
			
		||||
  return FALSE;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -46,14 +46,9 @@
 | 
			
		||||
 */
 | 
			
		||||
typedef struct MetaPluginManager MetaPluginManager;
 | 
			
		||||
 | 
			
		||||
MetaPluginManager * meta_plugin_manager_get         (MetaScreen *screen);
 | 
			
		||||
MetaPluginManager * meta_plugin_manager_get_default (void);
 | 
			
		||||
MetaPluginManager * meta_plugin_manager_new (MetaScreen *screen);
 | 
			
		||||
 | 
			
		||||
void     meta_plugin_manager_load         (MetaPluginManager *mgr,
 | 
			
		||||
                                           const gchar       *plugin_name);
 | 
			
		||||
void     meta_plugin_manager_register     (MetaPluginManager *mgr,
 | 
			
		||||
                                           GType              plugin_type);
 | 
			
		||||
void     meta_plugin_manager_initialize   (MetaPluginManager *mgr);
 | 
			
		||||
void     meta_plugin_manager_load         (const gchar       *plugin_name);
 | 
			
		||||
 | 
			
		||||
gboolean meta_plugin_manager_event_simple (MetaPluginManager *mgr,
 | 
			
		||||
                                           MetaWindowActor   *actor,
 | 
			
		||||
@@ -66,10 +61,6 @@ gboolean meta_plugin_manager_event_maximize    (MetaPluginManager *mgr,
 | 
			
		||||
                                                gint               target_y,
 | 
			
		||||
                                                gint               target_width,
 | 
			
		||||
                                                gint               target_height);
 | 
			
		||||
void     meta_plugin_manager_update_workspaces (MetaPluginManager *mgr);
 | 
			
		||||
 | 
			
		||||
void meta_plugin_manager_update_workspace (MetaPluginManager *mgr,
 | 
			
		||||
                                           MetaWorkspace     *w);
 | 
			
		||||
 | 
			
		||||
gboolean meta_plugin_manager_switch_workspace (MetaPluginManager   *mgr,
 | 
			
		||||
                                               gint                 from,
 | 
			
		||||
 
 | 
			
		||||
@@ -44,74 +44,17 @@ enum
 | 
			
		||||
{
 | 
			
		||||
  PROP_0,
 | 
			
		||||
  PROP_SCREEN,
 | 
			
		||||
  PROP_FEATURES,
 | 
			
		||||
  PROP_DISABLED,
 | 
			
		||||
  PROP_DEBUG_MODE,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct _MetaPluginPrivate
 | 
			
		||||
{
 | 
			
		||||
  MetaScreen   *screen;
 | 
			
		||||
  gulong        features;
 | 
			
		||||
 | 
			
		||||
  gint          running;
 | 
			
		||||
 | 
			
		||||
  gboolean      disabled : 1;
 | 
			
		||||
  gboolean      debug    : 1;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
meta_plugin_set_features (MetaPlugin *plugin)
 | 
			
		||||
{
 | 
			
		||||
  MetaPluginPrivate  *priv     = plugin->priv;
 | 
			
		||||
  MetaPluginClass    *klass    = META_PLUGIN_GET_CLASS (plugin);
 | 
			
		||||
 | 
			
		||||
  priv->features = 0;
 | 
			
		||||
 | 
			
		||||
  /*
 | 
			
		||||
   * Feature flags: identify events that the plugin can handle; a plugin can
 | 
			
		||||
   * handle one or more events.
 | 
			
		||||
   */
 | 
			
		||||
  if (klass->minimize)
 | 
			
		||||
    priv->features |= META_PLUGIN_MINIMIZE;
 | 
			
		||||
 | 
			
		||||
  if (klass->maximize)
 | 
			
		||||
    priv->features |= META_PLUGIN_MAXIMIZE;
 | 
			
		||||
 | 
			
		||||
  if (klass->unmaximize)
 | 
			
		||||
    priv->features |= META_PLUGIN_UNMAXIMIZE;
 | 
			
		||||
 | 
			
		||||
  if (klass->map)
 | 
			
		||||
    priv->features |= META_PLUGIN_MAP;
 | 
			
		||||
 | 
			
		||||
  if (klass->destroy)
 | 
			
		||||
    priv->features |= META_PLUGIN_DESTROY;
 | 
			
		||||
 | 
			
		||||
  if (klass->switch_workspace)
 | 
			
		||||
    priv->features |= META_PLUGIN_SWITCH_WORKSPACE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
meta_plugin_constructed (GObject *object)
 | 
			
		||||
{
 | 
			
		||||
  meta_plugin_set_features (META_PLUGIN (object));
 | 
			
		||||
 | 
			
		||||
  if (G_OBJECT_CLASS (meta_plugin_parent_class)->constructed)
 | 
			
		||||
      G_OBJECT_CLASS (meta_plugin_parent_class)->constructed (object);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
meta_plugin_dispose (GObject *object)
 | 
			
		||||
{
 | 
			
		||||
  G_OBJECT_CLASS (meta_plugin_parent_class)->dispose (object);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
meta_plugin_finalize (GObject *object)
 | 
			
		||||
{
 | 
			
		||||
  G_OBJECT_CLASS (meta_plugin_parent_class)->finalize (object);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
meta_plugin_set_property (GObject      *object,
 | 
			
		||||
                          guint         prop_id,
 | 
			
		||||
@@ -125,9 +68,6 @@ meta_plugin_set_property (GObject      *object,
 | 
			
		||||
    case PROP_SCREEN:
 | 
			
		||||
      priv->screen = g_value_get_object (value);
 | 
			
		||||
      break;
 | 
			
		||||
    case PROP_DISABLED:
 | 
			
		||||
      priv->disabled = g_value_get_boolean (value);
 | 
			
		||||
      break;
 | 
			
		||||
    case PROP_DEBUG_MODE:
 | 
			
		||||
      priv->debug = g_value_get_boolean (value);
 | 
			
		||||
      break;
 | 
			
		||||
@@ -150,15 +90,9 @@ meta_plugin_get_property (GObject    *object,
 | 
			
		||||
    case PROP_SCREEN:
 | 
			
		||||
      g_value_set_object (value, priv->screen);
 | 
			
		||||
      break;
 | 
			
		||||
    case PROP_DISABLED:
 | 
			
		||||
      g_value_set_boolean (value, priv->disabled);
 | 
			
		||||
      break;
 | 
			
		||||
    case PROP_DEBUG_MODE:
 | 
			
		||||
      g_value_set_boolean (value, priv->debug);
 | 
			
		||||
      break;
 | 
			
		||||
    case PROP_FEATURES:
 | 
			
		||||
      g_value_set_ulong (value, priv->features);
 | 
			
		||||
      break;
 | 
			
		||||
    default:
 | 
			
		||||
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 | 
			
		||||
      break;
 | 
			
		||||
@@ -171,9 +105,6 @@ meta_plugin_class_init (MetaPluginClass *klass)
 | 
			
		||||
{
 | 
			
		||||
  GObjectClass      *gobject_class = G_OBJECT_CLASS (klass);
 | 
			
		||||
 | 
			
		||||
  gobject_class->constructed     = meta_plugin_constructed;
 | 
			
		||||
  gobject_class->finalize        = meta_plugin_finalize;
 | 
			
		||||
  gobject_class->dispose         = meta_plugin_dispose;
 | 
			
		||||
  gobject_class->set_property    = meta_plugin_set_property;
 | 
			
		||||
  gobject_class->get_property    = meta_plugin_get_property;
 | 
			
		||||
 | 
			
		||||
@@ -185,22 +116,6 @@ meta_plugin_class_init (MetaPluginClass *klass)
 | 
			
		||||
                                                        META_TYPE_SCREEN,
 | 
			
		||||
                                                        G_PARAM_READWRITE));
 | 
			
		||||
 | 
			
		||||
  g_object_class_install_property (gobject_class,
 | 
			
		||||
				   PROP_FEATURES,
 | 
			
		||||
				   g_param_spec_ulong ("features",
 | 
			
		||||
                                                       "Features",
 | 
			
		||||
                                                       "Plugin Features",
 | 
			
		||||
                                                       0 , G_MAXULONG, 0,
 | 
			
		||||
                                                       G_PARAM_READABLE));
 | 
			
		||||
 | 
			
		||||
  g_object_class_install_property (gobject_class,
 | 
			
		||||
				   PROP_DISABLED,
 | 
			
		||||
				   g_param_spec_boolean ("disabled",
 | 
			
		||||
                                                      "Plugin disabled",
 | 
			
		||||
                                                      "Plugin disabled",
 | 
			
		||||
                                                      FALSE,
 | 
			
		||||
                                                      G_PARAM_READWRITE));
 | 
			
		||||
 | 
			
		||||
  g_object_class_install_property (gobject_class,
 | 
			
		||||
				   PROP_DEBUG_MODE,
 | 
			
		||||
				   g_param_spec_boolean ("debug-mode",
 | 
			
		||||
@@ -220,22 +135,6 @@ meta_plugin_init (MetaPlugin *self)
 | 
			
		||||
  self->priv = priv = META_PLUGIN_GET_PRIVATE (self);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
gulong
 | 
			
		||||
meta_plugin_features (MetaPlugin *plugin)
 | 
			
		||||
{
 | 
			
		||||
  MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
 | 
			
		||||
 | 
			
		||||
  return priv->features;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
gboolean
 | 
			
		||||
meta_plugin_disabled (MetaPlugin *plugin)
 | 
			
		||||
{
 | 
			
		||||
  MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
 | 
			
		||||
 | 
			
		||||
  return priv->disabled;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
gboolean
 | 
			
		||||
meta_plugin_running  (MetaPlugin *plugin)
 | 
			
		||||
{
 | 
			
		||||
@@ -263,38 +162,6 @@ meta_plugin_get_info (MetaPlugin *plugin)
 | 
			
		||||
  return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ClutterActor *
 | 
			
		||||
meta_plugin_get_overlay_group (MetaPlugin *plugin)
 | 
			
		||||
{
 | 
			
		||||
  MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
 | 
			
		||||
 | 
			
		||||
  return meta_get_overlay_group_for_screen (priv->screen);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ClutterActor *
 | 
			
		||||
meta_plugin_get_stage (MetaPlugin *plugin)
 | 
			
		||||
{
 | 
			
		||||
  MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
 | 
			
		||||
 | 
			
		||||
  return meta_get_stage_for_screen (priv->screen);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ClutterActor *
 | 
			
		||||
meta_plugin_get_window_group (MetaPlugin *plugin)
 | 
			
		||||
{
 | 
			
		||||
  MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
 | 
			
		||||
 | 
			
		||||
  return meta_get_window_group_for_screen (priv->screen);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ClutterActor *
 | 
			
		||||
meta_plugin_get_background_actor (MetaPlugin *plugin)
 | 
			
		||||
{
 | 
			
		||||
  MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
 | 
			
		||||
 | 
			
		||||
  return meta_get_background_actor_for_screen (priv->screen);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * _meta_plugin_effect_started:
 | 
			
		||||
 * @plugin: the plugin
 | 
			
		||||
@@ -315,7 +182,7 @@ meta_plugin_switch_workspace_completed (MetaPlugin *plugin)
 | 
			
		||||
{
 | 
			
		||||
  MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
 | 
			
		||||
 | 
			
		||||
  MetaScreen *screen = meta_plugin_get_screen (plugin);
 | 
			
		||||
  MetaScreen *screen = priv->screen;
 | 
			
		||||
 | 
			
		||||
  if (priv->running-- < 0)
 | 
			
		||||
    {
 | 
			
		||||
@@ -389,80 +256,6 @@ meta_plugin_destroy_completed (MetaPlugin      *plugin,
 | 
			
		||||
  meta_plugin_window_effect_completed (plugin, actor, META_PLUGIN_DESTROY);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
meta_plugin_query_screen_size (MetaPlugin *plugin,
 | 
			
		||||
                               int        *width,
 | 
			
		||||
                               int        *height)
 | 
			
		||||
{
 | 
			
		||||
  MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
 | 
			
		||||
 | 
			
		||||
  meta_screen_get_size (priv->screen, width, height);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
meta_plugin_set_stage_reactive (MetaPlugin *plugin,
 | 
			
		||||
                                gboolean    reactive)
 | 
			
		||||
{
 | 
			
		||||
  MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
 | 
			
		||||
  MetaScreen  *screen  = priv->screen;
 | 
			
		||||
 | 
			
		||||
  if (reactive)
 | 
			
		||||
    meta_set_stage_input_region (screen, None);
 | 
			
		||||
  else
 | 
			
		||||
    meta_empty_stage_input_region (screen);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
meta_plugin_set_stage_input_area (MetaPlugin *plugin,
 | 
			
		||||
                                  gint x, gint y, gint width, gint height)
 | 
			
		||||
{
 | 
			
		||||
  MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
 | 
			
		||||
  MetaScreen   *screen  = priv->screen;
 | 
			
		||||
  MetaDisplay  *display = meta_screen_get_display (screen);
 | 
			
		||||
  Display      *xdpy    = meta_display_get_xdisplay (display);
 | 
			
		||||
  XRectangle    rect;
 | 
			
		||||
  XserverRegion region;
 | 
			
		||||
 | 
			
		||||
  rect.x = x;
 | 
			
		||||
  rect.y = y;
 | 
			
		||||
  rect.width = width;
 | 
			
		||||
  rect.height = height;
 | 
			
		||||
 | 
			
		||||
  region = XFixesCreateRegion (xdpy, &rect, 1);
 | 
			
		||||
  meta_set_stage_input_region (screen, region);
 | 
			
		||||
  XFixesDestroyRegion (xdpy, region);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
meta_plugin_set_stage_input_region (MetaPlugin   *plugin,
 | 
			
		||||
                                    XserverRegion region)
 | 
			
		||||
{
 | 
			
		||||
  MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
 | 
			
		||||
  MetaScreen  *screen  = priv->screen;
 | 
			
		||||
 | 
			
		||||
  meta_set_stage_input_region (screen, region);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * meta_plugin_get_window_actors:
 | 
			
		||||
 * @plugin: A #MetaPlugin
 | 
			
		||||
 *
 | 
			
		||||
 * This function returns all of the #MetaWindowActor objects referenced by Mutter, including
 | 
			
		||||
 * override-redirect windows.  The returned list is a snapshot of Mutter's current
 | 
			
		||||
 * stacking order, with the topmost window last.
 | 
			
		||||
 *
 | 
			
		||||
 * The 'restacked' signal of #MetaScreen signals when this value has changed.
 | 
			
		||||
 *
 | 
			
		||||
 * Returns: (transfer none) (element-type MetaWindowActor): Windows in stacking order, topmost last
 | 
			
		||||
 */
 | 
			
		||||
GList *
 | 
			
		||||
meta_plugin_get_window_actors (MetaPlugin *plugin)
 | 
			
		||||
{
 | 
			
		||||
  MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
 | 
			
		||||
 | 
			
		||||
  return meta_get_window_actors (priv->screen);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * meta_plugin_begin_modal:
 | 
			
		||||
 * @plugin: a #MetaPlugin
 | 
			
		||||
@@ -502,7 +295,7 @@ meta_plugin_begin_modal (MetaPlugin       *plugin,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * meta_plugin_end_modal
 | 
			
		||||
 * meta_plugin_end_modal:
 | 
			
		||||
 * @plugin: a #MetaPlugin
 | 
			
		||||
 * @timestamp: the time used for releasing grabs
 | 
			
		||||
 *
 | 
			
		||||
@@ -521,16 +314,6 @@ meta_plugin_end_modal (MetaPlugin *plugin,
 | 
			
		||||
  meta_end_modal_for_plugin (priv->screen, plugin, timestamp);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Display *
 | 
			
		||||
meta_plugin_get_xdisplay (MetaPlugin *plugin)
 | 
			
		||||
{
 | 
			
		||||
  MetaPluginPrivate *priv    = META_PLUGIN (plugin)->priv;
 | 
			
		||||
  MetaDisplay       *display = meta_screen_get_display (priv->screen);
 | 
			
		||||
  Display           *xdpy    = meta_display_get_xdisplay (display);
 | 
			
		||||
 | 
			
		||||
  return xdpy;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * meta_plugin_get_screen:
 | 
			
		||||
 * @plugin: a #MetaPlugin
 | 
			
		||||
@@ -548,19 +331,3 @@ meta_plugin_get_screen (MetaPlugin *plugin)
 | 
			
		||||
 | 
			
		||||
  return priv->screen;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * meta_plugin_type_register:
 | 
			
		||||
 * @plugin_type: a #MetaPlugin type
 | 
			
		||||
 *
 | 
			
		||||
 * Register @plugin_type as a compositor plugin type to be used.
 | 
			
		||||
 * You must call this before calling meta_init().
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
meta_plugin_type_register (GType plugin_type)
 | 
			
		||||
{
 | 
			
		||||
  MetaPluginManager *plugin_manager;
 | 
			
		||||
 | 
			
		||||
  plugin_manager = meta_plugin_manager_get_default ();
 | 
			
		||||
  meta_plugin_manager_register (plugin_manager, plugin_type);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -130,7 +130,7 @@ MetaShadowClassInfo default_shadow_classes[] = {
 | 
			
		||||
  { "popup-menu",    { 1, -1, 0, 1, 128 }, { 1, -1, 0, 1, 128 } },
 | 
			
		||||
 | 
			
		||||
  { "dropdown-menu", { 1, 10, 0, 1, 128 }, { 1, 10, 0, 1, 128 } },
 | 
			
		||||
  { "attached",      { 2, 50, 0, 1, 255 }, { 1, 50, 0, 1, 128 } }
 | 
			
		||||
  { "attached",      { 1, -1, 0, 1, 128 }, { 1, -1, 0, 1, 128 } }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
G_DEFINE_TYPE (MetaShadowFactory, meta_shadow_factory, G_TYPE_OBJECT);
 | 
			
		||||
@@ -442,8 +442,7 @@ meta_shadow_factory_class_init (MetaShadowFactoryClass *klass)
 | 
			
		||||
                  G_TYPE_FROM_CLASS (object_class),
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  0,
 | 
			
		||||
                  NULL, NULL,
 | 
			
		||||
                  g_cclosure_marshal_VOID__VOID,
 | 
			
		||||
                  NULL, NULL, NULL,
 | 
			
		||||
                  G_TYPE_NONE, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,11 +1,13 @@
 | 
			
		||||
/*
 | 
			
		||||
 * shaped texture
 | 
			
		||||
 *
 | 
			
		||||
 * An actor to draw a texture clipped to a list of rectangles
 | 
			
		||||
 * An actor to draw a masked texture.
 | 
			
		||||
 *
 | 
			
		||||
 * Authored By Neil Roberts  <neil@linux.intel.com>
 | 
			
		||||
 * and Jasper St. Pierre <jstpierre@mecheye.net>
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2008 Intel Corporation
 | 
			
		||||
 * Copyright (C) 2012 Red Hat, Inc.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU General Public License as
 | 
			
		||||
@@ -25,32 +27,37 @@
 | 
			
		||||
 | 
			
		||||
#include <config.h>
 | 
			
		||||
 | 
			
		||||
#include "meta-shaped-texture.h"
 | 
			
		||||
#define CLUTTER_ENABLE_EXPERIMENTAL_API
 | 
			
		||||
#define COGL_ENABLE_EXPERIMENTAL_API
 | 
			
		||||
 | 
			
		||||
#include <meta/meta-shaped-texture.h>
 | 
			
		||||
#include "meta-texture-tower.h"
 | 
			
		||||
#include "meta-texture-rectangle.h"
 | 
			
		||||
 | 
			
		||||
#include <clutter/clutter.h>
 | 
			
		||||
#include <cogl/cogl.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <cogl/cogl-texture-pixmap-x11.h>
 | 
			
		||||
#include <gdk/gdk.h> /* for gdk_rectangle_intersect() */
 | 
			
		||||
 | 
			
		||||
static void meta_shaped_texture_dispose  (GObject    *object);
 | 
			
		||||
static void meta_shaped_texture_notify   (GObject    *object,
 | 
			
		||||
					  GParamSpec *pspec);
 | 
			
		||||
 | 
			
		||||
static void meta_shaped_texture_paint (ClutterActor       *actor);
 | 
			
		||||
static void meta_shaped_texture_pick  (ClutterActor       *actor,
 | 
			
		||||
				       const ClutterColor *color);
 | 
			
		||||
 | 
			
		||||
static void meta_shaped_texture_update_area (ClutterX11TexturePixmap *texture,
 | 
			
		||||
					     int                      x,
 | 
			
		||||
					     int                      y,
 | 
			
		||||
					     int                      width,
 | 
			
		||||
					     int                      height);
 | 
			
		||||
static void meta_shaped_texture_get_preferred_width (ClutterActor *self,
 | 
			
		||||
                                                     gfloat        for_height,
 | 
			
		||||
                                                     gfloat       *min_width_p,
 | 
			
		||||
                                                     gfloat       *natural_width_p);
 | 
			
		||||
 | 
			
		||||
static void meta_shaped_texture_dirty_mask (MetaShapedTexture *stex);
 | 
			
		||||
static void meta_shaped_texture_get_preferred_height (ClutterActor *self,
 | 
			
		||||
                                                      gfloat        for_width,
 | 
			
		||||
                                                      gfloat       *min_height_p,
 | 
			
		||||
                                                      gfloat       *natural_height_p);
 | 
			
		||||
 | 
			
		||||
static gboolean meta_shaped_texture_get_paint_volume (ClutterActor *self, ClutterPaintVolume *volume);
 | 
			
		||||
 | 
			
		||||
G_DEFINE_TYPE (MetaShapedTexture, meta_shaped_texture,
 | 
			
		||||
               CLUTTER_X11_TYPE_TEXTURE_PIXMAP);
 | 
			
		||||
               CLUTTER_TYPE_ACTOR);
 | 
			
		||||
 | 
			
		||||
#define META_SHAPED_TEXTURE_GET_PRIVATE(obj) \
 | 
			
		||||
  (G_TYPE_INSTANCE_GET_PRIVATE ((obj), META_TYPE_SHAPED_TEXTURE, \
 | 
			
		||||
@@ -59,19 +66,15 @@ G_DEFINE_TYPE (MetaShapedTexture, meta_shaped_texture,
 | 
			
		||||
struct _MetaShapedTexturePrivate
 | 
			
		||||
{
 | 
			
		||||
  MetaTextureTower *paint_tower;
 | 
			
		||||
  Pixmap pixmap;
 | 
			
		||||
  CoglHandle texture;
 | 
			
		||||
  CoglHandle mask_texture;
 | 
			
		||||
  CoglHandle material;
 | 
			
		||||
  CoglHandle material_unshaped;
 | 
			
		||||
 | 
			
		||||
  cairo_region_t *clip_region;
 | 
			
		||||
  cairo_region_t *shape_region;
 | 
			
		||||
 | 
			
		||||
  cairo_region_t *overlay_region;
 | 
			
		||||
  cairo_path_t *overlay_path;
 | 
			
		||||
 | 
			
		||||
  cairo_region_t *visible_pixels_region;
 | 
			
		||||
 | 
			
		||||
  guint mask_width, mask_height;
 | 
			
		||||
  guint tex_width, tex_height;
 | 
			
		||||
 | 
			
		||||
  guint create_mipmaps : 1;
 | 
			
		||||
};
 | 
			
		||||
@@ -81,15 +84,14 @@ meta_shaped_texture_class_init (MetaShapedTextureClass *klass)
 | 
			
		||||
{
 | 
			
		||||
  GObjectClass *gobject_class = (GObjectClass *) klass;
 | 
			
		||||
  ClutterActorClass *actor_class = (ClutterActorClass *) klass;
 | 
			
		||||
  ClutterX11TexturePixmapClass *x11_texture_class = (ClutterX11TexturePixmapClass *) klass;
 | 
			
		||||
 | 
			
		||||
  gobject_class->dispose = meta_shaped_texture_dispose;
 | 
			
		||||
  gobject_class->notify = meta_shaped_texture_notify;
 | 
			
		||||
 | 
			
		||||
  actor_class->get_preferred_width = meta_shaped_texture_get_preferred_width;
 | 
			
		||||
  actor_class->get_preferred_height = meta_shaped_texture_get_preferred_height;
 | 
			
		||||
  actor_class->paint = meta_shaped_texture_paint;
 | 
			
		||||
  actor_class->pick = meta_shaped_texture_pick;
 | 
			
		||||
 | 
			
		||||
  x11_texture_class->update_area = meta_shaped_texture_update_area;
 | 
			
		||||
  actor_class->get_paint_volume = meta_shaped_texture_get_paint_volume;
 | 
			
		||||
 | 
			
		||||
  g_type_class_add_private (klass, sizeof (MetaShapedTexturePrivate));
 | 
			
		||||
}
 | 
			
		||||
@@ -101,11 +103,8 @@ meta_shaped_texture_init (MetaShapedTexture *self)
 | 
			
		||||
 | 
			
		||||
  priv = self->priv = META_SHAPED_TEXTURE_GET_PRIVATE (self);
 | 
			
		||||
 | 
			
		||||
  priv->shape_region = NULL;
 | 
			
		||||
  priv->overlay_path = NULL;
 | 
			
		||||
  priv->overlay_region = NULL;
 | 
			
		||||
  priv->visible_pixels_region = NULL;
 | 
			
		||||
  priv->paint_tower = meta_texture_tower_new ();
 | 
			
		||||
  priv->texture = COGL_INVALID_HANDLE;
 | 
			
		||||
  priv->mask_texture = COGL_INVALID_HANDLE;
 | 
			
		||||
  priv->create_mipmaps = TRUE;
 | 
			
		||||
}
 | 
			
		||||
@@ -120,8 +119,6 @@ meta_shaped_texture_dispose (GObject *object)
 | 
			
		||||
    meta_texture_tower_free (priv->paint_tower);
 | 
			
		||||
  priv->paint_tower = NULL;
 | 
			
		||||
 | 
			
		||||
  meta_shaped_texture_dirty_mask (self);
 | 
			
		||||
 | 
			
		||||
  if (priv->material != COGL_INVALID_HANDLE)
 | 
			
		||||
    {
 | 
			
		||||
      cogl_handle_unref (priv->material);
 | 
			
		||||
@@ -132,287 +129,18 @@ meta_shaped_texture_dispose (GObject *object)
 | 
			
		||||
      cogl_handle_unref (priv->material_unshaped);
 | 
			
		||||
      priv->material_unshaped = COGL_INVALID_HANDLE;
 | 
			
		||||
    }
 | 
			
		||||
  if (priv->texture != COGL_INVALID_HANDLE)
 | 
			
		||||
    {
 | 
			
		||||
      cogl_handle_unref (priv->texture);
 | 
			
		||||
      priv->texture = COGL_INVALID_HANDLE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  meta_shaped_texture_set_shape_region (self, NULL);
 | 
			
		||||
  meta_shaped_texture_set_mask_texture (self, COGL_INVALID_HANDLE);
 | 
			
		||||
  meta_shaped_texture_set_clip_region (self, NULL);
 | 
			
		||||
  meta_shaped_texture_set_overlay_path (self, NULL, NULL);
 | 
			
		||||
 | 
			
		||||
  G_OBJECT_CLASS (meta_shaped_texture_parent_class)->dispose (object);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
meta_shaped_texture_notify (GObject    *object,
 | 
			
		||||
			    GParamSpec *pspec)
 | 
			
		||||
{
 | 
			
		||||
  if (G_OBJECT_CLASS (meta_shaped_texture_parent_class)->notify)
 | 
			
		||||
    G_OBJECT_CLASS (meta_shaped_texture_parent_class)->notify (object, pspec);
 | 
			
		||||
 | 
			
		||||
  /* It seems like we could just do this out of update_area(), but unfortunately,
 | 
			
		||||
   * clutter_glx_texture_pixmap() doesn't call through the vtable on the
 | 
			
		||||
   * initial update_area, so we need to look for changes to the texture
 | 
			
		||||
   * explicitly.
 | 
			
		||||
   */
 | 
			
		||||
  if (strcmp (pspec->name, "cogl-texture") == 0)
 | 
			
		||||
    {
 | 
			
		||||
      MetaShapedTexture *stex = (MetaShapedTexture *) object;
 | 
			
		||||
      MetaShapedTexturePrivate *priv = stex->priv;
 | 
			
		||||
 | 
			
		||||
      meta_shaped_texture_clear (stex);
 | 
			
		||||
 | 
			
		||||
      if (priv->create_mipmaps)
 | 
			
		||||
	meta_texture_tower_set_base_texture (priv->paint_tower,
 | 
			
		||||
					       clutter_texture_get_cogl_texture (CLUTTER_TEXTURE (stex)));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
meta_shaped_texture_dirty_mask (MetaShapedTexture *stex)
 | 
			
		||||
{
 | 
			
		||||
  MetaShapedTexturePrivate *priv = stex->priv;
 | 
			
		||||
 | 
			
		||||
  if (priv->visible_pixels_region != NULL)
 | 
			
		||||
    {
 | 
			
		||||
      cairo_region_destroy (priv->visible_pixels_region);
 | 
			
		||||
      priv->visible_pixels_region = NULL;
 | 
			
		||||
 | 
			
		||||
      if (priv->mask_texture != COGL_INVALID_HANDLE)
 | 
			
		||||
        {
 | 
			
		||||
          cogl_handle_unref (priv->mask_texture);
 | 
			
		||||
          priv->mask_texture = COGL_INVALID_HANDLE;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      if (priv->material != COGL_INVALID_HANDLE)
 | 
			
		||||
        cogl_material_set_layer (priv->material, 1, COGL_INVALID_HANDLE);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
scan_visible_region (MetaShapedTexture *stex,
 | 
			
		||||
                     guchar            *mask_data,
 | 
			
		||||
                     int                stride)
 | 
			
		||||
{
 | 
			
		||||
  MetaShapedTexturePrivate *priv = stex->priv;
 | 
			
		||||
  cairo_region_t *visible_pixels_region;
 | 
			
		||||
  cairo_region_t *overlay_region;
 | 
			
		||||
  int i, n_rects;
 | 
			
		||||
 | 
			
		||||
  /* The visible pixels region contains all pixel values above 0.
 | 
			
		||||
   * This is somewhat complicated when there's an overlay: we
 | 
			
		||||
   * need to scan all regions potentially modified by it.
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  if (priv->visible_pixels_region)
 | 
			
		||||
    cairo_region_destroy (priv->visible_pixels_region);
 | 
			
		||||
 | 
			
		||||
  priv->visible_pixels_region = cairo_region_copy (priv->shape_region);
 | 
			
		||||
 | 
			
		||||
  visible_pixels_region = priv->visible_pixels_region;
 | 
			
		||||
  overlay_region = priv->overlay_region;
 | 
			
		||||
 | 
			
		||||
  /* With no overlay region, the visible region is defined
 | 
			
		||||
   * by the mask region, so we don't need to scan anything. */
 | 
			
		||||
  if (overlay_region == NULL)
 | 
			
		||||
      return;
 | 
			
		||||
 | 
			
		||||
  /* Subtract all the rectangles in the overlay region so that we can
 | 
			
		||||
   * scan all the pixels potentially added by the overlay path. */
 | 
			
		||||
  cairo_region_subtract (visible_pixels_region, overlay_region);
 | 
			
		||||
 | 
			
		||||
  n_rects = cairo_region_num_rectangles (overlay_region);
 | 
			
		||||
 | 
			
		||||
  for (i = 0; i < n_rects; i++)
 | 
			
		||||
    {
 | 
			
		||||
      int x, y;
 | 
			
		||||
      cairo_rectangle_int_t rect;
 | 
			
		||||
 | 
			
		||||
      cairo_region_get_rectangle (overlay_region, i, &rect);
 | 
			
		||||
 | 
			
		||||
      for (y = rect.y; y < (rect.y + rect.height); y++)
 | 
			
		||||
        {
 | 
			
		||||
          for (x = rect.x; x < (rect.x + rect.width); x++)
 | 
			
		||||
            {
 | 
			
		||||
              int w = x;
 | 
			
		||||
              while (mask_data[y * stride + w] > 0 && w < (rect.x + rect.width))
 | 
			
		||||
                w++;
 | 
			
		||||
 | 
			
		||||
              if (w > 0)
 | 
			
		||||
                {
 | 
			
		||||
                  cairo_rectangle_int_t tmp;
 | 
			
		||||
                  tmp.x = x;
 | 
			
		||||
                  tmp.y = y;
 | 
			
		||||
                  tmp.width = w - x;
 | 
			
		||||
                  tmp.height = 1;
 | 
			
		||||
                  cairo_region_union_rectangle (visible_pixels_region, &tmp);
 | 
			
		||||
                  x = w;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
install_overlay_path (MetaShapedTexture *stex,
 | 
			
		||||
                      guchar            *mask_data,
 | 
			
		||||
                      int                tex_width,
 | 
			
		||||
                      int                tex_height,
 | 
			
		||||
                      int                stride)
 | 
			
		||||
{
 | 
			
		||||
  MetaShapedTexturePrivate *priv = stex->priv;
 | 
			
		||||
  int i, n_rects;
 | 
			
		||||
  cairo_t *cr;
 | 
			
		||||
  cairo_rectangle_int_t rect;
 | 
			
		||||
  cairo_surface_t *surface;
 | 
			
		||||
 | 
			
		||||
  if (priv->overlay_region == NULL)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  surface = cairo_image_surface_create_for_data (mask_data,
 | 
			
		||||
                                                 CAIRO_FORMAT_A8,
 | 
			
		||||
                                                 tex_width,
 | 
			
		||||
                                                 tex_height,
 | 
			
		||||
                                                 stride);
 | 
			
		||||
 | 
			
		||||
  cr = cairo_create (surface);
 | 
			
		||||
  cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR);
 | 
			
		||||
 | 
			
		||||
  n_rects = cairo_region_num_rectangles (priv->overlay_region);
 | 
			
		||||
  for (i = 0; i < n_rects; i++)
 | 
			
		||||
    {
 | 
			
		||||
      cairo_region_get_rectangle (priv->overlay_region, i, &rect);
 | 
			
		||||
      cairo_rectangle (cr, rect.x, rect.y, rect.width, rect.height);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  cairo_fill_preserve (cr);
 | 
			
		||||
  if (priv->overlay_path == NULL)
 | 
			
		||||
    {
 | 
			
		||||
      /* If we have an overlay region but not an overlay path, then we
 | 
			
		||||
       * just need to clear the rectangles in the overlay region. */
 | 
			
		||||
      goto out;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  cairo_clip (cr);
 | 
			
		||||
 | 
			
		||||
  cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
 | 
			
		||||
  cairo_set_source_rgba (cr, 1, 1, 1, 1);
 | 
			
		||||
 | 
			
		||||
  cairo_append_path (cr, priv->overlay_path);
 | 
			
		||||
  cairo_fill (cr);
 | 
			
		||||
 | 
			
		||||
 out:
 | 
			
		||||
  cairo_destroy (cr);
 | 
			
		||||
  cairo_surface_destroy (surface);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
meta_shaped_texture_ensure_mask (MetaShapedTexture *stex)
 | 
			
		||||
{
 | 
			
		||||
  MetaShapedTexturePrivate *priv = stex->priv;
 | 
			
		||||
  CoglHandle paint_tex;
 | 
			
		||||
  guint tex_width, tex_height;
 | 
			
		||||
 | 
			
		||||
  paint_tex = clutter_texture_get_cogl_texture (CLUTTER_TEXTURE (stex));
 | 
			
		||||
 | 
			
		||||
  if (paint_tex == COGL_INVALID_HANDLE)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  tex_width = cogl_texture_get_width (paint_tex);
 | 
			
		||||
  tex_height = cogl_texture_get_height (paint_tex);
 | 
			
		||||
 | 
			
		||||
  /* If the mask texture we have was created for a different size then
 | 
			
		||||
     recreate it */
 | 
			
		||||
  if (priv->mask_texture != COGL_INVALID_HANDLE
 | 
			
		||||
      && (priv->mask_width != tex_width || priv->mask_height != tex_height))
 | 
			
		||||
    meta_shaped_texture_dirty_mask (stex);
 | 
			
		||||
 | 
			
		||||
  /* If we don't have a mask texture yet then create one */
 | 
			
		||||
  if (priv->visible_pixels_region == NULL)
 | 
			
		||||
    {
 | 
			
		||||
      guchar *mask_data;
 | 
			
		||||
      int i;
 | 
			
		||||
      int n_rects;
 | 
			
		||||
      int stride;
 | 
			
		||||
      GLenum paint_gl_target;
 | 
			
		||||
 | 
			
		||||
      /* If we have no shape region and no (or an empty) overlay region, we
 | 
			
		||||
       * don't need to create a full mask texture, so quit early. */
 | 
			
		||||
      if (priv->shape_region == NULL &&
 | 
			
		||||
          (priv->overlay_region == NULL ||
 | 
			
		||||
           cairo_region_num_rectangles (priv->overlay_region) == 0))
 | 
			
		||||
        {
 | 
			
		||||
          /* With no mask, the visible region is just
 | 
			
		||||
           * {0, 0, tex_width, tex_height}. */
 | 
			
		||||
          cairo_rectangle_int_t rect = { 0, 0, tex_width, tex_height };
 | 
			
		||||
          priv->visible_pixels_region = cairo_region_create_rectangle (&rect);
 | 
			
		||||
          return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      stride = cairo_format_stride_for_width (CAIRO_FORMAT_A8, tex_width);
 | 
			
		||||
 | 
			
		||||
      /* Create data for an empty image */
 | 
			
		||||
      mask_data = g_malloc0 (stride * tex_height);
 | 
			
		||||
 | 
			
		||||
      n_rects = cairo_region_num_rectangles (priv->shape_region);
 | 
			
		||||
 | 
			
		||||
      /* Fill in each rectangle. */
 | 
			
		||||
      for (i = 0; i < n_rects; i ++)
 | 
			
		||||
        {
 | 
			
		||||
          cairo_rectangle_int_t rect;
 | 
			
		||||
          cairo_region_get_rectangle (priv->shape_region, i, &rect);
 | 
			
		||||
 | 
			
		||||
          gint x1 = rect.x, x2 = x1 + rect.width;
 | 
			
		||||
          gint y1 = rect.y, y2 = y1 + rect.height;
 | 
			
		||||
          guchar *p;
 | 
			
		||||
 | 
			
		||||
          /* Clip the rectangle to the size of the texture */
 | 
			
		||||
          x1 = CLAMP (x1, 0, (gint) tex_width - 1);
 | 
			
		||||
          x2 = CLAMP (x2, x1, (gint) tex_width);
 | 
			
		||||
          y1 = CLAMP (y1, 0, (gint) tex_height - 1);
 | 
			
		||||
          y2 = CLAMP (y2, y1, (gint) tex_height);
 | 
			
		||||
 | 
			
		||||
          /* Fill the rectangle */
 | 
			
		||||
          for (p = mask_data + y1 * stride + x1;
 | 
			
		||||
               y1 < y2;
 | 
			
		||||
               y1++, p += stride)
 | 
			
		||||
            memset (p, 255, x2 - x1);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      install_overlay_path (stex, mask_data, tex_width, tex_height, stride);
 | 
			
		||||
      scan_visible_region (stex, mask_data, stride);
 | 
			
		||||
 | 
			
		||||
      cogl_texture_get_gl_texture (paint_tex, NULL, &paint_gl_target);
 | 
			
		||||
 | 
			
		||||
#ifdef GL_TEXTURE_RECTANGLE_ARB
 | 
			
		||||
      if (paint_gl_target == GL_TEXTURE_RECTANGLE_ARB)
 | 
			
		||||
        {
 | 
			
		||||
          priv->mask_texture
 | 
			
		||||
            = meta_texture_rectangle_new (tex_width, tex_height,
 | 
			
		||||
                                          0, /* flags */
 | 
			
		||||
                                          /* data format */
 | 
			
		||||
                                          COGL_PIXEL_FORMAT_A_8,
 | 
			
		||||
                                          /* internal GL format */
 | 
			
		||||
                                          GL_ALPHA,
 | 
			
		||||
                                          /* internal cogl format */
 | 
			
		||||
                                          COGL_PIXEL_FORMAT_A_8,
 | 
			
		||||
                                          /* rowstride */
 | 
			
		||||
                                          stride,
 | 
			
		||||
                                          mask_data);
 | 
			
		||||
        }
 | 
			
		||||
      else
 | 
			
		||||
#endif /* GL_TEXTURE_RECTANGLE_ARB */
 | 
			
		||||
        priv->mask_texture = cogl_texture_new_from_data (tex_width, tex_height,
 | 
			
		||||
                                                         COGL_TEXTURE_NONE,
 | 
			
		||||
                                                         COGL_PIXEL_FORMAT_A_8,
 | 
			
		||||
                                                         COGL_PIXEL_FORMAT_ANY,
 | 
			
		||||
                                                         stride,
 | 
			
		||||
                                                         mask_data);
 | 
			
		||||
 | 
			
		||||
      g_free (mask_data);
 | 
			
		||||
 | 
			
		||||
      priv->mask_width = tex_width;
 | 
			
		||||
      priv->mask_height = tex_height;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
meta_shaped_texture_paint (ClutterActor *actor)
 | 
			
		||||
{
 | 
			
		||||
@@ -451,20 +179,20 @@ meta_shaped_texture_paint (ClutterActor *actor)
 | 
			
		||||
  if (priv->create_mipmaps)
 | 
			
		||||
    paint_tex = meta_texture_tower_get_paint_texture (priv->paint_tower);
 | 
			
		||||
  else
 | 
			
		||||
    paint_tex = clutter_texture_get_cogl_texture (CLUTTER_TEXTURE (stex));
 | 
			
		||||
    paint_tex = priv->texture;
 | 
			
		||||
 | 
			
		||||
  if (paint_tex == COGL_INVALID_HANDLE)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  tex_width = cogl_texture_get_width (paint_tex);
 | 
			
		||||
  tex_height = cogl_texture_get_height (paint_tex);
 | 
			
		||||
  tex_width = priv->tex_width;
 | 
			
		||||
  tex_height = priv->tex_height;
 | 
			
		||||
 | 
			
		||||
  if (tex_width == 0 || tex_height == 0) /* no contents yet */
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  if (priv->shape_region == NULL)
 | 
			
		||||
  if (priv->mask_texture == COGL_INVALID_HANDLE)
 | 
			
		||||
    {
 | 
			
		||||
      /* No region means an unclipped shape. Use a single-layer texture. */
 | 
			
		||||
      /* Use a single-layer texture if we don't have a mask. */
 | 
			
		||||
 | 
			
		||||
      if (priv->material_unshaped == COGL_INVALID_HANDLE) 
 | 
			
		||||
        {
 | 
			
		||||
@@ -477,8 +205,6 @@ meta_shaped_texture_paint (ClutterActor *actor)
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      meta_shaped_texture_ensure_mask (stex);
 | 
			
		||||
 | 
			
		||||
      if (priv->material == COGL_INVALID_HANDLE)
 | 
			
		||||
	{
 | 
			
		||||
	   if (G_UNLIKELY (material_template == COGL_INVALID_HANDLE))
 | 
			
		||||
@@ -512,6 +238,7 @@ meta_shaped_texture_paint (ClutterActor *actor)
 | 
			
		||||
    {
 | 
			
		||||
      int n_rects;
 | 
			
		||||
      int i;
 | 
			
		||||
      cairo_rectangle_int_t tex_rect = { 0, 0, tex_width, tex_height };
 | 
			
		||||
 | 
			
		||||
      /* Limit to how many separate rectangles we'll draw; beyond this just
 | 
			
		||||
       * fall back and draw the whole thing */
 | 
			
		||||
@@ -529,6 +256,9 @@ meta_shaped_texture_paint (ClutterActor *actor)
 | 
			
		||||
 | 
			
		||||
	      cairo_region_get_rectangle (priv->clip_region, i, &rect);
 | 
			
		||||
 | 
			
		||||
	      if (!gdk_rectangle_intersect (&tex_rect, &rect, &rect))
 | 
			
		||||
		continue;
 | 
			
		||||
 | 
			
		||||
	      x1 = rect.x;
 | 
			
		||||
	      y1 = rect.y;
 | 
			
		||||
	      x2 = rect.x + rect.width;
 | 
			
		||||
@@ -565,7 +295,7 @@ meta_shaped_texture_pick (ClutterActor       *actor,
 | 
			
		||||
  MetaShapedTexturePrivate *priv = stex->priv;
 | 
			
		||||
 | 
			
		||||
  /* If there is no region then use the regular pick */
 | 
			
		||||
  if (priv->shape_region == NULL)
 | 
			
		||||
  if (priv->mask_texture == COGL_INVALID_HANDLE)
 | 
			
		||||
    CLUTTER_ACTOR_CLASS (meta_shaped_texture_parent_class)
 | 
			
		||||
      ->pick (actor, color);
 | 
			
		||||
  else if (clutter_actor_should_pick_paint (actor))
 | 
			
		||||
@@ -574,7 +304,7 @@ meta_shaped_texture_pick (ClutterActor       *actor,
 | 
			
		||||
      ClutterActorBox alloc;
 | 
			
		||||
      guint tex_width, tex_height;
 | 
			
		||||
 | 
			
		||||
      paint_tex = clutter_texture_get_cogl_texture (CLUTTER_TEXTURE (stex));
 | 
			
		||||
      paint_tex = priv->texture;
 | 
			
		||||
 | 
			
		||||
      if (paint_tex == COGL_INVALID_HANDLE)
 | 
			
		||||
        return;
 | 
			
		||||
@@ -585,8 +315,6 @@ meta_shaped_texture_pick (ClutterActor       *actor,
 | 
			
		||||
      if (tex_width == 0 || tex_height == 0) /* no contents yet */
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
      meta_shaped_texture_ensure_mask (stex);
 | 
			
		||||
 | 
			
		||||
      cogl_set_source_color4ub (color->red, color->green, color->blue,
 | 
			
		||||
                                 color->alpha);
 | 
			
		||||
 | 
			
		||||
@@ -602,19 +330,48 @@ meta_shaped_texture_pick (ClutterActor       *actor,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
meta_shaped_texture_update_area (ClutterX11TexturePixmap *texture,
 | 
			
		||||
				 int                      x,
 | 
			
		||||
				 int                      y,
 | 
			
		||||
				 int                      width,
 | 
			
		||||
				 int                      height)
 | 
			
		||||
meta_shaped_texture_get_preferred_width (ClutterActor *self,
 | 
			
		||||
                                         gfloat        for_height,
 | 
			
		||||
                                         gfloat       *min_width_p,
 | 
			
		||||
                                         gfloat       *natural_width_p)
 | 
			
		||||
{
 | 
			
		||||
  MetaShapedTexture *stex = (MetaShapedTexture *) texture;
 | 
			
		||||
  MetaShapedTexturePrivate *priv = stex->priv;
 | 
			
		||||
  MetaShapedTexturePrivate *priv;
 | 
			
		||||
 | 
			
		||||
  CLUTTER_X11_TEXTURE_PIXMAP_CLASS (meta_shaped_texture_parent_class)->update_area (texture,
 | 
			
		||||
                                                                                      x, y, width, height);
 | 
			
		||||
  g_return_if_fail (META_IS_SHAPED_TEXTURE (self));
 | 
			
		||||
 | 
			
		||||
  meta_texture_tower_update_area (priv->paint_tower, x, y, width, height);
 | 
			
		||||
  priv = META_SHAPED_TEXTURE (self)->priv;
 | 
			
		||||
 | 
			
		||||
  if (min_width_p)
 | 
			
		||||
    *min_width_p = 0;
 | 
			
		||||
 | 
			
		||||
  if (natural_width_p)
 | 
			
		||||
    *natural_width_p = priv->tex_width;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
meta_shaped_texture_get_preferred_height (ClutterActor *self,
 | 
			
		||||
                                          gfloat        for_width,
 | 
			
		||||
                                          gfloat       *min_height_p,
 | 
			
		||||
                                          gfloat       *natural_height_p)
 | 
			
		||||
{
 | 
			
		||||
  MetaShapedTexturePrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (META_IS_SHAPED_TEXTURE (self));
 | 
			
		||||
 | 
			
		||||
  priv = META_SHAPED_TEXTURE (self)->priv;
 | 
			
		||||
 | 
			
		||||
  if (min_height_p)
 | 
			
		||||
    *min_height_p = 0;
 | 
			
		||||
 | 
			
		||||
  if (natural_height_p)
 | 
			
		||||
    *natural_height_p = priv->tex_height;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
meta_shaped_texture_get_paint_volume (ClutterActor *self,
 | 
			
		||||
                                      ClutterPaintVolume *volume)
 | 
			
		||||
{
 | 
			
		||||
  return clutter_paint_volume_set_from_allocation (volume, self);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ClutterActor *
 | 
			
		||||
@@ -640,34 +397,16 @@ meta_shaped_texture_set_create_mipmaps (MetaShapedTexture *stex,
 | 
			
		||||
  if (create_mipmaps != priv->create_mipmaps)
 | 
			
		||||
    {
 | 
			
		||||
      CoglHandle base_texture;
 | 
			
		||||
 | 
			
		||||
      priv->create_mipmaps = create_mipmaps;
 | 
			
		||||
 | 
			
		||||
      base_texture = create_mipmaps ?
 | 
			
		||||
	clutter_texture_get_cogl_texture (CLUTTER_TEXTURE (stex)) : COGL_INVALID_HANDLE;
 | 
			
		||||
 | 
			
		||||
        priv->texture : COGL_INVALID_HANDLE;
 | 
			
		||||
      meta_texture_tower_set_base_texture (priv->paint_tower, base_texture);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* This is a workaround for deficiencies in the hack tower:
 | 
			
		||||
 *
 | 
			
		||||
 * When we call clutter_x11_texture_pixmap_set_pixmap(tp, None),
 | 
			
		||||
 * ClutterX11TexturePixmap knows that it has to get rid of the old texture, but
 | 
			
		||||
 * clutter_texture_set_cogl_texture(texture, COGL_INVALID_HANDLE) isn't allowed, so
 | 
			
		||||
 * it grabs the material for the texture and manually sets the texture in it. This means
 | 
			
		||||
 * that the "cogl-texture" property isn't notified, so we don't find out about it.
 | 
			
		||||
 *
 | 
			
		||||
 * And if we keep the CoglX11TexturePixmap around after the X pixmap is freed, then
 | 
			
		||||
 * we'll trigger X errors when we actually try to free it.
 | 
			
		||||
 *
 | 
			
		||||
 * The only correct thing to do here is to change our code to derive
 | 
			
		||||
 * from ClutterActor and get rid of the inheritance hack tower.  Once
 | 
			
		||||
 * we want to depend on Clutter-1.4 (which has CoglTexturePixmapX11),
 | 
			
		||||
 * that will be very easy to do.
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
meta_shaped_texture_clear (MetaShapedTexture *stex)
 | 
			
		||||
meta_shaped_texture_set_mask_texture (MetaShapedTexture *stex,
 | 
			
		||||
                                      CoglHandle         mask_texture)
 | 
			
		||||
{
 | 
			
		||||
  MetaShapedTexturePrivate *priv;
 | 
			
		||||
 | 
			
		||||
@@ -675,73 +414,98 @@ meta_shaped_texture_clear (MetaShapedTexture *stex)
 | 
			
		||||
 | 
			
		||||
  priv = stex->priv;
 | 
			
		||||
 | 
			
		||||
  meta_texture_tower_set_base_texture (priv->paint_tower, COGL_INVALID_HANDLE);
 | 
			
		||||
  if (priv->mask_texture != COGL_INVALID_HANDLE)
 | 
			
		||||
    {
 | 
			
		||||
      cogl_handle_unref (priv->mask_texture);
 | 
			
		||||
      priv->mask_texture = COGL_INVALID_HANDLE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (priv->material != COGL_INVALID_HANDLE)
 | 
			
		||||
    cogl_material_set_layer (priv->material, 0, COGL_INVALID_HANDLE);
 | 
			
		||||
  if (mask_texture != COGL_INVALID_HANDLE)
 | 
			
		||||
    {
 | 
			
		||||
      priv->mask_texture = mask_texture;
 | 
			
		||||
      cogl_handle_ref (priv->mask_texture);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (priv->material_unshaped != COGL_INVALID_HANDLE)
 | 
			
		||||
    cogl_material_set_layer (priv->material_unshaped, 0, COGL_INVALID_HANDLE);
 | 
			
		||||
  clutter_actor_queue_redraw (CLUTTER_ACTOR (stex));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
meta_shaped_texture_set_shape_region (MetaShapedTexture *stex,
 | 
			
		||||
                                      cairo_region_t    *region)
 | 
			
		||||
meta_shaped_texture_update_area (MetaShapedTexture *stex,
 | 
			
		||||
				 int                x,
 | 
			
		||||
				 int                y,
 | 
			
		||||
				 int                width,
 | 
			
		||||
				 int                height)
 | 
			
		||||
{
 | 
			
		||||
  MetaShapedTexturePrivate *priv;
 | 
			
		||||
  const cairo_rectangle_int_t clip = { x, y, width, height };
 | 
			
		||||
 | 
			
		||||
  priv = stex->priv;
 | 
			
		||||
 | 
			
		||||
  if (priv->texture == COGL_INVALID_HANDLE)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  cogl_texture_pixmap_x11_update_area (priv->texture, x, y, width, height);
 | 
			
		||||
 | 
			
		||||
  meta_texture_tower_update_area (priv->paint_tower, x, y, width, height);
 | 
			
		||||
 | 
			
		||||
  clutter_actor_queue_redraw_with_clip (CLUTTER_ACTOR (stex), &clip);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
set_cogl_texture (MetaShapedTexture *stex,
 | 
			
		||||
                  CoglHandle         cogl_tex)
 | 
			
		||||
{
 | 
			
		||||
  MetaShapedTexturePrivate *priv;
 | 
			
		||||
  guint width, height;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (META_IS_SHAPED_TEXTURE (stex));
 | 
			
		||||
 | 
			
		||||
  priv = stex->priv;
 | 
			
		||||
 | 
			
		||||
  if (priv->shape_region != NULL)
 | 
			
		||||
  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)
 | 
			
		||||
    {
 | 
			
		||||
      cairo_region_destroy (priv->shape_region);
 | 
			
		||||
      priv->shape_region = NULL;
 | 
			
		||||
      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));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (region != NULL)
 | 
			
		||||
    {
 | 
			
		||||
      cairo_region_reference (region);
 | 
			
		||||
      priv->shape_region = region;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  meta_shaped_texture_dirty_mask (stex);
 | 
			
		||||
  clutter_actor_queue_redraw (CLUTTER_ACTOR (stex));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * meta_shaped_texture_get_visible_pixels_region:
 | 
			
		||||
 * @stex: a #MetaShapedTexture
 | 
			
		||||
 *
 | 
			
		||||
 * Return a region enclosing only visible pixels: those with
 | 
			
		||||
 * alpha values above 0.
 | 
			
		||||
 *
 | 
			
		||||
 * Returns: a #cairo_region_t
 | 
			
		||||
 */
 | 
			
		||||
cairo_region_t *
 | 
			
		||||
meta_shaped_texture_get_visible_pixels_region (MetaShapedTexture *stex)
 | 
			
		||||
{
 | 
			
		||||
  g_return_val_if_fail (META_IS_SHAPED_TEXTURE (stex), NULL);
 | 
			
		||||
 | 
			
		||||
  meta_shaped_texture_ensure_mask (stex);
 | 
			
		||||
  return stex->priv->visible_pixels_region;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * meta_shaped_texture_set_overlay_path:
 | 
			
		||||
 * @stex: a #MetaShapedTexture
 | 
			
		||||
 * @overlay_region: A region containing the parts of the mask to overlay.
 | 
			
		||||
 *   All rectangles in this region are wiped clear to full transparency,
 | 
			
		||||
 *   and the overlay path is clipped to this region.
 | 
			
		||||
 * @overlay_path (transfer full): This path will be painted onto the mask
 | 
			
		||||
 *   texture with a fully opaque source. Due to the lack of refcounting
 | 
			
		||||
 *   in #cairo_path_t, ownership of the path is assumed.
 | 
			
		||||
 * meta_shaped_texture_set_pixmap:
 | 
			
		||||
 * @stex: The #MetaShapedTexture
 | 
			
		||||
 * @pixmap: The pixmap you want the stex to assume
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
meta_shaped_texture_set_overlay_path (MetaShapedTexture *stex,
 | 
			
		||||
                                      cairo_region_t    *overlay_region,
 | 
			
		||||
                                      cairo_path_t      *overlay_path)
 | 
			
		||||
meta_shaped_texture_set_pixmap (MetaShapedTexture *stex,
 | 
			
		||||
                                Pixmap             pixmap)
 | 
			
		||||
{
 | 
			
		||||
  MetaShapedTexturePrivate *priv;
 | 
			
		||||
 | 
			
		||||
@@ -749,33 +513,42 @@ meta_shaped_texture_set_overlay_path (MetaShapedTexture *stex,
 | 
			
		||||
 | 
			
		||||
  priv = stex->priv;
 | 
			
		||||
 | 
			
		||||
  if (priv->overlay_region != NULL)
 | 
			
		||||
  if (priv->pixmap == pixmap)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  priv->pixmap = pixmap;
 | 
			
		||||
 | 
			
		||||
  if (pixmap != None)
 | 
			
		||||
    {
 | 
			
		||||
      cairo_region_destroy (priv->overlay_region);
 | 
			
		||||
      priv->overlay_region = NULL;
 | 
			
		||||
      CoglContext *ctx =
 | 
			
		||||
        clutter_backend_get_cogl_context (clutter_get_default_backend ());
 | 
			
		||||
      set_cogl_texture (stex, cogl_texture_pixmap_x11_new (ctx, pixmap, FALSE, NULL));
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    set_cogl_texture (stex, COGL_INVALID_HANDLE);
 | 
			
		||||
 | 
			
		||||
  if (priv->overlay_path != NULL)
 | 
			
		||||
    {
 | 
			
		||||
      cairo_path_destroy (priv->overlay_path);
 | 
			
		||||
      priv->overlay_path = NULL;
 | 
			
		||||
    }
 | 
			
		||||
  if (priv->create_mipmaps)
 | 
			
		||||
    meta_texture_tower_set_base_texture (priv->paint_tower, priv->texture);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
  cairo_region_reference (overlay_region);
 | 
			
		||||
  priv->overlay_region = overlay_region;
 | 
			
		||||
 | 
			
		||||
  /* cairo_path_t does not have refcounting. */
 | 
			
		||||
  priv->overlay_path = overlay_path;
 | 
			
		||||
 | 
			
		||||
  meta_shaped_texture_dirty_mask (stex);
 | 
			
		||||
/**
 | 
			
		||||
 * meta_shaped_texture_get_texture:
 | 
			
		||||
 * @stex: The #MetaShapedTexture
 | 
			
		||||
 *
 | 
			
		||||
 * Returns: (transfer none): the unshaped texture
 | 
			
		||||
 */
 | 
			
		||||
CoglHandle
 | 
			
		||||
meta_shaped_texture_get_texture (MetaShapedTexture *stex)
 | 
			
		||||
{
 | 
			
		||||
  g_return_val_if_fail (META_IS_SHAPED_TEXTURE (stex), COGL_INVALID_HANDLE);
 | 
			
		||||
  return stex->priv->texture;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * meta_shaped_texture_set_clip_region:
 | 
			
		||||
 * @frame: a #MetaShapedTexture
 | 
			
		||||
 * @stex: a #MetaShapedTexture
 | 
			
		||||
 * @clip_region: (transfer full): the region of the texture that
 | 
			
		||||
 *   is visible and should be painted. OWNERSHIP IS ASSUMED BY
 | 
			
		||||
 *   THE FUNCTION (for efficiency to avoid a copy.)
 | 
			
		||||
 *   is visible and should be painted.
 | 
			
		||||
 *
 | 
			
		||||
 * Provides a hint to the texture about what areas of the texture
 | 
			
		||||
 * are not completely obscured and thus need to be painted. This
 | 
			
		||||
@@ -801,5 +574,106 @@ meta_shaped_texture_set_clip_region (MetaShapedTexture *stex,
 | 
			
		||||
      priv->clip_region = NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  priv->clip_region = clip_region;
 | 
			
		||||
  if (clip_region)
 | 
			
		||||
    priv->clip_region = cairo_region_copy (clip_region);
 | 
			
		||||
  else
 | 
			
		||||
    priv->clip_region = NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * meta_shaped_texture_get_image:
 | 
			
		||||
 * @stex: A #MetaShapedTexture
 | 
			
		||||
 * @clip: A clipping rectangle, to help prevent extra processing.
 | 
			
		||||
 * In the case that the clipping rectangle is partially or fully
 | 
			
		||||
 * outside the bounds of the texture, the rectangle will be clipped.
 | 
			
		||||
 *
 | 
			
		||||
 * Flattens the two layers of the shaped texture into one ARGB32
 | 
			
		||||
 * image by alpha blending the two images, and returns the flattened
 | 
			
		||||
 * image.
 | 
			
		||||
 *
 | 
			
		||||
 * Returns: (transfer full): a new cairo surface to be freed with
 | 
			
		||||
 * cairo_surface_destroy().
 | 
			
		||||
 */
 | 
			
		||||
cairo_surface_t *
 | 
			
		||||
meta_shaped_texture_get_image (MetaShapedTexture     *stex,
 | 
			
		||||
                               cairo_rectangle_int_t *clip)
 | 
			
		||||
{
 | 
			
		||||
  CoglHandle texture, mask_texture;
 | 
			
		||||
  cairo_rectangle_int_t texture_rect = { 0, 0, 0, 0 };
 | 
			
		||||
  cairo_surface_t *surface;
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_fail (META_IS_SHAPED_TEXTURE (stex), NULL);
 | 
			
		||||
 | 
			
		||||
  texture = stex->priv->texture;
 | 
			
		||||
 | 
			
		||||
  if (texture == NULL)
 | 
			
		||||
    return NULL;
 | 
			
		||||
 | 
			
		||||
  texture_rect.width = cogl_texture_get_width (texture);
 | 
			
		||||
  texture_rect.height = cogl_texture_get_height (texture);
 | 
			
		||||
 | 
			
		||||
  if (clip != NULL)
 | 
			
		||||
    {
 | 
			
		||||
      /* GdkRectangle is just a typedef of cairo_rectangle_int_t,
 | 
			
		||||
       * so we can use the gdk_rectangle_* APIs on these. */
 | 
			
		||||
      if (!gdk_rectangle_intersect (&texture_rect, clip, clip))
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (clip != NULL)
 | 
			
		||||
    texture = cogl_texture_new_from_sub_texture (texture,
 | 
			
		||||
                                                 clip->x,
 | 
			
		||||
                                                 clip->y,
 | 
			
		||||
                                                 clip->width,
 | 
			
		||||
                                                 clip->height);
 | 
			
		||||
 | 
			
		||||
  surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
 | 
			
		||||
                                        cogl_texture_get_width (texture),
 | 
			
		||||
                                        cogl_texture_get_height (texture));
 | 
			
		||||
 | 
			
		||||
  cogl_texture_get_data (texture, CLUTTER_CAIRO_FORMAT_ARGB32,
 | 
			
		||||
                         cairo_image_surface_get_stride (surface),
 | 
			
		||||
                         cairo_image_surface_get_data (surface));
 | 
			
		||||
 | 
			
		||||
  cairo_surface_mark_dirty (surface);
 | 
			
		||||
 | 
			
		||||
  if (clip != NULL)
 | 
			
		||||
    cogl_object_unref (texture);
 | 
			
		||||
 | 
			
		||||
  mask_texture = stex->priv->mask_texture;
 | 
			
		||||
  if (mask_texture != COGL_INVALID_HANDLE)
 | 
			
		||||
    {
 | 
			
		||||
      cairo_t *cr;
 | 
			
		||||
      cairo_surface_t *mask_surface;
 | 
			
		||||
 | 
			
		||||
      if (clip != NULL)
 | 
			
		||||
        mask_texture = cogl_texture_new_from_sub_texture (mask_texture,
 | 
			
		||||
                                                          clip->x,
 | 
			
		||||
                                                          clip->y,
 | 
			
		||||
                                                          clip->width,
 | 
			
		||||
                                                          clip->height);
 | 
			
		||||
 | 
			
		||||
      mask_surface = cairo_image_surface_create (CAIRO_FORMAT_A8,
 | 
			
		||||
                                                 cogl_texture_get_width (mask_texture),
 | 
			
		||||
                                                 cogl_texture_get_height (mask_texture));
 | 
			
		||||
 | 
			
		||||
      cogl_texture_get_data (mask_texture, COGL_PIXEL_FORMAT_A_8,
 | 
			
		||||
                             cairo_image_surface_get_stride (mask_surface),
 | 
			
		||||
                             cairo_image_surface_get_data (mask_surface));
 | 
			
		||||
 | 
			
		||||
      cairo_surface_mark_dirty (mask_surface);
 | 
			
		||||
 | 
			
		||||
      cr = cairo_create (surface);
 | 
			
		||||
      cairo_set_source_surface (cr, mask_surface, 0, 0);
 | 
			
		||||
      cairo_set_operator (cr, CAIRO_OPERATOR_DEST_IN);
 | 
			
		||||
      cairo_paint (cr);
 | 
			
		||||
      cairo_destroy (cr);
 | 
			
		||||
 | 
			
		||||
      cairo_surface_destroy (mask_surface);
 | 
			
		||||
 | 
			
		||||
      if (clip != NULL)
 | 
			
		||||
        cogl_object_unref (mask_texture);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return surface;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,7 @@
 | 
			
		||||
 *
 | 
			
		||||
 * Authored By Neil Roberts  <neil@linux.intel.com>
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2011 Intel Corporation
 | 
			
		||||
 * Copyright (C) 2011, 2012 Intel Corporation
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU General Public License as
 | 
			
		||||
@@ -25,94 +25,77 @@
 | 
			
		||||
 | 
			
		||||
#include <config.h>
 | 
			
		||||
 | 
			
		||||
#define CLUTTER_ENABLE_EXPERIMENTAL_API
 | 
			
		||||
#define COGL_ENABLE_EXPERIMENTAL_API
 | 
			
		||||
 | 
			
		||||
#include <clutter/clutter.h>
 | 
			
		||||
#include "meta-texture-rectangle.h"
 | 
			
		||||
 | 
			
		||||
#ifdef GL_TEXTURE_RECTANGLE_ARB
 | 
			
		||||
 | 
			
		||||
static void (* pf_glGetIntegerv) (GLenum pname, GLint *params);
 | 
			
		||||
static void (* pf_glTexImage2D) (GLenum target, GLint level,
 | 
			
		||||
                                 GLint internalFormat,
 | 
			
		||||
                                 GLsizei width, GLsizei height,
 | 
			
		||||
                                 GLint border, GLenum format, GLenum type,
 | 
			
		||||
                                 const GLvoid *pixels);
 | 
			
		||||
static void (* pf_glGenTextures) (GLsizei n, GLuint *textures);
 | 
			
		||||
static void (* pf_glDeleteTextures) (GLsizei n, const GLuint *texture);
 | 
			
		||||
static void (* pf_glBindTexture) (GLenum target, GLuint texture);
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
rectangle_texture_destroy_cb (void *user_data)
 | 
			
		||||
{
 | 
			
		||||
  GLuint tex = GPOINTER_TO_UINT (user_data);
 | 
			
		||||
 | 
			
		||||
  pf_glDeleteTextures (1, &tex);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif /* GL_TEXTURE_RECTANGLE_ARB */
 | 
			
		||||
 | 
			
		||||
CoglHandle
 | 
			
		||||
CoglTexture *
 | 
			
		||||
meta_texture_rectangle_new (unsigned int width,
 | 
			
		||||
                            unsigned int height,
 | 
			
		||||
                            CoglTextureFlags flags,
 | 
			
		||||
                            CoglPixelFormat format,
 | 
			
		||||
                            GLenum internal_gl_format,
 | 
			
		||||
                            GLenum internal_format,
 | 
			
		||||
                            CoglPixelFormat internal_format,
 | 
			
		||||
                            unsigned int rowstride,
 | 
			
		||||
                            const guint8 *data)
 | 
			
		||||
                            const guint8 *data,
 | 
			
		||||
                            GError **error)
 | 
			
		||||
{
 | 
			
		||||
  CoglHandle cogl_tex = COGL_INVALID_HANDLE;
 | 
			
		||||
  ClutterBackend *backend =
 | 
			
		||||
    clutter_get_default_backend ();
 | 
			
		||||
  CoglContext *context =
 | 
			
		||||
    clutter_backend_get_cogl_context (backend);
 | 
			
		||||
  CoglTextureRectangle *tex_rect;
 | 
			
		||||
 | 
			
		||||
#ifdef GL_TEXTURE_RECTANGLE_ARB
 | 
			
		||||
  tex_rect = cogl_texture_rectangle_new_with_size (context,
 | 
			
		||||
                                                   width, height,
 | 
			
		||||
                                                   internal_format,
 | 
			
		||||
                                                   error);
 | 
			
		||||
  if (tex_rect == NULL)
 | 
			
		||||
    return NULL;
 | 
			
		||||
 | 
			
		||||
  static CoglUserDataKey user_data_key;
 | 
			
		||||
  GLint old_binding;
 | 
			
		||||
  GLuint tex;
 | 
			
		||||
 | 
			
		||||
  if (pf_glGenTextures == NULL)
 | 
			
		||||
    {
 | 
			
		||||
      pf_glGetIntegerv = (void *) cogl_get_proc_address ("glGetIntegerv");
 | 
			
		||||
      pf_glTexImage2D = (void *) cogl_get_proc_address ("glTexImage2D");
 | 
			
		||||
      pf_glGenTextures = (void *) cogl_get_proc_address ("glGenTextures");
 | 
			
		||||
      pf_glDeleteTextures = (void *) cogl_get_proc_address ("glDeleteTextures");
 | 
			
		||||
      pf_glBindTexture = (void *) cogl_get_proc_address ("glBindTexture");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  pf_glGenTextures (1, &tex);
 | 
			
		||||
  pf_glGetIntegerv (GL_TEXTURE_BINDING_RECTANGLE_ARB, &old_binding);
 | 
			
		||||
  pf_glBindTexture (GL_TEXTURE_RECTANGLE_ARB, tex);
 | 
			
		||||
  pf_glTexImage2D (GL_TEXTURE_RECTANGLE_ARB, 0,
 | 
			
		||||
                   internal_gl_format, width, height,
 | 
			
		||||
                   0, internal_gl_format,
 | 
			
		||||
                   GL_UNSIGNED_BYTE, NULL);
 | 
			
		||||
  pf_glBindTexture (GL_TEXTURE_RECTANGLE_ARB, old_binding);
 | 
			
		||||
 | 
			
		||||
  cogl_tex = cogl_texture_new_from_foreign (tex,
 | 
			
		||||
                                            GL_TEXTURE_RECTANGLE_ARB,
 | 
			
		||||
                                            width, height,
 | 
			
		||||
                                            0, 0, /* no waste */
 | 
			
		||||
                                            internal_format);
 | 
			
		||||
 | 
			
		||||
  /* Cogl won't destroy the GL texture when a foreign texture is used
 | 
			
		||||
     so we need to destroy it manually. We can set a destroy
 | 
			
		||||
     notification callback to do this transparently */
 | 
			
		||||
  cogl_object_set_user_data (cogl_tex,
 | 
			
		||||
                             &user_data_key,
 | 
			
		||||
                             GUINT_TO_POINTER (tex),
 | 
			
		||||
                             rectangle_texture_destroy_cb);
 | 
			
		||||
 | 
			
		||||
  /* Use cogl_texture_set_region instead of uploading the data
 | 
			
		||||
     directly with GL calls so that we can let Cogl deal with setting
 | 
			
		||||
     the pixel store parameters and handling format conversion */
 | 
			
		||||
  if (data)
 | 
			
		||||
    cogl_texture_set_region (cogl_tex,
 | 
			
		||||
                             0, 0, /* src x/y */
 | 
			
		||||
                             0, 0, /* dst x/y */
 | 
			
		||||
                             width, height, /* dst width/height */
 | 
			
		||||
                             width, height, /* src width/height */
 | 
			
		||||
    cogl_texture_set_region (COGL_TEXTURE (tex_rect),
 | 
			
		||||
                             0, 0, /* src_x/y */
 | 
			
		||||
                             0, 0, /* dst_x/y */
 | 
			
		||||
                             width, height, /* dst_width/height */
 | 
			
		||||
                             width, height, /* width/height */
 | 
			
		||||
                             format,
 | 
			
		||||
                             rowstride,
 | 
			
		||||
                             data);
 | 
			
		||||
 | 
			
		||||
#endif /* GL_TEXTURE_RECTANGLE_ARB */
 | 
			
		||||
 | 
			
		||||
  return cogl_tex;
 | 
			
		||||
  return COGL_TEXTURE (tex_rect);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
texture_rectangle_check_cb (CoglTexture *sub_texture,
 | 
			
		||||
                            const float *sub_texture_coords,
 | 
			
		||||
                            const float *meta_coords,
 | 
			
		||||
                            void *user_data)
 | 
			
		||||
{
 | 
			
		||||
  gboolean *result = user_data;
 | 
			
		||||
 | 
			
		||||
  if (cogl_is_texture_rectangle (sub_texture))
 | 
			
		||||
    *result = TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Determines if the given texture is using a rectangle texture as its
 | 
			
		||||
 * primitive texture type. Eventually this function could be replaced
 | 
			
		||||
 * with cogl_texture_get_type if Cogl makes that public.
 | 
			
		||||
 *
 | 
			
		||||
 * http://git.gnome.org/browse/cogl/commit/?h=8012eee31
 | 
			
		||||
 */
 | 
			
		||||
gboolean
 | 
			
		||||
meta_texture_rectangle_check (CoglTexture *texture)
 | 
			
		||||
{
 | 
			
		||||
  gboolean result = FALSE;
 | 
			
		||||
 | 
			
		||||
  cogl_meta_texture_foreach_in_region (COGL_META_TEXTURE (texture),
 | 
			
		||||
                                       0.0f, 0.0f, /* tx_1 / ty_1 */
 | 
			
		||||
                                       1.0f, 1.0f, /* tx_2 / ty_2 */
 | 
			
		||||
                                       COGL_PIPELINE_WRAP_MODE_REPEAT,
 | 
			
		||||
                                       COGL_PIPELINE_WRAP_MODE_REPEAT,
 | 
			
		||||
                                       texture_rectangle_check_cb,
 | 
			
		||||
                                       &result);
 | 
			
		||||
 | 
			
		||||
  return result;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -30,15 +30,17 @@
 | 
			
		||||
 | 
			
		||||
G_BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
CoglHandle
 | 
			
		||||
CoglTexture *
 | 
			
		||||
meta_texture_rectangle_new (unsigned int width,
 | 
			
		||||
                            unsigned int height,
 | 
			
		||||
                            CoglTextureFlags flags,
 | 
			
		||||
                            CoglPixelFormat format,
 | 
			
		||||
                            GLenum internal_gl_format,
 | 
			
		||||
                            GLenum internal_format,
 | 
			
		||||
                            CoglPixelFormat internal_format,
 | 
			
		||||
                            unsigned int rowstride,
 | 
			
		||||
                            const guint8 *data);
 | 
			
		||||
                            const guint8 *data,
 | 
			
		||||
                            GError **error);
 | 
			
		||||
 | 
			
		||||
gboolean
 | 
			
		||||
meta_texture_rectangle_check (CoglTexture *texture);
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -98,18 +98,6 @@ meta_texture_tower_free (MetaTextureTower *tower)
 | 
			
		||||
  g_slice_free (MetaTextureTower, tower);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifdef GL_TEXTURE_RECTANGLE_ARB
 | 
			
		||||
static gboolean
 | 
			
		||||
texture_is_rectangle (CoglHandle texture)
 | 
			
		||||
{
 | 
			
		||||
  GLuint gl_tex;
 | 
			
		||||
  GLenum gl_target;
 | 
			
		||||
 | 
			
		||||
  cogl_texture_get_gl_texture (texture, &gl_tex, &gl_target);
 | 
			
		||||
  return gl_target == GL_TEXTURE_RECTANGLE_ARB;
 | 
			
		||||
}
 | 
			
		||||
#endif /* GL_TEXTURE_RECTANGLE_ARB */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * meta_texture_tower_set_base_texture:
 | 
			
		||||
 * @tower: a #MetaTextureTower
 | 
			
		||||
@@ -354,13 +342,11 @@ get_paint_level (int width, int height)
 | 
			
		||||
    return (int)(0.5 + lambda);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifdef GL_TEXTURE_RECTANGLE_ARB
 | 
			
		||||
static gboolean
 | 
			
		||||
is_power_of_two (int x)
 | 
			
		||||
{
 | 
			
		||||
  return (x & (x - 1)) == 0;
 | 
			
		||||
}
 | 
			
		||||
#endif /* GL_TEXTURE_RECTANGLE_ARB */
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
texture_tower_create_texture (MetaTextureTower *tower,
 | 
			
		||||
@@ -368,25 +354,23 @@ texture_tower_create_texture (MetaTextureTower *tower,
 | 
			
		||||
                              int               width,
 | 
			
		||||
                              int               height)
 | 
			
		||||
{
 | 
			
		||||
#ifdef GL_TEXTURE_RECTANGLE_ARB
 | 
			
		||||
  if ((!is_power_of_two (width) || !is_power_of_two (height)) &&
 | 
			
		||||
      texture_is_rectangle (tower->textures[level - 1]))
 | 
			
		||||
      meta_texture_rectangle_check (tower->textures[level - 1]))
 | 
			
		||||
    {
 | 
			
		||||
      tower->textures[level] =
 | 
			
		||||
        meta_texture_rectangle_new (width, height,
 | 
			
		||||
                                    0, /* flags */
 | 
			
		||||
                                    /* data format */
 | 
			
		||||
                                    TEXTURE_FORMAT,
 | 
			
		||||
                                    /* internal GL format */
 | 
			
		||||
                                    GL_RGBA,
 | 
			
		||||
                                    /* internal cogl format */
 | 
			
		||||
                                    TEXTURE_FORMAT,
 | 
			
		||||
                                    /* rowstride */
 | 
			
		||||
                                    width * 4,
 | 
			
		||||
                                    /* data */
 | 
			
		||||
                                    NULL,
 | 
			
		||||
                                    /* error */
 | 
			
		||||
                                    NULL);
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
#endif /* GL_TEXTURE_RECTANGLE_ARB */
 | 
			
		||||
    {
 | 
			
		||||
      tower->textures[level] = cogl_texture_new_with_size (width, height,
 | 
			
		||||
                                                           COGL_TEXTURE_NO_AUTO_MIPMAP,
 | 
			
		||||
@@ -562,7 +546,7 @@ texture_tower_revalidate_client (MetaTextureTower *tower,
 | 
			
		||||
                           4 * dest_width,
 | 
			
		||||
                           dest_data);
 | 
			
		||||
 | 
			
		||||
  if (dest_height < source_texture_height)
 | 
			
		||||
  if (dest_texture_height < source_texture_height)
 | 
			
		||||
    {
 | 
			
		||||
      g_free (source_tmp1);
 | 
			
		||||
      g_free (source_tmp2);
 | 
			
		||||
 
 | 
			
		||||
@@ -13,17 +13,20 @@
 | 
			
		||||
#define COGL_ENABLE_EXPERIMENTAL_API
 | 
			
		||||
#include <cogl/cogl-texture-pixmap-x11.h>
 | 
			
		||||
#include <gdk/gdk.h> /* for gdk_rectangle_union() */
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
#include <meta/display.h>
 | 
			
		||||
#include <meta/errors.h>
 | 
			
		||||
#include "frame.h"
 | 
			
		||||
#include <meta/window.h>
 | 
			
		||||
#include <meta/meta-shaped-texture.h>
 | 
			
		||||
#include "xprops.h"
 | 
			
		||||
 | 
			
		||||
#include "compositor-private.h"
 | 
			
		||||
#include "meta-shadow-factory-private.h"
 | 
			
		||||
#include "meta-shaped-texture.h"
 | 
			
		||||
#include "meta-window-actor-private.h"
 | 
			
		||||
#include "meta-texture-rectangle.h"
 | 
			
		||||
#include "region-utils.h"
 | 
			
		||||
 | 
			
		||||
enum {
 | 
			
		||||
  POSITION_CHANGED,
 | 
			
		||||
@@ -123,15 +126,10 @@ enum
 | 
			
		||||
  PROP_META_WINDOW = 1,
 | 
			
		||||
  PROP_META_SCREEN,
 | 
			
		||||
  PROP_X_WINDOW,
 | 
			
		||||
  PROP_X_WINDOW_ATTRIBUTES,
 | 
			
		||||
  PROP_NO_SHADOW,
 | 
			
		||||
  PROP_SHADOW_CLASS
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define DEFAULT_SHADOW_RADIUS 12
 | 
			
		||||
#define DEFAULT_SHADOW_X_OFFSET 0
 | 
			
		||||
#define DEFAULT_SHADOW_Y_OFFSET 8
 | 
			
		||||
 | 
			
		||||
static void meta_window_actor_dispose    (GObject *object);
 | 
			
		||||
static void meta_window_actor_finalize   (GObject *object);
 | 
			
		||||
static void meta_window_actor_constructed (GObject *object);
 | 
			
		||||
@@ -232,15 +230,13 @@ meta_window_actor_class_init (MetaWindowActorClass *klass)
 | 
			
		||||
    g_signal_new ("position-changed",
 | 
			
		||||
                  G_TYPE_FROM_CLASS (klass),
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  0, NULL, NULL,
 | 
			
		||||
                  g_cclosure_marshal_VOID__VOID,
 | 
			
		||||
                  0, NULL, NULL, NULL,
 | 
			
		||||
                  G_TYPE_NONE, 0);
 | 
			
		||||
  signals[SIZE_CHANGED] =
 | 
			
		||||
    g_signal_new ("size-changed",
 | 
			
		||||
                  G_TYPE_FROM_CLASS (klass),
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  0, NULL, NULL,
 | 
			
		||||
                  g_cclosure_marshal_VOID__VOID,
 | 
			
		||||
                  0, NULL, NULL, NULL,
 | 
			
		||||
                  G_TYPE_NONE, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -741,74 +737,52 @@ meta_window_actor_has_shadow (MetaWindowActor *self)
 | 
			
		||||
      meta_window_is_fullscreen (priv->window))
 | 
			
		||||
    return FALSE;
 | 
			
		||||
 | 
			
		||||
  /*
 | 
			
		||||
   * If we have two snap-tiled windows, we don't want the shadow to obstruct
 | 
			
		||||
   * the other window.
 | 
			
		||||
   */
 | 
			
		||||
  if (meta_window_get_tile_match (priv->window))
 | 
			
		||||
    return FALSE;
 | 
			
		||||
 | 
			
		||||
  /*
 | 
			
		||||
   * Always put a shadow around windows with a frame - This should override
 | 
			
		||||
   * the restriction about not putting a shadow around ARGB windows.
 | 
			
		||||
   */
 | 
			
		||||
  if (priv->window)
 | 
			
		||||
    {
 | 
			
		||||
      if (meta_window_get_frame (priv->window))
 | 
			
		||||
	{
 | 
			
		||||
	  meta_verbose ("Window 0x%x has shadow because it has a frame\n",
 | 
			
		||||
			(guint)priv->xwindow);
 | 
			
		||||
	  return TRUE;
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
  if (meta_window_get_frame (priv->window))
 | 
			
		||||
    return TRUE;
 | 
			
		||||
 | 
			
		||||
  /*
 | 
			
		||||
   * Do not add shadows to ARGB windows; eventually we should generate a
 | 
			
		||||
   * shadow from the input shape for such windows.
 | 
			
		||||
   */
 | 
			
		||||
  if (priv->argb32 || priv->opacity != 0xff)
 | 
			
		||||
    {
 | 
			
		||||
      meta_verbose ("Window 0x%x has no shadow as it is ARGB\n",
 | 
			
		||||
		    (guint)priv->xwindow);
 | 
			
		||||
      return FALSE;
 | 
			
		||||
    }
 | 
			
		||||
    return FALSE;
 | 
			
		||||
 | 
			
		||||
  /*
 | 
			
		||||
   * Add shadows to override redirect windows (e.g., Gtk menus).
 | 
			
		||||
   */
 | 
			
		||||
  if (priv->window->override_redirect)
 | 
			
		||||
    {
 | 
			
		||||
      meta_verbose ("Window 0x%x has shadow because it is override redirect.\n",
 | 
			
		||||
		    (guint)priv->xwindow);
 | 
			
		||||
      return TRUE;
 | 
			
		||||
    }
 | 
			
		||||
    return TRUE;
 | 
			
		||||
 | 
			
		||||
  /*
 | 
			
		||||
   * Don't put shadow around DND icon windows
 | 
			
		||||
   */
 | 
			
		||||
  if (window_type == META_WINDOW_DND ||
 | 
			
		||||
      window_type == META_WINDOW_DESKTOP)
 | 
			
		||||
    {
 | 
			
		||||
      meta_verbose ("Window 0x%x has no shadow as it is DND or Desktop\n",
 | 
			
		||||
		    (guint)priv->xwindow);
 | 
			
		||||
      return FALSE;
 | 
			
		||||
    }
 | 
			
		||||
    return FALSE;
 | 
			
		||||
 | 
			
		||||
  if (window_type == META_WINDOW_MENU
 | 
			
		||||
#if 0
 | 
			
		||||
      || window_type == META_WINDOW_DROPDOWN_MENU
 | 
			
		||||
#endif
 | 
			
		||||
      )
 | 
			
		||||
    {
 | 
			
		||||
      meta_verbose ("Window 0x%x has shadow as it is a menu\n",
 | 
			
		||||
		    (guint)priv->xwindow);
 | 
			
		||||
      return TRUE;
 | 
			
		||||
    }
 | 
			
		||||
    return TRUE;
 | 
			
		||||
 | 
			
		||||
#if 0
 | 
			
		||||
  if (window_type == META_WINDOW_TOOLTIP)
 | 
			
		||||
    {
 | 
			
		||||
      meta_verbose ("Window 0x%x has shadow as it is a tooltip\n",
 | 
			
		||||
		    (guint)priv->xwindow);
 | 
			
		||||
      return TRUE;
 | 
			
		||||
    }
 | 
			
		||||
    return TRUE;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  meta_verbose ("Window 0x%x has no shadow as it fell through\n",
 | 
			
		||||
		(guint)priv->xwindow);
 | 
			
		||||
  return FALSE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -946,26 +920,20 @@ static void
 | 
			
		||||
meta_window_actor_damage_all (MetaWindowActor *self)
 | 
			
		||||
{
 | 
			
		||||
  MetaWindowActorPrivate *priv = self->priv;
 | 
			
		||||
  ClutterX11TexturePixmap *texture_x11 = CLUTTER_X11_TEXTURE_PIXMAP (priv->actor);
 | 
			
		||||
  guint pixmap_width = 0;
 | 
			
		||||
  guint pixmap_height = 0;
 | 
			
		||||
  CoglHandle texture;
 | 
			
		||||
 | 
			
		||||
  if (!priv->needs_damage_all)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  g_object_get (texture_x11,
 | 
			
		||||
                "pixmap-width", &pixmap_width,
 | 
			
		||||
                "pixmap-height", &pixmap_height,
 | 
			
		||||
                NULL);
 | 
			
		||||
  texture = meta_shaped_texture_get_texture (META_SHAPED_TEXTURE (priv->actor));
 | 
			
		||||
 | 
			
		||||
  if (!priv->mapped || priv->needs_pixmap)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  clutter_x11_texture_pixmap_update_area (texture_x11,
 | 
			
		||||
                                          0,
 | 
			
		||||
                                          0,
 | 
			
		||||
                                          pixmap_width,
 | 
			
		||||
                                          pixmap_height);
 | 
			
		||||
  meta_shaped_texture_update_area (META_SHAPED_TEXTURE (priv->actor),
 | 
			
		||||
                                   0, 0,
 | 
			
		||||
                                   cogl_texture_get_width (texture),
 | 
			
		||||
                                   cogl_texture_get_height (texture));
 | 
			
		||||
 | 
			
		||||
  priv->needs_damage_all = FALSE;
 | 
			
		||||
}
 | 
			
		||||
@@ -1204,9 +1172,8 @@ meta_window_actor_detach (MetaWindowActor *self)
 | 
			
		||||
   * you are supposed to be able to free a GLXPixmap after freeing the underlying
 | 
			
		||||
   * pixmap, but it certainly doesn't work with current DRI/Mesa
 | 
			
		||||
   */
 | 
			
		||||
  clutter_x11_texture_pixmap_set_pixmap (CLUTTER_X11_TEXTURE_PIXMAP (priv->actor),
 | 
			
		||||
                                         None);
 | 
			
		||||
  meta_shaped_texture_clear (META_SHAPED_TEXTURE (priv->actor));
 | 
			
		||||
  meta_shaped_texture_set_pixmap (META_SHAPED_TEXTURE (priv->actor),
 | 
			
		||||
                                  None);
 | 
			
		||||
  cogl_flush();
 | 
			
		||||
 | 
			
		||||
  XFreePixmap (xdisplay, priv->back_pixmap);
 | 
			
		||||
@@ -1221,31 +1188,36 @@ meta_window_actor_should_unredirect (MetaWindowActor *self)
 | 
			
		||||
  MetaWindow *metaWindow = meta_window_actor_get_meta_window (self);
 | 
			
		||||
  MetaScreen *screen = meta_window_get_screen (metaWindow);
 | 
			
		||||
  MetaWindowActorPrivate *priv = self->priv;
 | 
			
		||||
  int screen_width, screen_height;
 | 
			
		||||
  MetaRectangle window_rect, monitor_rect;
 | 
			
		||||
  int num_monitors = meta_screen_get_n_monitors (screen);
 | 
			
		||||
  int i;
 | 
			
		||||
 | 
			
		||||
  if (meta_window_is_override_redirect (metaWindow) && priv->opacity == 0xff && !priv->argb32)
 | 
			
		||||
  if (!meta_window_is_override_redirect (metaWindow))
 | 
			
		||||
    return FALSE;
 | 
			
		||||
 | 
			
		||||
  if (priv->opacity != 0xff)
 | 
			
		||||
    return FALSE;
 | 
			
		||||
 | 
			
		||||
  if (priv->argb32)
 | 
			
		||||
    return FALSE;
 | 
			
		||||
 | 
			
		||||
  if (metaWindow->has_shape)
 | 
			
		||||
    return FALSE;
 | 
			
		||||
 | 
			
		||||
  meta_screen_get_size (screen, &screen_width, &screen_height);
 | 
			
		||||
  meta_window_get_outer_rect (metaWindow, &window_rect);
 | 
			
		||||
 | 
			
		||||
  if (window_rect.x == 0 && window_rect.y == 0 &&
 | 
			
		||||
      window_rect.width == screen_width && window_rect.height == screen_height)
 | 
			
		||||
    return TRUE;
 | 
			
		||||
 | 
			
		||||
  for (i = 0; i < num_monitors; i++)
 | 
			
		||||
    {
 | 
			
		||||
      int screen_width, screen_height;
 | 
			
		||||
      MetaRectangle window_rect;
 | 
			
		||||
      meta_screen_get_size (screen, &screen_width, &screen_height);
 | 
			
		||||
      meta_window_get_outer_rect (metaWindow, &window_rect);
 | 
			
		||||
 | 
			
		||||
      if (window_rect.x == 0 && window_rect.y == 0 &&
 | 
			
		||||
          window_rect.width == screen_width && window_rect.height == screen_height)
 | 
			
		||||
           return TRUE;
 | 
			
		||||
      else
 | 
			
		||||
        {
 | 
			
		||||
          int num_monitors = meta_screen_get_n_monitors (screen);
 | 
			
		||||
          int i;
 | 
			
		||||
          MetaRectangle monitor_rect;
 | 
			
		||||
 | 
			
		||||
          for (i = 0; i < num_monitors; i++)
 | 
			
		||||
            {
 | 
			
		||||
              meta_screen_get_monitor_geometry (screen , i, &monitor_rect);
 | 
			
		||||
              if (monitor_rect.x == window_rect.x && monitor_rect.y == window_rect.y &&
 | 
			
		||||
                  monitor_rect.width == window_rect.width && monitor_rect.height == window_rect.height)
 | 
			
		||||
                    return TRUE;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
      meta_screen_get_monitor_geometry (screen , i, &monitor_rect);
 | 
			
		||||
      if (monitor_rect.x == window_rect.x && monitor_rect.y == window_rect.y &&
 | 
			
		||||
          monitor_rect.width == window_rect.width && monitor_rect.height == window_rect.height)
 | 
			
		||||
        return TRUE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return FALSE;
 | 
			
		||||
@@ -1255,19 +1227,24 @@ void
 | 
			
		||||
meta_window_actor_set_redirected (MetaWindowActor *self, gboolean state)
 | 
			
		||||
{
 | 
			
		||||
  MetaWindow *metaWindow = meta_window_actor_get_meta_window (self);
 | 
			
		||||
  MetaDisplay *display = meta_window_get_display (metaWindow);
 | 
			
		||||
 | 
			
		||||
  Display *xdisplay = meta_display_get_xdisplay (meta_window_get_display (metaWindow));
 | 
			
		||||
  Display *xdisplay = meta_display_get_xdisplay (display);
 | 
			
		||||
  Window  xwin = meta_window_actor_get_x_window (self);
 | 
			
		||||
 | 
			
		||||
  if (state)
 | 
			
		||||
    {
 | 
			
		||||
      meta_error_trap_push (display);
 | 
			
		||||
      XCompositeRedirectWindow (xdisplay, xwin, CompositeRedirectManual);
 | 
			
		||||
      meta_window_actor_queue_create_pixmap (self);
 | 
			
		||||
      meta_error_trap_pop (display);
 | 
			
		||||
      meta_window_actor_detach (self);
 | 
			
		||||
      self->priv->unredirected = FALSE;
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      meta_error_trap_push (display);
 | 
			
		||||
      XCompositeUnredirectWindow (xdisplay, xwin, CompositeRedirectManual);
 | 
			
		||||
      meta_error_trap_pop (display);
 | 
			
		||||
      self->priv->unredirected = TRUE;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1613,24 +1590,16 @@ meta_window_actor_update_bounding_region_and_borders (MetaWindowActor *self,
 | 
			
		||||
                                                      int              height)
 | 
			
		||||
{
 | 
			
		||||
  MetaWindowActorPrivate *priv = self->priv;
 | 
			
		||||
  MetaFrame *frame;
 | 
			
		||||
  MetaFrameBorders borders;
 | 
			
		||||
  cairo_rectangle_int_t bounding_rectangle;
 | 
			
		||||
 | 
			
		||||
  bounding_rectangle.x = 0;
 | 
			
		||||
  bounding_rectangle.y = 0;
 | 
			
		||||
  meta_frame_calc_borders (priv->window->frame, &borders);
 | 
			
		||||
 | 
			
		||||
  frame = priv->window->frame;
 | 
			
		||||
  if (frame != NULL)
 | 
			
		||||
    {
 | 
			
		||||
      meta_frame_calc_borders (frame, &borders);
 | 
			
		||||
  bounding_rectangle.x = borders.invisible.left;
 | 
			
		||||
  bounding_rectangle.y = borders.invisible.top;
 | 
			
		||||
 | 
			
		||||
      bounding_rectangle.x = borders.invisible.left;
 | 
			
		||||
      bounding_rectangle.y = borders.invisible.top;
 | 
			
		||||
 | 
			
		||||
      width -= borders.invisible.left + borders.invisible.right;
 | 
			
		||||
      height -= borders.invisible.top + borders.invisible.bottom;
 | 
			
		||||
    }
 | 
			
		||||
  width -= borders.invisible.left + borders.invisible.right;
 | 
			
		||||
  height -= borders.invisible.top + borders.invisible.bottom;
 | 
			
		||||
 | 
			
		||||
  bounding_rectangle.width = width;
 | 
			
		||||
  bounding_rectangle.height = height;
 | 
			
		||||
@@ -1720,7 +1689,7 @@ meta_window_actor_get_obscured_region (MetaWindowActor *self)
 | 
			
		||||
#if 0
 | 
			
		||||
/* Print out a region; useful for debugging */
 | 
			
		||||
static void
 | 
			
		||||
dump_region (cairo_region_t *region)
 | 
			
		||||
print_region (cairo_region_t *region)
 | 
			
		||||
{
 | 
			
		||||
  int n_rects;
 | 
			
		||||
  int i;
 | 
			
		||||
@@ -1738,6 +1707,26 @@ dump_region (cairo_region_t *region)
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if 0
 | 
			
		||||
/* Dump a region to a PNG file; useful for debugging */
 | 
			
		||||
static void
 | 
			
		||||
see_region (cairo_region_t *region,
 | 
			
		||||
            int             width,
 | 
			
		||||
            int             height,
 | 
			
		||||
            char           *filename)
 | 
			
		||||
{
 | 
			
		||||
  cairo_surface_t *surface = cairo_image_surface_create (CAIRO_FORMAT_A8, width, height);
 | 
			
		||||
  cairo_t *cr = cairo_create (surface);
 | 
			
		||||
 | 
			
		||||
  gdk_cairo_region (cr, region);
 | 
			
		||||
  cairo_fill (cr);
 | 
			
		||||
 | 
			
		||||
  cairo_surface_write_to_png (surface, filename);
 | 
			
		||||
  cairo_destroy (cr);
 | 
			
		||||
  cairo_surface_destroy (surface);
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * meta_window_actor_set_visible_region:
 | 
			
		||||
 * @self: a #MetaWindowActor
 | 
			
		||||
@@ -1753,22 +1742,9 @@ meta_window_actor_set_visible_region (MetaWindowActor *self,
 | 
			
		||||
                                      cairo_region_t  *visible_region)
 | 
			
		||||
{
 | 
			
		||||
  MetaWindowActorPrivate *priv = self->priv;
 | 
			
		||||
  cairo_region_t *texture_clip_region = NULL;
 | 
			
		||||
 | 
			
		||||
  /* Get the area of the window texture that would be drawn if
 | 
			
		||||
   * we weren't obscured at all
 | 
			
		||||
   */
 | 
			
		||||
  texture_clip_region = meta_shaped_texture_get_visible_pixels_region (META_SHAPED_TEXTURE (priv->actor));
 | 
			
		||||
  texture_clip_region = cairo_region_copy (texture_clip_region);
 | 
			
		||||
 | 
			
		||||
  /* Then intersect that with the visible region to get the region
 | 
			
		||||
   * that we actually need to redraw.
 | 
			
		||||
   */
 | 
			
		||||
  cairo_region_intersect (texture_clip_region, visible_region);
 | 
			
		||||
 | 
			
		||||
  /* Assumes ownership */
 | 
			
		||||
  meta_shaped_texture_set_clip_region (META_SHAPED_TEXTURE (priv->actor),
 | 
			
		||||
                                       texture_clip_region);
 | 
			
		||||
                                       visible_region);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -1820,19 +1796,6 @@ meta_window_actor_reset_visible_regions (MetaWindowActor *self)
 | 
			
		||||
  meta_window_actor_clear_shadow_clip (self);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
texture_pixmap_using_extension (ClutterX11TexturePixmap *texture)
 | 
			
		||||
{
 | 
			
		||||
  ClutterTexture *self = CLUTTER_TEXTURE (texture);
 | 
			
		||||
  CoglHandle handle;
 | 
			
		||||
 | 
			
		||||
  handle = clutter_texture_get_cogl_texture (self);
 | 
			
		||||
 | 
			
		||||
  return handle != NULL &&
 | 
			
		||||
         cogl_is_texture_pixmap_x11 (handle) &&
 | 
			
		||||
         cogl_texture_pixmap_x11_is_using_tfp_extension (handle);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
check_needs_pixmap (MetaWindowActor *self)
 | 
			
		||||
{
 | 
			
		||||
@@ -1866,7 +1829,7 @@ check_needs_pixmap (MetaWindowActor *self)
 | 
			
		||||
 | 
			
		||||
  if (priv->back_pixmap == None)
 | 
			
		||||
    {
 | 
			
		||||
      gint pxm_width, pxm_height;
 | 
			
		||||
      CoglHandle texture;
 | 
			
		||||
 | 
			
		||||
      meta_error_trap_push (display);
 | 
			
		||||
 | 
			
		||||
@@ -1895,23 +1858,22 @@ check_needs_pixmap (MetaWindowActor *self)
 | 
			
		||||
        meta_shaped_texture_set_create_mipmaps (META_SHAPED_TEXTURE (priv->actor),
 | 
			
		||||
                                                FALSE);
 | 
			
		||||
 | 
			
		||||
      clutter_x11_texture_pixmap_set_pixmap
 | 
			
		||||
                       (CLUTTER_X11_TEXTURE_PIXMAP (priv->actor),
 | 
			
		||||
                        priv->back_pixmap);
 | 
			
		||||
      meta_shaped_texture_set_pixmap (META_SHAPED_TEXTURE (priv->actor),
 | 
			
		||||
                                      priv->back_pixmap);
 | 
			
		||||
 | 
			
		||||
      texture = meta_shaped_texture_get_texture (META_SHAPED_TEXTURE (priv->actor));
 | 
			
		||||
 | 
			
		||||
      /*
 | 
			
		||||
       * This only works *after* actually setting the pixmap, so we have to
 | 
			
		||||
       * do it here.
 | 
			
		||||
       * See: http://bugzilla.clutter-project.org/show_bug.cgi?id=2236
 | 
			
		||||
       */
 | 
			
		||||
      if (G_UNLIKELY (!texture_pixmap_using_extension (CLUTTER_X11_TEXTURE_PIXMAP (priv->actor))))
 | 
			
		||||
      if (G_UNLIKELY (!cogl_texture_pixmap_x11_is_using_tfp_extension (texture)))
 | 
			
		||||
        g_warning ("NOTE: Not using GLX TFP!\n");
 | 
			
		||||
 | 
			
		||||
      g_object_get (priv->actor,
 | 
			
		||||
                    "pixmap-width", &pxm_width,
 | 
			
		||||
                    "pixmap-height", &pxm_height,
 | 
			
		||||
                    NULL);
 | 
			
		||||
 | 
			
		||||
      meta_window_actor_update_bounding_region_and_borders (self, pxm_width, pxm_height);
 | 
			
		||||
      meta_window_actor_update_bounding_region_and_borders (self,
 | 
			
		||||
                                                            cogl_texture_get_width (texture),
 | 
			
		||||
                                                            cogl_texture_get_height (texture));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  priv->needs_pixmap = FALSE;
 | 
			
		||||
@@ -2004,7 +1966,6 @@ meta_window_actor_process_damage (MetaWindowActor    *self,
 | 
			
		||||
                                  XDamageNotifyEvent *event)
 | 
			
		||||
{
 | 
			
		||||
  MetaWindowActorPrivate *priv = self->priv;
 | 
			
		||||
  ClutterX11TexturePixmap *texture_x11 = CLUTTER_X11_TEXTURE_PIXMAP (priv->actor);
 | 
			
		||||
 | 
			
		||||
  priv->received_damage = TRUE;
 | 
			
		||||
 | 
			
		||||
@@ -2035,11 +1996,11 @@ meta_window_actor_process_damage (MetaWindowActor    *self,
 | 
			
		||||
  if (!priv->mapped || priv->needs_pixmap)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  clutter_x11_texture_pixmap_update_area (texture_x11,
 | 
			
		||||
                                          event->area.x,
 | 
			
		||||
                                          event->area.y,
 | 
			
		||||
                                          event->area.width,
 | 
			
		||||
                                          event->area.height);
 | 
			
		||||
  meta_shaped_texture_update_area (META_SHAPED_TEXTURE (priv->actor),
 | 
			
		||||
                                   event->area.x,
 | 
			
		||||
                                   event->area.y,
 | 
			
		||||
                                   event->area.width,
 | 
			
		||||
                                   event->area.height);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
@@ -2056,121 +2017,197 @@ meta_window_actor_sync_visibility (MetaWindowActor *self)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void
 | 
			
		||||
set_integral_bounding_rect (cairo_rectangle_int_t *rect,
 | 
			
		||||
                            double x, double y,
 | 
			
		||||
                            double width, double height)
 | 
			
		||||
{
 | 
			
		||||
  rect->x = floor(x);
 | 
			
		||||
  rect->y = floor(y);
 | 
			
		||||
  rect->width = ceil(x + width) - rect->x;
 | 
			
		||||
  rect->height = ceil(y + height) - rect->y;
 | 
			
		||||
}
 | 
			
		||||
#define TAU (2*M_PI)
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
update_corners (MetaWindowActor   *self,
 | 
			
		||||
                MetaFrameBorders  *borders)
 | 
			
		||||
install_corners (MetaWindow       *window,
 | 
			
		||||
                 MetaFrameBorders *borders,
 | 
			
		||||
                 cairo_t          *cr)
 | 
			
		||||
{
 | 
			
		||||
  MetaWindowActorPrivate *priv = self->priv;
 | 
			
		||||
  MetaRectangle outer;
 | 
			
		||||
  cairo_rectangle_int_t corner_rects[4];
 | 
			
		||||
  cairo_region_t *corner_region;
 | 
			
		||||
  cairo_path_t *corner_path;
 | 
			
		||||
  float top_left, top_right, bottom_left, bottom_right;
 | 
			
		||||
  float x, y;
 | 
			
		||||
  int x, y;
 | 
			
		||||
  MetaRectangle outer;
 | 
			
		||||
 | 
			
		||||
  /* need these to build a path */
 | 
			
		||||
  cairo_t *cr;
 | 
			
		||||
  cairo_surface_t *surface;
 | 
			
		||||
 | 
			
		||||
  if (!priv->window->frame)
 | 
			
		||||
    {
 | 
			
		||||
      meta_shaped_texture_set_overlay_path (META_SHAPED_TEXTURE (priv->actor),
 | 
			
		||||
                                            NULL, NULL);
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  meta_window_get_outer_rect (priv->window, &outer);
 | 
			
		||||
 | 
			
		||||
  meta_frame_get_corner_radiuses (priv->window->frame,
 | 
			
		||||
  meta_frame_get_corner_radiuses (window->frame,
 | 
			
		||||
                                  &top_left,
 | 
			
		||||
                                  &top_right,
 | 
			
		||||
                                  &bottom_left,
 | 
			
		||||
                                  &bottom_right);
 | 
			
		||||
 | 
			
		||||
  /* Unfortunately, cairo does not allow us to create a context
 | 
			
		||||
   * without a surface. Create a 0x0 image surface to "paint to"
 | 
			
		||||
   * so we can get the path. */
 | 
			
		||||
  surface = cairo_image_surface_create (CAIRO_FORMAT_A8,
 | 
			
		||||
                                        0, 0);
 | 
			
		||||
 | 
			
		||||
  cr = cairo_create (surface);
 | 
			
		||||
  meta_window_get_outer_rect (window, &outer);
 | 
			
		||||
 | 
			
		||||
  /* top left */
 | 
			
		||||
  x = borders->invisible.left;
 | 
			
		||||
  y = borders->invisible.top;
 | 
			
		||||
 | 
			
		||||
  set_integral_bounding_rect (&corner_rects[0],
 | 
			
		||||
                              x, y, top_left, top_left);
 | 
			
		||||
 | 
			
		||||
  cairo_arc (cr,
 | 
			
		||||
             x + top_left,
 | 
			
		||||
             y + top_left,
 | 
			
		||||
             top_left,
 | 
			
		||||
             0, M_PI*2);
 | 
			
		||||
 | 
			
		||||
             2 * TAU / 4,
 | 
			
		||||
             3 * TAU / 4);
 | 
			
		||||
 | 
			
		||||
  /* top right */
 | 
			
		||||
  x = borders->invisible.left + outer.width - top_right;
 | 
			
		||||
  y = borders->invisible.top;
 | 
			
		||||
 | 
			
		||||
  set_integral_bounding_rect (&corner_rects[1],
 | 
			
		||||
                              x, y, top_right, top_right);
 | 
			
		||||
 | 
			
		||||
  cairo_arc (cr,
 | 
			
		||||
             x,
 | 
			
		||||
             y + top_right,
 | 
			
		||||
             top_right,
 | 
			
		||||
             0, M_PI*2);
 | 
			
		||||
             3 * TAU / 4,
 | 
			
		||||
             4 * TAU / 4);
 | 
			
		||||
 | 
			
		||||
  /* bottom right */
 | 
			
		||||
  x = borders->invisible.left + outer.width - bottom_right;
 | 
			
		||||
  y = borders->invisible.top + outer.height - bottom_right;
 | 
			
		||||
 | 
			
		||||
  set_integral_bounding_rect (&corner_rects[2],
 | 
			
		||||
                              x, y, bottom_right, bottom_right);
 | 
			
		||||
 | 
			
		||||
  cairo_arc (cr,
 | 
			
		||||
             x,
 | 
			
		||||
             y,
 | 
			
		||||
             bottom_right,
 | 
			
		||||
             0, M_PI*2);
 | 
			
		||||
             0 * TAU / 4,
 | 
			
		||||
             1 * TAU / 4);
 | 
			
		||||
 | 
			
		||||
  /* bottom left */
 | 
			
		||||
  x = borders->invisible.left;
 | 
			
		||||
  y = borders->invisible.top + outer.height - bottom_left;
 | 
			
		||||
 | 
			
		||||
  set_integral_bounding_rect (&corner_rects[3],
 | 
			
		||||
                              x, y, bottom_left, bottom_left);
 | 
			
		||||
 | 
			
		||||
  cairo_arc (cr,
 | 
			
		||||
             x + bottom_left,
 | 
			
		||||
             y,
 | 
			
		||||
             bottom_left,
 | 
			
		||||
             0, M_PI*2);
 | 
			
		||||
             1 * TAU / 4,
 | 
			
		||||
             2 * TAU / 4);
 | 
			
		||||
 | 
			
		||||
  corner_path = cairo_copy_path (cr);
 | 
			
		||||
  cairo_set_source_rgba (cr, 1, 1, 1, 1);
 | 
			
		||||
  cairo_fill (cr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static cairo_region_t *
 | 
			
		||||
scan_visible_region (guchar         *mask_data,
 | 
			
		||||
                     int             stride,
 | 
			
		||||
                     cairo_region_t *scan_area)
 | 
			
		||||
{
 | 
			
		||||
  int i, n_rects = cairo_region_num_rectangles (scan_area);
 | 
			
		||||
  MetaRegionBuilder builder;
 | 
			
		||||
 | 
			
		||||
  meta_region_builder_init (&builder);
 | 
			
		||||
 | 
			
		||||
  for (i = 0; i < n_rects; i++)
 | 
			
		||||
    {
 | 
			
		||||
      int x, y;
 | 
			
		||||
      cairo_rectangle_int_t rect;
 | 
			
		||||
 | 
			
		||||
      cairo_region_get_rectangle (scan_area, i, &rect);
 | 
			
		||||
 | 
			
		||||
      for (y = rect.y; y < (rect.y + rect.height); y++)
 | 
			
		||||
        {
 | 
			
		||||
          for (x = rect.x; x < (rect.x + rect.width); x++)
 | 
			
		||||
            {
 | 
			
		||||
              int w = x;
 | 
			
		||||
              while (mask_data[y * stride + w] == 255 && w < (rect.x + rect.width))
 | 
			
		||||
                w++;
 | 
			
		||||
 | 
			
		||||
              if (w > 0)
 | 
			
		||||
                {
 | 
			
		||||
                  meta_region_builder_add_rectangle (&builder, x, y, w - x, 1);
 | 
			
		||||
                  x = w;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return meta_region_builder_finish (&builder);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
build_and_scan_frame_mask (MetaWindowActor       *self,
 | 
			
		||||
                           MetaFrameBorders      *borders,
 | 
			
		||||
                           cairo_rectangle_int_t *client_area,
 | 
			
		||||
                           cairo_region_t        *shape_region)
 | 
			
		||||
{
 | 
			
		||||
  MetaWindowActorPrivate *priv = self->priv;
 | 
			
		||||
  guchar *mask_data;
 | 
			
		||||
  guint tex_width, tex_height;
 | 
			
		||||
  CoglHandle paint_tex, mask_texture;
 | 
			
		||||
  int stride;
 | 
			
		||||
  cairo_t *cr;
 | 
			
		||||
  cairo_surface_t *surface;
 | 
			
		||||
 | 
			
		||||
  paint_tex = meta_shaped_texture_get_texture (META_SHAPED_TEXTURE (priv->actor));
 | 
			
		||||
  if (paint_tex == COGL_INVALID_HANDLE)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  tex_width = cogl_texture_get_width (paint_tex);
 | 
			
		||||
  tex_height = cogl_texture_get_height (paint_tex);
 | 
			
		||||
 | 
			
		||||
  stride = cairo_format_stride_for_width (CAIRO_FORMAT_A8, tex_width);
 | 
			
		||||
 | 
			
		||||
  /* Create data for an empty image */
 | 
			
		||||
  mask_data = g_malloc0 (stride * tex_height);
 | 
			
		||||
 | 
			
		||||
  surface = cairo_image_surface_create_for_data (mask_data,
 | 
			
		||||
                                                 CAIRO_FORMAT_A8,
 | 
			
		||||
                                                 tex_width,
 | 
			
		||||
                                                 tex_height,
 | 
			
		||||
                                                 stride);
 | 
			
		||||
  cr = cairo_create (surface);
 | 
			
		||||
 | 
			
		||||
  gdk_cairo_region (cr, shape_region);
 | 
			
		||||
  cairo_fill (cr);
 | 
			
		||||
 | 
			
		||||
  if (priv->window->frame != NULL)
 | 
			
		||||
    {
 | 
			
		||||
      cairo_region_t *frame_paint_region, *scanned_region;
 | 
			
		||||
      cairo_rectangle_int_t rect = { 0, 0, tex_width, tex_height };
 | 
			
		||||
 | 
			
		||||
      /* Make sure we don't paint the frame over the client window. */
 | 
			
		||||
      frame_paint_region = cairo_region_create_rectangle (&rect);
 | 
			
		||||
      cairo_region_subtract_rectangle (frame_paint_region, client_area);
 | 
			
		||||
 | 
			
		||||
      gdk_cairo_region (cr, frame_paint_region);
 | 
			
		||||
      cairo_clip (cr);
 | 
			
		||||
 | 
			
		||||
      install_corners (priv->window, borders, cr);
 | 
			
		||||
 | 
			
		||||
      cairo_surface_flush (surface);
 | 
			
		||||
      scanned_region = scan_visible_region (mask_data, stride, frame_paint_region);
 | 
			
		||||
      cairo_region_union (shape_region, scanned_region);
 | 
			
		||||
      cairo_region_destroy (scanned_region);
 | 
			
		||||
      cairo_region_destroy (frame_paint_region);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  cairo_surface_destroy (surface);
 | 
			
		||||
  cairo_destroy (cr);
 | 
			
		||||
  cairo_surface_destroy (surface);
 | 
			
		||||
 | 
			
		||||
  corner_region = cairo_region_create_rectangles (corner_rects, 4);
 | 
			
		||||
  if (meta_texture_rectangle_check (paint_tex))
 | 
			
		||||
    {
 | 
			
		||||
      mask_texture = meta_texture_rectangle_new (tex_width, tex_height,
 | 
			
		||||
                                                 COGL_PIXEL_FORMAT_A_8,
 | 
			
		||||
                                                 COGL_PIXEL_FORMAT_A_8,
 | 
			
		||||
                                                 stride,
 | 
			
		||||
                                                 mask_data,
 | 
			
		||||
                                                 NULL /* error */);
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      /* Note: we don't allow slicing for this texture because we
 | 
			
		||||
       * need to use it with multi-texturing which doesn't support
 | 
			
		||||
       * sliced textures */
 | 
			
		||||
      mask_texture = cogl_texture_new_from_data (tex_width, tex_height,
 | 
			
		||||
                                                 COGL_TEXTURE_NO_SLICING,
 | 
			
		||||
                                                 COGL_PIXEL_FORMAT_A_8,
 | 
			
		||||
                                                 COGL_PIXEL_FORMAT_ANY,
 | 
			
		||||
                                                 stride,
 | 
			
		||||
                                                 mask_data);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  meta_shaped_texture_set_overlay_path (META_SHAPED_TEXTURE (priv->actor),
 | 
			
		||||
                                        corner_region, corner_path);
 | 
			
		||||
 | 
			
		||||
  cairo_region_destroy (corner_region);
 | 
			
		||||
  meta_shaped_texture_set_mask_texture (META_SHAPED_TEXTURE (priv->actor),
 | 
			
		||||
                                        mask_texture);
 | 
			
		||||
  cogl_handle_unref (mask_texture);
 | 
			
		||||
 | 
			
		||||
  g_free (mask_data);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
@@ -2180,57 +2217,31 @@ check_needs_reshape (MetaWindowActor *self)
 | 
			
		||||
  MetaScreen *screen = priv->screen;
 | 
			
		||||
  MetaDisplay *display = meta_screen_get_display (screen);
 | 
			
		||||
  MetaFrameBorders borders;
 | 
			
		||||
  cairo_region_t *region;
 | 
			
		||||
  cairo_region_t *region = NULL;
 | 
			
		||||
  cairo_rectangle_int_t client_area;
 | 
			
		||||
  gboolean needs_mask;
 | 
			
		||||
 | 
			
		||||
  if (!priv->needs_reshape)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  meta_shaped_texture_set_shape_region (META_SHAPED_TEXTURE (priv->actor), NULL);
 | 
			
		||||
  meta_frame_calc_borders (priv->window->frame, &borders);
 | 
			
		||||
 | 
			
		||||
  client_area.x = borders.total.left;
 | 
			
		||||
  client_area.y = borders.total.top;
 | 
			
		||||
  client_area.width = priv->window->rect.width;
 | 
			
		||||
  client_area.height = priv->window->rect.height;
 | 
			
		||||
 | 
			
		||||
  meta_shaped_texture_set_mask_texture (META_SHAPED_TEXTURE (priv->actor), COGL_INVALID_HANDLE);
 | 
			
		||||
  meta_window_actor_clear_shape_region (self);
 | 
			
		||||
 | 
			
		||||
  if (priv->window->frame)
 | 
			
		||||
    meta_frame_calc_borders (priv->window->frame, &borders);
 | 
			
		||||
  else
 | 
			
		||||
    meta_frame_borders_clear (&borders);
 | 
			
		||||
 | 
			
		||||
  region = meta_window_get_frame_bounds (priv->window);
 | 
			
		||||
  if (region != NULL)
 | 
			
		||||
    {
 | 
			
		||||
      /* This returns the window's internal frame bounds region,
 | 
			
		||||
       * so we need to copy it because we modify it below. */
 | 
			
		||||
      region = cairo_region_copy (region);
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      /* If we have no region, we have no frame. We have no frame,
 | 
			
		||||
       * so just use the bounding region instead */
 | 
			
		||||
      region = cairo_region_copy (priv->bounding_region);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_SHAPE
 | 
			
		||||
  if (priv->window->has_shape)
 | 
			
		||||
    {
 | 
			
		||||
      /* Translate the set of XShape rectangles that we
 | 
			
		||||
       * get from the X server to a cairo_region. */
 | 
			
		||||
      Display *xdisplay = meta_display_get_xdisplay (display);
 | 
			
		||||
      XRectangle *rects;
 | 
			
		||||
      int n_rects, ordering;
 | 
			
		||||
      cairo_rectangle_int_t client_area;
 | 
			
		||||
 | 
			
		||||
      client_area.width = priv->window->rect.width;
 | 
			
		||||
      client_area.height = priv->window->rect.height;
 | 
			
		||||
 | 
			
		||||
      if (priv->window->frame)
 | 
			
		||||
        {
 | 
			
		||||
          client_area.x = borders.total.left;
 | 
			
		||||
          client_area.y = borders.total.top;
 | 
			
		||||
        }
 | 
			
		||||
      else
 | 
			
		||||
        {
 | 
			
		||||
          client_area.x = 0;
 | 
			
		||||
          client_area.y = 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      /* Punch out client area. */
 | 
			
		||||
      cairo_region_subtract_rectangle (region, &client_area);
 | 
			
		||||
 | 
			
		||||
      meta_error_trap_push (display);
 | 
			
		||||
      rects = XShapeGetRectangles (xdisplay,
 | 
			
		||||
@@ -2243,28 +2254,45 @@ check_needs_reshape (MetaWindowActor *self)
 | 
			
		||||
      if (rects)
 | 
			
		||||
        {
 | 
			
		||||
          int i;
 | 
			
		||||
          cairo_rectangle_int_t *cairo_rects = g_new (cairo_rectangle_int_t, n_rects);
 | 
			
		||||
 | 
			
		||||
          for (i = 0; i < n_rects; i ++)
 | 
			
		||||
            {
 | 
			
		||||
              cairo_rectangle_int_t rect = { rects[i].x + client_area.x,
 | 
			
		||||
                                             rects[i].y + client_area.y,
 | 
			
		||||
                                             rects[i].width,
 | 
			
		||||
                                             rects[i].height };
 | 
			
		||||
              cairo_region_union_rectangle (region, &rect);
 | 
			
		||||
              cairo_rects[i].x = rects[i].x + client_area.x;
 | 
			
		||||
              cairo_rects[i].y = rects[i].y + client_area.y;
 | 
			
		||||
              cairo_rects[i].width = rects[i].width;
 | 
			
		||||
              cairo_rects[i].height = rects[i].height;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
          XFree (rects);
 | 
			
		||||
          region = cairo_region_create_rectangles (cairo_rects, n_rects);
 | 
			
		||||
          g_free (cairo_rects);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  meta_shaped_texture_set_shape_region (META_SHAPED_TEXTURE (priv->actor),
 | 
			
		||||
                                        region);
 | 
			
		||||
  needs_mask = (region != NULL) || (priv->window->frame != NULL);
 | 
			
		||||
 | 
			
		||||
  if (region == NULL)
 | 
			
		||||
    {
 | 
			
		||||
      /* If we don't have a shape on the server, that means that
 | 
			
		||||
       * we have an implicit shape of one rectangle covering the
 | 
			
		||||
       * entire window. */
 | 
			
		||||
      region = cairo_region_create_rectangle (&client_area);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (needs_mask)
 | 
			
		||||
    {
 | 
			
		||||
      /* This takes the region, generates a mask using GTK+
 | 
			
		||||
       * and scans the mask looking for all opaque pixels,
 | 
			
		||||
       * adding it to region.
 | 
			
		||||
       */
 | 
			
		||||
      build_and_scan_frame_mask (self, &borders, &client_area, region);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  meta_window_actor_update_shape_region (self, region);
 | 
			
		||||
 | 
			
		||||
  cairo_region_destroy (region);
 | 
			
		||||
 | 
			
		||||
  update_corners (self, &borders);
 | 
			
		||||
 | 
			
		||||
  priv->needs_reshape = FALSE;
 | 
			
		||||
  meta_window_actor_invalidate_shadow (self);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -26,9 +26,28 @@ struct _MetaWindowGroup
 | 
			
		||||
 | 
			
		||||
G_DEFINE_TYPE (MetaWindowGroup, meta_window_group, CLUTTER_TYPE_GROUP);
 | 
			
		||||
 | 
			
		||||
/* We want to find out if the window is "close enough" to
 | 
			
		||||
 * 1:1 transform. We do that by converting the transformed coordinates
 | 
			
		||||
 * to 24.8 fixed-point before checking if they look right.
 | 
			
		||||
/* This file uses pixel-aligned region computation to determine what
 | 
			
		||||
 * can be clipped out. This only really works if everything is aligned
 | 
			
		||||
 * to the pixel grid - not scaled or rotated and at integer offsets.
 | 
			
		||||
 *
 | 
			
		||||
 * (This could be relaxed - if we turned off filtering for unscaled
 | 
			
		||||
 * windows then windows would be, by definition aligned to the pixel
 | 
			
		||||
 * grid. And for rectangular windows without a shape, the outline that
 | 
			
		||||
 * we draw for an unrotated window is always a rectangle because we
 | 
			
		||||
 * don't use antialasing for the window boundary - with or without
 | 
			
		||||
 * filtering, with or without a scale. But figuring out exactly
 | 
			
		||||
 * what pixels will be drawn by the graphics system in these cases
 | 
			
		||||
 * gets tricky, so we just go for the easiest part - no scale,
 | 
			
		||||
 * and at integer offsets.)
 | 
			
		||||
 *
 | 
			
		||||
 * The way we check for pixel-aligned is by looking at the
 | 
			
		||||
 * transformation into screen space of the allocation box of an actor
 | 
			
		||||
 * and and checking if the corners are "close enough" to integral
 | 
			
		||||
 * pixel values.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* The definition of "close enough" to integral pixel values is
 | 
			
		||||
 * equality when we convert to 24.8 fixed-point.
 | 
			
		||||
 */
 | 
			
		||||
static inline int
 | 
			
		||||
round_to_fixed (float x)
 | 
			
		||||
@@ -36,41 +55,24 @@ round_to_fixed (float x)
 | 
			
		||||
  return roundf (x * 256);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* We can only (easily) apply our logic for figuring out what a window
 | 
			
		||||
 * obscures if is not transformed. This function does that check and
 | 
			
		||||
 * as a side effect gets the position of the upper-left corner of the
 | 
			
		||||
 * actors.
 | 
			
		||||
 *
 | 
			
		||||
 * (We actually could handle scaled and non-integrally positioned actors
 | 
			
		||||
 * too as long as they weren't shaped - no filtering is done at the
 | 
			
		||||
 * edges so a rectangle stays a rectangle. But the gain from that is
 | 
			
		||||
 * small, especally since most of our windows are shaped. The simple
 | 
			
		||||
 * case we handle here is the case that matters when the user is just
 | 
			
		||||
 * using the desktop normally.)
 | 
			
		||||
 *
 | 
			
		||||
 * If we assume that the window group is untransformed (it better not
 | 
			
		||||
 * be!) then we could also make this determination by checking directly
 | 
			
		||||
 * if the actor itself is rotated, scaled, or at a non-integral position.
 | 
			
		||||
 * However, the criterion for "close enough" in that case get trickier,
 | 
			
		||||
 * since, for example, the allowed rotation depends on the size of
 | 
			
		||||
 * actor. The approach we take here is to just require everything
 | 
			
		||||
 * to be within 1/256th of a pixel.
 | 
			
		||||
/* This helper function checks if (according to our fixed point precision)
 | 
			
		||||
 * the vertices @verts form a box of width @widthf and height @heightf
 | 
			
		||||
 * located at integral coordinates. These coordinates are returned
 | 
			
		||||
 * in @x_origin and @y_origin.
 | 
			
		||||
 */
 | 
			
		||||
static gboolean
 | 
			
		||||
actor_is_untransformed (ClutterActor *actor,
 | 
			
		||||
                        int          *x_origin,
 | 
			
		||||
                        int          *y_origin)
 | 
			
		||||
vertices_are_untransformed (ClutterVertex *verts,
 | 
			
		||||
                            float          widthf,
 | 
			
		||||
                            float          heightf,
 | 
			
		||||
                            int           *x_origin,
 | 
			
		||||
                            int           *y_origin)
 | 
			
		||||
{
 | 
			
		||||
  gfloat widthf, heightf;
 | 
			
		||||
  int width, height;
 | 
			
		||||
  ClutterVertex verts[4];
 | 
			
		||||
  int v0x, v0y, v1x, v1y, v2x, v2y, v3x, v3y;
 | 
			
		||||
  int x, y;
 | 
			
		||||
 | 
			
		||||
  clutter_actor_get_size (actor, &widthf, &heightf);
 | 
			
		||||
  width = round_to_fixed (widthf); height = round_to_fixed (heightf);
 | 
			
		||||
 | 
			
		||||
  clutter_actor_get_abs_allocation_vertices (actor, verts);
 | 
			
		||||
  v0x = round_to_fixed (verts[0].x); v0y = round_to_fixed (verts[0].y);
 | 
			
		||||
  v1x = round_to_fixed (verts[1].x); v1y = round_to_fixed (verts[1].y);
 | 
			
		||||
  v2x = round_to_fixed (verts[2].x); v2y = round_to_fixed (verts[2].y);
 | 
			
		||||
@@ -101,42 +103,118 @@ actor_is_untransformed (ClutterActor *actor,
 | 
			
		||||
  return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if CLUTTER_CHECK_VERSION(1, 9, 0)
 | 
			
		||||
#define has_effects clutter_actor_has_effects
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
/* 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
 | 
			
		||||
has_effects(ClutterActor *actor)
 | 
			
		||||
actor_is_untransformed (ClutterActor *actor,
 | 
			
		||||
                        int          *x_origin,
 | 
			
		||||
                        int          *y_origin)
 | 
			
		||||
{
 | 
			
		||||
  GList *list;
 | 
			
		||||
  gboolean ret;
 | 
			
		||||
  gfloat widthf, heightf;
 | 
			
		||||
  ClutterVertex verts[4];
 | 
			
		||||
 | 
			
		||||
  list = clutter_actor_get_effects (actor);
 | 
			
		||||
  ret = list != NULL;
 | 
			
		||||
  g_list_free (list);
 | 
			
		||||
  clutter_actor_get_size (actor, &widthf, &heightf);
 | 
			
		||||
  clutter_actor_get_abs_allocation_vertices (actor, verts);
 | 
			
		||||
 | 
			
		||||
  return ret;
 | 
			
		||||
  return vertices_are_untransformed (verts, widthf, heightf, x_origin, y_origin);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
/* Help macros to scale from OpenGL <-1,1> coordinates system to
 | 
			
		||||
 * window coordinates ranging [0,window-size]. Borrowed from clutter-utils.c
 | 
			
		||||
 */
 | 
			
		||||
#define MTX_GL_SCALE_X(x,w,v1,v2) ((((((x) / (w)) + 1.0f) / 2.0f) * (v1)) + (v2))
 | 
			
		||||
#define MTX_GL_SCALE_Y(y,w,v1,v2) ((v1) - (((((y) / (w)) + 1.0f) / 2.0f) * (v1)) + (v2))
 | 
			
		||||
 | 
			
		||||
/* Check if we're painting the MetaWindowGroup "untransformed". This can
 | 
			
		||||
 * differ from the result of actor_is_untransformed(window_group) if we're
 | 
			
		||||
 * inside a clone paint. The integer translation, if any, is returned.
 | 
			
		||||
 */
 | 
			
		||||
static gboolean
 | 
			
		||||
painting_untransformed (MetaWindowGroup *window_group,
 | 
			
		||||
                        int             *x_origin,
 | 
			
		||||
                        int             *y_origin)
 | 
			
		||||
{
 | 
			
		||||
  CoglMatrix modelview, projection, modelview_projection;
 | 
			
		||||
  ClutterVertex vertices[4];
 | 
			
		||||
  int width, height;
 | 
			
		||||
  float viewport[4];
 | 
			
		||||
  int i;
 | 
			
		||||
 | 
			
		||||
  cogl_get_modelview_matrix (&modelview);
 | 
			
		||||
  cogl_get_projection_matrix (&projection);
 | 
			
		||||
 | 
			
		||||
  cogl_matrix_multiply (&modelview_projection,
 | 
			
		||||
                        &projection,
 | 
			
		||||
                        &modelview);
 | 
			
		||||
 | 
			
		||||
  meta_screen_get_size (window_group->screen, &width, &height);
 | 
			
		||||
 | 
			
		||||
  vertices[0].x = 0;
 | 
			
		||||
  vertices[0].y = 0;
 | 
			
		||||
  vertices[0].z = 0;
 | 
			
		||||
  vertices[1].x = width;
 | 
			
		||||
  vertices[1].y = 0;
 | 
			
		||||
  vertices[1].z = 0;
 | 
			
		||||
  vertices[2].x = 0;
 | 
			
		||||
  vertices[2].y = height;
 | 
			
		||||
  vertices[2].z = 0;
 | 
			
		||||
  vertices[3].x = width;
 | 
			
		||||
  vertices[3].y = height;
 | 
			
		||||
  vertices[3].z = 0;
 | 
			
		||||
 | 
			
		||||
  cogl_get_viewport (viewport);
 | 
			
		||||
 | 
			
		||||
  for (i = 0; i < 4; i++)
 | 
			
		||||
    {
 | 
			
		||||
      float w = 1;
 | 
			
		||||
      cogl_matrix_transform_point (&modelview_projection, &vertices[i].x, &vertices[i].y, &vertices[i].z, &w);
 | 
			
		||||
      vertices[i].x = MTX_GL_SCALE_X (vertices[i].x, w,
 | 
			
		||||
                                      viewport[2], viewport[0]);
 | 
			
		||||
      vertices[i].y = MTX_GL_SCALE_Y (vertices[i].y, w,
 | 
			
		||||
                                      viewport[3], viewport[1]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return vertices_are_untransformed (vertices, width, height, x_origin, y_origin);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
meta_window_group_paint (ClutterActor *actor)
 | 
			
		||||
{
 | 
			
		||||
  cairo_region_t *visible_region;
 | 
			
		||||
  cairo_region_t *unredirected_window_region = NULL;
 | 
			
		||||
  ClutterActor *stage;
 | 
			
		||||
  cairo_rectangle_int_t visible_rect, unredirected_rect;
 | 
			
		||||
  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);
 | 
			
		||||
  if (info->unredirected_window != NULL)
 | 
			
		||||
 | 
			
		||||
  /* Normally we expect an actor to be drawn at it's position on the screen.
 | 
			
		||||
   * However, if we're inside the paint of a ClutterClone, that won't be the
 | 
			
		||||
   * case and we need to compensate. We look at the position of the window
 | 
			
		||||
   * group under the current model-view matrix and the position of the actor.
 | 
			
		||||
   * If they are both simply integer translations, then we can compensate
 | 
			
		||||
   * easily, otherwise we give up.
 | 
			
		||||
   *
 | 
			
		||||
   * Possible cleanup: work entirely in paint space - we can compute the
 | 
			
		||||
   * combination of the model-view matrix with the local matrix for each child
 | 
			
		||||
   * actor and get a total transformation for that actor for how we are
 | 
			
		||||
   * painting currently, and never worry about how actors are positioned
 | 
			
		||||
   * on the stage.
 | 
			
		||||
   */
 | 
			
		||||
  if (!painting_untransformed (window_group, &paint_x_origin, &paint_y_origin) ||
 | 
			
		||||
      !actor_is_untransformed (actor, &actor_x_origin, &actor_y_origin))
 | 
			
		||||
    {
 | 
			
		||||
      meta_window_actor_get_shape_bounds (META_WINDOW_ACTOR (info->unredirected_window), &unredirected_rect);
 | 
			
		||||
      unredirected_window_region = cairo_region_create_rectangle (&unredirected_rect);
 | 
			
		||||
      CLUTTER_ACTOR_CLASS (meta_window_group_parent_class)->paint (actor);
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  paint_x_offset = paint_x_origin - actor_x_origin;
 | 
			
		||||
  paint_y_offset = paint_y_origin - actor_y_origin;
 | 
			
		||||
 | 
			
		||||
  /* We walk the list from top to bottom (opposite of painting order),
 | 
			
		||||
   * and subtract the opaque area of each window out of the visible
 | 
			
		||||
   * region that we pass to the windows below.
 | 
			
		||||
@@ -156,14 +234,23 @@ meta_window_group_paint (ClutterActor *actor)
 | 
			
		||||
 | 
			
		||||
  visible_region = cairo_region_create_rectangle (&visible_rect);
 | 
			
		||||
 | 
			
		||||
  if (unredirected_window_region)
 | 
			
		||||
    cairo_region_subtract (visible_region, unredirected_window_region);
 | 
			
		||||
  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);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  for (l = children; l; l = l->next)
 | 
			
		||||
    {
 | 
			
		||||
      if (!CLUTTER_ACTOR_IS_VISIBLE (l->data))
 | 
			
		||||
        continue;
 | 
			
		||||
 | 
			
		||||
      if (l->data == info->unredirected_window)
 | 
			
		||||
        continue;
 | 
			
		||||
 | 
			
		||||
      /* If an actor has effects applied, then that can change the area
 | 
			
		||||
       * it paints and the opacity, so we no longer can figure out what
 | 
			
		||||
       * portion of the actor is obscured and what portion of the screen
 | 
			
		||||
@@ -180,7 +267,7 @@ 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 (has_effects (l->data))
 | 
			
		||||
      if (clutter_actor_has_effects (l->data))
 | 
			
		||||
        continue;
 | 
			
		||||
 | 
			
		||||
      if (META_IS_WINDOW_ACTOR (l->data))
 | 
			
		||||
@@ -191,6 +278,9 @@ meta_window_group_paint (ClutterActor *actor)
 | 
			
		||||
          if (!actor_is_untransformed (CLUTTER_ACTOR (window_actor), &x, &y))
 | 
			
		||||
            continue;
 | 
			
		||||
 | 
			
		||||
          x += paint_x_offset;
 | 
			
		||||
          y += paint_y_offset;
 | 
			
		||||
 | 
			
		||||
          /* Temporarily move to the coordinate system of the actor */
 | 
			
		||||
          cairo_region_translate (visible_region, - x, - y);
 | 
			
		||||
 | 
			
		||||
@@ -209,15 +299,22 @@ meta_window_group_paint (ClutterActor *actor)
 | 
			
		||||
      else if (META_IS_BACKGROUND_ACTOR (l->data))
 | 
			
		||||
        {
 | 
			
		||||
          MetaBackgroundActor *background_actor = l->data;
 | 
			
		||||
          int x, y;
 | 
			
		||||
 | 
			
		||||
          if (!actor_is_untransformed (CLUTTER_ACTOR (background_actor), &x, &y))
 | 
			
		||||
            continue;
 | 
			
		||||
 | 
			
		||||
          x += paint_x_offset;
 | 
			
		||||
          y += paint_y_offset;
 | 
			
		||||
 | 
			
		||||
          cairo_region_translate (visible_region, - x, - y);
 | 
			
		||||
          meta_background_actor_set_visible_region (background_actor, visible_region);
 | 
			
		||||
          cairo_region_translate (visible_region, x, y);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  cairo_region_destroy (visible_region);
 | 
			
		||||
 | 
			
		||||
  if (unredirected_window_region)
 | 
			
		||||
    cairo_region_destroy (unredirected_window_region);
 | 
			
		||||
 | 
			
		||||
  CLUTTER_ACTOR_CLASS (meta_window_group_parent_class)->paint (actor);
 | 
			
		||||
 | 
			
		||||
  /* Now that we are done painting, unset the visible regions (they will
 | 
			
		||||
@@ -228,7 +325,6 @@ meta_window_group_paint (ClutterActor *actor)
 | 
			
		||||
      if (META_IS_WINDOW_ACTOR (l->data))
 | 
			
		||||
        {
 | 
			
		||||
          MetaWindowActor *window_actor = l->data;
 | 
			
		||||
          window_actor = l->data;
 | 
			
		||||
          meta_window_actor_reset_visible_regions (window_actor);
 | 
			
		||||
        }
 | 
			
		||||
      else if (META_IS_BACKGROUND_ACTOR (l->data))
 | 
			
		||||
 
 | 
			
		||||
@@ -16,3 +16,9 @@ pkglib_LTLIBRARIES = default.la
 | 
			
		||||
install-exec-hook:
 | 
			
		||||
	-rm $(DESTDIR)$(pkglibdir)/*.a
 | 
			
		||||
	-rm $(DESTDIR)$(pkglibdir)/*.la
 | 
			
		||||
 | 
			
		||||
# Since we removed the .la file, 'make uninstall' doesn't work properly,
 | 
			
		||||
# since it counts on libtool to remove the .la files, so just kill the
 | 
			
		||||
# .so file manually.
 | 
			
		||||
uninstall-local:
 | 
			
		||||
	-rm -f $(DESTDIR)$(pkglibdir)/default.so
 | 
			
		||||
 
 | 
			
		||||
@@ -112,8 +112,6 @@ struct _MetaDefaultPluginPrivate
 | 
			
		||||
  ClutterActor          *desktop2;
 | 
			
		||||
 | 
			
		||||
  MetaPluginInfo         info;
 | 
			
		||||
 | 
			
		||||
  gboolean               debug_mode : 1;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
@@ -182,34 +180,6 @@ meta_default_plugin_get_property (GObject    *object,
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
start (MetaPlugin *plugin)
 | 
			
		||||
{
 | 
			
		||||
  MetaDefaultPluginPrivate *priv   = META_DEFAULT_PLUGIN (plugin)->priv;
 | 
			
		||||
 | 
			
		||||
  guint destroy_timeout  = DESTROY_TIMEOUT;
 | 
			
		||||
  guint minimize_timeout = MINIMIZE_TIMEOUT;
 | 
			
		||||
  guint maximize_timeout = MAXIMIZE_TIMEOUT;
 | 
			
		||||
  guint map_timeout      = MAP_TIMEOUT;
 | 
			
		||||
  guint switch_timeout   = SWITCH_TIMEOUT;
 | 
			
		||||
 | 
			
		||||
  if (meta_plugin_debug_mode (plugin))
 | 
			
		||||
    {
 | 
			
		||||
      g_debug ("Plugin %s: Entering debug mode.", priv->info.name);
 | 
			
		||||
 | 
			
		||||
      priv->debug_mode = TRUE;
 | 
			
		||||
 | 
			
		||||
      /*
 | 
			
		||||
       * Double the effect duration to make them easier to observe.
 | 
			
		||||
       */
 | 
			
		||||
      destroy_timeout  *= 2;
 | 
			
		||||
      minimize_timeout *= 2;
 | 
			
		||||
      maximize_timeout *= 2;
 | 
			
		||||
      map_timeout      *= 2;
 | 
			
		||||
      switch_timeout   *= 2;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
meta_default_plugin_class_init (MetaDefaultPluginClass *klass)
 | 
			
		||||
{
 | 
			
		||||
@@ -221,7 +191,6 @@ meta_default_plugin_class_init (MetaDefaultPluginClass *klass)
 | 
			
		||||
  gobject_class->set_property    = meta_default_plugin_set_property;
 | 
			
		||||
  gobject_class->get_property    = meta_default_plugin_get_property;
 | 
			
		||||
 | 
			
		||||
  plugin_class->start            = start;
 | 
			
		||||
  plugin_class->map              = map;
 | 
			
		||||
  plugin_class->minimize         = minimize;
 | 
			
		||||
  plugin_class->maximize         = maximize;
 | 
			
		||||
@@ -284,7 +253,8 @@ on_switch_workspace_effect_complete (ClutterTimeline *timeline, gpointer data)
 | 
			
		||||
{
 | 
			
		||||
  MetaPlugin               *plugin  = META_PLUGIN (data);
 | 
			
		||||
  MetaDefaultPluginPrivate *priv = META_DEFAULT_PLUGIN (plugin)->priv;
 | 
			
		||||
  GList        *l     = meta_plugin_get_window_actors (plugin);
 | 
			
		||||
  MetaScreen *screen = meta_plugin_get_screen (plugin);
 | 
			
		||||
  GList *l = meta_get_window_actors (screen);
 | 
			
		||||
 | 
			
		||||
  while (l)
 | 
			
		||||
    {
 | 
			
		||||
@@ -317,6 +287,7 @@ switch_workspace (MetaPlugin *plugin,
 | 
			
		||||
                  gint from, gint to,
 | 
			
		||||
                  MetaMotionDirection direction)
 | 
			
		||||
{
 | 
			
		||||
  MetaScreen *screen;
 | 
			
		||||
  MetaDefaultPluginPrivate *priv = META_DEFAULT_PLUGIN (plugin)->priv;
 | 
			
		||||
  GList        *l;
 | 
			
		||||
  ClutterActor *workspace0  = clutter_group_new ();
 | 
			
		||||
@@ -325,11 +296,13 @@ switch_workspace (MetaPlugin *plugin,
 | 
			
		||||
  int           screen_width, screen_height;
 | 
			
		||||
  ClutterAnimation *animation;
 | 
			
		||||
 | 
			
		||||
  stage = meta_plugin_get_stage (plugin);
 | 
			
		||||
  screen = meta_plugin_get_screen (plugin);
 | 
			
		||||
  stage = meta_get_stage_for_screen (screen);
 | 
			
		||||
 | 
			
		||||
  meta_screen_get_size (screen,
 | 
			
		||||
                        &screen_width,
 | 
			
		||||
                        &screen_height);
 | 
			
		||||
 | 
			
		||||
  meta_plugin_query_screen_size (plugin,
 | 
			
		||||
					      &screen_width,
 | 
			
		||||
					      &screen_height);
 | 
			
		||||
  clutter_actor_set_anchor_point (workspace1,
 | 
			
		||||
                                  screen_width,
 | 
			
		||||
                                  screen_height);
 | 
			
		||||
@@ -348,7 +321,7 @@ switch_workspace (MetaPlugin *plugin,
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  l = g_list_last (meta_plugin_get_window_actors (plugin));
 | 
			
		||||
  l = g_list_last (meta_get_window_actors (screen));
 | 
			
		||||
 | 
			
		||||
  while (l)
 | 
			
		||||
    {
 | 
			
		||||
@@ -446,12 +419,19 @@ static void
 | 
			
		||||
minimize (MetaPlugin *plugin, MetaWindowActor *window_actor)
 | 
			
		||||
{
 | 
			
		||||
  MetaWindowType type;
 | 
			
		||||
  MetaRectangle icon_geometry;
 | 
			
		||||
  MetaWindow *meta_window = meta_window_actor_get_meta_window (window_actor);
 | 
			
		||||
  ClutterActor *actor  = CLUTTER_ACTOR (window_actor);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  type = meta_window_get_window_type (meta_window);
 | 
			
		||||
 | 
			
		||||
  if (!meta_window_get_icon_geometry(meta_window, &icon_geometry))
 | 
			
		||||
    {
 | 
			
		||||
      icon_geometry.x = 0;
 | 
			
		||||
      icon_geometry.y = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (type == META_WINDOW_NORMAL)
 | 
			
		||||
    {
 | 
			
		||||
      ClutterAnimation *animation;
 | 
			
		||||
@@ -468,6 +448,8 @@ minimize (MetaPlugin *plugin, MetaWindowActor *window_actor)
 | 
			
		||||
                                         MINIMIZE_TIMEOUT,
 | 
			
		||||
                                         "scale-x", 0.0,
 | 
			
		||||
                                         "scale-y", 0.0,
 | 
			
		||||
                                         "x", (double)icon_geometry.x,
 | 
			
		||||
                                         "y", (double)icon_geometry.y,
 | 
			
		||||
                                         NULL);
 | 
			
		||||
      apriv->tml_minimize = clutter_animation_get_timeline (animation);
 | 
			
		||||
      data->plugin = plugin;
 | 
			
		||||
 
 | 
			
		||||
@@ -43,34 +43,17 @@
 | 
			
		||||
/* Optimium performance seems to be with MAX_CHUNK_RECTANGLES=4; 8 is about 10% slower.
 | 
			
		||||
 * But using 8 may be more robust to systems with slow malloc(). */
 | 
			
		||||
#define MAX_CHUNK_RECTANGLES 8
 | 
			
		||||
#define MAX_LEVELS 16
 | 
			
		||||
 | 
			
		||||
typedef struct
 | 
			
		||||
{
 | 
			
		||||
  /* To merge regions in binary tree order, we need to keep track of
 | 
			
		||||
   * the regions that we've already merged together at different
 | 
			
		||||
   * levels of the tree. We fill in an array in the pattern:
 | 
			
		||||
   *
 | 
			
		||||
   * |a  |
 | 
			
		||||
   * |b  |a  |
 | 
			
		||||
   * |c  |   |ab |
 | 
			
		||||
   * |d  |c  |ab |
 | 
			
		||||
   * |e  |   |   |abcd|
 | 
			
		||||
   */
 | 
			
		||||
  cairo_region_t *levels[MAX_LEVELS];
 | 
			
		||||
  int n_levels;
 | 
			
		||||
} MetaRegionBuilder;
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
void
 | 
			
		||||
meta_region_builder_init (MetaRegionBuilder *builder)
 | 
			
		||||
{
 | 
			
		||||
  int i;
 | 
			
		||||
  for (i = 0; i < MAX_LEVELS; i++)
 | 
			
		||||
  for (i = 0; i < META_REGION_BUILDER_MAX_LEVELS; i++)
 | 
			
		||||
    builder->levels[i] = NULL;
 | 
			
		||||
  builder->n_levels = 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
void
 | 
			
		||||
meta_region_builder_add_rectangle (MetaRegionBuilder *builder,
 | 
			
		||||
                                   int                x,
 | 
			
		||||
                                   int                y,
 | 
			
		||||
@@ -95,7 +78,7 @@ meta_region_builder_add_rectangle (MetaRegionBuilder *builder,
 | 
			
		||||
        {
 | 
			
		||||
          if (builder->levels[i] == NULL)
 | 
			
		||||
            {
 | 
			
		||||
              if (i < MAX_LEVELS)
 | 
			
		||||
              if (i < META_REGION_BUILDER_MAX_LEVELS)
 | 
			
		||||
                {
 | 
			
		||||
                  builder->levels[i] = builder->levels[i - 1];
 | 
			
		||||
                  builder->levels[i - 1] = NULL;
 | 
			
		||||
@@ -115,7 +98,7 @@ meta_region_builder_add_rectangle (MetaRegionBuilder *builder,
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static cairo_region_t *
 | 
			
		||||
cairo_region_t *
 | 
			
		||||
meta_region_builder_finish (MetaRegionBuilder *builder)
 | 
			
		||||
{
 | 
			
		||||
  cairo_region_t *result = NULL;
 | 
			
		||||
 
 | 
			
		||||
@@ -63,6 +63,32 @@ struct _MetaRegionIterator {
 | 
			
		||||
  cairo_rectangle_int_t next_rectangle;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
typedef struct _MetaRegionBuilder MetaRegionBuilder;
 | 
			
		||||
 | 
			
		||||
#define META_REGION_BUILDER_MAX_LEVELS 16
 | 
			
		||||
struct _MetaRegionBuilder {
 | 
			
		||||
  /* To merge regions in binary tree order, we need to keep track of
 | 
			
		||||
   * the regions that we've already merged together at different
 | 
			
		||||
   * levels of the tree. We fill in an array in the pattern:
 | 
			
		||||
   *
 | 
			
		||||
   * |a  |
 | 
			
		||||
   * |b  |a  |
 | 
			
		||||
   * |c  |   |ab |
 | 
			
		||||
   * |d  |c  |ab |
 | 
			
		||||
   * |e  |   |   |abcd|
 | 
			
		||||
   */
 | 
			
		||||
  cairo_region_t *levels[META_REGION_BUILDER_MAX_LEVELS];
 | 
			
		||||
  int n_levels;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void     meta_region_builder_init       (MetaRegionBuilder *builder);
 | 
			
		||||
void     meta_region_builder_add_rectangle (MetaRegionBuilder *builder,
 | 
			
		||||
                                            int                x,
 | 
			
		||||
                                            int                y,
 | 
			
		||||
                                            int                width,
 | 
			
		||||
                                            int                height);
 | 
			
		||||
cairo_region_t * meta_region_builder_finish (MetaRegionBuilder *builder);
 | 
			
		||||
 | 
			
		||||
void     meta_region_iterator_init      (MetaRegionIterator *iter,
 | 
			
		||||
                                         cairo_region_t     *region);
 | 
			
		||||
gboolean meta_region_iterator_at_end    (MetaRegionIterator *iter);
 | 
			
		||||
 
 | 
			
		||||
@@ -23,7 +23,8 @@
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \file bell.c Ring the bell or flash the screen
 | 
			
		||||
 * SECTION:Bell
 | 
			
		||||
 * @short_description: Ring the bell or flash the screen
 | 
			
		||||
 *
 | 
			
		||||
 * Sometimes, X programs "ring the bell", whatever that means. Mutter lets
 | 
			
		||||
 * the user configure the bell to be audible or visible (aka visual), and
 | 
			
		||||
@@ -57,6 +58,10 @@
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * bell_flash_screen:
 | 
			
		||||
 * @display:  The display which owns the screen (rather redundant)
 | 
			
		||||
 * @screen:   The screen to flash
 | 
			
		||||
 *
 | 
			
		||||
 * Flashes one entire screen.  This is done by making a window the size of the
 | 
			
		||||
 * whole screen (or reusing the old one, if it's still around), mapping it,
 | 
			
		||||
 * painting it white and then black, and then unmapping it. We set saveunder so
 | 
			
		||||
@@ -65,14 +70,12 @@
 | 
			
		||||
 * Unlike frame flashes, we don't do fullscreen flashes with a timeout; rather,
 | 
			
		||||
 * we do them in one go, because we don't have to rely on the theme code
 | 
			
		||||
 * redrawing the frame for us in order to do the flash.
 | 
			
		||||
 *
 | 
			
		||||
 * \param display  The display which owns the screen (rather redundant)
 | 
			
		||||
 * \param screen   The screen to flash
 | 
			
		||||
 *
 | 
			
		||||
 * \bug The way I read it, this appears not to do the flash
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 * Bug: The way I read it, this appears not to do the flash
 | 
			
		||||
 * the first time we flash a particular display. Am I wrong?
 | 
			
		||||
 *
 | 
			
		||||
 * \bug This appears to destroy our current XSync status.
 | 
			
		||||
 * Bug: This appears to destroy our current XSync status.
 | 
			
		||||
 */
 | 
			
		||||
static void
 | 
			
		||||
bell_flash_screen (MetaDisplay *display, 
 | 
			
		||||
@@ -137,14 +140,15 @@ bell_flash_screen (MetaDisplay *display,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * bell_flash_fullscreen:
 | 
			
		||||
 * @display: The display the event came in on
 | 
			
		||||
 * @xkb_ev: The bell event
 | 
			
		||||
 *
 | 
			
		||||
 * Flashes one screen, or all screens, in response to a bell event.
 | 
			
		||||
 * If the event is on a particular window, flash the screen that
 | 
			
		||||
 * window is on. Otherwise, flash every screen on this display.
 | 
			
		||||
 *
 | 
			
		||||
 * If the configure script found we had no XKB, this does not exist.
 | 
			
		||||
 *
 | 
			
		||||
 * \param display  The display the event came in on
 | 
			
		||||
 * \param xkb_ev   The bell event
 | 
			
		||||
 */
 | 
			
		||||
#ifdef HAVE_XKB
 | 
			
		||||
static void
 | 
			
		||||
@@ -182,17 +186,21 @@ bell_flash_fullscreen (MetaDisplay *display,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * bell_unflash_frame:
 | 
			
		||||
 * @data: The frame to unflash, cast to a gpointer so it can go into
 | 
			
		||||
 *        a callback function.
 | 
			
		||||
 *
 | 
			
		||||
 * Makes a frame be not flashed; this is the timeout half of
 | 
			
		||||
 * bell_flash_window_frame(). This is done simply by clearing the
 | 
			
		||||
 * flash flag and queuing a redraw of the frame.
 | 
			
		||||
 *
 | 
			
		||||
 * If the configure script found we had no XKB, this does not exist.
 | 
			
		||||
 *
 | 
			
		||||
 * \param data  The frame to unflash, cast to a gpointer so it can go into
 | 
			
		||||
 *              a callback function.
 | 
			
		||||
 * \return Always FALSE, so we don't get called again.
 | 
			
		||||
 *
 | 
			
		||||
 * \bug This is the parallel to bell_flash_window_frame(), so it should
 | 
			
		||||
 * Returns: Always FALSE, so we don't get called again.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Bug: This is the parallel to bell_flash_window_frame(), so it should
 | 
			
		||||
 * really be called meta_bell_unflash_window_frame().
 | 
			
		||||
 */
 | 
			
		||||
static gboolean 
 | 
			
		||||
@@ -205,6 +213,9 @@ bell_unflash_frame (gpointer data)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * bell_flash_window_frame:
 | 
			
		||||
 * @window: The window to flash
 | 
			
		||||
 *
 | 
			
		||||
 * Makes a frame flash and then return to normal shortly afterwards.
 | 
			
		||||
 * This is done by setting a flag so that the theme
 | 
			
		||||
 * code will temporarily draw the frame as focussed if it's unfocussed and
 | 
			
		||||
@@ -212,8 +223,6 @@ bell_unflash_frame (gpointer data)
 | 
			
		||||
 * that the flag can be unset and the frame re-redrawn.
 | 
			
		||||
 *
 | 
			
		||||
 * If the configure script found we had no XKB, this does not exist.
 | 
			
		||||
 *
 | 
			
		||||
 * \param window  The window to flash
 | 
			
		||||
 */
 | 
			
		||||
static void
 | 
			
		||||
bell_flash_window_frame (MetaWindow *window)
 | 
			
		||||
@@ -231,11 +240,12 @@ bell_flash_window_frame (MetaWindow *window)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * bell_flash_frame:
 | 
			
		||||
 * @display:  The display the bell event came in on
 | 
			
		||||
 * @xkb_ev:   The bell event we just received
 | 
			
		||||
 *
 | 
			
		||||
 * Flashes the frame of the focussed window. If there is no focussed window,
 | 
			
		||||
 * flashes the screen.
 | 
			
		||||
 *
 | 
			
		||||
 * \param display  The display the bell event came in on
 | 
			
		||||
 * \param xkb_ev   The bell event we just received
 | 
			
		||||
 */
 | 
			
		||||
static void
 | 
			
		||||
bell_flash_frame (MetaDisplay *display, 
 | 
			
		||||
@@ -261,15 +271,18 @@ bell_flash_frame (MetaDisplay *display,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * bell_visual_notify:
 | 
			
		||||
 * @display: The display the bell event came in on
 | 
			
		||||
 * @xkb_ev: The bell event we just received
 | 
			
		||||
 *
 | 
			
		||||
 * Gives the user some kind of visual bell substitute, in response to a
 | 
			
		||||
 * bell event. What this is depends on the "visual bell type" pref.
 | 
			
		||||
 *
 | 
			
		||||
 * If the configure script found we had no XKB, this does not exist.
 | 
			
		||||
 *
 | 
			
		||||
 * \param display  The display the bell event came in on
 | 
			
		||||
 * \param xkb_ev   The bell event we just received
 | 
			
		||||
 *
 | 
			
		||||
 * \bug This should be merged with meta_bell_notify().
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Bug: This should be merged with meta_bell_notify().
 | 
			
		||||
 */
 | 
			
		||||
static void
 | 
			
		||||
bell_visual_notify (MetaDisplay *display, 
 | 
			
		||||
@@ -407,12 +420,13 @@ meta_bell_shutdown (MetaDisplay *display)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * meta_bell_notify_frame_destroy:
 | 
			
		||||
 * @frame: The frame which is being destroyed
 | 
			
		||||
 *
 | 
			
		||||
 * Deals with a frame being destroyed. This is important because if we're
 | 
			
		||||
 * using a visual bell, we might be flashing the edges of the frame, and
 | 
			
		||||
 * so we'd have a timeout function waiting ready to un-flash them. If the
 | 
			
		||||
 * frame's going away, we can tell the timeout not to bother.
 | 
			
		||||
 *
 | 
			
		||||
 * \param frame  The frame which is being destroyed
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
meta_bell_notify_frame_destroy (MetaFrame *frame)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,17 +1,5 @@
 | 
			
		||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \file bell.h Ring the bell or flash the screen
 | 
			
		||||
 *
 | 
			
		||||
 * Sometimes, X programs "ring the bell", whatever that means. Mutter lets
 | 
			
		||||
 * the user configure the bell to be audible or visible (aka visual), and
 | 
			
		||||
 * if it's visual it can be configured to be frame-flash or fullscreen-flash.
 | 
			
		||||
 * We never get told about audible bells; X handles them just fine by itself.
 | 
			
		||||
 *
 | 
			
		||||
 * The visual bell was the result of a discussion in Bugzilla here:
 | 
			
		||||
 * <http://bugzilla.gnome.org/show_bug.cgi?id=99886>.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* 
 | 
			
		||||
 * Copyright (C) 2002 Sun Microsystems Inc.
 | 
			
		||||
 * 
 | 
			
		||||
 
 | 
			
		||||
@@ -625,7 +625,6 @@ meta_rectangle_get_minimal_spanning_set_for_region (
 | 
			
		||||
  *temp_rect = *basic_rect;
 | 
			
		||||
  ret = g_list_prepend (NULL, temp_rect);
 | 
			
		||||
 | 
			
		||||
  strut_iter = all_struts;
 | 
			
		||||
  for (strut_iter = all_struts; strut_iter; strut_iter = strut_iter->next)
 | 
			
		||||
    {
 | 
			
		||||
      GList *rect_iter; 
 | 
			
		||||
 
 | 
			
		||||
@@ -119,6 +119,7 @@ typedef struct
 | 
			
		||||
  MetaRectangle        orig;
 | 
			
		||||
  MetaRectangle        current;
 | 
			
		||||
  MetaFrameBorders    *borders;
 | 
			
		||||
  gboolean             must_free_borders;
 | 
			
		||||
  ActionType           action_type;
 | 
			
		||||
  gboolean             is_user_action;
 | 
			
		||||
 | 
			
		||||
@@ -337,7 +338,7 @@ meta_window_constrain (MetaWindow          *window,
 | 
			
		||||
   * not gobject-style--gobject would be more pain than it's worth) or
 | 
			
		||||
   * smart pointers would be so much nicer here.  *shrug*
 | 
			
		||||
   */
 | 
			
		||||
  if (!orig_borders)
 | 
			
		||||
  if (info.must_free_borders)
 | 
			
		||||
    g_free (info.borders);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -358,9 +359,15 @@ setup_constraint_info (ConstraintInfo      *info,
 | 
			
		||||
 | 
			
		||||
  /* Create a fake frame geometry if none really exists */
 | 
			
		||||
  if (orig_borders && !window->fullscreen)
 | 
			
		||||
    info->borders = orig_borders;
 | 
			
		||||
    {
 | 
			
		||||
      info->borders = orig_borders;
 | 
			
		||||
      info->must_free_borders = FALSE;
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    info->borders = g_new0 (MetaFrameBorders, 1);
 | 
			
		||||
    {
 | 
			
		||||
      info->borders = g_new0 (MetaFrameBorders, 1);
 | 
			
		||||
      info->must_free_borders = TRUE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (flags & META_IS_MOVE_ACTION && flags & META_IS_RESIZE_ACTION)
 | 
			
		||||
    info->action_type = ACTION_MOVE_AND_RESIZE;
 | 
			
		||||
@@ -439,9 +446,13 @@ setup_constraint_info (ConstraintInfo      *info,
 | 
			
		||||
                                         monitor_info->number);
 | 
			
		||||
 | 
			
		||||
  /* Workaround braindead legacy apps that don't know how to
 | 
			
		||||
   * fullscreen themselves properly.
 | 
			
		||||
   * fullscreen themselves properly - don't get fooled by
 | 
			
		||||
   * windows which hide their titlebar when maximized; that's
 | 
			
		||||
   * not the same as fullscreen, even if there are no struts
 | 
			
		||||
   * making the workarea smaller than the monitor.
 | 
			
		||||
   */
 | 
			
		||||
  if (meta_prefs_get_force_fullscreen() &&
 | 
			
		||||
      !window->hide_titlebar_when_maximized &&
 | 
			
		||||
      meta_rectangle_equal (new, &monitor_info->rect) &&
 | 
			
		||||
      window->has_fullscreen_func &&
 | 
			
		||||
      !window->fullscreen)
 | 
			
		||||
@@ -560,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,   
 | 
			
		||||
@@ -569,7 +585,7 @@ place_window_if_needed(MetaWindow     *window,
 | 
			
		||||
                 META_MAXIMIZE_VERTICAL : 0), &info->current);
 | 
			
		||||
 | 
			
		||||
          /* maximization may have changed frame geometry */
 | 
			
		||||
          if (window->frame && !window->fullscreen)
 | 
			
		||||
          if (!window->fullscreen)
 | 
			
		||||
            meta_frame_calc_borders (window->frame, info->borders);
 | 
			
		||||
 | 
			
		||||
          if (window->fullscreen_after_placement)
 | 
			
		||||
@@ -753,21 +769,12 @@ constrain_modal_dialog (MetaWindow         *window,
 | 
			
		||||
    return TRUE;
 | 
			
		||||
 | 
			
		||||
  x = parent->rect.x + (parent->rect.width / 2  - info->current.width / 2);
 | 
			
		||||
  y = 0;
 | 
			
		||||
  y = parent->rect.y + (parent->rect.height / 2 - info->current.height / 2);
 | 
			
		||||
  if (parent->frame)
 | 
			
		||||
    {
 | 
			
		||||
      MetaFrameBorders borders;
 | 
			
		||||
 | 
			
		||||
      x += parent->frame->rect.x;
 | 
			
		||||
      y += parent->frame->rect.y;
 | 
			
		||||
 | 
			
		||||
      meta_frame_calc_borders (parent->frame, &borders);
 | 
			
		||||
      y += borders.total.top;
 | 
			
		||||
 | 
			
		||||
      y += info->borders->visible.top;
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    y = parent->rect.y + info->borders->visible.top;
 | 
			
		||||
 | 
			
		||||
  constraint_already_satisfied = (x == info->current.x) && (y == info->current.y);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -108,13 +108,16 @@ delete_ping_timeout_func (MetaDisplay *display,
 | 
			
		||||
 | 
			
		||||
  /* Translators: %s is a window title */
 | 
			
		||||
  if (window_title)
 | 
			
		||||
    tmp = g_markup_printf_escaped (_("<tt>%s</tt> is not responding."),
 | 
			
		||||
                                   window_title);
 | 
			
		||||
    {
 | 
			
		||||
      char *title = g_strdup_printf ("“%s”", window_title);
 | 
			
		||||
      tmp = g_strdup_printf (_("%s is not responding."), title);
 | 
			
		||||
      g_free (title);
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    tmp = g_strdup (_("Application is not responding."));
 | 
			
		||||
 | 
			
		||||
  window_content = g_strdup_printf (
 | 
			
		||||
      "<big><b>%s</b></big>\n\n<i>%s</i>",
 | 
			
		||||
      "<big><b>%s</b></big>\n\n%s",
 | 
			
		||||
      tmp,
 | 
			
		||||
      _("You may choose to wait a short while for it to "
 | 
			
		||||
        "continue or force the application to quit entirely."));
 | 
			
		||||
@@ -123,7 +126,8 @@ delete_ping_timeout_func (MetaDisplay *display,
 | 
			
		||||
    meta_show_dialog ("--question",
 | 
			
		||||
                      window_content, NULL,
 | 
			
		||||
                      window->screen->screen_name,
 | 
			
		||||
                      _("_Wait"), _("_Force Quit"), window->xwindow,
 | 
			
		||||
                      _("_Wait"), _("_Force Quit"),
 | 
			
		||||
                      "face-sad-symbolic", window->xwindow,
 | 
			
		||||
                      NULL, NULL);
 | 
			
		||||
 | 
			
		||||
  g_free (window_content);
 | 
			
		||||
 
 | 
			
		||||
@@ -172,6 +172,9 @@ struct _MetaDisplay
 | 
			
		||||
  /* Pings which we're waiting for a reply from */
 | 
			
		||||
  GSList     *pending_pings;
 | 
			
		||||
 | 
			
		||||
  /* Pending focus change */
 | 
			
		||||
  guint       focus_timeout_id;
 | 
			
		||||
 | 
			
		||||
  /* Pending autoraise */
 | 
			
		||||
  guint       autoraise_timeout_id;
 | 
			
		||||
  MetaWindow* autoraise_window;
 | 
			
		||||
 
 | 
			
		||||
@@ -25,9 +25,10 @@
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \file display.c Handles operations on an X display.
 | 
			
		||||
 * SECTION:MetaDisplay
 | 
			
		||||
 * @short_description: Handles operations on an X display.
 | 
			
		||||
 *
 | 
			
		||||
 * The display is represented as a MetaDisplay struct.
 | 
			
		||||
 * The display is represented as a #MetaDisplay struct.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define _XOPEN_SOURCE 600 /* for gethostname() */
 | 
			
		||||
@@ -49,14 +50,11 @@
 | 
			
		||||
#include "workspace-private.h"
 | 
			
		||||
#include "bell.h"
 | 
			
		||||
#include <meta/compositor.h>
 | 
			
		||||
#include <meta/compositor-mutter.h>
 | 
			
		||||
#include <X11/Xatom.h>
 | 
			
		||||
#include <X11/cursorfont.h>
 | 
			
		||||
#ifdef HAVE_SOLARIS_XINERAMA
 | 
			
		||||
#include <X11/extensions/xinerama.h>
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef HAVE_XFREE_XINERAMA
 | 
			
		||||
#include <X11/extensions/Xinerama.h>
 | 
			
		||||
#endif
 | 
			
		||||
#include "mutter-enum-types.h"
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_RANDR
 | 
			
		||||
#include <X11/extensions/Xrandr.h>
 | 
			
		||||
#endif
 | 
			
		||||
@@ -76,6 +74,9 @@
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
 | 
			
		||||
/* This is set in stone and also hard-coded in GDK. */
 | 
			
		||||
#define VIRTUAL_CORE_KEYBOARD_ID 3
 | 
			
		||||
 | 
			
		||||
#define GRAB_OP_IS_WINDOW_SWITCH(g)                     \
 | 
			
		||||
        (g == META_GRAB_OP_KEYBOARD_TABBING_NORMAL  ||  \
 | 
			
		||||
         g == META_GRAB_OP_KEYBOARD_TABBING_DOCK    ||  \
 | 
			
		||||
@@ -85,7 +86,7 @@
 | 
			
		||||
         g == META_GRAB_OP_KEYBOARD_ESCAPING_GROUP)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \defgroup pings Pings
 | 
			
		||||
 * SECTION:pings
 | 
			
		||||
 *
 | 
			
		||||
 * Sometimes we want to see whether a window is responding,
 | 
			
		||||
 * so we send it a "ping" message and see whether it sends us back a "pong"
 | 
			
		||||
@@ -100,13 +101,13 @@
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * MetaPingData:
 | 
			
		||||
 *
 | 
			
		||||
 * Describes a ping on a window. When we send a ping to a window, we build
 | 
			
		||||
 * one of these structs, and it eventually gets passed to the timeout function
 | 
			
		||||
 * or to the function which handles the response from the window. If the window
 | 
			
		||||
 * does or doesn't respond to the ping, we use this information to deal with
 | 
			
		||||
 * these facts; we have a handler function for each.
 | 
			
		||||
 *
 | 
			
		||||
 * \ingroup pings
 | 
			
		||||
 */
 | 
			
		||||
typedef struct 
 | 
			
		||||
{
 | 
			
		||||
@@ -125,6 +126,15 @@ typedef struct
 | 
			
		||||
  Window xwindow;
 | 
			
		||||
} MetaAutoRaiseData;
 | 
			
		||||
 | 
			
		||||
typedef struct
 | 
			
		||||
{
 | 
			
		||||
  MetaDisplay *display;
 | 
			
		||||
  MetaWindow *window;
 | 
			
		||||
  int pointer_x;
 | 
			
		||||
  int pointer_y;
 | 
			
		||||
} MetaFocusData;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
G_DEFINE_TYPE(MetaDisplay, meta_display, G_TYPE_OBJECT);
 | 
			
		||||
 | 
			
		||||
/* Signals */
 | 
			
		||||
@@ -135,6 +145,8 @@ enum
 | 
			
		||||
  WINDOW_CREATED,
 | 
			
		||||
  WINDOW_DEMANDS_ATTENTION,
 | 
			
		||||
  WINDOW_MARKED_URGENT,
 | 
			
		||||
  GRAB_OP_BEGIN,
 | 
			
		||||
  GRAB_OP_END,
 | 
			
		||||
  LAST_SIGNAL
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -146,7 +158,7 @@ enum {
 | 
			
		||||
 | 
			
		||||
static guint display_signals [LAST_SIGNAL] = { 0 };
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
/*
 | 
			
		||||
 * The display we're managing.  This is a singleton object.  (Historically,
 | 
			
		||||
 * this was a list of displays, but there was never any way to add more
 | 
			
		||||
 * than one element to it.)  The goofy name is because we don't want it
 | 
			
		||||
@@ -154,6 +166,12 @@ static guint display_signals [LAST_SIGNAL] = { 0 };
 | 
			
		||||
 */
 | 
			
		||||
static MetaDisplay *the_display = NULL;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* By default, the GNOME keybindings capplet should include both the Mutter
 | 
			
		||||
 * and Metacity keybindings */
 | 
			
		||||
static const char *gnome_wm_keybindings = "Mutter,Metacity";
 | 
			
		||||
static const char *net_wm_name = "Mutter";
 | 
			
		||||
 | 
			
		||||
#ifdef WITH_VERBOSE_MODE
 | 
			
		||||
static void   meta_spew_event           (MetaDisplay    *display,
 | 
			
		||||
                                         XEvent         *event);
 | 
			
		||||
@@ -181,7 +199,7 @@ static void    prefs_changed_callback    (MetaPreference pref,
 | 
			
		||||
 | 
			
		||||
static void    sanity_check_timestamps   (MetaDisplay *display,
 | 
			
		||||
                                          guint32      known_good_timestamp);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
MetaGroup*     get_focussed_group (MetaDisplay *display);
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
@@ -230,8 +248,7 @@ meta_display_class_init (MetaDisplayClass *klass)
 | 
			
		||||
                  G_TYPE_FROM_CLASS (klass),
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  0,
 | 
			
		||||
                  NULL, NULL,
 | 
			
		||||
                  g_cclosure_marshal_VOID__VOID,
 | 
			
		||||
                  NULL, NULL, NULL,
 | 
			
		||||
                  G_TYPE_NONE, 0);
 | 
			
		||||
 | 
			
		||||
  display_signals[WINDOW_CREATED] =
 | 
			
		||||
@@ -239,8 +256,7 @@ meta_display_class_init (MetaDisplayClass *klass)
 | 
			
		||||
                  G_TYPE_FROM_CLASS (klass),
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  0,
 | 
			
		||||
                  NULL, NULL,
 | 
			
		||||
                  g_cclosure_marshal_VOID__OBJECT,
 | 
			
		||||
                  NULL, NULL, NULL,
 | 
			
		||||
                  G_TYPE_NONE, 1, META_TYPE_WINDOW);
 | 
			
		||||
 | 
			
		||||
  display_signals[WINDOW_DEMANDS_ATTENTION] =
 | 
			
		||||
@@ -248,8 +264,7 @@ meta_display_class_init (MetaDisplayClass *klass)
 | 
			
		||||
                  G_TYPE_FROM_CLASS (klass),
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  0,
 | 
			
		||||
                  NULL, NULL,
 | 
			
		||||
                  g_cclosure_marshal_VOID__OBJECT,
 | 
			
		||||
                  NULL, NULL, NULL,
 | 
			
		||||
                  G_TYPE_NONE, 1, META_TYPE_WINDOW);
 | 
			
		||||
 | 
			
		||||
  display_signals[WINDOW_MARKED_URGENT] =
 | 
			
		||||
@@ -257,11 +272,32 @@ meta_display_class_init (MetaDisplayClass *klass)
 | 
			
		||||
                  G_TYPE_FROM_CLASS (klass),
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  0,
 | 
			
		||||
                  NULL, NULL,
 | 
			
		||||
                  g_cclosure_marshal_VOID__OBJECT,
 | 
			
		||||
                  NULL, NULL, NULL,
 | 
			
		||||
                  G_TYPE_NONE, 1,
 | 
			
		||||
                  META_TYPE_WINDOW);
 | 
			
		||||
 | 
			
		||||
  display_signals[GRAB_OP_BEGIN] =
 | 
			
		||||
    g_signal_new ("grab-op-begin",
 | 
			
		||||
                  G_TYPE_FROM_CLASS (klass),
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  0,
 | 
			
		||||
                  NULL, NULL, NULL,
 | 
			
		||||
                  G_TYPE_NONE, 3,
 | 
			
		||||
                  META_TYPE_SCREEN,
 | 
			
		||||
                  META_TYPE_WINDOW,
 | 
			
		||||
                  META_TYPE_GRAB_OP);
 | 
			
		||||
 | 
			
		||||
  display_signals[GRAB_OP_END] =
 | 
			
		||||
    g_signal_new ("grab-op-end",
 | 
			
		||||
                  G_TYPE_FROM_CLASS (klass),
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  0,
 | 
			
		||||
                  NULL, NULL, NULL,
 | 
			
		||||
                  G_TYPE_NONE, 3,
 | 
			
		||||
                  META_TYPE_SCREEN,
 | 
			
		||||
                  META_TYPE_WINDOW,
 | 
			
		||||
                  META_TYPE_GRAB_OP);
 | 
			
		||||
 | 
			
		||||
  g_object_class_install_property (object_class,
 | 
			
		||||
                                   PROP_FOCUS_WINDOW,
 | 
			
		||||
                                   g_param_spec_object ("focus-window",
 | 
			
		||||
@@ -273,10 +309,10 @@ meta_display_class_init (MetaDisplayClass *klass)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Destructor for MetaPingData structs. Will destroy the
 | 
			
		||||
 * event source for the struct as well.
 | 
			
		||||
 * ping_data_free:
 | 
			
		||||
 *
 | 
			
		||||
 * \ingroup pings
 | 
			
		||||
 * Destructor for #MetaPingData structs. Will destroy the
 | 
			
		||||
 * event source for the struct as well.
 | 
			
		||||
 */
 | 
			
		||||
static void
 | 
			
		||||
ping_data_free (MetaPingData *ping_data)
 | 
			
		||||
@@ -289,14 +325,12 @@ ping_data_free (MetaPingData *ping_data)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * remove_pending_pings_for_window:
 | 
			
		||||
 * @display: The display the window appears on
 | 
			
		||||
 * @xwindow: The X ID of the window whose pings we should remove
 | 
			
		||||
 *
 | 
			
		||||
 * Frees every pending ping structure for the given X window on the
 | 
			
		||||
 * given display. This means that we also destroy the timeouts.
 | 
			
		||||
 *
 | 
			
		||||
 * \param display The display the window appears on
 | 
			
		||||
 * \param xwindow The X ID of the window whose pings we should remove
 | 
			
		||||
 *
 | 
			
		||||
 * \ingroup pings
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
static void
 | 
			
		||||
remove_pending_pings_for_window (MetaDisplay *display, Window xwindow)
 | 
			
		||||
@@ -395,20 +429,51 @@ meta_display_init (MetaDisplay *disp)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * meta_set_wm_name: (skip)
 | 
			
		||||
 * @wm_name: value for _NET_WM_NAME
 | 
			
		||||
 *
 | 
			
		||||
 * Set the value to use for the _NET_WM_NAME property. To take effect,
 | 
			
		||||
 * it is necessary to call this function before meta_init().
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
meta_set_wm_name (const char *wm_name)
 | 
			
		||||
{
 | 
			
		||||
  g_return_if_fail (the_display == NULL);
 | 
			
		||||
 | 
			
		||||
  net_wm_name = wm_name;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * meta_set_gnome_wm_keybindings: (skip)
 | 
			
		||||
 * @wm_keybindings: value for _GNOME_WM_KEYBINDINGS
 | 
			
		||||
 *
 | 
			
		||||
 * Set the value to use for the _GNOME_WM_KEYBINDINGS property. To take
 | 
			
		||||
 * effect, it is necessary to call this function before meta_init().
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
meta_set_gnome_wm_keybindings (const char *wm_keybindings)
 | 
			
		||||
{
 | 
			
		||||
  g_return_if_fail (the_display == NULL);
 | 
			
		||||
 | 
			
		||||
  gnome_wm_keybindings = wm_keybindings;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * meta_display_open:
 | 
			
		||||
 *
 | 
			
		||||
 * Opens a new display, sets it up, initialises all the X extensions
 | 
			
		||||
 * we will need, and adds it to the list of displays.
 | 
			
		||||
 *
 | 
			
		||||
 * \return True if the display was opened successfully, and False
 | 
			
		||||
 * Returns: %TRUE if the display was opened successfully, and %FALSE
 | 
			
		||||
 * otherwise-- that is, if the display doesn't exist or it already
 | 
			
		||||
 * has a window manager.
 | 
			
		||||
 *
 | 
			
		||||
 * \ingroup main
 | 
			
		||||
 */
 | 
			
		||||
gboolean
 | 
			
		||||
meta_display_open (void)
 | 
			
		||||
{
 | 
			
		||||
  Display *xdisplay;
 | 
			
		||||
  GSList *screens;
 | 
			
		||||
  MetaScreen *screen;
 | 
			
		||||
  GSList *tmp;
 | 
			
		||||
  int i;
 | 
			
		||||
  guint32 timestamp;
 | 
			
		||||
@@ -452,6 +517,8 @@ meta_display_open (void)
 | 
			
		||||
      buf[sizeof(buf)-1] = '\0';
 | 
			
		||||
      the_display->hostname = g_strdup (buf);
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    the_display->hostname = NULL;
 | 
			
		||||
  the_display->error_trap_synced_at_last_pop = TRUE;
 | 
			
		||||
  the_display->error_traps = 0;
 | 
			
		||||
  the_display->error_trap_handler = NULL;
 | 
			
		||||
@@ -745,14 +812,12 @@ meta_display_open (void)
 | 
			
		||||
    meta_prop_set_utf8_string_hint (the_display,
 | 
			
		||||
                                    the_display->leader_window,
 | 
			
		||||
                                    the_display->atom__NET_WM_NAME,
 | 
			
		||||
                                    "Mutter");
 | 
			
		||||
                                    net_wm_name);
 | 
			
		||||
 | 
			
		||||
    /* The GNOME keybindings capplet should include both the Mutter and Metacity
 | 
			
		||||
     * keybindings */
 | 
			
		||||
    meta_prop_set_utf8_string_hint (the_display,
 | 
			
		||||
                                    the_display->leader_window,
 | 
			
		||||
                                    the_display->atom__GNOME_WM_KEYBINDINGS,
 | 
			
		||||
                                    "Mutter,Metacity");
 | 
			
		||||
                                    gnome_wm_keybindings);
 | 
			
		||||
    
 | 
			
		||||
    meta_prop_set_utf8_string_hint (the_display,
 | 
			
		||||
                                    the_display->leader_window,
 | 
			
		||||
@@ -793,19 +858,18 @@ meta_display_open (void)
 | 
			
		||||
  the_display->last_user_time = timestamp;
 | 
			
		||||
  the_display->compositor = NULL;
 | 
			
		||||
  
 | 
			
		||||
  /* Mutter used to manage all X screens of the display in a single process, but
 | 
			
		||||
   * now it always manages exactly one screen as specified by the DISPLAY
 | 
			
		||||
   * environment variable. The screens GSList is left for simplicity.
 | 
			
		||||
   */
 | 
			
		||||
  screens = NULL;
 | 
			
		||||
  
 | 
			
		||||
  i = 0;
 | 
			
		||||
  while (i < ScreenCount (xdisplay))
 | 
			
		||||
    {
 | 
			
		||||
      MetaScreen *screen;
 | 
			
		||||
 | 
			
		||||
      screen = meta_screen_new (the_display, i, timestamp);
 | 
			
		||||
  i = meta_ui_get_screen_number ();
 | 
			
		||||
 | 
			
		||||
      if (screen)
 | 
			
		||||
        screens = g_slist_prepend (screens, screen);
 | 
			
		||||
      ++i;
 | 
			
		||||
    }
 | 
			
		||||
  screen = meta_screen_new (the_display, i, timestamp);
 | 
			
		||||
 | 
			
		||||
  if (screen)
 | 
			
		||||
    screens = g_slist_prepend (screens, screen);
 | 
			
		||||
  
 | 
			
		||||
  the_display->screens = screens;
 | 
			
		||||
  
 | 
			
		||||
@@ -988,6 +1052,10 @@ meta_display_close (MetaDisplay *display,
 | 
			
		||||
  
 | 
			
		||||
  meta_display_remove_autoraise_callback (display);
 | 
			
		||||
 | 
			
		||||
  if (display->focus_timeout_id);
 | 
			
		||||
    g_source_remove (display->focus_timeout_id);
 | 
			
		||||
  display->focus_timeout_id = 0;
 | 
			
		||||
 | 
			
		||||
  if (display->grab_old_window_stacking)
 | 
			
		||||
    g_list_free (display->grab_old_window_stacking);
 | 
			
		||||
  
 | 
			
		||||
@@ -1029,6 +1097,7 @@ meta_display_close (MetaDisplay *display,
 | 
			
		||||
  meta_display_free_window_prop_hooks (display);
 | 
			
		||||
  meta_display_free_group_prop_hooks (display);
 | 
			
		||||
  
 | 
			
		||||
  g_free (display->hostname);
 | 
			
		||||
  g_free (display->name);
 | 
			
		||||
 | 
			
		||||
  meta_display_shutdown_keys (display);
 | 
			
		||||
@@ -1146,14 +1215,16 @@ meta_display_ungrab (MetaDisplay *display)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Returns the singleton MetaDisplay if "xdisplay" matches the X display it's
 | 
			
		||||
 * managing; otherwise gives a warning and returns NULL.  When we were claiming
 | 
			
		||||
 * meta_display_for_x_display:
 | 
			
		||||
 * @xdisplay: An X display
 | 
			
		||||
 *
 | 
			
		||||
 * Returns the singleton MetaDisplay if @xdisplay matches the X display it's
 | 
			
		||||
 * managing; otherwise gives a warning and returns %NULL.  When we were claiming
 | 
			
		||||
 * to be able to manage multiple displays, this was supposed to find the
 | 
			
		||||
 * display out of the list which matched that display.  Now it's merely an
 | 
			
		||||
 * extra sanity check.
 | 
			
		||||
 *
 | 
			
		||||
 * \param xdisplay  An X display
 | 
			
		||||
 * \return  The singleton X display, or NULL if "xdisplay" isn't the one
 | 
			
		||||
 * Returns: The singleton X display, or %NULL if @xdisplay isn't the one
 | 
			
		||||
 *          we're managing.
 | 
			
		||||
 */
 | 
			
		||||
MetaDisplay*
 | 
			
		||||
@@ -1169,9 +1240,11 @@ meta_display_for_x_display (Display *xdisplay)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * meta_get_display:
 | 
			
		||||
 *
 | 
			
		||||
 * Accessor for the singleton MetaDisplay.
 | 
			
		||||
 *
 | 
			
		||||
 * \return  The only MetaDisplay there is.  This can be NULL, but only
 | 
			
		||||
 * Returns: The only #MetaDisplay there is.  This can be %NULL, but only
 | 
			
		||||
 *          during startup.
 | 
			
		||||
 */
 | 
			
		||||
MetaDisplay*
 | 
			
		||||
@@ -1384,6 +1457,19 @@ meta_display_get_current_time_roundtrip (MetaDisplay *display)
 | 
			
		||||
  return timestamp;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * meta_display_get_ignored_modifier_mask:
 | 
			
		||||
 * @display: a #MetaDisplay
 | 
			
		||||
 *
 | 
			
		||||
 * Returns: a mask of modifiers that should be ignored
 | 
			
		||||
 *          when matching keybindings to events
 | 
			
		||||
 */
 | 
			
		||||
unsigned int
 | 
			
		||||
meta_display_get_ignored_modifier_mask (MetaDisplay *display)
 | 
			
		||||
{
 | 
			
		||||
  return display->ignored_modifier_mask;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * meta_display_add_ignored_crossing_serial:
 | 
			
		||||
 * @display: a #MetaDisplay
 | 
			
		||||
@@ -1500,6 +1586,103 @@ window_raise_with_delay_callback (void *data)
 | 
			
		||||
  return FALSE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
meta_display_mouse_mode_focus (MetaDisplay *display,
 | 
			
		||||
                               MetaWindow  *window,
 | 
			
		||||
                               guint32      timestamp) {
 | 
			
		||||
  if (window->type != META_WINDOW_DESKTOP)
 | 
			
		||||
    {
 | 
			
		||||
      meta_topic (META_DEBUG_FOCUS,
 | 
			
		||||
                  "Focusing %s at time %u.\n", window->desc, timestamp);
 | 
			
		||||
 | 
			
		||||
      meta_window_focus (window, timestamp);
 | 
			
		||||
 | 
			
		||||
      if (meta_prefs_get_auto_raise ())
 | 
			
		||||
        meta_display_queue_autoraise_callback (display, window);
 | 
			
		||||
      else
 | 
			
		||||
        meta_topic (META_DEBUG_FOCUS, "Auto raise is disabled\n");
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      /* In mouse focus mode, we defocus when the mouse *enters*
 | 
			
		||||
       * the DESKTOP window, instead of defocusing on LeaveNotify.
 | 
			
		||||
       * This is because having the mouse enter override-redirect
 | 
			
		||||
       * child windows unfortunately causes LeaveNotify events that
 | 
			
		||||
       * we can't distinguish from the mouse actually leaving the
 | 
			
		||||
       * toplevel window as we expect.  But, since we filter out
 | 
			
		||||
       * EnterNotify events on override-redirect windows, this
 | 
			
		||||
       * alternative mechanism works great.
 | 
			
		||||
       */
 | 
			
		||||
      if (meta_prefs_get_focus_mode() == G_DESKTOP_FOCUS_MODE_MOUSE &&
 | 
			
		||||
          display->expected_focus_window != NULL)
 | 
			
		||||
        {
 | 
			
		||||
          meta_topic (META_DEBUG_FOCUS,
 | 
			
		||||
                      "Unsetting focus from %s due to mouse entering "
 | 
			
		||||
                      "the DESKTOP window\n",
 | 
			
		||||
                      display->expected_focus_window->desc);
 | 
			
		||||
          meta_display_focus_the_no_focus_window (display,
 | 
			
		||||
                                                  window->screen,
 | 
			
		||||
                                                  timestamp);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
window_focus_on_pointer_rest_callback (gpointer data) {
 | 
			
		||||
  MetaFocusData *focus_data;
 | 
			
		||||
  MetaDisplay *display;
 | 
			
		||||
  MetaScreen *screen;
 | 
			
		||||
  MetaWindow *window;
 | 
			
		||||
  Window root, child;
 | 
			
		||||
  int root_x, root_y, x, y;
 | 
			
		||||
  guint32 timestamp;
 | 
			
		||||
  guint mask;
 | 
			
		||||
 | 
			
		||||
  focus_data = data;
 | 
			
		||||
  display = focus_data->display;
 | 
			
		||||
  screen = focus_data->window->screen;
 | 
			
		||||
 | 
			
		||||
  if (meta_prefs_get_focus_mode () == G_DESKTOP_FOCUS_MODE_CLICK)
 | 
			
		||||
    goto out;
 | 
			
		||||
 | 
			
		||||
  meta_error_trap_push (display);
 | 
			
		||||
  XQueryPointer (display->xdisplay,
 | 
			
		||||
                 screen->xroot,
 | 
			
		||||
                 &root, &child,
 | 
			
		||||
                 &root_x, &root_y, &x, &y, &mask);
 | 
			
		||||
  meta_error_trap_pop (display);
 | 
			
		||||
 | 
			
		||||
  if (root_x != focus_data->pointer_x ||
 | 
			
		||||
      root_y != focus_data->pointer_y)
 | 
			
		||||
    {
 | 
			
		||||
      focus_data->pointer_x = root_x;
 | 
			
		||||
      focus_data->pointer_y = root_y;
 | 
			
		||||
      return TRUE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* Explicitly check for the overlay window, as get_focus_window_at_point()
 | 
			
		||||
   * may return windows that extend underneath the chrome (like
 | 
			
		||||
   * override-redirect or DESKTOP windows)
 | 
			
		||||
   */
 | 
			
		||||
  if (child == meta_get_overlay_window (screen))
 | 
			
		||||
    goto out;
 | 
			
		||||
 | 
			
		||||
  window =
 | 
			
		||||
      meta_stack_get_default_focus_window_at_point (screen->stack,
 | 
			
		||||
                                                    screen->active_workspace,
 | 
			
		||||
                                                    None, root_x, root_y);
 | 
			
		||||
 | 
			
		||||
  if (window == NULL)
 | 
			
		||||
    goto out;
 | 
			
		||||
 | 
			
		||||
  timestamp = meta_display_get_current_time_roundtrip (display);
 | 
			
		||||
  meta_display_mouse_mode_focus (display, window, timestamp);
 | 
			
		||||
 | 
			
		||||
out:
 | 
			
		||||
  display->focus_timeout_id = 0;
 | 
			
		||||
  return FALSE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
meta_display_queue_autoraise_callback (MetaDisplay *display,
 | 
			
		||||
                                       MetaWindow  *window)
 | 
			
		||||
@@ -1527,6 +1710,37 @@ meta_display_queue_autoraise_callback (MetaDisplay *display,
 | 
			
		||||
  display->autoraise_window = window;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* The interval, in milliseconds, we use in focus-follows-mouse
 | 
			
		||||
 * mode to check whether the pointer has stopped moving after a
 | 
			
		||||
 * crossing event.
 | 
			
		||||
 */
 | 
			
		||||
#define FOCUS_TIMEOUT_DELAY 25
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
meta_display_queue_focus_callback (MetaDisplay *display,
 | 
			
		||||
                                   MetaWindow  *window,
 | 
			
		||||
                                   int          pointer_x,
 | 
			
		||||
                                   int          pointer_y)
 | 
			
		||||
{
 | 
			
		||||
  MetaFocusData *focus_data;
 | 
			
		||||
 | 
			
		||||
  focus_data = g_new (MetaFocusData, 1);
 | 
			
		||||
  focus_data->display = display;
 | 
			
		||||
  focus_data->window = window;
 | 
			
		||||
  focus_data->pointer_x = pointer_x;
 | 
			
		||||
  focus_data->pointer_y = pointer_y;
 | 
			
		||||
 | 
			
		||||
  if (display->focus_timeout_id != 0)
 | 
			
		||||
    g_source_remove (display->focus_timeout_id);
 | 
			
		||||
 | 
			
		||||
  display->focus_timeout_id =
 | 
			
		||||
    g_timeout_add_full (G_PRIORITY_DEFAULT,
 | 
			
		||||
                        FOCUS_TIMEOUT_DELAY,
 | 
			
		||||
                        window_focus_on_pointer_rest_callback,
 | 
			
		||||
                        focus_data,
 | 
			
		||||
                        g_free);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if 0
 | 
			
		||||
static void
 | 
			
		||||
handle_net_restack_window (MetaDisplay* display,
 | 
			
		||||
@@ -1566,19 +1780,18 @@ handle_net_restack_window (MetaDisplay* display,
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * event_callback:
 | 
			
		||||
 * @event: The event that just happened
 | 
			
		||||
 * @data: The #MetaDisplay that events are coming from, cast to a gpointer
 | 
			
		||||
 *        so that it can be sent to a callback
 | 
			
		||||
 *
 | 
			
		||||
 * This is the most important function in the whole program. It is the heart,
 | 
			
		||||
 * it is the nexus, it is the Grand Central Station of Mutter's world.
 | 
			
		||||
 * When we create a MetaDisplay, we ask GDK to pass *all* events for *all*
 | 
			
		||||
 * When we create a #MetaDisplay, we ask GDK to pass *all* events for *all*
 | 
			
		||||
 * windows to this function. So every time anything happens that we might
 | 
			
		||||
 * want to know about, this function gets called. You see why it gets a bit
 | 
			
		||||
 * busy around here. Most of this function is a ginormous switch statement
 | 
			
		||||
 * dealing with all the kinds of events that might turn up.
 | 
			
		||||
 *
 | 
			
		||||
 * \param event The event that just happened
 | 
			
		||||
 * \param data  The MetaDisplay that events are coming from, cast to a gpointer
 | 
			
		||||
 *              so that it can be sent to a callback
 | 
			
		||||
 *
 | 
			
		||||
 * \ingroup main
 | 
			
		||||
 */
 | 
			
		||||
static gboolean
 | 
			
		||||
event_callback (XEvent   *event,
 | 
			
		||||
@@ -1764,6 +1977,8 @@ event_callback (XEvent   *event,
 | 
			
		||||
      if (display->grab_op == META_GRAB_OP_COMPOSITOR)
 | 
			
		||||
        break;
 | 
			
		||||
 | 
			
		||||
      display->overlay_key_only_pressed = FALSE;
 | 
			
		||||
 | 
			
		||||
      if (event->xbutton.button == 4 || event->xbutton.button == 5)
 | 
			
		||||
        /* Scrollwheel event, do nothing and deliver event to compositor below */
 | 
			
		||||
        break;
 | 
			
		||||
@@ -1961,6 +2176,8 @@ event_callback (XEvent   *event,
 | 
			
		||||
      if (display->grab_op == META_GRAB_OP_COMPOSITOR)
 | 
			
		||||
        break;
 | 
			
		||||
 | 
			
		||||
      display->overlay_key_only_pressed = FALSE;
 | 
			
		||||
 | 
			
		||||
      if (display->grab_window == window &&
 | 
			
		||||
          grab_op_is_mouse (display->grab_op))
 | 
			
		||||
        meta_window_handle_mouse_grab_op_event (window, event);
 | 
			
		||||
@@ -2012,52 +2229,26 @@ event_callback (XEvent   *event,
 | 
			
		||||
            case G_DESKTOP_FOCUS_MODE_SLOPPY:
 | 
			
		||||
            case G_DESKTOP_FOCUS_MODE_MOUSE:
 | 
			
		||||
              display->mouse_mode = TRUE;
 | 
			
		||||
              if (window->type != META_WINDOW_DOCK &&
 | 
			
		||||
                  window->type != META_WINDOW_DESKTOP)
 | 
			
		||||
              if (window->type != META_WINDOW_DOCK)
 | 
			
		||||
                {
 | 
			
		||||
                  meta_topic (META_DEBUG_FOCUS,
 | 
			
		||||
                              "Focusing %s due to enter notify with serial %lu "
 | 
			
		||||
                              "at time %lu, and setting display->mouse_mode to "
 | 
			
		||||
                              "TRUE.\n",
 | 
			
		||||
                              window->desc, 
 | 
			
		||||
                              "Queuing a focus change for %s due to "
 | 
			
		||||
                              "enter notify with serial %lu at time %lu, "
 | 
			
		||||
                              "and setting display->mouse_mode to TRUE.\n",
 | 
			
		||||
                              window->desc,
 | 
			
		||||
                              event->xany.serial,
 | 
			
		||||
                              event->xcrossing.time);
 | 
			
		||||
 | 
			
		||||
                  meta_window_focus (window, event->xcrossing.time);
 | 
			
		||||
                  if (meta_prefs_get_focus_change_on_pointer_rest())
 | 
			
		||||
                    meta_display_queue_focus_callback (display, window,
 | 
			
		||||
                                                       event->xcrossing.x_root,
 | 
			
		||||
                                                       event->xcrossing.y_root);
 | 
			
		||||
                  else
 | 
			
		||||
                    meta_display_mouse_mode_focus (display, window,
 | 
			
		||||
                                                   event->xcrossing.time);
 | 
			
		||||
 | 
			
		||||
                  /* stop ignoring stuff */
 | 
			
		||||
                  reset_ignored_crossing_serials (display);
 | 
			
		||||
                  
 | 
			
		||||
                  if (meta_prefs_get_auto_raise ()) 
 | 
			
		||||
                    {
 | 
			
		||||
                      meta_display_queue_autoraise_callback (display, window);
 | 
			
		||||
                    }
 | 
			
		||||
                  else
 | 
			
		||||
                    {
 | 
			
		||||
                      meta_topic (META_DEBUG_FOCUS,
 | 
			
		||||
                                  "Auto raise is disabled\n");		      
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
              /* In mouse focus mode, we defocus when the mouse *enters*
 | 
			
		||||
               * the DESKTOP window, instead of defocusing on LeaveNotify.
 | 
			
		||||
               * This is because having the mouse enter override-redirect
 | 
			
		||||
               * child windows unfortunately causes LeaveNotify events that
 | 
			
		||||
               * we can't distinguish from the mouse actually leaving the
 | 
			
		||||
               * toplevel window as we expect.  But, since we filter out
 | 
			
		||||
               * EnterNotify events on override-redirect windows, this
 | 
			
		||||
               * alternative mechanism works great.
 | 
			
		||||
               */
 | 
			
		||||
              if (window->type == META_WINDOW_DESKTOP &&
 | 
			
		||||
                  meta_prefs_get_focus_mode() == G_DESKTOP_FOCUS_MODE_MOUSE &&
 | 
			
		||||
                  display->expected_focus_window != NULL)
 | 
			
		||||
                {
 | 
			
		||||
                  meta_topic (META_DEBUG_FOCUS,
 | 
			
		||||
                              "Unsetting focus from %s due to mouse entering "
 | 
			
		||||
                              "the DESKTOP window\n",
 | 
			
		||||
                              display->expected_focus_window->desc);
 | 
			
		||||
                  meta_display_focus_the_no_focus_window (display, 
 | 
			
		||||
                                                          window->screen,
 | 
			
		||||
                                                          event->xcrossing.time);
 | 
			
		||||
                }
 | 
			
		||||
              break;
 | 
			
		||||
            case G_DESKTOP_FOCUS_MODE_CLICK:
 | 
			
		||||
@@ -2625,7 +2816,8 @@ event_callback (XEvent   *event,
 | 
			
		||||
	      break;
 | 
			
		||||
            case XkbNewKeyboardNotify:
 | 
			
		||||
            case XkbMapNotify:
 | 
			
		||||
              meta_display_process_mapping_event (display, event);
 | 
			
		||||
              if (xkb_ev->device == VIRTUAL_CORE_KEYBOARD_ID)
 | 
			
		||||
                meta_display_process_mapping_event (display, event);
 | 
			
		||||
              break;
 | 
			
		||||
	    }
 | 
			
		||||
	}
 | 
			
		||||
@@ -3706,6 +3898,9 @@ meta_display_begin_grab_op (MetaDisplay *display,
 | 
			
		||||
    {
 | 
			
		||||
      meta_window_refresh_resize_popup (display->grab_window);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  g_signal_emit (display, display_signals[GRAB_OP_BEGIN], 0,
 | 
			
		||||
                 screen, display->grab_window, display->grab_op);
 | 
			
		||||
  
 | 
			
		||||
  return TRUE;
 | 
			
		||||
}
 | 
			
		||||
@@ -3720,6 +3915,9 @@ meta_display_end_grab_op (MetaDisplay *display,
 | 
			
		||||
  if (display->grab_op == META_GRAB_OP_NONE)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  g_signal_emit (display, display_signals[GRAB_OP_END], 0,
 | 
			
		||||
                 display->grab_screen, display->grab_window, display->grab_op);
 | 
			
		||||
 | 
			
		||||
  if (display->grab_window != NULL)
 | 
			
		||||
    display->grab_window->shaken_loose = FALSE;
 | 
			
		||||
  
 | 
			
		||||
@@ -4152,21 +4350,23 @@ meta_display_set_cursor_theme (const char *theme,
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
/*
 | 
			
		||||
 * Stores whether syncing is currently enabled.
 | 
			
		||||
 */
 | 
			
		||||
static gboolean is_syncing = FALSE;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * meta_is_syncing:
 | 
			
		||||
 *
 | 
			
		||||
 * Returns whether X synchronisation is currently enabled.
 | 
			
		||||
 *
 | 
			
		||||
 * \return true if we must wait for events whenever we send X requests;
 | 
			
		||||
 * false otherwise.
 | 
			
		||||
 *
 | 
			
		||||
 * \bug This is *only* called by meta_display_open, but by that time
 | 
			
		||||
 * FIXME: This is *only* called by meta_display_open(), but by that time
 | 
			
		||||
 * we have already turned syncing on or off on startup, and we don't
 | 
			
		||||
 * have any way to do so while Mutter is running, so it's rather
 | 
			
		||||
 * pointless.
 | 
			
		||||
 *
 | 
			
		||||
 * Returns: %TRUE if we must wait for events whenever we send X requests;
 | 
			
		||||
 * %FALSE otherwise.
 | 
			
		||||
 */
 | 
			
		||||
gboolean
 | 
			
		||||
meta_is_syncing (void)
 | 
			
		||||
@@ -4175,10 +4375,9 @@ meta_is_syncing (void)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * A handy way to turn on synchronisation on or off for every display.
 | 
			
		||||
 * meta_set_syncing:
 | 
			
		||||
 *
 | 
			
		||||
 * \bug Of course there is only one display ever anyway, so this can
 | 
			
		||||
 * be rather hugely simplified.
 | 
			
		||||
 * A handy way to turn on synchronisation on or off for every display.
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
meta_set_syncing (gboolean setting)
 | 
			
		||||
@@ -4191,26 +4390,25 @@ meta_set_syncing (gboolean setting)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
/*
 | 
			
		||||
 * How long, in milliseconds, we should wait after pinging a window
 | 
			
		||||
 * before deciding it's not going to get back to us.
 | 
			
		||||
 */
 | 
			
		||||
#define PING_TIMEOUT_DELAY 5000
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * meta_display_ping_timeout:
 | 
			
		||||
 * @data: All the information about this ping. It is a #MetaPingData
 | 
			
		||||
 *        cast to a #gpointer in order to be passable to a timeout function.
 | 
			
		||||
 *        This function will also free this parameter.
 | 
			
		||||
 *
 | 
			
		||||
 * Does whatever it is we decided to do when a window didn't respond
 | 
			
		||||
 * to a ping. We also remove the ping from the display's list of
 | 
			
		||||
 * pending pings. This function is called by the event loop when the timeout
 | 
			
		||||
 * times out which we created at the start of the ping.
 | 
			
		||||
 *
 | 
			
		||||
 * \param data All the information about this ping. It is a MetaPingData
 | 
			
		||||
 *             cast to a void* in order to be passable to a timeout function.
 | 
			
		||||
 *             This function will also free this parameter.
 | 
			
		||||
 *
 | 
			
		||||
 * \return Always returns false, because this function is called as a
 | 
			
		||||
 *         timeout and we don't want to run the timer again.
 | 
			
		||||
 *
 | 
			
		||||
 * \ingroup pings
 | 
			
		||||
 * Returns: Always returns %FALSE, because this function is called as a
 | 
			
		||||
 *          timeout and we don't want to run the timer again.
 | 
			
		||||
 */
 | 
			
		||||
static gboolean
 | 
			
		||||
meta_display_ping_timeout (gpointer data)
 | 
			
		||||
@@ -4237,6 +4435,17 @@ meta_display_ping_timeout (gpointer data)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * meta_display_ping_window:
 | 
			
		||||
 * @display: The #MetaDisplay that the window is on
 | 
			
		||||
 * @window: The #MetaWindow to send the ping to
 | 
			
		||||
 * @timestamp: The timestamp of the ping. Used for uniqueness.
 | 
			
		||||
 *             Cannot be CurrentTime; use a real timestamp!
 | 
			
		||||
 * @ping_reply_func: The callback to call if we get a response.
 | 
			
		||||
 * @ping_timeout_func: The callback to call if we don't get a response.
 | 
			
		||||
 * @user_data: Arbitrary data that will be passed to the callback
 | 
			
		||||
 *             function. (In practice it's often a pointer to
 | 
			
		||||
 *             the window.)
 | 
			
		||||
 *
 | 
			
		||||
 * Sends a ping request to a window. The window must respond to
 | 
			
		||||
 * the request within a certain amount of time. If it does, we
 | 
			
		||||
 * will call one callback; if the time passes and we haven't had
 | 
			
		||||
@@ -4246,20 +4455,9 @@ meta_display_ping_timeout (gpointer data)
 | 
			
		||||
 * This function returns straight away after setting things up;
 | 
			
		||||
 * the callbacks will be called from the event loop.
 | 
			
		||||
 *
 | 
			
		||||
 * \param display  The MetaDisplay that the window is on
 | 
			
		||||
 * \param window   The MetaWindow to send the ping to
 | 
			
		||||
 * \param timestamp The timestamp of the ping. Used for uniqueness.
 | 
			
		||||
 *                  Cannot be CurrentTime; use a real timestamp!
 | 
			
		||||
 * \param ping_reply_func The callback to call if we get a response.
 | 
			
		||||
 * \param ping_timeout_func The callback to call if we don't get a response.
 | 
			
		||||
 * \param user_data Arbitrary data that will be passed to the callback
 | 
			
		||||
 *                  function. (In practice it's often a pointer to
 | 
			
		||||
 *                  the window.)
 | 
			
		||||
 * FIXME: This should probably be a method on windows, rather than displays
 | 
			
		||||
 *        for one of their windows.
 | 
			
		||||
 *
 | 
			
		||||
 * \bug This should probably be a method on windows, rather than displays
 | 
			
		||||
 *      for one of their windows.
 | 
			
		||||
 *
 | 
			
		||||
 * \ingroup pings
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
meta_display_ping_window (MetaDisplay       *display,
 | 
			
		||||
@@ -4367,16 +4565,15 @@ process_request_frame_extents (MetaDisplay    *display,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * process_pong_message:
 | 
			
		||||
 * @display: the display we got the pong from
 | 
			
		||||
 * @event: the #XEvent which is a pong; we can tell which
 | 
			
		||||
 *         ping it corresponds to because it bears the
 | 
			
		||||
 *         same timestamp.
 | 
			
		||||
 *
 | 
			
		||||
 * Process the pong (the response message) from the ping we sent
 | 
			
		||||
 * to the window. This involves removing the timeout, calling the
 | 
			
		||||
 * reply handler function, and freeing memory.
 | 
			
		||||
 *
 | 
			
		||||
 * \param display  the display we got the pong from
 | 
			
		||||
 * \param event    the XEvent which is a pong; we can tell which
 | 
			
		||||
 *                 ping it corresponds to because it bears the
 | 
			
		||||
 *                 same timestamp.
 | 
			
		||||
 *
 | 
			
		||||
 * \ingroup pings
 | 
			
		||||
 */
 | 
			
		||||
static void
 | 
			
		||||
process_pong_message (MetaDisplay    *display,
 | 
			
		||||
@@ -4423,18 +4620,17 @@ process_pong_message (MetaDisplay    *display,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * meta_display_window_has_pending_pings:
 | 
			
		||||
 * @display: The #MetaDisplay of the window.
 | 
			
		||||
 * @window: The #MetaWindow whose pings we want to know about.
 | 
			
		||||
 *
 | 
			
		||||
 * Finds whether a window has any pings waiting on it.
 | 
			
		||||
 *
 | 
			
		||||
 * \param display The MetaDisplay of the window.
 | 
			
		||||
 * \param window  The MetaWindow whose pings we want to know about.
 | 
			
		||||
 * FIXME: This should probably be a method on windows, rather than displays
 | 
			
		||||
 *        for one of their windows.
 | 
			
		||||
 *
 | 
			
		||||
 * \return True if there is at least one ping which has been sent
 | 
			
		||||
 *         to the window without getting a response; false otherwise.
 | 
			
		||||
 *
 | 
			
		||||
 * \bug This should probably be a method on windows, rather than displays
 | 
			
		||||
 *      for one of their windows.
 | 
			
		||||
 *
 | 
			
		||||
 * \ingroup pings
 | 
			
		||||
 * Returns: %TRUE if there is at least one ping which has been sent
 | 
			
		||||
 *          to the window without getting a response; %FALSE otherwise.
 | 
			
		||||
 */
 | 
			
		||||
gboolean
 | 
			
		||||
meta_display_window_has_pending_pings (MetaDisplay *display,
 | 
			
		||||
@@ -4464,7 +4660,8 @@ get_focussed_group (MetaDisplay *display)
 | 
			
		||||
 | 
			
		||||
#define IN_TAB_CHAIN(w,t) (((t) == META_TAB_LIST_NORMAL && META_WINDOW_IN_NORMAL_TAB_CHAIN (w)) \
 | 
			
		||||
    || ((t) == META_TAB_LIST_DOCKS && META_WINDOW_IN_DOCK_TAB_CHAIN (w)) \
 | 
			
		||||
    || ((t) == META_TAB_LIST_GROUP && META_WINDOW_IN_GROUP_TAB_CHAIN (w, get_focussed_group(w->display))))
 | 
			
		||||
    || ((t) == META_TAB_LIST_GROUP && META_WINDOW_IN_GROUP_TAB_CHAIN (w, get_focussed_group(w->display))) \
 | 
			
		||||
    || ((t) == META_TAB_LIST_NORMAL_ALL && META_WINDOW_IN_NORMAL_TAB_CHAIN_TYPE (w)))
 | 
			
		||||
 | 
			
		||||
static MetaWindow*
 | 
			
		||||
find_tab_forward (MetaDisplay   *display,
 | 
			
		||||
@@ -4612,12 +4809,13 @@ meta_display_get_tab_list (MetaDisplay   *display,
 | 
			
		||||
  tab_list = g_list_reverse (tab_list);
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    GSList *tmp;
 | 
			
		||||
    GSList *windows, *tmp;
 | 
			
		||||
    MetaWindow *l_window;
 | 
			
		||||
 | 
			
		||||
    tmp = meta_display_list_windows (display, META_LIST_DEFAULT);
 | 
			
		||||
    windows = meta_display_list_windows (display, META_LIST_DEFAULT);
 | 
			
		||||
 | 
			
		||||
    /* Go through all windows */
 | 
			
		||||
    tmp = windows;
 | 
			
		||||
    while (tmp != NULL)
 | 
			
		||||
      {
 | 
			
		||||
        l_window=tmp->data;
 | 
			
		||||
@@ -4633,6 +4831,8 @@ meta_display_get_tab_list (MetaDisplay   *display,
 | 
			
		||||
 | 
			
		||||
        tmp = tmp->next;
 | 
			
		||||
      } /* End while tmp!=NULL */
 | 
			
		||||
 | 
			
		||||
    g_slist_free (windows);
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  return tab_list;
 | 
			
		||||
@@ -5029,12 +5229,21 @@ meta_display_unmanage_windows_for_screen (MetaDisplay *display,
 | 
			
		||||
  winlist = meta_display_list_windows (display,
 | 
			
		||||
                                       META_LIST_INCLUDE_OVERRIDE_REDIRECT);
 | 
			
		||||
  winlist = g_slist_sort (winlist, meta_display_stack_cmp);
 | 
			
		||||
  g_slist_foreach (winlist, (GFunc)g_object_ref, NULL);
 | 
			
		||||
 | 
			
		||||
  /* Unmanage all windows */
 | 
			
		||||
  tmp = winlist;
 | 
			
		||||
  while (tmp != NULL)
 | 
			
		||||
    {
 | 
			
		||||
      meta_window_unmanage (tmp->data, timestamp);
 | 
			
		||||
      MetaWindow *window = tmp->data;
 | 
			
		||||
 | 
			
		||||
      /* Check if already unmanaged for safety - in particular, catch
 | 
			
		||||
       * the case where unmanaging a parent window can cause attached
 | 
			
		||||
       * dialogs to be (temporarily) unmanaged.
 | 
			
		||||
       */
 | 
			
		||||
      if (!window->unmanaging)
 | 
			
		||||
        meta_window_unmanage (window, timestamp);
 | 
			
		||||
      g_object_unref (window);
 | 
			
		||||
      
 | 
			
		||||
      tmp = tmp->next;
 | 
			
		||||
    }
 | 
			
		||||
@@ -5277,7 +5486,6 @@ timestamp_too_old (MetaDisplay *display,
 | 
			
		||||
      meta_warning ("Got a request to focus %s with a timestamp of 0.  This "
 | 
			
		||||
                    "shouldn't happen!\n",
 | 
			
		||||
                    window ? window->desc : "the no_focus_window");
 | 
			
		||||
      meta_print_backtrace ();
 | 
			
		||||
      *timestamp = meta_display_get_current_time_roundtrip (display);
 | 
			
		||||
      return FALSE;
 | 
			
		||||
    }
 | 
			
		||||
@@ -5481,3 +5689,18 @@ meta_display_get_leader_window (MetaDisplay *display)
 | 
			
		||||
{
 | 
			
		||||
  return display->leader_window;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * meta_display_clear_mouse_mode:
 | 
			
		||||
 * @display: a #MetaDisplay
 | 
			
		||||
 *
 | 
			
		||||
 * Sets the mouse-mode flag to %FALSE, which means that motion events are
 | 
			
		||||
 * no longer ignored in mouse or sloppy focus.
 | 
			
		||||
 * This is an internal function. It should be used only for reimplementing
 | 
			
		||||
 * keybindings, and only in a manner compatible with core code.
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
meta_display_clear_mouse_mode (MetaDisplay *display)
 | 
			
		||||
{
 | 
			
		||||
  display->mouse_mode = FALSE;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -322,9 +322,14 @@ void
 | 
			
		||||
meta_frame_calc_borders (MetaFrame        *frame,
 | 
			
		||||
                         MetaFrameBorders *borders)
 | 
			
		||||
{
 | 
			
		||||
  meta_ui_get_frame_borders (frame->window->screen->ui,
 | 
			
		||||
                             frame->xwindow,
 | 
			
		||||
                             borders);
 | 
			
		||||
  /* Save on if statements and potential uninitialized values
 | 
			
		||||
   * in callers -- if there's no frame, then zero the borders. */
 | 
			
		||||
  if (frame == NULL)
 | 
			
		||||
    meta_frame_borders_clear (borders);
 | 
			
		||||
  else
 | 
			
		||||
    meta_ui_get_frame_borders (frame->window->screen->ui,
 | 
			
		||||
                               frame->xwindow,
 | 
			
		||||
                               borders);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
 
 | 
			
		||||
@@ -29,6 +29,7 @@
 | 
			
		||||
#ifndef META_KEYBINDINGS_PRIVATE_H
 | 
			
		||||
#define META_KEYBINDINGS_PRIVATE_H
 | 
			
		||||
 | 
			
		||||
#include <gio/gio.h>
 | 
			
		||||
#include <meta/keybindings.h>
 | 
			
		||||
 | 
			
		||||
struct _MetaKeyHandler
 | 
			
		||||
@@ -73,7 +74,7 @@ void     meta_display_process_mapping_event (MetaDisplay *display,
 | 
			
		||||
                                             XEvent      *event);
 | 
			
		||||
 | 
			
		||||
gboolean meta_prefs_add_keybinding          (const char           *name,
 | 
			
		||||
                                             const char           *schema,
 | 
			
		||||
                                             GSettings            *settings,
 | 
			
		||||
                                             MetaKeyBindingAction  action,
 | 
			
		||||
                                             MetaKeyBindingFlags   flags);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -53,7 +53,7 @@ static gboolean all_bindings_disabled = FALSE;
 | 
			
		||||
 | 
			
		||||
static gboolean add_builtin_keybinding (MetaDisplay          *display,
 | 
			
		||||
                                        const char           *name,
 | 
			
		||||
                                        const char           *schema,
 | 
			
		||||
                                        GSettings            *settings,
 | 
			
		||||
                                        MetaKeyBindingFlags   flags,
 | 
			
		||||
                                        MetaKeyBindingAction  action,
 | 
			
		||||
                                        MetaKeyHandlerFunc    handler,
 | 
			
		||||
@@ -71,18 +71,10 @@ meta_key_binding_copy (MetaKeyBinding *binding)
 | 
			
		||||
  return g_slice_dup (MetaKeyBinding, binding);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
GType
 | 
			
		||||
meta_key_binding_get_type (void)
 | 
			
		||||
{
 | 
			
		||||
  static GType type_id = 0;
 | 
			
		||||
 | 
			
		||||
  if (G_UNLIKELY (type_id == 0))
 | 
			
		||||
    type_id = g_boxed_type_register_static (g_intern_static_string ("MetaKeyBinding"),
 | 
			
		||||
                                            (GBoxedCopyFunc)meta_key_binding_copy,
 | 
			
		||||
                                            (GBoxedFreeFunc)meta_key_binding_free);
 | 
			
		||||
 | 
			
		||||
  return type_id;
 | 
			
		||||
}
 | 
			
		||||
G_DEFINE_BOXED_TYPE(MetaKeyBinding,
 | 
			
		||||
                    meta_key_binding,
 | 
			
		||||
                    meta_key_binding_copy,
 | 
			
		||||
                    meta_key_binding_free)
 | 
			
		||||
 | 
			
		||||
const char *
 | 
			
		||||
meta_key_binding_get_name (MetaKeyBinding *binding)
 | 
			
		||||
@@ -300,6 +292,10 @@ reload_keycodes (MetaDisplay *display)
 | 
			
		||||
      display->overlay_key_combo.keycode =
 | 
			
		||||
        keysym_to_keycode (display, display->overlay_key_combo.keysym);
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      display->overlay_key_combo.keycode = 0;
 | 
			
		||||
    }
 | 
			
		||||
  
 | 
			
		||||
  if (display->key_bindings)
 | 
			
		||||
    {
 | 
			
		||||
@@ -477,11 +473,7 @@ rebuild_special_bindings (MetaDisplay *display)
 | 
			
		||||
  MetaKeyCombo combo;
 | 
			
		||||
  
 | 
			
		||||
  meta_prefs_get_overlay_binding (&combo);
 | 
			
		||||
 | 
			
		||||
  if (combo.keysym != None || combo.keycode != 0)
 | 
			
		||||
    {
 | 
			
		||||
      display->overlay_key_combo = combo;
 | 
			
		||||
    }
 | 
			
		||||
  display->overlay_key_combo = combo;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
@@ -546,7 +538,7 @@ display_get_keybinding (MetaDisplay  *display,
 | 
			
		||||
static gboolean
 | 
			
		||||
add_keybinding_internal (MetaDisplay          *display,
 | 
			
		||||
                         const char           *name,
 | 
			
		||||
                         const char           *schema,
 | 
			
		||||
                         GSettings            *settings,
 | 
			
		||||
                         MetaKeyBindingFlags   flags,
 | 
			
		||||
                         MetaKeyBindingAction  action,
 | 
			
		||||
                         MetaKeyHandlerFunc    func,
 | 
			
		||||
@@ -556,7 +548,7 @@ add_keybinding_internal (MetaDisplay          *display,
 | 
			
		||||
{
 | 
			
		||||
  MetaKeyHandler *handler;
 | 
			
		||||
 | 
			
		||||
  if (!meta_prefs_add_keybinding (name, schema, action, flags))
 | 
			
		||||
  if (!meta_prefs_add_keybinding (name, settings, action, flags))
 | 
			
		||||
    return FALSE;
 | 
			
		||||
 | 
			
		||||
  handler = g_new0 (MetaKeyHandler, 1);
 | 
			
		||||
@@ -576,13 +568,13 @@ add_keybinding_internal (MetaDisplay          *display,
 | 
			
		||||
static gboolean
 | 
			
		||||
add_builtin_keybinding (MetaDisplay          *display,
 | 
			
		||||
                        const char           *name,
 | 
			
		||||
                        const char           *schema,
 | 
			
		||||
                        GSettings            *settings,
 | 
			
		||||
                        MetaKeyBindingFlags   flags,
 | 
			
		||||
                        MetaKeyBindingAction  action,
 | 
			
		||||
                        MetaKeyHandlerFunc    handler,
 | 
			
		||||
                        int                   handler_arg)
 | 
			
		||||
{
 | 
			
		||||
  return add_keybinding_internal (display, name, schema,
 | 
			
		||||
  return add_keybinding_internal (display, name, settings,
 | 
			
		||||
                                  flags | META_KEY_BINDING_BUILTIN,
 | 
			
		||||
                                  action, handler, handler_arg, NULL, NULL);
 | 
			
		||||
}
 | 
			
		||||
@@ -591,7 +583,7 @@ add_builtin_keybinding (MetaDisplay          *display,
 | 
			
		||||
 * meta_display_add_keybinding:
 | 
			
		||||
 * @display: a #MetaDisplay
 | 
			
		||||
 * @name: the binding's name
 | 
			
		||||
 * @schema: the #GSettings schema where @name is stored
 | 
			
		||||
 * @settings: the #GSettings object where @name is stored
 | 
			
		||||
 * @flags: flags to specify binding details
 | 
			
		||||
 * @handler: function to run when the keybinding is invoked
 | 
			
		||||
 * @user_data: the data to pass to @handler
 | 
			
		||||
@@ -617,13 +609,13 @@ add_builtin_keybinding (MetaDisplay          *display,
 | 
			
		||||
gboolean
 | 
			
		||||
meta_display_add_keybinding (MetaDisplay         *display,
 | 
			
		||||
                             const char          *name,
 | 
			
		||||
                             const char          *schema,
 | 
			
		||||
                             GSettings           *settings,
 | 
			
		||||
                             MetaKeyBindingFlags  flags,
 | 
			
		||||
                             MetaKeyHandlerFunc   handler,
 | 
			
		||||
                             gpointer             user_data,
 | 
			
		||||
                             GDestroyNotify       free_data)
 | 
			
		||||
{
 | 
			
		||||
  return add_keybinding_internal (display, name, schema, flags,
 | 
			
		||||
  return add_keybinding_internal (display, name, settings, flags,
 | 
			
		||||
                                  META_KEYBINDING_ACTION_NONE,
 | 
			
		||||
                                  handler, 0, user_data, free_data);
 | 
			
		||||
}
 | 
			
		||||
@@ -673,6 +665,15 @@ meta_display_get_keybinding_action (MetaDisplay  *display,
 | 
			
		||||
  MetaKeyBinding *binding;
 | 
			
		||||
  KeySym keysym;
 | 
			
		||||
 | 
			
		||||
  /* This is much more vague than the MetaDisplay::overlay-key signal,
 | 
			
		||||
   * which is only emitted if the overlay-key is the only key pressed;
 | 
			
		||||
   * as this method is primarily intended for plugins to allow processing
 | 
			
		||||
   * of mutter keybindings while holding a grab, the overlay-key-only-pressed
 | 
			
		||||
   * tracking is left to the plugin here.
 | 
			
		||||
   */
 | 
			
		||||
  if (keycode == (unsigned int)display->overlay_key_combo.keycode)
 | 
			
		||||
    return META_KEYBINDING_ACTION_OVERLAY_KEY;
 | 
			
		||||
 | 
			
		||||
  keysym = XKeycodeToKeysym (display->xdisplay, keycode, 0);
 | 
			
		||||
  mask = mask & 0xff & ~display->ignored_modifier_mask;
 | 
			
		||||
  binding = display_get_keybinding (display, keysym, keycode, mask);
 | 
			
		||||
@@ -2644,18 +2645,14 @@ handle_move_to_corner_backend (MetaDisplay    *display,
 | 
			
		||||
  MetaRectangle outer;
 | 
			
		||||
  int orig_x, orig_y;
 | 
			
		||||
  int new_x, new_y;
 | 
			
		||||
  int frame_width, frame_height;
 | 
			
		||||
 | 
			
		||||
  meta_window_get_work_area_all_monitors (window, &work_area);
 | 
			
		||||
  meta_window_get_outer_rect (window, &outer);
 | 
			
		||||
  meta_window_get_position (window, &orig_x, &orig_y);
 | 
			
		||||
 | 
			
		||||
  frame_width = (window->frame ? window->frame->child_x : 0);
 | 
			
		||||
  frame_height = (window->frame ? window->frame->child_y : 0);
 | 
			
		||||
 | 
			
		||||
  if (xchange) {
 | 
			
		||||
    new_x = work_area.x + (to_right ?
 | 
			
		||||
            (work_area.width + frame_width) - outer.width :
 | 
			
		||||
            work_area.width - outer.width :
 | 
			
		||||
            0);
 | 
			
		||||
  } else {
 | 
			
		||||
    new_x = orig_x;
 | 
			
		||||
@@ -2663,18 +2660,16 @@ handle_move_to_corner_backend (MetaDisplay    *display,
 | 
			
		||||
 | 
			
		||||
  if (ychange) {
 | 
			
		||||
    new_y = work_area.y + (to_bottom ?
 | 
			
		||||
            (work_area.height + frame_height) - outer.height :
 | 
			
		||||
            work_area.height - outer.height :
 | 
			
		||||
            0);
 | 
			
		||||
  } else {
 | 
			
		||||
    new_y = orig_y;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  meta_window_move_resize (window,
 | 
			
		||||
          FALSE,
 | 
			
		||||
          new_x,
 | 
			
		||||
          new_y,
 | 
			
		||||
          window->rect.width,
 | 
			
		||||
          window->rect.height);
 | 
			
		||||
  meta_window_move_frame (window,
 | 
			
		||||
                          TRUE,
 | 
			
		||||
                          new_x,
 | 
			
		||||
                          new_y);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
@@ -2978,17 +2973,6 @@ handle_panel (MetaDisplay    *display,
 | 
			
		||||
  meta_error_trap_pop (display);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
handle_toggle_recording (MetaDisplay    *display,
 | 
			
		||||
                         MetaScreen     *screen,
 | 
			
		||||
                         MetaWindow     *window,
 | 
			
		||||
                         XEvent         *event,
 | 
			
		||||
                         MetaKeyBinding *binding,
 | 
			
		||||
                         gpointer        dummy)
 | 
			
		||||
{
 | 
			
		||||
  g_signal_emit_by_name (screen, "toggle-recording");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
handle_activate_window_menu (MetaDisplay    *display,
 | 
			
		||||
                      MetaScreen     *screen,
 | 
			
		||||
@@ -3025,6 +3009,8 @@ tab_op_from_tab_type (MetaTabList type)
 | 
			
		||||
      return META_GRAB_OP_KEYBOARD_TABBING_DOCK;
 | 
			
		||||
    case META_TAB_LIST_GROUP:
 | 
			
		||||
      return META_GRAB_OP_KEYBOARD_TABBING_GROUP;
 | 
			
		||||
    case META_TAB_LIST_NORMAL_ALL:
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  g_assert_not_reached ();
 | 
			
		||||
@@ -3043,6 +3029,8 @@ cycle_op_from_tab_type (MetaTabList type)
 | 
			
		||||
      return META_GRAB_OP_KEYBOARD_ESCAPING_DOCK;
 | 
			
		||||
    case META_TAB_LIST_GROUP:
 | 
			
		||||
      return META_GRAB_OP_KEYBOARD_ESCAPING_GROUP;
 | 
			
		||||
    case META_TAB_LIST_NORMAL_ALL:
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  g_assert_not_reached ();
 | 
			
		||||
@@ -3232,6 +3220,46 @@ handle_toggle_above       (MetaDisplay    *display,
 | 
			
		||||
    meta_window_make_above (window);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
handle_toggle_tiled (MetaDisplay    *display,
 | 
			
		||||
                     MetaScreen     *screen,
 | 
			
		||||
                     MetaWindow     *window,
 | 
			
		||||
                     XEvent         *event,
 | 
			
		||||
                     MetaKeyBinding *binding,
 | 
			
		||||
                     gpointer        dummy)
 | 
			
		||||
{
 | 
			
		||||
  MetaTileMode mode = binding->handler->data;
 | 
			
		||||
 | 
			
		||||
  if ((META_WINDOW_TILED_LEFT (window) && mode == META_TILE_LEFT) ||
 | 
			
		||||
      (META_WINDOW_TILED_RIGHT (window) && mode == META_TILE_RIGHT))
 | 
			
		||||
    {
 | 
			
		||||
      window->tile_monitor_number = window->saved_maximize ? window->monitor->number
 | 
			
		||||
                                                           : -1;
 | 
			
		||||
      window->tile_mode = window->saved_maximize ? META_TILE_MAXIMIZED
 | 
			
		||||
                                                 : META_TILE_NONE;
 | 
			
		||||
 | 
			
		||||
      if (window->saved_maximize)
 | 
			
		||||
        meta_window_maximize (window, META_MAXIMIZE_VERTICAL |
 | 
			
		||||
                                      META_MAXIMIZE_HORIZONTAL);
 | 
			
		||||
      else
 | 
			
		||||
        meta_window_unmaximize (window, META_MAXIMIZE_VERTICAL |
 | 
			
		||||
                                        META_MAXIMIZE_HORIZONTAL);
 | 
			
		||||
    }
 | 
			
		||||
  else if (meta_window_can_tile_side_by_side (window))
 | 
			
		||||
    {
 | 
			
		||||
      window->tile_monitor_number = window->monitor->number;
 | 
			
		||||
      window->tile_mode = mode;
 | 
			
		||||
      /* Maximization constraints beat tiling constraints, so if the window
 | 
			
		||||
       * is maximized, tiling won't have any effect unless we unmaximize it
 | 
			
		||||
       * horizontally first; rather than calling meta_window_unmaximize(),
 | 
			
		||||
       * we just set the flag and rely on meta_window_tile() syncing it to
 | 
			
		||||
       * save an additional roundtrip.
 | 
			
		||||
       */
 | 
			
		||||
      window->maximized_horizontally = FALSE;
 | 
			
		||||
      meta_window_tile (window);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
handle_toggle_maximized    (MetaDisplay    *display,
 | 
			
		||||
                           MetaScreen     *screen,
 | 
			
		||||
@@ -3407,7 +3435,7 @@ handle_move_to_workspace  (MetaDisplay    *display,
 | 
			
		||||
          meta_topic (META_DEBUG_FOCUS,
 | 
			
		||||
                      "Resetting mouse_mode to FALSE due to "
 | 
			
		||||
                      "handle_move_to_workspace() call with flip set.\n");
 | 
			
		||||
          workspace->screen->display->mouse_mode = FALSE;
 | 
			
		||||
          meta_display_clear_mouse_mode (workspace->screen->display);
 | 
			
		||||
          meta_workspace_activate_with_focus (workspace,
 | 
			
		||||
                                              window,
 | 
			
		||||
                                              event->xkey.time);
 | 
			
		||||
@@ -3563,6 +3591,19 @@ meta_set_keybindings_disabled (gboolean setting)
 | 
			
		||||
              "Keybindings %s\n", all_bindings_disabled ? "disabled" : "enabled");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * meta_keybindings_set_custom_handler:
 | 
			
		||||
 * @name: The name of the keybinding to set
 | 
			
		||||
 * @handler: (allow-none): The new handler function
 | 
			
		||||
 * @user_data: User data to pass to the callback
 | 
			
		||||
 * @free_data: Will be called when this handler is overridden.
 | 
			
		||||
 *
 | 
			
		||||
 * Allows users to register a custom handler for a
 | 
			
		||||
 * builtin key binding.
 | 
			
		||||
 *
 | 
			
		||||
 * Returns: %TRUE if the binding known as @name was found,
 | 
			
		||||
 * %FALSE otherwise.
 | 
			
		||||
 */
 | 
			
		||||
gboolean
 | 
			
		||||
meta_keybindings_set_custom_handler (const gchar        *name,
 | 
			
		||||
                                     MetaKeyHandlerFunc  handler,
 | 
			
		||||
@@ -3606,104 +3647,106 @@ init_builtin_key_bindings (MetaDisplay *display)
 | 
			
		||||
{
 | 
			
		||||
#define REVERSES_AND_REVERSED (META_KEY_BINDING_REVERSES | \
 | 
			
		||||
                               META_KEY_BINDING_IS_REVERSED)
 | 
			
		||||
  GSettings *common_keybindings = g_settings_new (SCHEMA_COMMON_KEYBINDINGS);
 | 
			
		||||
  GSettings *mutter_keybindings = g_settings_new (SCHEMA_MUTTER_KEYBINDINGS);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "switch-to-workspace-1",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_NONE,
 | 
			
		||||
                          META_KEYBINDING_ACTION_WORKSPACE_1,
 | 
			
		||||
                          handle_switch_to_workspace, 0);
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "switch-to-workspace-2",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_NONE,
 | 
			
		||||
                          META_KEYBINDING_ACTION_WORKSPACE_2,
 | 
			
		||||
                          handle_switch_to_workspace, 1);
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "switch-to-workspace-3",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_NONE,
 | 
			
		||||
                          META_KEYBINDING_ACTION_WORKSPACE_3,
 | 
			
		||||
                          handle_switch_to_workspace, 2);
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "switch-to-workspace-4",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_NONE,
 | 
			
		||||
                          META_KEYBINDING_ACTION_WORKSPACE_4,
 | 
			
		||||
                          handle_switch_to_workspace, 3);
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "switch-to-workspace-5",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_NONE,
 | 
			
		||||
                          META_KEYBINDING_ACTION_WORKSPACE_5,
 | 
			
		||||
                          handle_switch_to_workspace, 4);
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "switch-to-workspace-6",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_NONE,
 | 
			
		||||
                          META_KEYBINDING_ACTION_WORKSPACE_6,
 | 
			
		||||
                          handle_switch_to_workspace, 5);
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "switch-to-workspace-7",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_NONE,
 | 
			
		||||
                          META_KEYBINDING_ACTION_WORKSPACE_7,
 | 
			
		||||
                          handle_switch_to_workspace, 6);
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "switch-to-workspace-8",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_NONE,
 | 
			
		||||
                          META_KEYBINDING_ACTION_WORKSPACE_8,
 | 
			
		||||
                          handle_switch_to_workspace, 7);
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "switch-to-workspace-9",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_NONE,
 | 
			
		||||
                          META_KEYBINDING_ACTION_WORKSPACE_9,
 | 
			
		||||
                          handle_switch_to_workspace, 8);
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "switch-to-workspace-10",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_NONE,
 | 
			
		||||
                          META_KEYBINDING_ACTION_WORKSPACE_10,
 | 
			
		||||
                          handle_switch_to_workspace, 9);
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "switch-to-workspace-11",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_NONE,
 | 
			
		||||
                          META_KEYBINDING_ACTION_WORKSPACE_11,
 | 
			
		||||
                          handle_switch_to_workspace, 10);
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "switch-to-workspace-12",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_NONE,
 | 
			
		||||
                          META_KEYBINDING_ACTION_WORKSPACE_12,
 | 
			
		||||
                          handle_switch_to_workspace, 11);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "switch-to-workspace-left",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_NONE,
 | 
			
		||||
                          META_KEYBINDING_ACTION_WORKSPACE_LEFT,
 | 
			
		||||
                          handle_switch_to_workspace, META_MOTION_LEFT);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "switch-to-workspace-right",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_NONE,
 | 
			
		||||
                          META_KEYBINDING_ACTION_WORKSPACE_RIGHT,
 | 
			
		||||
                          handle_switch_to_workspace, META_MOTION_RIGHT);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "switch-to-workspace-up",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_NONE,
 | 
			
		||||
                          META_KEYBINDING_ACTION_WORKSPACE_UP,
 | 
			
		||||
                          handle_switch_to_workspace, META_MOTION_UP);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "switch-to-workspace-down",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_NONE,
 | 
			
		||||
                          META_KEYBINDING_ACTION_WORKSPACE_DOWN,
 | 
			
		||||
                          handle_switch_to_workspace, META_MOTION_DOWN);
 | 
			
		||||
@@ -3721,84 +3764,84 @@ init_builtin_key_bindings (MetaDisplay *display)
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "switch-group",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_REVERSES,
 | 
			
		||||
                          META_KEYBINDING_ACTION_SWITCH_GROUP,
 | 
			
		||||
                          handle_switch, META_TAB_LIST_GROUP);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "switch-group-backward",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          REVERSES_AND_REVERSED,
 | 
			
		||||
                          META_KEYBINDING_ACTION_SWITCH_GROUP_BACKWARD,
 | 
			
		||||
                          handle_switch, META_TAB_LIST_GROUP);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "switch-windows",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_REVERSES,
 | 
			
		||||
                          META_KEYBINDING_ACTION_SWITCH_WINDOWS,
 | 
			
		||||
                          handle_switch, META_TAB_LIST_NORMAL);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "switch-windows-backward",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          REVERSES_AND_REVERSED,
 | 
			
		||||
                          META_KEYBINDING_ACTION_SWITCH_WINDOWS_BACKWARD,
 | 
			
		||||
                          handle_switch, META_TAB_LIST_NORMAL);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "switch-panels",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_REVERSES,
 | 
			
		||||
                          META_KEYBINDING_ACTION_SWITCH_PANELS,
 | 
			
		||||
                          handle_switch, META_TAB_LIST_DOCKS);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "switch-panels-backward",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          REVERSES_AND_REVERSED,
 | 
			
		||||
                          META_KEYBINDING_ACTION_SWITCH_PANELS_BACKWARD,
 | 
			
		||||
                          handle_switch, META_TAB_LIST_DOCKS);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "cycle-group",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_REVERSES,
 | 
			
		||||
                          META_KEYBINDING_ACTION_CYCLE_GROUP,
 | 
			
		||||
                          handle_cycle, META_TAB_LIST_GROUP);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "cycle-group-backward",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          REVERSES_AND_REVERSED,
 | 
			
		||||
                          META_KEYBINDING_ACTION_CYCLE_GROUP_BACKWARD,
 | 
			
		||||
                          handle_cycle, META_TAB_LIST_GROUP);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "cycle-windows",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_REVERSES,
 | 
			
		||||
                          META_KEYBINDING_ACTION_CYCLE_WINDOWS,
 | 
			
		||||
                          handle_cycle, META_TAB_LIST_NORMAL);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "cycle-windows-backward",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          REVERSES_AND_REVERSED,
 | 
			
		||||
                          META_KEYBINDING_ACTION_CYCLE_WINDOWS_BACKWARD,
 | 
			
		||||
                          handle_cycle, META_TAB_LIST_NORMAL);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "cycle-panels",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_REVERSES,
 | 
			
		||||
                          META_KEYBINDING_ACTION_CYCLE_PANELS,
 | 
			
		||||
                          handle_cycle, META_TAB_LIST_DOCKS);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "cycle-panels-backward",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          REVERSES_AND_REVERSED,
 | 
			
		||||
                          META_KEYBINDING_ACTION_CYCLE_PANELS_BACKWARD,
 | 
			
		||||
                          handle_cycle, META_TAB_LIST_DOCKS);
 | 
			
		||||
@@ -3811,14 +3854,14 @@ init_builtin_key_bindings (MetaDisplay *display)
 | 
			
		||||
 */
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "tab-popup-select",
 | 
			
		||||
                          SCHEMA_MUTTER_KEYBINDINGS,
 | 
			
		||||
                          mutter_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_NONE,
 | 
			
		||||
                          META_KEYBINDING_ACTION_TAB_POPUP_SELECT,
 | 
			
		||||
                          handle_tab_popup_select, 0);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "tab-popup-cancel",
 | 
			
		||||
                          SCHEMA_MUTTER_KEYBINDINGS,
 | 
			
		||||
                          mutter_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_NONE,
 | 
			
		||||
                          META_KEYBINDING_ACTION_TAB_POPUP_CANCEL,
 | 
			
		||||
                          handle_tab_popup_cancel, 0);
 | 
			
		||||
@@ -3827,35 +3870,28 @@ init_builtin_key_bindings (MetaDisplay *display)
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "show-desktop",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_NONE,
 | 
			
		||||
                          META_KEYBINDING_ACTION_SHOW_DESKTOP,
 | 
			
		||||
                          handle_show_desktop, 0);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "panel-main-menu",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_NONE,
 | 
			
		||||
                          META_KEYBINDING_ACTION_PANEL_MAIN_MENU,
 | 
			
		||||
                          handle_panel, META_KEYBINDING_ACTION_PANEL_MAIN_MENU);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "panel-run-dialog",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_NONE,
 | 
			
		||||
                          META_KEYBINDING_ACTION_PANEL_RUN_DIALOG,
 | 
			
		||||
                          handle_panel, META_KEYBINDING_ACTION_PANEL_RUN_DIALOG);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "toggle-recording",
 | 
			
		||||
                          SCHEMA_MUTTER_KEYBINDINGS,
 | 
			
		||||
                          META_KEY_BINDING_NONE,
 | 
			
		||||
                          META_KEYBINDING_ACTION_TOGGLE_RECORDING,
 | 
			
		||||
                          handle_toggle_recording, 0);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "set-spew-mark",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_NONE,
 | 
			
		||||
                          META_KEYBINDING_ACTION_SET_SPEW_MARK,
 | 
			
		||||
                          handle_set_spew_mark, 0);
 | 
			
		||||
@@ -3870,297 +3906,314 @@ init_builtin_key_bindings (MetaDisplay *display)
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "activate-window-menu",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_PER_WINDOW,
 | 
			
		||||
                          META_KEYBINDING_ACTION_ACTIVATE_WINDOW_MENU,
 | 
			
		||||
                          handle_activate_window_menu, 0);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "toggle-fullscreen",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_PER_WINDOW,
 | 
			
		||||
                          META_KEYBINDING_ACTION_TOGGLE_FULLSCREEN,
 | 
			
		||||
                          handle_toggle_fullscreen, 0);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "toggle-maximized",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_PER_WINDOW,
 | 
			
		||||
                          META_KEYBINDING_ACTION_TOGGLE_MAXIMIZED,
 | 
			
		||||
                          handle_toggle_maximized, 0);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "toggle-tiled-left",
 | 
			
		||||
                          mutter_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_PER_WINDOW,
 | 
			
		||||
                          META_KEYBINDING_ACTION_TOGGLE_TILED_LEFT,
 | 
			
		||||
                          handle_toggle_tiled, META_TILE_LEFT);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "toggle-tiled-right",
 | 
			
		||||
                          mutter_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_PER_WINDOW,
 | 
			
		||||
                          META_KEYBINDING_ACTION_TOGGLE_TILED_RIGHT,
 | 
			
		||||
                          handle_toggle_tiled, META_TILE_RIGHT);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "toggle-above",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_PER_WINDOW,
 | 
			
		||||
                          META_KEYBINDING_ACTION_TOGGLE_ABOVE,
 | 
			
		||||
                          handle_toggle_above, 0);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "maximize",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_PER_WINDOW,
 | 
			
		||||
                          META_KEYBINDING_ACTION_MAXIMIZE,
 | 
			
		||||
                          handle_maximize, 0);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "unmaximize",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_PER_WINDOW,
 | 
			
		||||
                          META_KEYBINDING_ACTION_UNMAXIMIZE,
 | 
			
		||||
                          handle_unmaximize, 0);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "toggle-shaded",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_PER_WINDOW,
 | 
			
		||||
                          META_KEYBINDING_ACTION_TOGGLE_SHADED,
 | 
			
		||||
                          handle_toggle_shaded, 0);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "minimize",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_PER_WINDOW,
 | 
			
		||||
                          META_KEYBINDING_ACTION_MINIMIZE,
 | 
			
		||||
                          handle_minimize, 0);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "close",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_PER_WINDOW,
 | 
			
		||||
                          META_KEYBINDING_ACTION_CLOSE,
 | 
			
		||||
                          handle_close, 0);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "begin-move",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_PER_WINDOW,
 | 
			
		||||
                          META_KEYBINDING_ACTION_BEGIN_MOVE,
 | 
			
		||||
                          handle_begin_move, 0);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "begin-resize",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_PER_WINDOW,
 | 
			
		||||
                          META_KEYBINDING_ACTION_BEGIN_RESIZE,
 | 
			
		||||
                          handle_begin_resize, 0);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "toggle-on-all-workspaces",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_PER_WINDOW,
 | 
			
		||||
                          META_KEYBINDING_ACTION_TOGGLE_ON_ALL_WORKSPACES,
 | 
			
		||||
                          handle_toggle_on_all_workspaces, 0);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "move-to-workspace-1",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_PER_WINDOW,
 | 
			
		||||
                          META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_1,
 | 
			
		||||
                          handle_move_to_workspace, 0);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "move-to-workspace-2",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_PER_WINDOW,
 | 
			
		||||
                          META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_2,
 | 
			
		||||
                          handle_move_to_workspace, 1);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "move-to-workspace-3",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_PER_WINDOW,
 | 
			
		||||
                          META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_3,
 | 
			
		||||
                          handle_move_to_workspace, 2);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "move-to-workspace-4",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_PER_WINDOW,
 | 
			
		||||
                          META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_4,
 | 
			
		||||
                          handle_move_to_workspace, 3);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "move-to-workspace-5",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_PER_WINDOW,
 | 
			
		||||
                          META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_5,
 | 
			
		||||
                          handle_move_to_workspace, 4);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "move-to-workspace-6",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_PER_WINDOW,
 | 
			
		||||
                          META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_6,
 | 
			
		||||
                          handle_move_to_workspace, 5);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "move-to-workspace-7",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_PER_WINDOW,
 | 
			
		||||
                          META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_7,
 | 
			
		||||
                          handle_move_to_workspace, 6);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "move-to-workspace-8",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_PER_WINDOW,
 | 
			
		||||
                          META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_8,
 | 
			
		||||
                          handle_move_to_workspace, 7);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "move-to-workspace-9",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_PER_WINDOW,
 | 
			
		||||
                          META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_9,
 | 
			
		||||
                          handle_move_to_workspace, 8);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "move-to-workspace-10",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_PER_WINDOW,
 | 
			
		||||
                          META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_10,
 | 
			
		||||
                          handle_move_to_workspace, 9);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "move-to-workspace-11",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_PER_WINDOW,
 | 
			
		||||
                          META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_11,
 | 
			
		||||
                          handle_move_to_workspace, 10);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "move-to-workspace-12",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_PER_WINDOW,
 | 
			
		||||
                          META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_12,
 | 
			
		||||
                          handle_move_to_workspace, 11);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "move-to-workspace-left",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_PER_WINDOW,
 | 
			
		||||
                          META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_LEFT,
 | 
			
		||||
                          handle_move_to_workspace, META_MOTION_LEFT);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "move-to-workspace-right",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_PER_WINDOW,
 | 
			
		||||
                          META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_RIGHT,
 | 
			
		||||
                          handle_move_to_workspace, META_MOTION_RIGHT);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "move-to-workspace-up",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_PER_WINDOW,
 | 
			
		||||
                          META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_UP,
 | 
			
		||||
                          handle_move_to_workspace, META_MOTION_UP);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "move-to-workspace-down",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_PER_WINDOW,
 | 
			
		||||
                          META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_DOWN,
 | 
			
		||||
                          handle_move_to_workspace, META_MOTION_DOWN);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "raise-or-lower",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_PER_WINDOW,
 | 
			
		||||
                          META_KEYBINDING_ACTION_RAISE_OR_LOWER,
 | 
			
		||||
                          handle_raise_or_lower, 0);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "raise",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_PER_WINDOW,
 | 
			
		||||
                          META_KEYBINDING_ACTION_RAISE,
 | 
			
		||||
                          handle_raise, 0);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "lower",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_PER_WINDOW,
 | 
			
		||||
                          META_KEYBINDING_ACTION_LOWER,
 | 
			
		||||
                          handle_lower, 0);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "maximize-vertically",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_PER_WINDOW,
 | 
			
		||||
                          META_KEYBINDING_ACTION_MAXIMIZE_VERTICALLY,
 | 
			
		||||
                          handle_maximize_vertically, 0);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "maximize-horizontally",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_PER_WINDOW,
 | 
			
		||||
                          META_KEYBINDING_ACTION_MAXIMIZE_HORIZONTALLY,
 | 
			
		||||
                          handle_maximize_horizontally, 0);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "move-to-corner-nw",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_PER_WINDOW,
 | 
			
		||||
                          META_KEYBINDING_ACTION_MOVE_TO_CORNER_NW,
 | 
			
		||||
                          handle_move_to_corner_nw, 0);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "move-to-corner-ne",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_PER_WINDOW,
 | 
			
		||||
                          META_KEYBINDING_ACTION_MOVE_TO_CORNER_NE,
 | 
			
		||||
                          handle_move_to_corner_ne, 0);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "move-to-corner-sw",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_PER_WINDOW,
 | 
			
		||||
                          META_KEYBINDING_ACTION_MOVE_TO_CORNER_SW,
 | 
			
		||||
                          handle_move_to_corner_sw, 0);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "move-to-corner-se",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_PER_WINDOW,
 | 
			
		||||
                          META_KEYBINDING_ACTION_MOVE_TO_CORNER_SE,
 | 
			
		||||
                          handle_move_to_corner_se, 0);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "move-to-side-n",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_PER_WINDOW,
 | 
			
		||||
                          META_KEYBINDING_ACTION_MOVE_TO_SIDE_N,
 | 
			
		||||
                          handle_move_to_side_n, 0);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "move-to-side-s",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_PER_WINDOW,
 | 
			
		||||
                          META_KEYBINDING_ACTION_MOVE_TO_SIDE_S,
 | 
			
		||||
                          handle_move_to_side_s, 0);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "move-to-side-e",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_PER_WINDOW,
 | 
			
		||||
                          META_KEYBINDING_ACTION_MOVE_TO_SIDE_E,
 | 
			
		||||
                          handle_move_to_side_e, 0);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "move-to-side-w",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_PER_WINDOW,
 | 
			
		||||
                          META_KEYBINDING_ACTION_MOVE_TO_SIDE_W,
 | 
			
		||||
                          handle_move_to_side_w, 0);
 | 
			
		||||
 | 
			
		||||
  add_builtin_keybinding (display,
 | 
			
		||||
                          "move-to-center",
 | 
			
		||||
                          SCHEMA_COMMON_KEYBINDINGS,
 | 
			
		||||
                          common_keybindings,
 | 
			
		||||
                          META_KEY_BINDING_PER_WINDOW,
 | 
			
		||||
                          META_KEYBINDING_ACTION_MOVE_TO_CENTER,
 | 
			
		||||
                          handle_move_to_center, 0);
 | 
			
		||||
 | 
			
		||||
  g_object_unref (common_keybindings);
 | 
			
		||||
  g_object_unref (mutter_keybindings);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
 
 | 
			
		||||
@@ -23,18 +23,19 @@
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \file 
 | 
			
		||||
 * Program startup.
 | 
			
		||||
 * SECTION:main
 | 
			
		||||
 * @short_description: Program startup.
 | 
			
		||||
 *
 | 
			
		||||
 * Functions which parse the command-line arguments, create the display,
 | 
			
		||||
 * kick everything off and then close down Mutter when it's time to go.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \mainpage
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 * Mutter - a boring window manager for the adult in you
 | 
			
		||||
 *
 | 
			
		||||
 * Many window managers are like Marshmallow Froot Loops; Mutter
 | 
			
		||||
 * is like Cheerios.
 | 
			
		||||
 * is like Frosted Flakes: it's still plain old corn, but dusted
 | 
			
		||||
 * with some sugar.
 | 
			
		||||
 *
 | 
			
		||||
 * The best way to get a handle on how the whole system fits together
 | 
			
		||||
 * is discussed in doc/code-overview.txt; if you're looking for functions
 | 
			
		||||
@@ -59,7 +60,7 @@
 | 
			
		||||
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#include <wait.h>
 | 
			
		||||
#include <sys/wait.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <signal.h>
 | 
			
		||||
@@ -77,12 +78,12 @@
 | 
			
		||||
#include <girepository.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
/*
 | 
			
		||||
 * The exit code we'll return to our parent process when we eventually die.
 | 
			
		||||
 */
 | 
			
		||||
static MetaExitCode meta_exit_code = META_EXIT_SUCCESS;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
/*
 | 
			
		||||
 * Handle on the main loop, so that we have an easy way of shutting Mutter
 | 
			
		||||
 * down.
 | 
			
		||||
 */
 | 
			
		||||
@@ -92,14 +93,15 @@ static void prefs_changed_callback (MetaPreference pref,
 | 
			
		||||
                                    gpointer       data);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * log_handler:
 | 
			
		||||
 * @log_domain: the domain the error occurred in (we ignore this)
 | 
			
		||||
 * @log_level: the log level so that we can filter out less
 | 
			
		||||
 *             important messages
 | 
			
		||||
 * @message: the message to log
 | 
			
		||||
 * @user_data: arbitrary data (we ignore this)
 | 
			
		||||
 *
 | 
			
		||||
 * Prints log messages. If Mutter was compiled with backtrace support,
 | 
			
		||||
 * also prints a backtrace (see meta_print_backtrace()).
 | 
			
		||||
 *
 | 
			
		||||
 * \param log_domain  the domain the error occurred in (we ignore this)
 | 
			
		||||
 * \param log_level   the log level so that we can filter out less
 | 
			
		||||
 *                    important messages
 | 
			
		||||
 * \param message     the message to log
 | 
			
		||||
 * \param user_data   arbitrary data (we ignore this)
 | 
			
		||||
 */
 | 
			
		||||
static void
 | 
			
		||||
log_handler (const gchar   *log_domain,
 | 
			
		||||
@@ -108,14 +110,15 @@ log_handler (const gchar   *log_domain,
 | 
			
		||||
             gpointer       user_data)
 | 
			
		||||
{
 | 
			
		||||
  meta_warning ("Log level %d: %s\n", log_level, message);
 | 
			
		||||
  meta_print_backtrace ();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * meta_print_compilation_info:
 | 
			
		||||
 *
 | 
			
		||||
 * Prints a list of which configure script options were used to
 | 
			
		||||
 * build this copy of Mutter. This is actually always called
 | 
			
		||||
 * on startup, but it's all no-op unless we're in verbose mode
 | 
			
		||||
 * (see meta_set_verbose).
 | 
			
		||||
 * (see meta_set_verbose()).
 | 
			
		||||
 */
 | 
			
		||||
static void
 | 
			
		||||
meta_print_compilation_info (void)
 | 
			
		||||
@@ -125,21 +128,6 @@ meta_print_compilation_info (void)
 | 
			
		||||
#else
 | 
			
		||||
  meta_verbose ("Compiled without shape extension\n");
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef HAVE_XINERAMA
 | 
			
		||||
  meta_topic (META_DEBUG_XINERAMA, "Compiled with Xinerama extension\n");
 | 
			
		||||
#else
 | 
			
		||||
  meta_topic (META_DEBUG_XINERAMA, "Compiled without Xinerama extension\n");
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef HAVE_XFREE_XINERAMA
 | 
			
		||||
  meta_topic (META_DEBUG_XINERAMA, " (using XFree86 Xinerama)\n");
 | 
			
		||||
#else
 | 
			
		||||
  meta_topic (META_DEBUG_XINERAMA, " (not using XFree86 Xinerama)\n");
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef HAVE_SOLARIS_XINERAMA
 | 
			
		||||
  meta_topic (META_DEBUG_XINERAMA, " (using Solaris Xinerama)\n");
 | 
			
		||||
#else
 | 
			
		||||
  meta_topic (META_DEBUG_XINERAMA, " (not using Solaris Xinerama)\n");
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef HAVE_XSYNC
 | 
			
		||||
  meta_verbose ("Compiled with sync extension\n");
 | 
			
		||||
#else
 | 
			
		||||
@@ -158,12 +146,14 @@ meta_print_compilation_info (void)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * meta_print_self_identity:
 | 
			
		||||
 *
 | 
			
		||||
 * Prints the version number, the current timestamp (not the
 | 
			
		||||
 * build date), the locale, the character encoding, and a list
 | 
			
		||||
 * of configure script options that were used to build this
 | 
			
		||||
 * copy of Mutter. This is actually always called
 | 
			
		||||
 * on startup, but it's all no-op unless we're in verbose mode
 | 
			
		||||
 * (see meta_set_verbose).
 | 
			
		||||
 * (see meta_set_verbose()).
 | 
			
		||||
 */
 | 
			
		||||
static void
 | 
			
		||||
meta_print_self_identity (void)
 | 
			
		||||
@@ -188,7 +178,7 @@ meta_print_self_identity (void)
 | 
			
		||||
  meta_print_compilation_info ();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
/*
 | 
			
		||||
 * The set of possible options that can be set on Mutter's
 | 
			
		||||
 * command line.
 | 
			
		||||
 */
 | 
			
		||||
@@ -207,7 +197,7 @@ static GOptionEntry meta_options[] = {
 | 
			
		||||
    NULL
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "replace", 0, 0, G_OPTION_ARG_NONE,
 | 
			
		||||
    "replace", 'r', 0, G_OPTION_ARG_NONE,
 | 
			
		||||
    &opt_replace_wm,
 | 
			
		||||
    N_("Replace the running window manager"),
 | 
			
		||||
    NULL
 | 
			
		||||
@@ -327,10 +317,12 @@ meta_clutter_init (void)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * meta_select_display:
 | 
			
		||||
 *
 | 
			
		||||
 * Selects which display Mutter should use. It first tries to use
 | 
			
		||||
 * display_name as the display. If display_name is NULL then
 | 
			
		||||
 * @display_name as the display. If @display_name is %NULL then
 | 
			
		||||
 * try to use the environment variable MUTTER_DISPLAY. If that
 | 
			
		||||
 * also is NULL, use the default - :0.0
 | 
			
		||||
 * also is %NULL, use the default - :0.0
 | 
			
		||||
 */
 | 
			
		||||
static void
 | 
			
		||||
meta_select_display (gchar *display_name)
 | 
			
		||||
@@ -381,7 +373,7 @@ on_sigterm (void)
 | 
			
		||||
 * meta_init: (skip)
 | 
			
		||||
 *
 | 
			
		||||
 * Initialize mutter. Call this after meta_get_option_context() and
 | 
			
		||||
 * meta_plugin_type_register(), and before meta_run().
 | 
			
		||||
 * meta_plugin_manager_set_plugin_type(), and before meta_run().
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
meta_init (void)
 | 
			
		||||
@@ -389,8 +381,6 @@ meta_init (void)
 | 
			
		||||
  struct sigaction act;
 | 
			
		||||
  sigset_t empty_mask;
 | 
			
		||||
  GIOChannel *channel;
 | 
			
		||||
 | 
			
		||||
  g_type_init ();
 | 
			
		||||
  
 | 
			
		||||
  sigemptyset (&empty_mask);
 | 
			
		||||
  act.sa_handler = SIG_IGN;
 | 
			
		||||
@@ -560,13 +550,14 @@ meta_run (void)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * meta_quit:
 | 
			
		||||
 * @code: The success or failure code to return to the calling process.
 | 
			
		||||
 *
 | 
			
		||||
 * Stops Mutter. This tells the event loop to stop processing; it is
 | 
			
		||||
 * rather dangerous to use this because this will leave the user with
 | 
			
		||||
 * no window manager. We generally do this only if, for example, the
 | 
			
		||||
 * session manager asks us to; we assume the session manager knows
 | 
			
		||||
 * what it's talking about.
 | 
			
		||||
 *
 | 
			
		||||
 * \param code The success or failure code to return to the calling process.
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
meta_quit (MetaExitCode code)
 | 
			
		||||
@@ -579,13 +570,14 @@ meta_quit (MetaExitCode code)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * prefs_changed_callback:
 | 
			
		||||
 * @pref  Which preference has changed
 | 
			
		||||
 * @data  Arbitrary data (which we ignore)
 | 
			
		||||
 *
 | 
			
		||||
 * Called on pref changes. (One of several functions of its kind and purpose.)
 | 
			
		||||
 *
 | 
			
		||||
 * \bug Why are these particular prefs handled in main.c and not others?
 | 
			
		||||
 * Should they be?
 | 
			
		||||
 *
 | 
			
		||||
 * \param pref  Which preference has changed
 | 
			
		||||
 * \param data  Arbitrary data (which we ignore)
 | 
			
		||||
 * FIXME: Why are these particular prefs handled in main.c and not others?
 | 
			
		||||
 *        Should they be?
 | 
			
		||||
 */
 | 
			
		||||
static void
 | 
			
		||||
prefs_changed_callback (MetaPreference pref,
 | 
			
		||||
 
 | 
			
		||||
@@ -25,9 +25,7 @@
 | 
			
		||||
 | 
			
		||||
#include <meta/main.h>
 | 
			
		||||
#include <meta/util.h>
 | 
			
		||||
#ifdef HAVE_INTROSPECTION
 | 
			
		||||
#include "meta-plugin-manager.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <glib.h>
 | 
			
		||||
 | 
			
		||||
@@ -47,7 +45,7 @@ print_version (const gchar    *option_name,
 | 
			
		||||
  exit (0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gchar *mutter_plugins;
 | 
			
		||||
static gchar *plugin = "default";
 | 
			
		||||
 | 
			
		||||
GOptionEntry mutter_options[] = {
 | 
			
		||||
  {
 | 
			
		||||
@@ -57,10 +55,10 @@ GOptionEntry mutter_options[] = {
 | 
			
		||||
    NULL
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "mutter-plugins", 0, 0, G_OPTION_ARG_STRING,
 | 
			
		||||
    &mutter_plugins,
 | 
			
		||||
    N_("Comma-separated list of compositor plugins"),
 | 
			
		||||
    "PLUGINS"
 | 
			
		||||
    "mutter-plugin", 0, 0, G_OPTION_ARG_STRING,
 | 
			
		||||
    &plugin,
 | 
			
		||||
    N_("Mutter plugin to use"),
 | 
			
		||||
    "PLUGIN",
 | 
			
		||||
  },
 | 
			
		||||
  { NULL }
 | 
			
		||||
};
 | 
			
		||||
@@ -71,6 +69,8 @@ main (int argc, char **argv)
 | 
			
		||||
  GOptionContext *ctx;
 | 
			
		||||
  GError *error = NULL;
 | 
			
		||||
 | 
			
		||||
  g_type_init ();
 | 
			
		||||
 | 
			
		||||
  ctx = meta_get_option_context ();
 | 
			
		||||
  g_option_context_add_main_entries (ctx, mutter_options, GETTEXT_PACKAGE);
 | 
			
		||||
  if (!g_option_context_parse (ctx, &argc, &argv, &error))
 | 
			
		||||
@@ -79,20 +79,8 @@ main (int argc, char **argv)
 | 
			
		||||
      exit (1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (mutter_plugins)
 | 
			
		||||
    {
 | 
			
		||||
      MetaPluginManager *mgr;
 | 
			
		||||
      char **plugins = g_strsplit (mutter_plugins, ",", -1); 
 | 
			
		||||
      char **plugin;
 | 
			
		||||
 | 
			
		||||
      mgr = meta_plugin_manager_get_default ();
 | 
			
		||||
      for (plugin = plugins; *plugin; plugin++)
 | 
			
		||||
        {
 | 
			
		||||
          g_strstrip (*plugin);
 | 
			
		||||
          meta_plugin_manager_load (mgr, *plugin);
 | 
			
		||||
        }
 | 
			
		||||
      g_strfreev (plugins);
 | 
			
		||||
    }
 | 
			
		||||
  if (plugin)
 | 
			
		||||
    meta_plugin_manager_load (plugin);
 | 
			
		||||
 | 
			
		||||
  meta_init ();
 | 
			
		||||
  return meta_run ();
 | 
			
		||||
 
 | 
			
		||||
@@ -105,7 +105,7 @@ find_next_cascade (MetaWindow *window,
 | 
			
		||||
  int window_width, window_height;
 | 
			
		||||
  int cascade_stage;
 | 
			
		||||
  MetaRectangle work_area;
 | 
			
		||||
  const MetaMonitorInfo* current;
 | 
			
		||||
  int current;
 | 
			
		||||
  
 | 
			
		||||
  sorted = g_list_copy (windows);
 | 
			
		||||
  sorted = g_list_sort (sorted, northwestcmp);
 | 
			
		||||
@@ -137,7 +137,7 @@ find_next_cascade (MetaWindow *window,
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  current = meta_screen_get_current_monitor (window->screen);
 | 
			
		||||
  meta_window_get_work_area_for_monitor (window, current->number, &work_area);
 | 
			
		||||
  meta_window_get_work_area_for_monitor (window, current, &work_area);
 | 
			
		||||
 | 
			
		||||
  cascade_x = MAX (0, work_area.x);
 | 
			
		||||
  cascade_y = MAX (0, work_area.y);
 | 
			
		||||
@@ -815,7 +815,7 @@ meta_window_place (MetaWindow        *window,
 | 
			
		||||
      int w, h;
 | 
			
		||||
 | 
			
		||||
      /* Warning, this function is a round trip! */
 | 
			
		||||
      xi = meta_screen_get_current_monitor (window->screen);
 | 
			
		||||
      xi = meta_screen_get_current_monitor_info (window->screen);
 | 
			
		||||
 | 
			
		||||
      w = xi->rect.width;
 | 
			
		||||
      h = xi->rect.height;
 | 
			
		||||
@@ -860,7 +860,7 @@ meta_window_place (MetaWindow        *window,
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* Warning, this is a round trip! */
 | 
			
		||||
  xi = meta_screen_get_current_monitor (window->screen);
 | 
			
		||||
  xi = meta_screen_get_current_monitor_info (window->screen);
 | 
			
		||||
  
 | 
			
		||||
  /* "Origin" placement algorithm */
 | 
			
		||||
  x = xi->rect.x;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										245
									
								
								src/core/prefs.c
									
									
									
									
									
								
							
							
						
						
									
										245
									
								
								src/core/prefs.c
									
									
									
									
									
								
							@@ -53,7 +53,6 @@
 | 
			
		||||
#define KEY_GNOME_CURSOR_SIZE "cursor-size"
 | 
			
		||||
 | 
			
		||||
#define KEY_OVERLAY_KEY "overlay-key"
 | 
			
		||||
#define KEY_LIVE_HIDDEN_WINDOWS "live-hidden-windows"
 | 
			
		||||
#define KEY_WORKSPACES_ONLY_ON_PRIMARY "workspaces-only-on-primary"
 | 
			
		||||
#define KEY_NO_TAB_POPUP "no-tab-popup"
 | 
			
		||||
 | 
			
		||||
@@ -73,6 +72,7 @@ static GHashTable *settings_schemas;
 | 
			
		||||
static gboolean use_system_font = FALSE;
 | 
			
		||||
static PangoFontDescription *titlebar_font = NULL;
 | 
			
		||||
static MetaVirtualModifier mouse_button_mods = Mod1Mask;
 | 
			
		||||
static MetaKeyCombo overlay_key_combo = { 0, 0, 0 };
 | 
			
		||||
static GDesktopFocusMode focus_mode = G_DESKTOP_FOCUS_MODE_CLICK;
 | 
			
		||||
static GDesktopFocusNewWindows focus_new_windows = G_DESKTOP_FOCUS_NEW_WINDOWS_SMART;
 | 
			
		||||
static gboolean raise_on_click = TRUE;
 | 
			
		||||
@@ -82,10 +82,12 @@ static int num_workspaces = 4;
 | 
			
		||||
static GDesktopTitlebarAction action_double_click_titlebar = G_DESKTOP_TITLEBAR_ACTION_TOGGLE_MAXIMIZE;
 | 
			
		||||
static GDesktopTitlebarAction action_middle_click_titlebar = G_DESKTOP_TITLEBAR_ACTION_LOWER;
 | 
			
		||||
static GDesktopTitlebarAction action_right_click_titlebar = G_DESKTOP_TITLEBAR_ACTION_MENU;
 | 
			
		||||
static gboolean dynamic_workspaces = FALSE;
 | 
			
		||||
static gboolean application_based = FALSE;
 | 
			
		||||
static gboolean disable_workarounds = FALSE;
 | 
			
		||||
static gboolean auto_raise = FALSE;
 | 
			
		||||
static gboolean auto_raise_delay = 500;
 | 
			
		||||
static gboolean focus_change_on_pointer_rest = FALSE;
 | 
			
		||||
static gboolean bell_is_visible = FALSE;
 | 
			
		||||
static gboolean bell_is_audible = TRUE;
 | 
			
		||||
static gboolean gnome_accessibility = FALSE;
 | 
			
		||||
@@ -96,6 +98,7 @@ static int   draggable_border_width = 10;
 | 
			
		||||
static gboolean resize_with_right_button = FALSE;
 | 
			
		||||
static gboolean edge_tiling = FALSE;
 | 
			
		||||
static gboolean force_fullscreen = TRUE;
 | 
			
		||||
static gboolean ignore_request_hide_titlebar = FALSE;
 | 
			
		||||
 | 
			
		||||
static GDesktopVisualBellType visual_bell_type = G_DESKTOP_VISUAL_BELL_FULLSCREEN_FLASH;
 | 
			
		||||
static MetaButtonLayout button_layout;
 | 
			
		||||
@@ -103,7 +106,6 @@ static MetaButtonLayout button_layout;
 | 
			
		||||
/* NULL-terminated array */
 | 
			
		||||
static char **workspace_names = NULL;
 | 
			
		||||
 | 
			
		||||
static gboolean live_hidden_windows = FALSE;
 | 
			
		||||
static gboolean workspaces_only_on_primary = FALSE;
 | 
			
		||||
 | 
			
		||||
static gboolean no_tab_popup = FALSE;
 | 
			
		||||
@@ -132,6 +134,7 @@ static gboolean titlebar_handler (GVariant*, gpointer*, gpointer);
 | 
			
		||||
static gboolean theme_name_handler (GVariant*, gpointer*, gpointer);
 | 
			
		||||
static gboolean mouse_button_mods_handler (GVariant*, gpointer*, gpointer);
 | 
			
		||||
static gboolean button_layout_handler (GVariant*, gpointer*, gpointer);
 | 
			
		||||
static gboolean overlay_key_handler (GVariant*, gpointer*, gpointer);
 | 
			
		||||
 | 
			
		||||
static void     do_override               (char *key, char *schema);
 | 
			
		||||
 | 
			
		||||
@@ -164,36 +167,30 @@ typedef struct
 | 
			
		||||
  gboolean *target;
 | 
			
		||||
} MetaBoolPreference;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * MetaStringPreference:
 | 
			
		||||
 * @handler: (allow-none): A handler. Many of the string preferences
 | 
			
		||||
 * aren't stored as strings and need parsing; others of them have
 | 
			
		||||
 * default values which can't be solved in the general case.  If you
 | 
			
		||||
 * include a function pointer here, it will be called instead of writing
 | 
			
		||||
 * the string value out to the target variable.
 | 
			
		||||
 * The function will be passed to g_settings_get_mapped() and should
 | 
			
		||||
 * return %TRUE if the mapping was successful and %FALSE otherwise.
 | 
			
		||||
 * In the former case the function is expected to handle the result
 | 
			
		||||
 * of the conversion itself and call queue_changed() appropriately;
 | 
			
		||||
 * in particular the @result (out) parameter as returned by
 | 
			
		||||
 * g_settings_get_mapped() will be ignored in all cases.
 | 
			
		||||
 * This may be %NULL.  If it is, see "target", below.
 | 
			
		||||
 * @target: (allow-none): Where to write the incoming string.
 | 
			
		||||
 * This must be %NULL if the handler is non-%NULL.
 | 
			
		||||
 * If the incoming string is %NULL, no change will be made.
 | 
			
		||||
 */
 | 
			
		||||
typedef struct
 | 
			
		||||
{
 | 
			
		||||
  MetaBasePreference base;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * A handler.  Many of the string preferences aren't stored as
 | 
			
		||||
   * strings and need parsing; others of them have default values
 | 
			
		||||
   * which can't be solved in the general case.  If you include a
 | 
			
		||||
   * function pointer here, it will be called instead of writing
 | 
			
		||||
   * the string value out to the target variable.
 | 
			
		||||
   *
 | 
			
		||||
   * The function will be passed to g_settings_get_mapped() and should
 | 
			
		||||
   * return %TRUE if the mapping was successful and %FALSE otherwise.
 | 
			
		||||
   * In the former case the function is expected to handle the result
 | 
			
		||||
   * of the conversion itself and call queue_changed() appropriately;
 | 
			
		||||
   * in particular the @result (out) parameter as returned by
 | 
			
		||||
   * g_settings_get_mapped() will be ignored in all cases.
 | 
			
		||||
   *
 | 
			
		||||
   * This may be NULL.  If it is, see "target", below.
 | 
			
		||||
   */
 | 
			
		||||
  GSettingsGetMapping handler;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Where to write the incoming string.
 | 
			
		||||
   *
 | 
			
		||||
   * This must be NULL if the handler is non-NULL.
 | 
			
		||||
   * If the incoming string is NULL, no change will be made.
 | 
			
		||||
   */
 | 
			
		||||
  gchar **target;
 | 
			
		||||
 | 
			
		||||
} MetaStringPreference;
 | 
			
		||||
 | 
			
		||||
typedef struct
 | 
			
		||||
@@ -280,6 +277,13 @@ static MetaBoolPreference preferences_bool[] =
 | 
			
		||||
      },
 | 
			
		||||
      &use_system_font,
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      { "dynamic-workspaces",
 | 
			
		||||
        SCHEMA_MUTTER,
 | 
			
		||||
        META_PREF_DYNAMIC_WORKSPACES,
 | 
			
		||||
      },
 | 
			
		||||
      &dynamic_workspaces,
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      { "application-based",
 | 
			
		||||
        SCHEMA_GENERAL,
 | 
			
		||||
@@ -301,6 +305,13 @@ static MetaBoolPreference preferences_bool[] =
 | 
			
		||||
      },
 | 
			
		||||
      &auto_raise,
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      { "focus-change-on-pointer-rest",
 | 
			
		||||
        SCHEMA_MUTTER,
 | 
			
		||||
        META_PREF_FOCUS_CHANGE_ON_POINTER_REST,
 | 
			
		||||
      },
 | 
			
		||||
      &focus_change_on_pointer_rest
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      { "visual-bell",
 | 
			
		||||
        SCHEMA_GENERAL,
 | 
			
		||||
@@ -343,13 +354,6 @@ static MetaBoolPreference preferences_bool[] =
 | 
			
		||||
      },
 | 
			
		||||
      &edge_tiling,
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      { KEY_LIVE_HIDDEN_WINDOWS,
 | 
			
		||||
        SCHEMA_MUTTER,
 | 
			
		||||
        META_PREF_LIVE_HIDDEN_WINDOWS,
 | 
			
		||||
      },
 | 
			
		||||
      &live_hidden_windows,
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      { "workspaces-only-on-primary",
 | 
			
		||||
        SCHEMA_MUTTER,
 | 
			
		||||
@@ -409,6 +413,14 @@ static MetaStringPreference preferences_string[] =
 | 
			
		||||
      NULL,
 | 
			
		||||
      &cursor_theme,
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      { "overlay-key",
 | 
			
		||||
        SCHEMA_MUTTER,
 | 
			
		||||
        META_PREF_KEYBINDINGS,
 | 
			
		||||
      },
 | 
			
		||||
      overlay_key_handler,
 | 
			
		||||
      NULL,
 | 
			
		||||
    },
 | 
			
		||||
    { { NULL, 0, 0 }, NULL },
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
@@ -914,6 +926,8 @@ do_override (char *key,
 | 
			
		||||
  detailed_signal = g_strdup_printf ("changed::%s", key);
 | 
			
		||||
  handler_id = g_signal_connect (settings, detailed_signal,
 | 
			
		||||
                                 G_CALLBACK (settings_changed), NULL);
 | 
			
		||||
  g_free (detailed_signal);
 | 
			
		||||
 | 
			
		||||
  g_object_set_data (G_OBJECT (settings), key, GUINT_TO_POINTER (handler_id));
 | 
			
		||||
 | 
			
		||||
  settings_changed (settings, key, NULL);
 | 
			
		||||
@@ -921,9 +935,9 @@ do_override (char *key,
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * meta_prefs_override_preference_schema
 | 
			
		||||
 * meta_prefs_override_preference_schema:
 | 
			
		||||
 * @key: the preference name
 | 
			
		||||
 * @schema: new schema for preference %key
 | 
			
		||||
 * @schema: new schema for preference @key
 | 
			
		||||
 *
 | 
			
		||||
 * Specify a schema whose keys are used to override the standard Metacity
 | 
			
		||||
 * keys. This might be used if a plugin expected a different value for
 | 
			
		||||
@@ -1024,10 +1038,6 @@ settings_changed (GSettings *settings,
 | 
			
		||||
      else
 | 
			
		||||
        handle_preference_update_string (settings, key);
 | 
			
		||||
    }
 | 
			
		||||
  else if (g_str_equal (key, KEY_OVERLAY_KEY))
 | 
			
		||||
    {
 | 
			
		||||
      queue_changed (META_PREF_KEYBINDINGS);
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      /* Someone added a preference of an unhandled type */
 | 
			
		||||
@@ -1052,6 +1062,8 @@ bindings_changed (GSettings *settings,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * maybe_give_disable_workaround_warning:
 | 
			
		||||
 *
 | 
			
		||||
 * Special case: give a warning the first time disable_workarounds
 | 
			
		||||
 * is turned on.
 | 
			
		||||
 */
 | 
			
		||||
@@ -1481,6 +1493,39 @@ button_layout_handler (GVariant *value,
 | 
			
		||||
  return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
overlay_key_handler (GVariant *value,
 | 
			
		||||
                     gpointer *result,
 | 
			
		||||
                     gpointer  data)
 | 
			
		||||
{
 | 
			
		||||
  MetaKeyCombo combo;
 | 
			
		||||
  const gchar *string_value;
 | 
			
		||||
 | 
			
		||||
  *result = NULL; /* ignored */
 | 
			
		||||
  string_value = g_variant_get_string (value, NULL);
 | 
			
		||||
 | 
			
		||||
  if (string_value && meta_ui_parse_accelerator (string_value, &combo.keysym,
 | 
			
		||||
                                                 &combo.keycode,
 | 
			
		||||
                                                 &combo.modifiers))
 | 
			
		||||
    ;
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      meta_topic (META_DEBUG_KEYBINDINGS,
 | 
			
		||||
                  "Failed to parse value for overlay-key\n");
 | 
			
		||||
      return FALSE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (overlay_key_combo.keysym != combo.keysym ||
 | 
			
		||||
      overlay_key_combo.keycode != combo.keycode ||
 | 
			
		||||
      overlay_key_combo.modifiers != combo.modifiers)
 | 
			
		||||
    {
 | 
			
		||||
      overlay_key_combo = combo;
 | 
			
		||||
      queue_changed (META_PREF_KEYBINDINGS);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const PangoFontDescription*
 | 
			
		||||
meta_prefs_get_titlebar_font (void)
 | 
			
		||||
{
 | 
			
		||||
@@ -1496,6 +1541,12 @@ meta_prefs_get_num_workspaces (void)
 | 
			
		||||
  return num_workspaces;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
gboolean
 | 
			
		||||
meta_prefs_get_dynamic_workspaces (void)
 | 
			
		||||
{
 | 
			
		||||
  return dynamic_workspaces;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
gboolean
 | 
			
		||||
meta_prefs_get_application_based (void)
 | 
			
		||||
{
 | 
			
		||||
@@ -1565,6 +1616,9 @@ meta_preference_to_string (MetaPreference pref)
 | 
			
		||||
    case META_PREF_AUTO_RAISE_DELAY:
 | 
			
		||||
      return "AUTO_RAISE_DELAY";
 | 
			
		||||
 | 
			
		||||
    case META_PREF_FOCUS_CHANGE_ON_POINTER_REST:
 | 
			
		||||
      return "FOCUS_CHANGE_ON_POINTER_REST";
 | 
			
		||||
 | 
			
		||||
    case META_PREF_BUTTON_LAYOUT:
 | 
			
		||||
      return "BUTTON_LAYOUT";
 | 
			
		||||
 | 
			
		||||
@@ -1601,9 +1655,6 @@ meta_preference_to_string (MetaPreference pref)
 | 
			
		||||
    case META_PREF_FORCE_FULLSCREEN:
 | 
			
		||||
      return "FORCE_FULLSCREEN";
 | 
			
		||||
 | 
			
		||||
    case META_PREF_LIVE_HIDDEN_WINDOWS:
 | 
			
		||||
      return "LIVE_HIDDEN_WINDOWS";
 | 
			
		||||
 | 
			
		||||
    case META_PREF_WORKSPACES_ONLY_ON_PRIMARY:
 | 
			
		||||
      return "WORKSPACES_ONLY_ON_PRIMARY";
 | 
			
		||||
 | 
			
		||||
@@ -1612,6 +1663,9 @@ meta_preference_to_string (MetaPreference pref)
 | 
			
		||||
 | 
			
		||||
    case META_PREF_DRAGGABLE_BORDER_WIDTH:
 | 
			
		||||
      return "DRAGGABLE_BORDER_WIDTH";
 | 
			
		||||
 | 
			
		||||
    case META_PREF_DYNAMIC_WORKSPACES:
 | 
			
		||||
      return "DYNAMIC_WORKSPACES";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return "(unknown)";
 | 
			
		||||
@@ -1633,50 +1687,23 @@ meta_prefs_set_num_workspaces (int n_workspaces)
 | 
			
		||||
 | 
			
		||||
static GHashTable *key_bindings;
 | 
			
		||||
 | 
			
		||||
static MetaKeyCombo overlay_key_combo = { 0, 0, 0 };
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
meta_key_pref_free (MetaKeyPref *pref)
 | 
			
		||||
{
 | 
			
		||||
  update_binding (pref, NULL);
 | 
			
		||||
 | 
			
		||||
  g_free (pref->name);
 | 
			
		||||
  g_free (pref->schema);
 | 
			
		||||
  g_object_unref (pref->settings);
 | 
			
		||||
 | 
			
		||||
  g_free (pref);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* These bindings are for modifiers alone, so they need special handling */
 | 
			
		||||
static void
 | 
			
		||||
init_special_bindings (void)
 | 
			
		||||
{
 | 
			
		||||
  char *val;
 | 
			
		||||
  
 | 
			
		||||
  /* Default values for bindings which are global, but take special handling */
 | 
			
		||||
  meta_ui_parse_accelerator ("Super_L", &overlay_key_combo.keysym, 
 | 
			
		||||
                             &overlay_key_combo.keycode, 
 | 
			
		||||
                             &overlay_key_combo.modifiers);
 | 
			
		||||
 | 
			
		||||
  val = g_settings_get_string (SETTINGS (SCHEMA_MUTTER), KEY_OVERLAY_KEY);
 | 
			
		||||
    
 | 
			
		||||
  if (val && meta_ui_parse_accelerator (val, &overlay_key_combo.keysym, 
 | 
			
		||||
                                        &overlay_key_combo.keycode, 
 | 
			
		||||
                                        &overlay_key_combo.modifiers))
 | 
			
		||||
    ;
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      meta_topic (META_DEBUG_KEYBINDINGS,
 | 
			
		||||
                  "Failed to parse value for overlay_key\n");
 | 
			
		||||
    }
 | 
			
		||||
  g_free (val);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
init_bindings (void)
 | 
			
		||||
{
 | 
			
		||||
  key_bindings = g_hash_table_new_full (g_str_hash, g_str_equal, g_free,
 | 
			
		||||
                                        (GDestroyNotify)meta_key_pref_free);
 | 
			
		||||
  init_special_bindings ();  
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
@@ -1901,13 +1928,13 @@ meta_prefs_get_visual_bell_type (void)
 | 
			
		||||
 | 
			
		||||
gboolean
 | 
			
		||||
meta_prefs_add_keybinding (const char           *name,
 | 
			
		||||
                           const char           *schema,
 | 
			
		||||
                           GSettings            *settings,
 | 
			
		||||
                           MetaKeyBindingAction  action,
 | 
			
		||||
                           MetaKeyBindingFlags   flags)
 | 
			
		||||
{
 | 
			
		||||
  MetaKeyPref  *pref;
 | 
			
		||||
  GSettings    *settings;
 | 
			
		||||
  char        **strokes;
 | 
			
		||||
  guint         id;
 | 
			
		||||
 | 
			
		||||
  if (g_hash_table_lookup (key_bindings, name))
 | 
			
		||||
    {
 | 
			
		||||
@@ -1915,19 +1942,9 @@ meta_prefs_add_keybinding (const char           *name,
 | 
			
		||||
      return FALSE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  settings = SETTINGS (schema);
 | 
			
		||||
  if (settings == NULL)
 | 
			
		||||
    {
 | 
			
		||||
      settings = g_settings_new (schema);
 | 
			
		||||
      if ((flags & META_KEY_BINDING_BUILTIN) != 0)
 | 
			
		||||
        g_signal_connect (settings, "changed",
 | 
			
		||||
                          G_CALLBACK (bindings_changed), NULL);
 | 
			
		||||
      g_hash_table_insert (settings_schemas, g_strdup (schema), settings);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  pref = g_new0 (MetaKeyPref, 1);
 | 
			
		||||
  pref->name = g_strdup (name);
 | 
			
		||||
  pref->schema = g_strdup (schema);
 | 
			
		||||
  pref->settings = g_object_ref (settings);
 | 
			
		||||
  pref->action = action;
 | 
			
		||||
  pref->bindings = NULL;
 | 
			
		||||
  pref->add_shift = (flags & META_KEY_BINDING_REVERSES) != 0;
 | 
			
		||||
@@ -1940,9 +1957,17 @@ meta_prefs_add_keybinding (const char           *name,
 | 
			
		||||
 | 
			
		||||
  g_hash_table_insert (key_bindings, g_strdup (name), pref);
 | 
			
		||||
 | 
			
		||||
  if (!pref->builtin)
 | 
			
		||||
  if (pref->builtin)
 | 
			
		||||
    {
 | 
			
		||||
      if (g_object_get_data (G_OBJECT (settings), "changed-signal") == NULL)
 | 
			
		||||
        {
 | 
			
		||||
          id = g_signal_connect (settings, "changed",
 | 
			
		||||
                                 G_CALLBACK (bindings_changed), NULL);
 | 
			
		||||
          g_object_set_data (G_OBJECT (settings), "changed-signal", GUINT_TO_POINTER (id));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      guint id;
 | 
			
		||||
      char *changed_signal = g_strdup_printf ("changed::%s", name);
 | 
			
		||||
      id = g_signal_connect (settings, changed_signal,
 | 
			
		||||
                             G_CALLBACK (bindings_changed), NULL);
 | 
			
		||||
@@ -1960,7 +1985,6 @@ gboolean
 | 
			
		||||
meta_prefs_remove_keybinding (const char *name)
 | 
			
		||||
{
 | 
			
		||||
  MetaKeyPref *pref;
 | 
			
		||||
  GSettings   *settings;
 | 
			
		||||
  guint        id;
 | 
			
		||||
 | 
			
		||||
  pref = g_hash_table_lookup (key_bindings, name);
 | 
			
		||||
@@ -1976,9 +2000,8 @@ meta_prefs_remove_keybinding (const char *name)
 | 
			
		||||
      return FALSE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  settings = SETTINGS (pref->schema);
 | 
			
		||||
  id = GPOINTER_TO_UINT (g_object_steal_data (G_OBJECT (settings), name));
 | 
			
		||||
  g_signal_handler_disconnect (settings, id);
 | 
			
		||||
  id = GPOINTER_TO_UINT (g_object_steal_data (G_OBJECT (pref->settings), name));
 | 
			
		||||
  g_signal_handler_disconnect (pref->settings, id);
 | 
			
		||||
 | 
			
		||||
  g_hash_table_remove (key_bindings, name);
 | 
			
		||||
 | 
			
		||||
@@ -1989,7 +2012,8 @@ meta_prefs_remove_keybinding (const char *name)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * meta_prefs_get_keybindings:
 | 
			
		||||
 * Return: (element-type MetaKeyPref) (transfer container):
 | 
			
		||||
 *
 | 
			
		||||
 * Returns: (element-type MetaKeyPref) (transfer container):
 | 
			
		||||
 */
 | 
			
		||||
GList *
 | 
			
		||||
meta_prefs_get_keybindings ()
 | 
			
		||||
@@ -2033,6 +2057,12 @@ meta_prefs_get_auto_raise_delay (void)
 | 
			
		||||
  return auto_raise_delay;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
gboolean
 | 
			
		||||
meta_prefs_get_focus_change_on_pointer_rest ()
 | 
			
		||||
{
 | 
			
		||||
  return focus_change_on_pointer_rest;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
gboolean
 | 
			
		||||
meta_prefs_get_gnome_accessibility ()
 | 
			
		||||
{
 | 
			
		||||
@@ -2115,27 +2145,6 @@ meta_prefs_get_force_fullscreen (void)
 | 
			
		||||
  return force_fullscreen;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
gboolean
 | 
			
		||||
meta_prefs_get_live_hidden_windows (void)
 | 
			
		||||
{
 | 
			
		||||
#if 0
 | 
			
		||||
  return live_hidden_windows;
 | 
			
		||||
#else
 | 
			
		||||
  return TRUE;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
meta_prefs_set_live_hidden_windows (gboolean whether)
 | 
			
		||||
{
 | 
			
		||||
  MetaBasePreference *pref;
 | 
			
		||||
 | 
			
		||||
  find_pref (preferences_bool, sizeof(MetaBoolPreference),
 | 
			
		||||
             KEY_LIVE_HIDDEN_WINDOWS, &pref);
 | 
			
		||||
  g_settings_set_boolean (SETTINGS (pref->schema), KEY_LIVE_HIDDEN_WINDOWS,
 | 
			
		||||
                          whether);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
gboolean
 | 
			
		||||
meta_prefs_get_workspaces_only_on_primary (void)
 | 
			
		||||
{
 | 
			
		||||
@@ -2170,3 +2179,15 @@ meta_prefs_set_force_fullscreen (gboolean whether)
 | 
			
		||||
{
 | 
			
		||||
  force_fullscreen = whether;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
gboolean
 | 
			
		||||
meta_prefs_get_ignore_request_hide_titlebar (void)
 | 
			
		||||
{
 | 
			
		||||
  return ignore_request_hide_titlebar;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
meta_prefs_set_ignore_request_hide_titlebar (gboolean whether)
 | 
			
		||||
{
 | 
			
		||||
  ignore_request_hide_titlebar = whether;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -156,8 +156,6 @@ void          meta_screen_manage_all_windows  (MetaScreen                 *scree
 | 
			
		||||
void          meta_screen_foreach_window      (MetaScreen                 *screen,
 | 
			
		||||
                                               MetaScreenWindowFunc        func,
 | 
			
		||||
                                               gpointer                    data);
 | 
			
		||||
void          meta_screen_queue_frame_redraws (MetaScreen                 *screen);
 | 
			
		||||
void          meta_screen_queue_window_resizes (MetaScreen                 *screen);
 | 
			
		||||
 | 
			
		||||
void          meta_screen_set_cursor          (MetaScreen                 *screen,
 | 
			
		||||
                                               MetaCursor                  cursor);
 | 
			
		||||
@@ -186,7 +184,7 @@ void          meta_screen_tile_preview_hide            (MetaScreen    *screen);
 | 
			
		||||
MetaWindow*   meta_screen_get_mouse_window     (MetaScreen                 *screen,
 | 
			
		||||
                                                MetaWindow                 *not_this_one);
 | 
			
		||||
 | 
			
		||||
const MetaMonitorInfo* meta_screen_get_current_monitor    (MetaScreen    *screen);
 | 
			
		||||
const MetaMonitorInfo* meta_screen_get_current_monitor_info   (MetaScreen    *screen);
 | 
			
		||||
const MetaMonitorInfo* meta_screen_get_monitor_for_rect   (MetaScreen    *screen,
 | 
			
		||||
                                                           MetaRectangle *rect);
 | 
			
		||||
const MetaMonitorInfo* meta_screen_get_monitor_for_window (MetaScreen    *screen,
 | 
			
		||||
 
 | 
			
		||||
@@ -39,15 +39,10 @@
 | 
			
		||||
#include "stack.h"
 | 
			
		||||
#include "xprops.h"
 | 
			
		||||
#include <meta/compositor.h>
 | 
			
		||||
#include "mutter-marshal.h"
 | 
			
		||||
#include "mutter-enum-types.h"
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_SOLARIS_XINERAMA
 | 
			
		||||
#include <X11/extensions/xinerama.h>
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef HAVE_XFREE_XINERAMA
 | 
			
		||||
#include <X11/extensions/Xinerama.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_RANDR
 | 
			
		||||
#include <X11/extensions/Xrandr.h>
 | 
			
		||||
#endif
 | 
			
		||||
@@ -84,7 +79,6 @@ enum
 | 
			
		||||
enum
 | 
			
		||||
{
 | 
			
		||||
  RESTACKED,
 | 
			
		||||
  TOGGLE_RECORDING,
 | 
			
		||||
  WORKSPACE_ADDED,
 | 
			
		||||
  WORKSPACE_REMOVED,
 | 
			
		||||
  WORKSPACE_SWITCHED,
 | 
			
		||||
@@ -162,8 +156,7 @@ meta_screen_class_init (MetaScreenClass *klass)
 | 
			
		||||
                  G_TYPE_FROM_CLASS (object_class),
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  G_STRUCT_OFFSET (MetaScreenClass, restacked),
 | 
			
		||||
                  NULL, NULL,
 | 
			
		||||
                  g_cclosure_marshal_VOID__VOID,
 | 
			
		||||
                  NULL, NULL, NULL,
 | 
			
		||||
                  G_TYPE_NONE, 0);
 | 
			
		||||
 | 
			
		||||
  pspec = g_param_spec_int ("n-workspaces",
 | 
			
		||||
@@ -177,8 +170,7 @@ meta_screen_class_init (MetaScreenClass *klass)
 | 
			
		||||
                  G_TYPE_FROM_CLASS (klass),
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  0,
 | 
			
		||||
                  NULL, NULL,
 | 
			
		||||
                  g_cclosure_marshal_VOID__INT,
 | 
			
		||||
                  NULL, NULL, NULL,
 | 
			
		||||
                  G_TYPE_NONE,
 | 
			
		||||
                  1,
 | 
			
		||||
                  G_TYPE_INT);
 | 
			
		||||
@@ -188,8 +180,7 @@ meta_screen_class_init (MetaScreenClass *klass)
 | 
			
		||||
                  G_TYPE_FROM_CLASS (klass),
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  0,
 | 
			
		||||
                  NULL, NULL,
 | 
			
		||||
                  g_cclosure_marshal_VOID__INT,
 | 
			
		||||
                  NULL, NULL, NULL,
 | 
			
		||||
                  G_TYPE_NONE,
 | 
			
		||||
                  1,
 | 
			
		||||
                  G_TYPE_INT);
 | 
			
		||||
@@ -199,21 +190,19 @@ meta_screen_class_init (MetaScreenClass *klass)
 | 
			
		||||
                  G_TYPE_FROM_CLASS (klass),
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  0,
 | 
			
		||||
                  NULL, NULL,
 | 
			
		||||
                  _mutter_marshal_VOID__INT_INT_ENUM,
 | 
			
		||||
                  NULL, NULL, NULL,
 | 
			
		||||
                  G_TYPE_NONE,
 | 
			
		||||
                  3,
 | 
			
		||||
                  G_TYPE_INT,
 | 
			
		||||
                  G_TYPE_INT,
 | 
			
		||||
                  MUTTER_TYPE_MOTION_DIRECTION);
 | 
			
		||||
                  META_TYPE_MOTION_DIRECTION);
 | 
			
		||||
 | 
			
		||||
  screen_signals[WINDOW_ENTERED_MONITOR] =
 | 
			
		||||
    g_signal_new ("window-entered-monitor",
 | 
			
		||||
                  G_TYPE_FROM_CLASS (klass),
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  0,
 | 
			
		||||
                  NULL, NULL,
 | 
			
		||||
                  _mutter_marshal_VOID__INT_OBJECT,
 | 
			
		||||
                  NULL, NULL, NULL,
 | 
			
		||||
                  G_TYPE_NONE, 2,
 | 
			
		||||
                  G_TYPE_INT,
 | 
			
		||||
                  META_TYPE_WINDOW);
 | 
			
		||||
@@ -223,8 +212,7 @@ meta_screen_class_init (MetaScreenClass *klass)
 | 
			
		||||
                  G_TYPE_FROM_CLASS (klass),
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  0,
 | 
			
		||||
                  NULL, NULL,
 | 
			
		||||
                  _mutter_marshal_VOID__INT_OBJECT,
 | 
			
		||||
                  NULL, NULL, NULL,
 | 
			
		||||
                  G_TYPE_NONE, 2,
 | 
			
		||||
                  G_TYPE_INT,
 | 
			
		||||
                  META_TYPE_WINDOW);
 | 
			
		||||
@@ -234,26 +222,15 @@ meta_screen_class_init (MetaScreenClass *klass)
 | 
			
		||||
                  G_TYPE_FROM_CLASS (klass),
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  0,
 | 
			
		||||
                  NULL, NULL,
 | 
			
		||||
                  g_cclosure_marshal_VOID__POINTER,
 | 
			
		||||
                  NULL, NULL, NULL,
 | 
			
		||||
                  G_TYPE_NONE, 1, G_TYPE_POINTER);
 | 
			
		||||
 | 
			
		||||
  screen_signals[TOGGLE_RECORDING] =
 | 
			
		||||
    g_signal_new ("toggle-recording",
 | 
			
		||||
                  G_TYPE_FROM_CLASS (klass),
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  0,
 | 
			
		||||
                  NULL, NULL,
 | 
			
		||||
                  g_cclosure_marshal_VOID__VOID,
 | 
			
		||||
                  G_TYPE_NONE, 0);
 | 
			
		||||
 | 
			
		||||
  screen_signals[WORKAREAS_CHANGED] =
 | 
			
		||||
    g_signal_new ("workareas-changed",
 | 
			
		||||
                  G_TYPE_FROM_CLASS (object_class),
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  G_STRUCT_OFFSET (MetaScreenClass, workareas_changed),
 | 
			
		||||
                  NULL, NULL,
 | 
			
		||||
                  g_cclosure_marshal_VOID__VOID,
 | 
			
		||||
                  NULL, NULL, NULL,
 | 
			
		||||
                  G_TYPE_NONE, 0);
 | 
			
		||||
 | 
			
		||||
  screen_signals[MONITORS_CHANGED] =
 | 
			
		||||
@@ -261,8 +238,7 @@ meta_screen_class_init (MetaScreenClass *klass)
 | 
			
		||||
		  G_TYPE_FROM_CLASS (object_class),
 | 
			
		||||
		  G_SIGNAL_RUN_LAST,
 | 
			
		||||
		  G_STRUCT_OFFSET (MetaScreenClass, monitors_changed),
 | 
			
		||||
		  NULL, NULL,
 | 
			
		||||
		  g_cclosure_marshal_VOID__VOID,
 | 
			
		||||
          NULL, NULL, NULL,
 | 
			
		||||
		  G_TYPE_NONE, 0);
 | 
			
		||||
 | 
			
		||||
  g_object_class_install_property (object_class,
 | 
			
		||||
@@ -498,7 +474,6 @@ reload_monitor_infos (MetaScreen *screen)
 | 
			
		||||
      screen->monitor_infos[1].rect.width = screen->rect.width / 2;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_XFREE_XINERAMA
 | 
			
		||||
  if (screen->n_monitor_infos == 0 &&
 | 
			
		||||
      XineramaIsActive (display->xdisplay))
 | 
			
		||||
    {
 | 
			
		||||
@@ -568,74 +543,10 @@ reload_monitor_infos (MetaScreen *screen)
 | 
			
		||||
  else if (screen->n_monitor_infos > 0)
 | 
			
		||||
    {
 | 
			
		||||
      meta_topic (META_DEBUG_XINERAMA,
 | 
			
		||||
                  "No XFree86 Xinerama extension or XFree86 Xinerama inactive on display %s\n",
 | 
			
		||||
                  "No Xinerama extension or Xinerama inactive on display %s\n",
 | 
			
		||||
                  display->name);
 | 
			
		||||
    }
 | 
			
		||||
#else
 | 
			
		||||
  meta_topic (META_DEBUG_XINERAMA,
 | 
			
		||||
              "Mutter compiled without XFree86 Xinerama support\n");
 | 
			
		||||
#endif /* HAVE_XFREE_XINERAMA */
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_SOLARIS_XINERAMA
 | 
			
		||||
  /* This code from GDK, Copyright (C) 2002 Sun Microsystems */
 | 
			
		||||
  if (screen->n_monitor_infos == 0 &&
 | 
			
		||||
      XineramaGetState (screen->display->xdisplay,
 | 
			
		||||
                        screen->number))
 | 
			
		||||
    {
 | 
			
		||||
      XRectangle monitors[MAXFRAMEBUFFERS];
 | 
			
		||||
      unsigned char hints[16];
 | 
			
		||||
      int result;
 | 
			
		||||
      int n_monitors;
 | 
			
		||||
      int i;
 | 
			
		||||
 | 
			
		||||
      n_monitors = 0;
 | 
			
		||||
      result = XineramaGetInfo (screen->display->xdisplay,
 | 
			
		||||
                                screen->number,
 | 
			
		||||
				monitors, hints,
 | 
			
		||||
                                &n_monitors);
 | 
			
		||||
      /* Yes I know it should be Success but the current implementation 
 | 
			
		||||
       * returns the num of monitor
 | 
			
		||||
       */
 | 
			
		||||
      if (result > 0)
 | 
			
		||||
	{
 | 
			
		||||
          g_assert (n_monitors > 0);
 | 
			
		||||
          
 | 
			
		||||
          screen->monitor_infos = g_new0 (MetaMonitorInfo, n_monitors);
 | 
			
		||||
          screen->n_monitor_infos = n_monitors;
 | 
			
		||||
          
 | 
			
		||||
          i = 0;
 | 
			
		||||
          while (i < n_monitors)
 | 
			
		||||
            {
 | 
			
		||||
              screen->monitor_infos[i].number = i;
 | 
			
		||||
              screen->monitor_infos[i].rect.x = monitors[i].x;
 | 
			
		||||
              screen->monitor_infos[i].rect.y = monitors[i].y;
 | 
			
		||||
              screen->monitor_infos[i].rect.width = monitors[i].width;
 | 
			
		||||
              screen->monitor_infos[i].rect.height = monitors[i].height;
 | 
			
		||||
 | 
			
		||||
              meta_topic (META_DEBUG_XINERAMA,
 | 
			
		||||
                          "Monitor %d is %d,%d %d x %d\n",
 | 
			
		||||
                          screen->monitor_infos[i].number,
 | 
			
		||||
                          screen->monitor_infos[i].rect.x,
 | 
			
		||||
                          screen->monitor_infos[i].rect.y,
 | 
			
		||||
                          screen->monitor_infos[i].rect.width,
 | 
			
		||||
                          screen->monitor_infos[i].rect.height);              
 | 
			
		||||
              
 | 
			
		||||
              ++i;
 | 
			
		||||
            }
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
  else if (screen->n_monitor_infos == 0)
 | 
			
		||||
    {
 | 
			
		||||
      meta_topic (META_DEBUG_XINERAMA,
 | 
			
		||||
                  "No Solaris Xinerama extension or Solaris Xinerama inactive on display %s\n",
 | 
			
		||||
                  display->name);
 | 
			
		||||
    }
 | 
			
		||||
#else
 | 
			
		||||
  meta_topic (META_DEBUG_XINERAMA,
 | 
			
		||||
              "Mutter compiled without Solaris Xinerama support\n");
 | 
			
		||||
#endif /* HAVE_SOLARIS_XINERAMA */
 | 
			
		||||
 | 
			
		||||
  
 | 
			
		||||
  /* If no Xinerama, fill in the single screen info so
 | 
			
		||||
   * we can use the field unconditionally
 | 
			
		||||
   */
 | 
			
		||||
@@ -1184,7 +1095,9 @@ prefs_changed_callback (MetaPreference pref,
 | 
			
		||||
{
 | 
			
		||||
  MetaScreen *screen = data;
 | 
			
		||||
  
 | 
			
		||||
  if (pref == META_PREF_NUM_WORKSPACES)
 | 
			
		||||
  if ((pref == META_PREF_NUM_WORKSPACES ||
 | 
			
		||||
       pref == META_PREF_DYNAMIC_WORKSPACES) &&
 | 
			
		||||
      !meta_prefs_get_dynamic_workspaces ())
 | 
			
		||||
    {
 | 
			
		||||
      /* GSettings doesn't provide timestamps, but luckily update_num_workspaces
 | 
			
		||||
       * often doesn't need it...
 | 
			
		||||
@@ -1303,31 +1216,6 @@ meta_screen_foreach_window (MetaScreen *screen,
 | 
			
		||||
  g_slist_free (winlist);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
queue_draw (MetaScreen *screen, MetaWindow *window, gpointer data)
 | 
			
		||||
{
 | 
			
		||||
  if (window->frame)
 | 
			
		||||
    meta_frame_queue_draw (window->frame);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
meta_screen_queue_frame_redraws (MetaScreen *screen)
 | 
			
		||||
{
 | 
			
		||||
  meta_screen_foreach_window (screen, queue_draw, NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
queue_resize (MetaScreen *screen, MetaWindow *window, gpointer data)
 | 
			
		||||
{
 | 
			
		||||
  meta_window_queue (window, META_QUEUE_MOVE_RESIZE);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
meta_screen_queue_window_resizes (MetaScreen *screen)
 | 
			
		||||
{
 | 
			
		||||
  meta_screen_foreach_window (screen, queue_resize, NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
meta_screen_get_n_workspaces (MetaScreen *screen)
 | 
			
		||||
{
 | 
			
		||||
@@ -1494,12 +1382,14 @@ meta_screen_remove_workspace (MetaScreen *screen, MetaWorkspace *workspace,
 | 
			
		||||
  new_num = g_list_length (screen->workspaces);
 | 
			
		||||
 | 
			
		||||
  set_number_of_spaces_hint (screen, new_num);
 | 
			
		||||
  meta_prefs_set_num_workspaces (new_num);
 | 
			
		||||
 | 
			
		||||
  if (!meta_prefs_get_dynamic_workspaces ())
 | 
			
		||||
    meta_prefs_set_num_workspaces (new_num);
 | 
			
		||||
 | 
			
		||||
  /* If deleting a workspace before the current workspace, the active
 | 
			
		||||
   * workspace index changes, so we need to update that hint */
 | 
			
		||||
  if (active_index_changed)
 | 
			
		||||
      meta_screen_set_active_workspace_hint (workspace->screen);
 | 
			
		||||
      meta_screen_set_active_workspace_hint (screen);
 | 
			
		||||
 | 
			
		||||
  l = next;
 | 
			
		||||
  while (l)
 | 
			
		||||
@@ -1549,7 +1439,9 @@ meta_screen_append_new_workspace (MetaScreen *screen, gboolean activate,
 | 
			
		||||
  new_num = g_list_length (screen->workspaces);
 | 
			
		||||
 | 
			
		||||
  set_number_of_spaces_hint (screen, new_num);
 | 
			
		||||
  meta_prefs_set_num_workspaces (new_num);
 | 
			
		||||
 | 
			
		||||
  if (!meta_prefs_get_dynamic_workspaces ())
 | 
			
		||||
    meta_prefs_set_num_workspaces (new_num);
 | 
			
		||||
 | 
			
		||||
  meta_screen_queue_workarea_recalc (screen);
 | 
			
		||||
 | 
			
		||||
@@ -1565,7 +1457,7 @@ static void
 | 
			
		||||
update_num_workspaces (MetaScreen *screen,
 | 
			
		||||
                       guint32     timestamp)
 | 
			
		||||
{
 | 
			
		||||
  int new_num;
 | 
			
		||||
  int new_num, old_num;
 | 
			
		||||
  GList *tmp;
 | 
			
		||||
  int i;
 | 
			
		||||
  GList *extras;
 | 
			
		||||
@@ -1595,6 +1487,7 @@ update_num_workspaces (MetaScreen *screen,
 | 
			
		||||
      ++i;
 | 
			
		||||
      tmp = tmp->next;
 | 
			
		||||
    }
 | 
			
		||||
  old_num = i;
 | 
			
		||||
 | 
			
		||||
  g_assert (last_remaining);
 | 
			
		||||
  
 | 
			
		||||
@@ -1629,22 +1522,22 @@ update_num_workspaces (MetaScreen *screen,
 | 
			
		||||
 | 
			
		||||
      g_assert (w->windows == NULL);
 | 
			
		||||
      meta_workspace_remove (w);
 | 
			
		||||
      
 | 
			
		||||
 | 
			
		||||
      tmp = tmp->next;
 | 
			
		||||
    }
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  g_list_free (extras);
 | 
			
		||||
  
 | 
			
		||||
  while (i < new_num)
 | 
			
		||||
    {
 | 
			
		||||
      meta_workspace_new (screen);
 | 
			
		||||
      ++i;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  for (i = old_num; i < new_num; i++)
 | 
			
		||||
    meta_workspace_new (screen);
 | 
			
		||||
 | 
			
		||||
  set_number_of_spaces_hint (screen, new_num);
 | 
			
		||||
 | 
			
		||||
  meta_screen_queue_workarea_recalc (screen);
 | 
			
		||||
 | 
			
		||||
  for (i = old_num; i < new_num; i++)
 | 
			
		||||
    g_signal_emit (screen, screen_signals[WORKSPACE_ADDED], 0, i);
 | 
			
		||||
 | 
			
		||||
  g_object_notify (G_OBJECT (screen), "n-workspaces");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -1935,7 +1828,6 @@ meta_screen_tile_preview_update_timeout (gpointer data)
 | 
			
		||||
{
 | 
			
		||||
  MetaScreen *screen = data;
 | 
			
		||||
  MetaWindow *window = screen->display->grab_window;
 | 
			
		||||
  gboolean composited = screen->display->compositor != NULL;
 | 
			
		||||
  gboolean needs_preview = FALSE;
 | 
			
		||||
 | 
			
		||||
  screen->tile_preview_timeout_id = 0;
 | 
			
		||||
@@ -1945,8 +1837,7 @@ meta_screen_tile_preview_update_timeout (gpointer data)
 | 
			
		||||
      Window xwindow;
 | 
			
		||||
      gulong create_serial;
 | 
			
		||||
 | 
			
		||||
      screen->tile_preview = meta_tile_preview_new (screen->number,
 | 
			
		||||
                                                    composited);
 | 
			
		||||
      screen->tile_preview = meta_tile_preview_new (screen->number);
 | 
			
		||||
      xwindow = meta_tile_preview_get_xwindow (screen->tile_preview,
 | 
			
		||||
                                               &create_serial);
 | 
			
		||||
      meta_stack_tracker_record_add (screen->stack_tracker,
 | 
			
		||||
@@ -2163,7 +2054,7 @@ meta_screen_get_natural_monitor_list (MetaScreen *screen,
 | 
			
		||||
      visited[i] = FALSE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  current = meta_screen_get_current_monitor (screen);
 | 
			
		||||
  current = meta_screen_get_current_monitor_info (screen);
 | 
			
		||||
  monitor_queue = g_queue_new ();
 | 
			
		||||
  g_queue_push_tail (monitor_queue, (gpointer) current);
 | 
			
		||||
  visited[current->number] = TRUE;
 | 
			
		||||
@@ -2230,10 +2121,26 @@ meta_screen_get_natural_monitor_list (MetaScreen *screen,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const MetaMonitorInfo*
 | 
			
		||||
meta_screen_get_current_monitor_info (MetaScreen *screen)
 | 
			
		||||
{
 | 
			
		||||
    int monitor_index;
 | 
			
		||||
    monitor_index = meta_screen_get_current_monitor (screen);
 | 
			
		||||
    return &screen->monitor_infos[monitor_index];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * meta_screen_get_current_monitor:
 | 
			
		||||
 * @screen: a #MetaScreen
 | 
			
		||||
 *
 | 
			
		||||
 * Gets the index of the monitor that currently has the mouse pointer.
 | 
			
		||||
 *
 | 
			
		||||
 * Return value: a monitor index
 | 
			
		||||
 */
 | 
			
		||||
int
 | 
			
		||||
meta_screen_get_current_monitor (MetaScreen *screen)
 | 
			
		||||
{
 | 
			
		||||
  if (screen->n_monitor_infos == 1)
 | 
			
		||||
    return &screen->monitor_infos[0];
 | 
			
		||||
    return 0;
 | 
			
		||||
  
 | 
			
		||||
  /* Sadly, we have to do it this way. Yuck.
 | 
			
		||||
   */
 | 
			
		||||
@@ -2275,7 +2182,7 @@ meta_screen_get_current_monitor (MetaScreen *screen)
 | 
			
		||||
                  screen->last_monitor_index);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return &screen->monitor_infos[screen->last_monitor_index];
 | 
			
		||||
  return screen->last_monitor_index;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -2971,6 +2878,22 @@ meta_screen_resize (MetaScreen *screen,
 | 
			
		||||
  reload_monitor_infos (screen);
 | 
			
		||||
  set_desktop_geometry_hint (screen);
 | 
			
		||||
 | 
			
		||||
  /* Resize the guard window to fill the screen again. */
 | 
			
		||||
  if (screen->guard_window != None)
 | 
			
		||||
    {
 | 
			
		||||
      XWindowChanges changes;
 | 
			
		||||
 | 
			
		||||
      changes.x = 0;
 | 
			
		||||
      changes.y = 0;
 | 
			
		||||
      changes.width = width;
 | 
			
		||||
      changes.height = height;
 | 
			
		||||
 | 
			
		||||
      XConfigureWindow(screen->display->xdisplay,
 | 
			
		||||
                       screen->guard_window,
 | 
			
		||||
                       CWX | CWY | CWWidth | CWHeight,
 | 
			
		||||
                       &changes);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (screen->display->compositor)
 | 
			
		||||
    meta_compositor_sync_screen_size (screen->display->compositor,
 | 
			
		||||
				      screen, width, height);
 | 
			
		||||
@@ -2992,7 +2915,7 @@ meta_screen_resize (MetaScreen *screen,
 | 
			
		||||
  g_free (old_monitor_infos);
 | 
			
		||||
  g_slist_free (windows);
 | 
			
		||||
 | 
			
		||||
  g_signal_emit (screen, screen_signals[MONITORS_CHANGED], 0, index);
 | 
			
		||||
  g_signal_emit (screen, screen_signals[MONITORS_CHANGED], 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
@@ -3469,9 +3392,10 @@ meta_screen_get_screen_number (MetaScreen *screen)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * meta_screen_get_display:
 | 
			
		||||
 * Retrieve the display associated with screen.
 | 
			
		||||
 * @screen: A #MetaScreen
 | 
			
		||||
 * 
 | 
			
		||||
 * Retrieve the display associated with screen.
 | 
			
		||||
 *
 | 
			
		||||
 * Returns: (transfer none): Display 
 | 
			
		||||
 */
 | 
			
		||||
MetaDisplay *
 | 
			
		||||
@@ -3503,8 +3427,11 @@ meta_screen_get_size (MetaScreen *screen,
 | 
			
		||||
                      int        *width,
 | 
			
		||||
                      int        *height)
 | 
			
		||||
{
 | 
			
		||||
  *width = screen->rect.width;
 | 
			
		||||
  *height = screen->rect.height;
 | 
			
		||||
  if (width != NULL)
 | 
			
		||||
    *width = screen->rect.width;
 | 
			
		||||
 | 
			
		||||
  if (height != NULL)
 | 
			
		||||
    *height = screen->rect.height;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 
 | 
			
		||||
@@ -1811,7 +1811,7 @@ warn_about_lame_clients_and_finish_interact (gboolean shutdown)
 | 
			
		||||
                           "you log in."),
 | 
			
		||||
                         "240",
 | 
			
		||||
                         meta_get_display()->active_screen->screen_name,
 | 
			
		||||
                         NULL, NULL,
 | 
			
		||||
                         NULL, NULL, NULL,
 | 
			
		||||
                         None,
 | 
			
		||||
                         columns,
 | 
			
		||||
                         lame_details);
 | 
			
		||||
 
 | 
			
		||||
@@ -394,6 +394,8 @@ meta_stack_tracker_free (MetaStackTracker *tracker)
 | 
			
		||||
  g_queue_foreach (tracker->queued_requests, (GFunc)meta_stack_op_free, NULL);
 | 
			
		||||
  g_queue_free (tracker->queued_requests);
 | 
			
		||||
  tracker->queued_requests = NULL;
 | 
			
		||||
 | 
			
		||||
  g_free (tracker);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,8 @@
 | 
			
		||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \file stack.c  Which windows cover which other windows
 | 
			
		||||
 * SECTION:stack
 | 
			
		||||
 * @short_description: Which windows cover which other windows
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* 
 | 
			
		||||
@@ -121,6 +122,7 @@ meta_stack_add (MetaStack  *stack,
 | 
			
		||||
              window->desc, window->stack_position);
 | 
			
		||||
  
 | 
			
		||||
  stack_sync_to_server (stack);
 | 
			
		||||
  meta_stack_update_window_tile_matches (stack, window->screen->active_workspace);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
@@ -156,6 +158,7 @@ meta_stack_remove (MetaStack  *stack,
 | 
			
		||||
                                     GUINT_TO_POINTER (window->frame->xwindow));
 | 
			
		||||
  
 | 
			
		||||
  stack_sync_to_server (stack);
 | 
			
		||||
  meta_stack_update_window_tile_matches (stack, window->screen->active_workspace);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
@@ -165,6 +168,7 @@ meta_stack_update_layer (MetaStack  *stack,
 | 
			
		||||
  stack->need_relayer = TRUE;
 | 
			
		||||
  
 | 
			
		||||
  stack_sync_to_server (stack);
 | 
			
		||||
  meta_stack_update_window_tile_matches (stack, window->screen->active_workspace);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
@@ -174,26 +178,64 @@ meta_stack_update_transient (MetaStack  *stack,
 | 
			
		||||
  stack->need_constrain = TRUE;
 | 
			
		||||
  
 | 
			
		||||
  stack_sync_to_server (stack);
 | 
			
		||||
  meta_stack_update_window_tile_matches (stack, window->screen->active_workspace);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* raise/lower within a layer */
 | 
			
		||||
void
 | 
			
		||||
meta_stack_raise (MetaStack  *stack,
 | 
			
		||||
                  MetaWindow *window)
 | 
			
		||||
{  
 | 
			
		||||
  meta_window_set_stack_position_no_sync (window,
 | 
			
		||||
                                          stack->n_positions - 1);
 | 
			
		||||
  
 | 
			
		||||
{
 | 
			
		||||
  GList *l;
 | 
			
		||||
  int max_stack_position = window->stack_position;
 | 
			
		||||
  MetaWorkspace *workspace;
 | 
			
		||||
 | 
			
		||||
  stack_ensure_sorted (stack);
 | 
			
		||||
 | 
			
		||||
  workspace = meta_window_get_workspace (window);
 | 
			
		||||
  for (l = stack->sorted; l; l = l->next)
 | 
			
		||||
    {
 | 
			
		||||
      MetaWindow *w = (MetaWindow *) l->data;
 | 
			
		||||
      if (meta_window_located_on_workspace (w, workspace) &&
 | 
			
		||||
          w->stack_position > max_stack_position)
 | 
			
		||||
        max_stack_position = w->stack_position;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (max_stack_position == window->stack_position)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  meta_window_set_stack_position_no_sync (window, max_stack_position);
 | 
			
		||||
 | 
			
		||||
  stack_sync_to_server (stack);
 | 
			
		||||
  meta_stack_update_window_tile_matches (stack, window->screen->active_workspace);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
meta_stack_lower (MetaStack  *stack,
 | 
			
		||||
                  MetaWindow *window)
 | 
			
		||||
{
 | 
			
		||||
  meta_window_set_stack_position_no_sync (window, 0);
 | 
			
		||||
  GList *l;
 | 
			
		||||
  int min_stack_position = window->stack_position;
 | 
			
		||||
  MetaWorkspace *workspace;
 | 
			
		||||
 | 
			
		||||
  stack_ensure_sorted (stack);
 | 
			
		||||
 | 
			
		||||
  workspace = meta_window_get_workspace (window);
 | 
			
		||||
  for (l = stack->sorted; l; l = l->next)
 | 
			
		||||
    {
 | 
			
		||||
      MetaWindow *w = (MetaWindow *) l->data;
 | 
			
		||||
      if (meta_window_located_on_workspace (w, workspace) &&
 | 
			
		||||
          w->stack_position < min_stack_position)
 | 
			
		||||
        min_stack_position = w->stack_position;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (min_stack_position == window->stack_position)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  meta_window_set_stack_position_no_sync (window, min_stack_position);
 | 
			
		||||
  
 | 
			
		||||
  stack_sync_to_server (stack);
 | 
			
		||||
  meta_stack_update_window_tile_matches (stack, window->screen->active_workspace);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
@@ -209,6 +251,27 @@ meta_stack_thaw (MetaStack *stack)
 | 
			
		||||
  
 | 
			
		||||
  stack->freeze_count -= 1;
 | 
			
		||||
  stack_sync_to_server (stack);
 | 
			
		||||
  meta_stack_update_window_tile_matches (stack, NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
meta_stack_update_window_tile_matches (MetaStack     *stack,
 | 
			
		||||
                                       MetaWorkspace *workspace)
 | 
			
		||||
{
 | 
			
		||||
  GList *windows, *tmp;
 | 
			
		||||
 | 
			
		||||
  if (stack->freeze_count > 0)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  windows = meta_stack_list_windows (stack, workspace);
 | 
			
		||||
  tmp = windows;
 | 
			
		||||
  while (tmp)
 | 
			
		||||
    {
 | 
			
		||||
      meta_window_compute_tile_match ((MetaWindow *) tmp->data);
 | 
			
		||||
      tmp = tmp->next;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  g_list_free (windows);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
@@ -278,7 +341,7 @@ get_standalone_layer (MetaWindow *window)
 | 
			
		||||
                 windows_on_different_monitor (window,
 | 
			
		||||
                                               window->display->expected_focus_window))))
 | 
			
		||||
        layer = META_LAYER_FULLSCREEN;
 | 
			
		||||
      else if (window->wm_state_above)
 | 
			
		||||
      else if (window->wm_state_above && !META_WINDOW_MAXIMIZED (window))
 | 
			
		||||
        layer = META_LAYER_TOP;
 | 
			
		||||
      else
 | 
			
		||||
        layer = META_LAYER_NORMAL;
 | 
			
		||||
@@ -737,6 +800,8 @@ apply_constraints (Constraint **constraints,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * stack_do_window_deletions:
 | 
			
		||||
 *
 | 
			
		||||
 * Go through "deleted" and take the matching windows
 | 
			
		||||
 * out of "windows".
 | 
			
		||||
 */
 | 
			
		||||
@@ -837,6 +902,8 @@ stack_do_window_additions (MetaStack *stack)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * stack_do_relayer:
 | 
			
		||||
 *
 | 
			
		||||
 * Update the layers that windows are in
 | 
			
		||||
 */
 | 
			
		||||
static void
 | 
			
		||||
@@ -882,6 +949,8 @@ stack_do_relayer (MetaStack *stack)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * stack_do_constrain:
 | 
			
		||||
 *
 | 
			
		||||
 * Update stack_position and layer to reflect transiency
 | 
			
		||||
 * constraints
 | 
			
		||||
 */
 | 
			
		||||
@@ -914,6 +983,8 @@ stack_do_constrain (MetaStack *stack)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * stack_do_resort:
 | 
			
		||||
 *
 | 
			
		||||
 * Sort stack->sorted with layers having priority over stack_position.
 | 
			
		||||
 */
 | 
			
		||||
static void
 | 
			
		||||
@@ -932,6 +1003,8 @@ stack_do_resort (MetaStack *stack)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * stack_ensure_sorted:
 | 
			
		||||
 *
 | 
			
		||||
 * Puts the stack into canonical form.
 | 
			
		||||
 *
 | 
			
		||||
 * Honour the removed and added lists of the stack, and then recalculate
 | 
			
		||||
@@ -951,6 +1024,8 @@ stack_ensure_sorted (MetaStack *stack)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * raise_window_relative_to_managed_windows:
 | 
			
		||||
 *
 | 
			
		||||
 * This function is used to avoid raising a window above popup
 | 
			
		||||
 * menus and other such things.
 | 
			
		||||
 *
 | 
			
		||||
@@ -1051,6 +1126,8 @@ raise_window_relative_to_managed_windows (MetaScreen *screen,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * stack_sync_to_server:
 | 
			
		||||
 *
 | 
			
		||||
 * Order the windows on the X server to be the same as in our structure.
 | 
			
		||||
 * We do this using XRestackWindows if we don't know the previous order,
 | 
			
		||||
 * or XConfigureWindow on a few particular windows if we do and can figure
 | 
			
		||||
@@ -1656,6 +1733,7 @@ meta_stack_set_positions (MetaStack *stack,
 | 
			
		||||
              "Reset the stack positions of (nearly) all windows\n");
 | 
			
		||||
 | 
			
		||||
  stack_sync_to_server (stack);
 | 
			
		||||
  meta_stack_update_window_tile_matches (stack, NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
@@ -1718,4 +1796,6 @@ meta_window_set_stack_position (MetaWindow *window,
 | 
			
		||||
{
 | 
			
		||||
  meta_window_set_stack_position_no_sync (window, position);
 | 
			
		||||
  stack_sync_to_server (window->screen->stack);
 | 
			
		||||
  meta_stack_update_window_tile_matches (window->screen->stack,
 | 
			
		||||
                                         window->screen->active_workspace);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										246
									
								
								src/core/stack.h
									
									
									
									
									
								
							
							
						
						
									
										246
									
								
								src/core/stack.h
									
									
									
									
									
								
							@@ -1,23 +1,5 @@
 | 
			
		||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \file stack.h  Which windows cover which other windows
 | 
			
		||||
 *
 | 
			
		||||
 * There are two factors that determine window position.
 | 
			
		||||
 * 
 | 
			
		||||
 * One is window->stack_position, which is a unique integer
 | 
			
		||||
 * indicating how windows are ordered with respect to one
 | 
			
		||||
 * another. The ordering here transcends layers; it isn't changed
 | 
			
		||||
 * as the window is moved among layers. This allows us to move several
 | 
			
		||||
 * windows from one layer to another, while preserving the relative
 | 
			
		||||
 * order of the moved windows. Also, it allows us to restore
 | 
			
		||||
 * the stacking order from a saved session.
 | 
			
		||||
 * 
 | 
			
		||||
 * However when actually stacking windows on the screen, the
 | 
			
		||||
 * layer overrides the stack_position; windows are first sorted
 | 
			
		||||
 * by layer, then by stack_position within each layer.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* 
 | 
			
		||||
 * Copyright (C) 2001 Havoc Pennington
 | 
			
		||||
 * Copyright (C) 2005 Elijah Newren
 | 
			
		||||
@@ -41,6 +23,25 @@
 | 
			
		||||
#ifndef META_STACK_H
 | 
			
		||||
#define META_STACK_H
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * SECTION:stack
 | 
			
		||||
 * @short_description: Which windows cover which other windows
 | 
			
		||||
 *
 | 
			
		||||
 * There are two factors that determine window position.
 | 
			
		||||
 * 
 | 
			
		||||
 * One is window->stack_position, which is a unique integer
 | 
			
		||||
 * indicating how windows are ordered with respect to one
 | 
			
		||||
 * another. The ordering here transcends layers; it isn't changed
 | 
			
		||||
 * as the window is moved among layers. This allows us to move several
 | 
			
		||||
 * windows from one layer to another, while preserving the relative
 | 
			
		||||
 * order of the moved windows. Also, it allows us to restore
 | 
			
		||||
 * the stacking order from a saved session.
 | 
			
		||||
 * 
 | 
			
		||||
 * However when actually stacking windows on the screen, the
 | 
			
		||||
 * layer overrides the stack_position; windows are first sorted
 | 
			
		||||
 * by layer, then by stack_position within each layer.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "screen-private.h"
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -123,192 +124,214 @@ struct _MetaStack
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * meta_stack_new:
 | 
			
		||||
 * @screen: The MetaScreen which will be the parent of this stack.
 | 
			
		||||
 *
 | 
			
		||||
 * Creates and initialises a MetaStack.
 | 
			
		||||
 *
 | 
			
		||||
 * \param screen  The MetaScreen which will be the parent of this stack.
 | 
			
		||||
 * \return The new screen.
 | 
			
		||||
 * Returns: The new screen.
 | 
			
		||||
 */
 | 
			
		||||
MetaStack *meta_stack_new       (MetaScreen     *screen);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Destroys and frees a MetaStack.
 | 
			
		||||
 * meta_stack_free:
 | 
			
		||||
 * @stack: The stack to destroy.
 | 
			
		||||
 *
 | 
			
		||||
 * \param stack  The stack to destroy.
 | 
			
		||||
 * Destroys and frees a MetaStack.
 | 
			
		||||
 */
 | 
			
		||||
void       meta_stack_free      (MetaStack      *stack);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * meta_stack_add:
 | 
			
		||||
 * @stack: The stack to add it to
 | 
			
		||||
 * @window: The window to add
 | 
			
		||||
 *
 | 
			
		||||
 * Adds a window to the local stack.  It is a fatal error to call this
 | 
			
		||||
 * function on a window which already exists on the stack of any screen.
 | 
			
		||||
 *
 | 
			
		||||
 * \param window  The window to add
 | 
			
		||||
 * \param stack  The stack to add it to
 | 
			
		||||
 */
 | 
			
		||||
void       meta_stack_add       (MetaStack      *stack,
 | 
			
		||||
                                 MetaWindow     *window);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * meta_stack_remove:
 | 
			
		||||
 * @stack: The stack to remove it from
 | 
			
		||||
 * @window: The window to remove
 | 
			
		||||
 *
 | 
			
		||||
 * Removes a window from the local stack.  It is a fatal error to call this
 | 
			
		||||
 * function on a window which exists on the stack of any screen.
 | 
			
		||||
 *
 | 
			
		||||
 * \param window  The window to remove
 | 
			
		||||
 * \param stack   The stack to remove it from
 | 
			
		||||
 */
 | 
			
		||||
void       meta_stack_remove    (MetaStack      *stack,
 | 
			
		||||
                                 MetaWindow     *window);
 | 
			
		||||
/**
 | 
			
		||||
 * meta_stack_update_layer:
 | 
			
		||||
 * @stack: The stack to recalculate
 | 
			
		||||
 * @window: Dummy parameter
 | 
			
		||||
 *
 | 
			
		||||
 * Recalculates the correct layer for all windows in the stack,
 | 
			
		||||
 * and moves them about accordingly.
 | 
			
		||||
 *
 | 
			
		||||
 * \param window  Dummy parameter
 | 
			
		||||
 * \param stack   The stack to recalculate
 | 
			
		||||
 * \bug What's with the dummy parameter?
 | 
			
		||||
 */
 | 
			
		||||
void       meta_stack_update_layer    (MetaStack      *stack,
 | 
			
		||||
                                       MetaWindow     *window);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * meta_stack_update_transient:
 | 
			
		||||
 * @stack: The stack to recalculate
 | 
			
		||||
 * @window: Dummy parameter
 | 
			
		||||
 *
 | 
			
		||||
 * Recalculates the correct stacking order for all windows in the stack
 | 
			
		||||
 * according to their transience, and moves them about accordingly.
 | 
			
		||||
 *
 | 
			
		||||
 * \param window  Dummy parameter
 | 
			
		||||
 * \param stack   The stack to recalculate
 | 
			
		||||
 * \bug What's with the dummy parameter?
 | 
			
		||||
 * FIXME: What's with the dummy parameter?
 | 
			
		||||
 */
 | 
			
		||||
void       meta_stack_update_transient (MetaStack     *stack,
 | 
			
		||||
                                        MetaWindow    *window);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Move a window to the top of its layer.
 | 
			
		||||
 * meta_stack_raise:
 | 
			
		||||
 * @stack: The stack to modify.
 | 
			
		||||
 * @window: The window that's making an ascension.
 | 
			
		||||
 *              (Amulet of Yendor not required.)
 | 
			
		||||
 *
 | 
			
		||||
 * \param stack  The stack to modify.
 | 
			
		||||
 * \param window  The window that's making an ascension.
 | 
			
		||||
 *                (Amulet of Yendor not required.)
 | 
			
		||||
 * Move a window to the top of its layer.
 | 
			
		||||
 */
 | 
			
		||||
void       meta_stack_raise     (MetaStack      *stack,
 | 
			
		||||
                                 MetaWindow     *window);
 | 
			
		||||
/**
 | 
			
		||||
 * Move a window to the bottom of its layer.
 | 
			
		||||
 * meta_stack_lower:
 | 
			
		||||
 * @stack: The stack to modify.
 | 
			
		||||
 * @window: The window that's on the way downwards.
 | 
			
		||||
 *
 | 
			
		||||
 * \param stack  The stack to modify.
 | 
			
		||||
 * \param window  The window that's on the way downwards.
 | 
			
		||||
 * Move a window to the bottom of its layer.
 | 
			
		||||
 */
 | 
			
		||||
void       meta_stack_lower     (MetaStack      *stack,
 | 
			
		||||
                                 MetaWindow     *window);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * meta_stack_freeze:
 | 
			
		||||
 * @stack: The stack to freeze.
 | 
			
		||||
 *
 | 
			
		||||
 * Prevent syncing to server until the next call of meta_stack_thaw(),
 | 
			
		||||
 * so that we can carry out multiple operations in one go without having
 | 
			
		||||
 * everything halfway reflected on the X server.
 | 
			
		||||
 *
 | 
			
		||||
 * (Calls to meta_stack_freeze() nest, so that multiple calls to
 | 
			
		||||
 * meta_stack_freeze will require multiple calls to meta_stack_thaw().)
 | 
			
		||||
 *
 | 
			
		||||
 * \param stack  The stack to freeze.
 | 
			
		||||
 */
 | 
			
		||||
void       meta_stack_freeze    (MetaStack      *stack);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * meta_stack_thaw:
 | 
			
		||||
 * @stack: The stack to thaw.
 | 
			
		||||
 *
 | 
			
		||||
 * Undoes a meta_stack_freeze(), and processes anything which has become
 | 
			
		||||
 * necessary during the freeze.  It is an error to call this function if
 | 
			
		||||
 * the stack has not been frozen.
 | 
			
		||||
 *
 | 
			
		||||
 * \param stack  The stack to thaw.
 | 
			
		||||
 */
 | 
			
		||||
void       meta_stack_thaw      (MetaStack      *stack);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * meta_stack_get_top:
 | 
			
		||||
 * @stack: The stack to examine.
 | 
			
		||||
 *
 | 
			
		||||
 * Finds the top window on the stack.
 | 
			
		||||
 *
 | 
			
		||||
 * \param stack  The stack to examine.
 | 
			
		||||
 * \return The top window on the stack, or NULL in the vanishingly unlikely
 | 
			
		||||
 *         event that you have no windows on your screen whatsoever.
 | 
			
		||||
 * Returns: The top window on the stack, or %NULL in the vanishingly unlikely
 | 
			
		||||
 *          event that you have no windows on your screen whatsoever.
 | 
			
		||||
 */
 | 
			
		||||
MetaWindow* meta_stack_get_top    (MetaStack  *stack);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * meta_stack_get_bottom:
 | 
			
		||||
 * @stack: The stack to search
 | 
			
		||||
 *
 | 
			
		||||
 * Finds the window at the bottom of the stack.  Since that's pretty much
 | 
			
		||||
 * always the desktop, this isn't the most useful of functions, and nobody
 | 
			
		||||
 * actually calls it.  We should probably get rid of it.
 | 
			
		||||
 *
 | 
			
		||||
 * \param stack  The stack to search
 | 
			
		||||
 */
 | 
			
		||||
MetaWindow* meta_stack_get_bottom (MetaStack  *stack);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * meta_stack_get_above:
 | 
			
		||||
 * @stack: The stack to search.
 | 
			
		||||
 * @window: The window to look above.
 | 
			
		||||
 * @only_within_layer: If %TRUE, will return %NULL if @window is the
 | 
			
		||||
 *                     top window in its layer.
 | 
			
		||||
 *
 | 
			
		||||
 * Finds the window above a given window in the stack.
 | 
			
		||||
 * It is not an error to pass in a window which does not exist in
 | 
			
		||||
 * the stack; the function will merely return NULL.
 | 
			
		||||
 * the stack; the function will merely return %NULL.
 | 
			
		||||
 *
 | 
			
		||||
 * \param stack   The stack to search.
 | 
			
		||||
 * \param window  The window to look above.
 | 
			
		||||
 * \param only_within_layer  If true, will return NULL if "window" is the
 | 
			
		||||
 *                           top window in its layer.
 | 
			
		||||
 * \return NULL if there is no such window;
 | 
			
		||||
 *         the window above "window" otherwise.
 | 
			
		||||
 * Returns: %NULL if there is no such window;
 | 
			
		||||
 *          the window above @window otherwise.
 | 
			
		||||
 */
 | 
			
		||||
MetaWindow* meta_stack_get_above  (MetaStack  *stack,
 | 
			
		||||
                                   MetaWindow *window,
 | 
			
		||||
                                   gboolean    only_within_layer);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * meta_stack_get_below:
 | 
			
		||||
 * @stack: The stack to search.
 | 
			
		||||
 * @window: The window to look below.
 | 
			
		||||
 * @only_within_layer: If %TRUE, will return %NULL if window is the
 | 
			
		||||
 *                     bottom window in its layer.
 | 
			
		||||
 *
 | 
			
		||||
 * Finds the window below a given window in the stack.
 | 
			
		||||
 * It is not an error to pass in a window which does not exist in
 | 
			
		||||
 * the stack; the function will merely return NULL.
 | 
			
		||||
 * the stack; the function will merely return %NULL.
 | 
			
		||||
 *
 | 
			
		||||
 * \param stack   The stack to search.
 | 
			
		||||
 * \param window  The window to look below.
 | 
			
		||||
 * \param only_within_layer  If true, will return NULL if "window" is the
 | 
			
		||||
 *                           bottom window in its layer.
 | 
			
		||||
 * \return NULL if there is no such window;
 | 
			
		||||
 *         the window below "window" otherwise.
 | 
			
		||||
 *
 | 
			
		||||
 * Returns: %NULL if there is no such window;
 | 
			
		||||
 *          the window below @window otherwise.
 | 
			
		||||
 */
 | 
			
		||||
MetaWindow* meta_stack_get_below  (MetaStack  *stack,
 | 
			
		||||
                                   MetaWindow *window,
 | 
			
		||||
                                   gboolean    only_within_layer);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Find the topmost, focusable, mapped, window in a stack.  If you supply
 | 
			
		||||
 * a window as "not_this_one", we won't return that one (presumably
 | 
			
		||||
 * because it's going to be going away).  But if you do supply "not_this_one"
 | 
			
		||||
 * and we find its parent, we'll return that; and if "not_this_one" is in
 | 
			
		||||
 * meta_stack_get_default_focus_window:
 | 
			
		||||
 * @stack: The stack to search.
 | 
			
		||||
 * @workspace: %NULL to search all workspaces; otherwise only windows
 | 
			
		||||
 *             from that workspace will be returned.
 | 
			
		||||
 * @not_this_one: Window to ignore because it's being unfocussed or
 | 
			
		||||
 *                going away.
 | 
			
		||||
 *
 | 
			
		||||
 * Find the topmost, focusable, mapped, window in a stack. If you supply
 | 
			
		||||
 * a window as @not_this_one, we won't return that one (presumably
 | 
			
		||||
 * because it's going to be going away).  But if you do supply @not_this_one
 | 
			
		||||
 * and we find its parent, we'll return that; and if @not_this_one is in
 | 
			
		||||
 * a group, we'll return the top window of that group.
 | 
			
		||||
 *
 | 
			
		||||
 * Also, we are prejudiced against dock windows.  Every kind of window, even
 | 
			
		||||
 * the desktop, will be returned in preference to a dock window.
 | 
			
		||||
 *
 | 
			
		||||
 * \param stack  The stack to search.
 | 
			
		||||
 * \param workspace  NULL to search all workspaces; otherwise only windows
 | 
			
		||||
 *                   from that workspace will be returned.
 | 
			
		||||
 * \param not_this_one  Window to ignore because it's being unfocussed or
 | 
			
		||||
 *                      going away.
 | 
			
		||||
 * \return The window matching all these constraints or NULL if none does.
 | 
			
		||||
 * 
 | 
			
		||||
 * \bug Never called!
 | 
			
		||||
 * Returns: The window matching all these constraints or %NULL if none does.
 | 
			
		||||
  */
 | 
			
		||||
MetaWindow* meta_stack_get_default_focus_window          (MetaStack     *stack,
 | 
			
		||||
                                                          MetaWorkspace *workspace,
 | 
			
		||||
                                                          MetaWindow    *not_this_one);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * meta_stack_get_default_focus_window_at_point:
 | 
			
		||||
 * @stack: The stack to search.
 | 
			
		||||
 * @workspace: %NULL to search all workspaces; otherwise only windows
 | 
			
		||||
 *             from that workspace will be returned.
 | 
			
		||||
 * @not_this_one: Window to ignore because it's being unfocussed or
 | 
			
		||||
 *                going away.
 | 
			
		||||
 * @root_x: The returned window must contain this point,
 | 
			
		||||
 *          unless it's a dock.
 | 
			
		||||
 * @root_y: See root_x.
 | 
			
		||||
 *
 | 
			
		||||
 * Find the topmost, focusable, mapped, window in a stack.  If you supply
 | 
			
		||||
 * a window as "not_this_one", we won't return that one (presumably
 | 
			
		||||
 * because it's going to be going away).  But if you do supply "not_this_one"
 | 
			
		||||
 * and we find its parent, we'll return that; and if "not_this_one" is in
 | 
			
		||||
 * a window as @not_this_one, we won't return that one (presumably
 | 
			
		||||
 * because it's going to be going away).  But if you do supply @not_this_one
 | 
			
		||||
 * and we find its parent, we'll return that; and if @not_this_one is in
 | 
			
		||||
 * a group, we'll return the top window of that group.
 | 
			
		||||
 *
 | 
			
		||||
 * Also, we are prejudiced against dock windows.  Every kind of window, even
 | 
			
		||||
 * the desktop, will be returned in preference to a dock window.
 | 
			
		||||
 *
 | 
			
		||||
 * \param stack  The stack to search.
 | 
			
		||||
 * \param workspace  NULL to search all workspaces; otherwise only windows
 | 
			
		||||
 *                   from that workspace will be returned.
 | 
			
		||||
 * \param not_this_one  Window to ignore because it's being unfocussed or
 | 
			
		||||
 *                      going away.
 | 
			
		||||
 * \param root_x  The returned window must contain this point,
 | 
			
		||||
 *                unless it's a dock.
 | 
			
		||||
 * \param root_y  See root_x.
 | 
			
		||||
 * \return The window matching all these constraints or NULL if none does.
 | 
			
		||||
 * Returns: The window matching all these constraints or %NULL if none does.
 | 
			
		||||
 */
 | 
			
		||||
MetaWindow* meta_stack_get_default_focus_window_at_point (MetaStack     *stack,
 | 
			
		||||
                                                          MetaWorkspace *workspace,
 | 
			
		||||
@@ -317,18 +340,25 @@ MetaWindow* meta_stack_get_default_focus_window_at_point (MetaStack     *stack,
 | 
			
		||||
                                                          int            root_y);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * meta_stack_list_windows:
 | 
			
		||||
 * @stack: The stack to examine.
 | 
			
		||||
 * @workspace: If not %NULL, only windows on this workspace will be
 | 
			
		||||
 *             returned; otherwise all windows in the stack will be
 | 
			
		||||
 *             returned.
 | 
			
		||||
 *
 | 
			
		||||
 * Finds all the windows in the stack, in order.
 | 
			
		||||
 *
 | 
			
		||||
 * \param stack  The stack to examine.
 | 
			
		||||
 * \param workspace  If non-NULL, only windows on this workspace will be
 | 
			
		||||
 *                   returned; otherwise all windows in the stack will be
 | 
			
		||||
 *                   returned.
 | 
			
		||||
 * \return A list of windows, in stacking order, honouring layers.
 | 
			
		||||
 * Returns: A list of windows, in stacking order, honouring layers.
 | 
			
		||||
 */
 | 
			
		||||
GList*      meta_stack_list_windows (MetaStack *stack,
 | 
			
		||||
                                     MetaWorkspace *workspace);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * meta_stack_windows_cmp:
 | 
			
		||||
 * @stack: A stack containing both window_a and window_b
 | 
			
		||||
 * @window_a: A window
 | 
			
		||||
 * @window_b  Another window
 | 
			
		||||
 *
 | 
			
		||||
 * Comparison function for windows within a stack.  This is not directly
 | 
			
		||||
 * suitable for use within a standard comparison routine, because it takes
 | 
			
		||||
 * an extra parameter; you will need to wrap it.
 | 
			
		||||
@@ -339,9 +369,6 @@ GList*      meta_stack_list_windows (MetaStack *stack,
 | 
			
		||||
 *
 | 
			
		||||
 * (FIXME: Apparently identical to compare_window_position(). Merge them.)
 | 
			
		||||
 *
 | 
			
		||||
 * \param stack  A stack containing both window_a and window_b
 | 
			
		||||
 * \param window_a  A window
 | 
			
		||||
 * \param window_b  Another window
 | 
			
		||||
 * \return -1 if window_a is below window_b, honouring layers; 1 if it's
 | 
			
		||||
 *         above it; 0 if you passed in the same window twice!
 | 
			
		||||
 */
 | 
			
		||||
@@ -350,37 +377,44 @@ int         meta_stack_windows_cmp  (MetaStack  *stack,
 | 
			
		||||
                                     MetaWindow *window_b);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * meta_window_set_stack_position:
 | 
			
		||||
 * @window: The window which is moving.
 | 
			
		||||
 * @position:  Where it should move to (0 is the bottom).
 | 
			
		||||
 *
 | 
			
		||||
 * Sets the position of a window within the stack.  This will only move it
 | 
			
		||||
 * up or down within its layer.  It is an error to attempt to move this
 | 
			
		||||
 * below position zero or above the last position in the stack (however, since
 | 
			
		||||
 * we don't provide a simple way to tell the number of windows in the stack,
 | 
			
		||||
 * this requirement may not be easy to fulfil).
 | 
			
		||||
 *
 | 
			
		||||
 * \param window  The window which is moving.
 | 
			
		||||
 * \param position  Where it should move to (0 is the bottom).
 | 
			
		||||
 */
 | 
			
		||||
void meta_window_set_stack_position (MetaWindow *window,
 | 
			
		||||
                                     int         position);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * meta_stack_get_positions:
 | 
			
		||||
 * @stack: The stack to examine.
 | 
			
		||||
 *
 | 
			
		||||
 * Returns the current stack state, allowing rudimentary transactions.
 | 
			
		||||
 *
 | 
			
		||||
 * \param stack  The stack to examine.
 | 
			
		||||
 * \return An opaque GList representing the current stack sort order;
 | 
			
		||||
 *         it is the caller's responsibility to free it.
 | 
			
		||||
 *         Pass this to meta_stack_set_positions() later if you want to restore
 | 
			
		||||
 *         the state to where it was when you called this function.
 | 
			
		||||
 * Returns: An opaque GList representing the current stack sort order;
 | 
			
		||||
 *          it is the caller's responsibility to free it.
 | 
			
		||||
 *          Pass this to meta_stack_set_positions() later if you want to restore
 | 
			
		||||
 *          the state to where it was when you called this function.
 | 
			
		||||
 */
 | 
			
		||||
GList* meta_stack_get_positions (MetaStack *stack);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * meta_stack_set_positions:
 | 
			
		||||
 * @stack:  The stack to roll back.
 | 
			
		||||
 * @windows:  The list returned from meta_stack_get_positions().
 | 
			
		||||
 *
 | 
			
		||||
 * Rolls back a transaction, given the list returned from
 | 
			
		||||
 * meta_stack_get_positions().
 | 
			
		||||
 *
 | 
			
		||||
 * \param stack  The stack to roll back.
 | 
			
		||||
 * \param windows  The list returned from meta_stack_get_positions().
 | 
			
		||||
 */
 | 
			
		||||
void   meta_stack_set_positions (MetaStack *stack,
 | 
			
		||||
                                 GList     *windows);
 | 
			
		||||
 | 
			
		||||
void meta_stack_update_window_tile_matches (MetaStack     *stack,
 | 
			
		||||
                                            MetaWorkspace *workspace);
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user