Compare commits
	
		
			617 Commits
		
	
	
		
			wip/xwayla
			...
			wip/textur
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					625ea86672 | ||
| 
						 | 
					395d463c08 | ||
| 
						 | 
					2fc0652886 | ||
| 
						 | 
					6ff42c2ab2 | ||
| 
						 | 
					f9907d1978 | ||
| 
						 | 
					45c5f557bd | ||
| 
						 | 
					53d63ea72b | ||
| 
						 | 
					f6e8e867b4 | ||
| 
						 | 
					a566c6677c | ||
| 
						 | 
					cb06e1ef33 | ||
| 
						 | 
					a30c8fb83d | ||
| 
						 | 
					e3a42dc873 | ||
| 
						 | 
					efd7b8987f | ||
| 
						 | 
					c96aacabf7 | ||
| 
						 | 
					af61b66953 | ||
| 
						 | 
					baf11d2471 | ||
| 
						 | 
					01c763470e | ||
| 
						 | 
					c9065da442 | ||
| 
						 | 
					5f8a4f560f | ||
| 
						 | 
					47577432e4 | ||
| 
						 | 
					4ee9462fcd | ||
| 
						 | 
					c275c1de52 | ||
| 
						 | 
					a9965bb57a | ||
| 
						 | 
					9cc2fa2526 | ||
| 
						 | 
					f439b0432d | ||
| 
						 | 
					ab39558506 | ||
| 
						 | 
					9d72eeeb58 | ||
| 
						 | 
					eea0a2b11d | ||
| 
						 | 
					bcacaf4562 | ||
| 
						 | 
					5ae7a67b36 | ||
| 
						 | 
					7d8ff61069 | ||
| 
						 | 
					79b3f56bd3 | ||
| 
						 | 
					e371bacd7f | ||
| 
						 | 
					62fd182272 | ||
| 
						 | 
					f48c8c5824 | ||
| 
						 | 
					e3d7b3828e | ||
| 
						 | 
					6e14403ac8 | ||
| 
						 | 
					ec2471a356 | ||
| 
						 | 
					30820ab19e | ||
| 
						 | 
					58cc091134 | ||
| 
						 | 
					0105dca586 | ||
| 
						 | 
					17dd4d32da | ||
| 
						 | 
					5b95f809ca | ||
| 
						 | 
					3934793255 | ||
| 
						 | 
					f3655737bc | ||
| 
						 | 
					728ed4fe38 | ||
| 
						 | 
					bcba6571f0 | ||
| 
						 | 
					4525a74e59 | ||
| 
						 | 
					0dd58540b2 | ||
| 
						 | 
					ac27fca3ef | ||
| 
						 | 
					99bbe001f5 | ||
| 
						 | 
					30c09c84c4 | ||
| 
						 | 
					81c63df853 | ||
| 
						 | 
					3104abba57 | ||
| 
						 | 
					13eb4f51c7 | ||
| 
						 | 
					7969c473ac | ||
| 
						 | 
					a83e72d7c1 | ||
| 
						 | 
					910c4e9fe7 | ||
| 
						 | 
					2fb5b65e94 | ||
| 
						 | 
					e00d6c6273 | ||
| 
						 | 
					733ab3b2bc | ||
| 
						 | 
					a208d7c33e | ||
| 
						 | 
					37bbea649b | ||
| 
						 | 
					4035955fc0 | ||
| 
						 | 
					a8db59908f | ||
| 
						 | 
					a477c73a97 | ||
| 
						 | 
					ae228c0556 | ||
| 
						 | 
					978cb5b21c | ||
| 
						 | 
					e792eca2f5 | ||
| 
						 | 
					b9614f0797 | ||
| 
						 | 
					6d7bbeddd7 | ||
| 
						 | 
					68570353fd | ||
| 
						 | 
					566cdcc94b | ||
| 
						 | 
					37dc2e5b1b | ||
| 
						 | 
					66b9150771 | ||
| 
						 | 
					34f5bdeea3 | ||
| 
						 | 
					ca71b0eb1a | ||
| 
						 | 
					ca4209d88a | ||
| 
						 | 
					3288edf677 | ||
| 
						 | 
					fe1616668e | ||
| 
						 | 
					7d01aec48d | ||
| 
						 | 
					a41d84db00 | ||
| 
						 | 
					e73b321c2e | ||
| 
						 | 
					b6dc2052c3 | ||
| 
						 | 
					72965aaaf0 | ||
| 
						 | 
					2a6782dc10 | ||
| 
						 | 
					5142c8c7e7 | ||
| 
						 | 
					abc7ad8e9f | ||
| 
						 | 
					1a3f9a3323 | ||
| 
						 | 
					235c35182b | ||
| 
						 | 
					e4661d7870 | ||
| 
						 | 
					9d4c7e4e75 | ||
| 
						 | 
					47131b1dad | ||
| 
						 | 
					51c0130645 | ||
| 
						 | 
					2dd9fc17c1 | ||
| 
						 | 
					c7a38c3139 | ||
| 
						 | 
					7d52be0229 | ||
| 
						 | 
					41303bc01b | ||
| 
						 | 
					0d188c3898 | ||
| 
						 | 
					28eff93143 | ||
| 
						 | 
					b380aa72aa | ||
| 
						 | 
					920dc9e5a1 | ||
| 
						 | 
					32f02010ae | ||
| 
						 | 
					889c56c776 | ||
| 
						 | 
					67a4cd898e | ||
| 
						 | 
					43d6c0ea61 | ||
| 
						 | 
					2872bb1f2a | ||
| 
						 | 
					1c00cd5ca3 | ||
| 
						 | 
					2919a7f25f | ||
| 
						 | 
					ca0d56a3a4 | ||
| 
						 | 
					a89baa44ab | ||
| 
						 | 
					7076a48bcf | ||
| 
						 | 
					1b439c42d1 | ||
| 
						 | 
					928a40f328 | ||
| 
						 | 
					59397266ed | ||
| 
						 | 
					d0147591b3 | ||
| 
						 | 
					25c7e52ada | ||
| 
						 | 
					99d766c044 | ||
| 
						 | 
					fcd4c816c4 | ||
| 
						 | 
					2a63a47d5a | ||
| 
						 | 
					c80e2c9ae5 | ||
| 
						 | 
					d3d5eb8e1b | ||
| 
						 | 
					4837cec89f | ||
| 
						 | 
					32329e6c00 | ||
| 
						 | 
					89261be556 | ||
| 
						 | 
					e3e76d658b | ||
| 
						 | 
					34644b2133 | ||
| 
						 | 
					7da4e8cf14 | ||
| 
						 | 
					23c3f8bb18 | ||
| 
						 | 
					60866e0f85 | ||
| 
						 | 
					45c02645f3 | ||
| 
						 | 
					e515e37a7e | ||
| 
						 | 
					957f4ec69d | ||
| 
						 | 
					a98eb107be | ||
| 
						 | 
					1851fa2bd0 | ||
| 
						 | 
					de7d7bbf3d | ||
| 
						 | 
					7ac551cd05 | ||
| 
						 | 
					8696a79477 | ||
| 
						 | 
					b2f9de98d0 | ||
| 
						 | 
					2da2489da5 | ||
| 
						 | 
					31779404f0 | ||
| 
						 | 
					b096c0ac33 | ||
| 
						 | 
					44a7f74dcd | ||
| 
						 | 
					3832c6b607 | ||
| 
						 | 
					14b7e79d3c | ||
| 
						 | 
					e99b0b9368 | ||
| 
						 | 
					de294f34bb | ||
| 
						 | 
					a5fd9a6e2f | ||
| 
						 | 
					4e6114b14d | ||
| 
						 | 
					65630d6310 | ||
| 
						 | 
					b8a81128e0 | ||
| 
						 | 
					19e55b9a8c | ||
| 
						 | 
					9ea9352c93 | ||
| 
						 | 
					817a76a7f5 | ||
| 
						 | 
					cb40049ec1 | ||
| 
						 | 
					481e87032c | ||
| 
						 | 
					bf5ac39d46 | ||
| 
						 | 
					47856d9701 | ||
| 
						 | 
					06429b12e2 | ||
| 
						 | 
					419fb81d40 | ||
| 
						 | 
					f1bbe5c251 | ||
| 
						 | 
					27fef44d48 | ||
| 
						 | 
					00b8ca7aeb | ||
| 
						 | 
					675d429ba0 | ||
| 
						 | 
					f4d754c934 | ||
| 
						 | 
					8ae79182c1 | ||
| 
						 | 
					712ec30cd9 | ||
| 
						 | 
					7a41483ea0 | ||
| 
						 | 
					b4d642be52 | ||
| 
						 | 
					0bf0e5780c | ||
| 
						 | 
					d7c5e57134 | ||
| 
						 | 
					67bf936ef8 | ||
| 
						 | 
					15b7b40ea8 | ||
| 
						 | 
					81bff3eba6 | ||
| 
						 | 
					da3fd8f7fb | ||
| 
						 | 
					6e125d9d04 | ||
| 
						 | 
					80705018f9 | ||
| 
						 | 
					f39dacd451 | ||
| 
						 | 
					33c070cdd5 | ||
| 
						 | 
					8d2f794bd3 | ||
| 
						 | 
					1458dc394a | ||
| 
						 | 
					c93877abb5 | ||
| 
						 | 
					ef0efc9589 | ||
| 
						 | 
					09cdf39b68 | ||
| 
						 | 
					a6ccbbfe68 | ||
| 
						 | 
					e502adfa04 | ||
| 
						 | 
					8dd377da38 | ||
| 
						 | 
					03a12f9458 | ||
| 
						 | 
					061f69f2a2 | ||
| 
						 | 
					4d5e1f690d | ||
| 
						 | 
					f3203f0330 | ||
| 
						 | 
					d27e6921d6 | ||
| 
						 | 
					c459ad7932 | ||
| 
						 | 
					5ee825c081 | ||
| 
						 | 
					1ead513b66 | ||
| 
						 | 
					9ed236bd67 | ||
| 
						 | 
					a1517cae1c | ||
| 
						 | 
					542502be53 | ||
| 
						 | 
					203a0b37ed | ||
| 
						 | 
					b6477a826d | ||
| 
						 | 
					95adc45b71 | ||
| 
						 | 
					f20daf567d | ||
| 
						 | 
					4345906663 | ||
| 
						 | 
					d714a94d97 | ||
| 
						 | 
					514c7028f4 | ||
| 
						 | 
					44624736c5 | ||
| 
						 | 
					0162cdf8ef | ||
| 
						 | 
					7e17dd0098 | ||
| 
						 | 
					704b73b041 | ||
| 
						 | 
					bd5e36cf0e | ||
| 
						 | 
					dbf56e24cb | ||
| 
						 | 
					0371897e22 | ||
| 
						 | 
					cc5fe05c4d | ||
| 
						 | 
					d8f13f6b4c | ||
| 
						 | 
					a2959510e5 | ||
| 
						 | 
					c8fbd4bee8 | ||
| 
						 | 
					d5631f793e | ||
| 
						 | 
					d4d160a186 | ||
| 
						 | 
					4719c3f31e | ||
| 
						 | 
					1f5a2d6029 | ||
| 
						 | 
					19bf4cf4f8 | ||
| 
						 | 
					6f59e4858e | ||
| 
						 | 
					aec85281ba | ||
| 
						 | 
					b22875aae9 | ||
| 
						 | 
					962712ddc2 | ||
| 
						 | 
					de29627855 | ||
| 
						 | 
					54dcff3aa2 | ||
| 
						 | 
					bcd5882081 | ||
| 
						 | 
					69f56578a3 | ||
| 
						 | 
					c00e092456 | ||
| 
						 | 
					a8cee14417 | ||
| 
						 | 
					8a89b0007c | ||
| 
						 | 
					6934b83f44 | ||
| 
						 | 
					37aab9280a | ||
| 
						 | 
					49e8bc8a52 | ||
| 
						 | 
					abd6b7affd | ||
| 
						 | 
					748223b896 | ||
| 
						 | 
					c75eac27a8 | ||
| 
						 | 
					ac502c921d | ||
| 
						 | 
					134765c634 | ||
| 
						 | 
					5149d6eb40 | ||
| 
						 | 
					006cdac531 | ||
| 
						 | 
					61bc1a7d6f | ||
| 
						 | 
					86ab3878e7 | ||
| 
						 | 
					f2d0e5021a | ||
| 
						 | 
					6d8286614f | ||
| 
						 | 
					70fcf745b8 | ||
| 
						 | 
					589e999049 | ||
| 
						 | 
					d8f2f583e6 | ||
| 
						 | 
					db866eb052 | ||
| 
						 | 
					d092e913d6 | ||
| 
						 | 
					6147be3dff | ||
| 
						 | 
					57f55d486d | ||
| 
						 | 
					6be56de140 | ||
| 
						 | 
					206ca43c91 | ||
| 
						 | 
					f8f1bcfa9e | ||
| 
						 | 
					91df801ffb | ||
| 
						 | 
					97f142d1cc | ||
| 
						 | 
					5ea3a4ecbb | ||
| 
						 | 
					fbd5a74a0b | ||
| 
						 | 
					58bb61e161 | ||
| 
						 | 
					dbd053020a | ||
| 
						 | 
					c063d43be8 | ||
| 
						 | 
					35b77a61c8 | ||
| 
						 | 
					32547d2eff | ||
| 
						 | 
					dc37ee2782 | ||
| 
						 | 
					371e5df568 | ||
| 
						 | 
					cc4e007148 | ||
| 
						 | 
					c0d9b08ef9 | ||
| 
						 | 
					d99cd279d2 | ||
| 
						 | 
					d670a1aa78 | ||
| 
						 | 
					76b396846d | ||
| 
						 | 
					bd0105ba8d | ||
| 
						 | 
					6dcce19932 | ||
| 
						 | 
					cc40a885ef | ||
| 
						 | 
					513c278077 | ||
| 
						 | 
					ac8ee9a08c | ||
| 
						 | 
					952c1fefa2 | ||
| 
						 | 
					18b8f9bfed | ||
| 
						 | 
					f08417b618 | ||
| 
						 | 
					62c9713361 | ||
| 
						 | 
					efd7a4af5e | ||
| 
						 | 
					3a914a915e | ||
| 
						 | 
					aa6561a3b1 | ||
| 
						 | 
					9eb9623288 | ||
| 
						 | 
					8c988aa632 | ||
| 
						 | 
					13cf19e0b6 | ||
| 
						 | 
					eac0e253e1 | ||
| 
						 | 
					7346419295 | ||
| 
						 | 
					3e77f6704b | ||
| 
						 | 
					01e27a4366 | ||
| 
						 | 
					4e3b26d2ed | ||
| 
						 | 
					5f05112b9a | ||
| 
						 | 
					6cf7d2d47f | ||
| 
						 | 
					1139ace244 | ||
| 
						 | 
					bd9a300801 | ||
| 
						 | 
					2d090f9232 | ||
| 
						 | 
					1c8aebd811 | ||
| 
						 | 
					31eafba93a | ||
| 
						 | 
					5eacdf7af7 | ||
| 
						 | 
					ca638d1354 | ||
| 
						 | 
					f12e6ad4f1 | ||
| 
						 | 
					0bbda3ad87 | ||
| 
						 | 
					dd43d04d42 | ||
| 
						 | 
					383ac76d00 | ||
| 
						 | 
					e59ca14f6c | ||
| 
						 | 
					7917b083cb | ||
| 
						 | 
					2b3040d04f | ||
| 
						 | 
					6cc48d8cbb | ||
| 
						 | 
					798026498d | ||
| 
						 | 
					49f029571c | ||
| 
						 | 
					290b257288 | ||
| 
						 | 
					2b60fb0144 | ||
| 
						 | 
					7f5f5eb847 | ||
| 
						 | 
					44269e6a1d | ||
| 
						 | 
					70dfe8c97d | ||
| 
						 | 
					072afa5fa3 | ||
| 
						 | 
					519a0fd93d | ||
| 
						 | 
					5f132f3975 | ||
| 
						 | 
					1546989845 | ||
| 
						 | 
					1923db97c1 | ||
| 
						 | 
					db32047a5d | ||
| 
						 | 
					b505eb261e | ||
| 
						 | 
					1a1db9ef8d | ||
| 
						 | 
					b1587f0716 | ||
| 
						 | 
					93e450f37c | ||
| 
						 | 
					fc713ecb70 | ||
| 
						 | 
					500c13ab6f | ||
| 
						 | 
					050267fe74 | ||
| 
						 | 
					ce25a0171c | ||
| 
						 | 
					b7518c8651 | ||
| 
						 | 
					62dedfbef3 | ||
| 
						 | 
					4508978ea5 | ||
| 
						 | 
					c533a06e93 | ||
| 
						 | 
					5d3b4f0134 | ||
| 
						 | 
					4cf340ae9b | ||
| 
						 | 
					053ac03f01 | ||
| 
						 | 
					28a9439209 | ||
| 
						 | 
					cf4b5efdd1 | ||
| 
						 | 
					3067dab84c | ||
| 
						 | 
					1790320ba3 | ||
| 
						 | 
					f45df4265d | ||
| 
						 | 
					bcbcd6a68c | ||
| 
						 | 
					b1a0bf8916 | ||
| 
						 | 
					6c18bae83c | ||
| 
						 | 
					d0531966eb | ||
| 
						 | 
					989a47ee8c | ||
| 
						 | 
					03be6b687b | ||
| 
						 | 
					32c22d375a | ||
| 
						 | 
					bdf3f49a82 | ||
| 
						 | 
					356b4b0dc5 | ||
| 
						 | 
					3fc2ea8297 | ||
| 
						 | 
					06d976e853 | ||
| 
						 | 
					96ebd1c214 | ||
| 
						 | 
					fa28481736 | ||
| 
						 | 
					76b064cffc | ||
| 
						 | 
					333b5d12a0 | ||
| 
						 | 
					aa73504d95 | ||
| 
						 | 
					32305b453d | ||
| 
						 | 
					7d5e08c843 | ||
| 
						 | 
					dc0fc65229 | ||
| 
						 | 
					428af6d213 | ||
| 
						 | 
					2ffe597617 | ||
| 
						 | 
					0461eed0cb | ||
| 
						 | 
					ca1bacc212 | ||
| 
						 | 
					2229365ca8 | ||
| 
						 | 
					8c367364b6 | ||
| 
						 | 
					58909da425 | ||
| 
						 | 
					ff32bf467c | ||
| 
						 | 
					c5572d3095 | ||
| 
						 | 
					e706bcdf73 | ||
| 
						 | 
					d9ebcbd55c | ||
| 
						 | 
					240b13aa74 | ||
| 
						 | 
					97635d6f84 | ||
| 
						 | 
					6c21a22e4d | ||
| 
						 | 
					0add6f62b6 | ||
| 
						 | 
					049418cd03 | ||
| 
						 | 
					3ee1999c70 | ||
| 
						 | 
					e4b8920688 | ||
| 
						 | 
					eb236649fc | ||
| 
						 | 
					0a36a4545f | ||
| 
						 | 
					180985018b | ||
| 
						 | 
					c86c5d6905 | ||
| 
						 | 
					c2fad2dc7c | ||
| 
						 | 
					1196b7bde4 | ||
| 
						 | 
					19eddfd756 | ||
| 
						 | 
					ed280ef4ac | ||
| 
						 | 
					b6200ac3ff | ||
| 
						 | 
					626621a53a | ||
| 
						 | 
					fb3a64491e | ||
| 
						 | 
					294f9419f7 | ||
| 
						 | 
					a37956c95f | ||
| 
						 | 
					89f5ca3301 | ||
| 
						 | 
					07745b3082 | ||
| 
						 | 
					054c25f693 | ||
| 
						 | 
					01de04d8c9 | ||
| 
						 | 
					08e4cb54a8 | ||
| 
						 | 
					c71faffb71 | ||
| 
						 | 
					91e3a0b3a9 | ||
| 
						 | 
					5fa8f78434 | ||
| 
						 | 
					ab5ac21104 | ||
| 
						 | 
					0ebea2be9c | ||
| 
						 | 
					6f54bab0a8 | ||
| 
						 | 
					5d7deab6da | ||
| 
						 | 
					35fcf4a4ae | ||
| 
						 | 
					74565380aa | ||
| 
						 | 
					fa37496ffb | ||
| 
						 | 
					cc772ddd61 | ||
| 
						 | 
					4d2647cdbc | ||
| 
						 | 
					3caefd8fda | ||
| 
						 | 
					12381d57d1 | ||
| 
						 | 
					4ad8c4b86b | ||
| 
						 | 
					dbd2827ca1 | ||
| 
						 | 
					1a78557e0b | ||
| 
						 | 
					2e99963087 | ||
| 
						 | 
					4d763e1828 | ||
| 
						 | 
					a17b343c21 | ||
| 
						 | 
					556136dacc | ||
| 
						 | 
					a8c80ccece | ||
| 
						 | 
					f044511037 | ||
| 
						 | 
					b31e545c9d | ||
| 
						 | 
					fad5657eda | ||
| 
						 | 
					eaf9ccde39 | ||
| 
						 | 
					f9c625924e | ||
| 
						 | 
					64cb735abf | ||
| 
						 | 
					c85f322b20 | ||
| 
						 | 
					76096a725b | ||
| 
						 | 
					6eb7d13894 | ||
| 
						 | 
					7928b25ebf | ||
| 
						 | 
					78e6258b44 | ||
| 
						 | 
					c9259c2b15 | ||
| 
						 | 
					492d2eb573 | ||
| 
						 | 
					376dcd3b92 | ||
| 
						 | 
					60781bc6c2 | ||
| 
						 | 
					2d8827cb0c | ||
| 
						 | 
					802f7dcd30 | ||
| 
						 | 
					e62cfd9043 | ||
| 
						 | 
					cbcf6a4f23 | ||
| 
						 | 
					b0e42d3f6e | ||
| 
						 | 
					18eb66de06 | ||
| 
						 | 
					b32cccddf9 | ||
| 
						 | 
					362e26b3e2 | ||
| 
						 | 
					5c53284bde | ||
| 
						 | 
					e45d7f70e8 | ||
| 
						 | 
					70edc7dda4 | ||
| 
						 | 
					3244ed37a9 | ||
| 
						 | 
					406359bba1 | ||
| 
						 | 
					8b23dd915f | ||
| 
						 | 
					7e1f65405f | ||
| 
						 | 
					c1683073f1 | ||
| 
						 | 
					18ec86bd90 | ||
| 
						 | 
					315a6f43d7 | ||
| 
						 | 
					7603bb5fd5 | ||
| 
						 | 
					d53b79f8c3 | ||
| 
						 | 
					f534452c6a | ||
| 
						 | 
					0f6b83e7df | ||
| 
						 | 
					16a6aef5a7 | ||
| 
						 | 
					518fb9fb5e | ||
| 
						 | 
					547ace3cf8 | ||
| 
						 | 
					a4ba38ee78 | ||
| 
						 | 
					e32d52b9b8 | ||
| 
						 | 
					de40ced8b4 | ||
| 
						 | 
					cfee58798e | ||
| 
						 | 
					7ea01693a7 | ||
| 
						 | 
					e0d839aea2 | ||
| 
						 | 
					d3efd73429 | ||
| 
						 | 
					2db5505216 | ||
| 
						 | 
					f44b6c772a | ||
| 
						 | 
					f64fab1d2d | ||
| 
						 | 
					39bc2e0333 | ||
| 
						 | 
					5bb6f0ad8b | ||
| 
						 | 
					903537a2a0 | ||
| 
						 | 
					1db937826c | ||
| 
						 | 
					c1fe1c5d6b | ||
| 
						 | 
					a62e9f99a2 | ||
| 
						 | 
					9817a6aa47 | ||
| 
						 | 
					8185373bd4 | ||
| 
						 | 
					18c41aefc9 | ||
| 
						 | 
					32917f1922 | ||
| 
						 | 
					7a843e1fd1 | ||
| 
						 | 
					0e154ccf76 | ||
| 
						 | 
					120db06c60 | ||
| 
						 | 
					e76ab05d45 | ||
| 
						 | 
					43eeb009ce | ||
| 
						 | 
					9000eef49d | ||
| 
						 | 
					e198c8452b | ||
| 
						 | 
					aea66ddff6 | ||
| 
						 | 
					a5f4ffa58c | ||
| 
						 | 
					a1c39e142d | ||
| 
						 | 
					e76a0f564c | ||
| 
						 | 
					8307d9c4de | ||
| 
						 | 
					1dbf6b096b | ||
| 
						 | 
					6fe71ecc01 | ||
| 
						 | 
					57e58eaf2a | ||
| 
						 | 
					00a5db71cf | ||
| 
						 | 
					c7fa57cd28 | ||
| 
						 | 
					8f2c86d79e | ||
| 
						 | 
					56f1da5c66 | ||
| 
						 | 
					30a205c0e3 | ||
| 
						 | 
					98d77d37d0 | ||
| 
						 | 
					0853fb940a | ||
| 
						 | 
					6dd819a61e | ||
| 
						 | 
					39aae19ed7 | ||
| 
						 | 
					20749e5dbd | ||
| 
						 | 
					99e1cd549d | ||
| 
						 | 
					efdbeb7c1b | ||
| 
						 | 
					ea4dbd14bc | ||
| 
						 | 
					838df4b00b | ||
| 
						 | 
					b6110ba8dc | ||
| 
						 | 
					fd763ad857 | ||
| 
						 | 
					e3d59832c5 | ||
| 
						 | 
					2c85bb4178 | ||
| 
						 | 
					8493777961 | ||
| 
						 | 
					4e7405aca9 | ||
| 
						 | 
					34207ba509 | ||
| 
						 | 
					6dc499f305 | ||
| 
						 | 
					92e2242cf0 | ||
| 
						 | 
					ea214fbe0f | ||
| 
						 | 
					487b8a0430 | ||
| 
						 | 
					8b060342bd | ||
| 
						 | 
					27d6c063ad | ||
| 
						 | 
					0e62b71959 | ||
| 
						 | 
					2c3f79829e | ||
| 
						 | 
					5d2b0bc0cc | ||
| 
						 | 
					7e3a780dcd | ||
| 
						 | 
					1035200f26 | ||
| 
						 | 
					8532b10290 | ||
| 
						 | 
					f0c6c4eb1f | ||
| 
						 | 
					ba194bd19e | ||
| 
						 | 
					a35274ddb7 | ||
| 
						 | 
					ab541e3e0f | ||
| 
						 | 
					67ce04993e | ||
| 
						 | 
					22cdc8f414 | ||
| 
						 | 
					8b022a5595 | ||
| 
						 | 
					7a1393ba26 | ||
| 
						 | 
					5ed954e6de | ||
| 
						 | 
					96572fbe6a | ||
| 
						 | 
					4ab47e72e5 | ||
| 
						 | 
					70e0fd0b45 | ||
| 
						 | 
					26cd031be8 | ||
| 
						 | 
					743e8cc249 | ||
| 
						 | 
					2bf7974076 | ||
| 
						 | 
					9c16e4e2f3 | ||
| 
						 | 
					07f6c85cc7 | ||
| 
						 | 
					d4968e10e5 | ||
| 
						 | 
					bd3817198e | ||
| 
						 | 
					5b5737f65e | ||
| 
						 | 
					5af8753171 | ||
| 
						 | 
					8bef74f441 | ||
| 
						 | 
					f1a42b0f97 | ||
| 
						 | 
					95682a9494 | ||
| 
						 | 
					ef41867303 | ||
| 
						 | 
					8d4b03ce87 | ||
| 
						 | 
					06263354a5 | ||
| 
						 | 
					aa30e11c8b | ||
| 
						 | 
					65bca8e008 | ||
| 
						 | 
					068791f6c1 | ||
| 
						 | 
					cbc4563b30 | ||
| 
						 | 
					f381d7c3bf | ||
| 
						 | 
					0a8d8128b3 | ||
| 
						 | 
					46135d4f0f | ||
| 
						 | 
					7ba44e7945 | ||
| 
						 | 
					dd4ad4efc4 | ||
| 
						 | 
					807658e972 | ||
| 
						 | 
					8499a29d0a | ||
| 
						 | 
					283eedef90 | ||
| 
						 | 
					ce515c5389 | ||
| 
						 | 
					83440614bc | ||
| 
						 | 
					a93661f9e1 | ||
| 
						 | 
					216f7631de | ||
| 
						 | 
					361bf847af | ||
| 
						 | 
					46f54eb3d9 | ||
| 
						 | 
					bc47c6cc4f | ||
| 
						 | 
					8bfdfa1f46 | ||
| 
						 | 
					999542c915 | ||
| 
						 | 
					cb38e9c4a2 | ||
| 
						 | 
					42c56c2460 | ||
| 
						 | 
					e2d904c32b | ||
| 
						 | 
					fa9c09feee | ||
| 
						 | 
					3f6a2d02fd | ||
| 
						 | 
					5b37901b57 | ||
| 
						 | 
					2df4ccd1cd | ||
| 
						 | 
					dcd15e6145 | ||
| 
						 | 
					2a318eb3f2 | ||
| 
						 | 
					522eec00cd | ||
| 
						 | 
					be11c32815 | ||
| 
						 | 
					24c91d95de | ||
| 
						 | 
					7562eb6006 | ||
| 
						 | 
					0aa7405a2a | ||
| 
						 | 
					a119e58773 | ||
| 
						 | 
					8a32b42172 | ||
| 
						 | 
					94a15404da | ||
| 
						 | 
					fefede5b51 | ||
| 
						 | 
					5be00f23be | ||
| 
						 | 
					bdbd2e96de | ||
| 
						 | 
					7785a57f8a | ||
| 
						 | 
					cf01e26b2f | ||
| 
						 | 
					6e46ad9f3a | ||
| 
						 | 
					921b18f713 | ||
| 
						 | 
					53175e8788 | ||
| 
						 | 
					920541fa26 | ||
| 
						 | 
					9d8922764c | ||
| 
						 | 
					97f2c7c161 | ||
| 
						 | 
					38235bc145 | ||
| 
						 | 
					3ce3a5a952 | ||
| 
						 | 
					3005a400ca | ||
| 
						 | 
					34e7134db2 | ||
| 
						 | 
					12710dc644 | ||
| 
						 | 
					a10ad577a7 | ||
| 
						 | 
					d3c559a917 | ||
| 
						 | 
					1e7628a3ef | ||
| 
						 | 
					d5a85997f2 | ||
| 
						 | 
					5a37e0e1ef | ||
| 
						 | 
					00f6a74397 | ||
| 
						 | 
					c9439107c1 | ||
| 
						 | 
					ba65664cbd | ||
| 
						 | 
					3da0730a31 | 
							
								
								
									
										16
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -55,6 +55,7 @@ mutter-restart-helper
 | 
			
		||||
mutter-test-client
 | 
			
		||||
mutter-test-runner
 | 
			
		||||
mutter-test-unit-tests
 | 
			
		||||
mutter-test-headless-start-test
 | 
			
		||||
mutter-all.test
 | 
			
		||||
org.gnome.mutter.gschema.valid
 | 
			
		||||
org.gnome.mutter.gschema.xml
 | 
			
		||||
@@ -71,6 +72,8 @@ src/stamp-meta-enum-types.h
 | 
			
		||||
src/meta-dbus-display-config.[ch]
 | 
			
		||||
src/meta-dbus-idle-monitor.[ch]
 | 
			
		||||
src/meta-dbus-login1.[ch]
 | 
			
		||||
src/meta-dbus-remote-desktop.[ch]
 | 
			
		||||
src/meta-dbus-screen-cast.[ch]
 | 
			
		||||
src/gtk-primary-selection-protocol.c
 | 
			
		||||
src/gtk-primary-selection-server-protocol.h
 | 
			
		||||
src/gtk-shell-protocol.c
 | 
			
		||||
@@ -85,6 +88,18 @@ src/pointer-constraints-unstable-v*-protocol.c
 | 
			
		||||
src/pointer-constraints-unstable-v*-server-protocol.h
 | 
			
		||||
src/xdg-foreign-unstable-v*-protocol.c
 | 
			
		||||
src/xdg-foreign-unstable-v*-server-protocol.h
 | 
			
		||||
src/xdg-output-unstable-v1-protocol.c
 | 
			
		||||
src/xdg-output-unstable-v1-server-protocol.h
 | 
			
		||||
src/xwayland-keyboard-grab-unstable-v1-protocol.c
 | 
			
		||||
src/xwayland-keyboard-grab-unstable-v1-server-protocol.h
 | 
			
		||||
src/tablet-unstable-v*-protocol.c
 | 
			
		||||
src/tablet-unstable-v*-server-protocol.h
 | 
			
		||||
src/keyboard-shortcuts-inhibit-unstable-v*-protocol.c
 | 
			
		||||
src/keyboard-shortcuts-inhibit-unstable-v*-server-protocol.h
 | 
			
		||||
src/linux-dmabuf-unstable-v*-protocol.c
 | 
			
		||||
src/linux-dmabuf-unstable-v*-server-protocol.h
 | 
			
		||||
src/xdg-shell-protocol.c
 | 
			
		||||
src/xdg-shell-server-protocol.h
 | 
			
		||||
src/meta/meta-version.h
 | 
			
		||||
src/libmutter-*.pc
 | 
			
		||||
doc/reference/*.args
 | 
			
		||||
@@ -112,3 +127,4 @@ ltsugar.m4
 | 
			
		||||
ltversion.m4
 | 
			
		||||
lt~obsolete.m4
 | 
			
		||||
.dirstamp
 | 
			
		||||
**/tags.*
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										199
									
								
								NEWS
									
									
									
									
									
								
							
							
						
						
									
										199
									
								
								NEWS
									
									
									
									
									
								
							@@ -1,3 +1,202 @@
 | 
			
		||||
3.28.3
 | 
			
		||||
======
 | 
			
		||||
* Handle touch events on server-side titlebars [Carlos; #770185]
 | 
			
		||||
* Fix crash with unhandled mouse buttons on titlebars [Olivier; #160]
 | 
			
		||||
* Fix Korean Hangul support on wayland [Changwoo; #152]
 | 
			
		||||
* Fix crash when taking up from suspend [Jonas; #786929]
 | 
			
		||||
* Fix crash with parent-less modal dialogs [Olivier; #174]
 | 
			
		||||
* Misc. bug fixes [Olivier, Georges; #83, #112, #150, #104,
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
  Jonas Ådahl, Olivier Fourdan, Carlos Garnacho, Georges Basile Stavracas Neto,
 | 
			
		||||
  Changwoo Ryu, Marco Trevisan (Treviño)
 | 
			
		||||
 | 
			
		||||
3.28.2
 | 
			
		||||
======
 | 
			
		||||
* Take inhibitors into account for monitoring idle [Bastien; #705942]
 | 
			
		||||
* Fix window animations on wayland [Georges; #780292]
 | 
			
		||||
* Misc. bug fixes [Mario, Jonas, Olivier, Florian; gnome-shell#157, #130,
 | 
			
		||||
  #21, #124, !96, #138, !102, #781471]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
  Jonas Ådahl, Olivier Fourdan, Carlos Garnacho, Florian Müllner,
 | 
			
		||||
  Georges Basile Stavracas Neto, Bastien Nocera, Mario Sanchez Prada,
 | 
			
		||||
  Ray Strode, Marco Trevisan (Treviño)
 | 
			
		||||
 | 
			
		||||
3.28.1
 | 
			
		||||
======
 | 
			
		||||
* Fix various input-method regressions [Carlos; #65, #74, #66]
 | 
			
		||||
* Fix wayland build on FreeBSD [Ting-Wei; #792280, #792717]
 | 
			
		||||
* Fix swapped colors in screenshots (again) [Carlos; #72]
 | 
			
		||||
* Allow building with elogind [Rasmus; !46]
 | 
			
		||||
* Consider display rotation for cursor [Olivier; #85]
 | 
			
		||||
* Fall back to non-modifier GBM surfaces [Daniel; #84]
 | 
			
		||||
* Disable KMS modifiers by default [Jonas; #81]
 | 
			
		||||
* Misc bug fixes [handsome-feng; !45]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
  Jonas Ådahl, Olivier Fourdan, Carlos Garnacho, handsome-feng, Yussuf Khalil,
 | 
			
		||||
  Ting-Wei Lan, Aleksandr Mezin, Alberts Muktupāvels,
 | 
			
		||||
  Georges Basile Stavracas Neto, Benjamin Otte, Daniel Stone, Rasmus Thomsen,
 | 
			
		||||
  Marco Trevisan (Treviño), Daniel van Vugt
 | 
			
		||||
 | 
			
		||||
Translators:
 | 
			
		||||
  Emin Tufan Çetin [tr], Dušan Kazik [sk], Matej Urbančič [sl]
 | 
			
		||||
 | 
			
		||||
3.28.0
 | 
			
		||||
======
 | 
			
		||||
* Fix xdg-foreign regression [Carlos; #63]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
  Carlos Garnacho, Georges Basile Stavracas Neto
 | 
			
		||||
 | 
			
		||||
Translators:
 | 
			
		||||
  Marek Cernocky [cs], Ask Hjorth Larsen [da], Chao-Hsiung Liao [zh_TW],
 | 
			
		||||
  Anders Jonsson [sv], Mart Raudsepp [et]
 | 
			
		||||
 | 
			
		||||
3.27.92
 | 
			
		||||
=======
 | 
			
		||||
* Fix use of modifiers with multi-GPU systems [Louis-Francis; #18]
 | 
			
		||||
* Add xdg-shell stable support [Jonas; #791938]
 | 
			
		||||
* Fix scaling of icons in titlebar buttons [Egmont; #23]
 | 
			
		||||
* Implement missing wacom functionality on X11 [Carlos; #48]
 | 
			
		||||
* Force 8-bit RGB config [Jonas; #2]
 | 
			
		||||
* Misc. bug fixes [Jonas, Olivier, Robert; #6, #27, #792203]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
  Jonas Ådahl, Olivier Fourdan, Carlos Garnacho, Egmont Koblinger, Robert Mader,
 | 
			
		||||
  Bastien Nocera, Louis-Francis Ratté-Boulianne
 | 
			
		||||
 | 
			
		||||
Translators:
 | 
			
		||||
  Daniel Mustieles [es], Марко Костић [sr], Милош Поповић [sr@latin],
 | 
			
		||||
  Fran Dieguez [gl], Balázs Úr [hu], Gwan-gyeong Mun [ko], Rūdolfs Mazurs [lv],
 | 
			
		||||
  Milo Casagrande [it], Mario Blättermann [de], GNOME Translation Robot [gd,
 | 
			
		||||
  nl], Claude Paroz [fr], Aurimas Černius [lt]
 | 
			
		||||
 | 
			
		||||
3.27.91
 | 
			
		||||
=======
 | 
			
		||||
* Fix handling of trackball settings on wayland [Carlos; #787804]
 | 
			
		||||
* Apply font settings on wayland [Daniel; #645433]
 | 
			
		||||
* Fix keybindings getting mixed up with some layouts [Jonas; #789300]
 | 
			
		||||
* Fix bluetooth mouse cursor disappearing after idle [Benoit; #761067]
 | 
			
		||||
* Support platforms that export EGL_KHR_platform_gbm [memeka; #780668]
 | 
			
		||||
* Add keyboard accessibility support on wayland [Olivier; #788564]
 | 
			
		||||
* Fix missing cursor when using screen magnifier [Carlos; #754806]
 | 
			
		||||
* Fix external monitor shutting off on wayland when lid closes [Jonas; #788915]
 | 
			
		||||
* Add xdg-output support [Olivier; #787363]
 | 
			
		||||
* Add Xwayland grab keyboard support [Olivier; #783342]
 | 
			
		||||
* Allow shortcut inhibition of the super key [Olivier; #790627]
 | 
			
		||||
* Take "panel orientation" drm_connector property into account [Hans; #782294]
 | 
			
		||||
* Fix focus window ending up below other windows on wayland [Olivier; #780820]
 | 
			
		||||
* Fix maximized windows restoring to a tiny size on wayland [Olivier; #783901]
 | 
			
		||||
* Fix tap-and-drag setting on X11 [Jonas; #775755]
 | 
			
		||||
* Fix handling of single-touch devices on wayland [Carlos; #792005]
 | 
			
		||||
* Support tiled/compressed buffers [Daniel; #785779]
 | 
			
		||||
* Port screencast support to pipewire 0.1.8 [Jonas; #792854]
 | 
			
		||||
* Add support for third stylus button on newer tablets [Jason; #790033]
 | 
			
		||||
* Fix background corruption regression on nvidia [Jonas; #739178]
 | 
			
		||||
* Misc. bug fixes [Jonas, Rui, Michael, Marco, Carlos, Olivier, Philip, Piotr,
 | 
			
		||||
  Ting-Wei, Daniel, Jeremy, Hans, Florian, Ray, Jeff, George, Gwan-gyeong;
 | 
			
		||||
  #789153, #788493, #784314, #789227, #789223, #789277, #782344, #789552,
 | 
			
		||||
  #789553, #788695, #789984, #788764, #789386, #784545, #790336, #790358,
 | 
			
		||||
  #791022, #791006, #789070, #772218, #791383, #791809, #776220, #791916,
 | 
			
		||||
  #792281, #790309, #791371, #792527, #792599, #788834, #792765, #792062,
 | 
			
		||||
  #645460, #792853, !2, #792818, #8, #12, #789501, #10, #789961, #13, !15, #1,
 | 
			
		||||
  #26, #28, #35, #36, #38]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
  Jonas Ådahl, Jeremy Bicha, Michael Catanzaro, Piotr Drąg, Olivier Fourdan,
 | 
			
		||||
  Carlos Garnacho, Jason Gerecke, Hans de Goede, Benoit Gschwind,
 | 
			
		||||
  Peter Hutterer, George Kiagiadakis, Ting-Wei Lan, Rui Matos, memeka,
 | 
			
		||||
  Florian Müllner, Gwan-gyeong Mun, Jeremy Nickurak, Marc-Antoine Perennou,
 | 
			
		||||
  Jeff Smith, Daniel Stone, Ray Strode, Marco Trevisan (Treviño),
 | 
			
		||||
  Daniel van Vugt, Philip Withnall
 | 
			
		||||
 | 
			
		||||
Translators:
 | 
			
		||||
  Khaled Hosny [ar], Kjartan Maraas [nb], Piotr Drąg [pl],
 | 
			
		||||
  Rafael Fontenelle [pt_BR], Christian Kirbach [de], Anders Jonsson [sv],
 | 
			
		||||
  Charles Monzat [fr], Marek Cernocky [cs], Muhammet Kara [tr],
 | 
			
		||||
  Milo Casagrande [it], Pawan Chitrakar [ne], Yosef Or Boczko [he],
 | 
			
		||||
  Kukuh Syafaat [id], Daniel Mustieles [es], Fabio Tomat [fur],
 | 
			
		||||
  Kristjan SCHMIDT [eo], Balázs Úr [hu], Andika Triwidada [id],
 | 
			
		||||
  Fran Dieguez [gl], gogo [hr]
 | 
			
		||||
 | 
			
		||||
3.27.1
 | 
			
		||||
======
 | 
			
		||||
* Work with clients that require older linux_dmabuf protocol [Daniel; #788558]
 | 
			
		||||
* Support hybrid GPU systems [Jonas; #785381]
 | 
			
		||||
* Prevent crash when closing maximized windows [Jonni; #788666]
 | 
			
		||||
* Use the correct monitor for HiDPI scaling of shell chrome [Jonas; #788820]
 | 
			
		||||
* Fix unredirection of fullscreen windows [Rui, Jonas; #788493]
 | 
			
		||||
* Fix list of supported monitor scales on X11 [Jonas; #788901]
 | 
			
		||||
* Misc. bug fixes [Florian, Jonas, Marco; #788572, #788569, #788607, #788860,
 | 
			
		||||
  #788921]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
  Jonas Ådahl, Carlos Garnacho, Rui Matos, Florian Müllner, Daniel Stone,
 | 
			
		||||
  Marco Trevisan, Jonni Westphalen
 | 
			
		||||
 | 
			
		||||
Translations:
 | 
			
		||||
  Xavi Ivars [ca@valencia]
 | 
			
		||||
 | 
			
		||||
3.26.1
 | 
			
		||||
======
 | 
			
		||||
* Fix crash when respawning shortcut inhibitor dialog [Olivier; #787568]
 | 
			
		||||
* Fix crash during monitor configuration migration [Carlos, Jonas; #787668]
 | 
			
		||||
* Fix multihead regressions in X11 session [Jonas; #787477]
 | 
			
		||||
* Fix screen rotation regressions [Hans; #787836]
 | 
			
		||||
* Fix keybindings not being resolved with non-latin layouts [Jonas; #787016]
 | 
			
		||||
* Support snap packages for sandboxed app IDs [Marco; #788217]
 | 
			
		||||
* Fix crash when reconnecting tablet device [Jason; #787649]
 | 
			
		||||
* Support running headless [Jonas; #730551, #787637]
 | 
			
		||||
* Support _NET_RESTACK_WINDOW and ConfigureRequest siblings [Vasilis; #786365]
 | 
			
		||||
* Fix monitor layout not being remembered across sessions [Jonas; #787629]
 | 
			
		||||
* Make sure to export _NET_NUMBER_OF_DESKTOPS [Florian; #760651]
 | 
			
		||||
* Allow resizing of tiled windows [Georges, Florian; #645153]
 | 
			
		||||
* Export tiling information to clients [Georges; #751857]
 | 
			
		||||
* Misc. bug fixes [Jonas, Florian, Jeremy, Rico; #787570, #787715, #787953,
 | 
			
		||||
  #788049, #788199, #788292, #788197]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
  Jonas Ådahl, Andrea Azzarone, Georges Basile Stavracas Neto, Hans de Goede,
 | 
			
		||||
  Olivier Fourdan, Carlos Garnacho, Jason Gerecke, Vasilis Liaskovitis,
 | 
			
		||||
  Rui Matos, Florian Müllner, Jeremy Soller, Marco Trevisan, Rico Tzschichholz
 | 
			
		||||
 | 
			
		||||
Translations:
 | 
			
		||||
  Matej Urbančič [sl], gogo [hr], Cheng-Chia Tseng [zh_TW]
 | 
			
		||||
 | 
			
		||||
3.26.0
 | 
			
		||||
======
 | 
			
		||||
Contributors:
 | 
			
		||||
  Florian Müllner
 | 
			
		||||
 | 
			
		||||
Translations:
 | 
			
		||||
  Trần Ngọc Quân [vi], Inaki Larranaga Murgoitio [eu], Jordi Mas [ca],
 | 
			
		||||
  Anders Jonsson [sv], Alexander Shopov [bg], Ask Hjorth Larsen [da],
 | 
			
		||||
  Jean-Baptiste Holcroft [fr], A S Alam [pa]
 | 
			
		||||
 | 
			
		||||
3.25.92
 | 
			
		||||
=======
 | 
			
		||||
* Add screencast and remote desktop support [Jonas; #784199]
 | 
			
		||||
* Support running with no attached monitors [Jonas; #730551]
 | 
			
		||||
* Add a vertical gradient effect to background actor [Alessandro; #786618]
 | 
			
		||||
* Misc. bug fixes [Mario, Daniel, Piotr, Jonas, Bastien; #786619, #786677,
 | 
			
		||||
  #772218, #786918, #760670]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
  Jonas Ådahl, Alessandro Bono, Piotr Drąg, Bastien Nocera,
 | 
			
		||||
  Mario Sanchez Prada, Daniel Stone
 | 
			
		||||
 | 
			
		||||
Translations:
 | 
			
		||||
  Marek Cernocky [cs], Aurimas Černius [lt], Piotr Drąg [pl],
 | 
			
		||||
  Fran Dieguez [gl], gogo [hr], Dušan Kazik [sk], Milo Casagrande [it],
 | 
			
		||||
  Jordi Mas [ca], Cheng-Chia Tseng [zh_TW], Марко Костић [sr],
 | 
			
		||||
  Милош Поповић [sr@latin], Rūdolfs Mazurs [lv], Matej Urbančič [sl],
 | 
			
		||||
  Ask Hjorth Larsen [da], Piotr Drąg [it, lt], Jiri Grönroos [fi],
 | 
			
		||||
  Emin Tufan Çetin [tr], Wolfgang Stöggl [de], Kukuh Syafaat [id],
 | 
			
		||||
  Yuras Shumovich [be], Changwoo Ryu [ko], Alexander Shopov [bg],
 | 
			
		||||
  Rafael Fontenelle [pt_BR], Balázs Úr [hu]
 | 
			
		||||
 | 
			
		||||
3.25.91
 | 
			
		||||
=======
 | 
			
		||||
* Reduce memory use of suspended instances [Jonas; #786299]
 | 
			
		||||
 
 | 
			
		||||
@@ -87,6 +87,8 @@ source_h =					\
 | 
			
		||||
	clutter-image.h		\
 | 
			
		||||
	clutter-input-device.h	\
 | 
			
		||||
	clutter-input-device-tool.h	\
 | 
			
		||||
	clutter-input-focus.h	\
 | 
			
		||||
	clutter-input-method.h	\
 | 
			
		||||
        clutter-interval.h            \
 | 
			
		||||
	clutter-keyframe-transition.h	\
 | 
			
		||||
	clutter-keysyms.h 		\
 | 
			
		||||
@@ -169,6 +171,8 @@ source_c = \
 | 
			
		||||
	clutter-image.c		\
 | 
			
		||||
	clutter-input-device.c	\
 | 
			
		||||
	clutter-input-device-tool.c	\
 | 
			
		||||
	clutter-input-focus.c	\
 | 
			
		||||
	clutter-input-method.c	\
 | 
			
		||||
	clutter-virtual-input-device.c	\
 | 
			
		||||
	clutter-interval.c            \
 | 
			
		||||
	clutter-keyframe-transition.c	\
 | 
			
		||||
@@ -229,6 +233,8 @@ source_h_priv = \
 | 
			
		||||
	clutter-flatten-effect.h		\
 | 
			
		||||
	clutter-gesture-action-private.h	\
 | 
			
		||||
	clutter-id-pool.h 			\
 | 
			
		||||
	clutter-input-focus-private.h		\
 | 
			
		||||
	clutter-input-method-private.h		\
 | 
			
		||||
	clutter-master-clock.h			\
 | 
			
		||||
	clutter-master-clock-default.h		\
 | 
			
		||||
	clutter-offscreen-effect-private.h	\
 | 
			
		||||
@@ -388,6 +394,7 @@ x11_source_c = \
 | 
			
		||||
	x11/clutter-keymap-x11.c		\
 | 
			
		||||
	x11/clutter-stage-x11.c		\
 | 
			
		||||
	x11/clutter-x11-texture-pixmap.c	\
 | 
			
		||||
	x11/clutter-xkb-a11y-x11.c		\
 | 
			
		||||
	$(NULL)
 | 
			
		||||
 | 
			
		||||
x11_source_h = \
 | 
			
		||||
@@ -402,6 +409,7 @@ x11_source_h_priv = \
 | 
			
		||||
	x11/clutter-keymap-x11.h		\
 | 
			
		||||
	x11/clutter-settings-x11.h		\
 | 
			
		||||
	x11/clutter-stage-x11.h		\
 | 
			
		||||
	x11/clutter-xkb-a11y-x11.h		\
 | 
			
		||||
	$(NULL)
 | 
			
		||||
 | 
			
		||||
x11_source_c_priv = \
 | 
			
		||||
@@ -684,7 +692,7 @@ Cally_@LIBMUTTER_API_VERSION@_gir_CFLAGS = $(AM_CPPFLAGS) $(CLUTTER_CFLAGS)
 | 
			
		||||
Cally_@LIBMUTTER_API_VERSION@_gir_SCANNERFLAGS = \
 | 
			
		||||
	--warn-all \
 | 
			
		||||
	--c-include='cally/cally.h' \
 | 
			
		||||
	--pkg-export=mutter-cally-@LIBMUTTER_API_VERSION@ \
 | 
			
		||||
	--pkg-export=mutter-clutter-@LIBMUTTER_API_VERSION@ \
 | 
			
		||||
	--include-uninstalled=$(top_builddir)/clutter/Clutter-@LIBMUTTER_API_VERSION@.gir
 | 
			
		||||
 | 
			
		||||
INTROSPECTION_GIRS += Cally-@LIBMUTTER_API_VERSION@.gir
 | 
			
		||||
 
 | 
			
		||||
@@ -4828,8 +4828,7 @@ clutter_actor_set_scale_factor (ClutterActor      *self,
 | 
			
		||||
  g_assert (pspec != NULL);
 | 
			
		||||
  g_assert (scale_p != NULL);
 | 
			
		||||
 | 
			
		||||
  if (*scale_p != factor)
 | 
			
		||||
    _clutter_actor_create_transition (self, pspec, *scale_p, factor);
 | 
			
		||||
  _clutter_actor_create_transition (self, pspec, *scale_p, factor);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void
 | 
			
		||||
@@ -10264,10 +10263,9 @@ clutter_actor_set_position (ClutterActor *self,
 | 
			
		||||
  cur_position.x = clutter_actor_get_x (self);
 | 
			
		||||
  cur_position.y = clutter_actor_get_y (self);
 | 
			
		||||
 | 
			
		||||
  if (!clutter_point_equals (&cur_position, &new_position))
 | 
			
		||||
    _clutter_actor_create_transition (self, obj_props[PROP_POSITION],
 | 
			
		||||
                                      &cur_position,
 | 
			
		||||
                                      &new_position);
 | 
			
		||||
  _clutter_actor_create_transition (self, obj_props[PROP_POSITION],
 | 
			
		||||
                                    &cur_position,
 | 
			
		||||
                                    &new_position);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 
 | 
			
		||||
@@ -58,6 +58,8 @@ struct _ClutterBackend
 | 
			
		||||
  gint32 units_serial;
 | 
			
		||||
 | 
			
		||||
  GList *event_translators;
 | 
			
		||||
 | 
			
		||||
  ClutterInputMethod *input_method;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct _ClutterBackendClass
 | 
			
		||||
@@ -100,6 +102,8 @@ struct _ClutterBackendClass
 | 
			
		||||
 | 
			
		||||
  PangoDirection        (* get_keymap_direction) (ClutterBackend   *backend);
 | 
			
		||||
 | 
			
		||||
  void                  (* bell_notify)          (ClutterBackend   *backend);
 | 
			
		||||
 | 
			
		||||
  /* signals */
 | 
			
		||||
  void (* resolution_changed) (ClutterBackend *backend);
 | 
			
		||||
  void (* font_changed)       (ClutterBackend *backend);
 | 
			
		||||
 
 | 
			
		||||
@@ -127,6 +127,7 @@ clutter_backend_finalize (GObject *gobject)
 | 
			
		||||
 | 
			
		||||
  g_free (backend->font_name);
 | 
			
		||||
  clutter_backend_set_font_options (backend, NULL);
 | 
			
		||||
  g_clear_object (&backend->input_method);
 | 
			
		||||
 | 
			
		||||
  G_OBJECT_CLASS (clutter_backend_parent_class)->finalize (gobject);
 | 
			
		||||
}
 | 
			
		||||
@@ -1363,3 +1364,41 @@ clutter_set_allowed_drivers (const char *drivers)
 | 
			
		||||
 | 
			
		||||
  allowed_drivers = g_strdup (drivers);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_backend_bell_notify (ClutterBackend *backend)
 | 
			
		||||
{
 | 
			
		||||
  ClutterBackendClass *klass;
 | 
			
		||||
 | 
			
		||||
  klass = CLUTTER_BACKEND_GET_CLASS (backend);
 | 
			
		||||
  if (klass->bell_notify)
 | 
			
		||||
    klass->bell_notify (backend);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_backend_get_input_method:
 | 
			
		||||
 * @backend: the #CLutterBackend
 | 
			
		||||
 *
 | 
			
		||||
 * Returns the input method used by Clutter
 | 
			
		||||
 *
 | 
			
		||||
 * Returns: (transfer none): the input method
 | 
			
		||||
 **/
 | 
			
		||||
ClutterInputMethod *
 | 
			
		||||
clutter_backend_get_input_method (ClutterBackend *backend)
 | 
			
		||||
{
 | 
			
		||||
  return backend->input_method;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_backend_set_input_method:
 | 
			
		||||
 * @backend: the #ClutterBackend
 | 
			
		||||
 * @method: the input method
 | 
			
		||||
 *
 | 
			
		||||
 * Sets the input method to be used by Clutter
 | 
			
		||||
 **/
 | 
			
		||||
void
 | 
			
		||||
clutter_backend_set_input_method (ClutterBackend     *backend,
 | 
			
		||||
                                  ClutterInputMethod *method)
 | 
			
		||||
{
 | 
			
		||||
  g_set_object (&backend->input_method, method);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -74,6 +74,15 @@ const cairo_font_options_t *    clutter_backend_get_font_options        (Clutter
 | 
			
		||||
CLUTTER_AVAILABLE_IN_1_8
 | 
			
		||||
CoglContext *                   clutter_backend_get_cogl_context        (ClutterBackend             *backend);
 | 
			
		||||
 | 
			
		||||
CLUTTER_AVAILABLE_IN_ALL
 | 
			
		||||
void                            clutter_backend_bell_notify             (ClutterBackend             *backend);
 | 
			
		||||
 | 
			
		||||
CLUTTER_AVAILABLE_IN_MUTTER
 | 
			
		||||
ClutterInputMethod *            clutter_backend_get_input_method        (ClutterBackend             *backend);
 | 
			
		||||
 | 
			
		||||
CLUTTER_AVAILABLE_IN_MUTTER
 | 
			
		||||
void                            clutter_backend_set_input_method        (ClutterBackend             *backend,
 | 
			
		||||
                                                                         ClutterInputMethod         *method);
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
#endif /* __CLUTTER_BACKEND_H__ */
 | 
			
		||||
 
 | 
			
		||||
@@ -324,7 +324,7 @@ _clutter_bezier_init (ClutterBezier *b,
 | 
			
		||||
   * triggers, we need to change those two functions a bit.
 | 
			
		||||
   */
 | 
			
		||||
  if (b->ax > 0x1fff || b->bx > 0x1fff || b->cx > 0x1fff)
 | 
			
		||||
    g_warning ("Calculated coefficents will result in multiplication "
 | 
			
		||||
    g_warning ("Calculated coefficients will result in multiplication "
 | 
			
		||||
               "overflow in clutter_bezier_t2x and clutter_bezier_t2y.");
 | 
			
		||||
 | 
			
		||||
  /*
 | 
			
		||||
 
 | 
			
		||||
@@ -145,6 +145,9 @@ struct _ClutterInputDevice
 | 
			
		||||
  guint is_enabled : 1;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
typedef void (*ClutterEmitInputDeviceEvent) (ClutterEvent       *event,
 | 
			
		||||
                                             ClutterInputDevice *device);
 | 
			
		||||
 | 
			
		||||
struct _ClutterInputDeviceClass
 | 
			
		||||
{
 | 
			
		||||
  GObjectClass parent_class;
 | 
			
		||||
@@ -163,6 +166,11 @@ struct _ClutterInputDeviceClass
 | 
			
		||||
 | 
			
		||||
  gboolean (* is_grouped) (ClutterInputDevice *device,
 | 
			
		||||
                           ClutterInputDevice *other_device);
 | 
			
		||||
 | 
			
		||||
  /* Keyboard accessbility */
 | 
			
		||||
  void (* process_kbd_a11y_event) (ClutterEvent               *event,
 | 
			
		||||
                                   ClutterInputDevice         *device,
 | 
			
		||||
                                   ClutterEmitInputDeviceEvent emit_event_func);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Platform-dependent interface */
 | 
			
		||||
 
 | 
			
		||||
@@ -54,6 +54,9 @@ struct _ClutterDeviceManagerPrivate
 | 
			
		||||
{
 | 
			
		||||
  /* back-pointer to the backend */
 | 
			
		||||
  ClutterBackend *backend;
 | 
			
		||||
 | 
			
		||||
  /* Keyboard a11y */
 | 
			
		||||
  ClutterKbdA11ySettings kbd_a11y_settings;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum
 | 
			
		||||
@@ -72,6 +75,8 @@ enum
 | 
			
		||||
  DEVICE_ADDED,
 | 
			
		||||
  DEVICE_REMOVED,
 | 
			
		||||
  TOOL_CHANGED,
 | 
			
		||||
  KBD_A11Y_MASK_CHANGED,
 | 
			
		||||
  KBD_A11Y_FLAGS_CHANGED,
 | 
			
		||||
 | 
			
		||||
  LAST_SIGNAL
 | 
			
		||||
};
 | 
			
		||||
@@ -196,6 +201,46 @@ clutter_device_manager_class_init (ClutterDeviceManagerClass *klass)
 | 
			
		||||
                  G_TYPE_NONE, 2,
 | 
			
		||||
                  CLUTTER_TYPE_INPUT_DEVICE,
 | 
			
		||||
                  CLUTTER_TYPE_INPUT_DEVICE_TOOL);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * ClutterDeviceManager::kbd-a11y-mods-state-changed:
 | 
			
		||||
   * @manager: the #ClutterDeviceManager that emitted the signal
 | 
			
		||||
   * @latched_mask: the latched modifier mask from stickykeys
 | 
			
		||||
   * @locked_mask:  the locked modifier mask from stickykeys
 | 
			
		||||
   *
 | 
			
		||||
   * The ::kbd-a11y-mods-state-changed signal is emitted each time either the
 | 
			
		||||
   * latched modifiers mask or locked modifiers mask are changed as the
 | 
			
		||||
   * result of keyboard accessibilty's sticky keys operations.
 | 
			
		||||
   */
 | 
			
		||||
  manager_signals[KBD_A11Y_MASK_CHANGED] =
 | 
			
		||||
    g_signal_new (I_("kbd-a11y-mods-state-changed"),
 | 
			
		||||
                  G_TYPE_FROM_CLASS (klass),
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  0, NULL, NULL,
 | 
			
		||||
                  _clutter_marshal_VOID__UINT_UINT,
 | 
			
		||||
                  G_TYPE_NONE, 2,
 | 
			
		||||
                  G_TYPE_UINT,
 | 
			
		||||
                  G_TYPE_UINT);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * ClutterDeviceManager::kbd-a11y-flags-changed:
 | 
			
		||||
   * @manager: the #ClutterDeviceManager that emitted the signal
 | 
			
		||||
   * @settings_flags: the new ClutterKeyboardA11yFlags configuration
 | 
			
		||||
   * @changed_mask: the ClutterKeyboardA11yFlags changed
 | 
			
		||||
   *
 | 
			
		||||
   * The ::kbd-a11y-flags-changed signal is emitted each time the
 | 
			
		||||
   * ClutterKeyboardA11yFlags configuration is changed as the result of
 | 
			
		||||
   * keyboard accessibilty operations.
 | 
			
		||||
   */
 | 
			
		||||
  manager_signals[KBD_A11Y_FLAGS_CHANGED] =
 | 
			
		||||
    g_signal_new (I_("kbd-a11y-flags-changed"),
 | 
			
		||||
                  G_TYPE_FROM_CLASS (klass),
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  0, NULL, NULL,
 | 
			
		||||
                  _clutter_marshal_VOID__UINT_UINT,
 | 
			
		||||
                  G_TYPE_NONE, 2,
 | 
			
		||||
                  G_TYPE_UINT,
 | 
			
		||||
                  G_TYPE_UINT);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
@@ -471,6 +516,21 @@ clutter_device_manager_create_virtual_device (ClutterDeviceManager   *device_man
 | 
			
		||||
                                               device_type);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_device_manager_supported_virtua_device_types: (skip)
 | 
			
		||||
 */
 | 
			
		||||
ClutterVirtualDeviceType
 | 
			
		||||
clutter_device_manager_get_supported_virtual_device_types (ClutterDeviceManager *device_manager)
 | 
			
		||||
{
 | 
			
		||||
  ClutterDeviceManagerClass *manager_class;
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_DEVICE_MANAGER (device_manager),
 | 
			
		||||
                        CLUTTER_VIRTUAL_DEVICE_TYPE_NONE);
 | 
			
		||||
 | 
			
		||||
  manager_class = CLUTTER_DEVICE_MANAGER_GET_CLASS (device_manager);
 | 
			
		||||
  return manager_class->get_supported_virtual_device_types (device_manager);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
_clutter_device_manager_compress_motion (ClutterDeviceManager *device_manager,
 | 
			
		||||
                                         ClutterEvent         *event,
 | 
			
		||||
@@ -487,3 +547,43 @@ _clutter_device_manager_compress_motion (ClutterDeviceManager *device_manager,
 | 
			
		||||
 | 
			
		||||
  manager_class->compress_motion (device_manager, event, to_discard);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
are_kbd_a11y_settings_equal (ClutterKbdA11ySettings *a,
 | 
			
		||||
                             ClutterKbdA11ySettings *b)
 | 
			
		||||
{
 | 
			
		||||
  return (a->controls == b->controls &&
 | 
			
		||||
          a->slowkeys_delay == b->slowkeys_delay &&
 | 
			
		||||
          a->debounce_delay == b->debounce_delay &&
 | 
			
		||||
          a->timeout_delay == b->timeout_delay &&
 | 
			
		||||
          a->mousekeys_init_delay == b->mousekeys_init_delay &&
 | 
			
		||||
          a->mousekeys_max_speed == b->mousekeys_max_speed &&
 | 
			
		||||
          a->mousekeys_accel_time == b->mousekeys_accel_time);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_device_manager_set_kbd_a11y_settings (ClutterDeviceManager   *device_manager,
 | 
			
		||||
                                              ClutterKbdA11ySettings *settings)
 | 
			
		||||
{
 | 
			
		||||
  ClutterDeviceManagerClass *manager_class;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_DEVICE_MANAGER (device_manager));
 | 
			
		||||
 | 
			
		||||
  if (are_kbd_a11y_settings_equal (&device_manager->priv->kbd_a11y_settings, settings))
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  device_manager->priv->kbd_a11y_settings = *settings;
 | 
			
		||||
 | 
			
		||||
  manager_class = CLUTTER_DEVICE_MANAGER_GET_CLASS (device_manager);
 | 
			
		||||
  if (manager_class->apply_kbd_a11y_settings)
 | 
			
		||||
    manager_class->apply_kbd_a11y_settings (device_manager, settings);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_device_manager_get_kbd_a11y_settings (ClutterDeviceManager   *device_manager,
 | 
			
		||||
                                              ClutterKbdA11ySettings *settings)
 | 
			
		||||
{
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_DEVICE_MANAGER (device_manager));
 | 
			
		||||
 | 
			
		||||
  *settings = device_manager->priv->kbd_a11y_settings;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -44,6 +44,35 @@ typedef struct _ClutterDeviceManager            ClutterDeviceManager;
 | 
			
		||||
typedef struct _ClutterDeviceManagerPrivate     ClutterDeviceManagerPrivate;
 | 
			
		||||
typedef struct _ClutterDeviceManagerClass       ClutterDeviceManagerClass;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ClutterVirtualDeviceType:
 | 
			
		||||
 */
 | 
			
		||||
typedef enum _ClutterVirtualDeviceType
 | 
			
		||||
{
 | 
			
		||||
  CLUTTER_VIRTUAL_DEVICE_TYPE_NONE = 0,
 | 
			
		||||
  CLUTTER_VIRTUAL_DEVICE_TYPE_KEYBOARD = 1 << 0,
 | 
			
		||||
  CLUTTER_VIRTUAL_DEVICE_TYPE_POINTER = 1 << 1,
 | 
			
		||||
  CLUTTER_VIRTUAL_DEVICE_TYPE_TOUCHSCREEN = 1 << 2,
 | 
			
		||||
} ClutterVirtualDeviceType;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ClutterKbdA11ySettings:
 | 
			
		||||
 *
 | 
			
		||||
 * The #ClutterKbdA11ySettings structure contains keyboard accessibility
 | 
			
		||||
 * settings
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
typedef struct _ClutterKbdA11ySettings
 | 
			
		||||
{
 | 
			
		||||
  ClutterKeyboardA11yFlags controls;
 | 
			
		||||
  gint slowkeys_delay;
 | 
			
		||||
  gint debounce_delay;
 | 
			
		||||
  gint timeout_delay;
 | 
			
		||||
  gint mousekeys_init_delay;
 | 
			
		||||
  gint mousekeys_max_speed;
 | 
			
		||||
  gint mousekeys_accel_time;
 | 
			
		||||
} ClutterKbdA11ySettings;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ClutterDeviceManager:
 | 
			
		||||
 *
 | 
			
		||||
@@ -85,10 +114,13 @@ struct _ClutterDeviceManagerClass
 | 
			
		||||
                                               ClutterStage       *stage);
 | 
			
		||||
  ClutterVirtualInputDevice *(* create_virtual_device) (ClutterDeviceManager  *device_manager,
 | 
			
		||||
                                                        ClutterInputDeviceType device_type);
 | 
			
		||||
  ClutterVirtualDeviceType (* get_supported_virtual_device_types) (ClutterDeviceManager *device_manager);
 | 
			
		||||
  void                (* compress_motion) (ClutterDeviceManager *device_manger,
 | 
			
		||||
                                           ClutterEvent         *event,
 | 
			
		||||
                                           const ClutterEvent   *to_discard);
 | 
			
		||||
 | 
			
		||||
  /* Keyboard accessbility */
 | 
			
		||||
  void                (* apply_kbd_a11y_settings) (ClutterDeviceManager   *device_manger,
 | 
			
		||||
                                                   ClutterKbdA11ySettings *settings);
 | 
			
		||||
  /* padding */
 | 
			
		||||
  gpointer _padding[6];
 | 
			
		||||
};
 | 
			
		||||
@@ -114,6 +146,16 @@ CLUTTER_AVAILABLE_IN_ALL
 | 
			
		||||
ClutterVirtualInputDevice *clutter_device_manager_create_virtual_device (ClutterDeviceManager  *device_manager,
 | 
			
		||||
                                                                         ClutterInputDeviceType device_type);
 | 
			
		||||
 | 
			
		||||
CLUTTER_AVAILABLE_IN_ALL
 | 
			
		||||
ClutterVirtualDeviceType clutter_device_manager_get_supported_virtual_device_types (ClutterDeviceManager *device_manager);
 | 
			
		||||
 | 
			
		||||
CLUTTER_AVAILABLE_IN_ALL
 | 
			
		||||
void clutter_device_manager_set_kbd_a11y_settings (ClutterDeviceManager   *device_manager,
 | 
			
		||||
                                                   ClutterKbdA11ySettings *settings);
 | 
			
		||||
CLUTTER_AVAILABLE_IN_ALL
 | 
			
		||||
void clutter_device_manager_get_kbd_a11y_settings (ClutterDeviceManager   *device_manager,
 | 
			
		||||
                                                   ClutterKbdA11ySettings *settings);
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
#endif /* __CLUTTER_DEVICE_MANAGER_H__ */
 | 
			
		||||
 
 | 
			
		||||
@@ -396,6 +396,43 @@ typedef enum {
 | 
			
		||||
  CLUTTER_MODIFIER_MASK = 0x5c001fff
 | 
			
		||||
} ClutterModifierType;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ClutterKeyboardA11yFlags:
 | 
			
		||||
 * @CLUTTER_A11Y_KEYBOARD_ENABLED:
 | 
			
		||||
 * @CLUTTER_A11Y_TIMEOUT_ENABLED:
 | 
			
		||||
 * @CLUTTER_A11Y_MOUSE_KEYS_ENABLED:
 | 
			
		||||
 * @CLUTTER_A11Y_SLOW_KEYS_ENABLED:
 | 
			
		||||
 * @CLUTTER_A11Y_SLOW_KEYS_BEEP_PRESS:
 | 
			
		||||
 * @CLUTTER_A11Y_SLOW_KEYS_BEEP_ACCEPT:
 | 
			
		||||
 * @CLUTTER_A11Y_SLOW_KEYS_BEEP_REJECT:
 | 
			
		||||
 * @CLUTTER_A11Y_BOUNCE_KEYS_ENABLED:
 | 
			
		||||
 * @CLUTTER_A11Y_BOUNCE_KEYS_BEEP_REJECT:
 | 
			
		||||
 * @CLUTTER_A11Y_TOGGLE_KEYS_ENABLED:
 | 
			
		||||
 * @CLUTTER_A11Y_STICKY_KEYS_ENABLED:
 | 
			
		||||
 * @CLUTTER_A11Y_STICKY_KEYS_TWO_KEY_OFF:
 | 
			
		||||
 * @CLUTTER_A11Y_STICKY_KEYS_BEEP:
 | 
			
		||||
 * @CLUTTER_A11Y_FEATURE_STATE_CHANGE_BEEP:
 | 
			
		||||
 *
 | 
			
		||||
 * Keyboard accessibility features applied to a ClutterInputDevice keyboard.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
typedef enum {
 | 
			
		||||
  CLUTTER_A11Y_KEYBOARD_ENABLED          = 1 << 0,
 | 
			
		||||
  CLUTTER_A11Y_TIMEOUT_ENABLED           = 1 << 1,
 | 
			
		||||
  CLUTTER_A11Y_MOUSE_KEYS_ENABLED        = 1 << 2,
 | 
			
		||||
  CLUTTER_A11Y_SLOW_KEYS_ENABLED         = 1 << 3,
 | 
			
		||||
  CLUTTER_A11Y_SLOW_KEYS_BEEP_PRESS      = 1 << 4,
 | 
			
		||||
  CLUTTER_A11Y_SLOW_KEYS_BEEP_ACCEPT     = 1 << 5,
 | 
			
		||||
  CLUTTER_A11Y_SLOW_KEYS_BEEP_REJECT     = 1 << 6,
 | 
			
		||||
  CLUTTER_A11Y_BOUNCE_KEYS_ENABLED       = 1 << 7,
 | 
			
		||||
  CLUTTER_A11Y_BOUNCE_KEYS_BEEP_REJECT   = 1 << 8,
 | 
			
		||||
  CLUTTER_A11Y_TOGGLE_KEYS_ENABLED       = 1 << 9,
 | 
			
		||||
  CLUTTER_A11Y_STICKY_KEYS_ENABLED       = 1 << 10,
 | 
			
		||||
  CLUTTER_A11Y_STICKY_KEYS_TWO_KEY_OFF   = 1 << 11,
 | 
			
		||||
  CLUTTER_A11Y_STICKY_KEYS_BEEP          = 1 << 12,
 | 
			
		||||
  CLUTTER_A11Y_FEATURE_STATE_CHANGE_BEEP = 1 << 13,
 | 
			
		||||
} ClutterKeyboardA11yFlags;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ClutterActorFlags:
 | 
			
		||||
 * @CLUTTER_ACTOR_MAPPED: the actor will be painted (is visible, and inside
 | 
			
		||||
@@ -730,8 +767,9 @@ typedef enum { /*< prefix=CLUTTER_DRAG >*/
 | 
			
		||||
 * Since: 0.6
 | 
			
		||||
 */
 | 
			
		||||
typedef enum { /*< flags prefix=CLUTTER_EVENT >*/
 | 
			
		||||
  CLUTTER_EVENT_NONE           = 0,
 | 
			
		||||
  CLUTTER_EVENT_FLAG_SYNTHETIC = 1 << 0
 | 
			
		||||
  CLUTTER_EVENT_NONE              = 0,
 | 
			
		||||
  CLUTTER_EVENT_FLAG_SYNTHETIC    = 1 << 0,
 | 
			
		||||
  CLUTTER_EVENT_FLAG_INPUT_METHOD = 1 << 1
 | 
			
		||||
} ClutterEventFlags;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -1536,6 +1574,41 @@ typedef enum {
 | 
			
		||||
  CLUTTER_INPUT_DEVICE_MAPPING_RELATIVE,
 | 
			
		||||
} ClutterInputDeviceMapping;
 | 
			
		||||
 | 
			
		||||
typedef enum {
 | 
			
		||||
  CLUTTER_INPUT_CONTENT_HINT_COMPLETION          = 1 << 0,
 | 
			
		||||
  CLUTTER_INPUT_CONTENT_HINT_SPELLCHECK          = 1 << 1,
 | 
			
		||||
  CLUTTER_INPUT_CONTENT_HINT_AUTO_CAPITALIZATION = 1 << 2,
 | 
			
		||||
  CLUTTER_INPUT_CONTENT_HINT_LOWERCASE           = 1 << 3,
 | 
			
		||||
  CLUTTER_INPUT_CONTENT_HINT_UPPERCASE           = 1 << 4,
 | 
			
		||||
  CLUTTER_INPUT_CONTENT_HINT_TITLECASE           = 1 << 5,
 | 
			
		||||
  CLUTTER_INPUT_CONTENT_HINT_HIDDEN_TEXT         = 1 << 6,
 | 
			
		||||
  CLUTTER_INPUT_CONTENT_HINT_SENSITIVE_DATA      = 1 << 7,
 | 
			
		||||
  CLUTTER_INPUT_CONTENT_HINT_LATIN               = 1 << 8,
 | 
			
		||||
  CLUTTER_INPUT_CONTENT_HINT_MULTILINE           = 1 << 9,
 | 
			
		||||
} ClutterInputContentHintFlags;
 | 
			
		||||
 | 
			
		||||
typedef enum {
 | 
			
		||||
  CLUTTER_INPUT_CONTENT_PURPOSE_NORMAL,
 | 
			
		||||
  CLUTTER_INPUT_CONTENT_PURPOSE_ALPHA,
 | 
			
		||||
  CLUTTER_INPUT_CONTENT_PURPOSE_DIGITS,
 | 
			
		||||
  CLUTTER_INPUT_CONTENT_PURPOSE_NUMBER,
 | 
			
		||||
  CLUTTER_INPUT_CONTENT_PURPOSE_PHONE,
 | 
			
		||||
  CLUTTER_INPUT_CONTENT_PURPOSE_URL,
 | 
			
		||||
  CLUTTER_INPUT_CONTENT_PURPOSE_EMAIL,
 | 
			
		||||
  CLUTTER_INPUT_CONTENT_PURPOSE_NAME,
 | 
			
		||||
  CLUTTER_INPUT_CONTENT_PURPOSE_PASSWORD,
 | 
			
		||||
  CLUTTER_INPUT_CONTENT_PURPOSE_DATE,
 | 
			
		||||
  CLUTTER_INPUT_CONTENT_PURPOSE_TIME,
 | 
			
		||||
  CLUTTER_INPUT_CONTENT_PURPOSE_DATETIME,
 | 
			
		||||
  CLUTTER_INPUT_CONTENT_PURPOSE_TERMINAL,
 | 
			
		||||
} ClutterInputContentPurpose;
 | 
			
		||||
 | 
			
		||||
typedef enum {
 | 
			
		||||
  CLUTTER_INPUT_PANEL_STATE_OFF,
 | 
			
		||||
  CLUTTER_INPUT_PANEL_STATE_ON,
 | 
			
		||||
  CLUTTER_INPUT_PANEL_STATE_TOGGLE,
 | 
			
		||||
} ClutterInputPanelState;
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
#endif /* __CLUTTER_ENUMS_H__ */
 | 
			
		||||
 
 | 
			
		||||
@@ -1095,7 +1095,7 @@ clutter_event_set_device (ClutterEvent       *event,
 | 
			
		||||
    {
 | 
			
		||||
      ClutterEventPrivate *real_event = (ClutterEventPrivate *) event;
 | 
			
		||||
 | 
			
		||||
      real_event->device = device;
 | 
			
		||||
      g_set_object (&real_event->device, device);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  switch (event->type)
 | 
			
		||||
@@ -1364,8 +1364,8 @@ clutter_event_copy (const ClutterEvent *event)
 | 
			
		||||
    {
 | 
			
		||||
      ClutterEventPrivate *real_event = (ClutterEventPrivate *) event;
 | 
			
		||||
 | 
			
		||||
      new_real_event->device = real_event->device;
 | 
			
		||||
      new_real_event->source_device = real_event->source_device;
 | 
			
		||||
      g_set_object (&new_real_event->device, real_event->device);
 | 
			
		||||
      g_set_object (&new_real_event->source_device, real_event->source_device);
 | 
			
		||||
      new_real_event->delta_x = real_event->delta_x;
 | 
			
		||||
      new_real_event->delta_y = real_event->delta_y;
 | 
			
		||||
      new_real_event->is_pointer_emulated = real_event->is_pointer_emulated;
 | 
			
		||||
@@ -1435,6 +1435,14 @@ clutter_event_free (ClutterEvent *event)
 | 
			
		||||
    {
 | 
			
		||||
      _clutter_backend_free_event_data (clutter_get_default_backend (), event);
 | 
			
		||||
 | 
			
		||||
      if (is_event_allocated (event))
 | 
			
		||||
        {
 | 
			
		||||
          ClutterEventPrivate *real_event = (ClutterEventPrivate *) event;
 | 
			
		||||
 | 
			
		||||
          g_clear_object (&real_event->device);
 | 
			
		||||
          g_clear_object (&real_event->source_device);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      switch (event->type)
 | 
			
		||||
        {
 | 
			
		||||
        case CLUTTER_BUTTON_PRESS:
 | 
			
		||||
@@ -1689,7 +1697,7 @@ clutter_event_set_source_device (ClutterEvent       *event,
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  real_event = (ClutterEventPrivate *) event;
 | 
			
		||||
  real_event->source_device = device;
 | 
			
		||||
  g_set_object (&real_event->source_device, device);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										40
									
								
								clutter/clutter/clutter-input-focus-private.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								clutter/clutter/clutter-input-focus-private.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,40 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2017,2018 Red Hat
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU General Public License as
 | 
			
		||||
 * published by the Free Software Foundation; either version 2 of the
 | 
			
		||||
 * License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful, but
 | 
			
		||||
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 | 
			
		||||
 * 02111-1307, USA.
 | 
			
		||||
 *
 | 
			
		||||
 * Author: Carlos Garnacho <carlosg@gnome.org>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __CLUTTER_INPUT_FOCUS_PRIVATE_H__
 | 
			
		||||
#define __CLUTTER_INPUT_FOCUS_PRIVATE_H__
 | 
			
		||||
 | 
			
		||||
void clutter_input_focus_focus_in  (ClutterInputFocus  *focus,
 | 
			
		||||
                                    ClutterInputMethod *method);
 | 
			
		||||
void clutter_input_focus_focus_out (ClutterInputFocus  *focus);
 | 
			
		||||
 | 
			
		||||
void clutter_input_focus_commit (ClutterInputFocus *focus,
 | 
			
		||||
                                 const gchar       *text);
 | 
			
		||||
void clutter_input_focus_delete_surrounding (ClutterInputFocus *focus,
 | 
			
		||||
                                             guint              offset,
 | 
			
		||||
                                             guint              len);
 | 
			
		||||
void clutter_input_focus_request_surrounding (ClutterInputFocus *focus);
 | 
			
		||||
 | 
			
		||||
void clutter_input_focus_set_preedit_text (ClutterInputFocus *focus,
 | 
			
		||||
                                           const gchar       *preedit,
 | 
			
		||||
                                           guint              cursor);
 | 
			
		||||
 | 
			
		||||
#endif /* __CLUTTER_INPUT_FOCUS_PRIVATE_H__ */
 | 
			
		||||
							
								
								
									
										243
									
								
								clutter/clutter/clutter-input-focus.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										243
									
								
								clutter/clutter/clutter-input-focus.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,243 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2017,2018 Red Hat
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU General Public License as
 | 
			
		||||
 * published by the Free Software Foundation; either version 2 of the
 | 
			
		||||
 * License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful, but
 | 
			
		||||
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 | 
			
		||||
 * 02111-1307, USA.
 | 
			
		||||
 *
 | 
			
		||||
 * Author: Carlos Garnacho <carlosg@gnome.org>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "clutter-build-config.h"
 | 
			
		||||
 | 
			
		||||
#include "clutter/clutter-input-focus.h"
 | 
			
		||||
#include "clutter/clutter-input-focus-private.h"
 | 
			
		||||
#include "clutter/clutter-input-method-private.h"
 | 
			
		||||
 | 
			
		||||
typedef struct _ClutterInputFocusPrivate ClutterInputFocusPrivate;
 | 
			
		||||
 | 
			
		||||
struct _ClutterInputFocusPrivate
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputMethod *im;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (ClutterInputFocus, clutter_input_focus, G_TYPE_OBJECT)
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_input_focus_real_focus_in (ClutterInputFocus  *focus,
 | 
			
		||||
                                   ClutterInputMethod *im)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputFocusPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  priv = clutter_input_focus_get_instance_private (focus);
 | 
			
		||||
  priv->im = im;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_input_focus_real_focus_out (ClutterInputFocus  *focus)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputFocusPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  priv = clutter_input_focus_get_instance_private (focus);
 | 
			
		||||
  priv->im = NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_input_focus_class_init (ClutterInputFocusClass *klass)
 | 
			
		||||
{
 | 
			
		||||
  klass->focus_in = clutter_input_focus_real_focus_in;
 | 
			
		||||
  klass->focus_out = clutter_input_focus_real_focus_out;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_input_focus_init (ClutterInputFocus *focus)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
gboolean
 | 
			
		||||
clutter_input_focus_is_focused (ClutterInputFocus *focus)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputFocusPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  priv = clutter_input_focus_get_instance_private (focus);
 | 
			
		||||
 | 
			
		||||
  return !!priv->im;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_input_focus_reset (ClutterInputFocus *focus)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputFocusPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_INPUT_FOCUS (focus));
 | 
			
		||||
  g_return_if_fail (clutter_input_focus_is_focused (focus));
 | 
			
		||||
 | 
			
		||||
  priv = clutter_input_focus_get_instance_private (focus);
 | 
			
		||||
 | 
			
		||||
  clutter_input_method_reset (priv->im);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_input_focus_set_cursor_location (ClutterInputFocus *focus,
 | 
			
		||||
                                         const ClutterRect *rect)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputFocusPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_INPUT_FOCUS (focus));
 | 
			
		||||
  g_return_if_fail (clutter_input_focus_is_focused (focus));
 | 
			
		||||
 | 
			
		||||
  priv = clutter_input_focus_get_instance_private (focus);
 | 
			
		||||
 | 
			
		||||
  clutter_input_method_set_cursor_location (priv->im, rect);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_input_focus_set_surrounding (ClutterInputFocus *focus,
 | 
			
		||||
                                     const gchar       *text,
 | 
			
		||||
                                     guint              cursor,
 | 
			
		||||
                                     guint              anchor)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputFocusPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_INPUT_FOCUS (focus));
 | 
			
		||||
  g_return_if_fail (clutter_input_focus_is_focused (focus));
 | 
			
		||||
 | 
			
		||||
  priv = clutter_input_focus_get_instance_private (focus);
 | 
			
		||||
 | 
			
		||||
  clutter_input_method_set_surrounding (priv->im, text, cursor, anchor);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_input_focus_set_content_hints (ClutterInputFocus            *focus,
 | 
			
		||||
                                       ClutterInputContentHintFlags  hints)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputFocusPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_INPUT_FOCUS (focus));
 | 
			
		||||
  g_return_if_fail (clutter_input_focus_is_focused (focus));
 | 
			
		||||
 | 
			
		||||
  priv = clutter_input_focus_get_instance_private (focus);
 | 
			
		||||
 | 
			
		||||
  clutter_input_method_set_content_hints (priv->im, hints);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_input_focus_set_content_purpose (ClutterInputFocus          *focus,
 | 
			
		||||
                                         ClutterInputContentPurpose  purpose)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputFocusPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_INPUT_FOCUS (focus));
 | 
			
		||||
  g_return_if_fail (clutter_input_focus_is_focused (focus));
 | 
			
		||||
 | 
			
		||||
  priv = clutter_input_focus_get_instance_private (focus);
 | 
			
		||||
 | 
			
		||||
  clutter_input_method_set_content_purpose (priv->im, purpose);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
gboolean
 | 
			
		||||
clutter_input_focus_filter_key_event (ClutterInputFocus     *focus,
 | 
			
		||||
                                      const ClutterKeyEvent *key)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputFocusPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_INPUT_FOCUS (focus), FALSE);
 | 
			
		||||
  g_return_val_if_fail (clutter_input_focus_is_focused (focus), FALSE);
 | 
			
		||||
 | 
			
		||||
  priv = clutter_input_focus_get_instance_private (focus);
 | 
			
		||||
 | 
			
		||||
  return clutter_input_method_filter_key_event (priv->im, key);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_input_focus_set_can_show_preedit (ClutterInputFocus *focus,
 | 
			
		||||
                                          gboolean           can_show_preedit)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputFocusPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_INPUT_FOCUS (focus));
 | 
			
		||||
  g_return_if_fail (clutter_input_focus_is_focused (focus));
 | 
			
		||||
 | 
			
		||||
  priv = clutter_input_focus_get_instance_private (focus);
 | 
			
		||||
 | 
			
		||||
  clutter_input_method_set_can_show_preedit (priv->im, can_show_preedit);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_input_focus_request_toggle_input_panel (ClutterInputFocus *focus)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputFocusPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_INPUT_FOCUS (focus));
 | 
			
		||||
  g_return_if_fail (clutter_input_focus_is_focused (focus));
 | 
			
		||||
 | 
			
		||||
  priv = clutter_input_focus_get_instance_private (focus);
 | 
			
		||||
 | 
			
		||||
  clutter_input_method_toggle_input_panel (priv->im);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_input_focus_focus_in (ClutterInputFocus  *focus,
 | 
			
		||||
                              ClutterInputMethod *im)
 | 
			
		||||
{
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_INPUT_FOCUS (focus));
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_INPUT_METHOD (im));
 | 
			
		||||
 | 
			
		||||
  CLUTTER_INPUT_FOCUS_GET_CLASS (focus)->focus_in (focus, im);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_input_focus_focus_out (ClutterInputFocus  *focus)
 | 
			
		||||
{
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_INPUT_FOCUS (focus));
 | 
			
		||||
 | 
			
		||||
  CLUTTER_INPUT_FOCUS_GET_CLASS (focus)->focus_out (focus);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_input_focus_commit (ClutterInputFocus *focus,
 | 
			
		||||
                            const gchar       *text)
 | 
			
		||||
{
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_INPUT_FOCUS (focus));
 | 
			
		||||
 | 
			
		||||
  CLUTTER_INPUT_FOCUS_GET_CLASS (focus)->commit_text (focus, text);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_input_focus_delete_surrounding (ClutterInputFocus *focus,
 | 
			
		||||
                                        guint              offset,
 | 
			
		||||
                                        guint              len)
 | 
			
		||||
{
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_INPUT_FOCUS (focus));
 | 
			
		||||
 | 
			
		||||
  CLUTTER_INPUT_FOCUS_GET_CLASS (focus)->delete_surrounding (focus, offset, len);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_input_focus_request_surrounding (ClutterInputFocus *focus)
 | 
			
		||||
{
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_INPUT_FOCUS (focus));
 | 
			
		||||
 | 
			
		||||
  CLUTTER_INPUT_FOCUS_GET_CLASS (focus)->request_surrounding (focus);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_input_focus_set_preedit_text (ClutterInputFocus *focus,
 | 
			
		||||
                                      const gchar       *preedit,
 | 
			
		||||
                                      guint              cursor)
 | 
			
		||||
{
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_INPUT_FOCUS (focus));
 | 
			
		||||
 | 
			
		||||
  CLUTTER_INPUT_FOCUS_GET_CLASS (focus)->set_preedit_text (focus, preedit, cursor);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										83
									
								
								clutter/clutter/clutter-input-focus.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								clutter/clutter/clutter-input-focus.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,83 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2017,2018 Red Hat
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU General Public License as
 | 
			
		||||
 * published by the Free Software Foundation; either version 2 of the
 | 
			
		||||
 * License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful, but
 | 
			
		||||
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 | 
			
		||||
 * 02111-1307, USA.
 | 
			
		||||
 *
 | 
			
		||||
 * Author: Carlos Garnacho <carlosg@gnome.org>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __CLUTTER_INPUT_FOCUS_H__
 | 
			
		||||
#define __CLUTTER_INPUT_FOCUS_H__
 | 
			
		||||
 | 
			
		||||
#include <clutter/clutter.h>
 | 
			
		||||
 | 
			
		||||
#define CLUTTER_TYPE_INPUT_FOCUS (clutter_input_focus_get_type ())
 | 
			
		||||
 | 
			
		||||
CLUTTER_AVAILABLE_IN_MUTTER
 | 
			
		||||
G_DECLARE_DERIVABLE_TYPE (ClutterInputFocus, clutter_input_focus,
 | 
			
		||||
                          CLUTTER, INPUT_FOCUS, GObject)
 | 
			
		||||
 | 
			
		||||
struct _ClutterInputFocusClass
 | 
			
		||||
{
 | 
			
		||||
  GObjectClass parent_class;
 | 
			
		||||
  GTypeInterface iface;
 | 
			
		||||
 | 
			
		||||
  void (* focus_in)  (ClutterInputFocus  *focus,
 | 
			
		||||
                      ClutterInputMethod *input_method);
 | 
			
		||||
  void (* focus_out) (ClutterInputFocus  *focus);
 | 
			
		||||
 | 
			
		||||
  void (* request_surrounding) (ClutterInputFocus *focus);
 | 
			
		||||
  void (* delete_surrounding)  (ClutterInputFocus *focus,
 | 
			
		||||
                                guint              offset,
 | 
			
		||||
                                guint              len);
 | 
			
		||||
  void (* commit_text) (ClutterInputFocus *focus,
 | 
			
		||||
                        const gchar       *text);
 | 
			
		||||
 | 
			
		||||
  void (* set_preedit_text) (ClutterInputFocus *focus,
 | 
			
		||||
                             const gchar       *preedit,
 | 
			
		||||
                             guint              cursor);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
CLUTTER_AVAILABLE_IN_MUTTER
 | 
			
		||||
gboolean clutter_input_focus_is_focused (ClutterInputFocus *focus);
 | 
			
		||||
 | 
			
		||||
CLUTTER_AVAILABLE_IN_MUTTER
 | 
			
		||||
void clutter_input_focus_reset (ClutterInputFocus *focus);
 | 
			
		||||
CLUTTER_AVAILABLE_IN_MUTTER
 | 
			
		||||
void clutter_input_focus_set_cursor_location (ClutterInputFocus *focus,
 | 
			
		||||
                                              const ClutterRect *rect);
 | 
			
		||||
 | 
			
		||||
CLUTTER_AVAILABLE_IN_MUTTER
 | 
			
		||||
void clutter_input_focus_set_surrounding (ClutterInputFocus *focus,
 | 
			
		||||
                                          const gchar       *text,
 | 
			
		||||
                                          guint              cursor,
 | 
			
		||||
                                          guint              anchor);
 | 
			
		||||
CLUTTER_AVAILABLE_IN_MUTTER
 | 
			
		||||
void clutter_input_focus_set_content_hints (ClutterInputFocus            *focus,
 | 
			
		||||
                                            ClutterInputContentHintFlags  hint);
 | 
			
		||||
CLUTTER_AVAILABLE_IN_MUTTER
 | 
			
		||||
void clutter_input_focus_set_content_purpose (ClutterInputFocus          *focus,
 | 
			
		||||
                                              ClutterInputContentPurpose  purpose);
 | 
			
		||||
CLUTTER_AVAILABLE_IN_MUTTER
 | 
			
		||||
gboolean clutter_input_focus_filter_key_event (ClutterInputFocus     *focus,
 | 
			
		||||
                                               const ClutterKeyEvent *key);
 | 
			
		||||
CLUTTER_AVAILABLE_IN_MUTTER
 | 
			
		||||
void clutter_input_focus_set_can_show_preedit (ClutterInputFocus *focus,
 | 
			
		||||
                                               gboolean           can_show_preedit);
 | 
			
		||||
CLUTTER_AVAILABLE_IN_MUTTER
 | 
			
		||||
void clutter_input_focus_request_toggle_input_panel (ClutterInputFocus *focus);
 | 
			
		||||
 | 
			
		||||
#endif /* __CLUTTER_INPUT_FOCUS_H__ */
 | 
			
		||||
							
								
								
									
										46
									
								
								clutter/clutter/clutter-input-method-private.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								clutter/clutter/clutter-input-method-private.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,46 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2017,2018 Red Hat
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU General Public License as
 | 
			
		||||
 * published by the Free Software Foundation; either version 2 of the
 | 
			
		||||
 * License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful, but
 | 
			
		||||
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 | 
			
		||||
 * 02111-1307, USA.
 | 
			
		||||
 *
 | 
			
		||||
 * Author: Carlos Garnacho <carlosg@gnome.org>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __CLUTTER_INPUT_METHOD_PRIVATE_H__
 | 
			
		||||
#define __CLUTTER_INPUT_METHOD_PRIVATE_H__
 | 
			
		||||
 | 
			
		||||
ClutterInputFocus * clutter_input_method_get_focus (ClutterInputMethod *method);
 | 
			
		||||
 | 
			
		||||
void clutter_input_method_reset               (ClutterInputMethod *method);
 | 
			
		||||
 | 
			
		||||
void clutter_input_method_set_cursor_location (ClutterInputMethod *method,
 | 
			
		||||
                                               const ClutterRect  *rect);
 | 
			
		||||
void clutter_input_method_set_surrounding     (ClutterInputMethod *method,
 | 
			
		||||
                                               const gchar        *text,
 | 
			
		||||
                                               guint               cursor,
 | 
			
		||||
                                               guint               anchor);
 | 
			
		||||
void clutter_input_method_set_content_hints   (ClutterInputMethod           *method,
 | 
			
		||||
                                               ClutterInputContentHintFlags  hints);
 | 
			
		||||
void clutter_input_method_set_content_purpose (ClutterInputMethod         *method,
 | 
			
		||||
                                               ClutterInputContentPurpose  purpose);
 | 
			
		||||
void clutter_input_method_set_can_show_preedit (ClutterInputMethod *method,
 | 
			
		||||
                                                gboolean            can_show_preedit);
 | 
			
		||||
gboolean clutter_input_method_filter_key_event (ClutterInputMethod    *method,
 | 
			
		||||
                                                const ClutterKeyEvent *key);
 | 
			
		||||
 | 
			
		||||
void clutter_input_method_toggle_input_panel (ClutterInputMethod *method);
 | 
			
		||||
 | 
			
		||||
#endif /* __CLUTTER_INPUT_METHOD_PRIVATE_H__ */
 | 
			
		||||
							
								
								
									
										444
									
								
								clutter/clutter/clutter-input-method.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										444
									
								
								clutter/clutter/clutter-input-method.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,444 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2017,2018 Red Hat
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU General Public License as
 | 
			
		||||
 * published by the Free Software Foundation; either version 2 of the
 | 
			
		||||
 * License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful, but
 | 
			
		||||
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 | 
			
		||||
 * 02111-1307, USA.
 | 
			
		||||
 *
 | 
			
		||||
 * Author: Carlos Garnacho <carlosg@gnome.org>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "clutter-build-config.h"
 | 
			
		||||
 | 
			
		||||
#include "clutter-private.h"
 | 
			
		||||
#include "clutter/clutter-input-method.h"
 | 
			
		||||
#include "clutter/clutter-input-method-private.h"
 | 
			
		||||
#include "clutter/clutter-input-focus-private.h"
 | 
			
		||||
 | 
			
		||||
typedef struct _ClutterInputMethodPrivate ClutterInputMethodPrivate;
 | 
			
		||||
 | 
			
		||||
struct _ClutterInputMethodPrivate
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputFocus *focus;
 | 
			
		||||
  ClutterInputContentHintFlags content_hints;
 | 
			
		||||
  ClutterInputContentPurpose content_purpose;
 | 
			
		||||
  gboolean can_show_preedit;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum {
 | 
			
		||||
  COMMIT,
 | 
			
		||||
  DELETE_SURROUNDING,
 | 
			
		||||
  REQUEST_SURROUNDING,
 | 
			
		||||
  INPUT_PANEL_STATE,
 | 
			
		||||
  CURSOR_LOCATION_CHANGED,
 | 
			
		||||
  N_SIGNALS,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum {
 | 
			
		||||
  PROP_0,
 | 
			
		||||
  PROP_CONTENT_HINTS,
 | 
			
		||||
  PROP_CONTENT_PURPOSE,
 | 
			
		||||
  PROP_CAN_SHOW_PREEDIT,
 | 
			
		||||
  N_PROPS
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static guint signals[N_SIGNALS] = { 0 };
 | 
			
		||||
static GParamSpec *pspecs[N_PROPS] = { 0 };
 | 
			
		||||
 | 
			
		||||
G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (ClutterInputMethod, clutter_input_method, G_TYPE_OBJECT)
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
set_content_hints (ClutterInputMethod           *im,
 | 
			
		||||
                   ClutterInputContentHintFlags  content_hints)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputMethodPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  priv = clutter_input_method_get_instance_private (im);
 | 
			
		||||
  priv->content_hints = content_hints;
 | 
			
		||||
  CLUTTER_INPUT_METHOD_GET_CLASS (im)->update_content_hints (im, content_hints);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
set_content_purpose (ClutterInputMethod         *im,
 | 
			
		||||
                     ClutterInputContentPurpose  content_purpose)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputMethodPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  priv = clutter_input_method_get_instance_private (im);
 | 
			
		||||
  priv->content_purpose = content_purpose;
 | 
			
		||||
  CLUTTER_INPUT_METHOD_GET_CLASS (im)->update_content_purpose (im,
 | 
			
		||||
                                                               content_purpose);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
set_can_show_preedit (ClutterInputMethod *im,
 | 
			
		||||
                      gboolean            can_show_preedit)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputMethodPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  priv = clutter_input_method_get_instance_private (im);
 | 
			
		||||
  priv->can_show_preedit = can_show_preedit;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_input_method_set_property (GObject      *object,
 | 
			
		||||
                                   guint         prop_id,
 | 
			
		||||
                                   const GValue *value,
 | 
			
		||||
                                   GParamSpec   *pspec)
 | 
			
		||||
{
 | 
			
		||||
  switch (prop_id)
 | 
			
		||||
    {
 | 
			
		||||
    case PROP_CONTENT_HINTS:
 | 
			
		||||
      set_content_hints (CLUTTER_INPUT_METHOD (object),
 | 
			
		||||
                         g_value_get_flags (value));
 | 
			
		||||
      break;
 | 
			
		||||
    case PROP_CONTENT_PURPOSE:
 | 
			
		||||
      set_content_purpose (CLUTTER_INPUT_METHOD (object),
 | 
			
		||||
                           g_value_get_enum (value));
 | 
			
		||||
      break;
 | 
			
		||||
    case PROP_CAN_SHOW_PREEDIT:
 | 
			
		||||
      set_can_show_preedit (CLUTTER_INPUT_METHOD (object),
 | 
			
		||||
                            g_value_get_boolean (value));
 | 
			
		||||
      break;
 | 
			
		||||
    default:
 | 
			
		||||
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_input_method_get_property (GObject    *object,
 | 
			
		||||
                                   guint       prop_id,
 | 
			
		||||
                                   GValue     *value,
 | 
			
		||||
                                   GParamSpec *pspec)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputMethodPrivate *priv;
 | 
			
		||||
  ClutterInputMethod *im;
 | 
			
		||||
 | 
			
		||||
  im = CLUTTER_INPUT_METHOD (object);
 | 
			
		||||
  priv = clutter_input_method_get_instance_private (im);
 | 
			
		||||
 | 
			
		||||
  switch (prop_id)
 | 
			
		||||
    {
 | 
			
		||||
    case PROP_CONTENT_HINTS:
 | 
			
		||||
      g_value_set_flags (value, priv->content_hints);
 | 
			
		||||
      break;
 | 
			
		||||
    case PROP_CONTENT_PURPOSE:
 | 
			
		||||
      g_value_set_enum (value, priv->content_purpose);
 | 
			
		||||
      break;
 | 
			
		||||
    case PROP_CAN_SHOW_PREEDIT:
 | 
			
		||||
      g_value_set_boolean (value, priv->can_show_preedit);
 | 
			
		||||
      break;
 | 
			
		||||
    default:
 | 
			
		||||
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_input_method_class_init (ClutterInputMethodClass *klass)
 | 
			
		||||
{
 | 
			
		||||
  GObjectClass *object_class = G_OBJECT_CLASS (klass);
 | 
			
		||||
 | 
			
		||||
  object_class->set_property = clutter_input_method_set_property;
 | 
			
		||||
  object_class->get_property = clutter_input_method_get_property;
 | 
			
		||||
 | 
			
		||||
  signals[COMMIT] =
 | 
			
		||||
    g_signal_new ("commit",
 | 
			
		||||
                  G_TYPE_FROM_CLASS (object_class),
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  0, NULL, NULL, NULL,
 | 
			
		||||
                  G_TYPE_NONE, 1, G_TYPE_STRING);
 | 
			
		||||
  signals[DELETE_SURROUNDING] =
 | 
			
		||||
    g_signal_new ("delete-surrounding",
 | 
			
		||||
                  G_TYPE_FROM_CLASS (object_class),
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  0, NULL, NULL, NULL,
 | 
			
		||||
                  G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT);
 | 
			
		||||
  signals[REQUEST_SURROUNDING] =
 | 
			
		||||
    g_signal_new ("request-surrounding",
 | 
			
		||||
                  G_TYPE_FROM_CLASS (object_class),
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  0, NULL, NULL, NULL,
 | 
			
		||||
                  G_TYPE_NONE, 0);
 | 
			
		||||
  signals[INPUT_PANEL_STATE] =
 | 
			
		||||
    g_signal_new ("input-panel-state",
 | 
			
		||||
                  G_TYPE_FROM_CLASS (object_class),
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  0, NULL, NULL, NULL,
 | 
			
		||||
                  G_TYPE_NONE, 1,
 | 
			
		||||
                  CLUTTER_TYPE_INPUT_PANEL_STATE);
 | 
			
		||||
  signals[CURSOR_LOCATION_CHANGED] =
 | 
			
		||||
    g_signal_new ("cursor-location-changed",
 | 
			
		||||
                  G_TYPE_FROM_CLASS (object_class),
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  0, NULL, NULL, NULL,
 | 
			
		||||
                  G_TYPE_NONE, 1, CLUTTER_TYPE_RECT);
 | 
			
		||||
 | 
			
		||||
  pspecs[PROP_CONTENT_HINTS] =
 | 
			
		||||
    g_param_spec_flags ("content-hints",
 | 
			
		||||
                        P_("Content hints"),
 | 
			
		||||
                        P_("Content hints"),
 | 
			
		||||
                        CLUTTER_TYPE_INPUT_CONTENT_HINT_FLAGS, 0,
 | 
			
		||||
                        G_PARAM_READWRITE |
 | 
			
		||||
                        G_PARAM_STATIC_STRINGS);
 | 
			
		||||
  pspecs[PROP_CONTENT_PURPOSE] =
 | 
			
		||||
    g_param_spec_enum ("content-purpose",
 | 
			
		||||
                       P_("Content purpose"),
 | 
			
		||||
                       P_("Content purpose"),
 | 
			
		||||
                       CLUTTER_TYPE_INPUT_CONTENT_PURPOSE, 0,
 | 
			
		||||
                       G_PARAM_READWRITE |
 | 
			
		||||
                       G_PARAM_STATIC_STRINGS);
 | 
			
		||||
  pspecs[PROP_CAN_SHOW_PREEDIT] =
 | 
			
		||||
    g_param_spec_boolean ("can-show-preedit",
 | 
			
		||||
                          P_("Can show preedit"),
 | 
			
		||||
                          P_("Can show preedit"),
 | 
			
		||||
                          FALSE,
 | 
			
		||||
                          G_PARAM_READWRITE |
 | 
			
		||||
                          G_PARAM_STATIC_STRINGS);
 | 
			
		||||
 | 
			
		||||
  g_object_class_install_properties (object_class, N_PROPS, pspecs);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_input_method_init (ClutterInputMethod *im)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_input_method_focus_in (ClutterInputMethod *im,
 | 
			
		||||
                               ClutterInputFocus  *focus)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputMethodPrivate *priv;
 | 
			
		||||
  ClutterInputMethodClass *klass;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_INPUT_METHOD (im));
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_INPUT_FOCUS (focus));
 | 
			
		||||
 | 
			
		||||
  priv = clutter_input_method_get_instance_private (im);
 | 
			
		||||
 | 
			
		||||
  if (priv->focus == focus)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  if (priv->focus)
 | 
			
		||||
    clutter_input_method_focus_out (im);
 | 
			
		||||
 | 
			
		||||
  g_set_object (&priv->focus, focus);
 | 
			
		||||
 | 
			
		||||
  if (focus)
 | 
			
		||||
    {
 | 
			
		||||
      klass = CLUTTER_INPUT_METHOD_GET_CLASS (im);
 | 
			
		||||
      klass->focus_in (im, focus);
 | 
			
		||||
 | 
			
		||||
      clutter_input_focus_focus_in (priv->focus, im);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_input_method_focus_out (ClutterInputMethod *im)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputMethodPrivate *priv;
 | 
			
		||||
  ClutterInputMethodClass *klass;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_INPUT_METHOD (im));
 | 
			
		||||
 | 
			
		||||
  priv = clutter_input_method_get_instance_private (im);
 | 
			
		||||
 | 
			
		||||
  if (!priv->focus)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  clutter_input_focus_focus_out (priv->focus);
 | 
			
		||||
  g_clear_object (&priv->focus);
 | 
			
		||||
 | 
			
		||||
  klass = CLUTTER_INPUT_METHOD_GET_CLASS (im);
 | 
			
		||||
  klass->focus_out (im);
 | 
			
		||||
 | 
			
		||||
  g_signal_emit (im, signals[INPUT_PANEL_STATE],
 | 
			
		||||
                 0, CLUTTER_INPUT_PANEL_STATE_OFF);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ClutterInputFocus *
 | 
			
		||||
clutter_input_method_get_focus (ClutterInputMethod *im)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputMethodPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  priv = clutter_input_method_get_instance_private (im);
 | 
			
		||||
  return priv->focus;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_input_method_commit (ClutterInputMethod *im,
 | 
			
		||||
                             const gchar        *text)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputMethodPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_INPUT_METHOD (im));
 | 
			
		||||
 | 
			
		||||
  priv = clutter_input_method_get_instance_private (im);
 | 
			
		||||
  if (priv->focus)
 | 
			
		||||
    clutter_input_focus_commit (priv->focus, text);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_input_method_delete_surrounding (ClutterInputMethod *im,
 | 
			
		||||
                                         guint               offset,
 | 
			
		||||
                                         guint               len)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputMethodPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_INPUT_METHOD (im));
 | 
			
		||||
 | 
			
		||||
  priv = clutter_input_method_get_instance_private (im);
 | 
			
		||||
  if (priv->focus)
 | 
			
		||||
    clutter_input_focus_delete_surrounding (priv->focus, offset, len);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_input_method_request_surrounding (ClutterInputMethod *im)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputMethodPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_INPUT_METHOD (im));
 | 
			
		||||
 | 
			
		||||
  priv = clutter_input_method_get_instance_private (im);
 | 
			
		||||
  if (priv->focus)
 | 
			
		||||
    clutter_input_focus_request_surrounding (priv->focus);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_input_method_set_preedit_text:
 | 
			
		||||
 * @im: a #ClutterInputMethod
 | 
			
		||||
 * @preedit: (nullable): the preedit text, or %NULL
 | 
			
		||||
 * @cursor: the cursor
 | 
			
		||||
 *
 | 
			
		||||
 * Sets the preedit text on the current input focus.
 | 
			
		||||
 **/
 | 
			
		||||
void
 | 
			
		||||
clutter_input_method_set_preedit_text (ClutterInputMethod *im,
 | 
			
		||||
                                       const gchar        *preedit,
 | 
			
		||||
                                       guint               cursor)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputMethodPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_INPUT_METHOD (im));
 | 
			
		||||
 | 
			
		||||
  priv = clutter_input_method_get_instance_private (im);
 | 
			
		||||
  if (priv->focus)
 | 
			
		||||
    clutter_input_focus_set_preedit_text (priv->focus, preedit, cursor);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_input_method_notify_key_event (ClutterInputMethod *im,
 | 
			
		||||
                                       const ClutterEvent *event,
 | 
			
		||||
                                       gboolean            filtered)
 | 
			
		||||
{
 | 
			
		||||
  if (!filtered)
 | 
			
		||||
    {
 | 
			
		||||
      ClutterEvent *copy;
 | 
			
		||||
 | 
			
		||||
      /* XXX: we rely on the IM implementation to notify back of
 | 
			
		||||
       * key events in the exact same order they were given.
 | 
			
		||||
       */
 | 
			
		||||
      copy = clutter_event_copy (event);
 | 
			
		||||
      clutter_event_set_flags (copy, clutter_event_get_flags (event) |
 | 
			
		||||
                               CLUTTER_EVENT_FLAG_INPUT_METHOD);
 | 
			
		||||
      clutter_event_set_source_device (copy, clutter_event_get_device (copy));
 | 
			
		||||
      clutter_event_put (copy);
 | 
			
		||||
      clutter_event_free (copy);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_input_method_toggle_input_panel (ClutterInputMethod *im)
 | 
			
		||||
{
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_INPUT_METHOD (im));
 | 
			
		||||
 | 
			
		||||
  g_signal_emit (im, signals[INPUT_PANEL_STATE], 0,
 | 
			
		||||
                 CLUTTER_INPUT_PANEL_STATE_TOGGLE);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_input_method_reset (ClutterInputMethod *im)
 | 
			
		||||
{
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_INPUT_METHOD (im));
 | 
			
		||||
 | 
			
		||||
  CLUTTER_INPUT_METHOD_GET_CLASS (im)->reset (im);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_input_method_set_cursor_location (ClutterInputMethod *im,
 | 
			
		||||
                                          const ClutterRect  *rect)
 | 
			
		||||
{
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_INPUT_METHOD (im));
 | 
			
		||||
 | 
			
		||||
  CLUTTER_INPUT_METHOD_GET_CLASS (im)->set_cursor_location (im, rect);
 | 
			
		||||
 | 
			
		||||
  g_signal_emit (im, signals[CURSOR_LOCATION_CHANGED], 0, rect);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_input_method_set_surrounding (ClutterInputMethod *im,
 | 
			
		||||
                                      const gchar        *text,
 | 
			
		||||
                                      guint               cursor,
 | 
			
		||||
                                      guint               anchor)
 | 
			
		||||
{
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_INPUT_METHOD (im));
 | 
			
		||||
 | 
			
		||||
  CLUTTER_INPUT_METHOD_GET_CLASS (im)->set_surrounding (im, text,
 | 
			
		||||
                                                        cursor, anchor);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_input_method_set_content_hints (ClutterInputMethod           *im,
 | 
			
		||||
                                        ClutterInputContentHintFlags  hints)
 | 
			
		||||
{
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_INPUT_METHOD (im));
 | 
			
		||||
 | 
			
		||||
  g_object_set (G_OBJECT (im), "content-hints", hints, NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_input_method_set_content_purpose (ClutterInputMethod         *im,
 | 
			
		||||
                                          ClutterInputContentPurpose  purpose)
 | 
			
		||||
{
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_INPUT_METHOD (im));
 | 
			
		||||
 | 
			
		||||
  g_object_set (G_OBJECT (im), "content-purpose", purpose, NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_input_method_set_can_show_preedit (ClutterInputMethod *im,
 | 
			
		||||
                                           gboolean            can_show_preedit)
 | 
			
		||||
{
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_INPUT_METHOD (im));
 | 
			
		||||
 | 
			
		||||
  g_object_set (G_OBJECT (im), "can-show-preedit", can_show_preedit, NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
gboolean
 | 
			
		||||
clutter_input_method_filter_key_event (ClutterInputMethod    *im,
 | 
			
		||||
                                       const ClutterKeyEvent *key)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputMethodClass *im_class = CLUTTER_INPUT_METHOD_GET_CLASS (im);
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_INPUT_METHOD (im), FALSE);
 | 
			
		||||
  g_return_val_if_fail (key != NULL, FALSE);
 | 
			
		||||
 | 
			
		||||
  if (clutter_event_get_flags ((ClutterEvent *) key) & CLUTTER_EVENT_FLAG_INPUT_METHOD)
 | 
			
		||||
    return FALSE;
 | 
			
		||||
  if (!im_class->filter_key_event)
 | 
			
		||||
    return FALSE;
 | 
			
		||||
 | 
			
		||||
  return im_class->filter_key_event (im, (const ClutterEvent *) key);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										88
									
								
								clutter/clutter/clutter-input-method.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								clutter/clutter/clutter-input-method.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,88 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2017,2018 Red Hat
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU General Public License as
 | 
			
		||||
 * published by the Free Software Foundation; either version 2 of the
 | 
			
		||||
 * License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful, but
 | 
			
		||||
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 | 
			
		||||
 * 02111-1307, USA.
 | 
			
		||||
 *
 | 
			
		||||
 * Author: Carlos Garnacho <carlosg@gnome.org>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __CLUTTER_INPUT_METHOD_H__
 | 
			
		||||
#define __CLUTTER_INPUT_METHOD_H__
 | 
			
		||||
 | 
			
		||||
#include <clutter/clutter.h>
 | 
			
		||||
 | 
			
		||||
#define CLUTTER_TYPE_INPUT_METHOD (clutter_input_method_get_type ())
 | 
			
		||||
 | 
			
		||||
CLUTTER_AVAILABLE_IN_MUTTER
 | 
			
		||||
G_DECLARE_DERIVABLE_TYPE (ClutterInputMethod, clutter_input_method,
 | 
			
		||||
                          CLUTTER, INPUT_METHOD, GObject)
 | 
			
		||||
 | 
			
		||||
typedef struct _ClutterInputMethodClass ClutterInputMethodClass;
 | 
			
		||||
 | 
			
		||||
struct _ClutterInputMethodClass
 | 
			
		||||
{
 | 
			
		||||
  GObjectClass parent_class;
 | 
			
		||||
 | 
			
		||||
  void (* focus_in) (ClutterInputMethod *im,
 | 
			
		||||
                     ClutterInputFocus  *actor);
 | 
			
		||||
  void (* focus_out) (ClutterInputMethod *im);
 | 
			
		||||
 | 
			
		||||
  void (* reset) (ClutterInputMethod *im);
 | 
			
		||||
 | 
			
		||||
  void (* set_cursor_location) (ClutterInputMethod          *im,
 | 
			
		||||
                                const ClutterRect           *rect);
 | 
			
		||||
  void (* set_surrounding) (ClutterInputMethod *im,
 | 
			
		||||
                            const gchar        *text,
 | 
			
		||||
                            guint               cursor,
 | 
			
		||||
                            guint               anchor);
 | 
			
		||||
  void (* update_content_hints) (ClutterInputMethod           *im,
 | 
			
		||||
                                 ClutterInputContentHintFlags  hint);
 | 
			
		||||
  void (* update_content_purpose) (ClutterInputMethod         *im,
 | 
			
		||||
                                   ClutterInputContentPurpose  purpose);
 | 
			
		||||
 | 
			
		||||
  gboolean (* filter_key_event) (ClutterInputMethod *im,
 | 
			
		||||
                                 const ClutterEvent *key);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
CLUTTER_AVAILABLE_IN_MUTTER
 | 
			
		||||
void clutter_input_method_focus_in  (ClutterInputMethod *im,
 | 
			
		||||
                                     ClutterInputFocus  *focus);
 | 
			
		||||
CLUTTER_AVAILABLE_IN_MUTTER
 | 
			
		||||
void clutter_input_method_focus_out (ClutterInputMethod *im);
 | 
			
		||||
 | 
			
		||||
CLUTTER_AVAILABLE_IN_MUTTER
 | 
			
		||||
void clutter_input_method_commit (ClutterInputMethod *im,
 | 
			
		||||
                                  const gchar        *text);
 | 
			
		||||
CLUTTER_AVAILABLE_IN_MUTTER
 | 
			
		||||
void clutter_input_method_delete_surrounding (ClutterInputMethod *im,
 | 
			
		||||
                                              guint               offset,
 | 
			
		||||
                                              guint               len);
 | 
			
		||||
CLUTTER_AVAILABLE_IN_MUTTER
 | 
			
		||||
void clutter_input_method_request_surrounding (ClutterInputMethod *im);
 | 
			
		||||
 | 
			
		||||
CLUTTER_AVAILABLE_IN_MUTTER
 | 
			
		||||
void clutter_input_method_set_preedit_text (ClutterInputMethod *im,
 | 
			
		||||
                                            const gchar        *preedit,
 | 
			
		||||
                                            guint               cursor);
 | 
			
		||||
 | 
			
		||||
CLUTTER_AVAILABLE_IN_MUTTER
 | 
			
		||||
void clutter_input_method_notify_key_event (ClutterInputMethod *im,
 | 
			
		||||
                                            const ClutterEvent *event,
 | 
			
		||||
                                            gboolean            filtered);
 | 
			
		||||
CLUTTER_AVAILABLE_IN_MUTTER
 | 
			
		||||
void clutter_input_method_request_toggle_input_panel (ClutterInputMethod *im);
 | 
			
		||||
 | 
			
		||||
#endif /* __CLUTTER_INPUT_METHOD_H__ */
 | 
			
		||||
@@ -2089,6 +2089,21 @@ emit_keyboard_event (ClutterEvent       *event,
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void
 | 
			
		||||
process_key_event (ClutterEvent       *event,
 | 
			
		||||
                   ClutterInputDevice *device)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputDeviceClass *device_class = CLUTTER_INPUT_DEVICE_GET_CLASS (device);
 | 
			
		||||
 | 
			
		||||
  if (device_class->process_kbd_a11y_event)
 | 
			
		||||
    {
 | 
			
		||||
      device_class->process_kbd_a11y_event (event, device, emit_keyboard_event);
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  emit_keyboard_event (event, device);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
is_off_stage (ClutterActor *stage,
 | 
			
		||||
              gfloat        x,
 | 
			
		||||
@@ -2176,7 +2191,7 @@ _clutter_process_event_details (ClutterActor        *stage,
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
          emit_keyboard_event (event, device);
 | 
			
		||||
          process_key_event (event, device);
 | 
			
		||||
        }
 | 
			
		||||
        break;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -40,6 +40,12 @@ gboolean        _clutter_get_sync_to_vblank     (void);
 | 
			
		||||
CLUTTER_AVAILABLE_IN_MUTTER
 | 
			
		||||
int64_t clutter_stage_get_frame_counter (ClutterStage *stage);
 | 
			
		||||
 | 
			
		||||
CLUTTER_AVAILABLE_IN_MUTTER
 | 
			
		||||
void clutter_stage_capture_into (ClutterStage          *stage,
 | 
			
		||||
                                 gboolean               paint,
 | 
			
		||||
                                 cairo_rectangle_int_t *rect,
 | 
			
		||||
                                 uint8_t               *data);
 | 
			
		||||
 | 
			
		||||
#undef __CLUTTER_H_INSIDE__
 | 
			
		||||
 | 
			
		||||
#endif /* __CLUTTER_MUTTER_H__ */
 | 
			
		||||
 
 | 
			
		||||
@@ -267,7 +267,6 @@ clutter_stage_view_set_property (GObject      *object,
 | 
			
		||||
      priv->layout = *layout;
 | 
			
		||||
      break;
 | 
			
		||||
    case PROP_FRAMEBUFFER:
 | 
			
		||||
      g_clear_pointer (&priv->framebuffer, cogl_object_unref);
 | 
			
		||||
      priv->framebuffer = g_value_dup_boxed (value);
 | 
			
		||||
#ifndef G_DISABLE_CHECKS
 | 
			
		||||
      if (priv->framebuffer)
 | 
			
		||||
@@ -285,7 +284,6 @@ clutter_stage_view_set_property (GObject      *object,
 | 
			
		||||
#endif
 | 
			
		||||
      break;
 | 
			
		||||
    case PROP_OFFSCREEN:
 | 
			
		||||
      g_clear_pointer (&priv->offscreen, cogl_object_unref);
 | 
			
		||||
      priv->offscreen = g_value_dup_boxed (value);
 | 
			
		||||
      break;
 | 
			
		||||
    case PROP_SCALE:
 | 
			
		||||
@@ -357,7 +355,7 @@ clutter_stage_view_class_init (ClutterStageViewClass *klass)
 | 
			
		||||
                        "Framebuffer used as intermediate buffer",
 | 
			
		||||
                        COGL_TYPE_HANDLE,
 | 
			
		||||
                        G_PARAM_READWRITE |
 | 
			
		||||
                        G_PARAM_CONSTRUCT |
 | 
			
		||||
                        G_PARAM_CONSTRUCT_ONLY |
 | 
			
		||||
                        G_PARAM_STATIC_STRINGS);
 | 
			
		||||
 | 
			
		||||
  obj_props[PROP_SCALE] =
 | 
			
		||||
 
 | 
			
		||||
@@ -1486,10 +1486,11 @@ _clutter_stage_do_pick_on_view (ClutterStage     *stage,
 | 
			
		||||
                priv->viewport[1] * fb_scale - viewport_offset_y,
 | 
			
		||||
                priv->viewport[2] * fb_scale,
 | 
			
		||||
                priv->viewport[3] * fb_scale);
 | 
			
		||||
  cogl_set_viewport (priv->viewport[0] * fb_scale - viewport_offset_x,
 | 
			
		||||
                     priv->viewport[1] * fb_scale - viewport_offset_y,
 | 
			
		||||
                     priv->viewport[2] * fb_scale,
 | 
			
		||||
                     priv->viewport[3] * fb_scale);
 | 
			
		||||
  cogl_framebuffer_set_viewport (fb,
 | 
			
		||||
                                 priv->viewport[0] * fb_scale - viewport_offset_x,
 | 
			
		||||
                                 priv->viewport[1] * fb_scale - viewport_offset_y,
 | 
			
		||||
                                 priv->viewport[2] * fb_scale,
 | 
			
		||||
                                 priv->viewport[3] * fb_scale);
 | 
			
		||||
 | 
			
		||||
  read_x = dirty_x * fb_scale;
 | 
			
		||||
  read_y = dirty_y * fb_scale;
 | 
			
		||||
@@ -3617,6 +3618,7 @@ _clutter_stage_maybe_setup_viewport (ClutterStage     *stage,
 | 
			
		||||
                                     ClutterStageView *view)
 | 
			
		||||
{
 | 
			
		||||
  ClutterStagePrivate *priv = stage->priv;
 | 
			
		||||
  CoglFramebuffer *fb = clutter_stage_view_get_framebuffer (view);
 | 
			
		||||
 | 
			
		||||
  if (clutter_stage_view_is_dirty_viewport (view))
 | 
			
		||||
    {
 | 
			
		||||
@@ -3637,10 +3639,11 @@ _clutter_stage_maybe_setup_viewport (ClutterStage     *stage,
 | 
			
		||||
 | 
			
		||||
      viewport_offset_x = view_layout.x * fb_scale;
 | 
			
		||||
      viewport_offset_y = view_layout.y * fb_scale;
 | 
			
		||||
      cogl_set_viewport (priv->viewport[0] * fb_scale - viewport_offset_x,
 | 
			
		||||
                         priv->viewport[1] * fb_scale - viewport_offset_y,
 | 
			
		||||
                         priv->viewport[2] * fb_scale,
 | 
			
		||||
                         priv->viewport[3] * fb_scale);
 | 
			
		||||
      cogl_framebuffer_set_viewport (fb,
 | 
			
		||||
                                     priv->viewport[0] * fb_scale - viewport_offset_x,
 | 
			
		||||
                                     priv->viewport[1] * fb_scale - viewport_offset_y,
 | 
			
		||||
                                     priv->viewport[2] * fb_scale,
 | 
			
		||||
                                     priv->viewport[3] * fb_scale);
 | 
			
		||||
 | 
			
		||||
      perspective = priv->perspective;
 | 
			
		||||
 | 
			
		||||
@@ -3679,7 +3682,7 @@ _clutter_stage_maybe_setup_viewport (ClutterStage     *stage,
 | 
			
		||||
 | 
			
		||||
  if (clutter_stage_view_is_dirty_projection (view))
 | 
			
		||||
    {
 | 
			
		||||
      cogl_set_projection_matrix (&priv->projection);
 | 
			
		||||
      cogl_framebuffer_set_projection_matrix (fb, &priv->projection);
 | 
			
		||||
 | 
			
		||||
      clutter_stage_view_set_dirty_projection (view, FALSE);
 | 
			
		||||
    }
 | 
			
		||||
@@ -3719,6 +3722,17 @@ clutter_stage_ensure_redraw (ClutterStage *stage)
 | 
			
		||||
  _clutter_master_clock_start_running (master_clock);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_stage_is_redraw_queued: (skip)
 | 
			
		||||
 */
 | 
			
		||||
gboolean
 | 
			
		||||
clutter_stage_is_redraw_queued (ClutterStage *stage)
 | 
			
		||||
{
 | 
			
		||||
  ClutterStagePrivate *priv = stage->priv;
 | 
			
		||||
 | 
			
		||||
  return priv->redraw_pending;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_stage_queue_redraw:
 | 
			
		||||
 * @stage: the #ClutterStage
 | 
			
		||||
@@ -4726,8 +4740,8 @@ capture_view (ClutterStage          *stage,
 | 
			
		||||
 | 
			
		||||
  if (paint)
 | 
			
		||||
    {
 | 
			
		||||
      _clutter_stage_maybe_setup_viewport (stage, view);
 | 
			
		||||
      cogl_push_framebuffer (framebuffer);
 | 
			
		||||
      _clutter_stage_maybe_setup_viewport (stage, view);
 | 
			
		||||
      clutter_stage_do_paint_view (stage, view, rect);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -4810,3 +4824,93 @@ clutter_stage_capture (ClutterStage          *stage,
 | 
			
		||||
 | 
			
		||||
  return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
capture_view_into (ClutterStage          *stage,
 | 
			
		||||
                   gboolean               paint,
 | 
			
		||||
                   ClutterStageView      *view,
 | 
			
		||||
                   cairo_rectangle_int_t *rect,
 | 
			
		||||
                   uint8_t               *data,
 | 
			
		||||
                   int                    stride)
 | 
			
		||||
{
 | 
			
		||||
  CoglFramebuffer *framebuffer;
 | 
			
		||||
  ClutterBackend *backend;
 | 
			
		||||
  CoglContext *context;
 | 
			
		||||
  CoglBitmap *bitmap;
 | 
			
		||||
  cairo_rectangle_int_t view_layout;
 | 
			
		||||
 | 
			
		||||
  framebuffer = clutter_stage_view_get_framebuffer (view);
 | 
			
		||||
 | 
			
		||||
  if (paint)
 | 
			
		||||
    {
 | 
			
		||||
      cogl_push_framebuffer (framebuffer);
 | 
			
		||||
      _clutter_stage_maybe_setup_viewport (stage, view);
 | 
			
		||||
      clutter_stage_do_paint_view (stage, view, rect);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  backend = clutter_get_default_backend ();
 | 
			
		||||
  context = clutter_backend_get_cogl_context (backend);
 | 
			
		||||
  bitmap = cogl_bitmap_new_for_data (context,
 | 
			
		||||
                                     rect->width, rect->height,
 | 
			
		||||
                                     CLUTTER_CAIRO_FORMAT_ARGB32,
 | 
			
		||||
                                     stride,
 | 
			
		||||
                                     data);
 | 
			
		||||
 | 
			
		||||
  clutter_stage_view_get_layout (view, &view_layout);
 | 
			
		||||
 | 
			
		||||
  cogl_framebuffer_read_pixels_into_bitmap (framebuffer,
 | 
			
		||||
                                            rect->x - view_layout.x,
 | 
			
		||||
                                            rect->y - view_layout.y,
 | 
			
		||||
                                            COGL_READ_PIXELS_COLOR_BUFFER,
 | 
			
		||||
                                            bitmap);
 | 
			
		||||
 | 
			
		||||
  if (paint)
 | 
			
		||||
    cogl_pop_framebuffer ();
 | 
			
		||||
 | 
			
		||||
  cogl_object_unref (bitmap);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static ClutterStageView *
 | 
			
		||||
get_view_at_rect (ClutterStage          *stage,
 | 
			
		||||
                  cairo_rectangle_int_t *rect)
 | 
			
		||||
{
 | 
			
		||||
  ClutterStagePrivate *priv = stage->priv;
 | 
			
		||||
  GList *views = _clutter_stage_window_get_views (priv->impl);
 | 
			
		||||
  GList *l;
 | 
			
		||||
 | 
			
		||||
  for (l = views; l; l = l->next)
 | 
			
		||||
    {
 | 
			
		||||
      ClutterStageView *view = l->data;
 | 
			
		||||
      cairo_rectangle_int_t view_layout;
 | 
			
		||||
      cairo_region_t *region;
 | 
			
		||||
      cairo_rectangle_int_t view_capture_rect;
 | 
			
		||||
 | 
			
		||||
      clutter_stage_view_get_layout (view, &view_layout);
 | 
			
		||||
      region = cairo_region_create_rectangle (&view_layout);
 | 
			
		||||
      cairo_region_intersect_rectangle (region, rect);
 | 
			
		||||
      cairo_region_get_extents (region, &view_capture_rect);
 | 
			
		||||
      cairo_region_destroy (region);
 | 
			
		||||
 | 
			
		||||
      if (view_capture_rect.width == 0 || view_capture_rect.height == 0)
 | 
			
		||||
        continue;
 | 
			
		||||
 | 
			
		||||
      g_assert (view_capture_rect.width == rect->width &&
 | 
			
		||||
                view_capture_rect.height == rect->height);
 | 
			
		||||
      return view;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_stage_capture_into (ClutterStage          *stage,
 | 
			
		||||
                            gboolean               paint,
 | 
			
		||||
                            cairo_rectangle_int_t *rect,
 | 
			
		||||
                            uint8_t               *data)
 | 
			
		||||
{
 | 
			
		||||
  ClutterStageView *view;
 | 
			
		||||
  int bpp = 4;
 | 
			
		||||
 | 
			
		||||
  view = get_view_at_rect (stage, rect);
 | 
			
		||||
  capture_view_into (stage, paint, view, rect, data, rect->width * bpp);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -250,6 +250,9 @@ void            clutter_stage_ensure_viewport                   (ClutterStage
 | 
			
		||||
CLUTTER_AVAILABLE_IN_ALL
 | 
			
		||||
void            clutter_stage_ensure_redraw                     (ClutterStage          *stage);
 | 
			
		||||
 | 
			
		||||
CLUTTER_AVAILABLE_IN_ALL
 | 
			
		||||
gboolean        clutter_stage_is_redraw_queued                  (ClutterStage          *stage);
 | 
			
		||||
 | 
			
		||||
#ifdef CLUTTER_ENABLE_EXPERIMENTAL_API
 | 
			
		||||
CLUTTER_AVAILABLE_IN_1_14
 | 
			
		||||
void            clutter_stage_set_sync_delay                    (ClutterStage          *stage,
 | 
			
		||||
 
 | 
			
		||||
@@ -63,6 +63,7 @@
 | 
			
		||||
#include "clutter-units.h"
 | 
			
		||||
#include "clutter-paint-volume-private.h"
 | 
			
		||||
#include "clutter-scriptable.h"
 | 
			
		||||
#include "clutter-input-focus.h"
 | 
			
		||||
 | 
			
		||||
/* cursor width in pixels */
 | 
			
		||||
#define DEFAULT_CURSOR_SIZE     2
 | 
			
		||||
@@ -98,6 +99,12 @@ struct _LayoutCache
 | 
			
		||||
  guint age;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct _ClutterTextInputFocus
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputFocus parent_instance;
 | 
			
		||||
  ClutterText *text;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct _ClutterTextPrivate
 | 
			
		||||
{
 | 
			
		||||
  PangoFontDescription *font_desc;
 | 
			
		||||
@@ -176,6 +183,10 @@ struct _ClutterTextPrivate
 | 
			
		||||
  /* Signal handler for when the :text-direction changes */
 | 
			
		||||
  guint direction_changed_id;
 | 
			
		||||
 | 
			
		||||
  ClutterInputFocus *input_focus;
 | 
			
		||||
  ClutterInputContentHintFlags input_hints;
 | 
			
		||||
  ClutterInputContentPurpose input_purpose;
 | 
			
		||||
 | 
			
		||||
  /* bitfields */
 | 
			
		||||
  guint alignment               : 2;
 | 
			
		||||
  guint wrap                    : 1;
 | 
			
		||||
@@ -236,6 +247,8 @@ enum
 | 
			
		||||
  PROP_SINGLE_LINE_MODE,
 | 
			
		||||
  PROP_SELECTED_TEXT_COLOR,
 | 
			
		||||
  PROP_SELECTED_TEXT_COLOR_SET,
 | 
			
		||||
  PROP_INPUT_HINTS,
 | 
			
		||||
  PROP_INPUT_PURPOSE,
 | 
			
		||||
 | 
			
		||||
  PROP_LAST
 | 
			
		||||
};
 | 
			
		||||
@@ -269,6 +282,112 @@ static const ClutterColor default_selected_text_color = {   0,   0,   0, 255 };
 | 
			
		||||
static ClutterAnimatableIface *parent_animatable_iface = NULL;
 | 
			
		||||
static ClutterScriptableIface *parent_scriptable_iface = NULL;
 | 
			
		||||
 | 
			
		||||
/* ClutterTextInputFocus */
 | 
			
		||||
#define CLUTTER_TYPE_TEXT_INPUT_FOCUS (clutter_text_input_focus_get_type ())
 | 
			
		||||
 | 
			
		||||
G_DECLARE_FINAL_TYPE (ClutterTextInputFocus, clutter_text_input_focus,
 | 
			
		||||
                      CLUTTER, TEXT_INPUT_FOCUS, ClutterInputFocus)
 | 
			
		||||
G_DEFINE_TYPE (ClutterTextInputFocus, clutter_text_input_focus,
 | 
			
		||||
               CLUTTER_TYPE_INPUT_FOCUS)
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_text_input_focus_request_surrounding (ClutterInputFocus *focus)
 | 
			
		||||
{
 | 
			
		||||
  ClutterText *clutter_text = CLUTTER_TEXT_INPUT_FOCUS (focus)->text;
 | 
			
		||||
  ClutterTextBuffer *buffer;
 | 
			
		||||
  const gchar *text;
 | 
			
		||||
  gint anchor_pos, cursor_pos;
 | 
			
		||||
 | 
			
		||||
  buffer = clutter_text_get_buffer (clutter_text);
 | 
			
		||||
  text = clutter_text_buffer_get_text (buffer);
 | 
			
		||||
 | 
			
		||||
  cursor_pos = clutter_text_get_cursor_position (clutter_text);
 | 
			
		||||
  if (cursor_pos < 0)
 | 
			
		||||
    cursor_pos = clutter_text_buffer_get_length (buffer);
 | 
			
		||||
 | 
			
		||||
  anchor_pos = clutter_text_get_selection_bound (clutter_text);
 | 
			
		||||
  if (anchor_pos < 0)
 | 
			
		||||
    anchor_pos = cursor_pos;
 | 
			
		||||
 | 
			
		||||
  clutter_input_focus_set_surrounding (focus, text,
 | 
			
		||||
                                       g_utf8_offset_to_pointer (text, cursor_pos) - text,
 | 
			
		||||
                                       g_utf8_offset_to_pointer (text, anchor_pos) - text);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_text_input_focus_delete_surrounding (ClutterInputFocus *focus,
 | 
			
		||||
                                             guint              offset,
 | 
			
		||||
                                             guint              len)
 | 
			
		||||
{
 | 
			
		||||
  ClutterText *clutter_text = CLUTTER_TEXT_INPUT_FOCUS (focus)->text;
 | 
			
		||||
 | 
			
		||||
  if (clutter_text_get_editable (clutter_text))
 | 
			
		||||
    clutter_text_delete_text (clutter_text, offset, len);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_text_input_focus_commit_text (ClutterInputFocus *focus,
 | 
			
		||||
                                      const gchar       *text)
 | 
			
		||||
{
 | 
			
		||||
  ClutterText *clutter_text = CLUTTER_TEXT_INPUT_FOCUS (focus)->text;
 | 
			
		||||
 | 
			
		||||
  if (clutter_text_get_editable (clutter_text))
 | 
			
		||||
    {
 | 
			
		||||
      clutter_text_delete_selection (clutter_text);
 | 
			
		||||
      clutter_text_insert_text (clutter_text, text,
 | 
			
		||||
                                clutter_text_get_cursor_position (clutter_text));
 | 
			
		||||
      clutter_text_set_preedit_string (clutter_text, NULL, NULL, 0);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_text_input_focus_set_preedit_text (ClutterInputFocus *focus,
 | 
			
		||||
                                           const gchar       *preedit_text,
 | 
			
		||||
                                           guint              cursor_pos)
 | 
			
		||||
{
 | 
			
		||||
  ClutterText *clutter_text = CLUTTER_TEXT_INPUT_FOCUS (focus)->text;
 | 
			
		||||
 | 
			
		||||
  if (clutter_text_get_editable (clutter_text))
 | 
			
		||||
    {
 | 
			
		||||
      PangoAttrList *list;
 | 
			
		||||
 | 
			
		||||
      list = pango_attr_list_new ();
 | 
			
		||||
      pango_attr_list_insert (list, pango_attr_underline_new (PANGO_UNDERLINE_SINGLE));
 | 
			
		||||
      clutter_text_set_preedit_string (clutter_text,
 | 
			
		||||
                                       preedit_text, list,
 | 
			
		||||
                                       cursor_pos);
 | 
			
		||||
      pango_attr_list_unref (list);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_text_input_focus_class_init (ClutterTextInputFocusClass *klass)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputFocusClass *focus_class = CLUTTER_INPUT_FOCUS_CLASS (klass);
 | 
			
		||||
 | 
			
		||||
  focus_class->request_surrounding = clutter_text_input_focus_request_surrounding;
 | 
			
		||||
  focus_class->delete_surrounding = clutter_text_input_focus_delete_surrounding;
 | 
			
		||||
  focus_class->commit_text = clutter_text_input_focus_commit_text;
 | 
			
		||||
  focus_class->set_preedit_text = clutter_text_input_focus_set_preedit_text;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_text_input_focus_init (ClutterTextInputFocus *focus)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static ClutterInputFocus *
 | 
			
		||||
clutter_text_input_focus_new (ClutterText *text)
 | 
			
		||||
{
 | 
			
		||||
  ClutterTextInputFocus *focus;
 | 
			
		||||
 | 
			
		||||
  focus = g_object_new (CLUTTER_TYPE_TEXT_INPUT_FOCUS, NULL);
 | 
			
		||||
  focus->text = text;
 | 
			
		||||
 | 
			
		||||
  return CLUTTER_INPUT_FOCUS (focus);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* ClutterText */
 | 
			
		||||
static void clutter_scriptable_iface_init (ClutterScriptableIface *iface);
 | 
			
		||||
static void clutter_animatable_iface_init (ClutterAnimatableIface *iface);
 | 
			
		||||
 | 
			
		||||
@@ -1009,6 +1128,22 @@ clutter_text_position_to_coords (ClutterText *self,
 | 
			
		||||
  return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void
 | 
			
		||||
update_cursor_location (ClutterText *self)
 | 
			
		||||
{
 | 
			
		||||
  ClutterTextPrivate *priv = self->priv;
 | 
			
		||||
  ClutterRect rect;
 | 
			
		||||
  float x, y;
 | 
			
		||||
 | 
			
		||||
  if (!priv->editable)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  rect = priv->cursor_rect;
 | 
			
		||||
  clutter_actor_get_transformed_position (CLUTTER_ACTOR (self), &x, &y);
 | 
			
		||||
  clutter_rect_offset (&rect, x, y);
 | 
			
		||||
  clutter_input_focus_set_cursor_location (priv->input_focus, &rect);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void
 | 
			
		||||
clutter_text_ensure_cursor_position (ClutterText *self)
 | 
			
		||||
{
 | 
			
		||||
@@ -1057,6 +1192,8 @@ clutter_text_ensure_cursor_position (ClutterText *self)
 | 
			
		||||
      g_signal_emit (self, text_signals[CURSOR_EVENT], 0, &cursor_pos);
 | 
			
		||||
 | 
			
		||||
      g_signal_emit (self, text_signals[CURSOR_CHANGED], 0);
 | 
			
		||||
 | 
			
		||||
      update_cursor_location (self);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -1503,6 +1640,8 @@ clutter_text_finalize (GObject *gobject)
 | 
			
		||||
  clutter_text_set_buffer (self, NULL);
 | 
			
		||||
  g_free (priv->font_name);
 | 
			
		||||
 | 
			
		||||
  g_clear_object (&priv->input_focus);
 | 
			
		||||
 | 
			
		||||
  G_OBJECT_CLASS (clutter_text_parent_class)->finalize (gobject);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -1859,6 +1998,7 @@ clutter_text_press (ClutterActor *actor,
 | 
			
		||||
    return CLUTTER_EVENT_PROPAGATE;
 | 
			
		||||
 | 
			
		||||
  clutter_actor_grab_key_focus (actor);
 | 
			
		||||
  clutter_input_focus_request_toggle_input_panel (priv->input_focus);
 | 
			
		||||
 | 
			
		||||
  /* if the actor is empty we just reset everything and not
 | 
			
		||||
   * set up the dragging of the selection since there's nothing
 | 
			
		||||
@@ -2084,10 +2224,17 @@ clutter_text_key_press (ClutterActor    *actor,
 | 
			
		||||
  pool = clutter_binding_pool_find (g_type_name (CLUTTER_TYPE_TEXT));
 | 
			
		||||
  g_assert (pool != NULL);
 | 
			
		||||
 | 
			
		||||
  if (!(event->flags & CLUTTER_EVENT_FLAG_INPUT_METHOD) &&
 | 
			
		||||
      clutter_input_focus_is_focused (priv->input_focus) &&
 | 
			
		||||
      clutter_input_focus_filter_key_event (priv->input_focus, event))
 | 
			
		||||
    return CLUTTER_EVENT_STOP;
 | 
			
		||||
 | 
			
		||||
  /* we allow passing synthetic events that only contain
 | 
			
		||||
   * the Unicode value and not the key symbol
 | 
			
		||||
   * the Unicode value and not the key symbol, unless they
 | 
			
		||||
   * contain the input method flag.
 | 
			
		||||
   */
 | 
			
		||||
  if (event->keyval == 0 && (event->flags & CLUTTER_EVENT_FLAG_SYNTHETIC))
 | 
			
		||||
  if (event->keyval == 0 && (event->flags & CLUTTER_EVENT_FLAG_SYNTHETIC) &&
 | 
			
		||||
      !(event->flags & CLUTTER_EVENT_FLAG_INPUT_METHOD))
 | 
			
		||||
    res = FALSE;
 | 
			
		||||
  else
 | 
			
		||||
    res = clutter_binding_pool_activate (pool, event->keyval,
 | 
			
		||||
@@ -2141,6 +2288,20 @@ clutter_text_key_press (ClutterActor    *actor,
 | 
			
		||||
  return CLUTTER_EVENT_PROPAGATE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
clutter_text_key_release (ClutterActor    *actor,
 | 
			
		||||
                          ClutterKeyEvent *event)
 | 
			
		||||
{
 | 
			
		||||
  ClutterText *self = CLUTTER_TEXT (actor);
 | 
			
		||||
  ClutterTextPrivate *priv = self->priv;
 | 
			
		||||
 | 
			
		||||
  if (clutter_input_focus_is_focused (priv->input_focus) &&
 | 
			
		||||
      clutter_input_focus_filter_key_event (priv->input_focus, event))
 | 
			
		||||
    return CLUTTER_EVENT_STOP;
 | 
			
		||||
 | 
			
		||||
  return CLUTTER_EVENT_PROPAGATE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_text_compute_layout_offsets (ClutterText           *self,
 | 
			
		||||
                                     PangoLayout           *layout,
 | 
			
		||||
@@ -2663,6 +2824,18 @@ static void
 | 
			
		||||
clutter_text_key_focus_in (ClutterActor *actor)
 | 
			
		||||
{
 | 
			
		||||
  ClutterTextPrivate *priv = CLUTTER_TEXT (actor)->priv;
 | 
			
		||||
  ClutterBackend *backend = clutter_get_default_backend ();
 | 
			
		||||
  ClutterInputMethod *method = clutter_backend_get_input_method (backend);
 | 
			
		||||
 | 
			
		||||
  if (method && priv->editable)
 | 
			
		||||
    {
 | 
			
		||||
      clutter_input_method_focus_in (method, priv->input_focus);
 | 
			
		||||
      clutter_input_focus_set_content_purpose (priv->input_focus,
 | 
			
		||||
					       priv->input_purpose);
 | 
			
		||||
      clutter_input_focus_set_content_hints (priv->input_focus,
 | 
			
		||||
					     priv->input_hints);
 | 
			
		||||
      update_cursor_location (CLUTTER_TEXT (actor));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  priv->has_focus = TRUE;
 | 
			
		||||
 | 
			
		||||
@@ -2673,9 +2846,17 @@ static void
 | 
			
		||||
clutter_text_key_focus_out (ClutterActor *actor)
 | 
			
		||||
{
 | 
			
		||||
  ClutterTextPrivate *priv = CLUTTER_TEXT (actor)->priv;
 | 
			
		||||
  ClutterBackend *backend = clutter_get_default_backend ();
 | 
			
		||||
  ClutterInputMethod *method = clutter_backend_get_input_method (backend);
 | 
			
		||||
 | 
			
		||||
  priv->has_focus = FALSE;
 | 
			
		||||
 | 
			
		||||
  if (priv->editable && clutter_input_focus_is_focused (priv->input_focus))
 | 
			
		||||
    {
 | 
			
		||||
      clutter_text_set_preedit_string (CLUTTER_TEXT (actor), NULL, NULL, 0);
 | 
			
		||||
      clutter_input_method_focus_out (method);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  clutter_text_queue_redraw (actor);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -3369,6 +3550,7 @@ clutter_text_class_init (ClutterTextClass *klass)
 | 
			
		||||
  actor_class->get_preferred_height = clutter_text_get_preferred_height;
 | 
			
		||||
  actor_class->allocate = clutter_text_allocate;
 | 
			
		||||
  actor_class->key_press_event = clutter_text_key_press;
 | 
			
		||||
  actor_class->key_release_event = clutter_text_key_release;
 | 
			
		||||
  actor_class->button_press_event = clutter_text_button_press;
 | 
			
		||||
  actor_class->button_release_event = clutter_text_button_release;
 | 
			
		||||
  actor_class->motion_event = clutter_text_motion;
 | 
			
		||||
@@ -3869,6 +4051,22 @@ clutter_text_class_init (ClutterTextClass *klass)
 | 
			
		||||
  obj_props[PROP_SELECTED_TEXT_COLOR_SET] = pspec;
 | 
			
		||||
  g_object_class_install_property (gobject_class, PROP_SELECTED_TEXT_COLOR_SET, pspec);
 | 
			
		||||
 | 
			
		||||
  pspec = g_param_spec_flags ("input-hints",
 | 
			
		||||
                              P_("Input hints"),
 | 
			
		||||
                              P_("Input hints"),
 | 
			
		||||
                              CLUTTER_TYPE_INPUT_CONTENT_HINT_FLAGS,
 | 
			
		||||
                              0, CLUTTER_PARAM_READWRITE);
 | 
			
		||||
  obj_props[PROP_INPUT_HINTS] = pspec;
 | 
			
		||||
  g_object_class_install_property (gobject_class, PROP_INPUT_HINTS, pspec);
 | 
			
		||||
 | 
			
		||||
  pspec = g_param_spec_enum ("input-purpose",
 | 
			
		||||
                             P_("Input purpose"),
 | 
			
		||||
                             P_("Input purpose"),
 | 
			
		||||
                             CLUTTER_TYPE_INPUT_CONTENT_PURPOSE,
 | 
			
		||||
                             0, CLUTTER_PARAM_READWRITE);
 | 
			
		||||
  obj_props[PROP_INPUT_PURPOSE] = pspec;
 | 
			
		||||
  g_object_class_install_property (gobject_class, PROP_INPUT_PURPOSE, pspec);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * ClutterText::text-changed:
 | 
			
		||||
   * @self: the #ClutterText that emitted the signal
 | 
			
		||||
@@ -4169,6 +4367,8 @@ clutter_text_init (ClutterText *self)
 | 
			
		||||
    g_signal_connect (self, "notify::text-direction",
 | 
			
		||||
                      G_CALLBACK (clutter_text_direction_changed_cb),
 | 
			
		||||
                      NULL);
 | 
			
		||||
 | 
			
		||||
  priv->input_focus = clutter_text_input_focus_new (self);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -4315,6 +4515,27 @@ buffer_deleted_text (ClutterTextBuffer *buffer,
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_text_queue_redraw_or_relayout (ClutterText *self)
 | 
			
		||||
{
 | 
			
		||||
  ClutterActor *actor = CLUTTER_ACTOR (self);
 | 
			
		||||
  gfloat preferred_width;
 | 
			
		||||
  gfloat preferred_height;
 | 
			
		||||
 | 
			
		||||
  clutter_text_dirty_cache (self);
 | 
			
		||||
 | 
			
		||||
  /* we're using our private implementations here to avoid the caching done by ClutterActor */
 | 
			
		||||
  clutter_text_get_preferred_width (actor, -1, NULL, &preferred_width);
 | 
			
		||||
  clutter_text_get_preferred_height (actor, preferred_width, NULL, &preferred_height);
 | 
			
		||||
 | 
			
		||||
  if (clutter_actor_has_allocation (actor) &&
 | 
			
		||||
      (fabsf (preferred_width - clutter_actor_get_width (actor)) > 0.001 ||
 | 
			
		||||
       fabsf (preferred_height - clutter_actor_get_height (actor)) > 0.001))
 | 
			
		||||
    clutter_actor_queue_relayout (actor);
 | 
			
		||||
  else
 | 
			
		||||
    clutter_text_queue_redraw (actor);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
buffer_notify_text (ClutterTextBuffer *buffer,
 | 
			
		||||
                    GParamSpec        *spec,
 | 
			
		||||
@@ -4322,9 +4543,7 @@ buffer_notify_text (ClutterTextBuffer *buffer,
 | 
			
		||||
{
 | 
			
		||||
  g_object_freeze_notify (G_OBJECT (self));
 | 
			
		||||
 | 
			
		||||
  clutter_text_dirty_cache (self);
 | 
			
		||||
 | 
			
		||||
  clutter_actor_queue_relayout (CLUTTER_ACTOR (self));
 | 
			
		||||
  clutter_text_queue_redraw_or_relayout (self);
 | 
			
		||||
 | 
			
		||||
  g_signal_emit (self, text_signals[TEXT_CHANGED], 0);
 | 
			
		||||
  g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_TEXT]);
 | 
			
		||||
@@ -4459,6 +4678,8 @@ void
 | 
			
		||||
clutter_text_set_editable (ClutterText *self,
 | 
			
		||||
                           gboolean     editable)
 | 
			
		||||
{
 | 
			
		||||
  ClutterBackend *backend = clutter_get_default_backend ();
 | 
			
		||||
  ClutterInputMethod *method = clutter_backend_get_input_method (backend);
 | 
			
		||||
  ClutterTextPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_TEXT (self));
 | 
			
		||||
@@ -4469,6 +4690,14 @@ clutter_text_set_editable (ClutterText *self,
 | 
			
		||||
    {
 | 
			
		||||
      priv->editable = editable;
 | 
			
		||||
 | 
			
		||||
      if (method)
 | 
			
		||||
        {
 | 
			
		||||
          if (!priv->editable && clutter_input_focus_is_focused (priv->input_focus))
 | 
			
		||||
            clutter_input_method_focus_out (method);
 | 
			
		||||
          else if (priv->has_focus)
 | 
			
		||||
            clutter_input_method_focus_in (method, priv->input_focus);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      clutter_text_queue_redraw (CLUTTER_ACTOR (self));
 | 
			
		||||
 | 
			
		||||
      g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_EDITABLE]);
 | 
			
		||||
@@ -4666,8 +4895,7 @@ clutter_text_set_cursor_visible (ClutterText *self,
 | 
			
		||||
    {
 | 
			
		||||
      priv->cursor_visible = cursor_visible;
 | 
			
		||||
 | 
			
		||||
      clutter_text_dirty_cache (self);
 | 
			
		||||
      clutter_actor_queue_relayout (CLUTTER_ACTOR (self));
 | 
			
		||||
      clutter_text_queue_redraw_or_relayout (self);
 | 
			
		||||
 | 
			
		||||
      g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_CURSOR_VISIBLE]);
 | 
			
		||||
    }
 | 
			
		||||
@@ -5568,9 +5796,7 @@ clutter_text_set_line_alignment (ClutterText    *self,
 | 
			
		||||
    {
 | 
			
		||||
      priv->alignment = alignment;
 | 
			
		||||
 | 
			
		||||
      clutter_text_dirty_cache (self);
 | 
			
		||||
 | 
			
		||||
      clutter_actor_queue_relayout (CLUTTER_ACTOR (self));
 | 
			
		||||
      clutter_text_queue_redraw_or_relayout (self);
 | 
			
		||||
 | 
			
		||||
      g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_LINE_ALIGNMENT]);
 | 
			
		||||
    }
 | 
			
		||||
@@ -5625,9 +5851,7 @@ clutter_text_set_use_markup (ClutterText *self,
 | 
			
		||||
  if (setting)
 | 
			
		||||
    clutter_text_set_markup_internal (self, text);
 | 
			
		||||
 | 
			
		||||
  clutter_text_dirty_cache (self);
 | 
			
		||||
 | 
			
		||||
  clutter_actor_queue_relayout (CLUTTER_ACTOR (self));
 | 
			
		||||
  clutter_text_queue_redraw_or_relayout (self);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -5674,9 +5898,7 @@ clutter_text_set_justify (ClutterText *self,
 | 
			
		||||
    {
 | 
			
		||||
      priv->justify = justify;
 | 
			
		||||
 | 
			
		||||
      clutter_text_dirty_cache (self);
 | 
			
		||||
 | 
			
		||||
      clutter_actor_queue_relayout (CLUTTER_ACTOR (self));
 | 
			
		||||
      clutter_text_queue_redraw_or_relayout (self);
 | 
			
		||||
 | 
			
		||||
      g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_JUSTIFY]);
 | 
			
		||||
    }
 | 
			
		||||
@@ -6243,8 +6465,7 @@ clutter_text_set_preedit_string (ClutterText   *self,
 | 
			
		||||
      priv->preedit_set = TRUE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  clutter_text_dirty_cache (self);
 | 
			
		||||
  clutter_actor_queue_relayout (CLUTTER_ACTOR (self));
 | 
			
		||||
  clutter_text_queue_redraw_or_relayout (self);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -6298,3 +6519,53 @@ clutter_text_get_cursor_rect (ClutterText *self,
 | 
			
		||||
 | 
			
		||||
  *rect = self->priv->cursor_rect;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_text_set_input_hints (ClutterText                  *self,
 | 
			
		||||
                              ClutterInputContentHintFlags  hints)
 | 
			
		||||
{
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_TEXT (self));
 | 
			
		||||
 | 
			
		||||
  self->priv->input_hints = hints;
 | 
			
		||||
 | 
			
		||||
  if (clutter_input_focus_is_focused (self->priv->input_focus))
 | 
			
		||||
    clutter_input_focus_set_content_hints (self->priv->input_focus, hints);
 | 
			
		||||
  g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_INPUT_HINTS]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ClutterInputContentHintFlags
 | 
			
		||||
clutter_text_get_input_hints (ClutterText *self)
 | 
			
		||||
{
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_TEXT (self), 0);
 | 
			
		||||
 | 
			
		||||
  return self->priv->input_hints;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_text_set_input_purpose (ClutterText                *self,
 | 
			
		||||
                                ClutterInputContentPurpose  purpose)
 | 
			
		||||
{
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_TEXT (self));
 | 
			
		||||
 | 
			
		||||
  self->priv->input_purpose = purpose;
 | 
			
		||||
 | 
			
		||||
  if (clutter_input_focus_is_focused (self->priv->input_focus))
 | 
			
		||||
    clutter_input_focus_set_content_purpose (self->priv->input_focus, purpose);
 | 
			
		||||
  g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_INPUT_PURPOSE]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ClutterInputContentPurpose
 | 
			
		||||
clutter_text_get_input_purpose (ClutterText *self)
 | 
			
		||||
{
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_TEXT (self), 0);
 | 
			
		||||
 | 
			
		||||
  return self->priv->input_purpose;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
gboolean
 | 
			
		||||
clutter_text_has_preedit (ClutterText *self)
 | 
			
		||||
{
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_TEXT (self), FALSE);
 | 
			
		||||
 | 
			
		||||
  return self->priv->preedit_set;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -302,6 +302,20 @@ void                  clutter_text_get_layout_offsets   (ClutterText           *
 | 
			
		||||
                                                         gint                  *x,
 | 
			
		||||
                                                         gint                  *y);
 | 
			
		||||
 | 
			
		||||
CLUTTER_AVAILABLE_IN_MUTTER
 | 
			
		||||
void                  clutter_text_set_input_hints (ClutterText                  *self,
 | 
			
		||||
                                                    ClutterInputContentHintFlags  hints);
 | 
			
		||||
CLUTTER_AVAILABLE_IN_MUTTER
 | 
			
		||||
void                  clutter_text_set_input_purpose (ClutterText                *self,
 | 
			
		||||
                                                      ClutterInputContentPurpose  purpose);
 | 
			
		||||
CLUTTER_AVAILABLE_IN_MUTTER
 | 
			
		||||
ClutterInputContentHintFlags clutter_text_get_input_hints (ClutterText *self);
 | 
			
		||||
CLUTTER_AVAILABLE_IN_MUTTER
 | 
			
		||||
ClutterInputContentPurpose clutter_text_get_input_purpose (ClutterText *self);
 | 
			
		||||
 | 
			
		||||
CLUTTER_AVAILABLE_IN_MUTTER
 | 
			
		||||
gboolean              clutter_text_has_preedit (ClutterText *self);
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
#endif /* __CLUTTER_TEXT_H__ */
 | 
			
		||||
 
 | 
			
		||||
@@ -97,6 +97,9 @@ typedef struct _ClutterInputDeviceTool          ClutterInputDeviceTool;
 | 
			
		||||
typedef struct _ClutterInputDevice              ClutterInputDevice;
 | 
			
		||||
typedef struct _ClutterVirtualInputDevice       ClutterVirtualInputDevice;
 | 
			
		||||
 | 
			
		||||
typedef struct _ClutterInputMethod              ClutterInputMethod;
 | 
			
		||||
typedef struct _ClutterInputFocus               ClutterInputFocus;
 | 
			
		||||
 | 
			
		||||
typedef CoglMatrix                              ClutterMatrix;
 | 
			
		||||
 | 
			
		||||
typedef union _ClutterEvent                     ClutterEvent;
 | 
			
		||||
 
 | 
			
		||||
@@ -115,6 +115,74 @@ clutter_virtual_input_device_notify_keyval (ClutterVirtualInputDevice *virtual_d
 | 
			
		||||
  klass->notify_keyval (virtual_device, time_us, keyval, key_state);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_virtual_input_device_notify_discrete_scroll (ClutterVirtualInputDevice *virtual_device,
 | 
			
		||||
                                                     uint64_t                   time_us,
 | 
			
		||||
                                                     ClutterScrollDirection     direction,
 | 
			
		||||
                                                     ClutterScrollSource        scroll_source)
 | 
			
		||||
{
 | 
			
		||||
  ClutterVirtualInputDeviceClass *klass =
 | 
			
		||||
    CLUTTER_VIRTUAL_INPUT_DEVICE_GET_CLASS (virtual_device);
 | 
			
		||||
 | 
			
		||||
  klass->notify_discrete_scroll (virtual_device, time_us,
 | 
			
		||||
                                 direction, scroll_source);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_virtual_input_device_notify_scroll_continuous (ClutterVirtualInputDevice *virtual_device,
 | 
			
		||||
                                                       uint64_t                   time_us,
 | 
			
		||||
                                                       double                     dx,
 | 
			
		||||
                                                       double                     dy,
 | 
			
		||||
                                                       ClutterScrollSource        scroll_source,
 | 
			
		||||
                                                       ClutterScrollFinishFlags   finish_flags)
 | 
			
		||||
{
 | 
			
		||||
  ClutterVirtualInputDeviceClass *klass =
 | 
			
		||||
    CLUTTER_VIRTUAL_INPUT_DEVICE_GET_CLASS (virtual_device);
 | 
			
		||||
 | 
			
		||||
  klass->notify_scroll_continuous (virtual_device, time_us,
 | 
			
		||||
                                   dx, dy, scroll_source, finish_flags);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_virtual_input_device_notify_touch_down (ClutterVirtualInputDevice *virtual_device,
 | 
			
		||||
                                                uint64_t                   time_us,
 | 
			
		||||
                                                int                        slot,
 | 
			
		||||
                                                double                     x,
 | 
			
		||||
                                                double                     y)
 | 
			
		||||
{
 | 
			
		||||
  ClutterVirtualInputDeviceClass *klass =
 | 
			
		||||
    CLUTTER_VIRTUAL_INPUT_DEVICE_GET_CLASS (virtual_device);
 | 
			
		||||
 | 
			
		||||
  klass->notify_touch_down (virtual_device, time_us,
 | 
			
		||||
                            slot, x, y);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_virtual_input_device_notify_touch_motion (ClutterVirtualInputDevice *virtual_device,
 | 
			
		||||
                                                  uint64_t                   time_us,
 | 
			
		||||
                                                  int                        slot,
 | 
			
		||||
                                                  double                     x,
 | 
			
		||||
                                                  double                     y)
 | 
			
		||||
{
 | 
			
		||||
  ClutterVirtualInputDeviceClass *klass =
 | 
			
		||||
    CLUTTER_VIRTUAL_INPUT_DEVICE_GET_CLASS (virtual_device);
 | 
			
		||||
 | 
			
		||||
  klass->notify_touch_motion (virtual_device, time_us,
 | 
			
		||||
                              slot, x, y);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_virtual_input_device_notify_touch_up (ClutterVirtualInputDevice *virtual_device,
 | 
			
		||||
                                              uint64_t                   time_us,
 | 
			
		||||
                                              int                        slot)
 | 
			
		||||
{
 | 
			
		||||
  ClutterVirtualInputDeviceClass *klass =
 | 
			
		||||
    CLUTTER_VIRTUAL_INPUT_DEVICE_GET_CLASS (virtual_device);
 | 
			
		||||
 | 
			
		||||
  klass->notify_touch_up (virtual_device, time_us,
 | 
			
		||||
                          slot);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_virtual_input_device_get_manager:
 | 
			
		||||
 * @virtual_device: a virtual device
 | 
			
		||||
 
 | 
			
		||||
@@ -76,6 +76,34 @@ struct _ClutterVirtualInputDeviceClass
 | 
			
		||||
                         uint64_t                   time_us,
 | 
			
		||||
                         uint32_t                   keyval,
 | 
			
		||||
                         ClutterKeyState            key_state);
 | 
			
		||||
 | 
			
		||||
  void (*notify_discrete_scroll) (ClutterVirtualInputDevice *virtual_device,
 | 
			
		||||
                                  uint64_t                   time_us,
 | 
			
		||||
                                  ClutterScrollDirection     direction,
 | 
			
		||||
                                  ClutterScrollSource        scroll_source);
 | 
			
		||||
 | 
			
		||||
  void (*notify_scroll_continuous) (ClutterVirtualInputDevice *virtual_device,
 | 
			
		||||
                                    uint64_t                   time_us,
 | 
			
		||||
                                    double                     dx,
 | 
			
		||||
                                    double                     dy,
 | 
			
		||||
                                    ClutterScrollSource        scroll_source,
 | 
			
		||||
                                    ClutterScrollFinishFlags   finish_flags);
 | 
			
		||||
 | 
			
		||||
  void (*notify_touch_down) (ClutterVirtualInputDevice *virtual_device,
 | 
			
		||||
                             uint64_t                   time_us,
 | 
			
		||||
                             int                        slot,
 | 
			
		||||
                             double                     x,
 | 
			
		||||
                             double                     y);
 | 
			
		||||
 | 
			
		||||
  void (*notify_touch_motion) (ClutterVirtualInputDevice *virtual_device,
 | 
			
		||||
                               uint64_t                   time_us,
 | 
			
		||||
                               int                        slot,
 | 
			
		||||
                               double                     x,
 | 
			
		||||
                               double                     y);
 | 
			
		||||
 | 
			
		||||
  void (*notify_touch_up) (ClutterVirtualInputDevice *virtual_device,
 | 
			
		||||
                           uint64_t                   time_us,
 | 
			
		||||
                           int                        slot);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
CLUTTER_AVAILABLE_IN_ALL
 | 
			
		||||
@@ -108,6 +136,39 @@ void clutter_virtual_input_device_notify_keyval (ClutterVirtualInputDevice *virt
 | 
			
		||||
                                                 uint32_t                   keyval,
 | 
			
		||||
                                                 ClutterKeyState            key_state);
 | 
			
		||||
 | 
			
		||||
CLUTTER_AVAILABLE_IN_ALL
 | 
			
		||||
void clutter_virtual_input_device_notify_discrete_scroll (ClutterVirtualInputDevice *virtual_device,
 | 
			
		||||
                                                          uint64_t                   time_us,
 | 
			
		||||
                                                          ClutterScrollDirection     direction,
 | 
			
		||||
                                                          ClutterScrollSource        scroll_source);
 | 
			
		||||
 | 
			
		||||
CLUTTER_AVAILABLE_IN_ALL
 | 
			
		||||
void clutter_virtual_input_device_notify_scroll_continuous (ClutterVirtualInputDevice *virtual_device,
 | 
			
		||||
                                                            uint64_t                   time_us,
 | 
			
		||||
                                                            double                     dx,
 | 
			
		||||
                                                            double                     dy,
 | 
			
		||||
                                                            ClutterScrollSource        scroll_source,
 | 
			
		||||
                                                            ClutterScrollFinishFlags   finish_flags);
 | 
			
		||||
 | 
			
		||||
CLUTTER_AVAILABLE_IN_ALL
 | 
			
		||||
void clutter_virtual_input_device_notify_touch_down (ClutterVirtualInputDevice *virtual_device,
 | 
			
		||||
                                                     uint64_t                   time_us,
 | 
			
		||||
                                                     int                        slot,
 | 
			
		||||
                                                     double                     x,
 | 
			
		||||
                                                     double                     y);
 | 
			
		||||
 | 
			
		||||
CLUTTER_AVAILABLE_IN_ALL
 | 
			
		||||
void clutter_virtual_input_device_notify_touch_motion (ClutterVirtualInputDevice *virtual_device,
 | 
			
		||||
                                                       uint64_t                   time_us,
 | 
			
		||||
                                                       int                        slot,
 | 
			
		||||
                                                       double                     x,
 | 
			
		||||
                                                       double                     y);
 | 
			
		||||
 | 
			
		||||
CLUTTER_AVAILABLE_IN_ALL
 | 
			
		||||
void clutter_virtual_input_device_notify_touch_up (ClutterVirtualInputDevice *virtual_device,
 | 
			
		||||
                                                   uint64_t                   time_us,
 | 
			
		||||
                                                   int                        slot);
 | 
			
		||||
 | 
			
		||||
CLUTTER_AVAILABLE_IN_ALL
 | 
			
		||||
ClutterDeviceManager * clutter_virtual_input_device_get_manager (ClutterVirtualInputDevice *virtual_device);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -72,6 +72,8 @@
 | 
			
		||||
#include "clutter-image.h"
 | 
			
		||||
#include "clutter-input-device.h"
 | 
			
		||||
#include "clutter-input-device-tool.h"
 | 
			
		||||
#include "clutter-input-method.h"
 | 
			
		||||
#include "clutter-input-focus.h"
 | 
			
		||||
#include "clutter-interval.h"
 | 
			
		||||
#include "clutter-keyframe-transition.h"
 | 
			
		||||
#include "clutter-keysyms.h"
 | 
			
		||||
 
 | 
			
		||||
@@ -48,6 +48,7 @@
 | 
			
		||||
#include "clutter-private.h"
 | 
			
		||||
#include "clutter-main.h"
 | 
			
		||||
#include "clutter-stage-private.h"
 | 
			
		||||
#include "clutter-settings-private.h"
 | 
			
		||||
 | 
			
		||||
#ifdef COGL_HAS_EGL_SUPPORT
 | 
			
		||||
#include "clutter-egl.h"
 | 
			
		||||
@@ -60,6 +61,8 @@ clutter_backend_egl_native_dispose (GObject *gobject)
 | 
			
		||||
{
 | 
			
		||||
  ClutterBackendEglNative *backend_egl_native = CLUTTER_BACKEND_EGL_NATIVE (gobject);
 | 
			
		||||
 | 
			
		||||
  g_clear_object (&backend_egl_native->xsettings);
 | 
			
		||||
 | 
			
		||||
  if (backend_egl_native->event_timer != NULL)
 | 
			
		||||
    {
 | 
			
		||||
      g_timer_destroy (backend_egl_native->event_timer);
 | 
			
		||||
@@ -77,9 +80,181 @@ clutter_backend_egl_native_class_init (ClutterBackendEglNativeClass *klass)
 | 
			
		||||
  gobject_class->dispose = clutter_backend_egl_native_dispose;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
typedef struct
 | 
			
		||||
{
 | 
			
		||||
  cairo_antialias_t cairo_antialias;
 | 
			
		||||
  gint clutter_font_antialias;
 | 
			
		||||
 | 
			
		||||
  cairo_hint_style_t cairo_hint_style;
 | 
			
		||||
  const char *clutter_font_hint_style;
 | 
			
		||||
 | 
			
		||||
  cairo_subpixel_order_t cairo_subpixel_order;
 | 
			
		||||
  const char *clutter_font_subpixel_order;
 | 
			
		||||
} FontSettings;
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
get_font_gsettings (GSettings    *xsettings,
 | 
			
		||||
                    FontSettings *output)
 | 
			
		||||
{
 | 
			
		||||
  /* org.gnome.settings-daemon.GsdFontAntialiasingMode */
 | 
			
		||||
  static const struct
 | 
			
		||||
  {
 | 
			
		||||
    cairo_antialias_t cairo_antialias;
 | 
			
		||||
    gint clutter_font_antialias;
 | 
			
		||||
  }
 | 
			
		||||
  antialiasings[] =
 | 
			
		||||
  {
 | 
			
		||||
    /* none=0      */ {CAIRO_ANTIALIAS_NONE,     0},
 | 
			
		||||
    /* grayscale=1 */ {CAIRO_ANTIALIAS_GRAY,     1},
 | 
			
		||||
    /* rgba=2      */ {CAIRO_ANTIALIAS_SUBPIXEL, 1},
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  /* org.gnome.settings-daemon.GsdFontHinting */
 | 
			
		||||
  static const struct
 | 
			
		||||
  {
 | 
			
		||||
    cairo_hint_style_t cairo_hint_style;
 | 
			
		||||
    const char *clutter_font_hint_style;
 | 
			
		||||
  }
 | 
			
		||||
  hintings[] =
 | 
			
		||||
  {
 | 
			
		||||
    /* none=0   */ {CAIRO_HINT_STYLE_NONE,   "hintnone"},
 | 
			
		||||
    /* slight=1 */ {CAIRO_HINT_STYLE_SLIGHT, "hintslight"},
 | 
			
		||||
    /* medium=2 */ {CAIRO_HINT_STYLE_MEDIUM, "hintmedium"},
 | 
			
		||||
    /* full=3   */ {CAIRO_HINT_STYLE_FULL,   "hintfull"},
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  /* org.gnome.settings-daemon.GsdFontRgbaOrder */
 | 
			
		||||
  static const struct
 | 
			
		||||
  {
 | 
			
		||||
    cairo_subpixel_order_t cairo_subpixel_order;
 | 
			
		||||
    const char *clutter_font_subpixel_order;
 | 
			
		||||
  }
 | 
			
		||||
  rgba_orders[] =
 | 
			
		||||
  {
 | 
			
		||||
    /* rgba=0 */ {CAIRO_SUBPIXEL_ORDER_RGB,  "rgb"}, /* XXX what is 'rgba'? */
 | 
			
		||||
    /* rgb=1  */ {CAIRO_SUBPIXEL_ORDER_RGB,  "rgb"},
 | 
			
		||||
    /* bgr=2  */ {CAIRO_SUBPIXEL_ORDER_BGR,  "bgr"},
 | 
			
		||||
    /* vrgb=3 */ {CAIRO_SUBPIXEL_ORDER_VRGB, "vrgb"},
 | 
			
		||||
    /* vbgr=4 */ {CAIRO_SUBPIXEL_ORDER_VBGR, "vbgr"},
 | 
			
		||||
  };
 | 
			
		||||
  guint i;
 | 
			
		||||
 | 
			
		||||
  i = g_settings_get_enum (xsettings, "hinting");
 | 
			
		||||
  if (i < G_N_ELEMENTS (hintings))
 | 
			
		||||
    {
 | 
			
		||||
      output->cairo_hint_style = hintings[i].cairo_hint_style;
 | 
			
		||||
      output->clutter_font_hint_style = hintings[i].clutter_font_hint_style;
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      output->cairo_hint_style = CAIRO_HINT_STYLE_DEFAULT;
 | 
			
		||||
      output->clutter_font_hint_style = NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  i = g_settings_get_enum (xsettings, "antialiasing");
 | 
			
		||||
  if (i < G_N_ELEMENTS (antialiasings))
 | 
			
		||||
    {
 | 
			
		||||
      output->cairo_antialias = antialiasings[i].cairo_antialias;
 | 
			
		||||
      output->clutter_font_antialias = antialiasings[i].clutter_font_antialias;
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      output->cairo_antialias = CAIRO_ANTIALIAS_DEFAULT;
 | 
			
		||||
      output->clutter_font_antialias = -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  i = g_settings_get_enum (xsettings, "rgba-order");
 | 
			
		||||
  if (i < G_N_ELEMENTS (rgba_orders))
 | 
			
		||||
    {
 | 
			
		||||
      output->cairo_subpixel_order = rgba_orders[i].cairo_subpixel_order;
 | 
			
		||||
      output->clutter_font_subpixel_order = rgba_orders[i].clutter_font_subpixel_order;
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      output->cairo_subpixel_order = CAIRO_SUBPIXEL_ORDER_DEFAULT;
 | 
			
		||||
      output->clutter_font_subpixel_order = NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (output->cairo_antialias == CAIRO_ANTIALIAS_GRAY)
 | 
			
		||||
    output->clutter_font_subpixel_order = "none";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
init_font_options (ClutterBackendEglNative *backend_egl_native)
 | 
			
		||||
{
 | 
			
		||||
  GSettings *xsettings = backend_egl_native->xsettings;
 | 
			
		||||
  cairo_font_options_t *options = cairo_font_options_create ();
 | 
			
		||||
  FontSettings fs;
 | 
			
		||||
 | 
			
		||||
  get_font_gsettings (xsettings, &fs);
 | 
			
		||||
 | 
			
		||||
  cairo_font_options_set_hint_style (options, fs.cairo_hint_style);
 | 
			
		||||
  cairo_font_options_set_antialias (options, fs.cairo_antialias);
 | 
			
		||||
  cairo_font_options_set_subpixel_order (options, fs.cairo_subpixel_order);
 | 
			
		||||
 | 
			
		||||
  clutter_backend_set_font_options (CLUTTER_BACKEND (backend_egl_native),
 | 
			
		||||
                                    options);
 | 
			
		||||
 | 
			
		||||
  cairo_font_options_destroy (options);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
on_xsettings_change_event (GSettings *xsettings,
 | 
			
		||||
                           gpointer   keys,
 | 
			
		||||
                           gint       n_keys,
 | 
			
		||||
                           gpointer   user_data)
 | 
			
		||||
{
 | 
			
		||||
  /*
 | 
			
		||||
   * A simpler alternative to this function that does not update the screen
 | 
			
		||||
   * immediately (like macOS :P):
 | 
			
		||||
   *
 | 
			
		||||
   *   init_font_options (CLUTTER_BACKEND_EGL_NATIVE (user_data));
 | 
			
		||||
   *
 | 
			
		||||
   * which has the added benefit of eliminating the need for all the
 | 
			
		||||
   * FontSettings.clutter_ fields. However the below approach is better for
 | 
			
		||||
   * testing settings and more consistent with the existing x11 backend...
 | 
			
		||||
   */
 | 
			
		||||
  ClutterSettings *csettings = clutter_settings_get_default ();
 | 
			
		||||
  FontSettings fs;
 | 
			
		||||
  gint hinting;
 | 
			
		||||
 | 
			
		||||
  get_font_gsettings (xsettings, &fs);
 | 
			
		||||
  hinting = fs.cairo_hint_style == CAIRO_HINT_STYLE_NONE ? 0 : 1;
 | 
			
		||||
  g_object_set (csettings,
 | 
			
		||||
                "font-hinting",        hinting,
 | 
			
		||||
                "font-hint-style",     fs.clutter_font_hint_style,
 | 
			
		||||
                "font-antialias",      fs.clutter_font_antialias,
 | 
			
		||||
                "font-subpixel-order", fs.clutter_font_subpixel_order,
 | 
			
		||||
                NULL);
 | 
			
		||||
 | 
			
		||||
  return FALSE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_backend_egl_native_init (ClutterBackendEglNative *backend_egl_native)
 | 
			
		||||
{
 | 
			
		||||
  static const gchar xsettings_path[] = "org.gnome.settings-daemon.plugins.xsettings";
 | 
			
		||||
  GSettingsSchemaSource *source = g_settings_schema_source_get_default ();
 | 
			
		||||
  GSettingsSchema *schema = g_settings_schema_source_lookup (source,
 | 
			
		||||
                                                             xsettings_path,
 | 
			
		||||
                                                             FALSE);
 | 
			
		||||
 | 
			
		||||
  if (!schema)
 | 
			
		||||
    {
 | 
			
		||||
      g_warning ("Failed to find schema: %s", xsettings_path);
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      backend_egl_native->xsettings = g_settings_new_full (schema, NULL, NULL);
 | 
			
		||||
      if (backend_egl_native->xsettings)
 | 
			
		||||
        {
 | 
			
		||||
          init_font_options (backend_egl_native);
 | 
			
		||||
          g_signal_connect (backend_egl_native->xsettings, "change-event",
 | 
			
		||||
                            G_CALLBACK (on_xsettings_change_event),
 | 
			
		||||
                            backend_egl_native);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  backend_egl_native->event_timer = g_timer_new ();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -61,6 +61,9 @@ struct _ClutterBackendEglNative
 | 
			
		||||
 | 
			
		||||
  /* event timer */
 | 
			
		||||
  GTimer *event_timer;
 | 
			
		||||
 | 
			
		||||
  /* "xsettings" is still the defacto place for Xft settings, even in Wayland */
 | 
			
		||||
  GSettings *xsettings;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct _ClutterBackendEglNativeClass
 | 
			
		||||
 
 | 
			
		||||
@@ -59,9 +59,6 @@
 | 
			
		||||
 | 
			
		||||
#include "clutter-device-manager-evdev.h"
 | 
			
		||||
 | 
			
		||||
#define DISCRETE_SCROLL_STEP 10.0
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Clutter makes the assumption that two core devices have ID's 2 and 3 (core
 | 
			
		||||
 * pointer and core keyboard).
 | 
			
		||||
@@ -327,7 +324,6 @@ new_absolute_motion_event (ClutterInputDevice *input_device,
 | 
			
		||||
  _clutter_evdev_event_set_time_usec (event, time_us);
 | 
			
		||||
  event->motion.time = us2ms (time_us);
 | 
			
		||||
  event->motion.stage = stage;
 | 
			
		||||
  event->motion.device = seat->core_pointer;
 | 
			
		||||
  _clutter_xkb_translate_state (event, seat->xkb, seat->button_state);
 | 
			
		||||
  event->motion.x = x;
 | 
			
		||||
  event->motion.y = y;
 | 
			
		||||
@@ -335,6 +331,7 @@ new_absolute_motion_event (ClutterInputDevice *input_device,
 | 
			
		||||
                                                    &event->motion.x,
 | 
			
		||||
                                                    &event->motion.y);
 | 
			
		||||
  event->motion.axes = axes;
 | 
			
		||||
  clutter_event_set_device (event, seat->core_pointer);
 | 
			
		||||
  clutter_event_set_source_device (event, input_device);
 | 
			
		||||
 | 
			
		||||
  if (clutter_input_device_get_device_type (input_device) == CLUTTER_TABLET_DEVICE)
 | 
			
		||||
@@ -400,168 +397,6 @@ notify_relative_tool_motion (ClutterInputDevice *input_device,
 | 
			
		||||
  queue_event (event);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static ClutterScrollDirection
 | 
			
		||||
discrete_to_direction (gdouble discrete_x,
 | 
			
		||||
                       gdouble discrete_y)
 | 
			
		||||
{
 | 
			
		||||
  if (discrete_x > 0)
 | 
			
		||||
    return CLUTTER_SCROLL_RIGHT;
 | 
			
		||||
  else if (discrete_x < 0)
 | 
			
		||||
    return CLUTTER_SCROLL_LEFT;
 | 
			
		||||
  else if (discrete_y > 0)
 | 
			
		||||
    return CLUTTER_SCROLL_DOWN;
 | 
			
		||||
  else if (discrete_y < 0)
 | 
			
		||||
    return CLUTTER_SCROLL_UP;
 | 
			
		||||
  else
 | 
			
		||||
    return CLUTTER_SCROLL_SMOOTH;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
notify_discrete_scroll (ClutterInputDevice     *input_device,
 | 
			
		||||
                        guint64                 time_us,
 | 
			
		||||
                        ClutterScrollDirection  direction,
 | 
			
		||||
                        ClutterScrollSource     scroll_source,
 | 
			
		||||
                        gboolean                emulated)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputDeviceEvdev *device_evdev;
 | 
			
		||||
  ClutterSeatEvdev *seat;
 | 
			
		||||
  ClutterStage *stage;
 | 
			
		||||
  ClutterEvent *event = NULL;
 | 
			
		||||
 | 
			
		||||
  if (direction == CLUTTER_SCROLL_SMOOTH)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  /* We can drop the event on the floor if no stage has been
 | 
			
		||||
   * associated with the device yet. */
 | 
			
		||||
  stage = _clutter_input_device_get_stage (input_device);
 | 
			
		||||
  if (stage == NULL)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  device_evdev = CLUTTER_INPUT_DEVICE_EVDEV (input_device);
 | 
			
		||||
  seat = _clutter_input_device_evdev_get_seat (device_evdev);
 | 
			
		||||
 | 
			
		||||
  event = clutter_event_new (CLUTTER_SCROLL);
 | 
			
		||||
 | 
			
		||||
  _clutter_evdev_event_set_time_usec (event, time_us);
 | 
			
		||||
  event->scroll.time = us2ms (time_us);
 | 
			
		||||
  event->scroll.stage = CLUTTER_STAGE (stage);
 | 
			
		||||
  event->scroll.device = seat->core_pointer;
 | 
			
		||||
  _clutter_xkb_translate_state (event, seat->xkb, seat->button_state);
 | 
			
		||||
 | 
			
		||||
  event->scroll.direction = direction;
 | 
			
		||||
 | 
			
		||||
  event->scroll.x = seat->pointer_x;
 | 
			
		||||
  event->scroll.y = seat->pointer_y;
 | 
			
		||||
  clutter_event_set_device (event, seat->core_pointer);
 | 
			
		||||
  clutter_event_set_source_device (event, input_device);
 | 
			
		||||
  event->scroll.scroll_source = scroll_source;
 | 
			
		||||
 | 
			
		||||
  _clutter_event_set_pointer_emulated (event, emulated);
 | 
			
		||||
 | 
			
		||||
  queue_event (event);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
notify_scroll (ClutterInputDevice       *input_device,
 | 
			
		||||
               guint64                   time_us,
 | 
			
		||||
               gdouble                   dx,
 | 
			
		||||
               gdouble                   dy,
 | 
			
		||||
               ClutterScrollSource       source,
 | 
			
		||||
               ClutterScrollFinishFlags  flags,
 | 
			
		||||
               gboolean                  emulated)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputDeviceEvdev *device_evdev;
 | 
			
		||||
  ClutterSeatEvdev *seat;
 | 
			
		||||
  ClutterStage *stage;
 | 
			
		||||
  ClutterEvent *event = NULL;
 | 
			
		||||
  gdouble scroll_factor;
 | 
			
		||||
 | 
			
		||||
  /* We can drop the event on the floor if no stage has been
 | 
			
		||||
   * associated with the device yet. */
 | 
			
		||||
  stage = _clutter_input_device_get_stage (input_device);
 | 
			
		||||
  if (stage == NULL)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  device_evdev = CLUTTER_INPUT_DEVICE_EVDEV (input_device);
 | 
			
		||||
  seat = _clutter_input_device_evdev_get_seat (device_evdev);
 | 
			
		||||
 | 
			
		||||
  event = clutter_event_new (CLUTTER_SCROLL);
 | 
			
		||||
 | 
			
		||||
  _clutter_evdev_event_set_time_usec (event, time_us);
 | 
			
		||||
  event->scroll.time = us2ms (time_us);
 | 
			
		||||
  event->scroll.stage = CLUTTER_STAGE (stage);
 | 
			
		||||
  event->scroll.device = seat->core_pointer;
 | 
			
		||||
  _clutter_xkb_translate_state (event, seat->xkb, seat->button_state);
 | 
			
		||||
 | 
			
		||||
  /* libinput pointer axis events are in pointer motion coordinate space.
 | 
			
		||||
   * To convert to Xi2 discrete step coordinate space, multiply the factor
 | 
			
		||||
   * 1/10. */
 | 
			
		||||
  event->scroll.direction = CLUTTER_SCROLL_SMOOTH;
 | 
			
		||||
  scroll_factor = 1.0 / DISCRETE_SCROLL_STEP;
 | 
			
		||||
  clutter_event_set_scroll_delta (event,
 | 
			
		||||
                                  scroll_factor * dx,
 | 
			
		||||
                                  scroll_factor * dy);
 | 
			
		||||
 | 
			
		||||
  event->scroll.x = seat->pointer_x;
 | 
			
		||||
  event->scroll.y = seat->pointer_y;
 | 
			
		||||
  clutter_event_set_device (event, seat->core_pointer);
 | 
			
		||||
  clutter_event_set_source_device (event, input_device);
 | 
			
		||||
  event->scroll.scroll_source = source;
 | 
			
		||||
  event->scroll.finish_flags = flags;
 | 
			
		||||
 | 
			
		||||
  _clutter_event_set_pointer_emulated (event, emulated);
 | 
			
		||||
 | 
			
		||||
  queue_event (event);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
notify_touch_event (ClutterInputDevice *input_device,
 | 
			
		||||
		    ClutterEventType    evtype,
 | 
			
		||||
		    guint64             time_us,
 | 
			
		||||
		    gint32              slot,
 | 
			
		||||
		    gdouble             x,
 | 
			
		||||
		    gdouble             y)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputDeviceEvdev *device_evdev;
 | 
			
		||||
  ClutterSeatEvdev *seat;
 | 
			
		||||
  ClutterStage *stage;
 | 
			
		||||
  ClutterEvent *event = NULL;
 | 
			
		||||
 | 
			
		||||
  /* We can drop the event on the floor if no stage has been
 | 
			
		||||
   * associated with the device yet. */
 | 
			
		||||
  stage = _clutter_input_device_get_stage (input_device);
 | 
			
		||||
  if (stage == NULL)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  device_evdev = CLUTTER_INPUT_DEVICE_EVDEV (input_device);
 | 
			
		||||
  seat = _clutter_input_device_evdev_get_seat (device_evdev);
 | 
			
		||||
 | 
			
		||||
  event = clutter_event_new (evtype);
 | 
			
		||||
 | 
			
		||||
  _clutter_evdev_event_set_time_usec (event, time_us);
 | 
			
		||||
  event->touch.time = us2ms (time_us);
 | 
			
		||||
  event->touch.stage = CLUTTER_STAGE (stage);
 | 
			
		||||
  event->touch.device = seat->core_pointer;
 | 
			
		||||
  event->touch.x = x;
 | 
			
		||||
  event->touch.y = y;
 | 
			
		||||
  clutter_input_device_evdev_translate_coordinates (input_device, stage,
 | 
			
		||||
                                                    &event->touch.x,
 | 
			
		||||
                                                    &event->touch.y);
 | 
			
		||||
 | 
			
		||||
  /* "NULL" sequences are special cased in clutter */
 | 
			
		||||
  event->touch.sequence = GINT_TO_POINTER (slot + 1);
 | 
			
		||||
  _clutter_xkb_translate_state (event, seat->xkb, seat->button_state);
 | 
			
		||||
 | 
			
		||||
  if (evtype == CLUTTER_TOUCH_BEGIN ||
 | 
			
		||||
      evtype == CLUTTER_TOUCH_UPDATE)
 | 
			
		||||
    event->touch.modifier_state |= CLUTTER_BUTTON1_MASK;
 | 
			
		||||
 | 
			
		||||
  clutter_event_set_device (event, seat->core_pointer);
 | 
			
		||||
  clutter_event_set_source_device (event, input_device);
 | 
			
		||||
 | 
			
		||||
  queue_event (event);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
notify_pinch_gesture_event (ClutterInputDevice          *input_device,
 | 
			
		||||
                            ClutterTouchpadGesturePhase  phase,
 | 
			
		||||
@@ -684,7 +519,6 @@ notify_proximity (ClutterInputDevice *input_device,
 | 
			
		||||
 | 
			
		||||
  event->proximity.time = us2ms (time_us);
 | 
			
		||||
  event->proximity.stage = CLUTTER_STAGE (stage);
 | 
			
		||||
  event->proximity.device = seat->core_pointer;
 | 
			
		||||
  clutter_event_set_device_tool (event, device_evdev->last_tool);
 | 
			
		||||
  clutter_event_set_device (event, seat->core_pointer);
 | 
			
		||||
  clutter_event_set_source_device (event, input_device);
 | 
			
		||||
@@ -958,10 +792,12 @@ evdev_add_device (ClutterDeviceManagerEvdev *manager_evdev,
 | 
			
		||||
      if (priv->main_seat->libinput_seat == NULL)
 | 
			
		||||
        seat = priv->main_seat;
 | 
			
		||||
      else
 | 
			
		||||
        seat = clutter_seat_evdev_new (manager_evdev);
 | 
			
		||||
        {
 | 
			
		||||
          seat = clutter_seat_evdev_new (manager_evdev);
 | 
			
		||||
          priv->seats = g_slist_append (priv->seats, seat);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      clutter_seat_evdev_set_libinput_seat (seat, libinput_seat);
 | 
			
		||||
      priv->seats = g_slist_append (priv->seats, seat);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  device = _clutter_input_device_evdev_new (manager, seat, libinput_device);
 | 
			
		||||
@@ -1084,7 +920,6 @@ clutter_device_manager_evdev_get_device (ClutterDeviceManager *manager,
 | 
			
		||||
  ClutterDeviceManagerEvdev *manager_evdev;
 | 
			
		||||
  ClutterDeviceManagerEvdevPrivate *priv;
 | 
			
		||||
  GSList *l;
 | 
			
		||||
  GSList *device_it;
 | 
			
		||||
 | 
			
		||||
  manager_evdev = CLUTTER_DEVICE_MANAGER_EVDEV (manager);
 | 
			
		||||
  priv = manager_evdev->priv;
 | 
			
		||||
@@ -1092,14 +927,10 @@ clutter_device_manager_evdev_get_device (ClutterDeviceManager *manager,
 | 
			
		||||
  for (l = priv->seats; l; l = l->next)
 | 
			
		||||
    {
 | 
			
		||||
      ClutterSeatEvdev *seat = l->data;
 | 
			
		||||
      ClutterInputDevice *device = clutter_seat_evdev_get_device (seat, id);
 | 
			
		||||
 | 
			
		||||
      for (device_it = seat->devices; device_it; device_it = device_it->next)
 | 
			
		||||
        {
 | 
			
		||||
          ClutterInputDevice *device = device_it->data;
 | 
			
		||||
 | 
			
		||||
          if (clutter_input_device_get_device_id (device) == id)
 | 
			
		||||
            return device;
 | 
			
		||||
        }
 | 
			
		||||
      if (device)
 | 
			
		||||
        return device;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return NULL;
 | 
			
		||||
@@ -1153,40 +984,6 @@ process_base_event (ClutterDeviceManagerEvdev *manager_evdev,
 | 
			
		||||
  return handled;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
check_notify_discrete_scroll (ClutterDeviceManagerEvdev *manager_evdev,
 | 
			
		||||
                              ClutterInputDevice        *device,
 | 
			
		||||
                              guint64                    time_us,
 | 
			
		||||
                              ClutterScrollSource        scroll_source)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputDeviceEvdev *device_evdev =
 | 
			
		||||
    CLUTTER_INPUT_DEVICE_EVDEV (device);
 | 
			
		||||
  ClutterSeatEvdev *seat = _clutter_input_device_evdev_get_seat (device_evdev);
 | 
			
		||||
  int i, n_xscrolls, n_yscrolls;
 | 
			
		||||
 | 
			
		||||
  n_xscrolls = floor (fabs (seat->accum_scroll_dx) / DISCRETE_SCROLL_STEP);
 | 
			
		||||
  n_yscrolls = floor (fabs (seat->accum_scroll_dy) / DISCRETE_SCROLL_STEP);
 | 
			
		||||
 | 
			
		||||
  for (i = 0; i < n_xscrolls; i++)
 | 
			
		||||
    {
 | 
			
		||||
      notify_discrete_scroll (device, time_us,
 | 
			
		||||
                              seat->accum_scroll_dx > 0 ?
 | 
			
		||||
                              CLUTTER_SCROLL_RIGHT : CLUTTER_SCROLL_LEFT,
 | 
			
		||||
                              scroll_source, TRUE);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  for (i = 0; i < n_yscrolls; i++)
 | 
			
		||||
    {
 | 
			
		||||
      notify_discrete_scroll (device, time_us,
 | 
			
		||||
                              seat->accum_scroll_dy > 0 ?
 | 
			
		||||
                              CLUTTER_SCROLL_DOWN : CLUTTER_SCROLL_UP,
 | 
			
		||||
                              scroll_source, TRUE);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  seat->accum_scroll_dx = fmodf (seat->accum_scroll_dx, DISCRETE_SCROLL_STEP);
 | 
			
		||||
  seat->accum_scroll_dy = fmodf (seat->accum_scroll_dy, DISCRETE_SCROLL_STEP);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static ClutterScrollSource
 | 
			
		||||
translate_scroll_source (enum libinput_pointer_axis_source source)
 | 
			
		||||
{
 | 
			
		||||
@@ -1334,6 +1131,68 @@ seat_from_device (ClutterInputDevice *device)
 | 
			
		||||
  return _clutter_input_device_evdev_get_seat (device_evdev);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
notify_continuous_axis (ClutterSeatEvdev              *seat,
 | 
			
		||||
                        ClutterInputDevice            *device,
 | 
			
		||||
                        uint64_t                       time_us,
 | 
			
		||||
                        ClutterScrollSource            scroll_source,
 | 
			
		||||
                        struct libinput_event_pointer *axis_event)
 | 
			
		||||
{
 | 
			
		||||
  gdouble dx = 0.0, dy = 0.0;
 | 
			
		||||
  ClutterScrollFinishFlags finish_flags = CLUTTER_SCROLL_FINISHED_NONE;
 | 
			
		||||
 | 
			
		||||
  if (libinput_event_pointer_has_axis (axis_event,
 | 
			
		||||
                                       LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL))
 | 
			
		||||
    {
 | 
			
		||||
      dx = libinput_event_pointer_get_axis_value (
 | 
			
		||||
          axis_event, LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL);
 | 
			
		||||
 | 
			
		||||
      if (fabs (dx) < DBL_EPSILON)
 | 
			
		||||
        finish_flags |= CLUTTER_SCROLL_FINISHED_HORIZONTAL;
 | 
			
		||||
    }
 | 
			
		||||
  if (libinput_event_pointer_has_axis (axis_event,
 | 
			
		||||
                                       LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL))
 | 
			
		||||
    {
 | 
			
		||||
      dy = libinput_event_pointer_get_axis_value (
 | 
			
		||||
          axis_event, LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL);
 | 
			
		||||
 | 
			
		||||
      if (fabs (dy) < DBL_EPSILON)
 | 
			
		||||
        finish_flags |= CLUTTER_SCROLL_FINISHED_VERTICAL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  clutter_seat_evdev_notify_scroll_continuous (seat, device, time_us,
 | 
			
		||||
                                               dx, dy,
 | 
			
		||||
                                               scroll_source, finish_flags);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
notify_discrete_axis (ClutterSeatEvdev              *seat,
 | 
			
		||||
                      ClutterInputDevice            *device,
 | 
			
		||||
                      uint64_t                       time_us,
 | 
			
		||||
                      ClutterScrollSource            scroll_source,
 | 
			
		||||
                      struct libinput_event_pointer *axis_event)
 | 
			
		||||
{
 | 
			
		||||
  gdouble discrete_dx = 0.0, discrete_dy = 0.0;
 | 
			
		||||
 | 
			
		||||
  if (libinput_event_pointer_has_axis (axis_event,
 | 
			
		||||
                                       LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL))
 | 
			
		||||
    {
 | 
			
		||||
      discrete_dx = libinput_event_pointer_get_axis_value_discrete (
 | 
			
		||||
          axis_event, LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL);
 | 
			
		||||
    }
 | 
			
		||||
  if (libinput_event_pointer_has_axis (axis_event,
 | 
			
		||||
                                       LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL))
 | 
			
		||||
    {
 | 
			
		||||
      discrete_dy = libinput_event_pointer_get_axis_value_discrete (
 | 
			
		||||
          axis_event, LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  clutter_seat_evdev_notify_discrete_scroll (seat, device,
 | 
			
		||||
                                             time_us,
 | 
			
		||||
                                             discrete_dx, discrete_dy,
 | 
			
		||||
                                             scroll_source);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
process_device_event (ClutterDeviceManagerEvdev *manager_evdev,
 | 
			
		||||
                      struct libinput_event *event)
 | 
			
		||||
@@ -1341,6 +1200,7 @@ process_device_event (ClutterDeviceManagerEvdev *manager_evdev,
 | 
			
		||||
  gboolean handled = TRUE;
 | 
			
		||||
  struct libinput_device *libinput_device = libinput_event_get_device(event);
 | 
			
		||||
  ClutterInputDevice *device;
 | 
			
		||||
  ClutterInputDeviceEvdev *device_evdev;
 | 
			
		||||
 | 
			
		||||
  switch (libinput_event_get_type (event))
 | 
			
		||||
    {
 | 
			
		||||
@@ -1460,17 +1320,12 @@ process_device_event (ClutterDeviceManagerEvdev *manager_evdev,
 | 
			
		||||
 | 
			
		||||
    case LIBINPUT_EVENT_POINTER_AXIS:
 | 
			
		||||
      {
 | 
			
		||||
        gdouble dx = 0.0, dy = 0.0;
 | 
			
		||||
        gdouble discrete_x = 0.0, discrete_y = 0.0;
 | 
			
		||||
        guint64 time_us;
 | 
			
		||||
        gboolean wheel = FALSE;
 | 
			
		||||
        enum libinput_pointer_axis axis;
 | 
			
		||||
        enum libinput_pointer_axis_source source;
 | 
			
		||||
        struct libinput_event_pointer *axis_event =
 | 
			
		||||
          libinput_event_get_pointer_event (event);
 | 
			
		||||
        ClutterSeatEvdev *seat;
 | 
			
		||||
        ClutterScrollSource scroll_source;
 | 
			
		||||
        ClutterScrollFinishFlags finish_flags = 0;
 | 
			
		||||
 | 
			
		||||
        device = libinput_device_get_user_data (libinput_device);
 | 
			
		||||
        seat = _clutter_input_device_evdev_get_seat (CLUTTER_INPUT_DEVICE_EVDEV (device));
 | 
			
		||||
@@ -1484,68 +1339,25 @@ process_device_event (ClutterDeviceManagerEvdev *manager_evdev,
 | 
			
		||||
           backwards-compat with existing clients, we just send multiples of
 | 
			
		||||
           the click count. */
 | 
			
		||||
 | 
			
		||||
        if (source == LIBINPUT_POINTER_AXIS_SOURCE_WHEEL)
 | 
			
		||||
            wheel = TRUE;
 | 
			
		||||
 | 
			
		||||
        axis = LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL;
 | 
			
		||||
        if (libinput_event_pointer_has_axis (axis_event, axis))
 | 
			
		||||
        switch (scroll_source)
 | 
			
		||||
          {
 | 
			
		||||
            discrete_y = libinput_event_pointer_get_axis_value_discrete (axis_event, axis);
 | 
			
		||||
            dy = libinput_event_pointer_get_axis_value (axis_event, axis);
 | 
			
		||||
 | 
			
		||||
            if (wheel)
 | 
			
		||||
              seat->accum_scroll_dy = 0;
 | 
			
		||||
            else if (fabs (dy) < DBL_EPSILON)
 | 
			
		||||
              {
 | 
			
		||||
                finish_flags |= CLUTTER_SCROLL_FINISHED_VERTICAL;
 | 
			
		||||
                seat->accum_scroll_dy = 0;
 | 
			
		||||
              }
 | 
			
		||||
            else
 | 
			
		||||
              seat->accum_scroll_dy += dy;
 | 
			
		||||
          case CLUTTER_SCROLL_SOURCE_WHEEL:
 | 
			
		||||
            notify_discrete_axis (seat, device, time_us, scroll_source,
 | 
			
		||||
                                  axis_event);
 | 
			
		||||
            break;
 | 
			
		||||
          case CLUTTER_SCROLL_SOURCE_FINGER:
 | 
			
		||||
          case CLUTTER_SCROLL_SOURCE_CONTINUOUS:
 | 
			
		||||
          case CLUTTER_SCROLL_SOURCE_UNKNOWN:
 | 
			
		||||
            notify_continuous_axis (seat, device, time_us, scroll_source,
 | 
			
		||||
                                    axis_event);
 | 
			
		||||
            break;
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
        axis = LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL;
 | 
			
		||||
        if (libinput_event_pointer_has_axis (axis_event, axis))
 | 
			
		||||
          {
 | 
			
		||||
            discrete_x = libinput_event_pointer_get_axis_value_discrete (axis_event, axis);
 | 
			
		||||
            dx = libinput_event_pointer_get_axis_value (axis_event, axis);
 | 
			
		||||
 | 
			
		||||
            if (wheel)
 | 
			
		||||
              seat->accum_scroll_dx = 0;
 | 
			
		||||
            else if (fabs (dx) < DBL_EPSILON)
 | 
			
		||||
              {
 | 
			
		||||
                finish_flags |= CLUTTER_SCROLL_FINISHED_HORIZONTAL;
 | 
			
		||||
                seat->accum_scroll_dx = 0;
 | 
			
		||||
              }
 | 
			
		||||
            else
 | 
			
		||||
              seat->accum_scroll_dx += dx;
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
        if (wheel)
 | 
			
		||||
          {
 | 
			
		||||
            notify_scroll (device, time_us,
 | 
			
		||||
                           discrete_x * DISCRETE_SCROLL_STEP,
 | 
			
		||||
                           discrete_y * DISCRETE_SCROLL_STEP,
 | 
			
		||||
                           scroll_source, finish_flags, TRUE);
 | 
			
		||||
            notify_discrete_scroll (device, time_us,
 | 
			
		||||
                                    discrete_to_direction (discrete_x, discrete_y),
 | 
			
		||||
                                    scroll_source, FALSE);
 | 
			
		||||
          }
 | 
			
		||||
        else
 | 
			
		||||
          {
 | 
			
		||||
            notify_scroll (device, time_us, dx, dy,
 | 
			
		||||
                           scroll_source, finish_flags, FALSE);
 | 
			
		||||
            check_notify_discrete_scroll (manager_evdev, device,
 | 
			
		||||
                                          time_us, scroll_source);
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
        break;
 | 
			
		||||
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
    case LIBINPUT_EVENT_TOUCH_DOWN:
 | 
			
		||||
      {
 | 
			
		||||
        gint32 slot;
 | 
			
		||||
        int device_slot;
 | 
			
		||||
        guint64 time_us;
 | 
			
		||||
        double x, y;
 | 
			
		||||
        gfloat stage_width, stage_height;
 | 
			
		||||
@@ -1556,7 +1368,8 @@ process_device_event (ClutterDeviceManagerEvdev *manager_evdev,
 | 
			
		||||
          libinput_event_get_touch_event (event);
 | 
			
		||||
 | 
			
		||||
        device = libinput_device_get_user_data (libinput_device);
 | 
			
		||||
        seat = _clutter_input_device_evdev_get_seat (CLUTTER_INPUT_DEVICE_EVDEV (device));
 | 
			
		||||
        device_evdev = CLUTTER_INPUT_DEVICE_EVDEV (device);
 | 
			
		||||
        seat = _clutter_input_device_evdev_get_seat (device_evdev);
 | 
			
		||||
 | 
			
		||||
        stage = _clutter_input_device_get_stage (device);
 | 
			
		||||
        if (stage == NULL)
 | 
			
		||||
@@ -1565,25 +1378,31 @@ process_device_event (ClutterDeviceManagerEvdev *manager_evdev,
 | 
			
		||||
        stage_width = clutter_actor_get_width (CLUTTER_ACTOR (stage));
 | 
			
		||||
        stage_height = clutter_actor_get_height (CLUTTER_ACTOR (stage));
 | 
			
		||||
 | 
			
		||||
        slot = libinput_event_touch_get_slot (touch_event);
 | 
			
		||||
        device_slot = libinput_event_touch_get_slot (touch_event);
 | 
			
		||||
        time_us = libinput_event_touch_get_time_usec (touch_event);
 | 
			
		||||
        x = libinput_event_touch_get_x_transformed (touch_event,
 | 
			
		||||
                                                    stage_width);
 | 
			
		||||
        y = libinput_event_touch_get_y_transformed (touch_event,
 | 
			
		||||
                                                    stage_height);
 | 
			
		||||
 | 
			
		||||
        touch_state = clutter_seat_evdev_add_touch (seat, slot);
 | 
			
		||||
        touch_state =
 | 
			
		||||
          clutter_input_device_evdev_acquire_touch_state (device_evdev,
 | 
			
		||||
                                                          device_slot);
 | 
			
		||||
        touch_state->coords.x = x;
 | 
			
		||||
        touch_state->coords.y = y;
 | 
			
		||||
 | 
			
		||||
        notify_touch_event (device, CLUTTER_TOUCH_BEGIN, time_us, slot,
 | 
			
		||||
                             touch_state->coords.x, touch_state->coords.y);
 | 
			
		||||
        clutter_seat_evdev_notify_touch_event (seat, device,
 | 
			
		||||
                                               CLUTTER_TOUCH_BEGIN,
 | 
			
		||||
                                               time_us,
 | 
			
		||||
                                               touch_state->seat_slot,
 | 
			
		||||
                                               touch_state->coords.x,
 | 
			
		||||
                                               touch_state->coords.y);
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
    case LIBINPUT_EVENT_TOUCH_UP:
 | 
			
		||||
      {
 | 
			
		||||
        gint32 slot;
 | 
			
		||||
        int device_slot;
 | 
			
		||||
        guint64 time_us;
 | 
			
		||||
        ClutterSeatEvdev *seat;
 | 
			
		||||
        ClutterTouchState *touch_state;
 | 
			
		||||
@@ -1591,22 +1410,30 @@ process_device_event (ClutterDeviceManagerEvdev *manager_evdev,
 | 
			
		||||
          libinput_event_get_touch_event (event);
 | 
			
		||||
 | 
			
		||||
        device = libinput_device_get_user_data (libinput_device);
 | 
			
		||||
        seat = _clutter_input_device_evdev_get_seat (CLUTTER_INPUT_DEVICE_EVDEV (device));
 | 
			
		||||
        device_evdev = CLUTTER_INPUT_DEVICE_EVDEV (device);
 | 
			
		||||
        seat = _clutter_input_device_evdev_get_seat (device_evdev);
 | 
			
		||||
 | 
			
		||||
        slot = libinput_event_touch_get_slot (touch_event);
 | 
			
		||||
        device_slot = libinput_event_touch_get_slot (touch_event);
 | 
			
		||||
        time_us = libinput_event_touch_get_time_usec (touch_event);
 | 
			
		||||
        touch_state = clutter_seat_evdev_get_touch (seat, slot);
 | 
			
		||||
 | 
			
		||||
        notify_touch_event (device, CLUTTER_TOUCH_END, time_us, slot,
 | 
			
		||||
			    touch_state->coords.x, touch_state->coords.y);
 | 
			
		||||
        clutter_seat_evdev_remove_touch (seat, slot);
 | 
			
		||||
        touch_state =
 | 
			
		||||
          clutter_input_device_evdev_lookup_touch_state (device_evdev,
 | 
			
		||||
                                                         device_slot);
 | 
			
		||||
        if (!touch_state)
 | 
			
		||||
          break;
 | 
			
		||||
 | 
			
		||||
        clutter_seat_evdev_notify_touch_event (seat, device,
 | 
			
		||||
                                               CLUTTER_TOUCH_END, time_us,
 | 
			
		||||
                                               touch_state->seat_slot,
 | 
			
		||||
                                               touch_state->coords.x,
 | 
			
		||||
                                               touch_state->coords.y);
 | 
			
		||||
        clutter_input_device_evdev_release_touch_state (device_evdev,
 | 
			
		||||
                                                        touch_state);
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
    case LIBINPUT_EVENT_TOUCH_MOTION:
 | 
			
		||||
      {
 | 
			
		||||
        gint32 slot;
 | 
			
		||||
        int device_slot;
 | 
			
		||||
        guint64 time_us;
 | 
			
		||||
        double x, y;
 | 
			
		||||
        gfloat stage_width, stage_height;
 | 
			
		||||
@@ -1617,7 +1444,8 @@ process_device_event (ClutterDeviceManagerEvdev *manager_evdev,
 | 
			
		||||
          libinput_event_get_touch_event (event);
 | 
			
		||||
 | 
			
		||||
        device = libinput_device_get_user_data (libinput_device);
 | 
			
		||||
        seat = _clutter_input_device_evdev_get_seat (CLUTTER_INPUT_DEVICE_EVDEV (device));
 | 
			
		||||
        device_evdev = CLUTTER_INPUT_DEVICE_EVDEV (device);
 | 
			
		||||
        seat = _clutter_input_device_evdev_get_seat (device_evdev);
 | 
			
		||||
 | 
			
		||||
        stage = _clutter_input_device_get_stage (device);
 | 
			
		||||
        if (stage == NULL)
 | 
			
		||||
@@ -1626,42 +1454,41 @@ process_device_event (ClutterDeviceManagerEvdev *manager_evdev,
 | 
			
		||||
        stage_width = clutter_actor_get_width (CLUTTER_ACTOR (stage));
 | 
			
		||||
        stage_height = clutter_actor_get_height (CLUTTER_ACTOR (stage));
 | 
			
		||||
 | 
			
		||||
        slot = libinput_event_touch_get_slot (touch_event);
 | 
			
		||||
        device_slot = libinput_event_touch_get_slot (touch_event);
 | 
			
		||||
        time_us = libinput_event_touch_get_time_usec (touch_event);
 | 
			
		||||
        x = libinput_event_touch_get_x_transformed (touch_event,
 | 
			
		||||
                                                    stage_width);
 | 
			
		||||
        y = libinput_event_touch_get_y_transformed (touch_event,
 | 
			
		||||
                                                    stage_height);
 | 
			
		||||
 | 
			
		||||
        touch_state = clutter_seat_evdev_get_touch (seat, slot);
 | 
			
		||||
        touch_state =
 | 
			
		||||
          clutter_input_device_evdev_lookup_touch_state (device_evdev,
 | 
			
		||||
                                                         device_slot);
 | 
			
		||||
        if (!touch_state)
 | 
			
		||||
          break;
 | 
			
		||||
 | 
			
		||||
        touch_state->coords.x = x;
 | 
			
		||||
        touch_state->coords.y = y;
 | 
			
		||||
 | 
			
		||||
        notify_touch_event (device, CLUTTER_TOUCH_UPDATE, time_us, slot,
 | 
			
		||||
			    touch_state->coords.x, touch_state->coords.y);
 | 
			
		||||
        clutter_seat_evdev_notify_touch_event (seat, device,
 | 
			
		||||
                                               CLUTTER_TOUCH_UPDATE,
 | 
			
		||||
                                               time_us,
 | 
			
		||||
                                               touch_state->seat_slot,
 | 
			
		||||
                                               touch_state->coords.x,
 | 
			
		||||
                                               touch_state->coords.y);
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
    case LIBINPUT_EVENT_TOUCH_CANCEL:
 | 
			
		||||
      {
 | 
			
		||||
        ClutterTouchState *touch_state;
 | 
			
		||||
        GHashTableIter iter;
 | 
			
		||||
        guint64 time_us;
 | 
			
		||||
        struct libinput_event_touch *touch_event =
 | 
			
		||||
          libinput_event_get_touch_event (event);
 | 
			
		||||
        ClutterSeatEvdev *seat;
 | 
			
		||||
 | 
			
		||||
        device = libinput_device_get_user_data (libinput_device);
 | 
			
		||||
        device_evdev = CLUTTER_INPUT_DEVICE_EVDEV (device);
 | 
			
		||||
        time_us = libinput_event_touch_get_time_usec (touch_event);
 | 
			
		||||
        seat = _clutter_input_device_evdev_get_seat (CLUTTER_INPUT_DEVICE_EVDEV (device));
 | 
			
		||||
        g_hash_table_iter_init (&iter, seat->touches);
 | 
			
		||||
 | 
			
		||||
        while (g_hash_table_iter_next (&iter, NULL, (gpointer*) &touch_state))
 | 
			
		||||
          {
 | 
			
		||||
            notify_touch_event (device, CLUTTER_TOUCH_CANCEL,
 | 
			
		||||
                                time_us, touch_state->id,
 | 
			
		||||
                                touch_state->coords.x, touch_state->coords.y);
 | 
			
		||||
            g_hash_table_iter_remove (&iter);
 | 
			
		||||
          }
 | 
			
		||||
        clutter_input_device_evdev_release_touch_slots (device_evdev, time_us);
 | 
			
		||||
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
@@ -2035,6 +1862,14 @@ clutter_device_manager_evdev_create_virtual_device (ClutterDeviceManager  *manag
 | 
			
		||||
                       NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static ClutterVirtualDeviceType
 | 
			
		||||
clutter_device_manager_evdev_get_supported_virtual_device_types (ClutterDeviceManager *device_manager)
 | 
			
		||||
{
 | 
			
		||||
  return (CLUTTER_VIRTUAL_DEVICE_TYPE_KEYBOARD |
 | 
			
		||||
          CLUTTER_VIRTUAL_DEVICE_TYPE_POINTER |
 | 
			
		||||
          CLUTTER_VIRTUAL_DEVICE_TYPE_TOUCHSCREEN);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_device_manager_evdev_compress_motion (ClutterDeviceManager *device_manger,
 | 
			
		||||
                                              ClutterEvent         *event,
 | 
			
		||||
@@ -2060,6 +1895,18 @@ clutter_device_manager_evdev_compress_motion (ClutterDeviceManager *device_mange
 | 
			
		||||
                                            dy_unaccel + dst_dy_unaccel);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_device_manager_evdev_apply_kbd_a11y_settings (ClutterDeviceManager   *device_manager,
 | 
			
		||||
                                                      ClutterKbdA11ySettings *settings)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputDevice *device;
 | 
			
		||||
 | 
			
		||||
  device = clutter_device_manager_evdev_get_core_device (device_manager, CLUTTER_KEYBOARD_DEVICE);
 | 
			
		||||
  if (device)
 | 
			
		||||
    clutter_input_device_evdev_apply_kbd_a11y_settings (CLUTTER_INPUT_DEVICE_EVDEV (device),
 | 
			
		||||
                                                        settings);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * GObject implementation
 | 
			
		||||
 */
 | 
			
		||||
@@ -2116,6 +1963,7 @@ clutter_device_manager_evdev_constructed (GObject *gobject)
 | 
			
		||||
  xkb_context_unref (ctx);
 | 
			
		||||
 | 
			
		||||
  priv->main_seat = clutter_seat_evdev_new (manager_evdev);
 | 
			
		||||
  priv->seats = g_slist_append (priv->seats, priv->main_seat);
 | 
			
		||||
 | 
			
		||||
  dispatch_libinput (manager_evdev);
 | 
			
		||||
 | 
			
		||||
@@ -2201,7 +2049,9 @@ clutter_device_manager_evdev_class_init (ClutterDeviceManagerEvdevClass *klass)
 | 
			
		||||
  manager_class->get_core_device = clutter_device_manager_evdev_get_core_device;
 | 
			
		||||
  manager_class->get_device = clutter_device_manager_evdev_get_device;
 | 
			
		||||
  manager_class->create_virtual_device = clutter_device_manager_evdev_create_virtual_device;
 | 
			
		||||
  manager_class->get_supported_virtual_device_types = clutter_device_manager_evdev_get_supported_virtual_device_types;
 | 
			
		||||
  manager_class->compress_motion = clutter_device_manager_evdev_compress_motion;
 | 
			
		||||
  manager_class->apply_kbd_a11y_settings = clutter_device_manager_evdev_apply_kbd_a11y_settings;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
@@ -2322,7 +2172,7 @@ _clutter_device_manager_evdev_acquire_device_id (ClutterDeviceManagerEvdev *mana
 | 
			
		||||
 | 
			
		||||
  first = g_list_first (priv->free_device_ids);
 | 
			
		||||
  next_id = GPOINTER_TO_INT (first->data);
 | 
			
		||||
  priv->free_device_ids = g_list_remove_link (priv->free_device_ids, first);
 | 
			
		||||
  priv->free_device_ids = g_list_delete_link (priv->free_device_ids, first);
 | 
			
		||||
 | 
			
		||||
  return next_id;
 | 
			
		||||
}
 | 
			
		||||
@@ -2441,7 +2291,7 @@ clutter_evdev_update_xkb_state (ClutterDeviceManagerEvdev *manager_evdev)
 | 
			
		||||
                             0, /* depressed */
 | 
			
		||||
                             latched_mods,
 | 
			
		||||
                             locked_mods,
 | 
			
		||||
                             0, 0, 0);
 | 
			
		||||
                             0, 0, seat->layout_idx);
 | 
			
		||||
 | 
			
		||||
      seat->caps_lock_led = xkb_keymap_led_get_index (priv->keymap, XKB_LED_NAME_CAPS);
 | 
			
		||||
      seat->num_lock_led = xkb_keymap_led_get_index (priv->keymap, XKB_LED_NAME_NUM);
 | 
			
		||||
@@ -2589,6 +2439,7 @@ clutter_evdev_set_keyboard_layout_index (ClutterDeviceManager *evdev,
 | 
			
		||||
  xkb_mod_mask_t latched_mods;
 | 
			
		||||
  xkb_mod_mask_t locked_mods;
 | 
			
		||||
  struct xkb_state *state;
 | 
			
		||||
  GSList *l;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_DEVICE_MANAGER_EVDEV (evdev));
 | 
			
		||||
 | 
			
		||||
@@ -2600,6 +2451,12 @@ clutter_evdev_set_keyboard_layout_index (ClutterDeviceManager *evdev,
 | 
			
		||||
  locked_mods = xkb_state_serialize_mods (state, XKB_STATE_MODS_LOCKED);
 | 
			
		||||
 | 
			
		||||
  xkb_state_update_mask (state, depressed_mods, latched_mods, locked_mods, 0, 0, idx);
 | 
			
		||||
  for (l = manager_evdev->priv->seats; l; l = l->next)
 | 
			
		||||
    {
 | 
			
		||||
      ClutterSeatEvdev *seat = l->data;
 | 
			
		||||
 | 
			
		||||
      seat->layout_idx = idx;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -2609,12 +2466,9 @@ xkb_layout_index_t
 | 
			
		||||
clutter_evdev_get_keyboard_layout_index (ClutterDeviceManager *evdev)
 | 
			
		||||
{
 | 
			
		||||
  ClutterDeviceManagerEvdev *manager_evdev;
 | 
			
		||||
  struct xkb_state *state;
 | 
			
		||||
 | 
			
		||||
  manager_evdev = CLUTTER_DEVICE_MANAGER_EVDEV (evdev);
 | 
			
		||||
  state = manager_evdev->priv->main_seat->xkb;
 | 
			
		||||
 | 
			
		||||
  return xkb_state_serialize_layout (state, XKB_STATE_LAYOUT_LOCKED);
 | 
			
		||||
  return manager_evdev->priv->main_seat->layout_idx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -70,6 +70,31 @@ struct _ClutterInputDeviceEvdev
 | 
			
		||||
  cairo_matrix_t device_matrix;
 | 
			
		||||
  gdouble device_aspect_ratio; /* w:h */
 | 
			
		||||
  gdouble output_ratio;        /* w:h */
 | 
			
		||||
 | 
			
		||||
  GHashTable *touches;
 | 
			
		||||
 | 
			
		||||
  /* Keyboard a11y */
 | 
			
		||||
  ClutterKeyboardA11yFlags a11y_flags;
 | 
			
		||||
  GList *slow_keys_list;
 | 
			
		||||
  guint debounce_timer;
 | 
			
		||||
  guint16 debounce_key;
 | 
			
		||||
  xkb_mod_mask_t stickykeys_depressed_mask;
 | 
			
		||||
  xkb_mod_mask_t stickykeys_latched_mask;
 | 
			
		||||
  xkb_mod_mask_t stickykeys_locked_mask;
 | 
			
		||||
  guint toggle_slowkeys_timer;
 | 
			
		||||
  guint16 shift_count;
 | 
			
		||||
  guint32 last_shift_time;
 | 
			
		||||
  gint mousekeys_btn;
 | 
			
		||||
  gboolean mousekeys_btn_states[3];
 | 
			
		||||
  guint32 mousekeys_first_motion_time; /* ms */
 | 
			
		||||
  guint32 mousekeys_last_motion_time; /* ms */
 | 
			
		||||
  guint mousekeys_init_delay;
 | 
			
		||||
  guint mousekeys_accel_time;
 | 
			
		||||
  guint mousekeys_max_speed;
 | 
			
		||||
  gdouble mousekeys_curve_factor;
 | 
			
		||||
  guint move_mousekeys_timer;
 | 
			
		||||
  guint16 last_mousekeys_key;
 | 
			
		||||
  ClutterVirtualInputDevice *mousekeys_virtual_device;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
GType                     _clutter_input_device_evdev_get_type        (void) G_GNUC_CONST;
 | 
			
		||||
@@ -111,6 +136,22 @@ void                      clutter_input_device_evdev_translate_coordinates (Clut
 | 
			
		||||
                                                                            gfloat             *x,
 | 
			
		||||
                                                                            gfloat             *y);
 | 
			
		||||
 | 
			
		||||
void                      clutter_input_device_evdev_apply_kbd_a11y_settings (ClutterInputDeviceEvdev *device,
 | 
			
		||||
                                                                              ClutterKbdA11ySettings  *settings);
 | 
			
		||||
 | 
			
		||||
ClutterTouchState *       clutter_input_device_evdev_acquire_touch_state (ClutterInputDeviceEvdev *device,
 | 
			
		||||
                                                                          int                      device_slot);
 | 
			
		||||
 | 
			
		||||
ClutterTouchState *       clutter_input_device_evdev_lookup_touch_state (ClutterInputDeviceEvdev *device,
 | 
			
		||||
                                                                         int                      device_slot);
 | 
			
		||||
 | 
			
		||||
void                      clutter_input_device_evdev_release_touch_state (ClutterInputDeviceEvdev *device,
 | 
			
		||||
                                                                          ClutterTouchState       *touch_state);
 | 
			
		||||
 | 
			
		||||
void                      clutter_input_device_evdev_release_touch_slots (ClutterInputDeviceEvdev *device_evdev,
 | 
			
		||||
                                                                          uint64_t                 time_us);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
#endif /* __CLUTTER_INPUT_DEVICE_EVDEV_H__ */
 | 
			
		||||
 
 | 
			
		||||
@@ -29,6 +29,7 @@
 | 
			
		||||
#include "clutter-seat-evdev.h"
 | 
			
		||||
 | 
			
		||||
#include <linux/input.h>
 | 
			
		||||
#include <math.h>
 | 
			
		||||
 | 
			
		||||
#include "clutter-event-private.h"
 | 
			
		||||
#include "clutter-input-device-evdev.h"
 | 
			
		||||
@@ -42,6 +43,12 @@
 | 
			
		||||
 | 
			
		||||
#define AUTOREPEAT_VALUE 2
 | 
			
		||||
 | 
			
		||||
#define DISCRETE_SCROLL_STEP 10.0
 | 
			
		||||
 | 
			
		||||
#ifndef BTN_STYLUS3
 | 
			
		||||
#define BTN_STYLUS3 0x149 /* Linux 4.15 */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_seat_evdev_set_libinput_seat (ClutterSeatEvdev     *seat,
 | 
			
		||||
                                      struct libinput_seat *libinput_seat)
 | 
			
		||||
@@ -85,32 +92,57 @@ clutter_touch_state_free (ClutterTouchState *touch_state)
 | 
			
		||||
  g_slice_free (ClutterTouchState, touch_state);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ClutterTouchState *
 | 
			
		||||
clutter_seat_evdev_add_touch (ClutterSeatEvdev *seat,
 | 
			
		||||
                              guint32           id)
 | 
			
		||||
static void
 | 
			
		||||
ensure_seat_slot_allocated (ClutterSeatEvdev *seat,
 | 
			
		||||
                            int               seat_slot)
 | 
			
		||||
{
 | 
			
		||||
  ClutterTouchState *touch;
 | 
			
		||||
  if (seat_slot >= seat->n_alloc_touch_states)
 | 
			
		||||
    {
 | 
			
		||||
      const int size_increase = 5;
 | 
			
		||||
      int i;
 | 
			
		||||
 | 
			
		||||
  touch = g_slice_new0 (ClutterTouchState);
 | 
			
		||||
  touch->id = id;
 | 
			
		||||
      seat->n_alloc_touch_states += size_increase;
 | 
			
		||||
      seat->touch_states = g_realloc_n (seat->touch_states,
 | 
			
		||||
                                        seat->n_alloc_touch_states,
 | 
			
		||||
                                        sizeof (ClutterTouchState *));
 | 
			
		||||
      for (i = 0; i < size_increase; i++)
 | 
			
		||||
        seat->touch_states[seat->n_alloc_touch_states - (i + 1)] = NULL;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
  g_hash_table_insert (seat->touches, GUINT_TO_POINTER (id), touch);
 | 
			
		||||
ClutterTouchState *
 | 
			
		||||
clutter_seat_evdev_acquire_touch_state (ClutterSeatEvdev *seat,
 | 
			
		||||
                                        int               device_slot)
 | 
			
		||||
{
 | 
			
		||||
  ClutterTouchState *touch_state;
 | 
			
		||||
  int seat_slot;
 | 
			
		||||
 | 
			
		||||
  return touch;
 | 
			
		||||
  for (seat_slot = 0; seat_slot < seat->n_alloc_touch_states; seat_slot++)
 | 
			
		||||
    {
 | 
			
		||||
      if (!seat->touch_states[seat_slot])
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  ensure_seat_slot_allocated (seat, seat_slot);
 | 
			
		||||
 | 
			
		||||
  touch_state = g_slice_new0 (ClutterTouchState);
 | 
			
		||||
  *touch_state = (ClutterTouchState) {
 | 
			
		||||
    .seat = seat,
 | 
			
		||||
    .seat_slot = seat_slot,
 | 
			
		||||
    .device_slot = device_slot,
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  seat->touch_states[seat_slot] = touch_state;
 | 
			
		||||
 | 
			
		||||
  return touch_state;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_seat_evdev_remove_touch (ClutterSeatEvdev *seat,
 | 
			
		||||
                                 guint32           id)
 | 
			
		||||
clutter_seat_evdev_release_touch_state (ClutterSeatEvdev  *seat,
 | 
			
		||||
                                        ClutterTouchState *touch_state)
 | 
			
		||||
{
 | 
			
		||||
  g_hash_table_remove (seat->touches, GUINT_TO_POINTER (id));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ClutterTouchState *
 | 
			
		||||
clutter_seat_evdev_get_touch (ClutterSeatEvdev *seat,
 | 
			
		||||
                              guint32           id)
 | 
			
		||||
{
 | 
			
		||||
  return g_hash_table_lookup (seat->touches, GUINT_TO_POINTER (id));
 | 
			
		||||
  g_clear_pointer (&seat->touch_states[touch_state->seat_slot],
 | 
			
		||||
                   (GDestroyNotify) clutter_touch_state_free);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ClutterSeatEvdev *
 | 
			
		||||
@@ -147,9 +179,6 @@ clutter_seat_evdev_new (ClutterDeviceManagerEvdev *manager_evdev)
 | 
			
		||||
  _clutter_device_manager_add_device (manager, device);
 | 
			
		||||
  seat->core_keyboard = device;
 | 
			
		||||
 | 
			
		||||
  seat->touches = g_hash_table_new_full (NULL, NULL, NULL,
 | 
			
		||||
                                         (GDestroyNotify) clutter_touch_state_free);
 | 
			
		||||
 | 
			
		||||
  seat->repeat = TRUE;
 | 
			
		||||
  seat->repeat_delay = 250;     /* ms */
 | 
			
		||||
  seat->repeat_interval = 33;   /* ms */
 | 
			
		||||
@@ -356,7 +385,6 @@ new_absolute_motion_event (ClutterSeatEvdev   *seat,
 | 
			
		||||
  _clutter_evdev_event_set_time_usec (event, time_us);
 | 
			
		||||
  event->motion.time = us2ms (time_us);
 | 
			
		||||
  event->motion.stage = stage;
 | 
			
		||||
  event->motion.device = seat->core_pointer;
 | 
			
		||||
  _clutter_xkb_translate_state (event, seat->xkb, seat->button_state);
 | 
			
		||||
  event->motion.x = x;
 | 
			
		||||
  event->motion.y = y;
 | 
			
		||||
@@ -489,6 +517,10 @@ clutter_seat_evdev_notify_button (ClutterSeatEvdev   *seat,
 | 
			
		||||
      button_nr = CLUTTER_BUTTON_MIDDLE;
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case 0x149: /* BTN_STYLUS3 */
 | 
			
		||||
      button_nr = 8;
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    default:
 | 
			
		||||
      /* For compatibility reasons, all additional buttons go after the old 4-7 scroll ones */
 | 
			
		||||
      if (clutter_input_device_get_device_type (input_device) == CLUTTER_TABLET_DEVICE)
 | 
			
		||||
@@ -569,6 +601,235 @@ clutter_seat_evdev_notify_button (ClutterSeatEvdev   *seat,
 | 
			
		||||
  queue_event (event);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
notify_scroll (ClutterInputDevice       *input_device,
 | 
			
		||||
               guint64                   time_us,
 | 
			
		||||
               gdouble                   dx,
 | 
			
		||||
               gdouble                   dy,
 | 
			
		||||
               ClutterScrollSource       scroll_source,
 | 
			
		||||
               ClutterScrollFinishFlags  flags,
 | 
			
		||||
               gboolean                  emulated)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputDeviceEvdev *device_evdev;
 | 
			
		||||
  ClutterSeatEvdev *seat;
 | 
			
		||||
  ClutterStage *stage;
 | 
			
		||||
  ClutterEvent *event = NULL;
 | 
			
		||||
  gdouble scroll_factor;
 | 
			
		||||
 | 
			
		||||
  /* We can drop the event on the floor if no stage has been
 | 
			
		||||
   * associated with the device yet. */
 | 
			
		||||
  stage = _clutter_input_device_get_stage (input_device);
 | 
			
		||||
  if (stage == NULL)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  device_evdev = CLUTTER_INPUT_DEVICE_EVDEV (input_device);
 | 
			
		||||
  seat = _clutter_input_device_evdev_get_seat (device_evdev);
 | 
			
		||||
 | 
			
		||||
  event = clutter_event_new (CLUTTER_SCROLL);
 | 
			
		||||
 | 
			
		||||
  _clutter_evdev_event_set_time_usec (event, time_us);
 | 
			
		||||
  event->scroll.time = us2ms (time_us);
 | 
			
		||||
  event->scroll.stage = CLUTTER_STAGE (stage);
 | 
			
		||||
  _clutter_xkb_translate_state (event, seat->xkb, seat->button_state);
 | 
			
		||||
 | 
			
		||||
  /* libinput pointer axis events are in pointer motion coordinate space.
 | 
			
		||||
   * To convert to Xi2 discrete step coordinate space, multiply the factor
 | 
			
		||||
   * 1/10. */
 | 
			
		||||
  event->scroll.direction = CLUTTER_SCROLL_SMOOTH;
 | 
			
		||||
  scroll_factor = 1.0 / DISCRETE_SCROLL_STEP;
 | 
			
		||||
  clutter_event_set_scroll_delta (event,
 | 
			
		||||
                                  scroll_factor * dx,
 | 
			
		||||
                                  scroll_factor * dy);
 | 
			
		||||
 | 
			
		||||
  event->scroll.x = seat->pointer_x;
 | 
			
		||||
  event->scroll.y = seat->pointer_y;
 | 
			
		||||
  clutter_event_set_device (event, seat->core_pointer);
 | 
			
		||||
  clutter_event_set_source_device (event, input_device);
 | 
			
		||||
  event->scroll.scroll_source = scroll_source;
 | 
			
		||||
  event->scroll.finish_flags = flags;
 | 
			
		||||
 | 
			
		||||
  _clutter_event_set_pointer_emulated (event, emulated);
 | 
			
		||||
 | 
			
		||||
  queue_event (event);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
notify_discrete_scroll (ClutterInputDevice     *input_device,
 | 
			
		||||
                        uint64_t                time_us,
 | 
			
		||||
                        ClutterScrollDirection  direction,
 | 
			
		||||
                        ClutterScrollSource     scroll_source,
 | 
			
		||||
                        gboolean                emulated)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputDeviceEvdev *device_evdev;
 | 
			
		||||
  ClutterSeatEvdev *seat;
 | 
			
		||||
  ClutterStage *stage;
 | 
			
		||||
  ClutterEvent *event = NULL;
 | 
			
		||||
 | 
			
		||||
  if (direction == CLUTTER_SCROLL_SMOOTH)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  /* We can drop the event on the floor if no stage has been
 | 
			
		||||
   * associated with the device yet. */
 | 
			
		||||
  stage = _clutter_input_device_get_stage (input_device);
 | 
			
		||||
  if (stage == NULL)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  device_evdev = CLUTTER_INPUT_DEVICE_EVDEV (input_device);
 | 
			
		||||
  seat = _clutter_input_device_evdev_get_seat (device_evdev);
 | 
			
		||||
 | 
			
		||||
  event = clutter_event_new (CLUTTER_SCROLL);
 | 
			
		||||
 | 
			
		||||
  _clutter_evdev_event_set_time_usec (event, time_us);
 | 
			
		||||
  event->scroll.time = us2ms (time_us);
 | 
			
		||||
  event->scroll.stage = CLUTTER_STAGE (stage);
 | 
			
		||||
  _clutter_xkb_translate_state (event, seat->xkb, seat->button_state);
 | 
			
		||||
 | 
			
		||||
  event->scroll.direction = direction;
 | 
			
		||||
 | 
			
		||||
  event->scroll.x = seat->pointer_x;
 | 
			
		||||
  event->scroll.y = seat->pointer_y;
 | 
			
		||||
  clutter_event_set_device (event, seat->core_pointer);
 | 
			
		||||
  clutter_event_set_source_device (event, input_device);
 | 
			
		||||
  event->scroll.scroll_source = scroll_source;
 | 
			
		||||
 | 
			
		||||
  _clutter_event_set_pointer_emulated (event, emulated);
 | 
			
		||||
 | 
			
		||||
  queue_event (event);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
check_notify_discrete_scroll (ClutterSeatEvdev   *seat,
 | 
			
		||||
                              ClutterInputDevice *device,
 | 
			
		||||
                              uint64_t            time_us,
 | 
			
		||||
                              ClutterScrollSource scroll_source)
 | 
			
		||||
{
 | 
			
		||||
  int i, n_xscrolls, n_yscrolls;
 | 
			
		||||
 | 
			
		||||
  n_xscrolls = floor (fabs (seat->accum_scroll_dx) / DISCRETE_SCROLL_STEP);
 | 
			
		||||
  n_yscrolls = floor (fabs (seat->accum_scroll_dy) / DISCRETE_SCROLL_STEP);
 | 
			
		||||
 | 
			
		||||
  for (i = 0; i < n_xscrolls; i++)
 | 
			
		||||
    {
 | 
			
		||||
      notify_discrete_scroll (device, time_us,
 | 
			
		||||
                              seat->accum_scroll_dx > 0 ?
 | 
			
		||||
                              CLUTTER_SCROLL_RIGHT : CLUTTER_SCROLL_LEFT,
 | 
			
		||||
                              scroll_source, TRUE);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  for (i = 0; i < n_yscrolls; i++)
 | 
			
		||||
    {
 | 
			
		||||
      notify_discrete_scroll (device, time_us,
 | 
			
		||||
                              seat->accum_scroll_dy > 0 ?
 | 
			
		||||
                              CLUTTER_SCROLL_DOWN : CLUTTER_SCROLL_UP,
 | 
			
		||||
                              scroll_source, TRUE);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  seat->accum_scroll_dx = fmodf (seat->accum_scroll_dx, DISCRETE_SCROLL_STEP);
 | 
			
		||||
  seat->accum_scroll_dy = fmodf (seat->accum_scroll_dy, DISCRETE_SCROLL_STEP);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_seat_evdev_notify_scroll_continuous (ClutterSeatEvdev         *seat,
 | 
			
		||||
                                             ClutterInputDevice       *input_device,
 | 
			
		||||
                                             uint64_t                  time_us,
 | 
			
		||||
                                             double                    dx,
 | 
			
		||||
                                             double                    dy,
 | 
			
		||||
                                             ClutterScrollSource       scroll_source,
 | 
			
		||||
                                             ClutterScrollFinishFlags  finish_flags)
 | 
			
		||||
{
 | 
			
		||||
  if (finish_flags & CLUTTER_SCROLL_FINISHED_HORIZONTAL)
 | 
			
		||||
    seat->accum_scroll_dx = 0;
 | 
			
		||||
  else
 | 
			
		||||
    seat->accum_scroll_dx += dx;
 | 
			
		||||
 | 
			
		||||
  if (finish_flags & CLUTTER_SCROLL_FINISHED_VERTICAL)
 | 
			
		||||
    seat->accum_scroll_dy = 0;
 | 
			
		||||
  else
 | 
			
		||||
    seat->accum_scroll_dy += dy;
 | 
			
		||||
 | 
			
		||||
  notify_scroll (input_device, time_us, dx, dy, scroll_source,
 | 
			
		||||
                 finish_flags, FALSE);
 | 
			
		||||
  check_notify_discrete_scroll (seat, input_device, time_us, scroll_source);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static ClutterScrollDirection
 | 
			
		||||
discrete_to_direction (double discrete_dx,
 | 
			
		||||
                       double discrete_dy)
 | 
			
		||||
{
 | 
			
		||||
  if (discrete_dx > 0)
 | 
			
		||||
    return CLUTTER_SCROLL_RIGHT;
 | 
			
		||||
  else if (discrete_dx < 0)
 | 
			
		||||
    return CLUTTER_SCROLL_LEFT;
 | 
			
		||||
  else if (discrete_dy > 0)
 | 
			
		||||
    return CLUTTER_SCROLL_DOWN;
 | 
			
		||||
  else if (discrete_dy < 0)
 | 
			
		||||
    return CLUTTER_SCROLL_UP;
 | 
			
		||||
  else
 | 
			
		||||
    g_assert_not_reached ();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_seat_evdev_notify_discrete_scroll (ClutterSeatEvdev    *seat,
 | 
			
		||||
                                           ClutterInputDevice  *input_device,
 | 
			
		||||
                                           uint64_t             time_us,
 | 
			
		||||
                                           double               discrete_dx,
 | 
			
		||||
                                           double               discrete_dy,
 | 
			
		||||
                                           ClutterScrollSource  scroll_source)
 | 
			
		||||
{
 | 
			
		||||
  notify_scroll (input_device, time_us,
 | 
			
		||||
                 discrete_dx * DISCRETE_SCROLL_STEP,
 | 
			
		||||
                 discrete_dy * DISCRETE_SCROLL_STEP,
 | 
			
		||||
                 scroll_source, CLUTTER_SCROLL_FINISHED_NONE,
 | 
			
		||||
                 TRUE);
 | 
			
		||||
  notify_discrete_scroll (input_device, time_us,
 | 
			
		||||
                          discrete_to_direction (discrete_dx, discrete_dy),
 | 
			
		||||
                          scroll_source, FALSE);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_seat_evdev_notify_touch_event (ClutterSeatEvdev   *seat,
 | 
			
		||||
                                       ClutterInputDevice *input_device,
 | 
			
		||||
                                       ClutterEventType    evtype,
 | 
			
		||||
                                       uint64_t            time_us,
 | 
			
		||||
                                       int                 slot,
 | 
			
		||||
                                       double              x,
 | 
			
		||||
                                       double              y)
 | 
			
		||||
{
 | 
			
		||||
  ClutterStage *stage;
 | 
			
		||||
  ClutterEvent *event = NULL;
 | 
			
		||||
 | 
			
		||||
  /* We can drop the event on the floor if no stage has been
 | 
			
		||||
   * associated with the device yet. */
 | 
			
		||||
  stage = _clutter_input_device_get_stage (input_device);
 | 
			
		||||
  if (stage == NULL)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  event = clutter_event_new (evtype);
 | 
			
		||||
 | 
			
		||||
  _clutter_evdev_event_set_time_usec (event, time_us);
 | 
			
		||||
  event->touch.time = us2ms (time_us);
 | 
			
		||||
  event->touch.stage = CLUTTER_STAGE (stage);
 | 
			
		||||
  event->touch.x = x;
 | 
			
		||||
  event->touch.y = y;
 | 
			
		||||
  clutter_input_device_evdev_translate_coordinates (input_device, stage,
 | 
			
		||||
                                                    &event->touch.x,
 | 
			
		||||
                                                    &event->touch.y);
 | 
			
		||||
 | 
			
		||||
  /* "NULL" sequences are special cased in clutter */
 | 
			
		||||
  event->touch.sequence = GINT_TO_POINTER (MAX (1, slot + 1));
 | 
			
		||||
  _clutter_xkb_translate_state (event, seat->xkb, seat->button_state);
 | 
			
		||||
 | 
			
		||||
  if (evtype == CLUTTER_TOUCH_BEGIN ||
 | 
			
		||||
      evtype == CLUTTER_TOUCH_UPDATE)
 | 
			
		||||
    event->touch.modifier_state |= CLUTTER_BUTTON1_MASK;
 | 
			
		||||
 | 
			
		||||
  clutter_event_set_device (event, seat->core_pointer);
 | 
			
		||||
  clutter_event_set_source_device (event, input_device);
 | 
			
		||||
 | 
			
		||||
  queue_event (event);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_seat_evdev_free (ClutterSeatEvdev *seat)
 | 
			
		||||
{
 | 
			
		||||
@@ -581,7 +842,7 @@ clutter_seat_evdev_free (ClutterSeatEvdev *seat)
 | 
			
		||||
      g_object_unref (device);
 | 
			
		||||
    }
 | 
			
		||||
  g_slist_free (seat->devices);
 | 
			
		||||
  g_hash_table_unref (seat->touches);
 | 
			
		||||
  g_free (seat->touch_states);
 | 
			
		||||
 | 
			
		||||
  xkb_state_unref (seat->xkb);
 | 
			
		||||
 | 
			
		||||
@@ -593,6 +854,24 @@ clutter_seat_evdev_free (ClutterSeatEvdev *seat)
 | 
			
		||||
  g_free (seat);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ClutterInputDevice *
 | 
			
		||||
clutter_seat_evdev_get_device (ClutterSeatEvdev *seat,
 | 
			
		||||
                               gint              id)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputDevice *device;
 | 
			
		||||
  GSList *l;
 | 
			
		||||
 | 
			
		||||
  for (l = seat->devices; l; l = l->next)
 | 
			
		||||
    {
 | 
			
		||||
      device = l->data;
 | 
			
		||||
 | 
			
		||||
      if (clutter_input_device_get_device_id (device) == id)
 | 
			
		||||
        return device;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_seat_evdev_set_stage (ClutterSeatEvdev *seat,
 | 
			
		||||
                              ClutterStage     *stage)
 | 
			
		||||
 
 | 
			
		||||
@@ -38,7 +38,10 @@ typedef struct _ClutterTouchState ClutterTouchState;
 | 
			
		||||
 | 
			
		||||
struct _ClutterTouchState
 | 
			
		||||
{
 | 
			
		||||
  guint32 id;
 | 
			
		||||
  ClutterSeatEvdev *seat;
 | 
			
		||||
 | 
			
		||||
  int device_slot;
 | 
			
		||||
  int seat_slot;
 | 
			
		||||
  ClutterPoint coords;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -52,12 +55,14 @@ struct _ClutterSeatEvdev
 | 
			
		||||
  ClutterInputDevice *core_pointer;
 | 
			
		||||
  ClutterInputDevice *core_keyboard;
 | 
			
		||||
 | 
			
		||||
  GHashTable *touches;
 | 
			
		||||
  ClutterTouchState **touch_states;
 | 
			
		||||
  int n_alloc_touch_states;
 | 
			
		||||
 | 
			
		||||
  struct xkb_state *xkb;
 | 
			
		||||
  xkb_led_index_t caps_lock_led;
 | 
			
		||||
  xkb_led_index_t num_lock_led;
 | 
			
		||||
  xkb_led_index_t scroll_lock_led;
 | 
			
		||||
  xkb_layout_index_t layout_idx;
 | 
			
		||||
  uint32_t button_state;
 | 
			
		||||
  int button_count[KEY_CNT];
 | 
			
		||||
 | 
			
		||||
@@ -106,16 +111,42 @@ void clutter_seat_evdev_notify_button (ClutterSeatEvdev   *seat,
 | 
			
		||||
                                       uint32_t            button,
 | 
			
		||||
                                       uint32_t            state);
 | 
			
		||||
 | 
			
		||||
void clutter_seat_evdev_notify_scroll_continuous (ClutterSeatEvdev         *seat,
 | 
			
		||||
                                                  ClutterInputDevice       *input_device,
 | 
			
		||||
                                                  uint64_t                  time_us,
 | 
			
		||||
                                                  double                    dx,
 | 
			
		||||
                                                  double                    dy,
 | 
			
		||||
                                                  ClutterScrollSource       source,
 | 
			
		||||
                                                  ClutterScrollFinishFlags  flags);
 | 
			
		||||
 | 
			
		||||
void clutter_seat_evdev_notify_discrete_scroll (ClutterSeatEvdev    *seat,
 | 
			
		||||
                                                ClutterInputDevice  *input_device,
 | 
			
		||||
                                                uint64_t             time_us,
 | 
			
		||||
                                                double               discrete_dx,
 | 
			
		||||
                                                double               discrete_dy,
 | 
			
		||||
                                                ClutterScrollSource  source);
 | 
			
		||||
 | 
			
		||||
void clutter_seat_evdev_notify_touch_event (ClutterSeatEvdev   *seat,
 | 
			
		||||
                                            ClutterInputDevice *input_device,
 | 
			
		||||
                                            ClutterEventType    evtype,
 | 
			
		||||
                                            uint64_t            time_us,
 | 
			
		||||
                                            int                 slot,
 | 
			
		||||
                                            double              x,
 | 
			
		||||
                                            double              y);
 | 
			
		||||
 | 
			
		||||
void clutter_seat_evdev_set_libinput_seat (ClutterSeatEvdev     *seat,
 | 
			
		||||
                                           struct libinput_seat *libinput_seat);
 | 
			
		||||
 | 
			
		||||
void clutter_seat_evdev_sync_leds (ClutterSeatEvdev *seat);
 | 
			
		||||
 | 
			
		||||
ClutterTouchState * clutter_seat_evdev_add_touch (ClutterSeatEvdev *seat,
 | 
			
		||||
                                                  guint32           id);
 | 
			
		||||
ClutterInputDevice * clutter_seat_evdev_get_device (ClutterSeatEvdev *seat,
 | 
			
		||||
                                                    gint              id);
 | 
			
		||||
 | 
			
		||||
void clutter_seat_evdev_remove_touch (ClutterSeatEvdev *seat,
 | 
			
		||||
                                      guint32           id);
 | 
			
		||||
ClutterTouchState * clutter_seat_evdev_acquire_touch_state (ClutterSeatEvdev *seat,
 | 
			
		||||
                                                            int               device_slot);
 | 
			
		||||
 | 
			
		||||
void clutter_seat_evdev_release_touch_state (ClutterSeatEvdev  *seat,
 | 
			
		||||
                                             ClutterTouchState *touch_state);
 | 
			
		||||
 | 
			
		||||
ClutterTouchState * clutter_seat_evdev_get_touch (ClutterSeatEvdev *seat,
 | 
			
		||||
                                                  guint32           id);
 | 
			
		||||
 
 | 
			
		||||
@@ -156,6 +156,9 @@ clutter_virtual_input_device_evdev_notify_relative_motion (ClutterVirtualInputDe
 | 
			
		||||
  ClutterVirtualInputDeviceEvdev *virtual_evdev =
 | 
			
		||||
    CLUTTER_VIRTUAL_INPUT_DEVICE_EVDEV (virtual_device);
 | 
			
		||||
 | 
			
		||||
  if (time_us == CLUTTER_CURRENT_TIME)
 | 
			
		||||
    time_us = g_get_monotonic_time ();
 | 
			
		||||
 | 
			
		||||
  clutter_seat_evdev_notify_relative_motion (virtual_evdev->seat,
 | 
			
		||||
                                             virtual_evdev->device,
 | 
			
		||||
                                             time_us,
 | 
			
		||||
@@ -172,6 +175,9 @@ clutter_virtual_input_device_evdev_notify_absolute_motion (ClutterVirtualInputDe
 | 
			
		||||
  ClutterVirtualInputDeviceEvdev *virtual_evdev =
 | 
			
		||||
    CLUTTER_VIRTUAL_INPUT_DEVICE_EVDEV (virtual_device);
 | 
			
		||||
 | 
			
		||||
  if (time_us == CLUTTER_CURRENT_TIME)
 | 
			
		||||
    time_us = g_get_monotonic_time ();
 | 
			
		||||
 | 
			
		||||
  clutter_seat_evdev_notify_absolute_motion (virtual_evdev->seat,
 | 
			
		||||
                                             virtual_evdev->device,
 | 
			
		||||
                                             time_us,
 | 
			
		||||
@@ -179,6 +185,22 @@ clutter_virtual_input_device_evdev_notify_absolute_motion (ClutterVirtualInputDe
 | 
			
		||||
                                             NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
translate_to_evdev_button (int button)
 | 
			
		||||
{
 | 
			
		||||
  switch (button)
 | 
			
		||||
    {
 | 
			
		||||
    case CLUTTER_BUTTON_PRIMARY:
 | 
			
		||||
      return BTN_LEFT;
 | 
			
		||||
    case CLUTTER_BUTTON_SECONDARY:
 | 
			
		||||
      return BTN_RIGHT;
 | 
			
		||||
    case CLUTTER_BUTTON_MIDDLE:
 | 
			
		||||
      return BTN_MIDDLE;
 | 
			
		||||
    default:
 | 
			
		||||
      return button + (BTN_LEFT - 1) - 4;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_virtual_input_device_evdev_notify_button (ClutterVirtualInputDevice *virtual_device,
 | 
			
		||||
                                                  uint64_t                   time_us,
 | 
			
		||||
@@ -188,27 +210,33 @@ clutter_virtual_input_device_evdev_notify_button (ClutterVirtualInputDevice *vir
 | 
			
		||||
  ClutterVirtualInputDeviceEvdev *virtual_evdev =
 | 
			
		||||
    CLUTTER_VIRTUAL_INPUT_DEVICE_EVDEV (virtual_device);
 | 
			
		||||
  int button_count;
 | 
			
		||||
  int evdev_button;
 | 
			
		||||
 | 
			
		||||
  if (get_button_type (button) != EVDEV_BUTTON_TYPE_BUTTON)
 | 
			
		||||
  if (time_us == CLUTTER_CURRENT_TIME)
 | 
			
		||||
    time_us = g_get_monotonic_time ();
 | 
			
		||||
 | 
			
		||||
  evdev_button = translate_to_evdev_button (button);
 | 
			
		||||
 | 
			
		||||
  if (get_button_type (evdev_button) != EVDEV_BUTTON_TYPE_BUTTON)
 | 
			
		||||
    {
 | 
			
		||||
      g_warning ("Unknown/invalid virtual device button 0x%x pressed",
 | 
			
		||||
                 button);
 | 
			
		||||
                 evdev_button);
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  button_count = update_button_count (virtual_evdev, button, button_state);
 | 
			
		||||
  button_count = update_button_count (virtual_evdev, evdev_button, button_state);
 | 
			
		||||
  if (button_count < 0 || button_count > 1)
 | 
			
		||||
    {
 | 
			
		||||
      g_warning ("Received multiple virtual 0x%x button %s (ignoring)", button,
 | 
			
		||||
      g_warning ("Received multiple virtual 0x%x button %s (ignoring)", evdev_button,
 | 
			
		||||
                 button_state == CLUTTER_BUTTON_STATE_PRESSED ? "presses" : "releases");
 | 
			
		||||
      update_button_count (virtual_evdev, button, 1 - button_state);
 | 
			
		||||
      update_button_count (virtual_evdev, evdev_button, 1 - button_state);
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  clutter_seat_evdev_notify_button (virtual_evdev->seat,
 | 
			
		||||
                                    virtual_evdev->device,
 | 
			
		||||
                                    time_us,
 | 
			
		||||
                                    button,
 | 
			
		||||
                                    evdev_button,
 | 
			
		||||
                                    button_state);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -222,6 +250,9 @@ clutter_virtual_input_device_evdev_notify_key (ClutterVirtualInputDevice *virtua
 | 
			
		||||
    CLUTTER_VIRTUAL_INPUT_DEVICE_EVDEV (virtual_device);
 | 
			
		||||
  int key_count;
 | 
			
		||||
 | 
			
		||||
  if (time_us == CLUTTER_CURRENT_TIME)
 | 
			
		||||
    time_us = g_get_monotonic_time ();
 | 
			
		||||
 | 
			
		||||
  if (get_button_type (key) != EVDEV_BUTTON_TYPE_KEY)
 | 
			
		||||
    {
 | 
			
		||||
      g_warning ("Unknown/invalid virtual device key 0x%x pressed\n", key);
 | 
			
		||||
@@ -343,6 +374,9 @@ clutter_virtual_input_device_evdev_notify_keyval (ClutterVirtualInputDevice *vir
 | 
			
		||||
  int key_count;
 | 
			
		||||
  guint keycode = 0, level = 0, evcode = 0;
 | 
			
		||||
 | 
			
		||||
  if (time_us == CLUTTER_CURRENT_TIME)
 | 
			
		||||
    time_us = g_get_monotonic_time ();
 | 
			
		||||
 | 
			
		||||
  if (!pick_keycode_for_keyval_in_current_group (virtual_device,
 | 
			
		||||
                                                 keyval, &keycode, &level))
 | 
			
		||||
    {
 | 
			
		||||
@@ -382,6 +416,175 @@ clutter_virtual_input_device_evdev_notify_keyval (ClutterVirtualInputDevice *vir
 | 
			
		||||
    apply_level_modifiers (virtual_device, time_us, level, key_state);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
direction_to_discrete (ClutterScrollDirection direction,
 | 
			
		||||
                       double                *discrete_dx,
 | 
			
		||||
                       double                *discrete_dy)
 | 
			
		||||
{
 | 
			
		||||
  switch (direction)
 | 
			
		||||
    {
 | 
			
		||||
    case CLUTTER_SCROLL_UP:
 | 
			
		||||
      *discrete_dx = 0.0;
 | 
			
		||||
      *discrete_dy = -1.0;
 | 
			
		||||
      break;
 | 
			
		||||
    case CLUTTER_SCROLL_DOWN:
 | 
			
		||||
      *discrete_dx = 0.0;
 | 
			
		||||
      *discrete_dy = 1.0;
 | 
			
		||||
      break;
 | 
			
		||||
    case CLUTTER_SCROLL_LEFT:
 | 
			
		||||
      *discrete_dx = -1.0;
 | 
			
		||||
      *discrete_dy = 0.0;
 | 
			
		||||
      break;
 | 
			
		||||
    case CLUTTER_SCROLL_RIGHT:
 | 
			
		||||
      *discrete_dx = 1.0;
 | 
			
		||||
      *discrete_dy = 0.0;
 | 
			
		||||
      break;
 | 
			
		||||
    case CLUTTER_SCROLL_SMOOTH:
 | 
			
		||||
      g_assert_not_reached ();
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_virtual_input_device_evdev_notify_discrete_scroll (ClutterVirtualInputDevice *virtual_device,
 | 
			
		||||
                                                           uint64_t                   time_us,
 | 
			
		||||
                                                           ClutterScrollDirection     direction,
 | 
			
		||||
                                                           ClutterScrollSource        scroll_source)
 | 
			
		||||
{
 | 
			
		||||
  ClutterVirtualInputDeviceEvdev *virtual_evdev =
 | 
			
		||||
    CLUTTER_VIRTUAL_INPUT_DEVICE_EVDEV (virtual_device);
 | 
			
		||||
  double discrete_dx = 0.0, discrete_dy = 0.0;
 | 
			
		||||
 | 
			
		||||
  if (time_us == CLUTTER_CURRENT_TIME)
 | 
			
		||||
    time_us = g_get_monotonic_time ();
 | 
			
		||||
 | 
			
		||||
  direction_to_discrete (direction, &discrete_dx, &discrete_dy);
 | 
			
		||||
 | 
			
		||||
  clutter_seat_evdev_notify_discrete_scroll (virtual_evdev->seat,
 | 
			
		||||
                                             virtual_evdev->device,
 | 
			
		||||
                                             time_us,
 | 
			
		||||
                                             discrete_dx, discrete_dy,
 | 
			
		||||
                                             scroll_source);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_virtual_input_device_evdev_notify_scroll_continuous (ClutterVirtualInputDevice *virtual_device,
 | 
			
		||||
                                                             uint64_t                   time_us,
 | 
			
		||||
                                                             double                     dx,
 | 
			
		||||
                                                             double                     dy,
 | 
			
		||||
                                                             ClutterScrollSource        scroll_source,
 | 
			
		||||
                                                             ClutterScrollFinishFlags   finish_flags)
 | 
			
		||||
{
 | 
			
		||||
  ClutterVirtualInputDeviceEvdev *virtual_evdev =
 | 
			
		||||
    CLUTTER_VIRTUAL_INPUT_DEVICE_EVDEV (virtual_device);
 | 
			
		||||
 | 
			
		||||
  if (time_us == CLUTTER_CURRENT_TIME)
 | 
			
		||||
    time_us = g_get_monotonic_time ();
 | 
			
		||||
 | 
			
		||||
  clutter_seat_evdev_notify_scroll_continuous (virtual_evdev->seat,
 | 
			
		||||
                                               virtual_evdev->device,
 | 
			
		||||
                                               time_us,
 | 
			
		||||
                                               dx, dy,
 | 
			
		||||
                                               scroll_source,
 | 
			
		||||
                                               CLUTTER_SCROLL_FINISHED_NONE);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_virtual_input_device_evdev_notify_touch_down (ClutterVirtualInputDevice *virtual_device,
 | 
			
		||||
                                                      uint64_t                   time_us,
 | 
			
		||||
                                                      int                        device_slot,
 | 
			
		||||
                                                      double                     x,
 | 
			
		||||
                                                      double                     y)
 | 
			
		||||
{
 | 
			
		||||
  ClutterVirtualInputDeviceEvdev *virtual_evdev =
 | 
			
		||||
    CLUTTER_VIRTUAL_INPUT_DEVICE_EVDEV (virtual_device);
 | 
			
		||||
  ClutterInputDeviceEvdev *device_evdev =
 | 
			
		||||
    CLUTTER_INPUT_DEVICE_EVDEV (virtual_evdev->device);
 | 
			
		||||
  ClutterTouchState *touch_state;
 | 
			
		||||
 | 
			
		||||
  if (time_us == CLUTTER_CURRENT_TIME)
 | 
			
		||||
    time_us = g_get_monotonic_time ();
 | 
			
		||||
 | 
			
		||||
  touch_state = clutter_input_device_evdev_acquire_touch_state (device_evdev,
 | 
			
		||||
                                                                device_slot);
 | 
			
		||||
  if (!touch_state)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  touch_state->coords.x = x;
 | 
			
		||||
  touch_state->coords.y = y;
 | 
			
		||||
 | 
			
		||||
  clutter_seat_evdev_notify_touch_event (virtual_evdev->seat,
 | 
			
		||||
                                         virtual_evdev->device,
 | 
			
		||||
                                         CLUTTER_TOUCH_BEGIN,
 | 
			
		||||
                                         time_us,
 | 
			
		||||
                                         touch_state->seat_slot,
 | 
			
		||||
                                         touch_state->coords.x,
 | 
			
		||||
                                         touch_state->coords.y);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_virtual_input_device_evdev_notify_touch_motion (ClutterVirtualInputDevice *virtual_device,
 | 
			
		||||
                                                        uint64_t                   time_us,
 | 
			
		||||
                                                        int                        device_slot,
 | 
			
		||||
                                                        double                     x,
 | 
			
		||||
                                                        double                     y)
 | 
			
		||||
{
 | 
			
		||||
  ClutterVirtualInputDeviceEvdev *virtual_evdev =
 | 
			
		||||
    CLUTTER_VIRTUAL_INPUT_DEVICE_EVDEV (virtual_device);
 | 
			
		||||
  ClutterInputDeviceEvdev *device_evdev =
 | 
			
		||||
    CLUTTER_INPUT_DEVICE_EVDEV (virtual_evdev->device);
 | 
			
		||||
  ClutterTouchState *touch_state;
 | 
			
		||||
 | 
			
		||||
  if (time_us == CLUTTER_CURRENT_TIME)
 | 
			
		||||
    time_us = g_get_monotonic_time ();
 | 
			
		||||
 | 
			
		||||
  touch_state = clutter_input_device_evdev_lookup_touch_state (device_evdev,
 | 
			
		||||
                                                               device_slot);
 | 
			
		||||
  if (!touch_state)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  touch_state->coords.x = x;
 | 
			
		||||
  touch_state->coords.y = y;
 | 
			
		||||
 | 
			
		||||
  clutter_seat_evdev_notify_touch_event (virtual_evdev->seat,
 | 
			
		||||
                                         virtual_evdev->device,
 | 
			
		||||
                                         CLUTTER_TOUCH_BEGIN,
 | 
			
		||||
                                         time_us,
 | 
			
		||||
                                         touch_state->seat_slot,
 | 
			
		||||
                                         touch_state->coords.x,
 | 
			
		||||
                                         touch_state->coords.y);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_virtual_input_device_evdev_notify_touch_up (ClutterVirtualInputDevice *virtual_device,
 | 
			
		||||
                                                    uint64_t                   time_us,
 | 
			
		||||
                                                    int                        device_slot)
 | 
			
		||||
{
 | 
			
		||||
  ClutterVirtualInputDeviceEvdev *virtual_evdev =
 | 
			
		||||
    CLUTTER_VIRTUAL_INPUT_DEVICE_EVDEV (virtual_device);
 | 
			
		||||
  ClutterInputDeviceEvdev *device_evdev =
 | 
			
		||||
    CLUTTER_INPUT_DEVICE_EVDEV (virtual_evdev->device);
 | 
			
		||||
  ClutterTouchState *touch_state;
 | 
			
		||||
 | 
			
		||||
  if (time_us == CLUTTER_CURRENT_TIME)
 | 
			
		||||
    time_us = g_get_monotonic_time ();
 | 
			
		||||
 | 
			
		||||
  touch_state = clutter_input_device_evdev_lookup_touch_state (device_evdev,
 | 
			
		||||
                                                               device_slot);
 | 
			
		||||
  if (!touch_state)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  clutter_seat_evdev_notify_touch_event (virtual_evdev->seat,
 | 
			
		||||
                                         virtual_evdev->device,
 | 
			
		||||
                                         CLUTTER_TOUCH_BEGIN,
 | 
			
		||||
                                         time_us,
 | 
			
		||||
                                         touch_state->seat_slot,
 | 
			
		||||
                                         touch_state->coords.x,
 | 
			
		||||
                                         touch_state->coords.y);
 | 
			
		||||
 | 
			
		||||
  clutter_input_device_evdev_release_touch_state (device_evdev, touch_state);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_virtual_input_device_evdev_get_property (GObject    *object,
 | 
			
		||||
                                                 guint       prop_id,
 | 
			
		||||
@@ -485,6 +688,11 @@ clutter_virtual_input_device_evdev_class_init (ClutterVirtualInputDeviceEvdevCla
 | 
			
		||||
  virtual_input_device_class->notify_button = clutter_virtual_input_device_evdev_notify_button;
 | 
			
		||||
  virtual_input_device_class->notify_key = clutter_virtual_input_device_evdev_notify_key;
 | 
			
		||||
  virtual_input_device_class->notify_keyval = clutter_virtual_input_device_evdev_notify_keyval;
 | 
			
		||||
  virtual_input_device_class->notify_discrete_scroll = clutter_virtual_input_device_evdev_notify_discrete_scroll;
 | 
			
		||||
  virtual_input_device_class->notify_scroll_continuous = clutter_virtual_input_device_evdev_notify_scroll_continuous;
 | 
			
		||||
  virtual_input_device_class->notify_touch_down = clutter_virtual_input_device_evdev_notify_touch_down;
 | 
			
		||||
  virtual_input_device_class->notify_touch_motion = clutter_virtual_input_device_evdev_notify_touch_motion;
 | 
			
		||||
  virtual_input_device_class->notify_touch_up = clutter_virtual_input_device_evdev_notify_touch_up;
 | 
			
		||||
 | 
			
		||||
  obj_props[PROP_SEAT] = g_param_spec_pointer ("seat",
 | 
			
		||||
                                               P_("ClutterSeatEvdev"),
 | 
			
		||||
 
 | 
			
		||||
@@ -76,12 +76,12 @@ _clutter_key_event_new_from_evdev (ClutterInputDevice *device,
 | 
			
		||||
  else
 | 
			
		||||
    sym = XKB_KEY_NoSymbol;
 | 
			
		||||
 | 
			
		||||
  event->key.device = core_device;
 | 
			
		||||
  event->key.stage = stage;
 | 
			
		||||
  event->key.time = _time;
 | 
			
		||||
  _clutter_xkb_translate_state (event, xkb_state, button_state);
 | 
			
		||||
  event->key.hardware_keycode = key;
 | 
			
		||||
  event->key.keyval = sym;
 | 
			
		||||
  clutter_event_set_device (event, core_device);
 | 
			
		||||
  clutter_event_set_source_device (event, device);
 | 
			
		||||
 | 
			
		||||
  n = xkb_keysym_to_utf8 (sym, buffer, sizeof (buffer));
 | 
			
		||||
 
 | 
			
		||||
@@ -109,7 +109,6 @@ static const gchar *atom_names[] = {
 | 
			
		||||
#define N_ATOM_NAMES G_N_ELEMENTS (atom_names)
 | 
			
		||||
 | 
			
		||||
/* various flags corresponding to pre init setup calls */
 | 
			
		||||
static gboolean _want_reset_on_video_memory_purge = FALSE;
 | 
			
		||||
static gboolean _no_xevent_retrieval = FALSE;
 | 
			
		||||
static gboolean clutter_enable_xinput = TRUE;
 | 
			
		||||
static gboolean clutter_enable_argb = FALSE;
 | 
			
		||||
@@ -682,8 +681,7 @@ clutter_backend_x11_get_renderer (ClutterBackend  *backend,
 | 
			
		||||
 | 
			
		||||
  /* set the display object we're using */
 | 
			
		||||
  cogl_xlib_renderer_set_foreign_display (renderer, xdisplay);
 | 
			
		||||
  cogl_xlib_renderer_request_reset_on_video_memory_purge (renderer,
 | 
			
		||||
                                                          _want_reset_on_video_memory_purge);
 | 
			
		||||
 | 
			
		||||
  return renderer;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -1028,30 +1026,6 @@ clutter_x11_has_event_retrieval (void)
 | 
			
		||||
  return !_no_xevent_retrieval;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_x11_request_reset_on_video_memory_purge:
 | 
			
		||||
 *
 | 
			
		||||
 * If the GL driver supports the NV_robustness_video_memory_purge
 | 
			
		||||
 * extension, this call lets applications request that it gets
 | 
			
		||||
 * initialized, thus allowing cogl_get_graphics_reset_status() to
 | 
			
		||||
 * report memory purged errors if they happen. Checking for the
 | 
			
		||||
 * graphics reset status is the application's responsibility.
 | 
			
		||||
 *
 | 
			
		||||
 * This function can only be called before calling clutter_init().
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
clutter_x11_request_reset_on_video_memory_purge (void)
 | 
			
		||||
{
 | 
			
		||||
  if (_clutter_context_is_initialized ())
 | 
			
		||||
    {
 | 
			
		||||
      g_warning ("%s() can only be used before calling clutter_init()",
 | 
			
		||||
                 G_STRFUNC);
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  _want_reset_on_video_memory_purge = TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_x11_get_default_screen:
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -37,6 +37,7 @@
 | 
			
		||||
#include "clutter-event-translator.h"
 | 
			
		||||
#include "clutter-stage-private.h"
 | 
			
		||||
#include "clutter-private.h"
 | 
			
		||||
#include "clutter-xkb-a11y-x11.h"
 | 
			
		||||
 | 
			
		||||
enum
 | 
			
		||||
{
 | 
			
		||||
@@ -352,9 +353,11 @@ static void
 | 
			
		||||
clutter_device_manager_x11_constructed (GObject *gobject)
 | 
			
		||||
{
 | 
			
		||||
  ClutterDeviceManagerX11 *manager_x11;
 | 
			
		||||
  ClutterDeviceManager *manager;
 | 
			
		||||
  ClutterBackendX11 *backend_x11;
 | 
			
		||||
 | 
			
		||||
  manager_x11 = CLUTTER_DEVICE_MANAGER_X11 (gobject);
 | 
			
		||||
  manager = CLUTTER_DEVICE_MANAGER (gobject);
 | 
			
		||||
 | 
			
		||||
  g_object_get (gobject, "backend", &backend_x11, NULL);
 | 
			
		||||
  g_assert (backend_x11 != NULL);
 | 
			
		||||
@@ -389,6 +392,8 @@ clutter_device_manager_x11_constructed (GObject *gobject)
 | 
			
		||||
  _clutter_input_device_set_associated_device (manager_x11->core_keyboard,
 | 
			
		||||
                                               manager_x11->core_pointer);
 | 
			
		||||
 | 
			
		||||
  clutter_device_manager_x11_a11y_init (manager);
 | 
			
		||||
 | 
			
		||||
  if (G_OBJECT_CLASS (clutter_device_manager_x11_parent_class)->constructed)
 | 
			
		||||
    G_OBJECT_CLASS (clutter_device_manager_x11_parent_class)->constructed (gobject);
 | 
			
		||||
}
 | 
			
		||||
@@ -485,6 +490,13 @@ clutter_device_manager_x11_create_virtual_device (ClutterDeviceManager  *device_
 | 
			
		||||
  return g_object_new (CLUTTER_TYPE_VIRTUAL_INPUT_DEVICE_X11, NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static ClutterVirtualDeviceType
 | 
			
		||||
clutter_device_manager_x11_get_supported_virtual_device_types (ClutterDeviceManager *device_manager)
 | 
			
		||||
{
 | 
			
		||||
  return (CLUTTER_VIRTUAL_DEVICE_TYPE_KEYBOARD |
 | 
			
		||||
          CLUTTER_VIRTUAL_DEVICE_TYPE_POINTER);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_device_manager_x11_set_property (GObject      *gobject,
 | 
			
		||||
                                         guint         prop_id,
 | 
			
		||||
@@ -532,6 +544,8 @@ clutter_device_manager_x11_class_init (ClutterDeviceManagerX11Class *klass)
 | 
			
		||||
  manager_class->get_core_device = clutter_device_manager_x11_get_core_device;
 | 
			
		||||
  manager_class->get_device = clutter_device_manager_x11_get_device;
 | 
			
		||||
  manager_class->create_virtual_device = clutter_device_manager_x11_create_virtual_device;
 | 
			
		||||
  manager_class->get_supported_virtual_device_types = clutter_device_manager_x11_get_supported_virtual_device_types;
 | 
			
		||||
  manager_class->apply_kbd_a11y_settings = clutter_device_manager_x11_apply_kbd_a11y_settings;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
 
 | 
			
		||||
@@ -40,6 +40,7 @@
 | 
			
		||||
#include "clutter-event-translator.h"
 | 
			
		||||
#include "clutter-stage-private.h"
 | 
			
		||||
#include "clutter-private.h"
 | 
			
		||||
#include "clutter-xkb-a11y-x11.h"
 | 
			
		||||
 | 
			
		||||
#include <X11/extensions/XInput2.h>
 | 
			
		||||
 | 
			
		||||
@@ -494,13 +495,21 @@ create_device (ClutterDeviceManagerXI2 *manager_xi2,
 | 
			
		||||
                         "device-node", node_path,
 | 
			
		||||
                         "n-rings", num_rings,
 | 
			
		||||
                         "n-strips", num_strips,
 | 
			
		||||
                         "n-mode-groups", MAX (num_rings, num_strips),
 | 
			
		||||
                         NULL);
 | 
			
		||||
 | 
			
		||||
  translate_device_classes (backend_x11->xdpy, retval,
 | 
			
		||||
                            info->classes,
 | 
			
		||||
                            info->num_classes);
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_LIBWACOM
 | 
			
		||||
  if (source == CLUTTER_PAD_DEVICE)
 | 
			
		||||
    clutter_input_device_xi2_ensure_wacom_info (retval, manager_xi2->wacom_db);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  g_free (vendor_id);
 | 
			
		||||
  g_free (product_id);
 | 
			
		||||
  g_free (node_path);
 | 
			
		||||
 | 
			
		||||
  CLUTTER_NOTE (BACKEND, "Created device '%s' (id: %d, has-cursor: %s)",
 | 
			
		||||
                info->name,
 | 
			
		||||
@@ -1125,7 +1134,7 @@ translate_pad_event (ClutterEvent       *event,
 | 
			
		||||
                     ClutterInputDevice *device)
 | 
			
		||||
{
 | 
			
		||||
  gdouble value;
 | 
			
		||||
  guint number;
 | 
			
		||||
  guint number, mode = 0;
 | 
			
		||||
 | 
			
		||||
  if (!translate_pad_axis (device, &xev->valuators,
 | 
			
		||||
                           &event->any.type,
 | 
			
		||||
@@ -1139,15 +1148,21 @@ translate_pad_event (ClutterEvent       *event,
 | 
			
		||||
  if (xev->evtype == XI_Motion)
 | 
			
		||||
    value = -1;
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_LIBWACOM
 | 
			
		||||
  mode = clutter_input_device_xi2_get_pad_group_mode (device, number);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  if (event->any.type == CLUTTER_PAD_RING)
 | 
			
		||||
    {
 | 
			
		||||
      event->pad_ring.ring_number = number;
 | 
			
		||||
      event->pad_ring.angle = value;
 | 
			
		||||
      event->pad_ring.mode = mode;
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      event->pad_strip.strip_number = number;
 | 
			
		||||
      event->pad_strip.value = value;
 | 
			
		||||
      event->pad_strip.mode = mode;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  event->any.time = xev->time;
 | 
			
		||||
@@ -1374,6 +1389,13 @@ clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
 | 
			
		||||
 | 
			
		||||
            /* Pad buttons are 0-indexed */
 | 
			
		||||
            event->pad_button.button = xev->detail - 1;
 | 
			
		||||
#ifdef HAVE_LIBWACOM
 | 
			
		||||
            clutter_input_device_xi2_update_pad_state (device,
 | 
			
		||||
                                                       event->pad_button.button,
 | 
			
		||||
                                                       (xi_event->evtype == XI_ButtonPress),
 | 
			
		||||
                                                       &event->pad_button.group,
 | 
			
		||||
                                                       &event->pad_button.mode);
 | 
			
		||||
#endif
 | 
			
		||||
            clutter_event_set_device (event, device);
 | 
			
		||||
            clutter_event_set_source_device (event, source_device);
 | 
			
		||||
 | 
			
		||||
@@ -1987,6 +2009,8 @@ clutter_device_manager_xi2_constructed (GObject *gobject)
 | 
			
		||||
 | 
			
		||||
  XSync (backend_x11->xdpy, False);
 | 
			
		||||
 | 
			
		||||
  clutter_device_manager_x11_a11y_init (manager);
 | 
			
		||||
 | 
			
		||||
  if (G_OBJECT_CLASS (clutter_device_manager_xi2_parent_class)->constructed)
 | 
			
		||||
    G_OBJECT_CLASS (clutter_device_manager_xi2_parent_class)->constructed (gobject);
 | 
			
		||||
}
 | 
			
		||||
@@ -2021,6 +2045,13 @@ clutter_device_manager_xi2_create_virtual_device (ClutterDeviceManager   *manage
 | 
			
		||||
                       NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static ClutterVirtualDeviceType
 | 
			
		||||
clutter_device_manager_xi2_get_supported_virtual_device_types (ClutterDeviceManager *device_manager)
 | 
			
		||||
{
 | 
			
		||||
  return (CLUTTER_VIRTUAL_DEVICE_TYPE_KEYBOARD |
 | 
			
		||||
          CLUTTER_VIRTUAL_DEVICE_TYPE_POINTER);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_device_manager_xi2_class_init (ClutterDeviceManagerXI2Class *klass)
 | 
			
		||||
{
 | 
			
		||||
@@ -2049,6 +2080,8 @@ clutter_device_manager_xi2_class_init (ClutterDeviceManagerXI2Class *klass)
 | 
			
		||||
  manager_class->get_device = clutter_device_manager_xi2_get_device;
 | 
			
		||||
  manager_class->select_stage_events = clutter_device_manager_xi2_select_stage_events;
 | 
			
		||||
  manager_class->create_virtual_device = clutter_device_manager_xi2_create_virtual_device;
 | 
			
		||||
  manager_class->get_supported_virtual_device_types = clutter_device_manager_xi2_get_supported_virtual_device_types;
 | 
			
		||||
  manager_class->apply_kbd_a11y_settings = clutter_device_manager_x11_apply_kbd_a11y_settings;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
@@ -2059,4 +2092,8 @@ clutter_device_manager_xi2_init (ClutterDeviceManagerXI2 *self)
 | 
			
		||||
                                               (GDestroyNotify) g_object_unref);
 | 
			
		||||
  self->tools_by_serial = g_hash_table_new_full (NULL, NULL, NULL,
 | 
			
		||||
                                                 (GDestroyNotify) g_object_unref);
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_LIBWACOM
 | 
			
		||||
  self->wacom_db = libwacom_database_new ();
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -26,6 +26,10 @@
 | 
			
		||||
 | 
			
		||||
#include <clutter/clutter-device-manager.h>
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_LIBWACOM
 | 
			
		||||
#include <libwacom/libwacom.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
G_BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
#define CLUTTER_TYPE_DEVICE_MANAGER_XI2            (_clutter_device_manager_xi2_get_type ())
 | 
			
		||||
@@ -51,6 +55,10 @@ struct _ClutterDeviceManagerXI2
 | 
			
		||||
  GList *slave_devices;
 | 
			
		||||
 | 
			
		||||
  int opcode;
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_LIBWACOM
 | 
			
		||||
  WacomDeviceDatabase *wacom_db;
 | 
			
		||||
#endif
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct _ClutterDeviceManagerXI2Class
 | 
			
		||||
 
 | 
			
		||||
@@ -45,6 +45,11 @@ struct _ClutterInputDeviceXI2
 | 
			
		||||
 | 
			
		||||
  gint device_id;
 | 
			
		||||
  ClutterInputDeviceTool *current_tool;
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_LIBWACOM
 | 
			
		||||
  WacomDevice *wacom_device;
 | 
			
		||||
  GArray *group_modes;
 | 
			
		||||
#endif
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define N_BUTTONS       5
 | 
			
		||||
@@ -64,6 +69,15 @@ clutter_input_device_xi2_constructed (GObject *gobject)
 | 
			
		||||
 | 
			
		||||
  if (G_OBJECT_CLASS (clutter_input_device_xi2_parent_class)->constructed)
 | 
			
		||||
    G_OBJECT_CLASS (clutter_input_device_xi2_parent_class)->constructed (gobject);
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_LIBWACOM
 | 
			
		||||
  if (clutter_input_device_get_device_type (CLUTTER_INPUT_DEVICE (gobject)) == CLUTTER_PAD_DEVICE)
 | 
			
		||||
    {
 | 
			
		||||
      device_xi2->group_modes = g_array_new (FALSE, TRUE, sizeof (guint));
 | 
			
		||||
      g_array_set_size (device_xi2->group_modes,
 | 
			
		||||
                        clutter_input_device_get_n_mode_groups (CLUTTER_INPUT_DEVICE (gobject)));
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
@@ -87,6 +101,84 @@ clutter_input_device_xi2_is_grouped (ClutterInputDevice *device,
 | 
			
		||||
  return FALSE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_input_device_xi2_finalize (GObject *object)
 | 
			
		||||
{
 | 
			
		||||
#ifdef HAVE_LIBWACOM
 | 
			
		||||
  ClutterInputDeviceXI2 *device_xi2 = CLUTTER_INPUT_DEVICE_XI2 (object);
 | 
			
		||||
 | 
			
		||||
  if (device_xi2->wacom_device)
 | 
			
		||||
    libwacom_destroy (device_xi2->wacom_device);
 | 
			
		||||
 | 
			
		||||
  g_array_unref (device_xi2->group_modes);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  G_OBJECT_CLASS (clutter_input_device_xi2_parent_class)->finalize (object);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gint
 | 
			
		||||
clutter_input_device_xi2_get_group_n_modes (ClutterInputDevice *device,
 | 
			
		||||
                                            gint                group)
 | 
			
		||||
{
 | 
			
		||||
#ifdef HAVE_LIBWACOM
 | 
			
		||||
  ClutterInputDeviceXI2 *device_xi2 = CLUTTER_INPUT_DEVICE_XI2 (device);
 | 
			
		||||
 | 
			
		||||
  if (device_xi2->wacom_device)
 | 
			
		||||
    {
 | 
			
		||||
      if (group == 0)
 | 
			
		||||
        {
 | 
			
		||||
          if (libwacom_has_ring (device_xi2->wacom_device))
 | 
			
		||||
            return libwacom_get_ring_num_modes (device_xi2->wacom_device);
 | 
			
		||||
          else if (libwacom_get_num_strips (device_xi2->wacom_device) >= 1)
 | 
			
		||||
            return libwacom_get_strips_num_modes (device_xi2->wacom_device);
 | 
			
		||||
        }
 | 
			
		||||
      else if (group == 1)
 | 
			
		||||
        {
 | 
			
		||||
          if (libwacom_has_ring2 (device_xi2->wacom_device))
 | 
			
		||||
            return libwacom_get_ring2_num_modes (device_xi2->wacom_device);
 | 
			
		||||
          else if (libwacom_get_num_strips (device_xi2->wacom_device) >= 2)
 | 
			
		||||
            return libwacom_get_strips_num_modes (device_xi2->wacom_device);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  return -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_LIBWACOM
 | 
			
		||||
static int
 | 
			
		||||
clutter_input_device_xi2_get_button_group (ClutterInputDevice *device,
 | 
			
		||||
                                           guint               button)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputDeviceXI2 *device_xi2 = CLUTTER_INPUT_DEVICE_XI2 (device);
 | 
			
		||||
 | 
			
		||||
  if (device_xi2->wacom_device)
 | 
			
		||||
    {
 | 
			
		||||
      if (button >= libwacom_get_num_buttons (device_xi2->wacom_device))
 | 
			
		||||
        return -1;
 | 
			
		||||
 | 
			
		||||
      return libwacom_get_button_led_group (device_xi2->wacom_device,
 | 
			
		||||
                                            'A' + button);
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    return -1;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
clutter_input_device_xi2_is_mode_switch_button (ClutterInputDevice *device,
 | 
			
		||||
                                                guint               group,
 | 
			
		||||
                                                guint               button)
 | 
			
		||||
{
 | 
			
		||||
  int button_group = -1;
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_LIBWACOM
 | 
			
		||||
  button_group = clutter_input_device_xi2_get_button_group (device, button);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  return button_group == (int) group;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_input_device_xi2_class_init (ClutterInputDeviceXI2Class *klass)
 | 
			
		||||
{
 | 
			
		||||
@@ -94,9 +186,12 @@ clutter_input_device_xi2_class_init (ClutterInputDeviceXI2Class *klass)
 | 
			
		||||
  ClutterInputDeviceClass *device_class = CLUTTER_INPUT_DEVICE_CLASS (klass);
 | 
			
		||||
 | 
			
		||||
  gobject_class->constructed = clutter_input_device_xi2_constructed;
 | 
			
		||||
  gobject_class->finalize = clutter_input_device_xi2_finalize;
 | 
			
		||||
 | 
			
		||||
  device_class->keycode_to_evdev = clutter_input_device_xi2_keycode_to_evdev;
 | 
			
		||||
  device_class->is_grouped = clutter_input_device_xi2_is_grouped;
 | 
			
		||||
  device_class->get_group_n_modes = clutter_input_device_xi2_get_group_n_modes;
 | 
			
		||||
  device_class->is_mode_switch_button = clutter_input_device_xi2_is_mode_switch_button;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
@@ -196,3 +291,66 @@ clutter_input_device_xi2_get_current_tool (ClutterInputDevice *device)
 | 
			
		||||
  ClutterInputDeviceXI2 *device_xi2 = CLUTTER_INPUT_DEVICE_XI2 (device);
 | 
			
		||||
  return device_xi2->current_tool;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_LIBWACOM
 | 
			
		||||
void
 | 
			
		||||
clutter_input_device_xi2_ensure_wacom_info (ClutterInputDevice  *device,
 | 
			
		||||
                                            WacomDeviceDatabase *wacom_db)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputDeviceXI2 *device_xi2 = CLUTTER_INPUT_DEVICE_XI2 (device);
 | 
			
		||||
  const gchar *node_path;
 | 
			
		||||
 | 
			
		||||
  node_path = clutter_input_device_get_device_node (device);
 | 
			
		||||
  device_xi2->wacom_device = libwacom_new_from_path (wacom_db, node_path,
 | 
			
		||||
                                                     WFALLBACK_NONE, NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
guint
 | 
			
		||||
clutter_input_device_xi2_get_pad_group_mode (ClutterInputDevice *device,
 | 
			
		||||
                                             guint               group)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputDeviceXI2 *device_xi2 = CLUTTER_INPUT_DEVICE_XI2 (device);
 | 
			
		||||
 | 
			
		||||
  if (group >= device_xi2->group_modes->len)
 | 
			
		||||
    return 0;
 | 
			
		||||
 | 
			
		||||
  return g_array_index (device_xi2->group_modes, guint, group);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_input_device_xi2_update_pad_state (ClutterInputDevice *device,
 | 
			
		||||
                                           guint               button,
 | 
			
		||||
                                           guint               state,
 | 
			
		||||
                                           guint              *group,
 | 
			
		||||
                                           guint              *mode)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputDeviceXI2 *device_xi2 = CLUTTER_INPUT_DEVICE_XI2 (device);
 | 
			
		||||
  guint button_group, *group_mode;
 | 
			
		||||
  gboolean is_mode_switch = FALSE;
 | 
			
		||||
 | 
			
		||||
  button_group = clutter_input_device_xi2_get_button_group (device, button);
 | 
			
		||||
  is_mode_switch = button_group >= 0;
 | 
			
		||||
 | 
			
		||||
  /* Assign all non-mode-switch buttons to group 0 so far */
 | 
			
		||||
  button_group = MAX (0, button_group);
 | 
			
		||||
 | 
			
		||||
  if (button_group >= device_xi2->group_modes->len)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  group_mode = &g_array_index (device_xi2->group_modes, guint, button_group);
 | 
			
		||||
 | 
			
		||||
  if (is_mode_switch && state)
 | 
			
		||||
    {
 | 
			
		||||
      guint next, n_modes;
 | 
			
		||||
 | 
			
		||||
      n_modes = clutter_input_device_get_group_n_modes (device, button_group);
 | 
			
		||||
      next = (*group_mode + 1) % n_modes;
 | 
			
		||||
      *group_mode = next;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (group)
 | 
			
		||||
    *group = button_group;
 | 
			
		||||
  if (mode)
 | 
			
		||||
    *mode = *group_mode;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -27,6 +27,10 @@
 | 
			
		||||
#include <clutter/clutter-input-device.h>
 | 
			
		||||
#include <X11/extensions/XInput2.h>
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_LIBWACOM
 | 
			
		||||
#include <libwacom/libwacom.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
G_BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
#define CLUTTER_TYPE_INPUT_DEVICE_XI2           (_clutter_input_device_xi2_get_type ())
 | 
			
		||||
@@ -45,6 +49,21 @@ void  clutter_input_device_xi2_update_tool      (ClutterInputDevice     *device,
 | 
			
		||||
                                                 ClutterInputDeviceTool *tool);
 | 
			
		||||
ClutterInputDeviceTool * clutter_input_device_xi2_get_current_tool (ClutterInputDevice *device);
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_LIBWACOM
 | 
			
		||||
void clutter_input_device_xi2_ensure_wacom_info (ClutterInputDevice  *device,
 | 
			
		||||
                                                 WacomDeviceDatabase *wacom_db);
 | 
			
		||||
 | 
			
		||||
guint clutter_input_device_xi2_get_pad_group_mode (ClutterInputDevice *device,
 | 
			
		||||
                                                   guint               group);
 | 
			
		||||
 | 
			
		||||
void clutter_input_device_xi2_update_pad_state (ClutterInputDevice *device,
 | 
			
		||||
                                                guint               button,
 | 
			
		||||
                                                guint               state,
 | 
			
		||||
                                                guint              *group,
 | 
			
		||||
                                                guint              *mode);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
#endif /* __CLUTTER_INPUT_DEVICE_XI2_H__ */
 | 
			
		||||
 
 | 
			
		||||
@@ -14,7 +14,6 @@ static const struct {
 | 
			
		||||
  { "Xft/HintStyle",           "font-hint-style" },
 | 
			
		||||
  { "Xft/RGBA",                "font-subpixel-order" },
 | 
			
		||||
  { "Fontconfig/Timestamp",    "fontconfig-timestamp" },
 | 
			
		||||
  { "Gdk/UnscaledDPI",         "unscaled-font-dpi" },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const gint _n_clutter_settings_map = G_N_ELEMENTS (_clutter_settings_map);
 | 
			
		||||
 
 | 
			
		||||
@@ -48,6 +48,10 @@ clutter_virtual_input_device_x11_notify_relative_motion (ClutterVirtualInputDevi
 | 
			
		||||
                                                         double                     dx,
 | 
			
		||||
                                                         double                     dy)
 | 
			
		||||
{
 | 
			
		||||
  XTestFakeRelativeMotionEvent (clutter_x11_get_default_display (),
 | 
			
		||||
                                (int) dx,
 | 
			
		||||
                                (int) dy,
 | 
			
		||||
                                0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
@@ -56,6 +60,11 @@ clutter_virtual_input_device_x11_notify_absolute_motion (ClutterVirtualInputDevi
 | 
			
		||||
                                                         double                     x,
 | 
			
		||||
                                                         double                     y)
 | 
			
		||||
{
 | 
			
		||||
  XTestFakeMotionEvent (clutter_x11_get_default_display (),
 | 
			
		||||
                        clutter_x11_get_default_screen (),
 | 
			
		||||
                        (int) x,
 | 
			
		||||
                        (int) y,
 | 
			
		||||
                        0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
@@ -68,6 +77,48 @@ clutter_virtual_input_device_x11_notify_button (ClutterVirtualInputDevice *virtu
 | 
			
		||||
                        button, button_state == CLUTTER_BUTTON_STATE_PRESSED, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_virtual_input_device_x11_notify_discrete_scroll (ClutterVirtualInputDevice *virtual_device,
 | 
			
		||||
                                                         uint64_t                   time_us,
 | 
			
		||||
                                                         ClutterScrollDirection     direction,
 | 
			
		||||
                                                         ClutterScrollSource        scroll_source)
 | 
			
		||||
{
 | 
			
		||||
  Display *xdisplay = clutter_x11_get_default_display ();
 | 
			
		||||
  int button;
 | 
			
		||||
 | 
			
		||||
  switch (direction)
 | 
			
		||||
    {
 | 
			
		||||
    case CLUTTER_SCROLL_UP:
 | 
			
		||||
      button = 4;
 | 
			
		||||
      break;
 | 
			
		||||
    case CLUTTER_SCROLL_DOWN:
 | 
			
		||||
      button = 5;
 | 
			
		||||
      break;
 | 
			
		||||
    case CLUTTER_SCROLL_LEFT:
 | 
			
		||||
      button = 6;
 | 
			
		||||
      break;
 | 
			
		||||
    case CLUTTER_SCROLL_RIGHT:
 | 
			
		||||
      button = 7;
 | 
			
		||||
      break;
 | 
			
		||||
    default:
 | 
			
		||||
      g_warn_if_reached ();
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  XTestFakeButtonEvent (xdisplay, button, True, 0);
 | 
			
		||||
  XTestFakeButtonEvent (xdisplay, button, False, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_virtual_input_device_x11_notify_scroll_continuous (ClutterVirtualInputDevice *virtual_device,
 | 
			
		||||
                                                           uint64_t                   time_us,
 | 
			
		||||
                                                           double                     dx,
 | 
			
		||||
                                                           double                     dy,
 | 
			
		||||
                                                           ClutterScrollSource        scroll_source,
 | 
			
		||||
                                                           ClutterScrollFinishFlags   finish_flags)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_virtual_input_device_x11_notify_key (ClutterVirtualInputDevice *virtual_device,
 | 
			
		||||
                                             uint64_t                   time_us,
 | 
			
		||||
@@ -91,6 +142,34 @@ clutter_virtual_input_device_x11_notify_keyval (ClutterVirtualInputDevice *virtu
 | 
			
		||||
                     keycode, key_state == CLUTTER_KEY_STATE_PRESSED, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_virtual_input_device_x11_notify_touch_down (ClutterVirtualInputDevice *virtual_device,
 | 
			
		||||
                                                    uint64_t                   time_us,
 | 
			
		||||
                                                    int                        device_slot,
 | 
			
		||||
                                                    double                     x,
 | 
			
		||||
                                                    double                     y)
 | 
			
		||||
{
 | 
			
		||||
  g_warning ("Virtual touch motion not implemented under X11");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_virtual_input_device_x11_notify_touch_motion (ClutterVirtualInputDevice *virtual_device,
 | 
			
		||||
                                                      uint64_t                   time_us,
 | 
			
		||||
                                                      int                        device_slot,
 | 
			
		||||
                                                      double                     x,
 | 
			
		||||
                                                      double                     y)
 | 
			
		||||
{
 | 
			
		||||
  g_warning ("Virtual touch motion not implemented under X11");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_virtual_input_device_x11_notify_touch_up (ClutterVirtualInputDevice *virtual_device,
 | 
			
		||||
                                                  uint64_t                   time_us,
 | 
			
		||||
                                                  int                        device_slot)
 | 
			
		||||
{
 | 
			
		||||
  g_warning ("Virtual touch motion not implemented under X11");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_virtual_input_device_x11_init (ClutterVirtualInputDeviceX11 *virtual_device_x11)
 | 
			
		||||
{
 | 
			
		||||
@@ -105,6 +184,11 @@ clutter_virtual_input_device_x11_class_init (ClutterVirtualInputDeviceX11Class *
 | 
			
		||||
  virtual_input_device_class->notify_relative_motion = clutter_virtual_input_device_x11_notify_relative_motion;
 | 
			
		||||
  virtual_input_device_class->notify_absolute_motion = clutter_virtual_input_device_x11_notify_absolute_motion;
 | 
			
		||||
  virtual_input_device_class->notify_button = clutter_virtual_input_device_x11_notify_button;
 | 
			
		||||
  virtual_input_device_class->notify_discrete_scroll = clutter_virtual_input_device_x11_notify_discrete_scroll;
 | 
			
		||||
  virtual_input_device_class->notify_scroll_continuous = clutter_virtual_input_device_x11_notify_scroll_continuous;
 | 
			
		||||
  virtual_input_device_class->notify_key = clutter_virtual_input_device_x11_notify_key;
 | 
			
		||||
  virtual_input_device_class->notify_keyval = clutter_virtual_input_device_x11_notify_keyval;
 | 
			
		||||
  virtual_input_device_class->notify_touch_down = clutter_virtual_input_device_x11_notify_touch_down;
 | 
			
		||||
  virtual_input_device_class->notify_touch_motion = clutter_virtual_input_device_x11_notify_touch_motion;
 | 
			
		||||
  virtual_input_device_class->notify_touch_up = clutter_virtual_input_device_x11_notify_touch_up;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -161,9 +161,6 @@ gint clutter_x11_event_get_key_group (const ClutterEvent *event);
 | 
			
		||||
CLUTTER_AVAILABLE_IN_ALL
 | 
			
		||||
guint clutter_x11_event_sequence_get_touch_detail (const ClutterEventSequence *sequence);
 | 
			
		||||
 | 
			
		||||
CLUTTER_AVAILABLE_IN_ALL
 | 
			
		||||
void clutter_x11_request_reset_on_video_memory_purge (void);
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
#endif /* __CLUTTER_X11_H__ */
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										328
									
								
								clutter/clutter/x11/clutter-xkb-a11y-x11.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										328
									
								
								clutter/clutter/x11/clutter-xkb-a11y-x11.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,328 @@
 | 
			
		||||
/*
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright © 2001 Ximian, Inc.
 | 
			
		||||
 * Copyright (C) 2007 William Jon McCann <mccann@jhu.edu>
 | 
			
		||||
 * Copyright (C) 2017 Red Hat
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU General Public License as
 | 
			
		||||
 * published by the Free Software Foundation; either version 2 of the
 | 
			
		||||
 * License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful, but
 | 
			
		||||
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 | 
			
		||||
 * 02111-1307, USA.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "clutter-device-manager-private.h"
 | 
			
		||||
#include "clutter-xkb-a11y-x11.h"
 | 
			
		||||
 | 
			
		||||
#include <X11/XKBlib.h>
 | 
			
		||||
#include <X11/extensions/XKBstr.h>
 | 
			
		||||
 | 
			
		||||
#define DEFAULT_XKB_SET_CONTROLS_MASK XkbSlowKeysMask         | \
 | 
			
		||||
                                      XkbBounceKeysMask       | \
 | 
			
		||||
                                      XkbStickyKeysMask       | \
 | 
			
		||||
                                      XkbMouseKeysMask        | \
 | 
			
		||||
                                      XkbMouseKeysAccelMask   | \
 | 
			
		||||
                                      XkbAccessXKeysMask      | \
 | 
			
		||||
                                      XkbAccessXTimeoutMask   | \
 | 
			
		||||
                                      XkbAccessXFeedbackMask  | \
 | 
			
		||||
                                      XkbControlsEnabledMask
 | 
			
		||||
 | 
			
		||||
static int _xkb_event_base;
 | 
			
		||||
 | 
			
		||||
static XkbDescRec *
 | 
			
		||||
get_xkb_desc_rec (ClutterBackendX11 *backend_x11)
 | 
			
		||||
{
 | 
			
		||||
  XkbDescRec *desc;
 | 
			
		||||
  Status      status = Success;
 | 
			
		||||
 | 
			
		||||
  clutter_x11_trap_x_errors ();
 | 
			
		||||
  desc = XkbGetMap (backend_x11->xdpy, XkbAllMapComponentsMask, XkbUseCoreKbd);
 | 
			
		||||
  if (desc != NULL)
 | 
			
		||||
    {
 | 
			
		||||
      desc->ctrls = NULL;
 | 
			
		||||
      status = XkbGetControls (backend_x11->xdpy, XkbAllControlsMask, desc);
 | 
			
		||||
    }
 | 
			
		||||
  clutter_x11_untrap_x_errors ();
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_fail (desc != NULL, NULL);
 | 
			
		||||
  g_return_val_if_fail (desc->ctrls != NULL, NULL);
 | 
			
		||||
  g_return_val_if_fail (status == Success, NULL);
 | 
			
		||||
 | 
			
		||||
  return desc;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
set_xkb_desc_rec (ClutterBackendX11 *backend_x11,
 | 
			
		||||
                  XkbDescRec        *desc)
 | 
			
		||||
{
 | 
			
		||||
  clutter_x11_trap_x_errors ();
 | 
			
		||||
  XkbSetControls (backend_x11->xdpy, DEFAULT_XKB_SET_CONTROLS_MASK, desc);
 | 
			
		||||
  XSync (backend_x11->xdpy, FALSE);
 | 
			
		||||
  clutter_x11_untrap_x_errors ();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
check_settings_changed (ClutterDeviceManager *device_manager)
 | 
			
		||||
{
 | 
			
		||||
  ClutterBackendX11 *backend_x11;
 | 
			
		||||
  ClutterKbdA11ySettings kbd_a11y_settings;
 | 
			
		||||
  ClutterKeyboardA11yFlags what_changed = 0;
 | 
			
		||||
  XkbDescRec *desc;
 | 
			
		||||
 | 
			
		||||
  backend_x11 = CLUTTER_BACKEND_X11 (clutter_get_default_backend ());
 | 
			
		||||
  desc = get_xkb_desc_rec (backend_x11);
 | 
			
		||||
  if (!desc)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  clutter_device_manager_get_kbd_a11y_settings (device_manager, &kbd_a11y_settings);
 | 
			
		||||
 | 
			
		||||
  if (desc->ctrls->enabled_ctrls & XkbSlowKeysMask &&
 | 
			
		||||
      !(kbd_a11y_settings.controls & CLUTTER_A11Y_SLOW_KEYS_ENABLED))
 | 
			
		||||
    {
 | 
			
		||||
      what_changed |= CLUTTER_A11Y_SLOW_KEYS_ENABLED;
 | 
			
		||||
      kbd_a11y_settings.controls |= CLUTTER_A11Y_SLOW_KEYS_ENABLED;
 | 
			
		||||
    }
 | 
			
		||||
  else if (!(desc->ctrls->enabled_ctrls & XkbSlowKeysMask) &&
 | 
			
		||||
           kbd_a11y_settings.controls & CLUTTER_A11Y_SLOW_KEYS_ENABLED)
 | 
			
		||||
    {
 | 
			
		||||
      what_changed |= CLUTTER_A11Y_SLOW_KEYS_ENABLED;
 | 
			
		||||
      kbd_a11y_settings.controls &= ~CLUTTER_A11Y_SLOW_KEYS_ENABLED;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (desc->ctrls->enabled_ctrls & XkbStickyKeysMask &&
 | 
			
		||||
      !(kbd_a11y_settings.controls & CLUTTER_A11Y_STICKY_KEYS_ENABLED))
 | 
			
		||||
    {
 | 
			
		||||
      what_changed |= CLUTTER_A11Y_STICKY_KEYS_ENABLED;
 | 
			
		||||
      kbd_a11y_settings.controls |= CLUTTER_A11Y_STICKY_KEYS_ENABLED;
 | 
			
		||||
    }
 | 
			
		||||
  else if (!(desc->ctrls->enabled_ctrls & XkbStickyKeysMask) &&
 | 
			
		||||
           kbd_a11y_settings.controls & CLUTTER_A11Y_STICKY_KEYS_ENABLED)
 | 
			
		||||
    {
 | 
			
		||||
      what_changed |= CLUTTER_A11Y_STICKY_KEYS_ENABLED;
 | 
			
		||||
      kbd_a11y_settings.controls &= ~CLUTTER_A11Y_STICKY_KEYS_ENABLED;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (what_changed)
 | 
			
		||||
    g_signal_emit_by_name (device_manager,
 | 
			
		||||
                           "kbd-a11y-flags-changed",
 | 
			
		||||
                           kbd_a11y_settings.controls,
 | 
			
		||||
                           what_changed);
 | 
			
		||||
 | 
			
		||||
  XkbFreeKeyboard (desc, XkbAllComponentsMask, TRUE);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static ClutterX11FilterReturn
 | 
			
		||||
xkb_a11y_event_filter (XEvent       *xevent,
 | 
			
		||||
                       ClutterEvent *clutter_event,
 | 
			
		||||
                       gpointer      data)
 | 
			
		||||
{
 | 
			
		||||
  ClutterDeviceManager *device_manager = CLUTTER_DEVICE_MANAGER (data);
 | 
			
		||||
  XkbEvent *xkbev = (XkbEvent *) xevent;
 | 
			
		||||
 | 
			
		||||
  /* 'event_type' is set to zero on notifying us of updates in
 | 
			
		||||
   * response to client requests (including our own) and non-zero
 | 
			
		||||
   * to notify us of key/mouse events causing changes (like
 | 
			
		||||
   * pressing shift 5 times to enable sticky keys).
 | 
			
		||||
   *
 | 
			
		||||
   * We only want to update out settings when it's in response to an
 | 
			
		||||
   * explicit user input event, so require a non-zero event_type.
 | 
			
		||||
   */
 | 
			
		||||
  if (xevent->xany.type == (_xkb_event_base + XkbEventCode) &&
 | 
			
		||||
      xkbev->any.xkb_type == XkbControlsNotify && xkbev->ctrls.event_type != 0)
 | 
			
		||||
    check_settings_changed (device_manager);
 | 
			
		||||
 | 
			
		||||
  return  CLUTTER_X11_FILTER_CONTINUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
is_xkb_available (ClutterBackendX11 *backend_x11)
 | 
			
		||||
{
 | 
			
		||||
  gint opcode, error_base, event_base, major, minor;
 | 
			
		||||
 | 
			
		||||
  if (_xkb_event_base)
 | 
			
		||||
    return TRUE;
 | 
			
		||||
 | 
			
		||||
  if (!XkbQueryExtension (backend_x11->xdpy,
 | 
			
		||||
                          &opcode,
 | 
			
		||||
                          &event_base,
 | 
			
		||||
                          &error_base,
 | 
			
		||||
                          &major,
 | 
			
		||||
                          &minor))
 | 
			
		||||
    return FALSE;
 | 
			
		||||
 | 
			
		||||
  if (!XkbUseExtension (backend_x11->xdpy, &major, &minor))
 | 
			
		||||
    return FALSE;
 | 
			
		||||
 | 
			
		||||
  _xkb_event_base = event_base;
 | 
			
		||||
 | 
			
		||||
  return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static unsigned long
 | 
			
		||||
set_value_mask (gboolean      flag,
 | 
			
		||||
                unsigned long value,
 | 
			
		||||
                unsigned long mask)
 | 
			
		||||
{
 | 
			
		||||
  if (flag)
 | 
			
		||||
    return value | mask;
 | 
			
		||||
 | 
			
		||||
  return value & ~mask;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
set_xkb_ctrl (XkbDescRec               *desc,
 | 
			
		||||
              ClutterKeyboardA11yFlags settings,
 | 
			
		||||
              ClutterKeyboardA11yFlags flag,
 | 
			
		||||
              unsigned long            mask)
 | 
			
		||||
{
 | 
			
		||||
  gboolean result = (settings & flag) == flag;
 | 
			
		||||
  desc->ctrls->enabled_ctrls = set_value_mask (result, desc->ctrls->enabled_ctrls, mask);
 | 
			
		||||
 | 
			
		||||
  return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_device_manager_x11_apply_kbd_a11y_settings (ClutterDeviceManager   *device_manager,
 | 
			
		||||
                                                    ClutterKbdA11ySettings *kbd_a11y_settings)
 | 
			
		||||
{
 | 
			
		||||
  ClutterBackendX11 *backend_x11;
 | 
			
		||||
  XkbDescRec      *desc;
 | 
			
		||||
  gboolean         enable_accessX;
 | 
			
		||||
 | 
			
		||||
  backend_x11 = CLUTTER_BACKEND_X11 (clutter_get_default_backend ());
 | 
			
		||||
  desc = get_xkb_desc_rec (backend_x11);
 | 
			
		||||
  if (!desc)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  /* general */
 | 
			
		||||
  enable_accessX = kbd_a11y_settings->controls & CLUTTER_A11Y_KEYBOARD_ENABLED;
 | 
			
		||||
 | 
			
		||||
  desc->ctrls->enabled_ctrls = set_value_mask (enable_accessX,
 | 
			
		||||
                                               desc->ctrls->enabled_ctrls,
 | 
			
		||||
                                               XkbAccessXKeysMask);
 | 
			
		||||
 | 
			
		||||
  if (set_xkb_ctrl (desc, kbd_a11y_settings->controls, CLUTTER_A11Y_TIMEOUT_ENABLED,
 | 
			
		||||
                    XkbAccessXTimeoutMask))
 | 
			
		||||
    {
 | 
			
		||||
      desc->ctrls->ax_timeout = kbd_a11y_settings->timeout_delay;
 | 
			
		||||
      /* disable only the master flag via the server we will disable
 | 
			
		||||
       * the rest on the rebound without affecting settings state
 | 
			
		||||
       * don't change the option flags at all.
 | 
			
		||||
       */
 | 
			
		||||
      desc->ctrls->axt_ctrls_mask = XkbAccessXKeysMask | XkbAccessXFeedbackMask;
 | 
			
		||||
      desc->ctrls->axt_ctrls_values = 0;
 | 
			
		||||
      desc->ctrls->axt_opts_mask = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  desc->ctrls->ax_options =
 | 
			
		||||
    set_value_mask (kbd_a11y_settings->controls & CLUTTER_A11Y_FEATURE_STATE_CHANGE_BEEP,
 | 
			
		||||
                    desc->ctrls->ax_options,
 | 
			
		||||
                    XkbAccessXFeedbackMask | XkbAX_FeatureFBMask | XkbAX_SlowWarnFBMask);
 | 
			
		||||
 | 
			
		||||
  /* bounce keys */
 | 
			
		||||
  if (set_xkb_ctrl (desc, kbd_a11y_settings->controls,
 | 
			
		||||
                    CLUTTER_A11Y_BOUNCE_KEYS_ENABLED, XkbBounceKeysMask))
 | 
			
		||||
    {
 | 
			
		||||
      desc->ctrls->debounce_delay = kbd_a11y_settings->debounce_delay;
 | 
			
		||||
      desc->ctrls->ax_options =
 | 
			
		||||
        set_value_mask (kbd_a11y_settings->controls & CLUTTER_A11Y_BOUNCE_KEYS_BEEP_REJECT,
 | 
			
		||||
                        desc->ctrls->ax_options,
 | 
			
		||||
                        XkbAccessXFeedbackMask | XkbAX_BKRejectFBMask);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* mouse keys */
 | 
			
		||||
  if (set_xkb_ctrl (desc, kbd_a11y_settings->controls,
 | 
			
		||||
                    CLUTTER_A11Y_MOUSE_KEYS_ENABLED, XkbMouseKeysMask | XkbMouseKeysAccelMask))
 | 
			
		||||
    {
 | 
			
		||||
      gint mk_max_speed;
 | 
			
		||||
      gint mk_accel_time;
 | 
			
		||||
 | 
			
		||||
      desc->ctrls->mk_interval     = 100;     /* msec between mousekey events */
 | 
			
		||||
      desc->ctrls->mk_curve        = 50;
 | 
			
		||||
 | 
			
		||||
      /* We store pixels / sec, XKB wants pixels / event */
 | 
			
		||||
      mk_max_speed = kbd_a11y_settings->mousekeys_max_speed;
 | 
			
		||||
      desc->ctrls->mk_max_speed = mk_max_speed / (1000 / desc->ctrls->mk_interval);
 | 
			
		||||
      if (desc->ctrls->mk_max_speed <= 0)
 | 
			
		||||
        desc->ctrls->mk_max_speed = 1;
 | 
			
		||||
 | 
			
		||||
      mk_accel_time = kbd_a11y_settings->mousekeys_accel_time;
 | 
			
		||||
      desc->ctrls->mk_time_to_max = mk_accel_time / desc->ctrls->mk_interval;
 | 
			
		||||
 | 
			
		||||
      if (desc->ctrls->mk_time_to_max <= 0)
 | 
			
		||||
        desc->ctrls->mk_time_to_max = 1;
 | 
			
		||||
 | 
			
		||||
      desc->ctrls->mk_delay = kbd_a11y_settings->mousekeys_init_delay;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* slow keys */
 | 
			
		||||
  if (set_xkb_ctrl (desc, kbd_a11y_settings->controls,
 | 
			
		||||
                    CLUTTER_A11Y_SLOW_KEYS_ENABLED, XkbSlowKeysMask))
 | 
			
		||||
    {
 | 
			
		||||
      desc->ctrls->ax_options =
 | 
			
		||||
        set_value_mask (kbd_a11y_settings->controls & CLUTTER_A11Y_SLOW_KEYS_BEEP_PRESS,
 | 
			
		||||
                        desc->ctrls->ax_options, XkbAccessXFeedbackMask | XkbAX_SKPressFBMask);
 | 
			
		||||
      desc->ctrls->ax_options =
 | 
			
		||||
        set_value_mask (kbd_a11y_settings->controls & CLUTTER_A11Y_SLOW_KEYS_BEEP_ACCEPT,
 | 
			
		||||
                        desc->ctrls->ax_options, XkbAccessXFeedbackMask | XkbAX_SKAcceptFBMask);
 | 
			
		||||
      desc->ctrls->ax_options =
 | 
			
		||||
        set_value_mask (kbd_a11y_settings->controls & CLUTTER_A11Y_SLOW_KEYS_BEEP_REJECT,
 | 
			
		||||
                        desc->ctrls->ax_options, XkbAccessXFeedbackMask | XkbAX_SKRejectFBMask);
 | 
			
		||||
      desc->ctrls->slow_keys_delay = kbd_a11y_settings->slowkeys_delay;
 | 
			
		||||
      /* anything larger than 500 seems to loose all keyboard input */
 | 
			
		||||
      if (desc->ctrls->slow_keys_delay > 500)
 | 
			
		||||
        desc->ctrls->slow_keys_delay = 500;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* sticky keys */
 | 
			
		||||
  if (set_xkb_ctrl (desc, kbd_a11y_settings->controls,
 | 
			
		||||
                    CLUTTER_A11Y_STICKY_KEYS_ENABLED, XkbStickyKeysMask))
 | 
			
		||||
  {
 | 
			
		||||
    desc->ctrls->ax_options |= XkbAX_LatchToLockMask;
 | 
			
		||||
    desc->ctrls->ax_options =
 | 
			
		||||
      set_value_mask (kbd_a11y_settings->controls & CLUTTER_A11Y_STICKY_KEYS_TWO_KEY_OFF,
 | 
			
		||||
                      desc->ctrls->ax_options, XkbAccessXFeedbackMask | XkbAX_TwoKeysMask);
 | 
			
		||||
    desc->ctrls->ax_options =
 | 
			
		||||
      set_value_mask (kbd_a11y_settings->controls &  CLUTTER_A11Y_STICKY_KEYS_BEEP,
 | 
			
		||||
                      desc->ctrls->ax_options, XkbAccessXFeedbackMask | XkbAX_StickyKeysFBMask);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* toggle keys */
 | 
			
		||||
  desc->ctrls->ax_options =
 | 
			
		||||
    set_value_mask (kbd_a11y_settings->controls & CLUTTER_A11Y_TOGGLE_KEYS_ENABLED,
 | 
			
		||||
                    desc->ctrls->ax_options, XkbAccessXFeedbackMask | XkbAX_IndicatorFBMask);
 | 
			
		||||
 | 
			
		||||
  set_xkb_desc_rec (backend_x11, desc);
 | 
			
		||||
  XkbFreeKeyboard (desc, XkbAllComponentsMask, TRUE);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
gboolean
 | 
			
		||||
clutter_device_manager_x11_a11y_init (ClutterDeviceManager *device_manager)
 | 
			
		||||
{
 | 
			
		||||
  ClutterBackendX11 *backend_x11;
 | 
			
		||||
  guint event_mask;
 | 
			
		||||
 | 
			
		||||
  backend_x11 =
 | 
			
		||||
    CLUTTER_BACKEND_X11 (_clutter_device_manager_get_backend (device_manager));
 | 
			
		||||
 | 
			
		||||
  if (!is_xkb_available (backend_x11))
 | 
			
		||||
    return FALSE;
 | 
			
		||||
 | 
			
		||||
  event_mask = XkbControlsNotifyMask | XkbAccessXNotifyMask;
 | 
			
		||||
 | 
			
		||||
  XkbSelectEvents (backend_x11->xdpy, XkbUseCoreKbd, event_mask, event_mask);
 | 
			
		||||
 | 
			
		||||
  clutter_x11_add_filter (xkb_a11y_event_filter, device_manager);
 | 
			
		||||
 | 
			
		||||
  return TRUE;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										39
									
								
								clutter/clutter/x11/clutter-xkb-a11y-x11.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								clutter/clutter/x11/clutter-xkb-a11y-x11.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,39 @@
 | 
			
		||||
/*
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright © 2001 Ximian, Inc.
 | 
			
		||||
 * Copyright (C) 2007 William Jon McCann <mccann@jhu.edu>
 | 
			
		||||
 * Copyright (C) 2017 Red Hat
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU General Public License as
 | 
			
		||||
 * published by the Free Software Foundation; either version 2 of the
 | 
			
		||||
 * License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful, but
 | 
			
		||||
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 | 
			
		||||
 * 02111-1307, USA.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef CLUTTER_XKB_A11Y_X11_H
 | 
			
		||||
#define CLUTTER_XKB_A11Y_X11_H
 | 
			
		||||
 | 
			
		||||
#include "clutter-device-manager-private.h"
 | 
			
		||||
#include "clutter-backend-x11.h"
 | 
			
		||||
 | 
			
		||||
#include <X11/Xlib.h>
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_device_manager_x11_apply_kbd_a11y_settings (ClutterDeviceManager   *device_manager,
 | 
			
		||||
                                                    ClutterKbdA11ySettings *kbd_a11y_settings);
 | 
			
		||||
 | 
			
		||||
gboolean
 | 
			
		||||
clutter_device_manager_x11_a11y_init               (ClutterDeviceManager *device_manager);
 | 
			
		||||
 | 
			
		||||
#endif /* CLUTTER_XKB_A11Y_X11_H */
 | 
			
		||||
@@ -121,6 +121,7 @@ m4_define([xcomposite_req_version],     [0.4])
 | 
			
		||||
m4_define([gdk_req_version],            [3.3.18])
 | 
			
		||||
m4_define([libinput_req_version],       [1.4.0])
 | 
			
		||||
m4_define([libudev_req_version],        [136])
 | 
			
		||||
m4_define([libwacom_req_version],       [0.13])
 | 
			
		||||
 | 
			
		||||
AC_SUBST([GLIB_REQ_VERSION],       [glib_req_version])
 | 
			
		||||
AC_SUBST([COGL_REQ_VERSION],       [cogl_req_version])
 | 
			
		||||
@@ -133,6 +134,7 @@ AC_SUBST([XCOMPOSITE_REQ_VERSION], [xcomposite_req_version])
 | 
			
		||||
AC_SUBST([GDK_REQ_VERSION],        [gdk_req_version])
 | 
			
		||||
AC_SUBST([LIBINPUT_REQ_VERSION],   [libinput_req_version])
 | 
			
		||||
AC_SUBST([LIBUDEV_REQ_VERSION],    [libudev_req_version])
 | 
			
		||||
AC_SUBST([LIBWACOM_REQ_VERSION],   [libwacom_req_version])
 | 
			
		||||
 | 
			
		||||
# Checks for typedefs, structures, and compiler characteristics.
 | 
			
		||||
AM_PATH_GLIB_2_0([glib_req_version],
 | 
			
		||||
@@ -149,7 +151,7 @@ AC_ARG_ENABLE([Bsymbolic],
 | 
			
		||||
                saved_LDFLAGS="${LDFLAGS}"
 | 
			
		||||
                AC_MSG_CHECKING([for -Bsymbolic-functions linker flag])
 | 
			
		||||
                LDFLAGS=-Wl,-Bsymbolic-functions
 | 
			
		||||
                AC_TRY_LINK([], [int main (void) { return 0; }],
 | 
			
		||||
                AC_TRY_LINK([], [return 0],
 | 
			
		||||
                            [
 | 
			
		||||
                              AC_MSG_RESULT([yes])
 | 
			
		||||
                              enable_Bsymbolic=yes
 | 
			
		||||
@@ -170,7 +172,7 @@ dnl on other compilers, check if we can do -fvisibility=hidden
 | 
			
		||||
SAVED_CFLAGS="${CFLAGS}"
 | 
			
		||||
CFLAGS="-fvisibility=hidden"
 | 
			
		||||
AC_MSG_CHECKING([for -fvisibility=hidden compiler flag])
 | 
			
		||||
AC_TRY_COMPILE([], [int main (void) { return 0; }],
 | 
			
		||||
AC_TRY_COMPILE([], [return 0],
 | 
			
		||||
	       AC_MSG_RESULT(yes)
 | 
			
		||||
	       enable_fvisibility_hidden=yes,
 | 
			
		||||
	       AC_MSG_RESULT(no)
 | 
			
		||||
@@ -508,6 +510,32 @@ X11_EXTS=${X11_EXTS#* }
 | 
			
		||||
 | 
			
		||||
AC_CACHE_SAVE
 | 
			
		||||
 | 
			
		||||
dnl === Libwacom support for X11 ===============================================
 | 
			
		||||
AC_ARG_WITH(libwacom,
 | 
			
		||||
  AC_HELP_STRING([--without-libwacom],
 | 
			
		||||
                 [disable the use of libwacom for advanced tablet management]),,
 | 
			
		||||
  with_libwacom=auto)
 | 
			
		||||
 | 
			
		||||
have_libwacom=no
 | 
			
		||||
AC_MSG_CHECKING([libwacom])
 | 
			
		||||
if test x$with_libwacom = xno ; then
 | 
			
		||||
  AC_MSG_RESULT([disabled])
 | 
			
		||||
else
 | 
			
		||||
  if $PKG_CONFIG --exists libwacom '>=' $LIBWACOM_REQ_VERSION; then
 | 
			
		||||
    have_libwacom=yes
 | 
			
		||||
    AC_MSG_RESULT(yes)
 | 
			
		||||
    PKG_CHECK_MODULES([LIBWACOM], [libwacom])
 | 
			
		||||
    AC_SUBST(LIBWACOM_CFLAGS)
 | 
			
		||||
    AC_SUBST(LIBWACOM_LIBS)
 | 
			
		||||
    AC_DEFINE([HAVE_LIBWACOM], 1, [Building with libwacom for advanced tablet management])
 | 
			
		||||
  else
 | 
			
		||||
    AC_MSG_RESULT(no)
 | 
			
		||||
    if test x$with_libwacom = xyes ; then
 | 
			
		||||
      AC_MSG_ERROR([libwacom forced but not found])
 | 
			
		||||
    fi
 | 
			
		||||
  fi
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
dnl === Enable GDK-Pixbuf in tests ============================================
 | 
			
		||||
 | 
			
		||||
m4_define([pixbuf_default], [yes])
 | 
			
		||||
@@ -679,8 +707,8 @@ AS_IF([test "x$CLUTTER_BASE_PC_FILES_PRIVATE" = "x" && test "x$BACKEND_PC_FILES_
 | 
			
		||||
AC_SUBST(CLUTTER_REQUIRES)
 | 
			
		||||
AC_SUBST(CLUTTER_REQUIRES_PRIVATE)
 | 
			
		||||
 | 
			
		||||
CLUTTER_CFLAGS="$FLAVOUR_CFLAGS $CLUTTER_DEPS_CFLAGS $CLUTTER_DEPS_PRIVATE_CFLAGS $GLIB_CFLAGS"
 | 
			
		||||
CLUTTER_LIBS="$FLAVOUR_LIBS $CLUTTER_DEPS_LIBS $CLUTTER_DEPS_PRIVATE_LIBS $GLIB_LIBS"
 | 
			
		||||
CLUTTER_CFLAGS="$FLAVOUR_CFLAGS $CLUTTER_DEPS_CFLAGS $CLUTTER_DEPS_PRIVATE_CFLAGS $GLIB_CFLAGS $LIBWACOM_CFLAGS"
 | 
			
		||||
CLUTTER_LIBS="$FLAVOUR_LIBS $CLUTTER_DEPS_LIBS $CLUTTER_DEPS_PRIVATE_LIBS $GLIB_LIBS $LIBWACOM_LIBS"
 | 
			
		||||
AC_SUBST(CLUTTER_CFLAGS)
 | 
			
		||||
AC_SUBST(CLUTTER_LIBS)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -407,7 +407,8 @@ test_scale_center (TestState *state)
 | 
			
		||||
  g_assert (scale_x == 4.0);
 | 
			
		||||
  g_assert (scale_y == 2.0);
 | 
			
		||||
  g_assert (gravity == CLUTTER_GRAVITY_NONE);
 | 
			
		||||
  assert_notifications (NOTIFY_SCALE_CENTER_X | NOTIFY_SCALE_CENTER_Y
 | 
			
		||||
  assert_notifications (NOTIFY_SCALE_X | NOTIFY_SCALE_Y
 | 
			
		||||
                        | NOTIFY_SCALE_CENTER_X | NOTIFY_SCALE_CENTER_Y
 | 
			
		||||
                        | NOTIFY_SCALE_GRAVITY);
 | 
			
		||||
  assert_coords (state, 100 + 10 - 10 * 4, 200 + 20 - 20 * 2,
 | 
			
		||||
                 100 + 10 + (RECT_WIDTH - 10) * 4,
 | 
			
		||||
 
 | 
			
		||||
@@ -92,9 +92,9 @@ static gboolean perf_fake_mouse_cb (gpointer stage)
 | 
			
		||||
      event2->crossing.source = stage;
 | 
			
		||||
      event2->crossing.x = 10;
 | 
			
		||||
      event2->crossing.y = 10;
 | 
			
		||||
      event2->crossing.device = device;
 | 
			
		||||
      event2->crossing.related = NULL;
 | 
			
		||||
 | 
			
		||||
      clutter_event_set_device (event2, device);
 | 
			
		||||
      clutter_input_device_update_from_event (device, event2, TRUE);
 | 
			
		||||
 | 
			
		||||
      clutter_event_put (event2);
 | 
			
		||||
@@ -104,7 +104,7 @@ static gboolean perf_fake_mouse_cb (gpointer stage)
 | 
			
		||||
 | 
			
		||||
  clutter_actor_get_size (stage, &w, &h);
 | 
			
		||||
  event->motion.stage = stage;
 | 
			
		||||
  event->motion.device = device;
 | 
			
		||||
  clutter_event_set_device (event, device);
 | 
			
		||||
 | 
			
		||||
  /* called about every 60fps, and do 10 picks per stage */
 | 
			
		||||
  for (i = 0; i < 10; i++)
 | 
			
		||||
 
 | 
			
		||||
@@ -452,7 +452,7 @@ libmutter_cogl_@LIBMUTTER_API_VERSION@_la_LDFLAGS = \
 | 
			
		||||
	-avoid-version \
 | 
			
		||||
	-export-dynamic \
 | 
			
		||||
	-rpath $(mutterlibdir) \
 | 
			
		||||
	-export-symbols-regex "^(cogl|_cogl_debug_flags|_cogl_atlas_new|_cogl_atlas_add_reorganize_callback|_cogl_atlas_reserve_space|_cogl_callback|_cogl_util_get_eye_planes_for_screen_poly|_cogl_atlas_texture_remove_reorganize_callback|_cogl_atlas_texture_add_reorganize_callback|_cogl_texture_get_format|_cogl_texture_foreach_sub_texture_in_region|_cogl_texture_set_region|_cogl_profile_trace_message|_cogl_context_get_default|_cogl_framebuffer_get_stencil_bits|_cogl_clip_stack_push_rectangle|_cogl_framebuffer_get_modelview_stack|_cogl_object_default_unref|_cogl_pipeline_foreach_layer_internal|_cogl_clip_stack_push_primitive|_cogl_buffer_unmap_for_fill_or_fallback|_cogl_framebuffer_draw_primitive|_cogl_debug_instances|_cogl_framebuffer_get_projection_stack|_cogl_pipeline_layer_get_texture|_cogl_buffer_map_for_fill_or_fallback|_cogl_texture_can_hardware_repeat|_cogl_pipeline_prune_to_n_layers|_cogl_primitive_draw|test_|unit_test_|_cogl_winsys_glx_get_vtable|_cogl_winsys_egl_xlib_get_vtable|_cogl_winsys_egl_get_vtable|_cogl_closure_disconnect|_cogl_onscreen_notify_complete|_cogl_onscreen_notify_frame_sync|_cogl_winsys_egl_renderer_connect_common|_cogl_winsys_error_quark|_cogl_set_error|_cogl_poll_renderer_add_fd|_cogl_poll_renderer_add_idle|_cogl_framebuffer_winsys_update_size|_cogl_winsys_egl_make_current|_cogl_pixel_format_get_bytes_per_pixel).*"
 | 
			
		||||
	-export-symbols-regex "^(cogl|_cogl_debug_flags|_cogl_atlas_new|_cogl_atlas_add_reorganize_callback|_cogl_atlas_reserve_space|_cogl_callback|_cogl_util_get_eye_planes_for_screen_poly|_cogl_atlas_texture_remove_reorganize_callback|_cogl_atlas_texture_add_reorganize_callback|_cogl_texture_get_format|_cogl_texture_foreach_sub_texture_in_region|_cogl_texture_set_region|_cogl_profile_trace_message|_cogl_context_get_default|_cogl_framebuffer_get_stencil_bits|_cogl_clip_stack_push_rectangle|_cogl_framebuffer_get_modelview_stack|_cogl_object_default_unref|_cogl_pipeline_foreach_layer_internal|_cogl_clip_stack_push_primitive|_cogl_buffer_unmap_for_fill_or_fallback|_cogl_framebuffer_draw_primitive|_cogl_debug_instances|_cogl_framebuffer_get_projection_stack|_cogl_pipeline_layer_get_texture|_cogl_buffer_map_for_fill_or_fallback|_cogl_texture_can_hardware_repeat|_cogl_pipeline_prune_to_n_layers|_cogl_primitive_draw|test_|unit_test_|_cogl_winsys_glx_get_vtable|_cogl_winsys_egl_xlib_get_vtable|_cogl_winsys_egl_get_vtable|_cogl_closure_disconnect|_cogl_onscreen_notify_complete|_cogl_onscreen_notify_frame_sync|_cogl_winsys_egl_renderer_connect_common|_cogl_winsys_error_quark|_cogl_set_error|_cogl_poll_renderer_add_fd|_cogl_poll_renderer_add_idle|_cogl_framebuffer_winsys_update_size|_cogl_winsys_egl_make_current|_cogl_winsys_egl_ensure_current|_cogl_pixel_format_get_bytes_per_pixel).*"
 | 
			
		||||
 | 
			
		||||
libmutter_cogl_@LIBMUTTER_API_VERSION@_la_SOURCES = $(cogl_sources_c)
 | 
			
		||||
nodist_libmutter_cogl_@LIBMUTTER_API_VERSION@_la_SOURCES = $(BUILT_SOURCES)
 | 
			
		||||
 
 | 
			
		||||
@@ -1043,5 +1043,6 @@ cogl_atlas_texture_vtable =
 | 
			
		||||
    _cogl_atlas_texture_get_gl_format,
 | 
			
		||||
    _cogl_atlas_texture_get_type,
 | 
			
		||||
    NULL, /* is_foreign */
 | 
			
		||||
    NULL /* set_auto_mipmap */
 | 
			
		||||
    NULL, /* set_auto_mipmap */
 | 
			
		||||
    NULL  /* is_get_data_supported */
 | 
			
		||||
  };
 | 
			
		||||
 
 | 
			
		||||
@@ -263,6 +263,7 @@ typedef enum _CoglFeatureID
 | 
			
		||||
  COGL_FEATURE_ID_TEXTURE_RG,
 | 
			
		||||
  COGL_FEATURE_ID_BUFFER_AGE,
 | 
			
		||||
  COGL_FEATURE_ID_TEXTURE_EGL_IMAGE_EXTERNAL,
 | 
			
		||||
  COGL_FEATURE_ID_UNSTABLE_TEXTURES,
 | 
			
		||||
 | 
			
		||||
  /*< private >*/
 | 
			
		||||
  _COGL_N_FEATURE_IDS   /*< skip >*/
 | 
			
		||||
 
 | 
			
		||||
@@ -210,6 +210,9 @@ struct _CoglDriverVtable
 | 
			
		||||
                           int rowstride,
 | 
			
		||||
                           uint8_t *data);
 | 
			
		||||
 | 
			
		||||
  CoglBool
 | 
			
		||||
  (* texture_2d_is_get_data_supported) (CoglTexture2D *tex_2d);
 | 
			
		||||
 | 
			
		||||
  /* Prepares for drawing by flushing the journal, framebuffer state,
 | 
			
		||||
   * pipeline state and attribute state.
 | 
			
		||||
   */
 | 
			
		||||
 
 | 
			
		||||
@@ -43,6 +43,7 @@
 | 
			
		||||
#include <cogl/winsys/cogl-winsys-private.h>
 | 
			
		||||
 | 
			
		||||
void cogl_renderer_set_custom_winsys (CoglRenderer                *renderer,
 | 
			
		||||
                                      CoglCustomWinsysVtableGetter winsys_vtable_getter);
 | 
			
		||||
                                      CoglCustomWinsysVtableGetter winsys_vtable_getter,
 | 
			
		||||
                                      void                        *user_data);
 | 
			
		||||
 | 
			
		||||
#endif /* __COGL_MUTTER_H___ */
 | 
			
		||||
 
 | 
			
		||||
@@ -109,7 +109,11 @@ _cogl_object_default_unref (void *object)
 | 
			
		||||
void
 | 
			
		||||
cogl_object_unref (void *obj)
 | 
			
		||||
{
 | 
			
		||||
  void (* unref_func) (void *) = ((CoglObject *) obj)->klass->virt_unref;
 | 
			
		||||
  void (* unref_func) (void *);
 | 
			
		||||
 | 
			
		||||
  _COGL_RETURN_IF_FAIL (obj != NULL);
 | 
			
		||||
 | 
			
		||||
  unref_func = ((CoglObject *) obj)->klass->virt_unref;
 | 
			
		||||
  unref_func (obj);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -592,7 +592,7 @@ _cogl_rectangles_validate_layer_cb (CoglPipeline *pipeline,
 | 
			
		||||
 | 
			
		||||
          if (!warning_seen)
 | 
			
		||||
            g_warning ("Skipping layer %d of your pipeline consisting of "
 | 
			
		||||
                       "a sliced texture (unsuported for multi texturing)",
 | 
			
		||||
                       "a sliced texture (unsupported for multi texturing)",
 | 
			
		||||
                       state->i);
 | 
			
		||||
          warning_seen = TRUE;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -54,6 +54,7 @@ struct _CoglRenderer
 | 
			
		||||
  const CoglDriverVtable *driver_vtable;
 | 
			
		||||
  const CoglTextureDriver *texture_driver;
 | 
			
		||||
  const CoglWinsysVtable *winsys_vtable;
 | 
			
		||||
  void *custom_winsys_user_data;
 | 
			
		||||
  CoglCustomWinsysVtableGetter custom_winsys_vtable_getter;
 | 
			
		||||
  CoglWinsysID winsys_id_override;
 | 
			
		||||
  GList *constraints;
 | 
			
		||||
 
 | 
			
		||||
@@ -566,8 +566,10 @@ _cogl_renderer_choose_driver (CoglRenderer *renderer,
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
cogl_renderer_set_custom_winsys (CoglRenderer                *renderer,
 | 
			
		||||
                                 CoglCustomWinsysVtableGetter winsys_vtable_getter)
 | 
			
		||||
                                 CoglCustomWinsysVtableGetter winsys_vtable_getter,
 | 
			
		||||
                                 void                        *user_data)
 | 
			
		||||
{
 | 
			
		||||
  renderer->custom_winsys_user_data = user_data;
 | 
			
		||||
  renderer->custom_winsys_vtable_getter = winsys_vtable_getter;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -454,6 +454,14 @@ _cogl_sub_texture_get_type (CoglTexture *tex)
 | 
			
		||||
  return _cogl_texture_get_type (sub_tex->full_texture);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static CoglBool
 | 
			
		||||
_cogl_sub_texture_is_get_data_supported (CoglTexture *tex)
 | 
			
		||||
{
 | 
			
		||||
  CoglSubTexture *sub_tex = COGL_SUB_TEXTURE (tex);
 | 
			
		||||
 | 
			
		||||
  return cogl_texture_is_get_data_supported (sub_tex->full_texture);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static const CoglTextureVtable
 | 
			
		||||
cogl_sub_texture_vtable =
 | 
			
		||||
  {
 | 
			
		||||
@@ -476,5 +484,6 @@ cogl_sub_texture_vtable =
 | 
			
		||||
    _cogl_sub_texture_get_gl_format,
 | 
			
		||||
    _cogl_sub_texture_get_type,
 | 
			
		||||
    NULL, /* is_foreign */
 | 
			
		||||
    NULL /* set_auto_mipmap */
 | 
			
		||||
    NULL, /* set_auto_mipmap */
 | 
			
		||||
    _cogl_sub_texture_is_get_data_supported
 | 
			
		||||
  };
 | 
			
		||||
 
 | 
			
		||||
@@ -1542,5 +1542,6 @@ cogl_texture_2d_sliced_vtable =
 | 
			
		||||
    _cogl_texture_2d_sliced_get_gl_format,
 | 
			
		||||
    _cogl_texture_2d_sliced_get_type,
 | 
			
		||||
    _cogl_texture_2d_sliced_is_foreign,
 | 
			
		||||
    NULL /* set_auto_mipmap */
 | 
			
		||||
    NULL, /* set_auto_mipmap */
 | 
			
		||||
    NULL  /* is_get_data_supported */
 | 
			
		||||
  };
 | 
			
		||||
 
 | 
			
		||||
@@ -94,6 +94,15 @@ _cogl_texture_2d_set_auto_mipmap (CoglTexture *tex,
 | 
			
		||||
  tex_2d->auto_mipmap = value;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static CoglBool
 | 
			
		||||
_cogl_texture_2d_is_get_data_supported (CoglTexture *tex)
 | 
			
		||||
{
 | 
			
		||||
  CoglTexture2D *tex_2d = COGL_TEXTURE_2D (tex);
 | 
			
		||||
  CoglContext *ctx = tex->context;
 | 
			
		||||
 | 
			
		||||
  return ctx->driver_vtable->texture_2d_is_get_data_supported (tex_2d);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CoglTexture2D *
 | 
			
		||||
_cogl_texture_2d_create_base (CoglContext *ctx,
 | 
			
		||||
                              int width,
 | 
			
		||||
@@ -693,5 +702,6 @@ cogl_texture_2d_vtable =
 | 
			
		||||
    _cogl_texture_2d_get_gl_format,
 | 
			
		||||
    _cogl_texture_2d_get_type,
 | 
			
		||||
    _cogl_texture_2d_is_foreign,
 | 
			
		||||
    _cogl_texture_2d_set_auto_mipmap
 | 
			
		||||
    _cogl_texture_2d_set_auto_mipmap,
 | 
			
		||||
    _cogl_texture_2d_is_get_data_supported
 | 
			
		||||
  };
 | 
			
		||||
 
 | 
			
		||||
@@ -755,5 +755,6 @@ cogl_texture_3d_vtable =
 | 
			
		||||
    _cogl_texture_3d_get_gl_format,
 | 
			
		||||
    _cogl_texture_3d_get_type,
 | 
			
		||||
    NULL, /* is_foreign */
 | 
			
		||||
    _cogl_texture_3d_set_auto_mipmap
 | 
			
		||||
    _cogl_texture_3d_set_auto_mipmap,
 | 
			
		||||
    NULL  /* is_get_data_supported */
 | 
			
		||||
  };
 | 
			
		||||
 
 | 
			
		||||
@@ -149,6 +149,8 @@ struct _CoglTextureVtable
 | 
			
		||||
  /* Only needs to be implemented if is_primitive == TRUE */
 | 
			
		||||
  void (* set_auto_mipmap) (CoglTexture *texture,
 | 
			
		||||
                            CoglBool value);
 | 
			
		||||
 | 
			
		||||
  CoglBool (* is_get_data_supported) (CoglTexture *texture);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
typedef enum _CoglTextureSoureType {
 | 
			
		||||
 
 | 
			
		||||
@@ -773,5 +773,6 @@ cogl_texture_rectangle_vtable =
 | 
			
		||||
    _cogl_texture_rectangle_get_gl_format,
 | 
			
		||||
    _cogl_texture_rectangle_get_type,
 | 
			
		||||
    _cogl_texture_rectangle_is_foreign,
 | 
			
		||||
    _cogl_texture_rectangle_set_auto_mipmap
 | 
			
		||||
    _cogl_texture_rectangle_set_auto_mipmap,
 | 
			
		||||
    NULL  /* is_get_data_supported */
 | 
			
		||||
  };
 | 
			
		||||
 
 | 
			
		||||
@@ -205,6 +205,15 @@ _cogl_texture_is_foreign (CoglTexture *texture)
 | 
			
		||||
    return FALSE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CoglBool
 | 
			
		||||
cogl_texture_is_get_data_supported (CoglTexture *texture)
 | 
			
		||||
{
 | 
			
		||||
  if (texture->vtable->is_get_data_supported)
 | 
			
		||||
    return texture->vtable->is_get_data_supported (texture);
 | 
			
		||||
  else
 | 
			
		||||
    return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
unsigned int
 | 
			
		||||
cogl_texture_get_width (CoglTexture *texture)
 | 
			
		||||
{
 | 
			
		||||
@@ -542,285 +551,6 @@ cogl_texture_set_data (CoglTexture *texture,
 | 
			
		||||
                                   error);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Reads back the contents of a texture by rendering it to the framebuffer
 | 
			
		||||
 * and reading back the resulting pixels.
 | 
			
		||||
 *
 | 
			
		||||
 * It will perform multiple renders if the texture is larger than the
 | 
			
		||||
 * current glViewport.
 | 
			
		||||
 *
 | 
			
		||||
 * It assumes the projection and modelview have already been setup so
 | 
			
		||||
 * that rendering to 0,0 with the same width and height of the viewport
 | 
			
		||||
 * will exactly cover the viewport.
 | 
			
		||||
 *
 | 
			
		||||
 * NB: Normally this approach isn't normally used since we can just use
 | 
			
		||||
 * glGetTexImage, but may be used as a fallback in some circumstances.
 | 
			
		||||
 */
 | 
			
		||||
static CoglBool
 | 
			
		||||
do_texture_draw_and_read (CoglFramebuffer *fb,
 | 
			
		||||
                          CoglPipeline *pipeline,
 | 
			
		||||
                          CoglTexture *texture,
 | 
			
		||||
                          CoglBitmap *target_bmp,
 | 
			
		||||
                          float *viewport,
 | 
			
		||||
                          CoglError **error)
 | 
			
		||||
{
 | 
			
		||||
  float rx1, ry1;
 | 
			
		||||
  float rx2, ry2;
 | 
			
		||||
  float tx1, ty1;
 | 
			
		||||
  float tx2, ty2;
 | 
			
		||||
  int bw,  bh;
 | 
			
		||||
  CoglBitmap *rect_bmp;
 | 
			
		||||
  unsigned int tex_width, tex_height;
 | 
			
		||||
  CoglContext *ctx = fb->context;
 | 
			
		||||
 | 
			
		||||
  tex_width = cogl_texture_get_width (texture);
 | 
			
		||||
  tex_height = cogl_texture_get_height (texture);
 | 
			
		||||
 | 
			
		||||
  ry2 = 0;
 | 
			
		||||
  ty2 = 0;
 | 
			
		||||
 | 
			
		||||
  /* Walk Y axis until whole bitmap height consumed */
 | 
			
		||||
  for (bh = tex_height; bh > 0; bh -= viewport[3])
 | 
			
		||||
    {
 | 
			
		||||
      /* Rectangle Y coords */
 | 
			
		||||
      ry1 = ry2;
 | 
			
		||||
      ry2 += (bh < viewport[3]) ? bh : viewport[3];
 | 
			
		||||
 | 
			
		||||
      /* Normalized texture Y coords */
 | 
			
		||||
      ty1 = ty2;
 | 
			
		||||
      ty2 = (ry2 / (float) tex_height);
 | 
			
		||||
 | 
			
		||||
      rx2 = 0;
 | 
			
		||||
      tx2 = 0;
 | 
			
		||||
 | 
			
		||||
      /* Walk X axis until whole bitmap width consumed */
 | 
			
		||||
      for (bw = tex_width; bw > 0; bw-=viewport[2])
 | 
			
		||||
        {
 | 
			
		||||
          int width;
 | 
			
		||||
          int height;
 | 
			
		||||
 | 
			
		||||
          /* Rectangle X coords */
 | 
			
		||||
          rx1 = rx2;
 | 
			
		||||
          rx2 += (bw < viewport[2]) ? bw : viewport[2];
 | 
			
		||||
 | 
			
		||||
          width = rx2 - rx1;
 | 
			
		||||
          height = ry2 - ry1;
 | 
			
		||||
 | 
			
		||||
          /* Normalized texture X coords */
 | 
			
		||||
          tx1 = tx2;
 | 
			
		||||
          tx2 = (rx2 / (float) tex_width);
 | 
			
		||||
 | 
			
		||||
          /* Draw a portion of texture */
 | 
			
		||||
          cogl_framebuffer_draw_textured_rectangle (fb,
 | 
			
		||||
                                                    pipeline,
 | 
			
		||||
                                                    0, 0,
 | 
			
		||||
                                                    rx2 - rx1,
 | 
			
		||||
                                                    ry2 - ry1,
 | 
			
		||||
                                                    tx1, ty1,
 | 
			
		||||
                                                    tx2, ty2);
 | 
			
		||||
 | 
			
		||||
          /* Read into a temporary bitmap */
 | 
			
		||||
          rect_bmp = _cogl_bitmap_new_with_malloc_buffer
 | 
			
		||||
                                              (ctx,
 | 
			
		||||
                                               width, height,
 | 
			
		||||
                                               COGL_PIXEL_FORMAT_RGBA_8888_PRE,
 | 
			
		||||
                                               error);
 | 
			
		||||
          if (!rect_bmp)
 | 
			
		||||
            return FALSE;
 | 
			
		||||
 | 
			
		||||
          if (!_cogl_framebuffer_read_pixels_into_bitmap
 | 
			
		||||
                                               (fb,
 | 
			
		||||
                                                viewport[0], viewport[1],
 | 
			
		||||
                                                COGL_READ_PIXELS_COLOR_BUFFER,
 | 
			
		||||
                                                rect_bmp,
 | 
			
		||||
                                                error))
 | 
			
		||||
            {
 | 
			
		||||
              cogl_object_unref (rect_bmp);
 | 
			
		||||
              return FALSE;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
          /* Copy to target bitmap */
 | 
			
		||||
          if (!_cogl_bitmap_copy_subregion (rect_bmp,
 | 
			
		||||
                                            target_bmp,
 | 
			
		||||
                                            0, 0,
 | 
			
		||||
                                            rx1, ry1,
 | 
			
		||||
                                            width,
 | 
			
		||||
                                            height,
 | 
			
		||||
                                            error))
 | 
			
		||||
            {
 | 
			
		||||
              cogl_object_unref (rect_bmp);
 | 
			
		||||
              return FALSE;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
          /* Free temp bitmap */
 | 
			
		||||
          cogl_object_unref (rect_bmp);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Reads back the contents of a texture by rendering it to the framebuffer
 | 
			
		||||
 * and reading back the resulting pixels.
 | 
			
		||||
 *
 | 
			
		||||
 * NB: Normally this approach isn't normally used since we can just use
 | 
			
		||||
 * glGetTexImage, but may be used as a fallback in some circumstances.
 | 
			
		||||
 */
 | 
			
		||||
static CoglBool
 | 
			
		||||
_cogl_texture_draw_and_read (CoglTexture *texture,
 | 
			
		||||
                             CoglBitmap *target_bmp,
 | 
			
		||||
                             GLuint target_gl_format,
 | 
			
		||||
                             GLuint target_gl_type,
 | 
			
		||||
                             CoglError **error)
 | 
			
		||||
{
 | 
			
		||||
  CoglFramebuffer *framebuffer = cogl_get_draw_framebuffer ();
 | 
			
		||||
  CoglContext *ctx = framebuffer->context;
 | 
			
		||||
  float save_viewport[4];
 | 
			
		||||
  float viewport[4];
 | 
			
		||||
  CoglBool status = FALSE;
 | 
			
		||||
 | 
			
		||||
  viewport[0] = 0;
 | 
			
		||||
  viewport[1] = 0;
 | 
			
		||||
  viewport[2] = cogl_framebuffer_get_width (framebuffer);
 | 
			
		||||
  viewport[3] = cogl_framebuffer_get_height (framebuffer);
 | 
			
		||||
 | 
			
		||||
  cogl_framebuffer_get_viewport4fv (framebuffer, save_viewport);
 | 
			
		||||
  _cogl_framebuffer_push_projection (framebuffer);
 | 
			
		||||
  cogl_framebuffer_orthographic (framebuffer,
 | 
			
		||||
                                 0, 0,
 | 
			
		||||
                                 viewport[2],
 | 
			
		||||
                                 viewport[3],
 | 
			
		||||
                                 0, 100);
 | 
			
		||||
 | 
			
		||||
  cogl_framebuffer_push_matrix (framebuffer);
 | 
			
		||||
  cogl_framebuffer_identity_matrix (framebuffer);
 | 
			
		||||
 | 
			
		||||
  /* Direct copy operation */
 | 
			
		||||
 | 
			
		||||
  if (ctx->texture_download_pipeline == NULL)
 | 
			
		||||
    {
 | 
			
		||||
      ctx->texture_download_pipeline = cogl_pipeline_new (ctx);
 | 
			
		||||
      cogl_pipeline_set_blend (ctx->texture_download_pipeline,
 | 
			
		||||
                               "RGBA = ADD (SRC_COLOR, 0)",
 | 
			
		||||
                               NULL);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  cogl_pipeline_set_layer_texture (ctx->texture_download_pipeline, 0, texture);
 | 
			
		||||
 | 
			
		||||
  cogl_pipeline_set_layer_combine (ctx->texture_download_pipeline,
 | 
			
		||||
                                   0, /* layer */
 | 
			
		||||
                                   "RGBA = REPLACE (TEXTURE)",
 | 
			
		||||
                                   NULL);
 | 
			
		||||
 | 
			
		||||
  cogl_pipeline_set_layer_filters (ctx->texture_download_pipeline, 0,
 | 
			
		||||
                                   COGL_PIPELINE_FILTER_NEAREST,
 | 
			
		||||
                                   COGL_PIPELINE_FILTER_NEAREST);
 | 
			
		||||
 | 
			
		||||
  if (!do_texture_draw_and_read (framebuffer,
 | 
			
		||||
                                 ctx->texture_download_pipeline,
 | 
			
		||||
                                 texture, target_bmp, viewport,
 | 
			
		||||
                                 error))
 | 
			
		||||
    return FALSE;
 | 
			
		||||
 | 
			
		||||
  /* XXX: As an alleged PowerVR driver bug workaround where the driver
 | 
			
		||||
   * is apparently not maintaining the alpha component of some
 | 
			
		||||
   * framebuffers we render the alpha component of the texture
 | 
			
		||||
   * separately to be sure we retrieve all components of the texture.
 | 
			
		||||
   *
 | 
			
		||||
   * TODO: verify if this is still an issue
 | 
			
		||||
   */
 | 
			
		||||
  if ((_cogl_texture_get_format (texture) & COGL_A_BIT)/* && a_bits == 0*/)
 | 
			
		||||
    {
 | 
			
		||||
      uint8_t *srcdata;
 | 
			
		||||
      uint8_t *dstdata;
 | 
			
		||||
      uint8_t *srcpixel;
 | 
			
		||||
      uint8_t *dstpixel;
 | 
			
		||||
      int target_width = cogl_bitmap_get_width (target_bmp);
 | 
			
		||||
      int target_height = cogl_bitmap_get_height (target_bmp);
 | 
			
		||||
      int target_rowstride = cogl_bitmap_get_rowstride (target_bmp);
 | 
			
		||||
      int bpp = _cogl_pixel_format_get_bytes_per_pixel (COGL_PIXEL_FORMAT_RGBA_8888);
 | 
			
		||||
      int alpha_rowstride = bpp * target_width;
 | 
			
		||||
      CoglBitmap *alpha_bmp;
 | 
			
		||||
      int x,y;
 | 
			
		||||
 | 
			
		||||
      if ((dstdata = _cogl_bitmap_map (target_bmp,
 | 
			
		||||
                                       COGL_BUFFER_ACCESS_WRITE,
 | 
			
		||||
                                       COGL_BUFFER_MAP_HINT_DISCARD,
 | 
			
		||||
                                       error)) == NULL)
 | 
			
		||||
        goto EXIT;
 | 
			
		||||
 | 
			
		||||
      /* Create temp bitmap for alpha values */
 | 
			
		||||
      alpha_bmp =
 | 
			
		||||
        _cogl_bitmap_new_with_malloc_buffer (ctx,
 | 
			
		||||
                                             target_width,
 | 
			
		||||
                                             target_height,
 | 
			
		||||
                                             COGL_PIXEL_FORMAT_RGBA_8888,
 | 
			
		||||
                                             error);
 | 
			
		||||
      if (!alpha_bmp)
 | 
			
		||||
        {
 | 
			
		||||
          _cogl_bitmap_unmap (target_bmp);
 | 
			
		||||
          goto EXIT;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
      /* Draw alpha values into RGB channels */
 | 
			
		||||
      cogl_pipeline_set_layer_combine (ctx->texture_download_pipeline,
 | 
			
		||||
                                       0, /* layer */
 | 
			
		||||
                                       "RGBA = REPLACE (TEXTURE[A])",
 | 
			
		||||
                                       NULL);
 | 
			
		||||
 | 
			
		||||
      if (!do_texture_draw_and_read (framebuffer,
 | 
			
		||||
                                     ctx->texture_download_pipeline,
 | 
			
		||||
                                     texture, alpha_bmp, viewport,
 | 
			
		||||
                                     error))
 | 
			
		||||
        {
 | 
			
		||||
          cogl_object_unref (alpha_bmp);
 | 
			
		||||
          _cogl_bitmap_unmap (target_bmp);
 | 
			
		||||
          goto EXIT;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      /* Copy temp R to target A */
 | 
			
		||||
 | 
			
		||||
      /* Note: we don't try to catch errors since "mapping" an
 | 
			
		||||
       * malloc buffer should never fail */
 | 
			
		||||
      srcdata = _cogl_bitmap_map (alpha_bmp,
 | 
			
		||||
                                  COGL_BUFFER_ACCESS_READ,
 | 
			
		||||
                                  0 /* hints */,
 | 
			
		||||
                                  NULL);
 | 
			
		||||
 | 
			
		||||
      for (y=0; y<target_height; ++y)
 | 
			
		||||
        {
 | 
			
		||||
          for (x=0; x<target_width; ++x)
 | 
			
		||||
            {
 | 
			
		||||
              srcpixel = srcdata + x*bpp;
 | 
			
		||||
              dstpixel = dstdata + x*bpp;
 | 
			
		||||
              dstpixel[3] = srcpixel[0];
 | 
			
		||||
            }
 | 
			
		||||
          srcdata += alpha_rowstride;
 | 
			
		||||
          dstdata += target_rowstride;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      _cogl_bitmap_unmap (alpha_bmp);
 | 
			
		||||
 | 
			
		||||
      _cogl_bitmap_unmap (target_bmp);
 | 
			
		||||
 | 
			
		||||
      cogl_object_unref (alpha_bmp);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  status = TRUE;
 | 
			
		||||
 | 
			
		||||
EXIT:
 | 
			
		||||
  /* Restore old state */
 | 
			
		||||
  cogl_framebuffer_pop_matrix (framebuffer);
 | 
			
		||||
  _cogl_framebuffer_pop_projection (framebuffer);
 | 
			
		||||
  cogl_framebuffer_set_viewport (framebuffer,
 | 
			
		||||
                                 save_viewport[0],
 | 
			
		||||
                                 save_viewport[1],
 | 
			
		||||
                                 save_viewport[2],
 | 
			
		||||
                                 save_viewport[3]);
 | 
			
		||||
 | 
			
		||||
  return status;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static CoglBool
 | 
			
		||||
get_texture_bits_via_offscreen (CoglTexture *meta_texture,
 | 
			
		||||
                                CoglTexture *sub_texture,
 | 
			
		||||
@@ -1156,25 +886,13 @@ cogl_texture_get_data (CoglTexture *texture,
 | 
			
		||||
      tg_data.success = FALSE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* XXX: In some cases _cogl_texture_2d_download_from_gl may fail
 | 
			
		||||
   * to read back the texture data; such as for GLES which doesn't
 | 
			
		||||
   * support glGetTexImage, so here we fallback to drawing the
 | 
			
		||||
   * texture and reading the pixels from the framebuffer. */
 | 
			
		||||
  /* XXX: In some cases this api may fail to read back the texture
 | 
			
		||||
   * data; such as for GLES which doesn't support glGetTexImage
 | 
			
		||||
   */
 | 
			
		||||
  if (!tg_data.success)
 | 
			
		||||
    {
 | 
			
		||||
      if (!_cogl_texture_draw_and_read (texture, target_bmp,
 | 
			
		||||
                                        closest_gl_format,
 | 
			
		||||
                                        closest_gl_type,
 | 
			
		||||
                                        &ignore_error))
 | 
			
		||||
        {
 | 
			
		||||
          /* We have no more fallbacks so we just give up and
 | 
			
		||||
           * hope for the best */
 | 
			
		||||
          g_warning ("Failed to read texture since draw-and-read "
 | 
			
		||||
                     "fallback failed: %s", ignore_error->message);
 | 
			
		||||
          cogl_error_free (ignore_error);
 | 
			
		||||
          cogl_object_unref (target_bmp);
 | 
			
		||||
          return 0;
 | 
			
		||||
        }
 | 
			
		||||
      cogl_object_unref (target_bmp);
 | 
			
		||||
      return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* Was intermediate used? */
 | 
			
		||||
 
 | 
			
		||||
@@ -511,6 +511,12 @@ CoglBool
 | 
			
		||||
cogl_texture_allocate (CoglTexture *texture,
 | 
			
		||||
                       CoglError **error);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * cogl_texture_is_get_data_supported: (skip)
 | 
			
		||||
 */
 | 
			
		||||
CoglBool
 | 
			
		||||
cogl_texture_is_get_data_supported (CoglTexture *texture);
 | 
			
		||||
 | 
			
		||||
COGL_END_DECLS
 | 
			
		||||
 | 
			
		||||
#endif /* __COGL_TEXTURE_H__ */
 | 
			
		||||
 
 | 
			
		||||
@@ -398,6 +398,8 @@ typedef enum { /*< prefix=COGL_PIXEL_FORMAT >*/
 | 
			
		||||
 *     supported with CoglBufferAccess including write support.
 | 
			
		||||
 * @COGL_FEATURE_DEPTH_TEXTURE: Whether #CoglFramebuffer support rendering the
 | 
			
		||||
 *     depth buffer to a texture.
 | 
			
		||||
 * @COGL_FEATURE_UNSTABLE_TEXTURES: Whether textures require redrawing on
 | 
			
		||||
 *     resume or not.
 | 
			
		||||
 *
 | 
			
		||||
 * Flags for the supported features.
 | 
			
		||||
 *
 | 
			
		||||
@@ -428,7 +430,8 @@ typedef enum
 | 
			
		||||
  COGL_FEATURE_MAP_BUFFER_FOR_READ    = (1 << 21),
 | 
			
		||||
  COGL_FEATURE_MAP_BUFFER_FOR_WRITE   = (1 << 22),
 | 
			
		||||
  COGL_FEATURE_ONSCREEN_MULTIPLE      = (1 << 23),
 | 
			
		||||
  COGL_FEATURE_DEPTH_TEXTURE          = (1 << 24)
 | 
			
		||||
  COGL_FEATURE_DEPTH_TEXTURE          = (1 << 24),
 | 
			
		||||
  COGL_FEATURE_UNSTABLE_TEXTURES      = (1 << 25)
 | 
			
		||||
} CoglFeatureFlags;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 
 | 
			
		||||
@@ -168,7 +168,7 @@ cogl_xlib_renderer_set_event_retrieval_enabled (CoglRenderer *renderer,
 | 
			
		||||
                                                CoglBool enable);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * cogl_xlib_renderer_set_threaded_swap_wait_enabled:
 | 
			
		||||
 * cogl_xlib_renderer_set_threaded_swap_wait_enabled: (skip)
 | 
			
		||||
 * @renderer: a #CoglRenderer
 | 
			
		||||
 * @enable: The new value
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1412,22 +1412,12 @@ _cogl_framebuffer_gl_read_pixels_into_bitmap (CoglFramebuffer *framebuffer,
 | 
			
		||||
  if (!cogl_is_offscreen (framebuffer))
 | 
			
		||||
    y = framebuffer_height - y - height;
 | 
			
		||||
 | 
			
		||||
  required_format = ctx->driver_vtable->pixel_format_to_gl (ctx,
 | 
			
		||||
                                                            format,
 | 
			
		||||
                                                            &gl_intformat,
 | 
			
		||||
                                                            &gl_format,
 | 
			
		||||
                                                            &gl_type);
 | 
			
		||||
#if HAVE_COGL_GL
 | 
			
		||||
  /* As we are reading pixels, we want to consider the bitmap according to
 | 
			
		||||
   * its real pixel format, not the swizzled channels we pretend face to the
 | 
			
		||||
   * pipeline.
 | 
			
		||||
   */
 | 
			
		||||
  if ((ctx->driver == COGL_DRIVER_GL || ctx->driver == COGL_DRIVER_GL3) &&
 | 
			
		||||
      (format == COGL_PIXEL_FORMAT_BGRA_8888 ||
 | 
			
		||||
       format == COGL_PIXEL_FORMAT_BGRA_8888_PRE) &&
 | 
			
		||||
      _cogl_has_private_feature (ctx, COGL_PRIVATE_FEATURE_TEXTURE_SWIZZLE))
 | 
			
		||||
    gl_format = GL_BGRA;
 | 
			
		||||
#endif
 | 
			
		||||
  required_format = ctx->driver_vtable->pixel_format_to_gl_with_target (ctx,
 | 
			
		||||
                                                                        framebuffer->internal_format,
 | 
			
		||||
                                                                        format,
 | 
			
		||||
                                                                        &gl_intformat,
 | 
			
		||||
                                                                        &gl_format,
 | 
			
		||||
                                                                        &gl_type);
 | 
			
		||||
 | 
			
		||||
  /* NB: All offscreen rendering is done upside down so there is no need
 | 
			
		||||
   * to flip in this case... */
 | 
			
		||||
 
 | 
			
		||||
@@ -116,4 +116,7 @@ _cogl_texture_2d_gl_get_data (CoglTexture2D *tex_2d,
 | 
			
		||||
                              int rowstride,
 | 
			
		||||
                              uint8_t *data);
 | 
			
		||||
 | 
			
		||||
CoglBool
 | 
			
		||||
_cogl_texture_2d_gl_is_get_data_supported (CoglTexture2D *tex_2d);
 | 
			
		||||
 | 
			
		||||
#endif /* _COGL_TEXTURE_2D_GL_PRIVATE_H_ */
 | 
			
		||||
 
 | 
			
		||||
@@ -470,7 +470,12 @@ allocate_custom_egl_image_external (CoglTexture2D *tex_2d,
 | 
			
		||||
{
 | 
			
		||||
  CoglTexture *tex = COGL_TEXTURE (tex_2d);
 | 
			
		||||
  CoglContext *ctx = tex->context;
 | 
			
		||||
  CoglPixelFormat internal_format = loader->src.egl_image_external.format;
 | 
			
		||||
  CoglPixelFormat external_format;
 | 
			
		||||
  CoglPixelFormat internal_format;
 | 
			
		||||
 | 
			
		||||
  external_format = loader->src.egl_image_external.format;
 | 
			
		||||
  internal_format = _cogl_texture_determine_internal_format (tex,
 | 
			
		||||
                                                             external_format);
 | 
			
		||||
 | 
			
		||||
  _cogl_gl_util_clear_gl_errors (ctx);
 | 
			
		||||
 | 
			
		||||
@@ -854,13 +859,22 @@ _cogl_texture_2d_gl_get_data (CoglTexture2D *tex_2d,
 | 
			
		||||
                                                    width,
 | 
			
		||||
                                                    bpp);
 | 
			
		||||
 | 
			
		||||
  _cogl_bind_gl_texture_transient (GL_TEXTURE_2D,
 | 
			
		||||
  _cogl_bind_gl_texture_transient (tex_2d->gl_target,
 | 
			
		||||
                                   tex_2d->gl_texture,
 | 
			
		||||
                                   tex_2d->is_foreign);
 | 
			
		||||
 | 
			
		||||
  ctx->texture_driver->gl_get_tex_image (ctx,
 | 
			
		||||
                                         GL_TEXTURE_2D,
 | 
			
		||||
                                         tex_2d->gl_target,
 | 
			
		||||
                                         gl_format,
 | 
			
		||||
                                         gl_type,
 | 
			
		||||
                                         data);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CoglBool
 | 
			
		||||
_cogl_texture_2d_gl_is_get_data_supported (CoglTexture2D *tex_2d)
 | 
			
		||||
{
 | 
			
		||||
  if (tex_2d->gl_target == GL_TEXTURE_EXTERNAL_OES)
 | 
			
		||||
    return FALSE;
 | 
			
		||||
  else
 | 
			
		||||
    return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -714,6 +714,7 @@ _cogl_driver_gl =
 | 
			
		||||
    _cogl_texture_2d_gl_generate_mipmap,
 | 
			
		||||
    _cogl_texture_2d_gl_copy_from_bitmap,
 | 
			
		||||
    _cogl_texture_2d_gl_get_data,
 | 
			
		||||
    _cogl_texture_2d_gl_is_get_data_supported,
 | 
			
		||||
    _cogl_gl_flush_attributes_state,
 | 
			
		||||
    _cogl_clip_stack_gl_flush,
 | 
			
		||||
    _cogl_buffer_gl_create,
 | 
			
		||||
 
 | 
			
		||||
@@ -493,6 +493,7 @@ _cogl_driver_gles =
 | 
			
		||||
    _cogl_texture_2d_gl_generate_mipmap,
 | 
			
		||||
    _cogl_texture_2d_gl_copy_from_bitmap,
 | 
			
		||||
    NULL, /* texture_2d_get_data */
 | 
			
		||||
    NULL, /* texture_2d_is_get_data_supported */
 | 
			
		||||
    _cogl_gl_flush_attributes_state,
 | 
			
		||||
    _cogl_clip_stack_gl_flush,
 | 
			
		||||
    _cogl_buffer_gl_create,
 | 
			
		||||
 
 | 
			
		||||
@@ -82,6 +82,7 @@ _cogl_driver_nop =
 | 
			
		||||
    _cogl_texture_2d_nop_generate_mipmap,
 | 
			
		||||
    _cogl_texture_2d_nop_copy_from_bitmap,
 | 
			
		||||
    NULL, /* texture_2d_get_data */
 | 
			
		||||
    NULL, /* texture_2d_is_get_data_supported */
 | 
			
		||||
    _cogl_nop_flush_attributes_state,
 | 
			
		||||
    _cogl_clip_stack_nop_flush,
 | 
			
		||||
  };
 | 
			
		||||
 
 | 
			
		||||
@@ -1180,5 +1180,6 @@ cogl_texture_pixmap_x11_vtable =
 | 
			
		||||
    _cogl_texture_pixmap_x11_get_gl_format,
 | 
			
		||||
    _cogl_texture_pixmap_x11_get_type,
 | 
			
		||||
    NULL, /* is_foreign */
 | 
			
		||||
    NULL /* set_auto_mipmap */
 | 
			
		||||
    NULL, /* set_auto_mipmap */
 | 
			
		||||
    NULL  /* is_get_data_supported */
 | 
			
		||||
  };
 | 
			
		||||
 
 | 
			
		||||
@@ -90,6 +90,11 @@ typedef struct _CoglWinsysEGLVtable
 | 
			
		||||
  (* add_config_attributes) (CoglDisplay *display,
 | 
			
		||||
                             CoglFramebufferConfig *config,
 | 
			
		||||
                             EGLint *attributes);
 | 
			
		||||
  CoglBool
 | 
			
		||||
  (* choose_config) (CoglDisplay *display,
 | 
			
		||||
                     EGLint *attributes,
 | 
			
		||||
                     EGLConfig *out_config,
 | 
			
		||||
                     CoglError **error);
 | 
			
		||||
} CoglWinsysEGLVtable;
 | 
			
		||||
 | 
			
		||||
typedef enum _CoglEGLWinsysFeature
 | 
			
		||||
@@ -176,6 +181,9 @@ _cogl_winsys_egl_make_current (CoglDisplay *display,
 | 
			
		||||
                               EGLSurface read,
 | 
			
		||||
                               EGLContext context);
 | 
			
		||||
 | 
			
		||||
EGLBoolean
 | 
			
		||||
_cogl_winsys_egl_ensure_current (CoglDisplay *display);
 | 
			
		||||
 | 
			
		||||
#ifdef EGL_KHR_image_base
 | 
			
		||||
EGLImageKHR
 | 
			
		||||
_cogl_egl_create_image (CoglContext *ctx,
 | 
			
		||||
 
 | 
			
		||||
@@ -336,6 +336,32 @@ _cogl_winsys_egl_add_config_attributes (CoglDisplay *display,
 | 
			
		||||
  return i;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static CoglBool
 | 
			
		||||
_cogl_winsys_egl_choose_config (CoglDisplay *display,
 | 
			
		||||
                                EGLint *attributes,
 | 
			
		||||
                                EGLConfig *out_config,
 | 
			
		||||
                                CoglError **error)
 | 
			
		||||
{
 | 
			
		||||
  CoglRenderer *renderer = display->renderer;
 | 
			
		||||
  CoglRendererEGL *egl_renderer = renderer->winsys;
 | 
			
		||||
  EGLint config_count = 0;
 | 
			
		||||
  EGLBoolean status;
 | 
			
		||||
 | 
			
		||||
  status = eglChooseConfig (egl_renderer->edpy,
 | 
			
		||||
                            attributes,
 | 
			
		||||
                            out_config, 1,
 | 
			
		||||
                            &config_count);
 | 
			
		||||
  if (status != EGL_TRUE || config_count == 0)
 | 
			
		||||
    {
 | 
			
		||||
      _cogl_set_error (error, COGL_WINSYS_ERROR,
 | 
			
		||||
                       COGL_WINSYS_ERROR_CREATE_CONTEXT,
 | 
			
		||||
                       "No compatible EGL configs found");
 | 
			
		||||
      return FALSE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static CoglBool
 | 
			
		||||
_cogl_winsys_egl_display_setup (CoglDisplay *display,
 | 
			
		||||
                                CoglError **error)
 | 
			
		||||
@@ -841,6 +867,7 @@ static const CoglWinsysEGLVtable
 | 
			
		||||
_cogl_winsys_egl_vtable =
 | 
			
		||||
  {
 | 
			
		||||
    .add_config_attributes = _cogl_winsys_egl_add_config_attributes,
 | 
			
		||||
    .choose_config = _cogl_winsys_egl_choose_config,
 | 
			
		||||
    .display_setup = _cogl_winsys_egl_display_setup,
 | 
			
		||||
    .display_destroy = _cogl_winsys_egl_display_destroy,
 | 
			
		||||
    .context_created = _cogl_winsys_egl_context_created,
 | 
			
		||||
 
 | 
			
		||||
@@ -309,6 +309,18 @@ _cogl_winsys_egl_make_current (CoglDisplay *display,
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
EGLBoolean
 | 
			
		||||
_cogl_winsys_egl_ensure_current (CoglDisplay *display)
 | 
			
		||||
{
 | 
			
		||||
  CoglDisplayEGL *egl_display = display->winsys;
 | 
			
		||||
  CoglRendererEGL *egl_renderer = display->renderer->winsys;
 | 
			
		||||
 | 
			
		||||
  return eglMakeCurrent (egl_renderer->edpy,
 | 
			
		||||
                         egl_display->current_draw_surface,
 | 
			
		||||
                         egl_display->current_read_surface,
 | 
			
		||||
                         egl_display->current_context);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
cleanup_context (CoglDisplay *display)
 | 
			
		||||
{
 | 
			
		||||
@@ -338,10 +350,9 @@ try_create_context (CoglDisplay *display,
 | 
			
		||||
  CoglRendererEGL *egl_renderer = renderer->winsys;
 | 
			
		||||
  EGLDisplay edpy;
 | 
			
		||||
  EGLConfig config;
 | 
			
		||||
  EGLint config_count = 0;
 | 
			
		||||
  EGLBoolean status;
 | 
			
		||||
  EGLint attribs[9];
 | 
			
		||||
  EGLint cfg_attribs[MAX_EGL_CONFIG_ATTRIBS];
 | 
			
		||||
  GError *config_error = NULL;
 | 
			
		||||
  const char *error_message;
 | 
			
		||||
 | 
			
		||||
  _COGL_RETURN_VAL_IF_FAIL (egl_display->egl_context == NULL, TRUE);
 | 
			
		||||
@@ -356,14 +367,16 @@ try_create_context (CoglDisplay *display,
 | 
			
		||||
 | 
			
		||||
  edpy = egl_renderer->edpy;
 | 
			
		||||
 | 
			
		||||
  status = eglChooseConfig (edpy,
 | 
			
		||||
                            cfg_attribs,
 | 
			
		||||
                            &config, 1,
 | 
			
		||||
                            &config_count);
 | 
			
		||||
  if (status != EGL_TRUE || config_count == 0)
 | 
			
		||||
  if (!egl_renderer->platform_vtable->choose_config (display,
 | 
			
		||||
                                                     cfg_attribs,
 | 
			
		||||
                                                     &config,
 | 
			
		||||
                                                     &config_error))
 | 
			
		||||
    {
 | 
			
		||||
      error_message = "Unable to find a usable EGL configuration";
 | 
			
		||||
      goto fail;
 | 
			
		||||
      _cogl_set_error (error, COGL_WINSYS_ERROR,
 | 
			
		||||
                       COGL_WINSYS_ERROR_CREATE_CONTEXT,
 | 
			
		||||
                       "Couldn't choose config: %s", config_error->message);
 | 
			
		||||
      g_error_free (config_error);
 | 
			
		||||
      goto err;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  egl_display->egl_config = config;
 | 
			
		||||
@@ -419,6 +432,7 @@ fail:
 | 
			
		||||
               COGL_WINSYS_ERROR_CREATE_CONTEXT,
 | 
			
		||||
               "%s", error_message);
 | 
			
		||||
 | 
			
		||||
err:
 | 
			
		||||
  cleanup_context (display);
 | 
			
		||||
 | 
			
		||||
  return FALSE;
 | 
			
		||||
@@ -488,6 +502,7 @@ _cogl_winsys_context_init (CoglContext *context, CoglError **error)
 | 
			
		||||
  CoglRenderer *renderer = context->display->renderer;
 | 
			
		||||
  CoglDisplayEGL *egl_display = context->display->winsys;
 | 
			
		||||
  CoglRendererEGL *egl_renderer = renderer->winsys;
 | 
			
		||||
  CoglGpuInfo *info;
 | 
			
		||||
 | 
			
		||||
  context->winsys = g_new0 (CoglContextEGL, 1);
 | 
			
		||||
 | 
			
		||||
@@ -500,6 +515,16 @@ _cogl_winsys_context_init (CoglContext *context, CoglError **error)
 | 
			
		||||
  if (!_cogl_context_update_features (context, error))
 | 
			
		||||
    return FALSE;
 | 
			
		||||
 | 
			
		||||
  info = &context->gpu;
 | 
			
		||||
 | 
			
		||||
  if (info->vendor == COGL_GPU_INFO_VENDOR_NVIDIA)
 | 
			
		||||
    {
 | 
			
		||||
      context->feature_flags |= COGL_FEATURE_UNSTABLE_TEXTURES;
 | 
			
		||||
      COGL_FLAGS_SET (context->features,
 | 
			
		||||
                      COGL_FEATURE_ID_UNSTABLE_TEXTURES,
 | 
			
		||||
                      TRUE);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (egl_renderer->private_features & COGL_EGL_WINSYS_FEATURE_SWAP_REGION)
 | 
			
		||||
    {
 | 
			
		||||
      COGL_FLAGS_SET (context->winsys_features,
 | 
			
		||||
 
 | 
			
		||||
@@ -832,12 +832,15 @@ update_winsys_features (CoglContext *context, CoglError **error)
 | 
			
		||||
{
 | 
			
		||||
  CoglGLXDisplay *glx_display = context->display->winsys;
 | 
			
		||||
  CoglGLXRenderer *glx_renderer = context->display->renderer->winsys;
 | 
			
		||||
  CoglGpuInfo *info;
 | 
			
		||||
 | 
			
		||||
  _COGL_RETURN_VAL_IF_FAIL (glx_display->glx_context, FALSE);
 | 
			
		||||
 | 
			
		||||
  if (!_cogl_context_update_features (context, error))
 | 
			
		||||
    return FALSE;
 | 
			
		||||
 | 
			
		||||
  info = &context->gpu;
 | 
			
		||||
 | 
			
		||||
  memcpy (context->winsys_features,
 | 
			
		||||
          glx_renderer->base_winsys_features,
 | 
			
		||||
          sizeof (context->winsys_features));
 | 
			
		||||
@@ -850,7 +853,6 @@ update_winsys_features (CoglContext *context, CoglError **error)
 | 
			
		||||
 | 
			
		||||
  if (glx_renderer->glXCopySubBuffer || context->glBlitFramebuffer)
 | 
			
		||||
    {
 | 
			
		||||
      CoglGpuInfo *info = &context->gpu;
 | 
			
		||||
      CoglGpuInfoArchitecture arch = info->architecture;
 | 
			
		||||
 | 
			
		||||
      COGL_FLAGS_SET (context->winsys_features, COGL_WINSYS_FEATURE_SWAP_REGION, TRUE);
 | 
			
		||||
@@ -899,7 +901,6 @@ update_winsys_features (CoglContext *context, CoglError **error)
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      CoglGpuInfo *info = &context->gpu;
 | 
			
		||||
      if (glx_display->have_vblank_counter &&
 | 
			
		||||
	  context->display->renderer->xlib_enable_threaded_swap_wait &&
 | 
			
		||||
	  info->vendor == COGL_GPU_INFO_VENDOR_NVIDIA)
 | 
			
		||||
@@ -921,6 +922,14 @@ update_winsys_features (CoglContext *context, CoglError **error)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (info->vendor == COGL_GPU_INFO_VENDOR_NVIDIA)
 | 
			
		||||
    {
 | 
			
		||||
      context->feature_flags |= COGL_FEATURE_UNSTABLE_TEXTURES;
 | 
			
		||||
      COGL_FLAGS_SET (context->features,
 | 
			
		||||
                      COGL_FEATURE_ID_UNSTABLE_TEXTURES,
 | 
			
		||||
                      TRUE);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* We'll manually handle queueing dirty events in response to
 | 
			
		||||
   * Expose events from X */
 | 
			
		||||
  COGL_FLAGS_SET (context->private_features,
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										69
									
								
								configure.ac
									
									
									
									
									
								
							
							
						
						
									
										69
									
								
								configure.ac
									
									
									
									
									
								
							@@ -1,15 +1,15 @@
 | 
			
		||||
AC_PREREQ(2.62)
 | 
			
		||||
 | 
			
		||||
m4_define([mutter_major_version], [3])
 | 
			
		||||
m4_define([mutter_minor_version], [25])
 | 
			
		||||
m4_define([mutter_micro_version], [91])
 | 
			
		||||
m4_define([mutter_minor_version], [28])
 | 
			
		||||
m4_define([mutter_micro_version], [3])
 | 
			
		||||
 | 
			
		||||
m4_define([mutter_version],
 | 
			
		||||
          [mutter_major_version.mutter_minor_version.mutter_micro_version])
 | 
			
		||||
 | 
			
		||||
m4_define([mutter_plugin_api_version], [3])
 | 
			
		||||
 | 
			
		||||
m4_define([libmutter_api_version], [1])
 | 
			
		||||
m4_define([libmutter_api_version], [2])
 | 
			
		||||
 | 
			
		||||
AC_INIT([mutter], [mutter_version],
 | 
			
		||||
        [http://bugzilla.gnome.org/enter_bug.cgi?product=mutter])
 | 
			
		||||
@@ -80,6 +80,7 @@ CANBERRA_GTK_VERSION=0.26
 | 
			
		||||
LIBWACOM_VERSION=0.13
 | 
			
		||||
 | 
			
		||||
MUTTER_PC_MODULES="
 | 
			
		||||
   gl
 | 
			
		||||
   egl
 | 
			
		||||
   gtk+-3.0 >= 3.19.8
 | 
			
		||||
   gio-unix-2.0 >= 2.35.1
 | 
			
		||||
@@ -104,6 +105,7 @@ MUTTER_PC_MODULES="
 | 
			
		||||
   xcb-randr
 | 
			
		||||
   xcb-res
 | 
			
		||||
"
 | 
			
		||||
XWAYLAND_GRAB_DEFAULT_ACCESS_RULES="gnome-boxes,remote-viewer,virt-viewer,virt-manager,vinagre,vncviewer,Xephyr"
 | 
			
		||||
 | 
			
		||||
GLIB_GSETTINGS
 | 
			
		||||
 | 
			
		||||
@@ -225,10 +227,10 @@ AC_MSG_CHECKING([gudev])
 | 
			
		||||
if test x$with_gudev = xno ; then
 | 
			
		||||
  AC_MSG_RESULT([disabled])
 | 
			
		||||
else
 | 
			
		||||
  if $PKG_CONFIG --exists gudev-1.0; then
 | 
			
		||||
  if $PKG_CONFIG --exists "gudev-1.0 >= 232"; then
 | 
			
		||||
    have_gudev=yes
 | 
			
		||||
    AC_MSG_RESULT(yes)
 | 
			
		||||
    MUTTER_PC_MODULES="$MUTTER_PC_MODULES gudev-1.0"
 | 
			
		||||
    MUTTER_PC_MODULES="$MUTTER_PC_MODULES gudev-1.0 >= 232"
 | 
			
		||||
    AC_DEFINE([HAVE_LIBGUDEV], 1, [Building with gudev for device type detection])
 | 
			
		||||
  else
 | 
			
		||||
    AC_MSG_RESULT(no)
 | 
			
		||||
@@ -238,6 +240,16 @@ else
 | 
			
		||||
  fi
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
AC_ARG_ENABLE(remote-desktop,
 | 
			
		||||
  AS_HELP_STRING([--enable-remote-desktop], [enable support for remote desktop and screen cast]),,
 | 
			
		||||
  enable_remote_desktop=no
 | 
			
		||||
)
 | 
			
		||||
AS_IF([test "$enable_remote_desktop" = "yes"], [
 | 
			
		||||
  MUTTER_PC_MODULES="$MUTTER_PC_MODULES libpipewire-0.2 >= 0.2.5"
 | 
			
		||||
  AC_DEFINE([HAVE_REMOTE_DESKTOP],[1], [Defined if screen cast and remote desktop support is enabled])
 | 
			
		||||
])
 | 
			
		||||
AM_CONDITIONAL([HAVE_REMOTE_DESKTOP],[test "$enable_remote_desktop" = "yes"])
 | 
			
		||||
 | 
			
		||||
INTROSPECTION_VERSION=0.9.5
 | 
			
		||||
GOBJECT_INTROSPECTION_CHECK([$INTROSPECTION_VERSION])
 | 
			
		||||
 | 
			
		||||
@@ -250,7 +262,19 @@ AC_SUBST(XWAYLAND_PATH)
 | 
			
		||||
 | 
			
		||||
PKG_CHECK_MODULES(MUTTER, $MUTTER_PC_MODULES)
 | 
			
		||||
 | 
			
		||||
MUTTER_NATIVE_BACKEND_MODULES="libdrm libsystemd libinput >= 1.4 gudev-1.0 gbm >= 10.3"
 | 
			
		||||
PKG_CHECK_MODULES(ELOGIND, [libelogind], [have_elogind=yes], [have_elogind=no])
 | 
			
		||||
 | 
			
		||||
if test x$have_elogind = xyes; then
 | 
			
		||||
     logind_provider="libelogind"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
PKG_CHECK_MODULES(SYSTEMD, [libsystemd], [have_systemd=yes], [have_systemd=no])
 | 
			
		||||
 | 
			
		||||
if test x$have_systemd = xyes -o -z "$logind_provider"; then
 | 
			
		||||
     logind_provider="libsystemd"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
MUTTER_NATIVE_BACKEND_MODULES="libdrm $logind_provider libinput >= 1.4 gudev-1.0 gbm >= 10.3"
 | 
			
		||||
 | 
			
		||||
AC_ARG_ENABLE(native-backend,
 | 
			
		||||
  AS_HELP_STRING([--disable-native-backend], [disable mutter native (KMS) backend]),,
 | 
			
		||||
@@ -266,14 +290,24 @@ AS_IF([test "$have_native_backend" = "yes"], [
 | 
			
		||||
])
 | 
			
		||||
AM_CONDITIONAL([HAVE_NATIVE_BACKEND],[test "$have_native_backend" = "yes"])
 | 
			
		||||
 | 
			
		||||
MUTTER_WAYLAND_EGLSTREAM_MODULES="wayland-eglstream-protocols"
 | 
			
		||||
 | 
			
		||||
AC_ARG_ENABLE(egl-device,
 | 
			
		||||
  AS_HELP_STRING([--enable-egl-device], [enable support for EGLDevice on top of KMS]),
 | 
			
		||||
  enable_egl_device=yes,
 | 
			
		||||
  AS_HELP_STRING([--enable-egl-device], [enable support for EGLDevice on top of KMS]),,
 | 
			
		||||
  enable_egl_device=no
 | 
			
		||||
  have_wayland_eglstream=no
 | 
			
		||||
)
 | 
			
		||||
AS_IF([test "$enable_egl_device" = "yes"], [
 | 
			
		||||
  AC_DEFINE([HAVE_EGL_DEVICE],[1], [Defined if EGLDevice support is enabled])
 | 
			
		||||
  PKG_CHECK_EXISTS([$MUTTER_WAYLAND_EGLSTREAM_MODULES], [have_wayland_eglstream=yes], [have_wayland_eglstream=no])
 | 
			
		||||
])
 | 
			
		||||
AS_IF([test "$have_wayland_eglstream" = "yes"], [
 | 
			
		||||
  AC_DEFINE([HAVE_WAYLAND_EGLSTREAM],[1],[Defined if Wayland EGLStream protocols are available])
 | 
			
		||||
  PKG_CHECK_MODULES(WAYLAND_EGLSTREAM, [$MUTTER_WAYLAND_EGLSTREAM_MODULES],
 | 
			
		||||
                    [ac_wayland_eglstream_pkgdatadir=`$PKG_CONFIG --variable=pkgdatadir $MUTTER_WAYLAND_EGLSTREAM_MODULES`])
 | 
			
		||||
  AC_SUBST(WAYLAND_EGLSTREAM_DATADIR, $ac_wayland_eglstream_pkgdatadir)
 | 
			
		||||
])
 | 
			
		||||
AM_CONDITIONAL([HAVE_WAYLAND_EGLSTREAM],[test "$have_wayland_eglstream" = "yes"])
 | 
			
		||||
 | 
			
		||||
MUTTER_WAYLAND_MODULES="wayland-server >= 1.13.0"
 | 
			
		||||
 | 
			
		||||
@@ -292,12 +326,27 @@ AS_IF([test "$have_wayland" = "yes"], [
 | 
			
		||||
  AC_SUBST([WAYLAND_SCANNER])
 | 
			
		||||
  AC_DEFINE([HAVE_WAYLAND],[1],[Define if you want to enable Wayland support])
 | 
			
		||||
 | 
			
		||||
  PKG_CHECK_MODULES(WAYLAND_PROTOCOLS, [wayland-protocols >= 1.9],
 | 
			
		||||
  PKG_CHECK_MODULES(WAYLAND_PROTOCOLS, [wayland-protocols >= 1.12],
 | 
			
		||||
		    [ac_wayland_protocols_pkgdatadir=`$PKG_CONFIG --variable=pkgdatadir wayland-protocols`])
 | 
			
		||||
  AC_SUBST(WAYLAND_PROTOCOLS_DATADIR, $ac_wayland_protocols_pkgdatadir)
 | 
			
		||||
])
 | 
			
		||||
AM_CONDITIONAL([HAVE_WAYLAND],[test "$have_wayland" = "yes"])
 | 
			
		||||
 | 
			
		||||
AC_ARG_WITH([xwayland-grab-default-access-rules],
 | 
			
		||||
    [AS_HELP_STRING([--with-xwayland-grab-default-access-rules="app-res1,app-res2,..."],
 | 
			
		||||
        [comma delimited list of applications ressources or class allowed to issue X11 grabs in Xwayland"])],
 | 
			
		||||
    [with_XWAYLAND_GRAB_DEFAULT_ACCESS_RULES="$withval"],
 | 
			
		||||
    [with_XWAYLAND_GRAB_DEFAULT_ACCESS_RULES="$XWAYLAND_GRAB_DEFAULT_ACCESS_RULES"])
 | 
			
		||||
 | 
			
		||||
case "$with_XWAYLAND_GRAB_DEFAULT_ACCESS_RULES" in
 | 
			
		||||
    yes) with_XWAYLAND_GRAB_DEFAULT_ACCESS_RULES="$XWAYLAND_GRAB_DEFAULT_ACCESS_RULES" ;;
 | 
			
		||||
    no) with_XWAYLAND_GRAB_DEFAULT_ACCESS_RULES='' ;;
 | 
			
		||||
esac
 | 
			
		||||
AC_DEFINE_UNQUOTED([XWAYLAND_GRAB_DEFAULT_ACCESS_RULES],
 | 
			
		||||
                    "$with_XWAYLAND_GRAB_DEFAULT_ACCESS_RULES",
 | 
			
		||||
                    [Xwayland applications allowed to issue keyboard grabs])
 | 
			
		||||
AC_SUBST(XWAYLAND_GRAB_DEFAULT_ACCESS_RULES)
 | 
			
		||||
 | 
			
		||||
PKG_CHECK_EXISTS([xi >= 1.6.99.1],
 | 
			
		||||
                 AC_DEFINE([HAVE_XI23],[1],[Define if you have support for XInput 2.3 or greater]))
 | 
			
		||||
 | 
			
		||||
@@ -511,8 +560,10 @@ mutter-$VERSION
 | 
			
		||||
	Introspection:            ${found_introspection}
 | 
			
		||||
	Session management:       ${found_sm}
 | 
			
		||||
	Wayland:                  ${have_wayland}
 | 
			
		||||
	Wayland EGLStream:        ${have_wayland_eglstream}
 | 
			
		||||
	Native (KMS) backend:     ${have_native_backend}
 | 
			
		||||
	EGLDevice:                ${enable_egl_device}
 | 
			
		||||
	Remote desktop:           ${enable_remote_desktop}
 | 
			
		||||
"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -20,12 +20,6 @@
 | 
			
		||||
        <KeyListEntry name="move-to-workspace-last"
 | 
			
		||||
                      description="Move window to last workspace" />
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="move-to-workspace-left"
 | 
			
		||||
	              description="Move window one workspace to the left" />
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="move-to-workspace-right"
 | 
			
		||||
	              description="Move window one workspace to the right" />
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="move-to-workspace-up"
 | 
			
		||||
	              description="Move window one workspace up" />
 | 
			
		||||
 | 
			
		||||
@@ -125,12 +119,6 @@
 | 
			
		||||
	<KeyListEntry name="switch-to-workspace-last"
 | 
			
		||||
	              description="Switch to last workspace" />
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="switch-to-workspace-left"
 | 
			
		||||
	              description="Move to workspace left" />
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="switch-to-workspace-right"
 | 
			
		||||
	              description="Move to workspace right" />
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="switch-to-workspace-up"
 | 
			
		||||
	              description="Move to workspace above" />
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										10
									
								
								data/50-mutter-wayland.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								data/50-mutter-wayland.xml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8" ?>
 | 
			
		||||
<KeyListEntries schema="org.gnome.mutter.wayland.keybindings"
 | 
			
		||||
                group="system"
 | 
			
		||||
                name="System"
 | 
			
		||||
                wm_name="Mutter"
 | 
			
		||||
                package="mutter">
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="restore-shortcuts" description="Restore the keyboard shortcuts"/>
 | 
			
		||||
 | 
			
		||||
</KeyListEntries>
 | 
			
		||||
@@ -15,8 +15,6 @@
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="unmaximize" description="Restore window"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="toggle-shaded" description="Toggle shaded state"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="close" description="Close window"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="minimize" description="Hide window"/>
 | 
			
		||||
 
 | 
			
		||||
@@ -12,6 +12,11 @@ xml_DATA = \
 | 
			
		||||
        50-mutter-system.xml \
 | 
			
		||||
        50-mutter-windows.xml
 | 
			
		||||
 | 
			
		||||
if HAVE_WAYLAND
 | 
			
		||||
xml_DATA += \
 | 
			
		||||
        50-mutter-wayland.xml
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
gschema_in_files = \
 | 
			
		||||
	org.gnome.mutter.gschema.xml.in	\
 | 
			
		||||
	org.gnome.mutter.wayland.gschema.xml.in
 | 
			
		||||
@@ -19,6 +24,7 @@ gsettings_SCHEMAS = $(gschema_in_files:.xml.in=.xml)
 | 
			
		||||
 | 
			
		||||
%.gschema.xml: %.gschema.xml.in Makefile
 | 
			
		||||
	$(AM_V_GEN) sed -e 's|@GETTEXT_DOMAIN[@]|$(GETTEXT_PACKAGE)|g' \
 | 
			
		||||
	                -e 's|@XWAYLAND_GRAB_DEFAULT_ACCESS_RULES[@]|$(XWAYLAND_GRAB_DEFAULT_ACCESS_RULES)|g' \
 | 
			
		||||
	$< > $@ || rm $@
 | 
			
		||||
 | 
			
		||||
@GSETTINGS_RULES@
 | 
			
		||||
 
 | 
			
		||||
@@ -50,8 +50,52 @@
 | 
			
		||||
      <summary>Switch to VT 12</summary>
 | 
			
		||||
    </key>
 | 
			
		||||
    <key name="restore-shortcuts" type="as">
 | 
			
		||||
      <default><![CDATA[['<Shift><Control>Escape']]]></default>
 | 
			
		||||
      <default><![CDATA[['<Super>Escape']]]></default>
 | 
			
		||||
      <summary>Re-enable shortcuts</summary>
 | 
			
		||||
    </key>
 | 
			
		||||
  </schema>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  <schema id="org.gnome.mutter.wayland" path="/org/gnome/mutter/wayland/"
 | 
			
		||||
          gettext-domain="@GETTEXT_DOMAIN@">
 | 
			
		||||
 | 
			
		||||
    <key name="xwayland-allow-grabs" type="b">
 | 
			
		||||
      <default>true</default>
 | 
			
		||||
      <summary>Allow grabs with Xwayland</summary>
 | 
			
		||||
      <description>
 | 
			
		||||
        Allow keyboard grabs issued by X11 applications running in Xwayland
 | 
			
		||||
        to be taken into account.
 | 
			
		||||
 | 
			
		||||
        For a X11 grab to be taken into account under Wayland, the client must
 | 
			
		||||
        also either send a specific X11 ClientMessage to the root window or be
 | 
			
		||||
        among the applications white-listed in key “xwayland-grab-access-rules”.
 | 
			
		||||
      </description>
 | 
			
		||||
    </key>
 | 
			
		||||
 | 
			
		||||
    <key name="xwayland-grab-access-rules" type="as">
 | 
			
		||||
      <default>['@XWAYLAND_GRAB_DEFAULT_ACCESS_RULES@']</default>
 | 
			
		||||
      <summary>Xwayland applications allowed to issue keyboard grabs</summary>
 | 
			
		||||
      <description>
 | 
			
		||||
        List the resource names or resource class of X11 windows either
 | 
			
		||||
        allowed or not allowed to issue X11 keyboard grabs under Xwayland.
 | 
			
		||||
 | 
			
		||||
        The resource name or resource class of a given X11 window can be
 | 
			
		||||
        obtained using the command “xprop WM_CLASS”.
 | 
			
		||||
 | 
			
		||||
        Wildcards “*” and jokers “?” in the values are supported.
 | 
			
		||||
 | 
			
		||||
        Values starting with “!” are blacklisted, which has precedence over
 | 
			
		||||
        the whitelist, to revoke applications from the default system list.
 | 
			
		||||
 | 
			
		||||
        The default system list includes the following applications:
 | 
			
		||||
 | 
			
		||||
        “@XWAYLAND_GRAB_DEFAULT_ACCESS_RULES@”
 | 
			
		||||
 | 
			
		||||
        Users can break an existing grab by using the specific keyboard
 | 
			
		||||
        shortcut defined by the keybinding key “restore-shortcuts”.
 | 
			
		||||
      </description>
 | 
			
		||||
    </key>
 | 
			
		||||
 | 
			
		||||
  </schema>
 | 
			
		||||
 | 
			
		||||
</schemalist>
 | 
			
		||||
 
 | 
			
		||||
@@ -2,6 +2,7 @@
 | 
			
		||||
# Please keep this file sorted alphabetically.
 | 
			
		||||
data/50-mutter-navigation.xml
 | 
			
		||||
data/50-mutter-system.xml
 | 
			
		||||
data/50-mutter-wayland.xml
 | 
			
		||||
data/50-mutter-windows.xml
 | 
			
		||||
data/mutter.desktop.in
 | 
			
		||||
data/org.gnome.mutter.gschema.xml.in
 | 
			
		||||
 
 | 
			
		||||
@@ -28,6 +28,7 @@ clutter/clutter/clutter-grid-layout.c
 | 
			
		||||
clutter/clutter/clutter-image.c
 | 
			
		||||
clutter/clutter/clutter-input-device.c
 | 
			
		||||
clutter/clutter/clutter-input-device-tool.c
 | 
			
		||||
clutter/clutter/clutter-input-method.c
 | 
			
		||||
clutter/clutter/clutter-interval.c
 | 
			
		||||
clutter/clutter/clutter-layout-manager.c
 | 
			
		||||
clutter/clutter/clutter-layout-meta.c
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										771
									
								
								po/ar.po
									
									
									
									
									
								
							
							
						
						
									
										771
									
								
								po/ar.po
									
									
									
									
									
								
							@@ -11,8 +11,8 @@ msgstr ""
 | 
			
		||||
"Project-Id-Version: metacity.HEAD\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=mutter&"
 | 
			
		||||
"keywords=I18N+L10N&component=general\n"
 | 
			
		||||
"POT-Creation-Date: 2017-06-18 21:26+0200\n"
 | 
			
		||||
"PO-Revision-Date: 2017-06-18 21:27+0200\n"
 | 
			
		||||
"POT-Creation-Date: 2017-11-03 10:20+0200\n"
 | 
			
		||||
"PO-Revision-Date: 2017-11-03 10:22+0200\n"
 | 
			
		||||
"Last-Translator: Khaled Hosny <khaledhosny@eglug.org>\n"
 | 
			
		||||
"Language-Team: Arabic <doc@arabeyes.org>\n"
 | 
			
		||||
"Language: ar\n"
 | 
			
		||||
@@ -24,448 +24,10 @@ msgstr ""
 | 
			
		||||
"X-Generator: Virtaal 1.0.0-beta1\n"
 | 
			
		||||
"X-Project-Style: gnome\n"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:6
 | 
			
		||||
msgid "Navigation"
 | 
			
		||||
msgstr "الإبحار"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:9
 | 
			
		||||
msgid "Move window to workspace 1"
 | 
			
		||||
msgstr "انقل النافذة إلى مساحة العمل 1"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:12
 | 
			
		||||
msgid "Move window to workspace 2"
 | 
			
		||||
msgstr "انقل النافذة إلى مساحة العمل 2"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:15
 | 
			
		||||
msgid "Move window to workspace 3"
 | 
			
		||||
msgstr "انقل النافذة إلى مساحة العمل 3"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:18
 | 
			
		||||
msgid "Move window to workspace 4"
 | 
			
		||||
msgstr "انقل النافذة إلى مساحة العمل 4"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:21
 | 
			
		||||
msgid "Move window to last workspace"
 | 
			
		||||
msgstr "انقل النافذة إلى مساحة العمل الأخيرة"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:24
 | 
			
		||||
msgid "Move window one workspace to the left"
 | 
			
		||||
msgstr "انقل النافذة مساحة عمل واحدة إلى اليسار"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:27
 | 
			
		||||
msgid "Move window one workspace to the right"
 | 
			
		||||
msgstr "انقل النافذة مساحة عمل واحدة إلى اليمين"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:30
 | 
			
		||||
msgid "Move window one workspace up"
 | 
			
		||||
msgstr "انقل النافذة مساحة عمل واحدة إلى الأعلى"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:33
 | 
			
		||||
msgid "Move window one workspace down"
 | 
			
		||||
msgstr "انقل النافذة مساحة عمل واحدة إلى الأسفل"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:36
 | 
			
		||||
msgid "Move window one monitor to the left"
 | 
			
		||||
msgstr "انقل النافذة شاشة واحدة إلى اليسار"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:39
 | 
			
		||||
msgid "Move window one monitor to the right"
 | 
			
		||||
msgstr "انقل النافذة شاشة واحدة إلى اليمين"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:42
 | 
			
		||||
msgid "Move window one monitor up"
 | 
			
		||||
msgstr "انقل النافذة شاشة واحدة إلى الأعلى"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:45
 | 
			
		||||
msgid "Move window one monitor down"
 | 
			
		||||
msgstr "انقل النافذة شاشة واحدة إلى الأسفل"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:49
 | 
			
		||||
msgid "Switch applications"
 | 
			
		||||
msgstr "تنقل بين التطبيقات"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:54
 | 
			
		||||
msgid "Switch to previous application"
 | 
			
		||||
msgstr "انتقل إلى التطبيق السابق"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:58
 | 
			
		||||
msgid "Switch windows"
 | 
			
		||||
msgstr "تنقل بين النوافذ"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:63
 | 
			
		||||
msgid "Switch to previous window"
 | 
			
		||||
msgstr "انتقل إلى النافذة السابقة"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:67
 | 
			
		||||
msgid "Switch windows of an application"
 | 
			
		||||
msgstr "تنقل بين نوافذ التطبيق"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:72
 | 
			
		||||
msgid "Switch to previous window of an application"
 | 
			
		||||
msgstr "انتقل إلى نافذة التطبيق السابقة"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:76
 | 
			
		||||
msgid "Switch system controls"
 | 
			
		||||
msgstr "تنقل بين تحكمات النظام"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:81
 | 
			
		||||
msgid "Switch to previous system control"
 | 
			
		||||
msgstr "انتقل إلى تحكم النظام السابق"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:85
 | 
			
		||||
msgid "Switch windows directly"
 | 
			
		||||
msgstr "تنقل مباشرة بين النوافذ"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:90
 | 
			
		||||
msgid "Switch directly to previous window"
 | 
			
		||||
msgstr "انتقل مباشرة إلى النافذة السابقة"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:94
 | 
			
		||||
msgid "Switch windows of an app directly"
 | 
			
		||||
msgstr "تنقل مباشرة بين نوافذ التطبيق"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:99
 | 
			
		||||
msgid "Switch directly to previous window of an app"
 | 
			
		||||
msgstr "انتقل مباشرة إلى نافذة التطبيق السابقة"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:103
 | 
			
		||||
msgid "Switch system controls directly"
 | 
			
		||||
msgstr "تنقل مباشرة بين تحكمات النظام"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:108
 | 
			
		||||
msgid "Switch directly to previous system control"
 | 
			
		||||
msgstr "انتقل مباشرة إلى تحكم النظام السابق"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:111
 | 
			
		||||
msgid "Hide all normal windows"
 | 
			
		||||
msgstr "أخفِ كل النوافذ العادية"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:114
 | 
			
		||||
msgid "Switch to workspace 1"
 | 
			
		||||
msgstr "انتقل إلى مساحة العمل 1"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:117
 | 
			
		||||
msgid "Switch to workspace 2"
 | 
			
		||||
msgstr "انتقل إلى مساحة العمل 2"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:120
 | 
			
		||||
msgid "Switch to workspace 3"
 | 
			
		||||
msgstr "انتقل إلى مساحة العمل 3"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:123
 | 
			
		||||
msgid "Switch to workspace 4"
 | 
			
		||||
msgstr "انتقل إلى مساحة العمل 4"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:126
 | 
			
		||||
msgid "Switch to last workspace"
 | 
			
		||||
msgstr "انتقل إلى مساحة العمل الأخيرة"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:129
 | 
			
		||||
msgid "Move to workspace left"
 | 
			
		||||
msgstr "انقل لمساحة العمل على اليسار"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:132
 | 
			
		||||
msgid "Move to workspace right"
 | 
			
		||||
msgstr "انقل لمساحة العمل على اليمين"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:135
 | 
			
		||||
msgid "Move to workspace above"
 | 
			
		||||
msgstr "انقل لمساحة العمل أعلى"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:138
 | 
			
		||||
msgid "Move to workspace below"
 | 
			
		||||
msgstr "انقل لمساحة العمل أسفل"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-system.xml:6
 | 
			
		||||
msgid "System"
 | 
			
		||||
msgstr "النظام"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-system.xml:8
 | 
			
		||||
msgid "Show the run command prompt"
 | 
			
		||||
msgstr "أظهر محث تشغيل أمر"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-system.xml:10
 | 
			
		||||
msgid "Show the activities overview"
 | 
			
		||||
msgstr "أظهر نظرة عامة على الأنشطة"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-windows.xml:6
 | 
			
		||||
msgid "Windows"
 | 
			
		||||
msgstr "النوافذ"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-windows.xml:8
 | 
			
		||||
msgid "Activate the window menu"
 | 
			
		||||
msgstr "فعّل قائمة النافذة"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-windows.xml:10
 | 
			
		||||
msgid "Toggle fullscreen mode"
 | 
			
		||||
msgstr "بدّل نمط ملء الشاشة"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-windows.xml:12
 | 
			
		||||
msgid "Toggle maximization state"
 | 
			
		||||
msgstr "بدّل حالة التكبير"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-windows.xml:14
 | 
			
		||||
msgid "Maximize window"
 | 
			
		||||
msgstr "كبّر النّافذة"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-windows.xml:16
 | 
			
		||||
msgid "Restore window"
 | 
			
		||||
msgstr "استعد النّافذة"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-windows.xml:18
 | 
			
		||||
msgid "Toggle shaded state"
 | 
			
		||||
msgstr "بدّل حالة الإخفاء"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-windows.xml:20
 | 
			
		||||
msgid "Close window"
 | 
			
		||||
msgstr "أغلق النّافذة"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-windows.xml:22
 | 
			
		||||
msgid "Hide window"
 | 
			
		||||
msgstr "أخفِ النّافذة"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-windows.xml:24
 | 
			
		||||
msgid "Move window"
 | 
			
		||||
msgstr "انقل النّافذة"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-windows.xml:26
 | 
			
		||||
msgid "Resize window"
 | 
			
		||||
msgstr "حجّم النّافذة"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-windows.xml:29
 | 
			
		||||
msgid "Toggle window on all workspaces or one"
 | 
			
		||||
msgstr "بدّل حالة ظهور النافذة على جميع مساحات العمل أو واحدة منها"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-windows.xml:31
 | 
			
		||||
msgid "Raise window if covered, otherwise lower it"
 | 
			
		||||
msgstr "ارفع النافذة إذا كانت أخرى تغطيها، أو أخفضها في ما عدا ذلك"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-windows.xml:33
 | 
			
		||||
msgid "Raise window above other windows"
 | 
			
		||||
msgstr "ارفع النافذة فوق النوافذ الأخرى"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-windows.xml:35
 | 
			
		||||
msgid "Lower window below other windows"
 | 
			
		||||
msgstr "اخفض النافذة تحت النوافذ الأخرى"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-windows.xml:37
 | 
			
		||||
msgid "Maximize window vertically"
 | 
			
		||||
msgstr "كبّر النافذة رأسيا"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-windows.xml:39
 | 
			
		||||
msgid "Maximize window horizontally"
 | 
			
		||||
msgstr "كبّر النافذة أفقيا"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-windows.xml:43
 | 
			
		||||
msgid "View split on left"
 | 
			
		||||
msgstr "المنظور مقسوم على اليمين"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-windows.xml:47
 | 
			
		||||
msgid "View split on right"
 | 
			
		||||
msgstr "المنظور مقسوم على اليسار"
 | 
			
		||||
 | 
			
		||||
#: data/mutter.desktop.in:4
 | 
			
		||||
msgid "Mutter"
 | 
			
		||||
msgstr "مَتَر"
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:7
 | 
			
		||||
msgid "Modifier to use for extended window management operations"
 | 
			
		||||
msgstr "المغير الذي سيُستعمل لتمديد عمليات إدارة النوافذ "
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:8
 | 
			
		||||
msgid ""
 | 
			
		||||
"This key will initiate the “overlay”, which is a combination window overview "
 | 
			
		||||
"and application launching system. The default is intended to be the “Windows "
 | 
			
		||||
"key” on PC hardware. It’s expected that this binding either the default or "
 | 
			
		||||
"set to the empty string."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:20
 | 
			
		||||
msgid "Attach modal dialogs"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:21
 | 
			
		||||
msgid ""
 | 
			
		||||
"When true, instead of having independent titlebars, modal dialogs appear "
 | 
			
		||||
"attached to the titlebar of the parent window and are moved together with "
 | 
			
		||||
"the parent window."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:30
 | 
			
		||||
msgid "Enable edge tiling when dropping windows on screen edges"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:31
 | 
			
		||||
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 ""
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:40
 | 
			
		||||
msgid "Workspaces are managed dynamically"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:41
 | 
			
		||||
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 ""
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:50
 | 
			
		||||
msgid "Workspaces only on primary"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:51
 | 
			
		||||
msgid ""
 | 
			
		||||
"Determines whether workspace switching should happen for windows on all "
 | 
			
		||||
"monitors or only for windows on the primary monitor."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:59
 | 
			
		||||
msgid "No tab popup"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:60
 | 
			
		||||
msgid ""
 | 
			
		||||
"Determines whether the use of popup and highlight frame should be disabled "
 | 
			
		||||
"for window cycling."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:68
 | 
			
		||||
msgid "Delay focus changes until the pointer stops moving"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:69
 | 
			
		||||
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 ""
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:79
 | 
			
		||||
msgid "Draggable border width"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:80
 | 
			
		||||
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 ""
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:89
 | 
			
		||||
msgid "Auto maximize nearly monitor sized windows"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:90
 | 
			
		||||
msgid ""
 | 
			
		||||
"If enabled, new windows that are initially the size of the monitor "
 | 
			
		||||
"automatically get maximized."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:98
 | 
			
		||||
msgid "Place new windows in the center"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:99
 | 
			
		||||
msgid ""
 | 
			
		||||
"When true, the new windows will always be put in the center of the active "
 | 
			
		||||
"screen of the monitor."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:107
 | 
			
		||||
msgid "Enable experimental features"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:108
 | 
			
		||||
msgid ""
 | 
			
		||||
"To enable experimental features, add the feature keyword to the list. "
 | 
			
		||||
"Whether the feature requires restarting the compositor depends on the given "
 | 
			
		||||
"feature. Any experimental feature is not required to still be available, or "
 | 
			
		||||
"configurable. Don’t expect adding anything in this setting to be future "
 | 
			
		||||
"proof. Currently possible keywords: • “monitor-config-manager” — use the new "
 | 
			
		||||
"monitor configuration system, aimed to replace the old one. This enables a "
 | 
			
		||||
"higher level configuration API to be used by configuration applications, as "
 | 
			
		||||
"well as the ability to configure per logical monitor scale. • “scale-monitor-"
 | 
			
		||||
"framebuffer” — makes mutter default to layout logical monitors in a logical "
 | 
			
		||||
"pixel coordinate space, while scaling monitor framebuffers instead of window "
 | 
			
		||||
"content, to manage HiDPI monitors. Does not require a restart. Also enabling "
 | 
			
		||||
"“monitor-config-manager” is required for this feature to be enabled."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:151
 | 
			
		||||
msgid "Select window from tab popup"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:156
 | 
			
		||||
msgid "Cancel tab popup"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:6
 | 
			
		||||
#, fuzzy
 | 
			
		||||
msgid "Switch to VT 1"
 | 
			
		||||
msgstr "انتقل إلى مساحة العمل 1"
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:10
 | 
			
		||||
#, fuzzy
 | 
			
		||||
msgid "Switch to VT 2"
 | 
			
		||||
msgstr "انتقل إلى مساحة العمل 2"
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:14
 | 
			
		||||
#, fuzzy
 | 
			
		||||
msgid "Switch to VT 3"
 | 
			
		||||
msgstr "انتقل إلى مساحة العمل 3"
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:18
 | 
			
		||||
#, fuzzy
 | 
			
		||||
msgid "Switch to VT 4"
 | 
			
		||||
msgstr "انتقل إلى مساحة العمل 4"
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:22
 | 
			
		||||
#, fuzzy
 | 
			
		||||
msgid "Switch to VT 5"
 | 
			
		||||
msgstr "انتقل إلى مساحة العمل 5"
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:26
 | 
			
		||||
#, fuzzy
 | 
			
		||||
msgid "Switch to VT 6"
 | 
			
		||||
msgstr "انتقل إلى مساحة العمل 6"
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:30
 | 
			
		||||
#, fuzzy
 | 
			
		||||
msgid "Switch to VT 7"
 | 
			
		||||
msgstr "انتقل إلى مساحة العمل 7"
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:34
 | 
			
		||||
#, fuzzy
 | 
			
		||||
msgid "Switch to VT 8"
 | 
			
		||||
msgstr "انتقل إلى مساحة العمل 8"
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:38
 | 
			
		||||
#, fuzzy
 | 
			
		||||
msgid "Switch to VT 9"
 | 
			
		||||
msgstr "انتقل إلى مساحة العمل 9"
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:42
 | 
			
		||||
#, fuzzy
 | 
			
		||||
msgid "Switch to VT 10"
 | 
			
		||||
msgstr "انتقل إلى مساحة العمل 10"
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:46
 | 
			
		||||
#, fuzzy
 | 
			
		||||
msgid "Switch to VT 11"
 | 
			
		||||
msgstr "انتقل إلى مساحة العمل 11"
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:50
 | 
			
		||||
#, fuzzy
 | 
			
		||||
msgid "Switch to VT 12"
 | 
			
		||||
msgstr "انتقل إلى مساحة العمل 12"
 | 
			
		||||
 | 
			
		||||
#. TRANSLATORS: This string refers to a button that switches between
 | 
			
		||||
#. * different modes.
 | 
			
		||||
#.
 | 
			
		||||
#: src/backends/meta-input-settings.c:1866
 | 
			
		||||
#: ../src/backends/meta-input-settings.c:2167
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Mode Switch (Group %d)"
 | 
			
		||||
msgstr ""
 | 
			
		||||
@@ -473,113 +35,113 @@ msgstr ""
 | 
			
		||||
#. TRANSLATORS: This string refers to an action, cycles drawing tablets'
 | 
			
		||||
#. * mapping through the available outputs.
 | 
			
		||||
#.
 | 
			
		||||
#: src/backends/meta-input-settings.c:1888
 | 
			
		||||
#: ../src/backends/meta-input-settings.c:2190
 | 
			
		||||
msgid "Switch monitor"
 | 
			
		||||
msgstr "غيّر الشاشة"
 | 
			
		||||
 | 
			
		||||
#: src/backends/meta-input-settings.c:1890
 | 
			
		||||
#: ../src/backends/meta-input-settings.c:2192
 | 
			
		||||
msgid "Show on-screen help"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "اعرض المساعدة على الشاشة"
 | 
			
		||||
 | 
			
		||||
#: src/backends/meta-monitor-manager.c:879
 | 
			
		||||
#: ../src/backends/meta-monitor-manager.c:900
 | 
			
		||||
msgid "Built-in display"
 | 
			
		||||
msgstr "شاشة مدمجة"
 | 
			
		||||
 | 
			
		||||
#: src/backends/meta-monitor-manager.c:902
 | 
			
		||||
#: ../src/backends/meta-monitor-manager.c:923
 | 
			
		||||
msgid "Unknown"
 | 
			
		||||
msgstr "غير معروفة"
 | 
			
		||||
 | 
			
		||||
#: src/backends/meta-monitor-manager.c:904
 | 
			
		||||
#: ../src/backends/meta-monitor-manager.c:925
 | 
			
		||||
msgid "Unknown Display"
 | 
			
		||||
msgstr "شاشة غير معروفة"
 | 
			
		||||
 | 
			
		||||
#. TRANSLATORS: this is a monitor vendor name, followed by a
 | 
			
		||||
#. * size in inches, like 'Dell 15"'
 | 
			
		||||
#.
 | 
			
		||||
#: src/backends/meta-monitor-manager.c:912
 | 
			
		||||
#: ../src/backends/meta-monitor-manager.c:933
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "%s %s"
 | 
			
		||||
msgstr "%s %s"
 | 
			
		||||
 | 
			
		||||
#. 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:476
 | 
			
		||||
#, fuzzy, c-format
 | 
			
		||||
#: ../src/compositor/compositor.c:476
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid ""
 | 
			
		||||
"Another compositing manager is already running on screen %i on display “%s”."
 | 
			
		||||
msgstr "يعمل مدير مزج آخر على الشاشة %i والعرض \"%s\"."
 | 
			
		||||
msgstr "يعمل مدير مزج آخر على الشاشة %i و العرض ”%s“."
 | 
			
		||||
 | 
			
		||||
#: src/core/bell.c:194
 | 
			
		||||
#: ../src/core/bell.c:194
 | 
			
		||||
msgid "Bell event"
 | 
			
		||||
msgstr "حدث جرس"
 | 
			
		||||
 | 
			
		||||
#: src/core/display.c:608
 | 
			
		||||
#, fuzzy, c-format
 | 
			
		||||
#: ../src/core/display.c:608
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Failed to open X Window System display “%s”\n"
 | 
			
		||||
msgstr "فشل فتح عرض نظام نوافذ إكس '%s'\n"
 | 
			
		||||
msgstr "فشل فتح عرض نظام نوافذ إكس ”%s“\n"
 | 
			
		||||
 | 
			
		||||
#: src/core/main.c:189
 | 
			
		||||
#: ../src/core/main.c:189
 | 
			
		||||
msgid "Disable connection to session manager"
 | 
			
		||||
msgstr "عطّل الاتصال بمدير الجلسة"
 | 
			
		||||
 | 
			
		||||
#: src/core/main.c:195
 | 
			
		||||
#: ../src/core/main.c:195
 | 
			
		||||
msgid "Replace the running window manager"
 | 
			
		||||
msgstr "استبدل بمدير النوافذ الذي يعمل"
 | 
			
		||||
 | 
			
		||||
#: src/core/main.c:201
 | 
			
		||||
#: ../src/core/main.c:201
 | 
			
		||||
msgid "Specify session management ID"
 | 
			
		||||
msgstr "حدّد رقم هويّة إدارة الجلسة"
 | 
			
		||||
 | 
			
		||||
#: src/core/main.c:206
 | 
			
		||||
#: ../src/core/main.c:206
 | 
			
		||||
msgid "X Display to use"
 | 
			
		||||
msgstr "معراض س الذي سيستعمل"
 | 
			
		||||
 | 
			
		||||
#: src/core/main.c:212
 | 
			
		||||
#: ../src/core/main.c:212
 | 
			
		||||
msgid "Initialize session from savefile"
 | 
			
		||||
msgstr "ابدأ الجلسة من ملف محفوظ"
 | 
			
		||||
 | 
			
		||||
#: src/core/main.c:218
 | 
			
		||||
#: ../src/core/main.c:218
 | 
			
		||||
msgid "Make X calls synchronous"
 | 
			
		||||
msgstr "اجعل نداءات س متزامنة"
 | 
			
		||||
 | 
			
		||||
#: src/core/main.c:225
 | 
			
		||||
#: ../src/core/main.c:225
 | 
			
		||||
msgid "Run as a wayland compositor"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: src/core/main.c:231
 | 
			
		||||
#: ../src/core/main.c:231
 | 
			
		||||
msgid "Run as a nested compositor"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: src/core/main.c:239
 | 
			
		||||
#: ../src/core/main.c:239
 | 
			
		||||
msgid "Run as a full display server, rather than nested"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a window title
 | 
			
		||||
#: src/core/meta-close-dialog-default.c:147
 | 
			
		||||
#: ../src/core/meta-close-dialog-default.c:147
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "“%s” is not responding."
 | 
			
		||||
msgstr "”%s“ لا يستجيب."
 | 
			
		||||
 | 
			
		||||
#: src/core/meta-close-dialog-default.c:149
 | 
			
		||||
#: ../src/core/meta-close-dialog-default.c:149
 | 
			
		||||
msgid "Application is not responding."
 | 
			
		||||
msgstr "لا يستجيب التطبيق"
 | 
			
		||||
 | 
			
		||||
#: src/core/meta-close-dialog-default.c:154
 | 
			
		||||
#: ../src/core/meta-close-dialog-default.c:154
 | 
			
		||||
msgid ""
 | 
			
		||||
"You may choose to wait a short while for it to continue or force the "
 | 
			
		||||
"application to quit entirely."
 | 
			
		||||
msgstr "ربما ترغب في الانتظار قليلا ليُكمِل أو إجبار التطبيق على الإنهاء كُلّية."
 | 
			
		||||
 | 
			
		||||
#: src/core/meta-close-dialog-default.c:161
 | 
			
		||||
#: ../src/core/meta-close-dialog-default.c:161
 | 
			
		||||
msgid "_Force Quit"
 | 
			
		||||
msgstr "أ_جبر الإنهاء"
 | 
			
		||||
 | 
			
		||||
#: src/core/meta-close-dialog-default.c:161
 | 
			
		||||
#: ../src/core/meta-close-dialog-default.c:161
 | 
			
		||||
msgid "_Wait"
 | 
			
		||||
msgstr "ا_نتظر"
 | 
			
		||||
 | 
			
		||||
#: src/core/mutter.c:39
 | 
			
		||||
#, fuzzy, c-format
 | 
			
		||||
#: ../src/core/mutter.c:39
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid ""
 | 
			
		||||
"mutter %s\n"
 | 
			
		||||
"Copyright © 2001-%d Havoc Pennington, Red Hat, Inc., and others\n"
 | 
			
		||||
@@ -592,56 +154,289 @@ msgstr ""
 | 
			
		||||
"هذا برنامج حر، راجع المصدر لشروط النسخ.\n"
 | 
			
		||||
"لا يوجد أي ضمان: و لا حتى ضمان قابلية التسويق أو المناسبة لأي هدف.\n"
 | 
			
		||||
 | 
			
		||||
#: src/core/mutter.c:53
 | 
			
		||||
#: ../src/core/mutter.c:53
 | 
			
		||||
msgid "Print version"
 | 
			
		||||
msgstr "اطبع الإصدارة"
 | 
			
		||||
 | 
			
		||||
#: src/core/mutter.c:59
 | 
			
		||||
#: ../src/core/mutter.c:59
 | 
			
		||||
msgid "Mutter plugin to use"
 | 
			
		||||
msgstr "ملحق مَتَر الذي سيُستخدم"
 | 
			
		||||
 | 
			
		||||
#: src/core/prefs.c:1997
 | 
			
		||||
#: ../src/core/prefs.c:1997
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Workspace %d"
 | 
			
		||||
msgstr "مساحة العمل %d"
 | 
			
		||||
 | 
			
		||||
#: src/core/screen.c:580
 | 
			
		||||
#, fuzzy, c-format
 | 
			
		||||
#: ../src/core/screen.c:583
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid ""
 | 
			
		||||
"Display “%s” already has a window manager; try using the --replace option to "
 | 
			
		||||
"replace the current window manager."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"الشاشة \"%s\" لها مدير نوافذ بالفعل، حاول استعمال خيار التبديل --replace "
 | 
			
		||||
"لتحُلّ محلّ مدير النوافذ الحالي."
 | 
			
		||||
"الشاشة ”%s“ لها مدير نوافذ بالفعل، حاول استعمال خيار التبديل --replace لتحُلّ"
 | 
			
		||||
" محلّ مدير النوافذ الحالي."
 | 
			
		||||
 | 
			
		||||
#: src/core/screen.c:665
 | 
			
		||||
#, fuzzy, c-format
 | 
			
		||||
#: ../src/core/screen.c:668
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Screen %d on display “%s” is invalid\n"
 | 
			
		||||
msgstr "الشاشة %d على العرض '%s' غير صحيحة\n"
 | 
			
		||||
msgstr "الشاشة %d على العرض ”%s“ غير صحيحة\n"
 | 
			
		||||
 | 
			
		||||
#: src/core/util.c:120
 | 
			
		||||
#: ../src/core/util.c:120
 | 
			
		||||
msgid "Mutter was compiled without support for verbose mode\n"
 | 
			
		||||
msgstr "جُمِّع مَتَر دون دعم للنمط المطنب\n"
 | 
			
		||||
 | 
			
		||||
#: src/wayland/meta-wayland-tablet-pad.c:563
 | 
			
		||||
#: ../src/wayland/meta-wayland-tablet-pad.c:563
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Mode Switch: Mode %d"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: src/x11/session.c:1815
 | 
			
		||||
#, fuzzy
 | 
			
		||||
#: ../src/x11/session.c:1815
 | 
			
		||||
msgid ""
 | 
			
		||||
"These windows do not support “save current setup” and will have to be "
 | 
			
		||||
"restarted manually next time you log in."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"هذه النوافذ لا تدعم "احفظ الضبط الحالي" يجب إعادة تشغيلها يدويا "
 | 
			
		||||
"عند الولوج المرة القادمة."
 | 
			
		||||
"هذه النوافذ لا تدعم ” الضبط الحالي" إعادة تشغيلها يدويا عند الولوج "
 | 
			
		||||
"المرة القادمة."
 | 
			
		||||
 | 
			
		||||
#: src/x11/window-props.c:559
 | 
			
		||||
#: ../src/x11/window-props.c:559
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "%s (on %s)"
 | 
			
		||||
msgstr "%s (على %s)"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Navigation"
 | 
			
		||||
#~ msgstr "الإبحار"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Move window to workspace 1"
 | 
			
		||||
#~ msgstr "انقل النافذة إلى مساحة العمل 1"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Move window to workspace 2"
 | 
			
		||||
#~ msgstr "انقل النافذة إلى مساحة العمل 2"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Move window to workspace 3"
 | 
			
		||||
#~ msgstr "انقل النافذة إلى مساحة العمل 3"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Move window to workspace 4"
 | 
			
		||||
#~ msgstr "انقل النافذة إلى مساحة العمل 4"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Move window to last workspace"
 | 
			
		||||
#~ msgstr "انقل النافذة إلى مساحة العمل الأخيرة"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Move window one workspace to the left"
 | 
			
		||||
#~ msgstr "انقل النافذة مساحة عمل واحدة إلى اليسار"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Move window one workspace to the right"
 | 
			
		||||
#~ msgstr "انقل النافذة مساحة عمل واحدة إلى اليمين"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Move window one workspace up"
 | 
			
		||||
#~ msgstr "انقل النافذة مساحة عمل واحدة إلى الأعلى"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Move window one workspace down"
 | 
			
		||||
#~ msgstr "انقل النافذة مساحة عمل واحدة إلى الأسفل"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Move window one monitor to the left"
 | 
			
		||||
#~ msgstr "انقل النافذة شاشة واحدة إلى اليسار"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Move window one monitor to the right"
 | 
			
		||||
#~ msgstr "انقل النافذة شاشة واحدة إلى اليمين"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Move window one monitor up"
 | 
			
		||||
#~ msgstr "انقل النافذة شاشة واحدة إلى الأعلى"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Move window one monitor down"
 | 
			
		||||
#~ msgstr "انقل النافذة شاشة واحدة إلى الأسفل"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Switch applications"
 | 
			
		||||
#~ msgstr "تنقل بين التطبيقات"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Switch to previous application"
 | 
			
		||||
#~ msgstr "انتقل إلى التطبيق السابق"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Switch windows"
 | 
			
		||||
#~ msgstr "تنقل بين النوافذ"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Switch to previous window"
 | 
			
		||||
#~ msgstr "انتقل إلى النافذة السابقة"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Switch windows of an application"
 | 
			
		||||
#~ msgstr "تنقل بين نوافذ التطبيق"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Switch to previous window of an application"
 | 
			
		||||
#~ msgstr "انتقل إلى نافذة التطبيق السابقة"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Switch system controls"
 | 
			
		||||
#~ msgstr "تنقل بين تحكمات النظام"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Switch to previous system control"
 | 
			
		||||
#~ msgstr "انتقل إلى تحكم النظام السابق"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Switch windows directly"
 | 
			
		||||
#~ msgstr "تنقل مباشرة بين النوافذ"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Switch directly to previous window"
 | 
			
		||||
#~ msgstr "انتقل مباشرة إلى النافذة السابقة"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Switch windows of an app directly"
 | 
			
		||||
#~ msgstr "تنقل مباشرة بين نوافذ التطبيق"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Switch directly to previous window of an app"
 | 
			
		||||
#~ msgstr "انتقل مباشرة إلى نافذة التطبيق السابقة"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Switch system controls directly"
 | 
			
		||||
#~ msgstr "تنقل مباشرة بين تحكمات النظام"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Switch directly to previous system control"
 | 
			
		||||
#~ msgstr "انتقل مباشرة إلى تحكم النظام السابق"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Hide all normal windows"
 | 
			
		||||
#~ msgstr "أخفِ كل النوافذ العادية"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Switch to workspace 1"
 | 
			
		||||
#~ msgstr "انتقل إلى مساحة العمل 1"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Switch to workspace 2"
 | 
			
		||||
#~ msgstr "انتقل إلى مساحة العمل 2"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Switch to workspace 3"
 | 
			
		||||
#~ msgstr "انتقل إلى مساحة العمل 3"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Switch to workspace 4"
 | 
			
		||||
#~ msgstr "انتقل إلى مساحة العمل 4"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Switch to last workspace"
 | 
			
		||||
#~ msgstr "انتقل إلى مساحة العمل الأخيرة"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Move to workspace left"
 | 
			
		||||
#~ msgstr "انقل لمساحة العمل على اليسار"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Move to workspace right"
 | 
			
		||||
#~ msgstr "انقل لمساحة العمل على اليمين"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Move to workspace above"
 | 
			
		||||
#~ msgstr "انقل لمساحة العمل أعلى"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Move to workspace below"
 | 
			
		||||
#~ msgstr "انقل لمساحة العمل أسفل"
 | 
			
		||||
 | 
			
		||||
#~ msgid "System"
 | 
			
		||||
#~ msgstr "النظام"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Show the run command prompt"
 | 
			
		||||
#~ msgstr "أظهر محث تشغيل أمر"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Show the activities overview"
 | 
			
		||||
#~ msgstr "أظهر نظرة عامة على الأنشطة"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Windows"
 | 
			
		||||
#~ msgstr "النوافذ"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Activate the window menu"
 | 
			
		||||
#~ msgstr "فعّل قائمة النافذة"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Toggle fullscreen mode"
 | 
			
		||||
#~ msgstr "بدّل نمط ملء الشاشة"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Toggle maximization state"
 | 
			
		||||
#~ msgstr "بدّل حالة التكبير"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Maximize window"
 | 
			
		||||
#~ msgstr "كبّر النّافذة"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Restore window"
 | 
			
		||||
#~ msgstr "استعد النّافذة"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Toggle shaded state"
 | 
			
		||||
#~ msgstr "بدّل حالة الإخفاء"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Close window"
 | 
			
		||||
#~ msgstr "أغلق النّافذة"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Hide window"
 | 
			
		||||
#~ msgstr "أخفِ النّافذة"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Move window"
 | 
			
		||||
#~ msgstr "انقل النّافذة"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Resize window"
 | 
			
		||||
#~ msgstr "حجّم النّافذة"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Toggle window on all workspaces or one"
 | 
			
		||||
#~ msgstr "بدّل حالة ظهور النافذة على جميع مساحات العمل أو واحدة منها"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Raise window if covered, otherwise lower it"
 | 
			
		||||
#~ msgstr "ارفع النافذة إذا كانت أخرى تغطيها، أو أخفضها في ما عدا ذلك"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Raise window above other windows"
 | 
			
		||||
#~ msgstr "ارفع النافذة فوق النوافذ الأخرى"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Lower window below other windows"
 | 
			
		||||
#~ msgstr "اخفض النافذة تحت النوافذ الأخرى"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Maximize window vertically"
 | 
			
		||||
#~ msgstr "كبّر النافذة رأسيا"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Maximize window horizontally"
 | 
			
		||||
#~ msgstr "كبّر النافذة أفقيا"
 | 
			
		||||
 | 
			
		||||
#~ msgid "View split on left"
 | 
			
		||||
#~ msgstr "المنظور مقسوم على اليمين"
 | 
			
		||||
 | 
			
		||||
#~ msgid "View split on right"
 | 
			
		||||
#~ msgstr "المنظور مقسوم على اليسار"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Mutter"
 | 
			
		||||
#~ msgstr "مَتَر"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Modifier to use for extended window management operations"
 | 
			
		||||
#~ msgstr "المغير الذي سيُستعمل لتمديد عمليات إدارة النوافذ "
 | 
			
		||||
 | 
			
		||||
#, fuzzy
 | 
			
		||||
#~ msgid "Switch to VT 1"
 | 
			
		||||
#~ msgstr "انتقل إلى مساحة العمل 1"
 | 
			
		||||
 | 
			
		||||
#, fuzzy
 | 
			
		||||
#~ msgid "Switch to VT 2"
 | 
			
		||||
#~ msgstr "انتقل إلى مساحة العمل 2"
 | 
			
		||||
 | 
			
		||||
#, fuzzy
 | 
			
		||||
#~ msgid "Switch to VT 3"
 | 
			
		||||
#~ msgstr "انتقل إلى مساحة العمل 3"
 | 
			
		||||
 | 
			
		||||
#, fuzzy
 | 
			
		||||
#~ msgid "Switch to VT 4"
 | 
			
		||||
#~ msgstr "انتقل إلى مساحة العمل 4"
 | 
			
		||||
 | 
			
		||||
#, fuzzy
 | 
			
		||||
#~ msgid "Switch to VT 5"
 | 
			
		||||
#~ msgstr "انتقل إلى مساحة العمل 5"
 | 
			
		||||
 | 
			
		||||
#, fuzzy
 | 
			
		||||
#~ msgid "Switch to VT 6"
 | 
			
		||||
#~ msgstr "انتقل إلى مساحة العمل 6"
 | 
			
		||||
 | 
			
		||||
#, fuzzy
 | 
			
		||||
#~ msgid "Switch to VT 7"
 | 
			
		||||
#~ msgstr "انتقل إلى مساحة العمل 7"
 | 
			
		||||
 | 
			
		||||
#, fuzzy
 | 
			
		||||
#~ msgid "Switch to VT 8"
 | 
			
		||||
#~ msgstr "انتقل إلى مساحة العمل 8"
 | 
			
		||||
 | 
			
		||||
#, fuzzy
 | 
			
		||||
#~ msgid "Switch to VT 9"
 | 
			
		||||
#~ msgstr "انتقل إلى مساحة العمل 9"
 | 
			
		||||
 | 
			
		||||
#, fuzzy
 | 
			
		||||
#~ msgid "Switch to VT 10"
 | 
			
		||||
#~ msgstr "انتقل إلى مساحة العمل 10"
 | 
			
		||||
 | 
			
		||||
#, fuzzy
 | 
			
		||||
#~ msgid "Switch to VT 11"
 | 
			
		||||
#~ msgstr "انتقل إلى مساحة العمل 11"
 | 
			
		||||
 | 
			
		||||
#, fuzzy
 | 
			
		||||
#~ msgid "Switch to VT 12"
 | 
			
		||||
#~ msgstr "انتقل إلى مساحة العمل 12"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Unknown window information request: %d"
 | 
			
		||||
#~ msgstr "طلب معلومات نافذة مجهول: %d"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										96
									
								
								po/be.po
									
									
									
									
									
								
							
							
						
						
									
										96
									
								
								po/be.po
									
									
									
									
									
								
							@@ -5,8 +5,8 @@ msgstr ""
 | 
			
		||||
"Project-Id-Version: mutter.master\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?"
 | 
			
		||||
"product=mutter&keywords=I18N+L10N&component=general\n"
 | 
			
		||||
"POT-Creation-Date: 2017-04-21 21:33+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2017-04-23 16:56+0300\n"
 | 
			
		||||
"POT-Creation-Date: 2017-08-29 16:09+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2017-09-01 18:44+0300\n"
 | 
			
		||||
"Last-Translator: Yuras Shumovich <shumovichy@gmail.com>\n"
 | 
			
		||||
"Language-Team: Belarusian <i18n-bel-gnome@googlegroups.com>\n"
 | 
			
		||||
"Language: be\n"
 | 
			
		||||
@@ -409,7 +409,10 @@ msgid ""
 | 
			
		||||
"proof. Currently possible keywords: • “scale-monitor-framebuffer” — makes "
 | 
			
		||||
"mutter default to layout logical monitors in a logical pixel coordinate "
 | 
			
		||||
"space, while scaling monitor framebuffers instead of window content, to "
 | 
			
		||||
"manage HiDPI monitors. Does not require a restart."
 | 
			
		||||
"manage HiDPI monitors. Does not require a restart. • “remote-desktop” — "
 | 
			
		||||
"enables remote desktop support. To support remote desktop with screen "
 | 
			
		||||
"sharing, “screen-cast” must also be enabled. • “screen-cast” — enables "
 | 
			
		||||
"screen cast support."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Каб уключыць эксперыментальныя функцыі, дадайце адпаведнае ключавое слова ў "
 | 
			
		||||
"гэты ліст. Некаторыя функцыі могуць патрабаваць перазапуску кампазітара. "
 | 
			
		||||
@@ -418,16 +421,27 @@ msgstr ""
 | 
			
		||||
"\"scale-monitor-framebuffer\" - прымушае mutter прадвызначана размяшчаць "
 | 
			
		||||
"лагічныя маніторы ў лагічнай прасторы каардынат пікселаў, пры гэтым "
 | 
			
		||||
"маштабаваць кадравы буфер, а не змесціва акна, для падтрымкі HiDPI "
 | 
			
		||||
"манітораў. Не патрабуе перазапуску."
 | 
			
		||||
"манітораў. Не патрабуе перазапуску. • \"remote-desktop\" - уключае падтрымку "
 | 
			
		||||
"аддаленых манітораў. Для падтрымкі аддаленых манітораў з супольным доступам "
 | 
			
		||||
"да экрана трэба таксама ўключыць \"screen-cast\". • \"screen-cast\" - "
 | 
			
		||||
"уключае падтрымку скрынкасту."
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:141
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:145
 | 
			
		||||
msgid "Select window from tab popup"
 | 
			
		||||
msgstr "Выбраць акно з выплыўнога акенца"
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:146
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:150
 | 
			
		||||
msgid "Cancel tab popup"
 | 
			
		||||
msgstr "Закрыць выплыўное акенца"
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:155
 | 
			
		||||
msgid "Switch monitor configurations"
 | 
			
		||||
msgstr "Пераключыць канфігурацыі манітора"
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:160
 | 
			
		||||
msgid "Rotates the built-in monitor configuration"
 | 
			
		||||
msgstr "Паварочвае убудаваны манітор"
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:6
 | 
			
		||||
msgid "Switch to VT 1"
 | 
			
		||||
msgstr "Перайсці ў віртуальны тэрмінал 1"
 | 
			
		||||
@@ -476,10 +490,14 @@ msgstr "Перайсці ў віртуальны тэрмінал 11"
 | 
			
		||||
msgid "Switch to VT 12"
 | 
			
		||||
msgstr "Перайсці ў віртуальны тэрмінал 12"
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:54
 | 
			
		||||
msgid "Re-enable shortcuts"
 | 
			
		||||
msgstr "Уключыць назад клавіятурныя скароты"
 | 
			
		||||
 | 
			
		||||
#. TRANSLATORS: This string refers to a button that switches between
 | 
			
		||||
#. * different modes.
 | 
			
		||||
#.
 | 
			
		||||
#: src/backends/meta-input-settings.c:1848
 | 
			
		||||
#: src/backends/meta-input-settings.c:2151
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Mode Switch (Group %d)"
 | 
			
		||||
msgstr "Пераключыць рэжым (група %d)"
 | 
			
		||||
@@ -487,37 +505,37 @@ msgstr "Пераключыць рэжым (група %d)"
 | 
			
		||||
#. TRANSLATORS: This string refers to an action, cycles drawing tablets'
 | 
			
		||||
#. * mapping through the available outputs.
 | 
			
		||||
#.
 | 
			
		||||
#: src/backends/meta-input-settings.c:1870
 | 
			
		||||
#: src/backends/meta-input-settings.c:2174
 | 
			
		||||
msgid "Switch monitor"
 | 
			
		||||
msgstr "Пераключыць манітор"
 | 
			
		||||
 | 
			
		||||
#: src/backends/meta-input-settings.c:1872
 | 
			
		||||
#: src/backends/meta-input-settings.c:2176
 | 
			
		||||
msgid "Show on-screen help"
 | 
			
		||||
msgstr "Паказаць экранную даведку"
 | 
			
		||||
 | 
			
		||||
#: src/backends/meta-monitor-manager.c:783
 | 
			
		||||
#: src/backends/meta-monitor-manager.c:903
 | 
			
		||||
msgid "Built-in display"
 | 
			
		||||
msgstr "Убудаваны дысплей"
 | 
			
		||||
 | 
			
		||||
#: src/backends/meta-monitor-manager.c:806
 | 
			
		||||
#: src/backends/meta-monitor-manager.c:926
 | 
			
		||||
msgid "Unknown"
 | 
			
		||||
msgstr "Невядомы"
 | 
			
		||||
 | 
			
		||||
#: src/backends/meta-monitor-manager.c:808
 | 
			
		||||
#: src/backends/meta-monitor-manager.c:928
 | 
			
		||||
msgid "Unknown Display"
 | 
			
		||||
msgstr "Невядомы дысплей"
 | 
			
		||||
 | 
			
		||||
#. TRANSLATORS: this is a monitor vendor name, followed by a
 | 
			
		||||
#. * size in inches, like 'Dell 15"'
 | 
			
		||||
#.
 | 
			
		||||
#: src/backends/meta-monitor-manager.c:816
 | 
			
		||||
#: src/backends/meta-monitor-manager.c:936
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "%s %s"
 | 
			
		||||
msgstr "%s %s"
 | 
			
		||||
 | 
			
		||||
#. 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:474
 | 
			
		||||
#: src/compositor/compositor.c:476
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid ""
 | 
			
		||||
"Another compositing manager is already running on screen %i on display “%s”."
 | 
			
		||||
@@ -528,31 +546,6 @@ msgstr ""
 | 
			
		||||
msgid "Bell event"
 | 
			
		||||
msgstr "Падзея з сігналам"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a window title
 | 
			
		||||
#: src/core/delete.c:127
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "“%s” is not responding."
 | 
			
		||||
msgstr "\"%s\" не адказвае на запыты."
 | 
			
		||||
 | 
			
		||||
#: src/core/delete.c:129
 | 
			
		||||
msgid "Application is not responding."
 | 
			
		||||
msgstr "Праграма не адказвае на запыты."
 | 
			
		||||
 | 
			
		||||
#: src/core/delete.c:134
 | 
			
		||||
msgid ""
 | 
			
		||||
"You may choose to wait a short while for it to continue or force the "
 | 
			
		||||
"application to quit entirely."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Вы можаце альбо крыху пачакаць адказу, альбо змусіць праграму да выхаду."
 | 
			
		||||
 | 
			
		||||
#: src/core/delete.c:141
 | 
			
		||||
msgid "_Force Quit"
 | 
			
		||||
msgstr "_Змусіць да выхаду"
 | 
			
		||||
 | 
			
		||||
#: src/core/delete.c:141
 | 
			
		||||
msgid "_Wait"
 | 
			
		||||
msgstr "_Пачакаць"
 | 
			
		||||
 | 
			
		||||
#: src/core/display.c:608
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Failed to open X Window System display “%s”\n"
 | 
			
		||||
@@ -594,6 +587,31 @@ msgstr "Запусціць у якасці ўложанага кампазіта
 | 
			
		||||
msgid "Run as a full display server, rather than nested"
 | 
			
		||||
msgstr "Запусціць у якасці паўнавартаснага сервера дысплея, я не як уложаны "
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a window title
 | 
			
		||||
#: src/core/meta-close-dialog-default.c:147
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "“%s” is not responding."
 | 
			
		||||
msgstr "\"%s\" не адказвае на запыты."
 | 
			
		||||
 | 
			
		||||
#: src/core/meta-close-dialog-default.c:149
 | 
			
		||||
msgid "Application is not responding."
 | 
			
		||||
msgstr "Праграма не адказвае на запыты."
 | 
			
		||||
 | 
			
		||||
#: src/core/meta-close-dialog-default.c:154
 | 
			
		||||
msgid ""
 | 
			
		||||
"You may choose to wait a short while for it to continue or force the "
 | 
			
		||||
"application to quit entirely."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Вы можаце альбо крыху пачакаць адказу, альбо змусіць праграму да выхаду."
 | 
			
		||||
 | 
			
		||||
#: src/core/meta-close-dialog-default.c:161
 | 
			
		||||
msgid "_Force Quit"
 | 
			
		||||
msgstr "_Змусіць да выхаду"
 | 
			
		||||
 | 
			
		||||
#: src/core/meta-close-dialog-default.c:161
 | 
			
		||||
msgid "_Wait"
 | 
			
		||||
msgstr "_Пачакаць"
 | 
			
		||||
 | 
			
		||||
#: src/core/mutter.c:39
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid ""
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										21
									
								
								po/ca.po
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								po/ca.po
									
									
									
									
									
								
							@@ -5,7 +5,7 @@
 | 
			
		||||
# Jesús Moreno <jmmolas@wanadoo.es>, 2002.
 | 
			
		||||
# Jordi Mallach <jordi@sindominio.net>, 2003, 2004, 2005, 2006, 2007, 2008.
 | 
			
		||||
# David Planella <david.planella@gmail.com>, 2008, 2009, 2011, 2012.
 | 
			
		||||
# Jordi Serratosa <jordis@softcatala.cat>, 2012.
 | 
			
		||||
# Jordi Serratosa <jordis@softcatala.cat>, 2012, 2017.
 | 
			
		||||
# Gil Forcada <gilforcada@guifi.net>, 2012, 2013, 2014, 2016.
 | 
			
		||||
#
 | 
			
		||||
msgid ""
 | 
			
		||||
@@ -13,7 +13,7 @@ msgstr ""
 | 
			
		||||
"Project-Id-Version: metacity 2.24\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?"
 | 
			
		||||
"product=mutter&keywords=I18N+L10N&component=general\n"
 | 
			
		||||
"POT-Creation-Date: 2017-08-21 04:46+0000\n"
 | 
			
		||||
"POT-Creation-Date: 2017-08-29 16:09+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2017-08-25 13:23+0200\n"
 | 
			
		||||
"Last-Translator: Jordi Mas <jmas@softcatala.org>\n"
 | 
			
		||||
"Language-Team: Catalan <tradgnome@softcatala.org>\n"
 | 
			
		||||
@@ -240,7 +240,7 @@ msgstr ""
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-windows.xml:31
 | 
			
		||||
msgid "Raise window if covered, otherwise lower it"
 | 
			
		||||
msgstr "Alça la finestra si està coberta per una altra, o sinó baixa-la"
 | 
			
		||||
msgstr "Alça la finestra si està coberta per una altra; altrament, baixa-la"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-windows.xml:33
 | 
			
		||||
msgid "Raise window above other windows"
 | 
			
		||||
@@ -306,7 +306,7 @@ msgstr ""
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:30
 | 
			
		||||
msgid "Enable edge tiling when dropping windows on screen edges"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Habilita la tesselització a les vores en deixar anar les finestres a les "
 | 
			
		||||
"Habilita la tessel·lització a les vores en deixar anar les finestres a les "
 | 
			
		||||
"vores de la pantalla"
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:31
 | 
			
		||||
@@ -424,22 +424,25 @@ msgid ""
 | 
			
		||||
"proof. Currently possible keywords: • “scale-monitor-framebuffer” — makes "
 | 
			
		||||
"mutter default to layout logical monitors in a logical pixel coordinate "
 | 
			
		||||
"space, while scaling monitor framebuffers instead of window content, to "
 | 
			
		||||
"manage HiDPI monitors. Does not require a restart."
 | 
			
		||||
"manage HiDPI monitors. Does not require a restart. • “remote-desktop” — "
 | 
			
		||||
"enables remote desktop support. To support remote desktop with screen "
 | 
			
		||||
"sharing, “screen-cast” must also be enabled. • “screen-cast” — enables "
 | 
			
		||||
"screen cast support."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:141
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:145
 | 
			
		||||
msgid "Select window from tab popup"
 | 
			
		||||
msgstr "Selecció de finestra entre les emergents d'una pestanya"
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:146
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:150
 | 
			
		||||
msgid "Cancel tab popup"
 | 
			
		||||
msgstr "Cancel·lació de les finestres emergents a les pestanyes"
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:151
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:155
 | 
			
		||||
msgid "Switch monitor configurations"
 | 
			
		||||
msgstr "Canvia configuracions de monitor"
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:156
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:160
 | 
			
		||||
msgid "Rotates the built-in monitor configuration"
 | 
			
		||||
msgstr "Gira la configuració del monitor integrada"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1663
									
								
								po/ca@valencia.po
									
									
									
									
									
								
							
							
						
						
									
										1663
									
								
								po/ca@valencia.po
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										246
									
								
								po/cs.po
									
									
									
									
									
								
							
							
						
						
									
										246
									
								
								po/cs.po
									
									
									
									
									
								
							@@ -6,17 +6,16 @@
 | 
			
		||||
# Petr Tomeš <ptomes@gmail.com>, 2006.
 | 
			
		||||
# Jakub Friedl <jfriedl@suse.cz>, 2006, 2007.
 | 
			
		||||
# Petr Kovar <pknbe@volny.cz>, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014.
 | 
			
		||||
# Marek Černocký <marek@manet.cz>, 2012, 2013, 2014, 2016, 2017.
 | 
			
		||||
# Marek Černocký <marek@manet.cz>, 2012, 2013, 2014, 2016, 2017, 2018.
 | 
			
		||||
#
 | 
			
		||||
msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: mutter\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?"
 | 
			
		||||
"product=mutter&keywords=I18N+L10N&component=general\n"
 | 
			
		||||
"POT-Creation-Date: 2017-08-21 04:46+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2017-08-22 18:29+0200\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/mutter/issues\n"
 | 
			
		||||
"POT-Creation-Date: 2018-03-01 10:47+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2018-03-07 19:28+0100\n"
 | 
			
		||||
"Last-Translator: Marek Černocký <marek@manet.cz>\n"
 | 
			
		||||
"Language-Team: čeština <gnome-cs-list@gnome.org>>\n"
 | 
			
		||||
"Language-Team: čeština <gnome-cs-list@gnome.org>\n"
 | 
			
		||||
"Language: cs\n"
 | 
			
		||||
"MIME-Version: 1.0\n"
 | 
			
		||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
@@ -50,134 +49,118 @@ msgid "Move window to last workspace"
 | 
			
		||||
msgstr "Přesunout okno na poslední pracovní plochu"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:24
 | 
			
		||||
msgid "Move window one workspace to the left"
 | 
			
		||||
msgstr "Přesunout okno o jednu pracovní plochu doleva"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:27
 | 
			
		||||
msgid "Move window one workspace to the right"
 | 
			
		||||
msgstr "Přesunout okno o jednu pracovní plochu doprava"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:30
 | 
			
		||||
msgid "Move window one workspace up"
 | 
			
		||||
msgstr "Přesunout okno o jednu pracovní plochu nahoru"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:33
 | 
			
		||||
#: data/50-mutter-navigation.xml:27
 | 
			
		||||
msgid "Move window one workspace down"
 | 
			
		||||
msgstr "Přesunout okno o jednu pracovní plochu dolů"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:36
 | 
			
		||||
#: data/50-mutter-navigation.xml:30
 | 
			
		||||
msgid "Move window one monitor to the left"
 | 
			
		||||
msgstr "Přesunout okno o jeden monitor doleva"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:39
 | 
			
		||||
#: data/50-mutter-navigation.xml:33
 | 
			
		||||
msgid "Move window one monitor to the right"
 | 
			
		||||
msgstr "Přesunout okno o jeden monitor doprava"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:42
 | 
			
		||||
#: data/50-mutter-navigation.xml:36
 | 
			
		||||
msgid "Move window one monitor up"
 | 
			
		||||
msgstr "Přesunout okno o jeden monitor nahoru"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:45
 | 
			
		||||
#: data/50-mutter-navigation.xml:39
 | 
			
		||||
msgid "Move window one monitor down"
 | 
			
		||||
msgstr "Přesunout okno o jeden monitor dolů"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:49
 | 
			
		||||
#: data/50-mutter-navigation.xml:43
 | 
			
		||||
msgid "Switch applications"
 | 
			
		||||
msgstr "Přepnout do jiné aplikace"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:54
 | 
			
		||||
#: data/50-mutter-navigation.xml:48
 | 
			
		||||
msgid "Switch to previous application"
 | 
			
		||||
msgstr "Přepnout do předchozí aplikaci"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:58
 | 
			
		||||
#: data/50-mutter-navigation.xml:52
 | 
			
		||||
msgid "Switch windows"
 | 
			
		||||
msgstr "Přepnout do jiného okna"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:63
 | 
			
		||||
#: data/50-mutter-navigation.xml:57
 | 
			
		||||
msgid "Switch to previous window"
 | 
			
		||||
msgstr "Přepnout do minulého okna"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:67
 | 
			
		||||
#: data/50-mutter-navigation.xml:61
 | 
			
		||||
msgid "Switch windows of an application"
 | 
			
		||||
msgstr "Přepnout do jiného okna aplikace"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:72
 | 
			
		||||
#: data/50-mutter-navigation.xml:66
 | 
			
		||||
msgid "Switch to previous window of an application"
 | 
			
		||||
msgstr "Přepnout do předchozího okna aplikace"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:76
 | 
			
		||||
#: data/50-mutter-navigation.xml:70
 | 
			
		||||
msgid "Switch system controls"
 | 
			
		||||
msgstr "Přepnout na systémový ovládací prvek"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:81
 | 
			
		||||
#: data/50-mutter-navigation.xml:75
 | 
			
		||||
msgid "Switch to previous system control"
 | 
			
		||||
msgstr "Přepnout na minulý systémový ovládací prvek"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:85
 | 
			
		||||
#: data/50-mutter-navigation.xml:79
 | 
			
		||||
msgid "Switch windows directly"
 | 
			
		||||
msgstr "Přepnout do minulého okna"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:90
 | 
			
		||||
#: data/50-mutter-navigation.xml:84
 | 
			
		||||
msgid "Switch directly to previous window"
 | 
			
		||||
msgstr "Přepnout přímo na předchozí okno"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:94
 | 
			
		||||
#: data/50-mutter-navigation.xml:88
 | 
			
		||||
msgid "Switch windows of an app directly"
 | 
			
		||||
msgstr "Přepnout do jiného okna aplikace"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:99
 | 
			
		||||
#: data/50-mutter-navigation.xml:93
 | 
			
		||||
msgid "Switch directly to previous window of an app"
 | 
			
		||||
msgstr "Přepnout do předchozího okna aplikace"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:103
 | 
			
		||||
#: data/50-mutter-navigation.xml:97
 | 
			
		||||
msgid "Switch system controls directly"
 | 
			
		||||
msgstr "Přepnout na minulý systémový ovládací prvek"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:108
 | 
			
		||||
#: data/50-mutter-navigation.xml:102
 | 
			
		||||
msgid "Switch directly to previous system control"
 | 
			
		||||
msgstr "Přepnout přímo na předchozí systémové ovládací prvky"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:111
 | 
			
		||||
#: data/50-mutter-navigation.xml:105
 | 
			
		||||
msgid "Hide all normal windows"
 | 
			
		||||
msgstr "Skrýt všechna běžná okna"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:114
 | 
			
		||||
#: data/50-mutter-navigation.xml:108
 | 
			
		||||
msgid "Switch to workspace 1"
 | 
			
		||||
msgstr "Přepnout na plochu 1"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:117
 | 
			
		||||
#: data/50-mutter-navigation.xml:111
 | 
			
		||||
msgid "Switch to workspace 2"
 | 
			
		||||
msgstr "Přepnout na plochu 2"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:120
 | 
			
		||||
#: data/50-mutter-navigation.xml:114
 | 
			
		||||
msgid "Switch to workspace 3"
 | 
			
		||||
msgstr "Přepnout na plochu 3"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:123
 | 
			
		||||
#: data/50-mutter-navigation.xml:117
 | 
			
		||||
msgid "Switch to workspace 4"
 | 
			
		||||
msgstr "Přepnout na plochu 4"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:126
 | 
			
		||||
#: data/50-mutter-navigation.xml:120
 | 
			
		||||
msgid "Switch to last workspace"
 | 
			
		||||
msgstr "Přepnout na poslední plochu"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:129
 | 
			
		||||
msgid "Move to workspace left"
 | 
			
		||||
msgstr "Přesunout na plochu vlevo"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:132
 | 
			
		||||
msgid "Move to workspace right"
 | 
			
		||||
msgstr "Přesunout na plochu vpravo"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:135
 | 
			
		||||
#: data/50-mutter-navigation.xml:123
 | 
			
		||||
msgid "Move to workspace above"
 | 
			
		||||
msgstr "Přesunout na plochu nad"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:138
 | 
			
		||||
#: data/50-mutter-navigation.xml:126
 | 
			
		||||
msgid "Move to workspace below"
 | 
			
		||||
msgstr "Přesunout na plochu pod"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-system.xml:6
 | 
			
		||||
#: data/50-mutter-system.xml:6 data/50-mutter-wayland.xml:6
 | 
			
		||||
msgid "System"
 | 
			
		||||
msgstr "Systém"
 | 
			
		||||
 | 
			
		||||
@@ -189,6 +172,10 @@ msgstr "Zobrazit řádek ke spuštění příkazu"
 | 
			
		||||
msgid "Show the activities overview"
 | 
			
		||||
msgstr "Zobrazit přehled činností"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-wayland.xml:8
 | 
			
		||||
msgid "Restore the keyboard shortcuts"
 | 
			
		||||
msgstr "Obnovit klávesové zkratky"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-windows.xml:6
 | 
			
		||||
msgid "Windows"
 | 
			
		||||
msgstr "Okna"
 | 
			
		||||
@@ -214,54 +201,50 @@ msgid "Restore window"
 | 
			
		||||
msgstr "Obnovit velikost okna"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-windows.xml:18
 | 
			
		||||
msgid "Toggle shaded state"
 | 
			
		||||
msgstr "Přepnout stav svinutí"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-windows.xml:20
 | 
			
		||||
msgid "Close window"
 | 
			
		||||
msgstr "Zavřít okno"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-windows.xml:22
 | 
			
		||||
#: data/50-mutter-windows.xml:20
 | 
			
		||||
msgid "Hide window"
 | 
			
		||||
msgstr "Skrýt okno"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-windows.xml:24
 | 
			
		||||
#: data/50-mutter-windows.xml:22
 | 
			
		||||
msgid "Move window"
 | 
			
		||||
msgstr "Přesunout okno"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-windows.xml:26
 | 
			
		||||
#: data/50-mutter-windows.xml:24
 | 
			
		||||
msgid "Resize window"
 | 
			
		||||
msgstr "Změnit velikost okna"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-windows.xml:29
 | 
			
		||||
#: data/50-mutter-windows.xml:27
 | 
			
		||||
msgid "Toggle window on all workspaces or one"
 | 
			
		||||
msgstr "Přepnout okno na všechny/jednu pracovní plochu"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-windows.xml:31
 | 
			
		||||
#: data/50-mutter-windows.xml:29
 | 
			
		||||
msgid "Raise window if covered, otherwise lower it"
 | 
			
		||||
msgstr "Když je okno zakryté vynést jej do popředí, jinak odsunout do pozadí"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-windows.xml:33
 | 
			
		||||
#: data/50-mutter-windows.xml:31
 | 
			
		||||
msgid "Raise window above other windows"
 | 
			
		||||
msgstr "Vynést okno do popředí nad ostatní okna"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-windows.xml:35
 | 
			
		||||
#: data/50-mutter-windows.xml:33
 | 
			
		||||
msgid "Lower window below other windows"
 | 
			
		||||
msgstr "Odsunout okno do pozadí za ostatní okna"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-windows.xml:37
 | 
			
		||||
#: data/50-mutter-windows.xml:35
 | 
			
		||||
msgid "Maximize window vertically"
 | 
			
		||||
msgstr "Maximalizovat okno svisle"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-windows.xml:39
 | 
			
		||||
#: data/50-mutter-windows.xml:37
 | 
			
		||||
msgid "Maximize window horizontally"
 | 
			
		||||
msgstr "Maximalizovat okno vodorovně"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-windows.xml:43
 | 
			
		||||
#: data/50-mutter-windows.xml:41
 | 
			
		||||
msgid "View split on left"
 | 
			
		||||
msgstr "Rozdělit okno přes levou půlku obrazovky"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-windows.xml:47
 | 
			
		||||
#: data/50-mutter-windows.xml:45
 | 
			
		||||
msgid "View split on right"
 | 
			
		||||
msgstr "Rozdělit okno přes pravou půlku obrazovky"
 | 
			
		||||
 | 
			
		||||
@@ -413,32 +396,37 @@ msgid ""
 | 
			
		||||
"proof. Currently possible keywords: • “scale-monitor-framebuffer” — makes "
 | 
			
		||||
"mutter default to layout logical monitors in a logical pixel coordinate "
 | 
			
		||||
"space, while scaling monitor framebuffers instead of window content, to "
 | 
			
		||||
"manage HiDPI monitors. Does not require a restart."
 | 
			
		||||
"manage HiDPI monitors. Does not require a restart. • “remote-desktop” — "
 | 
			
		||||
"enables remote desktop support. To support remote desktop with screen "
 | 
			
		||||
"sharing, “screen-cast” must also be enabled. • “screen-cast” — enables "
 | 
			
		||||
"screen cast support."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Chcete-li povolit experimentální funkce, přidejte klíčové slovo funkce do "
 | 
			
		||||
"seznamu. Zda funkce vyžaduje restartování kompozitoru, závisí na dané "
 | 
			
		||||
"funkci. Ne u každé experimentální funkce je vyžadováno, aby byla stále "
 | 
			
		||||
"dostupná nebo konfigurovatelná. Neočekávejte, že by bylo v tomto nastavení "
 | 
			
		||||
"přidáno něco, co by do budoucna přineslo vylepšení. V současné době jsou "
 | 
			
		||||
"možná tato klíčová slova: • „scale-monitor-framebuffer“ – zajistí, "
 | 
			
		||||
"aby byl mutter výchozí pro logické uspořádání monitorů v logickém "
 | 
			
		||||
"souřadnicovém prostoru pixelů, zatímco škáluje přímo v grafické vyrovnávací "
 | 
			
		||||
"paměti, namísto v obsahu oken, aby se postaral o správu montorů s HiDPI. "
 | 
			
		||||
"Nevyžaduje restart."
 | 
			
		||||
"možná tato klíčová slova: • „scale-monitor-framebuffer“ – zajistí, aby byl "
 | 
			
		||||
"mutter výchozí pro logické uspořádání monitorů v logickém souřadnicovém "
 | 
			
		||||
"prostoru pixelů, zatímco škáluje přímo v grafické vyrovnávací paměti, "
 | 
			
		||||
"namísto v obsahu oken, aby se postaral o správu montorů s HiDPI. Nevyžaduje "
 | 
			
		||||
"restart. • „remote-desktop“ – zapne podporu pro vzdálenou pracovní plochu. "
 | 
			
		||||
"Pro podporu vzdálené plochy se sdílením obrazovky musít být zapnuto také "
 | 
			
		||||
"„screen-cast“. • „screen-cast“ – zapne podporu pro vysílání obsahu obrazovky."
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:141
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:145
 | 
			
		||||
msgid "Select window from tab popup"
 | 
			
		||||
msgstr "Vybrat okno z překryvné nabídky tabulátoru"
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:146
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:150
 | 
			
		||||
msgid "Cancel tab popup"
 | 
			
		||||
msgstr "Zrušit překryvné okno tabulátoru"
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:151
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:155
 | 
			
		||||
msgid "Switch monitor configurations"
 | 
			
		||||
msgstr "Přepnout nastavení monitoru"
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:156
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:160
 | 
			
		||||
msgid "Rotates the built-in monitor configuration"
 | 
			
		||||
msgstr "Postupně mění vestavěná nastavení monitoru"
 | 
			
		||||
 | 
			
		||||
@@ -494,10 +482,57 @@ msgstr "Přepnout na VT 12"
 | 
			
		||||
msgid "Re-enable shortcuts"
 | 
			
		||||
msgstr "Znovu povolit klávesové zkratky"
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:64
 | 
			
		||||
msgid "Allow grabs with Xwayland"
 | 
			
		||||
msgstr "Povolit zachytávání pomocí Xwaylandu"
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:65
 | 
			
		||||
msgid ""
 | 
			
		||||
"Allow keyboard grabs issued by X11 applications running in Xwayland to be "
 | 
			
		||||
"taken into account. For a X11 grab to be taken into account under Wayland, "
 | 
			
		||||
"the client must also either send a specific X11 ClientMessage to the root "
 | 
			
		||||
"window or be among the applications white-listed in key “xwayland-grab-"
 | 
			
		||||
"access-rules”."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Povolit, aby bylo bráno v úvahu zachytávání kláves, o které se stará "
 | 
			
		||||
"aplikace X11 běžící v Xwaylandu. Aby bylo pod Waylandem zachytávání bráno v "
 | 
			
		||||
"úvahu, musí klient navíc buď poslat specifickou zprávu X11 ClientMessage do "
 | 
			
		||||
"kořenového okna, nebo být mezi aplikacemi na bílé listině v klíči „xwayland-"
 | 
			
		||||
"grab-access-rules“."
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:77
 | 
			
		||||
msgid "Xwayland applications allowed to issue keyboard grabs"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Aplikace pod Xwaylandem mají povoleno se starat o zachytávání klávesnice"
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:78
 | 
			
		||||
msgid ""
 | 
			
		||||
"List the resource names or resource class of X11 windows either allowed or "
 | 
			
		||||
"not allowed to issue X11 keyboard grabs under Xwayland. The resource name or "
 | 
			
		||||
"resource class of a given X11 window can be obtained using the command "
 | 
			
		||||
"“xprop WM_CLASS”. Wildcards “*” and jokers “?” in the values are supported. "
 | 
			
		||||
"Values starting with “!” are blacklisted, which has precedence over the "
 | 
			
		||||
"whitelist, to revoke applications from the default system list. The default "
 | 
			
		||||
"system list includes the following applications: "
 | 
			
		||||
"“@XWAYLAND_GRAB_DEFAULT_ACCESS_RULES@” Users can break an existing grab by "
 | 
			
		||||
"using the specific keyboard shortcut defined by the keybinding key “restore-"
 | 
			
		||||
"shortcuts”."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Seznam názvů prostředků nebo tříd prostředků oken X11, které buď mají nebo "
 | 
			
		||||
"nemají povolené se starat o zachytávání klávesnice X11 pod Xwaylandem. Název "
 | 
			
		||||
"nebo třída prostředku daného okna X11 se dá zjistit pomocí příkazu „xprop "
 | 
			
		||||
"WM_CLASS“. V názvech jsou podporované divoké znaky „*“ a „?“. Hodnoty "
 | 
			
		||||
"začínající „!“ jsou na černé listině, což má přednost před bílou listinou, "
 | 
			
		||||
"aby se daly aplikace odvolat z výchozího systémového seznamu. Do výchozího "
 | 
			
		||||
"systémového seznamu patří následující aplikace: "
 | 
			
		||||
"„@XWAYLAND_GRAB_DEFAULT_ACCESS_RULES@“. Uživatel může přerušit existující "
 | 
			
		||||
"zachytávání pomocí speciální klávesové zkratky definované klíčem „restore-"
 | 
			
		||||
"shortcuts“."
 | 
			
		||||
 | 
			
		||||
#. TRANSLATORS: This string refers to a button that switches between
 | 
			
		||||
#. * different modes.
 | 
			
		||||
#.
 | 
			
		||||
#: src/backends/meta-input-settings.c:2151
 | 
			
		||||
#: src/backends/meta-input-settings.c:2325
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Mode Switch (Group %d)"
 | 
			
		||||
msgstr "Přepínač režimu (skupina %d)"
 | 
			
		||||
@@ -505,37 +540,37 @@ msgstr "Přepínač režimu (skupina %d)"
 | 
			
		||||
#. TRANSLATORS: This string refers to an action, cycles drawing tablets'
 | 
			
		||||
#. * mapping through the available outputs.
 | 
			
		||||
#.
 | 
			
		||||
#: src/backends/meta-input-settings.c:2174
 | 
			
		||||
#: src/backends/meta-input-settings.c:2348
 | 
			
		||||
msgid "Switch monitor"
 | 
			
		||||
msgstr "Přepnout monitor"
 | 
			
		||||
 | 
			
		||||
#: src/backends/meta-input-settings.c:2176
 | 
			
		||||
#: src/backends/meta-input-settings.c:2350
 | 
			
		||||
msgid "Show on-screen help"
 | 
			
		||||
msgstr "Zobrazit nápovědu na obrazovce"
 | 
			
		||||
 | 
			
		||||
#: src/backends/meta-monitor-manager.c:903
 | 
			
		||||
#: src/backends/meta-monitor-manager.c:900
 | 
			
		||||
msgid "Built-in display"
 | 
			
		||||
msgstr "Vestavěný displej"
 | 
			
		||||
 | 
			
		||||
#: src/backends/meta-monitor-manager.c:926
 | 
			
		||||
#: src/backends/meta-monitor-manager.c:923
 | 
			
		||||
msgid "Unknown"
 | 
			
		||||
msgstr "Neznámý"
 | 
			
		||||
 | 
			
		||||
#: src/backends/meta-monitor-manager.c:928
 | 
			
		||||
#: src/backends/meta-monitor-manager.c:925
 | 
			
		||||
msgid "Unknown Display"
 | 
			
		||||
msgstr "Neznámý displej"
 | 
			
		||||
 | 
			
		||||
#. TRANSLATORS: this is a monitor vendor name, followed by a
 | 
			
		||||
#. * size in inches, like 'Dell 15"'
 | 
			
		||||
#.
 | 
			
		||||
#: src/backends/meta-monitor-manager.c:936
 | 
			
		||||
#: src/backends/meta-monitor-manager.c:933
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "%s %s"
 | 
			
		||||
msgstr "%s %s"
 | 
			
		||||
 | 
			
		||||
#. 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:476
 | 
			
		||||
#: src/compositor/compositor.c:481
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid ""
 | 
			
		||||
"Another compositing manager is already running on screen %i on display “%s”."
 | 
			
		||||
@@ -550,42 +585,46 @@ msgstr "Událost zvonku"
 | 
			
		||||
msgid "Failed to open X Window System display “%s”\n"
 | 
			
		||||
msgstr "Nelze otevřít displej X Window System „%s“\n"
 | 
			
		||||
 | 
			
		||||
#: src/core/main.c:189
 | 
			
		||||
#: src/core/main.c:190
 | 
			
		||||
msgid "Disable connection to session manager"
 | 
			
		||||
msgstr "Zakáže připojení ke správci sezení"
 | 
			
		||||
 | 
			
		||||
#: src/core/main.c:195
 | 
			
		||||
#: src/core/main.c:196
 | 
			
		||||
msgid "Replace the running window manager"
 | 
			
		||||
msgstr "Nahradí běžícího správce oken"
 | 
			
		||||
 | 
			
		||||
#: src/core/main.c:201
 | 
			
		||||
#: src/core/main.c:202
 | 
			
		||||
msgid "Specify session management ID"
 | 
			
		||||
msgstr "Určení ID správy sezení"
 | 
			
		||||
 | 
			
		||||
#: src/core/main.c:206
 | 
			
		||||
#: src/core/main.c:207
 | 
			
		||||
msgid "X Display to use"
 | 
			
		||||
msgstr "Displej X, který použije"
 | 
			
		||||
 | 
			
		||||
#: src/core/main.c:212
 | 
			
		||||
#: src/core/main.c:213
 | 
			
		||||
msgid "Initialize session from savefile"
 | 
			
		||||
msgstr "Spustí sezení z uloženého souboru"
 | 
			
		||||
 | 
			
		||||
#: src/core/main.c:218
 | 
			
		||||
#: src/core/main.c:219
 | 
			
		||||
msgid "Make X calls synchronous"
 | 
			
		||||
msgstr "Provede volání X synchronně"
 | 
			
		||||
 | 
			
		||||
#: src/core/main.c:225
 | 
			
		||||
#: src/core/main.c:226
 | 
			
		||||
msgid "Run as a wayland compositor"
 | 
			
		||||
msgstr "Spustit jako kompozitor protokolu Wayland"
 | 
			
		||||
 | 
			
		||||
#: src/core/main.c:231
 | 
			
		||||
#: src/core/main.c:232
 | 
			
		||||
msgid "Run as a nested compositor"
 | 
			
		||||
msgstr "Spustit jako podkladový kompozitor"
 | 
			
		||||
 | 
			
		||||
#: src/core/main.c:239
 | 
			
		||||
#: src/core/main.c:240
 | 
			
		||||
msgid "Run as a full display server, rather than nested"
 | 
			
		||||
msgstr "Spustit jako plnohodnotný server displeje, nikoliv vnořeně"
 | 
			
		||||
 | 
			
		||||
#: src/core/main.c:246
 | 
			
		||||
msgid "Run with X11 backend"
 | 
			
		||||
msgstr "Spustit se serverem X11"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a window title
 | 
			
		||||
#: src/core/meta-close-dialog-default.c:147
 | 
			
		||||
#, c-format
 | 
			
		||||
@@ -641,7 +680,7 @@ msgstr "Zásuvný modul Mutter, který se má použít"
 | 
			
		||||
msgid "Workspace %d"
 | 
			
		||||
msgstr "Plocha %d"
 | 
			
		||||
 | 
			
		||||
#: src/core/screen.c:580
 | 
			
		||||
#: src/core/screen.c:583
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid ""
 | 
			
		||||
"Display “%s” already has a window manager; try using the --replace option to "
 | 
			
		||||
@@ -650,7 +689,7 @@ msgstr ""
 | 
			
		||||
"Displej „%s“ již správce oken má; zkuste prosím nahradit aktuálního správce "
 | 
			
		||||
"oken pomocí přepínače --replace."
 | 
			
		||||
 | 
			
		||||
#: src/core/screen.c:665
 | 
			
		||||
#: src/core/screen.c:668
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Screen %d on display “%s” is invalid\n"
 | 
			
		||||
msgstr "Obrazovka %d na displeji „%s“ je neplatná\n"
 | 
			
		||||
@@ -659,12 +698,12 @@ msgstr "Obrazovka %d na displeji „%s“ je neplatná\n"
 | 
			
		||||
msgid "Mutter was compiled without support for verbose mode\n"
 | 
			
		||||
msgstr "Mutter bylo přeloženo bez podpory podrobného režimu\n"
 | 
			
		||||
 | 
			
		||||
#: src/wayland/meta-wayland-tablet-pad.c:563
 | 
			
		||||
#: src/wayland/meta-wayland-tablet-pad.c:567
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Mode Switch: Mode %d"
 | 
			
		||||
msgstr "Přepínač režimu: režim %d"
 | 
			
		||||
 | 
			
		||||
#: src/x11/session.c:1815
 | 
			
		||||
#: src/x11/session.c:1818
 | 
			
		||||
msgid ""
 | 
			
		||||
"These windows do not support “save current setup” and will have to be "
 | 
			
		||||
"restarted manually next time you log in."
 | 
			
		||||
@@ -676,3 +715,18 @@ msgstr ""
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "%s (on %s)"
 | 
			
		||||
msgstr "%s (na %s)"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Move window one workspace to the left"
 | 
			
		||||
#~ msgstr "Přesunout okno o jednu pracovní plochu doleva"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Move window one workspace to the right"
 | 
			
		||||
#~ msgstr "Přesunout okno o jednu pracovní plochu doprava"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Move to workspace left"
 | 
			
		||||
#~ msgstr "Přesunout na plochu vlevo"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Move to workspace right"
 | 
			
		||||
#~ msgstr "Přesunout na plochu vpravo"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Toggle shaded state"
 | 
			
		||||
#~ msgstr "Přepnout stav svinutí"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										332
									
								
								po/de.po
									
									
									
									
									
								
							
							
						
						
									
										332
									
								
								po/de.po
									
									
									
									
									
								
							@@ -3,26 +3,26 @@
 | 
			
		||||
# Matthias Warkus <mawarkus@gnome.org>, 2002.
 | 
			
		||||
# Christian Neumair <chris@gnome-de.org>, 2002-2004.
 | 
			
		||||
# Hendrik Richter <hendrikr@gnome.org>, 2005, 2006, 2007, 2008.
 | 
			
		||||
# Mario Blättermann <mario.blaettermann@gmail.com>, 2010-2013, 2016-2017.
 | 
			
		||||
# Mario Blättermann <mario.blaettermann@gmail.com>, 2010-2013, 2016-2018.
 | 
			
		||||
# Christian Kirbach <Christian.Kirbach@googlemail.com>, 2009, 2011, 2012.
 | 
			
		||||
# Wolfgang Stöggl <c72578@yahoo.de> 2011.
 | 
			
		||||
# Wolfgang Stöggl <c72578@yahoo.de> 2011, 2017.
 | 
			
		||||
# Tobias Endrigkeit <tobiasendrigkeit@googlemail.com>, 2012.
 | 
			
		||||
# Tim Sabsch <timæsabsch.com>, 2018.
 | 
			
		||||
#
 | 
			
		||||
msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: mutter master\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?"
 | 
			
		||||
"product=mutter&keywords=I18N+L10N&component=general\n"
 | 
			
		||||
"POT-Creation-Date: 2017-05-10 19:07+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2017-05-12 17:35+0200\n"
 | 
			
		||||
"Last-Translator: Mario Blättermann <mario.blaettermann@gmail.com>\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/mutter/issues\n"
 | 
			
		||||
"POT-Creation-Date: 2018-02-26 07:59+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2018-02-26 21:26+0100\n"
 | 
			
		||||
"Last-Translator: Tim Sabsch <tim@sabsch.com>\n"
 | 
			
		||||
"Language-Team: Deutsch <gnome-de@gnome.org>\n"
 | 
			
		||||
"Language: de\n"
 | 
			
		||||
"MIME-Version: 1.0\n"
 | 
			
		||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
"Content-Transfer-Encoding: 8bit\n"
 | 
			
		||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
 | 
			
		||||
"X-Generator: Poedit 2.0.1\n"
 | 
			
		||||
"X-Generator: Poedit 2.0.6\n"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:6
 | 
			
		||||
msgid "Navigation"
 | 
			
		||||
@@ -49,134 +49,118 @@ msgid "Move window to last workspace"
 | 
			
		||||
msgstr "Fenster auf letzte Arbeitsfläche verschieben"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:24
 | 
			
		||||
msgid "Move window one workspace to the left"
 | 
			
		||||
msgstr "Fenster eine Arbeitsfläche nach links verschieben"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:27
 | 
			
		||||
msgid "Move window one workspace to the right"
 | 
			
		||||
msgstr "Fenster eine Arbeitsfläche nach rechts verschieben"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:30
 | 
			
		||||
msgid "Move window one workspace up"
 | 
			
		||||
msgstr "Fenster eine Arbeitsfläche nach oben verschieben"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:33
 | 
			
		||||
#: data/50-mutter-navigation.xml:27
 | 
			
		||||
msgid "Move window one workspace down"
 | 
			
		||||
msgstr "Fenster eine Arbeitsfläche nach unten verschieben"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:36
 | 
			
		||||
#: data/50-mutter-navigation.xml:30
 | 
			
		||||
msgid "Move window one monitor to the left"
 | 
			
		||||
msgstr "Fenster einen Bildschirm nach links verschieben"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:39
 | 
			
		||||
#: data/50-mutter-navigation.xml:33
 | 
			
		||||
msgid "Move window one monitor to the right"
 | 
			
		||||
msgstr "Fenster einen Bildschirm nach rechts verschieben"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:42
 | 
			
		||||
#: data/50-mutter-navigation.xml:36
 | 
			
		||||
msgid "Move window one monitor up"
 | 
			
		||||
msgstr "Fenster einen Bildschirm nach oben verschieben"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:45
 | 
			
		||||
#: data/50-mutter-navigation.xml:39
 | 
			
		||||
msgid "Move window one monitor down"
 | 
			
		||||
msgstr "Fenster einen Bildschirm nach unten verschieben"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:49
 | 
			
		||||
#: data/50-mutter-navigation.xml:43
 | 
			
		||||
msgid "Switch applications"
 | 
			
		||||
msgstr "Anwendungen wechseln"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:54
 | 
			
		||||
#: data/50-mutter-navigation.xml:48
 | 
			
		||||
msgid "Switch to previous application"
 | 
			
		||||
msgstr "Zur vorherigen Anwendung wechseln"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:58
 | 
			
		||||
#: data/50-mutter-navigation.xml:52
 | 
			
		||||
msgid "Switch windows"
 | 
			
		||||
msgstr "Fenster wechseln"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:63
 | 
			
		||||
#: data/50-mutter-navigation.xml:57
 | 
			
		||||
msgid "Switch to previous window"
 | 
			
		||||
msgstr "Zum vorherigen Fenster wechseln"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:67
 | 
			
		||||
#: data/50-mutter-navigation.xml:61
 | 
			
		||||
msgid "Switch windows of an application"
 | 
			
		||||
msgstr "Zwischen den Fenstern einer Anwendung wechseln"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:72
 | 
			
		||||
#: data/50-mutter-navigation.xml:66
 | 
			
		||||
msgid "Switch to previous window of an application"
 | 
			
		||||
msgstr "Zum vorherigen Fenster einer Anwendung wechseln"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:76
 | 
			
		||||
#: data/50-mutter-navigation.xml:70
 | 
			
		||||
msgid "Switch system controls"
 | 
			
		||||
msgstr "Systemsteuerungen umschalten"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:81
 | 
			
		||||
#: data/50-mutter-navigation.xml:75
 | 
			
		||||
msgid "Switch to previous system control"
 | 
			
		||||
msgstr "Zur vorherigen Systemsteuerungen wechseln"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:85
 | 
			
		||||
#: data/50-mutter-navigation.xml:79
 | 
			
		||||
msgid "Switch windows directly"
 | 
			
		||||
msgstr "Fenster sofort wechseln"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:90
 | 
			
		||||
#: data/50-mutter-navigation.xml:84
 | 
			
		||||
msgid "Switch directly to previous window"
 | 
			
		||||
msgstr "Direkt zum vorherigen Fenster wechseln"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:94
 | 
			
		||||
#: data/50-mutter-navigation.xml:88
 | 
			
		||||
msgid "Switch windows of an app directly"
 | 
			
		||||
msgstr "Sofort zwischen den Fenstern einer Anwendung wechseln"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:99
 | 
			
		||||
#: data/50-mutter-navigation.xml:93
 | 
			
		||||
msgid "Switch directly to previous window of an app"
 | 
			
		||||
msgstr "Direkt zum vorherigen Fenster einer Anwendung wechseln"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:103
 | 
			
		||||
#: data/50-mutter-navigation.xml:97
 | 
			
		||||
msgid "Switch system controls directly"
 | 
			
		||||
msgstr "Systemsteuerungen sofort umschalten"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:108
 | 
			
		||||
#: data/50-mutter-navigation.xml:102
 | 
			
		||||
msgid "Switch directly to previous system control"
 | 
			
		||||
msgstr "Direkt zur vorherigen Systemsteuerungen wechselen"
 | 
			
		||||
msgstr "Direkt zur vorherigen Systemsteuerungen wechseln"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:111
 | 
			
		||||
#: data/50-mutter-navigation.xml:105
 | 
			
		||||
msgid "Hide all normal windows"
 | 
			
		||||
msgstr "Alle normalen Fenster verbergen"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:114
 | 
			
		||||
#: data/50-mutter-navigation.xml:108
 | 
			
		||||
msgid "Switch to workspace 1"
 | 
			
		||||
msgstr "Zur Arbeitsfläche 1 wechseln"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:117
 | 
			
		||||
#: data/50-mutter-navigation.xml:111
 | 
			
		||||
msgid "Switch to workspace 2"
 | 
			
		||||
msgstr "Zur Arbeitsfläche 2 wechseln"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:120
 | 
			
		||||
#: data/50-mutter-navigation.xml:114
 | 
			
		||||
msgid "Switch to workspace 3"
 | 
			
		||||
msgstr "Zur Arbeitsfläche 3 wechseln"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:123
 | 
			
		||||
#: data/50-mutter-navigation.xml:117
 | 
			
		||||
msgid "Switch to workspace 4"
 | 
			
		||||
msgstr "Zur Arbeitsfläche 4 wechseln"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:126
 | 
			
		||||
#: data/50-mutter-navigation.xml:120
 | 
			
		||||
msgid "Switch to last workspace"
 | 
			
		||||
msgstr "Zur letzten Arbeitsfläche wechseln"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:129
 | 
			
		||||
msgid "Move to workspace left"
 | 
			
		||||
msgstr "Auf Arbeitsfläche links verschieben"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:132
 | 
			
		||||
msgid "Move to workspace right"
 | 
			
		||||
msgstr "Auf Arbeitsfläche rechts verschieben"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:135
 | 
			
		||||
#: data/50-mutter-navigation.xml:123
 | 
			
		||||
msgid "Move to workspace above"
 | 
			
		||||
msgstr "Auf Arbeitsfläche darüber verschieben"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-navigation.xml:138
 | 
			
		||||
#: data/50-mutter-navigation.xml:126
 | 
			
		||||
msgid "Move to workspace below"
 | 
			
		||||
msgstr "Auf Arbeitsfläche darunter verschieben"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-system.xml:6
 | 
			
		||||
#: data/50-mutter-system.xml:6 data/50-mutter-wayland.xml:6
 | 
			
		||||
msgid "System"
 | 
			
		||||
msgstr "System"
 | 
			
		||||
 | 
			
		||||
@@ -188,6 +172,10 @@ msgstr "Den »Befehl ausführen«-Dialog anzeigen"
 | 
			
		||||
msgid "Show the activities overview"
 | 
			
		||||
msgstr "Aktivitäten-Übersicht anzeigen"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-wayland.xml:8
 | 
			
		||||
msgid "Restore the keyboard shortcuts"
 | 
			
		||||
msgstr "Die Tastenkombinationen wiederherstellen"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-windows.xml:6
 | 
			
		||||
msgid "Windows"
 | 
			
		||||
msgstr "Fenster"
 | 
			
		||||
@@ -213,55 +201,51 @@ msgid "Restore window"
 | 
			
		||||
msgstr "Fenstergröße wiederherstellen"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-windows.xml:18
 | 
			
		||||
msgid "Toggle shaded state"
 | 
			
		||||
msgstr "Fenster ein-/ausrollen"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-windows.xml:20
 | 
			
		||||
msgid "Close window"
 | 
			
		||||
msgstr "Fenster schließen"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-windows.xml:22
 | 
			
		||||
#: data/50-mutter-windows.xml:20
 | 
			
		||||
msgid "Hide window"
 | 
			
		||||
msgstr "Fenster verbergen"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-windows.xml:24
 | 
			
		||||
#: data/50-mutter-windows.xml:22
 | 
			
		||||
msgid "Move window"
 | 
			
		||||
msgstr "Fenster verschieben"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-windows.xml:26
 | 
			
		||||
#: data/50-mutter-windows.xml:24
 | 
			
		||||
msgid "Resize window"
 | 
			
		||||
msgstr "Fenstergröße ändern"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-windows.xml:29
 | 
			
		||||
#: data/50-mutter-windows.xml:27
 | 
			
		||||
msgid "Toggle window on all workspaces or one"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Festlegen, ob das Fenster auf allen oder nur einer Arbeitsfläche sichtbar ist"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-windows.xml:31
 | 
			
		||||
#: data/50-mutter-windows.xml:29
 | 
			
		||||
msgid "Raise window if covered, otherwise lower it"
 | 
			
		||||
msgstr "Fenster anheben, falls es verdeckt ist, andernfalls absenken"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-windows.xml:33
 | 
			
		||||
#: data/50-mutter-windows.xml:31
 | 
			
		||||
msgid "Raise window above other windows"
 | 
			
		||||
msgstr "Fenster vor die anderen Fenster anheben"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-windows.xml:35
 | 
			
		||||
#: data/50-mutter-windows.xml:33
 | 
			
		||||
msgid "Lower window below other windows"
 | 
			
		||||
msgstr "Fenster hinter die anderen Fenster absenken"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-windows.xml:37
 | 
			
		||||
#: data/50-mutter-windows.xml:35
 | 
			
		||||
msgid "Maximize window vertically"
 | 
			
		||||
msgstr "Fenster vertikal maximieren"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-windows.xml:39
 | 
			
		||||
#: data/50-mutter-windows.xml:37
 | 
			
		||||
msgid "Maximize window horizontally"
 | 
			
		||||
msgstr "Fenster horizontal maximieren"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-windows.xml:43
 | 
			
		||||
#: data/50-mutter-windows.xml:41
 | 
			
		||||
msgid "View split on left"
 | 
			
		||||
msgstr "Ansicht links teilen"
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-windows.xml:47
 | 
			
		||||
#: data/50-mutter-windows.xml:45
 | 
			
		||||
msgid "View split on right"
 | 
			
		||||
msgstr "Ansicht rechts teilen"
 | 
			
		||||
 | 
			
		||||
@@ -319,7 +303,7 @@ msgstr ""
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:40
 | 
			
		||||
msgid "Workspaces are managed dynamically"
 | 
			
		||||
msgstr "Arbeitsflächen sollen dynamisch verwaltet werden "
 | 
			
		||||
msgstr "Arbeitsflächen sollen dynamisch verwaltet werden"
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:41
 | 
			
		||||
msgid ""
 | 
			
		||||
@@ -405,14 +389,13 @@ msgid ""
 | 
			
		||||
"screen of the monitor."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Falls wahr, so werden neue Fenster immer in der Mitte des aktiven "
 | 
			
		||||
"Bildschirms platziert"
 | 
			
		||||
"Bildschirms platziert."
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:107
 | 
			
		||||
msgid "Enable experimental features"
 | 
			
		||||
msgstr "Experimentelle Funktionsmerkmale aktivieren"
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:108
 | 
			
		||||
#, fuzzy
 | 
			
		||||
msgid ""
 | 
			
		||||
"To enable experimental features, add the feature keyword to the list. "
 | 
			
		||||
"Whether the feature requires restarting the compositor depends on the given "
 | 
			
		||||
@@ -421,23 +404,43 @@ msgid ""
 | 
			
		||||
"proof. Currently possible keywords: • “scale-monitor-framebuffer” — makes "
 | 
			
		||||
"mutter default to layout logical monitors in a logical pixel coordinate "
 | 
			
		||||
"space, while scaling monitor framebuffers instead of window content, to "
 | 
			
		||||
"manage HiDPI monitors. Does not require a restart."
 | 
			
		||||
"manage HiDPI monitors. Does not require a restart. • “remote-desktop” — "
 | 
			
		||||
"enables remote desktop support. To support remote desktop with screen "
 | 
			
		||||
"sharing, “screen-cast” must also be enabled. • “screen-cast” — enables "
 | 
			
		||||
"screen cast support."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Um experimentelle Funktionsmerkmale zu aktivieren, fügen Sie das "
 | 
			
		||||
"entsprechende Schlüsselwort zur Liste hinzu. Möglicherweise muss der "
 | 
			
		||||
"Compositor neu gestartet werden, um es zu aktivieren. Für diese "
 | 
			
		||||
"experimentellen Funktionsmerkmale gilt, dass sie nicht unbedingt dauerhaft "
 | 
			
		||||
"verfügbar sein werden, oder Einstellungen möglich sind. Derzeit mögliche "
 | 
			
		||||
"Schlüsselwörter: • “scale-monitor-framebuffer” — "
 | 
			
		||||
"Compositor neu gestartet werden, um es zu aktivieren, dies ist vom "
 | 
			
		||||
"Funktionsmerkmal abhängig. Für diese experimentellen Funktionsmerkmale gilt, "
 | 
			
		||||
"dass sie nicht unbedingt dauerhaft verfügbar sein werden, oder Einstellungen "
 | 
			
		||||
"möglich sind. Derzeit mögliche Schlüsselwörter: • »scale-monitor-"
 | 
			
		||||
"framebuffer« – weist Mutter an, in der Voreinstellung logische Bildschirme "
 | 
			
		||||
"in einem logischen Pixel-Koordinatensystem anzuordnen, wobei die Bildschirm-"
 | 
			
		||||
"Framebuffer anstelle der Fensterinhalte skaliert werden, um HiDPI-"
 | 
			
		||||
"Bildschirme besser versorgen zu können. Dafür ist kein Neustart "
 | 
			
		||||
"erforderlich. • »remote-desktop« – aktiviert Remotedesktop-Unterstützung. Um "
 | 
			
		||||
"das Teilen von Bildschirmen mittels Remotedesktop zu unterstützen, muss "
 | 
			
		||||
"»screen-cast« ebenfalls aktiviert sein. • »screen-cast« – aktiviert »screen "
 | 
			
		||||
"cast«-Unterstützung."
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:141
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:145
 | 
			
		||||
msgid "Select window from tab popup"
 | 
			
		||||
msgstr "Fenster aus Tab-Anzeige auswählen"
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:146
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:150
 | 
			
		||||
msgid "Cancel tab popup"
 | 
			
		||||
msgstr "Tab-Anzeige abbrechen"
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:155
 | 
			
		||||
msgid "Switch monitor configurations"
 | 
			
		||||
msgstr "Bildschirmkonfigurationen wechseln"
 | 
			
		||||
 | 
			
		||||
# Ich denke nicht, dass »rotate« hier die Bildschirmdrehung meint, sondern eher eine Liste aus Konfigurationen rotiert (d.h. umgewälzt) wird.
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:160
 | 
			
		||||
msgid "Rotates the built-in monitor configuration"
 | 
			
		||||
msgstr "Wechselt die Konfiguration des eingebauten Bildschirms"
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:6
 | 
			
		||||
msgid "Switch to VT 1"
 | 
			
		||||
msgstr "Zum virtuellen Terminal 1 wechseln"
 | 
			
		||||
@@ -486,10 +489,63 @@ msgstr "Zum virtuellen Terminal 11 wechseln"
 | 
			
		||||
msgid "Switch to VT 12"
 | 
			
		||||
msgstr "Zum virtuellen Terminal 12 wechseln"
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:54
 | 
			
		||||
msgid "Re-enable shortcuts"
 | 
			
		||||
msgstr "Tastenkombinationen erneut aktivieren"
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:64
 | 
			
		||||
msgid "Allow grabs with Xwayland"
 | 
			
		||||
msgstr "Tastatur-Kontrollübernahmen in Xwayland erlauben"
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:65
 | 
			
		||||
msgid ""
 | 
			
		||||
"Allow keyboard grabs issued by X11 applications running in Xwayland to be "
 | 
			
		||||
"taken into account. For a X11 grab to be taken into account under Wayland, "
 | 
			
		||||
"the client must also either send a specific X11 ClientMessage to the root "
 | 
			
		||||
"window or be among the applications white-listed in key “xwayland-grab-"
 | 
			
		||||
"access-rules”."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Erlauben, dass in Xwayland laufende X11-Anwendungen Kontrolle über die "
 | 
			
		||||
"Tastatur übernehmen dürfen. Damit eine X11-Kontrollübernahme unter Wayland "
 | 
			
		||||
"durchgeführt werden kann, muss der Client auch entweder eine spezifische X11-"
 | 
			
		||||
"ClientMessage an das Root-Fenster senden oder in den als »whitelisted« im "
 | 
			
		||||
"Schlüssel »xwayland-grab-access-rules« aufgelisteten Anwendungen enthalten "
 | 
			
		||||
"sein."
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:77
 | 
			
		||||
msgid "Xwayland applications allowed to issue keyboard grabs"
 | 
			
		||||
msgstr "Xwayland-Anwendungen mit Erlaubnis zur Kontrollübernahme der Tastatur"
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:78
 | 
			
		||||
msgid ""
 | 
			
		||||
"List the resource names or resource class of X11 windows either allowed or "
 | 
			
		||||
"not allowed to issue X11 keyboard grabs under Xwayland. The resource name or "
 | 
			
		||||
"resource class of a given X11 window can be obtained using the command "
 | 
			
		||||
"“xprop WM_CLASS”. Wildcards “*” and jokers “?” in the values are supported. "
 | 
			
		||||
"Values starting with “!” are blacklisted, which has precedence over the "
 | 
			
		||||
"whitelist, to revoke applications from the default system list. The default "
 | 
			
		||||
"system list includes the following applications: "
 | 
			
		||||
"“@XWAYLAND_GRAB_DEFAULT_ACCESS_RULES@” Users can break an existing grab by "
 | 
			
		||||
"using the specific keyboard shortcut defined by the keybinding key “restore-"
 | 
			
		||||
"shortcuts”."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Listet die Ressourcennamen oder -klassen von X11-Fenstern auf, die unter "
 | 
			
		||||
"Xwayland X11-Tastatur-Kontrollübernahmen durchführen dürfen. Ressourcenname "
 | 
			
		||||
"oder -klasse eines bestimmten X11-Fensters kann mit dem Befehl »xprop "
 | 
			
		||||
"WM_CLASS« ermittelt werden. Dabei werden »*« als Platzhalter und »?« als "
 | 
			
		||||
"Joker in den Wertangaben unterstützt. Mit »!« beginnende Werte gelten als "
 | 
			
		||||
"»blacklisted« und werden gegenüber den als »whitelisted« markierten Werten "
 | 
			
		||||
"bevorzugt, um in der Standardliste des Systems aufgeführte Anwendungen außer "
 | 
			
		||||
"Kraft zu setzen. Die Standardliste des Systems enthält die folgenden "
 | 
			
		||||
"Anwendungen: »@XWAYLAND_GRAB_DEFAULT_ACCESS_RULES@« Benutzer können eine "
 | 
			
		||||
"existierende Kontrollübernahme unterbrechen, indem sie das spezifische "
 | 
			
		||||
"Tastenkürzel verwenden, wie es im Schlüssel »restore-shortcuts« angegeben "
 | 
			
		||||
"ist."
 | 
			
		||||
 | 
			
		||||
#. TRANSLATORS: This string refers to a button that switches between
 | 
			
		||||
#. * different modes.
 | 
			
		||||
#.
 | 
			
		||||
#: src/backends/meta-input-settings.c:1848
 | 
			
		||||
#: src/backends/meta-input-settings.c:2325
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Mode Switch (Group %d)"
 | 
			
		||||
msgstr "Moduswechsel (Gruppe %d)"
 | 
			
		||||
@@ -497,37 +553,37 @@ msgstr "Moduswechsel (Gruppe %d)"
 | 
			
		||||
#. TRANSLATORS: This string refers to an action, cycles drawing tablets'
 | 
			
		||||
#. * mapping through the available outputs.
 | 
			
		||||
#.
 | 
			
		||||
#: src/backends/meta-input-settings.c:1870
 | 
			
		||||
#: src/backends/meta-input-settings.c:2348
 | 
			
		||||
msgid "Switch monitor"
 | 
			
		||||
msgstr "Bildschirm wechseln"
 | 
			
		||||
 | 
			
		||||
#: src/backends/meta-input-settings.c:1872
 | 
			
		||||
#: src/backends/meta-input-settings.c:2350
 | 
			
		||||
msgid "Show on-screen help"
 | 
			
		||||
msgstr "Bildschirmhilfe anzeigen"
 | 
			
		||||
 | 
			
		||||
#: src/backends/meta-monitor-manager.c:783
 | 
			
		||||
#: src/backends/meta-monitor-manager.c:900
 | 
			
		||||
msgid "Built-in display"
 | 
			
		||||
msgstr "Eingebaute Anzeige"
 | 
			
		||||
 | 
			
		||||
#: src/backends/meta-monitor-manager.c:806
 | 
			
		||||
#: src/backends/meta-monitor-manager.c:923
 | 
			
		||||
msgid "Unknown"
 | 
			
		||||
msgstr "Unbekannt"
 | 
			
		||||
 | 
			
		||||
#: src/backends/meta-monitor-manager.c:808
 | 
			
		||||
#: src/backends/meta-monitor-manager.c:925
 | 
			
		||||
msgid "Unknown Display"
 | 
			
		||||
msgstr "Unbekannte Anzeige"
 | 
			
		||||
 | 
			
		||||
#. TRANSLATORS: this is a monitor vendor name, followed by a
 | 
			
		||||
#. * size in inches, like 'Dell 15"'
 | 
			
		||||
#.
 | 
			
		||||
#: src/backends/meta-monitor-manager.c:816
 | 
			
		||||
#: src/backends/meta-monitor-manager.c:933
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "%s %s"
 | 
			
		||||
msgstr "%s %s"
 | 
			
		||||
 | 
			
		||||
#. 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:474
 | 
			
		||||
#: src/compositor/compositor.c:481
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid ""
 | 
			
		||||
"Another compositing manager is already running on screen %i on display “%s”."
 | 
			
		||||
@@ -539,17 +595,62 @@ msgstr ""
 | 
			
		||||
msgid "Bell event"
 | 
			
		||||
msgstr "Klangereignis"
 | 
			
		||||
 | 
			
		||||
#: src/core/display.c:608
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Failed to open X Window System display “%s”\n"
 | 
			
		||||
msgstr "X-Window-Systemanzeige »%s« konnte nicht geöffnet werden\n"
 | 
			
		||||
 | 
			
		||||
#: src/core/main.c:190
 | 
			
		||||
msgid "Disable connection to session manager"
 | 
			
		||||
msgstr "Verbindung zur Sitzungsverwaltung deaktivieren"
 | 
			
		||||
 | 
			
		||||
#: src/core/main.c:196
 | 
			
		||||
msgid "Replace the running window manager"
 | 
			
		||||
msgstr "Den aktuellen Fensterverwalter ersetzen"
 | 
			
		||||
 | 
			
		||||
#: src/core/main.c:202
 | 
			
		||||
msgid "Specify session management ID"
 | 
			
		||||
msgstr "Kennung der Sitzungsverwaltung angeben"
 | 
			
		||||
 | 
			
		||||
#: src/core/main.c:207
 | 
			
		||||
msgid "X Display to use"
 | 
			
		||||
msgstr "Zu verwendende X-Anzeige"
 | 
			
		||||
 | 
			
		||||
#: src/core/main.c:213
 | 
			
		||||
msgid "Initialize session from savefile"
 | 
			
		||||
msgstr "Sitzung anhand gespeicherter Datei starten"
 | 
			
		||||
 | 
			
		||||
#: src/core/main.c:219
 | 
			
		||||
msgid "Make X calls synchronous"
 | 
			
		||||
msgstr "X-Aufrufe abgleichen"
 | 
			
		||||
 | 
			
		||||
#: src/core/main.c:226
 | 
			
		||||
msgid "Run as a wayland compositor"
 | 
			
		||||
msgstr "Als Wayland-Compositor ausführen"
 | 
			
		||||
 | 
			
		||||
#: src/core/main.c:232
 | 
			
		||||
msgid "Run as a nested compositor"
 | 
			
		||||
msgstr "Als eingebetteten Compositor ausführen"
 | 
			
		||||
 | 
			
		||||
#: src/core/main.c:240
 | 
			
		||||
msgid "Run as a full display server, rather than nested"
 | 
			
		||||
msgstr "Als vollwertigen Display-Server verwenden (nicht eingebettet)"
 | 
			
		||||
 | 
			
		||||
#: src/core/main.c:246
 | 
			
		||||
msgid "Run with X11 backend"
 | 
			
		||||
msgstr "Mit X11-Backend ausführen"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a window title
 | 
			
		||||
#: src/core/delete.c:127
 | 
			
		||||
#: src/core/meta-close-dialog-default.c:147
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "“%s” is not responding."
 | 
			
		||||
msgstr "»%s« antwortet nicht."
 | 
			
		||||
 | 
			
		||||
#: src/core/delete.c:129
 | 
			
		||||
#: src/core/meta-close-dialog-default.c:149
 | 
			
		||||
msgid "Application is not responding."
 | 
			
		||||
msgstr "Die Anwendung antwortet nicht."
 | 
			
		||||
 | 
			
		||||
#: src/core/delete.c:134
 | 
			
		||||
#: src/core/meta-close-dialog-default.c:154
 | 
			
		||||
msgid ""
 | 
			
		||||
"You may choose to wait a short while for it to continue or force the "
 | 
			
		||||
"application to quit entirely."
 | 
			
		||||
@@ -557,55 +658,14 @@ msgstr ""
 | 
			
		||||
"Sie können der Anwendung noch etwas Zeit geben oder ein sofortiges Beenden "
 | 
			
		||||
"erzwingen."
 | 
			
		||||
 | 
			
		||||
#: src/core/delete.c:141
 | 
			
		||||
#: src/core/meta-close-dialog-default.c:161
 | 
			
		||||
msgid "_Force Quit"
 | 
			
		||||
msgstr "_Beenden erzwingen"
 | 
			
		||||
 | 
			
		||||
#: src/core/delete.c:141
 | 
			
		||||
#: src/core/meta-close-dialog-default.c:161
 | 
			
		||||
msgid "_Wait"
 | 
			
		||||
msgstr "_Warten"
 | 
			
		||||
 | 
			
		||||
#: src/core/display.c:608
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Failed to open X Window System display “%s”\n"
 | 
			
		||||
msgstr "X-Window-Systemanzeige »%s« konnte nicht geöffnet werden\n"
 | 
			
		||||
 | 
			
		||||
#: src/core/main.c:189
 | 
			
		||||
msgid "Disable connection to session manager"
 | 
			
		||||
msgstr "Verbindung zur Sitzungsverwaltung deaktivieren"
 | 
			
		||||
 | 
			
		||||
#: src/core/main.c:195
 | 
			
		||||
msgid "Replace the running window manager"
 | 
			
		||||
msgstr "Den aktuellen Fensterverwalter ersetzen"
 | 
			
		||||
 | 
			
		||||
#: src/core/main.c:201
 | 
			
		||||
msgid "Specify session management ID"
 | 
			
		||||
msgstr "Kennung der Sitzungsverwaltung angeben"
 | 
			
		||||
 | 
			
		||||
#: src/core/main.c:206
 | 
			
		||||
msgid "X Display to use"
 | 
			
		||||
msgstr "Zu verwendende X-Anzeige"
 | 
			
		||||
 | 
			
		||||
#: src/core/main.c:212
 | 
			
		||||
msgid "Initialize session from savefile"
 | 
			
		||||
msgstr "Sitzung anhand gespeicherter Datei starten"
 | 
			
		||||
 | 
			
		||||
#: src/core/main.c:218
 | 
			
		||||
msgid "Make X calls synchronous"
 | 
			
		||||
msgstr "X-Aufrufe abgleichen"
 | 
			
		||||
 | 
			
		||||
#: src/core/main.c:225
 | 
			
		||||
msgid "Run as a wayland compositor"
 | 
			
		||||
msgstr "Als Wayland-Compositor ausführen"
 | 
			
		||||
 | 
			
		||||
#: src/core/main.c:231
 | 
			
		||||
msgid "Run as a nested compositor"
 | 
			
		||||
msgstr "Als eingebetteten Compositor ausführen"
 | 
			
		||||
 | 
			
		||||
#: src/core/main.c:239
 | 
			
		||||
msgid "Run as a full display server, rather than nested"
 | 
			
		||||
msgstr "Als vollwertigen Display-Server verwenden (nicht eingebettet)"
 | 
			
		||||
 | 
			
		||||
# CHECK
 | 
			
		||||
# c-format
 | 
			
		||||
#: src/core/mutter.c:39
 | 
			
		||||
@@ -637,7 +697,7 @@ msgstr "Zu benutzendes Mutter-Plugin"
 | 
			
		||||
msgid "Workspace %d"
 | 
			
		||||
msgstr "Arbeitsfläche %d"
 | 
			
		||||
 | 
			
		||||
#: src/core/screen.c:580
 | 
			
		||||
#: src/core/screen.c:583
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid ""
 | 
			
		||||
"Display “%s” already has a window manager; try using the --replace option to "
 | 
			
		||||
@@ -646,7 +706,7 @@ msgstr ""
 | 
			
		||||
"Bildschirm »%s« hat bereits einen Fensterverwalter. Versuchen Sie die Option "
 | 
			
		||||
"»--replace«, um den aktuellen Fensterverwalter zu ersetzen."
 | 
			
		||||
 | 
			
		||||
#: src/core/screen.c:665
 | 
			
		||||
#: src/core/screen.c:668
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Screen %d on display “%s” is invalid\n"
 | 
			
		||||
msgstr "Bildschirm %d auf Anzeige »%s« ist ungültig\n"
 | 
			
		||||
@@ -655,12 +715,12 @@ msgstr "Bildschirm %d auf Anzeige »%s« ist ungültig\n"
 | 
			
		||||
msgid "Mutter was compiled without support for verbose mode\n"
 | 
			
		||||
msgstr "Mutter wurde ohne Unterstützung für den redseligen Modus kompiliert\n"
 | 
			
		||||
 | 
			
		||||
#: src/wayland/meta-wayland-tablet-pad.c:563
 | 
			
		||||
#: src/wayland/meta-wayland-tablet-pad.c:567
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Mode Switch: Mode %d"
 | 
			
		||||
msgstr "Moduswechsel: Modus %d"
 | 
			
		||||
 | 
			
		||||
#: src/x11/session.c:1815
 | 
			
		||||
#: src/x11/session.c:1818
 | 
			
		||||
msgid ""
 | 
			
		||||
"These windows do not support “save current setup” and will have to be "
 | 
			
		||||
"restarted manually next time you log in."
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										518
									
								
								po/eo.po
									
									
									
									
									
								
							
							
						
						
									
										518
									
								
								po/eo.po
									
									
									
									
									
								
							@@ -2,16 +2,16 @@
 | 
			
		||||
# Copyright (C) 2011 Free Software Foundation, Inc.
 | 
			
		||||
# This file is distributed under the same license as the mutter package.
 | 
			
		||||
# Michael MORONI < >, 2011.
 | 
			
		||||
# Kristjan SCHMIDT <kristjan.schmidt@googlemail.com>, 2011, 2012, 2015.
 | 
			
		||||
# Kristjan SCHMIDT <kristjan.schmidt@googlemail.com>, 2011, 2012, 2015, 2018.
 | 
			
		||||
msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: mutter\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=mutter"
 | 
			
		||||
"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=mutter"
 | 
			
		||||
"&keywords=I18N+L10N&component=general\n"
 | 
			
		||||
"POT-Creation-Date: 2015-02-14 11:06+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2015-02-14 22:34+0200\n"
 | 
			
		||||
"POT-Creation-Date: 2017-12-18 16:24+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2018-01-22 20:12+0200\n"
 | 
			
		||||
"Last-Translator: Kristjan SCHMIDT <kristjan.schmidt@googlemail.com>\n"
 | 
			
		||||
"Language-Team: Esperanto <gnome-l10n-eo@lists.launchpad.net>\n"
 | 
			
		||||
"Language-Team: Esperanto <gnome-eo-list@gnome.org>\n"
 | 
			
		||||
"Language: eo\n"
 | 
			
		||||
"MIME-Version: 1.0\n"
 | 
			
		||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
@@ -20,553 +20,675 @@ msgstr ""
 | 
			
		||||
"X-Generator: Virtaal 0.7.1\n"
 | 
			
		||||
"X-Project-Style: gnome\n"
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-navigation.xml.in.h:1
 | 
			
		||||
#: data/50-mutter-navigation.xml:6
 | 
			
		||||
msgid "Navigation"
 | 
			
		||||
msgstr "Navigado"
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-navigation.xml.in.h:2
 | 
			
		||||
#: data/50-mutter-navigation.xml:9
 | 
			
		||||
msgid "Move window to workspace 1"
 | 
			
		||||
msgstr "Movi la fenestron al laborspaco 1"
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-navigation.xml.in.h:3
 | 
			
		||||
#: data/50-mutter-navigation.xml:12
 | 
			
		||||
msgid "Move window to workspace 2"
 | 
			
		||||
msgstr "Movi la fenestron al laborspaco 2"
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-navigation.xml.in.h:4
 | 
			
		||||
#: data/50-mutter-navigation.xml:15
 | 
			
		||||
msgid "Move window to workspace 3"
 | 
			
		||||
msgstr "Movi la fenestron al laborspaco 3"
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-navigation.xml.in.h:5
 | 
			
		||||
#: data/50-mutter-navigation.xml:18
 | 
			
		||||
msgid "Move window to workspace 4"
 | 
			
		||||
msgstr "Movi la fenestron al laborspaco 4"
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-navigation.xml.in.h:6
 | 
			
		||||
#: data/50-mutter-navigation.xml:21
 | 
			
		||||
msgid "Move window to last workspace"
 | 
			
		||||
msgstr "Movi la fenestron al lasta laborspaco"
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-navigation.xml.in.h:7
 | 
			
		||||
#: data/50-mutter-navigation.xml:24
 | 
			
		||||
msgid "Move window one workspace to the left"
 | 
			
		||||
msgstr "Movi la fenestron al la maldekstra laborspaco"
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-navigation.xml.in.h:8
 | 
			
		||||
#: data/50-mutter-navigation.xml:27
 | 
			
		||||
msgid "Move window one workspace to the right"
 | 
			
		||||
msgstr "Movi la fenestron al la dekstra laborspaco"
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-navigation.xml.in.h:9
 | 
			
		||||
#: data/50-mutter-navigation.xml:30
 | 
			
		||||
msgid "Move window one workspace up"
 | 
			
		||||
msgstr "Movi la fenestron al la supra laborspaco"
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-navigation.xml.in.h:10
 | 
			
		||||
#: data/50-mutter-navigation.xml:33
 | 
			
		||||
msgid "Move window one workspace down"
 | 
			
		||||
msgstr "Movi la fenestron al la suba laborspaco"
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-navigation.xml.in.h:11
 | 
			
		||||
#: data/50-mutter-navigation.xml:36
 | 
			
		||||
msgid "Move window one monitor to the left"
 | 
			
		||||
msgstr "Movi la fenestron al la maldekstra ekrano"
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-navigation.xml.in.h:12
 | 
			
		||||
#: data/50-mutter-navigation.xml:39
 | 
			
		||||
msgid "Move window one monitor to the right"
 | 
			
		||||
msgstr "Movi la fenestron al la dekstra ekrano"
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-navigation.xml.in.h:13
 | 
			
		||||
#: data/50-mutter-navigation.xml:42
 | 
			
		||||
msgid "Move window one monitor up"
 | 
			
		||||
msgstr "Movi la fenestron al la supra ekrano"
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-navigation.xml.in.h:14
 | 
			
		||||
#: data/50-mutter-navigation.xml:45
 | 
			
		||||
msgid "Move window one monitor down"
 | 
			
		||||
msgstr "Movi la fenestron al la suba ekrano"
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-navigation.xml.in.h:15
 | 
			
		||||
#: data/50-mutter-navigation.xml:49
 | 
			
		||||
msgid "Switch applications"
 | 
			
		||||
msgstr "Ŝanĝi aplikaĵojn"
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-navigation.xml.in.h:16
 | 
			
		||||
#: data/50-mutter-navigation.xml:54
 | 
			
		||||
msgid "Switch to previous application"
 | 
			
		||||
msgstr "Ŝalti al antaŭa aplikaĵo"
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-navigation.xml.in.h:17
 | 
			
		||||
#: data/50-mutter-navigation.xml:58
 | 
			
		||||
msgid "Switch windows"
 | 
			
		||||
msgstr "Ŝanĝi fenestrojn"
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-navigation.xml.in.h:18
 | 
			
		||||
#: data/50-mutter-navigation.xml:63
 | 
			
		||||
msgid "Switch to previous window"
 | 
			
		||||
msgstr "Ŝalti al antaŭa fenestro"
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-navigation.xml.in.h:19
 | 
			
		||||
#: data/50-mutter-navigation.xml:67
 | 
			
		||||
msgid "Switch windows of an application"
 | 
			
		||||
msgstr "Ŝanĝi fenestrojn de aplikaĵo"
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-navigation.xml.in.h:20
 | 
			
		||||
#: data/50-mutter-navigation.xml:72
 | 
			
		||||
msgid "Switch to previous window of an application"
 | 
			
		||||
msgstr "Ŝalti al antaŭa fenestro de aplikaĵo"
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-navigation.xml.in.h:21
 | 
			
		||||
#: data/50-mutter-navigation.xml:76
 | 
			
		||||
msgid "Switch system controls"
 | 
			
		||||
msgstr "Ŝanĝi sistem-kontrolojn"
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-navigation.xml.in.h:22
 | 
			
		||||
#: data/50-mutter-navigation.xml:81
 | 
			
		||||
msgid "Switch to previous system control"
 | 
			
		||||
msgstr "Ŝalti al antaŭa sistem-kontrolo"
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-navigation.xml.in.h:23
 | 
			
		||||
#: data/50-mutter-navigation.xml:85
 | 
			
		||||
msgid "Switch windows directly"
 | 
			
		||||
msgstr "Ŝanĝi rekte fenestrojn"
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-navigation.xml.in.h:24
 | 
			
		||||
#: data/50-mutter-navigation.xml:90
 | 
			
		||||
msgid "Switch directly to previous window"
 | 
			
		||||
msgstr "Ŝalti rekte al antaŭa fenestro"
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-navigation.xml.in.h:25
 | 
			
		||||
#: data/50-mutter-navigation.xml:94
 | 
			
		||||
msgid "Switch windows of an app directly"
 | 
			
		||||
msgstr "Ŝanĝi rekte fenestrojn de aplikaĵo"
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-navigation.xml.in.h:26
 | 
			
		||||
#: data/50-mutter-navigation.xml:99
 | 
			
		||||
msgid "Switch directly to previous window of an app"
 | 
			
		||||
msgstr "Ŝalti rekte al antaŭa fenestro de aplikaĵo"
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-navigation.xml.in.h:27
 | 
			
		||||
#: data/50-mutter-navigation.xml:103
 | 
			
		||||
msgid "Switch system controls directly"
 | 
			
		||||
msgstr "Ŝalti rekte sistem-kontrolojn"
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-navigation.xml.in.h:28
 | 
			
		||||
#: data/50-mutter-navigation.xml:108
 | 
			
		||||
msgid "Switch directly to previous system control"
 | 
			
		||||
msgstr "Ŝalti rekte al antaŭa sistem-kontrolo"
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-navigation.xml.in.h:29
 | 
			
		||||
#: data/50-mutter-navigation.xml:111
 | 
			
		||||
msgid "Hide all normal windows"
 | 
			
		||||
msgstr "Kaŝi ĉiujn normalajn fenestrojn"
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-navigation.xml.in.h:30
 | 
			
		||||
#: data/50-mutter-navigation.xml:114
 | 
			
		||||
msgid "Switch to workspace 1"
 | 
			
		||||
msgstr "Ŝalti al laborspaco 1"
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-navigation.xml.in.h:31
 | 
			
		||||
#: data/50-mutter-navigation.xml:117
 | 
			
		||||
msgid "Switch to workspace 2"
 | 
			
		||||
msgstr "Ŝalti al laborspaco 2"
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-navigation.xml.in.h:32
 | 
			
		||||
#: data/50-mutter-navigation.xml:120
 | 
			
		||||
msgid "Switch to workspace 3"
 | 
			
		||||
msgstr "Ŝalti al laborspaco 3"
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-navigation.xml.in.h:33
 | 
			
		||||
#: data/50-mutter-navigation.xml:123
 | 
			
		||||
msgid "Switch to workspace 4"
 | 
			
		||||
msgstr "Ŝalti al laborspaco 4"
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-navigation.xml.in.h:34
 | 
			
		||||
#: data/50-mutter-navigation.xml:126
 | 
			
		||||
msgid "Switch to last workspace"
 | 
			
		||||
msgstr "Ŝalti al lasta laborspaco"
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-navigation.xml.in.h:35
 | 
			
		||||
#: data/50-mutter-navigation.xml:129
 | 
			
		||||
msgid "Move to workspace left"
 | 
			
		||||
msgstr "Movi al la maldekstra laborspaco"
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-navigation.xml.in.h:36
 | 
			
		||||
#: data/50-mutter-navigation.xml:132
 | 
			
		||||
msgid "Move to workspace right"
 | 
			
		||||
msgstr "Movi al la dekstra laborspaco"
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-navigation.xml.in.h:37
 | 
			
		||||
#: data/50-mutter-navigation.xml:135
 | 
			
		||||
msgid "Move to workspace above"
 | 
			
		||||
msgstr "Movi al la supra laborspaco"
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-navigation.xml.in.h:38
 | 
			
		||||
#: data/50-mutter-navigation.xml:138
 | 
			
		||||
msgid "Move to workspace below"
 | 
			
		||||
msgstr "Movi al la malsupra laborspaco"
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-system.xml.in.h:1
 | 
			
		||||
#: data/50-mutter-system.xml:6 data/50-mutter-wayland.xml:6
 | 
			
		||||
msgid "System"
 | 
			
		||||
msgstr "Sistemo"
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-system.xml.in.h:2
 | 
			
		||||
#: data/50-mutter-system.xml:8
 | 
			
		||||
msgid "Show the run command prompt"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-system.xml.in.h:3
 | 
			
		||||
#: data/50-mutter-system.xml:10
 | 
			
		||||
msgid "Show the activities overview"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-windows.xml.in.h:1
 | 
			
		||||
#: data/50-mutter-wayland.xml:8
 | 
			
		||||
msgid "Restore the keyboard shortcuts"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: data/50-mutter-windows.xml:6
 | 
			
		||||
msgid "Windows"
 | 
			
		||||
msgstr "Fenestroj"
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-windows.xml.in.h:2
 | 
			
		||||
#: data/50-mutter-windows.xml:8
 | 
			
		||||
msgid "Activate the window menu"
 | 
			
		||||
msgstr "Aktivigi la fenestromenuon"
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-windows.xml.in.h:3
 | 
			
		||||
#: data/50-mutter-windows.xml:10
 | 
			
		||||
msgid "Toggle fullscreen mode"
 | 
			
		||||
msgstr "Baskuligi tutekranan reĝimon"
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-windows.xml.in.h:4
 | 
			
		||||
#: data/50-mutter-windows.xml:12
 | 
			
		||||
msgid "Toggle maximization state"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-windows.xml.in.h:5
 | 
			
		||||
#: data/50-mutter-windows.xml:14
 | 
			
		||||
msgid "Maximize window"
 | 
			
		||||
msgstr "Maksimumigi la fenestron"
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-windows.xml.in.h:6
 | 
			
		||||
#: data/50-mutter-windows.xml:16
 | 
			
		||||
msgid "Restore window"
 | 
			
		||||
msgstr "Restaŭri la fenestron"
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-windows.xml.in.h:7
 | 
			
		||||
#: data/50-mutter-windows.xml:18
 | 
			
		||||
msgid "Toggle shaded state"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-windows.xml.in.h:8
 | 
			
		||||
#: data/50-mutter-windows.xml:20
 | 
			
		||||
msgid "Close window"
 | 
			
		||||
msgstr "Fermi la fenestron"
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-windows.xml.in.h:9
 | 
			
		||||
#: data/50-mutter-windows.xml:22
 | 
			
		||||
msgid "Hide window"
 | 
			
		||||
msgstr "Kaŝi la fenestron"
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-windows.xml.in.h:10
 | 
			
		||||
#: data/50-mutter-windows.xml:24
 | 
			
		||||
msgid "Move window"
 | 
			
		||||
msgstr "Movi la fenestron"
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-windows.xml.in.h:11
 | 
			
		||||
#: data/50-mutter-windows.xml:26
 | 
			
		||||
msgid "Resize window"
 | 
			
		||||
msgstr "Ŝanĝi la fenestrograndon"
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-windows.xml.in.h:12
 | 
			
		||||
#: data/50-mutter-windows.xml:29
 | 
			
		||||
msgid "Toggle window on all workspaces or one"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-windows.xml.in.h:13
 | 
			
		||||
#: data/50-mutter-windows.xml:31
 | 
			
		||||
msgid "Raise window if covered, otherwise lower it"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-windows.xml.in.h:14
 | 
			
		||||
#: data/50-mutter-windows.xml:33
 | 
			
		||||
msgid "Raise window above other windows"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-windows.xml.in.h:15
 | 
			
		||||
#: data/50-mutter-windows.xml:35
 | 
			
		||||
msgid "Lower window below other windows"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-windows.xml.in.h:16
 | 
			
		||||
#: data/50-mutter-windows.xml:37
 | 
			
		||||
msgid "Maximize window vertically"
 | 
			
		||||
msgstr "Vertikale maksimumigi la fenestron"
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-windows.xml.in.h:17
 | 
			
		||||
#: data/50-mutter-windows.xml:39
 | 
			
		||||
msgid "Maximize window horizontally"
 | 
			
		||||
msgstr "Horizontale maksimumigi la fenestron"
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-windows.xml.in.h:18
 | 
			
		||||
#: data/50-mutter-windows.xml:43
 | 
			
		||||
msgid "View split on left"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../data/50-mutter-windows.xml.in.h:19
 | 
			
		||||
#: data/50-mutter-windows.xml:47
 | 
			
		||||
msgid "View split on right"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../data/mutter.desktop.in.h:1
 | 
			
		||||
#: data/mutter.desktop.in:4
 | 
			
		||||
msgid "Mutter"
 | 
			
		||||
msgstr "Mutero"
 | 
			
		||||
 | 
			
		||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:1
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:7
 | 
			
		||||
msgid "Modifier to use for extended window management operations"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:2
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:8
 | 
			
		||||
msgid ""
 | 
			
		||||
"This key will initiate the \"overlay\", which is a combination window "
 | 
			
		||||
"overview and application launching system. The default is intended to be the "
 | 
			
		||||
"\"Windows key\" on PC hardware. It's expected that this binding either the "
 | 
			
		||||
"default or set to the empty string."
 | 
			
		||||
"This key will initiate the “overlay”, which is a combination window overview "
 | 
			
		||||
"and application launching system. The default is intended to be the “Windows "
 | 
			
		||||
"key” on PC hardware. It’s expected that this binding either the default or "
 | 
			
		||||
"set to the empty string."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:3
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:20
 | 
			
		||||
msgid "Attach modal dialogs"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:4
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:21
 | 
			
		||||
msgid ""
 | 
			
		||||
"When true, instead of having independent titlebars, modal dialogs appear "
 | 
			
		||||
"attached to the titlebar of the parent window and are moved together with "
 | 
			
		||||
"the parent window."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:5
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:30
 | 
			
		||||
msgid "Enable edge tiling when dropping windows on screen edges"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:6
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:31
 | 
			
		||||
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 ""
 | 
			
		||||
 | 
			
		||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:7
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:40
 | 
			
		||||
msgid "Workspaces are managed dynamically"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:8
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:41
 | 
			
		||||
msgid ""
 | 
			
		||||
"Determines whether workspaces are managed dynamically or whether there's a "
 | 
			
		||||
"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 ""
 | 
			
		||||
 | 
			
		||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:9
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:50
 | 
			
		||||
msgid "Workspaces only on primary"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:10
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:51
 | 
			
		||||
msgid ""
 | 
			
		||||
"Determines whether workspace switching should happen for windows on all "
 | 
			
		||||
"monitors or only for windows on the primary monitor."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:11
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:59
 | 
			
		||||
msgid "No tab popup"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:12
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:60
 | 
			
		||||
msgid ""
 | 
			
		||||
"Determines whether the use of popup and highlight frame should be disabled "
 | 
			
		||||
"for window cycling."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:13
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:68
 | 
			
		||||
msgid "Delay focus changes until the pointer stops moving"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:14
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:69
 | 
			
		||||
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."
 | 
			
		||||
"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 ""
 | 
			
		||||
 | 
			
		||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:15
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:79
 | 
			
		||||
msgid "Draggable border width"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:16
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:80
 | 
			
		||||
msgid ""
 | 
			
		||||
"The amount of total draggable borders. If the theme's visible borders are "
 | 
			
		||||
"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 ""
 | 
			
		||||
 | 
			
		||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:17
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:89
 | 
			
		||||
msgid "Auto maximize nearly monitor sized windows"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:18
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:90
 | 
			
		||||
msgid ""
 | 
			
		||||
"If enabled, new windows that are initially the size of the monitor "
 | 
			
		||||
"automatically get maximized."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:19
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:98
 | 
			
		||||
msgid "Place new windows in the center"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:20
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:99
 | 
			
		||||
msgid ""
 | 
			
		||||
"When true, the new windows will always be put in the center of the active "
 | 
			
		||||
"screen of the monitor."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:21
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:107
 | 
			
		||||
msgid "Enable experimental features"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:108
 | 
			
		||||
msgid ""
 | 
			
		||||
"To enable experimental features, add the feature keyword to the list. "
 | 
			
		||||
"Whether the feature requires restarting the compositor depends on the given "
 | 
			
		||||
"feature. Any experimental feature is not required to still be available, or "
 | 
			
		||||
"configurable. Don’t expect adding anything in this setting to be future "
 | 
			
		||||
"proof. Currently possible keywords: • “scale-monitor-framebuffer” — makes "
 | 
			
		||||
"mutter default to layout logical monitors in a logical pixel coordinate "
 | 
			
		||||
"space, while scaling monitor framebuffers instead of window content, to "
 | 
			
		||||
"manage HiDPI monitors. Does not require a restart. • “remote-desktop” — "
 | 
			
		||||
"enables remote desktop support. To support remote desktop with screen "
 | 
			
		||||
"sharing, “screen-cast” must also be enabled. • “screen-cast” — enables "
 | 
			
		||||
"screen cast support."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:145
 | 
			
		||||
msgid "Select window from tab popup"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:22
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:150
 | 
			
		||||
msgid "Cancel tab popup"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:1
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:155
 | 
			
		||||
#, fuzzy
 | 
			
		||||
#| msgid "Switch applications"
 | 
			
		||||
msgid "Switch monitor configurations"
 | 
			
		||||
msgstr "Ŝanĝi aplikaĵojn"
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.gschema.xml.in:160
 | 
			
		||||
msgid "Rotates the built-in monitor configuration"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:6
 | 
			
		||||
msgid "Switch to VT 1"
 | 
			
		||||
msgstr "Ŝalti al VT 1"
 | 
			
		||||
msgstr "Ŝalti al virtuala terminalo 1"
 | 
			
		||||
 | 
			
		||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:2
 | 
			
		||||
#, fuzzy
 | 
			
		||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:10
 | 
			
		||||
msgid "Switch to VT 2"
 | 
			
		||||
msgstr "Ŝalti al VT 2"
 | 
			
		||||
msgstr "Ŝalti al virtuala terminalo 2"
 | 
			
		||||
 | 
			
		||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:3
 | 
			
		||||
#, fuzzy
 | 
			
		||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:14
 | 
			
		||||
msgid "Switch to VT 3"
 | 
			
		||||
msgstr "Ŝalti al VT 3"
 | 
			
		||||
msgstr "Ŝalti al virtuala terminalo 3"
 | 
			
		||||
 | 
			
		||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:4
 | 
			
		||||
#, fuzzy
 | 
			
		||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:18
 | 
			
		||||
msgid "Switch to VT 4"
 | 
			
		||||
msgstr "Ŝalti al VT 4"
 | 
			
		||||
msgstr "Ŝalti al virtuala terminalo 4"
 | 
			
		||||
 | 
			
		||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:5
 | 
			
		||||
#, fuzzy
 | 
			
		||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:22
 | 
			
		||||
#| msgid "Switch to workspace 5"
 | 
			
		||||
msgid "Switch to VT 5"
 | 
			
		||||
msgstr "Ŝalti al VT 5"
 | 
			
		||||
msgstr "Ŝalti al virtuala terminalo 5"
 | 
			
		||||
 | 
			
		||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:6
 | 
			
		||||
#, fuzzy
 | 
			
		||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:26
 | 
			
		||||
#| msgid "Switch to workspace 6"
 | 
			
		||||
msgid "Switch to VT 6"
 | 
			
		||||
msgstr "Ŝalti al VT 6"
 | 
			
		||||
msgstr "Ŝalti al virtuala terminalo 6"
 | 
			
		||||
 | 
			
		||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:7
 | 
			
		||||
#, fuzzy
 | 
			
		||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:30
 | 
			
		||||
#| msgid "Switch to workspace 7"
 | 
			
		||||
msgid "Switch to VT 7"
 | 
			
		||||
msgstr "Ŝalti al VT 7"
 | 
			
		||||
msgstr "Ŝalti al virtuala terminalo 7"
 | 
			
		||||
 | 
			
		||||
#: ../src/backends/meta-monitor-manager.c:364
 | 
			
		||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:34
 | 
			
		||||
msgid "Switch to VT 8"
 | 
			
		||||
msgstr "Ŝalti al virtuala terminalo 8"
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:38
 | 
			
		||||
msgid "Switch to VT 9"
 | 
			
		||||
msgstr "Ŝalti al virtuala terminalo 9"
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:42
 | 
			
		||||
msgid "Switch to VT 10"
 | 
			
		||||
msgstr "Ŝalti al virtuala terminalo 10"
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:46
 | 
			
		||||
msgid "Switch to VT 11"
 | 
			
		||||
msgstr "Ŝalti al virtuala terminalo 11"
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:50
 | 
			
		||||
msgid "Switch to VT 12"
 | 
			
		||||
msgstr "Ŝalti al virtuala terminalo 12"
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:54
 | 
			
		||||
msgid "Re-enable shortcuts"
 | 
			
		||||
msgstr "Re-ŝalti klavkombinojn"
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:64
 | 
			
		||||
msgid "Allow grabs with Xwayland"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:65
 | 
			
		||||
msgid ""
 | 
			
		||||
"Allow keyboard grabs issued by X11 applications running in Xwayland to be "
 | 
			
		||||
"taken into account. For a X11 grab to be taken into account under Wayland, "
 | 
			
		||||
"the client must also either send a specific X11 ClientMessage to the root "
 | 
			
		||||
"window or be among the applications white-listed in key “xwayland-grab-"
 | 
			
		||||
"access-rules”."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:77
 | 
			
		||||
msgid "Xwayland applications allowed to issue keyboard grabs"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:78
 | 
			
		||||
msgid ""
 | 
			
		||||
"List the resource names or resource class of X11 windows either allowed or "
 | 
			
		||||
"not allowed to issue X11 keyboard grabs under Xwayland. The resource name or "
 | 
			
		||||
"resource class of a given X11 window can be obtained using the command "
 | 
			
		||||
"“xprop WM_CLASS”. Wildcards “*” and jokers “?” in the values are supported. "
 | 
			
		||||
"Values starting with “!” are blacklisted, which has precedence over the "
 | 
			
		||||
"whitelist, to revoke applications from the default system list. The default "
 | 
			
		||||
"system list includes the following applications: "
 | 
			
		||||
"“@XWAYLAND_GRAB_DEFAULT_ACCESS_RULES@” Users can break an existing grab by "
 | 
			
		||||
"using the specific keyboard shortcut defined by the keybinding key “restore-"
 | 
			
		||||
"shortcuts”."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#. TRANSLATORS: This string refers to a button that switches between
 | 
			
		||||
#. * different modes.
 | 
			
		||||
#.
 | 
			
		||||
#: src/backends/meta-input-settings.c:2260
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Mode Switch (Group %d)"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#. TRANSLATORS: This string refers to an action, cycles drawing tablets'
 | 
			
		||||
#. * mapping through the available outputs.
 | 
			
		||||
#.
 | 
			
		||||
#: src/backends/meta-input-settings.c:2283
 | 
			
		||||
#, fuzzy
 | 
			
		||||
#| msgid "Switch system controls"
 | 
			
		||||
msgid "Switch monitor"
 | 
			
		||||
msgstr "Ŝanĝi sistem-kontrolojn"
 | 
			
		||||
 | 
			
		||||
#: src/backends/meta-input-settings.c:2285
 | 
			
		||||
msgid "Show on-screen help"
 | 
			
		||||
msgstr "Montri ekranhelpon"
 | 
			
		||||
 | 
			
		||||
#: src/backends/meta-monitor-manager.c:900
 | 
			
		||||
msgid "Built-in display"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/backends/meta-monitor-manager.c:391
 | 
			
		||||
#: src/backends/meta-monitor-manager.c:923
 | 
			
		||||
msgid "Unknown"
 | 
			
		||||
msgstr "Nekonate"
 | 
			
		||||
 | 
			
		||||
#: ../src/backends/meta-monitor-manager.c:393
 | 
			
		||||
#: src/backends/meta-monitor-manager.c:925
 | 
			
		||||
msgid "Unknown Display"
 | 
			
		||||
msgstr "Nekonata ekrano"
 | 
			
		||||
 | 
			
		||||
#. TRANSLATORS: this is a monitor vendor name, followed by a
 | 
			
		||||
#. * size in inches, like 'Dell 15"'
 | 
			
		||||
#.
 | 
			
		||||
#: ../src/backends/meta-monitor-manager.c:401
 | 
			
		||||
#: src/backends/meta-monitor-manager.c:933
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "%s %s"
 | 
			
		||||
msgstr "%s %s"
 | 
			
		||||
 | 
			
		||||
#. 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:456
 | 
			
		||||
#, c-format
 | 
			
		||||
#: src/compositor/compositor.c:479
 | 
			
		||||
#, fuzzy, c-format
 | 
			
		||||
#| msgid ""
 | 
			
		||||
#| "Another compositing manager is already running on screen %i on display "
 | 
			
		||||
#| "\"%s\"."
 | 
			
		||||
msgid ""
 | 
			
		||||
"Another compositing manager is already running on screen %i on display \"%s"
 | 
			
		||||
"\"."
 | 
			
		||||
msgstr "Alia kunmetanta administrilo jam rulas sur ekrano %i de montrilo \"%s\"."
 | 
			
		||||
"Another compositing manager is already running on screen %i on display “%s”."
 | 
			
		||||
msgstr "Alia kunmetanta administrilo jam rulas sur ekrano %i de montrilo “%s”."
 | 
			
		||||
 | 
			
		||||
#: ../src/core/bell.c:185
 | 
			
		||||
#: src/core/bell.c:194
 | 
			
		||||
msgid "Bell event"
 | 
			
		||||
msgstr "Sonoril-evento"
 | 
			
		||||
 | 
			
		||||
#: ../src/core/delete.c:127
 | 
			
		||||
#: src/core/display.c:608
 | 
			
		||||
#, fuzzy, c-format
 | 
			
		||||
#| msgid "Failed to open X Window System display '%s'\n"
 | 
			
		||||
msgid "Failed to open X Window System display “%s”\n"
 | 
			
		||||
msgstr "Malsukcesis malfermi jenan vidigon de fenestra sistemo X “%s”\n"
 | 
			
		||||
 | 
			
		||||
#: src/core/main.c:189
 | 
			
		||||
msgid "Disable connection to session manager"
 | 
			
		||||
msgstr "Elŝalti konekton al la seancoadministrilo"
 | 
			
		||||
 | 
			
		||||
#: src/core/main.c:195
 | 
			
		||||
msgid "Replace the running window manager"
 | 
			
		||||
msgstr "Anstataŭigi la nun ruliĝantan fenestromastrumilon"
 | 
			
		||||
 | 
			
		||||
#: src/core/main.c:201
 | 
			
		||||
msgid "Specify session management ID"
 | 
			
		||||
msgstr "Specifi identigilon de la seancoadministrilo"
 | 
			
		||||
 | 
			
		||||
#: src/core/main.c:206
 | 
			
		||||
#, fuzzy
 | 
			
		||||
msgid "X Display to use"
 | 
			
		||||
msgstr "X-Vidigo uzenda"
 | 
			
		||||
 | 
			
		||||
#: src/core/main.c:212
 | 
			
		||||
msgid "Initialize session from savefile"
 | 
			
		||||
msgstr "Pravalorizi la seancon el konservita dosiero"
 | 
			
		||||
 | 
			
		||||
#: src/core/main.c:218
 | 
			
		||||
msgid "Make X calls synchronous"
 | 
			
		||||
msgstr "Fari X-vokojn sinkrone"
 | 
			
		||||
 | 
			
		||||
#: src/core/main.c:225
 | 
			
		||||
msgid "Run as a wayland compositor"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: src/core/main.c:231
 | 
			
		||||
msgid "Run as a nested compositor"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: src/core/main.c:239
 | 
			
		||||
msgid "Run as a full display server, rather than nested"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a window title
 | 
			
		||||
#: src/core/meta-close-dialog-default.c:147
 | 
			
		||||
#, c-format
 | 
			
		||||
#| msgid "<tt>%s</tt> is not responding."
 | 
			
		||||
msgid "“%s” is not responding."
 | 
			
		||||
msgstr "“%s” ne respondas."
 | 
			
		||||
 | 
			
		||||
#: ../src/core/delete.c:129
 | 
			
		||||
#: src/core/meta-close-dialog-default.c:149
 | 
			
		||||
msgid "Application is not responding."
 | 
			
		||||
msgstr "Aplikaĵo ne respondas."
 | 
			
		||||
 | 
			
		||||
#: ../src/core/delete.c:134
 | 
			
		||||
#: src/core/meta-close-dialog-default.c:154
 | 
			
		||||
msgid ""
 | 
			
		||||
"You may choose to wait a short while for it to continue or force the "
 | 
			
		||||
"application to quit entirely."
 | 
			
		||||
msgstr "Vi povas elekti ĉu atendi iomete por la aplikaĵo aŭ perforte ĉesi ĝin."
 | 
			
		||||
 | 
			
		||||
#: ../src/core/delete.c:141
 | 
			
		||||
msgid "_Wait"
 | 
			
		||||
msgstr "_Atendi"
 | 
			
		||||
 | 
			
		||||
#: ../src/core/delete.c:141
 | 
			
		||||
#: src/core/meta-close-dialog-default.c:161
 | 
			
		||||
msgid "_Force Quit"
 | 
			
		||||
msgstr "Per_forta eliro"
 | 
			
		||||
 | 
			
		||||
#: ../src/core/display.c:562
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Failed to open X Window System display '%s'\n"
 | 
			
		||||
msgstr "Malsukcesis malfermi jenan vidigon de fenestra sistemo X: '%s'\n"
 | 
			
		||||
 | 
			
		||||
#: ../src/core/main.c:176
 | 
			
		||||
msgid "Disable connection to session manager"
 | 
			
		||||
msgstr "Elŝalti konekton al la seancoadministrilo"
 | 
			
		||||
 | 
			
		||||
#: ../src/core/main.c:182
 | 
			
		||||
msgid "Replace the running window manager"
 | 
			
		||||
msgstr "Anstataŭigi la nun ruliĝantan fenestromastrumilon"
 | 
			
		||||
 | 
			
		||||
#: ../src/core/main.c:188
 | 
			
		||||
msgid "Specify session management ID"
 | 
			
		||||
msgstr "Specifi identigilon de la seancoadministrilo"
 | 
			
		||||
 | 
			
		||||
#: ../src/core/main.c:193
 | 
			
		||||
#, fuzzy
 | 
			
		||||
msgid "X Display to use"
 | 
			
		||||
msgstr "X-Vidigo uzenda"
 | 
			
		||||
 | 
			
		||||
#: ../src/core/main.c:199
 | 
			
		||||
msgid "Initialize session from savefile"
 | 
			
		||||
msgstr "Pravalorizi la seancon el konservita dosiero"
 | 
			
		||||
 | 
			
		||||
#: ../src/core/main.c:205
 | 
			
		||||
msgid "Make X calls synchronous"
 | 
			
		||||
msgstr "Fari X-vokojn sinkrone"
 | 
			
		||||
 | 
			
		||||
#: ../src/core/main.c:212
 | 
			
		||||
msgid "Run as a wayland compositor"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/core/main.c:220
 | 
			
		||||
msgid "Run as a full display server, rather than nested"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/core/mutter.c:39
 | 
			
		||||
#: src/core/meta-close-dialog-default.c:161
 | 
			
		||||
msgid "_Wait"
 | 
			
		||||
msgstr "_Atendi"
 | 
			
		||||
 | 
			
		||||
#: src/core/mutter.c:39
 | 
			
		||||
#, c-format
 | 
			
		||||
#| msgid ""
 | 
			
		||||
#| "mutter %s\n"
 | 
			
		||||
#| "Copyright (C) 2001-%d Havoc Pennington, Red Hat, Inc., and others\n"
 | 
			
		||||
#| "This is free software; see the source for copying conditions.\n"
 | 
			
		||||
#| "There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A "
 | 
			
		||||
#| "PARTICULAR PURPOSE.\n"
 | 
			
		||||
msgid ""
 | 
			
		||||
"mutter %s\n"
 | 
			
		||||
"Copyright (C) 2001-%d Havoc Pennington, Red Hat, Inc., and others\n"
 | 
			
		||||
"Copyright © 2001-%d Havoc Pennington, Red Hat, Inc., and others\n"
 | 
			
		||||
"This is free software; see the source for copying conditions.\n"
 | 
			
		||||
"There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A "
 | 
			
		||||
"PARTICULAR PURPOSE.\n"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Mutero %s\n"
 | 
			
		||||
"Kopirajto (C) 2001-%d Havoc PENNIGTON, Red Hat, Inc., kaj aliaj\n"
 | 
			
		||||
"Ĉi tio estas libera programaro; rigardu la fontkodon por pli da informoj.\n"
 | 
			
		||||
"Ekzistas neniu GARANTIO; nek por NEGOCEBLO nek por ADAPTADO AL IU APARTA "
 | 
			
		||||
"Kopirajto © 2001-%d Havoc PENNIGTON, Red Hat, Inc., kaj aliaj\n"
 | 
			
		||||
"Ĉi tio estas libera programaro; rigardu la fontkodon por kondiĉoj pri "
 | 
			
		||||
"kopiado.\n"
 | 
			
		||||
"Ekzistas NENIU garantio; nek por NEGOCEBLO nek por ADAPTADO AL IU APARTA "
 | 
			
		||||
"CELO.\n"
 | 
			
		||||
 | 
			
		||||
#: ../src/core/mutter.c:53
 | 
			
		||||
#: src/core/mutter.c:53
 | 
			
		||||
msgid "Print version"
 | 
			
		||||
msgstr "Motri version"
 | 
			
		||||
 | 
			
		||||
#: ../src/core/mutter.c:59
 | 
			
		||||
#: src/core/mutter.c:59
 | 
			
		||||
msgid "Mutter plugin to use"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/core/prefs.c:2004
 | 
			
		||||
#: src/core/prefs.c:1997
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Workspace %d"
 | 
			
		||||
msgstr "Laborspaco %d"
 | 
			
		||||
 | 
			
		||||
#: ../src/core/screen.c:525
 | 
			
		||||
#: src/core/screen.c:583
 | 
			
		||||
#, c-format
 | 
			
		||||
#| msgid ""
 | 
			
		||||
#| "Screen %d on display \"%s\" already has a window manager; try using the --"
 | 
			
		||||
#| "replace option to replace the current window manager.\n"
 | 
			
		||||
#| "Display \"%s\" already has a window manager; try using the --replace "
 | 
			
		||||
#| "option to replace the current window manager."
 | 
			
		||||
msgid ""
 | 
			
		||||
"Display \"%s\" already has a window manager; try using the --replace option "
 | 
			
		||||
"to replace the current window manager."
 | 
			
		||||
"Display “%s” already has a window manager; try using the --replace option to "
 | 
			
		||||
"replace the current window manager."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Ekrano \"%s\" jam havas fenestroadministrilon; provu uzi opcion --replace por "
 | 
			
		||||
"anstataŭigi la nunan fenestroadministrilon."
 | 
			
		||||
"Ekrano “%s” jam havas fenestroadministrilon; provu uzi la opcion --replace "
 | 
			
		||||
"por anstataŭigi la nunan fenestroadministrilon."
 | 
			
		||||
 | 
			
		||||
#: ../src/core/screen.c:607
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Screen %d on display '%s' is invalid\n"
 | 
			
		||||
msgstr "Ekrano %d en vidigilo '%s' estas nevalida\n"
 | 
			
		||||
#: src/core/screen.c:668
 | 
			
		||||
#, fuzzy, c-format
 | 
			
		||||
#| msgid "Screen %d on display '%s' is invalid\n"
 | 
			
		||||
msgid "Screen %d on display “%s” is invalid\n"
 | 
			
		||||
msgstr "Ekrano %d en vidigilo “%s” estas nevalida\n"
 | 
			
		||||
 | 
			
		||||
#: ../src/core/util.c:118
 | 
			
		||||
#: src/core/util.c:120
 | 
			
		||||
msgid "Mutter was compiled without support for verbose mode\n"
 | 
			
		||||
msgstr "Mutero estis kompilita sen subteno por eksplicita reĝimo\n"
 | 
			
		||||
 | 
			
		||||
#: ../src/x11/session.c:1815
 | 
			
		||||
#: src/wayland/meta-wayland-tablet-pad.c:563
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Mode Switch: Mode %d"
 | 
			
		||||
msgstr "Reĝim-ŝaltilo: Reĝimo %d"
 | 
			
		||||
 | 
			
		||||
#: src/x11/session.c:1815
 | 
			
		||||
msgid ""
 | 
			
		||||
"These windows do not support "save current setup" and will have to "
 | 
			
		||||
"be restarted manually next time you log in."
 | 
			
		||||
"These windows do not support “save current setup” and will have to be "
 | 
			
		||||
"restarted manually next time you log in."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: ../src/x11/window-props.c:549
 | 
			
		||||
#: src/x11/window-props.c:559
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "%s (on %s)"
 | 
			
		||||
msgstr "%s (ĉe %s)"
 | 
			
		||||
 
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user