Compare commits
414 Commits
wip/tablet
...
3.23.3
Author | SHA1 | Date | |
---|---|---|---|
![]() |
46b8624833 | ||
![]() |
76012506ff | ||
![]() |
1ab6ac2996 | ||
![]() |
c98d5448ec | ||
![]() |
cfafb0bfca | ||
![]() |
71077d582b | ||
![]() |
5eb5f72434 | ||
![]() |
7f49b5144b | ||
![]() |
e8380d11c4 | ||
![]() |
ff5a7ba9b9 | ||
![]() |
c50ae726a9 | ||
![]() |
2b59b4c793 | ||
![]() |
0249993377 | ||
![]() |
d9a9844005 | ||
![]() |
227187f1f1 | ||
![]() |
77384ffa9a | ||
![]() |
1956a6ae76 | ||
![]() |
5df5b00927 | ||
![]() |
1d280d8fa1 | ||
![]() |
9c03e78505 | ||
![]() |
4af62438f2 | ||
![]() |
0aa6d9782c | ||
![]() |
c2e72823fc | ||
![]() |
d829fa19d2 | ||
![]() |
76b6cc02d6 | ||
![]() |
8acfa0a79c | ||
![]() |
2ed7ca5b6a | ||
![]() |
5774fcdd80 | ||
![]() |
eed4dab0fc | ||
![]() |
f5bdf75f70 | ||
![]() |
1f0ce80fb4 | ||
![]() |
7c31fb2450 | ||
![]() |
11783ffdd0 | ||
![]() |
41c96921d6 | ||
![]() |
23455985cd | ||
![]() |
659c987335 | ||
![]() |
ecc1f56009 | ||
![]() |
18b9cf8a85 | ||
![]() |
934184e236 | ||
![]() |
b735bdcf2f | ||
![]() |
f692eb3677 | ||
![]() |
b1597b4291 | ||
![]() |
faa96444b5 | ||
![]() |
78c121eb10 | ||
![]() |
cb6adc45d1 | ||
![]() |
59b4b5e9e8 | ||
![]() |
ad784501a6 | ||
![]() |
68d690225a | ||
![]() |
8f716772c2 | ||
![]() |
da21f02eb9 | ||
![]() |
4ce7d3a772 | ||
![]() |
77b7ecfd04 | ||
![]() |
da1c1d9c22 | ||
![]() |
f7cd6af9c6 | ||
![]() |
678ebbb7f6 | ||
![]() |
87d6e45da5 | ||
![]() |
80c61c4b3b | ||
![]() |
4547c6e9f3 | ||
![]() |
cde622b8e1 | ||
![]() |
8b810193dd | ||
![]() |
22f019826c | ||
![]() |
7fa3f41df2 | ||
![]() |
f99a086444 | ||
![]() |
925b1aec64 | ||
![]() |
be5c2ebcb5 | ||
![]() |
ae73e9d84d | ||
![]() |
af920851ca | ||
![]() |
ea4dbdd66f | ||
![]() |
ff9753688f | ||
![]() |
b35b531f00 | ||
![]() |
6257f1195b | ||
![]() |
b252771a8f | ||
![]() |
75c3f0ffba | ||
![]() |
bd83873a7f | ||
![]() |
cea7d629d9 | ||
![]() |
1831a1dd9b | ||
![]() |
9abf6892c4 | ||
![]() |
674a48335d | ||
![]() |
db9d8fcc90 | ||
![]() |
15db18901c | ||
![]() |
4cfc21d49d | ||
![]() |
cf0a453d32 | ||
![]() |
4186833df7 | ||
![]() |
30fa764c90 | ||
![]() |
236417be38 | ||
![]() |
2641b364e8 | ||
![]() |
fb5e591bc9 | ||
![]() |
bfb46ff850 | ||
![]() |
2012eab842 | ||
![]() |
9ecb488437 | ||
![]() |
4295fdb892 | ||
![]() |
998d921d41 | ||
![]() |
d491063110 | ||
![]() |
e2bfaf0751 | ||
![]() |
f1e1a5ff06 | ||
![]() |
ef2000053a | ||
![]() |
8a7876ded5 | ||
![]() |
b50da46f43 | ||
![]() |
8b0e9706ca | ||
![]() |
1d4a5a7520 | ||
![]() |
8290e1f09a | ||
![]() |
89672fad04 | ||
![]() |
1cb9cfe11d | ||
![]() |
280e297afe | ||
![]() |
fc8de3d0c8 | ||
![]() |
3e2555667f | ||
![]() |
1ecadb6e57 | ||
![]() |
2abee91dbc | ||
![]() |
68645df3a3 | ||
![]() |
d2f79afc1a | ||
![]() |
8a6fa726d3 | ||
![]() |
a3d7ae6214 | ||
![]() |
c0c132a320 | ||
![]() |
0dfb5d3ef7 | ||
![]() |
6480a7ee4a | ||
![]() |
6cc8450f8e | ||
![]() |
7ae4b28bda | ||
![]() |
bb8e6afae6 | ||
![]() |
d7f61e48ac | ||
![]() |
9de6de5802 | ||
![]() |
6e7057426e | ||
![]() |
5306d36522 | ||
![]() |
7990182f56 | ||
![]() |
93a6be08a5 | ||
![]() |
d5d5084151 | ||
![]() |
d3cff9a962 | ||
![]() |
133bbdfefa | ||
![]() |
a8c3470cf2 | ||
![]() |
578e527869 | ||
![]() |
312f215fc3 | ||
![]() |
d639c28e3b | ||
![]() |
c3f7259cbb | ||
![]() |
56e8f98c13 | ||
![]() |
c2217373df | ||
![]() |
4a3781d7db | ||
![]() |
911a838c3a | ||
![]() |
c6106f90d4 | ||
![]() |
ed52e17886 | ||
![]() |
f63bb024fa | ||
![]() |
bccff5bdd8 | ||
![]() |
e9944350d3 | ||
![]() |
1fab6e69b7 | ||
![]() |
f89162ee73 | ||
![]() |
5261638bfd | ||
![]() |
04b75c45f8 | ||
![]() |
a50950cf8f | ||
![]() |
f1850e0d61 | ||
![]() |
e3dab70754 | ||
![]() |
b3eac93c4c | ||
![]() |
a9e386e1af | ||
![]() |
028157081c | ||
![]() |
a65c344743 | ||
![]() |
8797e5951c | ||
![]() |
a4e69f338d | ||
![]() |
d045462860 | ||
![]() |
3137ddb1a1 | ||
![]() |
5fbb479301 | ||
![]() |
a4c10b6683 | ||
![]() |
9e5491439e | ||
![]() |
417757eab8 | ||
![]() |
32b87e7bea | ||
![]() |
ed6fda84e1 | ||
![]() |
b1d95438d6 | ||
![]() |
60bc6798f4 | ||
![]() |
342532a98d | ||
![]() |
219d2304e0 | ||
![]() |
fb6b0de48b | ||
![]() |
22173fde15 | ||
![]() |
4c8dd08c77 | ||
![]() |
b78b8c9578 | ||
![]() |
e1516e4f31 | ||
![]() |
32276cf418 | ||
![]() |
98f0578f9d | ||
![]() |
87f82d9fc0 | ||
![]() |
a6646b32d0 | ||
![]() |
d2cdbd433d | ||
![]() |
5d3cacf8d2 | ||
![]() |
a9b78cea6b | ||
![]() |
bb25aa5e6b | ||
![]() |
b52f304f9d | ||
![]() |
9a076076c0 | ||
![]() |
5cae628f37 | ||
![]() |
0f0b25767d | ||
![]() |
878fb6720a | ||
![]() |
f4c2da7499 | ||
![]() |
0559308812 | ||
![]() |
30d2a94cb3 | ||
![]() |
2681647089 | ||
![]() |
4c106a9c9b | ||
![]() |
a884e4540c | ||
![]() |
f9fff98909 | ||
![]() |
abee020f71 | ||
![]() |
33ba06504b | ||
![]() |
10c7035a71 | ||
![]() |
e6a20a025d | ||
![]() |
262b52da50 | ||
![]() |
fccdd00f74 | ||
![]() |
3a41b0f221 | ||
![]() |
e5a359a032 | ||
![]() |
d893adb290 | ||
![]() |
0c53677992 | ||
![]() |
640178a94f | ||
![]() |
2e7f11305c | ||
![]() |
c1b5b76bf4 | ||
![]() |
d164ce15f2 | ||
![]() |
c9941f2d30 | ||
![]() |
330c5ffef9 | ||
![]() |
f83f5019cf | ||
![]() |
7b55592cce | ||
![]() |
99aaec6ce4 | ||
![]() |
880c9e379f | ||
![]() |
99d89299fd | ||
![]() |
f36fa53b0e | ||
![]() |
4f58a46217 | ||
![]() |
3acd562a41 | ||
![]() |
0515f73ff0 | ||
![]() |
d696fd3021 | ||
![]() |
ce7573e2b7 | ||
![]() |
6c8f6afdc4 | ||
![]() |
7a096b8686 | ||
![]() |
c7976e0dbc | ||
![]() |
f692c527e7 | ||
![]() |
2c1d3e5b70 | ||
![]() |
262e184fe7 | ||
![]() |
01edf10e82 | ||
![]() |
335764e815 | ||
![]() |
89f6fdce5d | ||
![]() |
7d9af9585d | ||
![]() |
c8f24721c5 | ||
![]() |
7ba803934c | ||
![]() |
5a1ce1b5a2 | ||
![]() |
1f570d542e | ||
![]() |
658d97d00e | ||
![]() |
8942e98e1d | ||
![]() |
b6e13c459a | ||
![]() |
43151edece | ||
![]() |
b3f27de710 | ||
![]() |
4cf14c41ef | ||
![]() |
dc03b3aa47 | ||
![]() |
ef3e036b45 | ||
![]() |
24c3844246 | ||
![]() |
f21df37190 | ||
![]() |
a5efa30f6c | ||
![]() |
817911d9d3 | ||
![]() |
a8d86b4876 | ||
![]() |
cfb3d10e1b | ||
![]() |
3a75e55cd8 | ||
![]() |
335cd8e74c | ||
![]() |
c73d3d9d83 | ||
![]() |
8833991201 | ||
![]() |
9fb891d216 | ||
![]() |
3b3f40a1aa | ||
![]() |
2114f2eb9f | ||
![]() |
3ee16a2abb | ||
![]() |
9fb4783957 | ||
![]() |
9e641f623f | ||
![]() |
8065ff5a37 | ||
![]() |
6ce918661c | ||
![]() |
a72bd1bd29 | ||
![]() |
89854f9244 | ||
![]() |
a6e15e841b | ||
![]() |
61e9c5c357 | ||
![]() |
54dc10f890 | ||
![]() |
7baa1d8a8d | ||
![]() |
4b4eb3a039 | ||
![]() |
92c03e8625 | ||
![]() |
a53ca0d8cf | ||
![]() |
913c32ee34 | ||
![]() |
f31d8bab44 | ||
![]() |
6f8e6864b2 | ||
![]() |
aea706230d | ||
![]() |
f49458ccd9 | ||
![]() |
9064b4f1f9 | ||
![]() |
c977ba197e | ||
![]() |
f271c1b4ce | ||
![]() |
ea08ed7dc4 | ||
![]() |
3248c6852c | ||
![]() |
5649734100 | ||
![]() |
c55943d753 | ||
![]() |
19e02b3bbe | ||
![]() |
eb7f33265a | ||
![]() |
9f6f778589 | ||
![]() |
1f657d2c81 | ||
![]() |
6940169f46 | ||
![]() |
4678c24d83 | ||
![]() |
1ca57e0923 | ||
![]() |
b53b94e6f2 | ||
![]() |
4abd31d863 | ||
![]() |
3c8b1462bc | ||
![]() |
27a77fa115 | ||
![]() |
0992b5c53e | ||
![]() |
e928370bf0 | ||
![]() |
d2b05f0305 | ||
![]() |
bd326d38ac | ||
![]() |
8e335ce183 | ||
![]() |
364b184f41 | ||
![]() |
94016f7257 | ||
![]() |
e38a8363e4 | ||
![]() |
76eb27e786 | ||
![]() |
5db2be414b | ||
![]() |
61bfe04b7b | ||
![]() |
1931d0ef51 | ||
![]() |
46f1dcaecc | ||
![]() |
5c9a2c54c4 | ||
![]() |
dd549604e2 | ||
![]() |
8913cbb06d | ||
![]() |
96790276c5 | ||
![]() |
84eeebe32f | ||
![]() |
01f1de704d | ||
![]() |
6894563667 | ||
![]() |
9b4e8695f3 | ||
![]() |
adcd0fe9b4 | ||
![]() |
cc4a65fe94 | ||
![]() |
53061c7005 | ||
![]() |
53e3d0df64 | ||
![]() |
97d180ee59 | ||
![]() |
740748af3e | ||
![]() |
38d61f30dc | ||
![]() |
23c4ac6c7f | ||
![]() |
cfe5d7429a | ||
![]() |
36cd7177fd | ||
![]() |
2e4eb86340 | ||
![]() |
337b833e23 | ||
![]() |
d25af2a02a | ||
![]() |
820a6ab406 | ||
![]() |
cd225c4e19 | ||
![]() |
98cd8136ca | ||
![]() |
e6972924d0 | ||
![]() |
ead09bf6cc | ||
![]() |
fe09a3c4e2 | ||
![]() |
ee6867611f | ||
![]() |
207c11d1f7 | ||
![]() |
c6beb1cfc5 | ||
![]() |
b34fe72bb7 | ||
![]() |
18f301cec9 | ||
![]() |
406677e2a0 | ||
![]() |
4f25057413 | ||
![]() |
2f492c133c | ||
![]() |
138a47b8f9 | ||
![]() |
62e4954c96 | ||
![]() |
062b696df2 | ||
![]() |
5effde59f6 | ||
![]() |
76595af8af | ||
![]() |
21c8911254 | ||
![]() |
35554555e0 | ||
![]() |
e2ad8700a9 | ||
![]() |
323c608b0c | ||
![]() |
0efe076a0a | ||
![]() |
6f7f98540f | ||
![]() |
56632d2ef7 | ||
![]() |
6296d30e1a | ||
![]() |
ed16b40c98 | ||
![]() |
7bba20e536 | ||
![]() |
8e6244238d | ||
![]() |
ba9ec00694 | ||
![]() |
08cda496f8 | ||
![]() |
f9552bb9c0 | ||
![]() |
7e267e9b01 | ||
![]() |
fbb4c0b831 | ||
![]() |
d7faab76e0 | ||
![]() |
b7892ba1c5 | ||
![]() |
ab2d2af176 | ||
![]() |
80674fc9e4 | ||
![]() |
9587a60da4 | ||
![]() |
73958aeb59 | ||
![]() |
77b33a86b8 | ||
![]() |
f3b94d9a78 | ||
![]() |
af8b938f92 | ||
![]() |
1496a7ead3 | ||
![]() |
e7e62ee4a4 | ||
![]() |
f6e471fca4 | ||
![]() |
1dd121002f | ||
![]() |
526fdca3fb | ||
![]() |
220ac7c8f2 | ||
![]() |
5ea39e0e77 | ||
![]() |
1c23d4bc51 | ||
![]() |
2e6bfa8bae | ||
![]() |
a59170c09f | ||
![]() |
aa9b2c5494 | ||
![]() |
c1d157e136 | ||
![]() |
2cd21f1b20 | ||
![]() |
5ccde659c1 | ||
![]() |
fd62a1f6ce | ||
![]() |
b8808ca24d | ||
![]() |
41ff0aaf60 | ||
![]() |
c5d0791710 | ||
![]() |
828277f5e0 | ||
![]() |
e56d6b06cf | ||
![]() |
96aed5fd2e | ||
![]() |
88c510c38a | ||
![]() |
6bcff556b5 | ||
![]() |
81736b1dea | ||
![]() |
cc09ca8892 | ||
![]() |
d76aa89be9 | ||
![]() |
8cd4b0e11f | ||
![]() |
6b08990dcc | ||
![]() |
8b769a3412 | ||
![]() |
8d3ac8c3e9 | ||
![]() |
074b0d6b2a | ||
![]() |
8e8cdf1873 | ||
![]() |
72ee6b8b65 | ||
![]() |
3d9bb1cc09 | ||
![]() |
4ed59a020d | ||
![]() |
b5e797f453 | ||
![]() |
125cba7100 | ||
![]() |
720cbc5e5f | ||
![]() |
ad7ec6b979 | ||
![]() |
991f2d696a | ||
![]() |
76175a48d5 | ||
![]() |
c8392e025f | ||
![]() |
820ffa2781 | ||
![]() |
51f7892600 | ||
![]() |
de1464f88f | ||
![]() |
aebd5ba6e0 |
8
.gitignore
vendored
8
.gitignore
vendored
@@ -41,8 +41,14 @@ stamp-h1
|
||||
*~
|
||||
stamp-it
|
||||
.intltool-merge-cache
|
||||
ABOUT-NLS
|
||||
POTFILES
|
||||
Makevars.template
|
||||
po/*.header
|
||||
po/*.pot
|
||||
po/*.sed
|
||||
po/*.sin
|
||||
Rules-quot
|
||||
libmutter.pc
|
||||
mutter
|
||||
mutter-restart-helper
|
||||
@@ -77,6 +83,8 @@ src/relative-pointer-unstable-v*-protocol.c
|
||||
src/relative-pointer-unstable-v*-server-protocol.h
|
||||
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/meta/meta-version.h
|
||||
doc/reference/*.args
|
||||
doc/reference/*.bak
|
||||
|
161
NEWS
161
NEWS
@@ -1,3 +1,164 @@
|
||||
3.23.3
|
||||
======
|
||||
* Fix frequent freezes in multihead setups on wayland [Rui; #774557]
|
||||
* Preserve root window mask on XSelectionRequest [Olivier; #776128]
|
||||
* Misc. bug fixes [Carlos, Florian, Rui, Olivier; #775478, #774891, #775986,
|
||||
#776036]
|
||||
|
||||
Contributors:
|
||||
Olivier Fourdan, Carlos Garnacho, Rui Matos, Florian Müllner
|
||||
|
||||
3.23.2
|
||||
======
|
||||
* Stack docks below other windows on fullscreen monitors [Rui; #772937]
|
||||
* Fix popup grabs blocking screen lock on wayland [Rui; #771235]
|
||||
* Handle touchpad pinch gestures with more than two fingers [Carlos; #765937]
|
||||
* Implement drawing tablet support on X11 [Carlos; #773779]
|
||||
* Fix some Wine games starting minimized [Carlos; #774333]
|
||||
* Fix switching between two finger- and edge scrolling on wayland [Rui; #771744]
|
||||
* Implement support for EGLStream/EGLDevice [Jonas; #773629]
|
||||
* Add size_changed vfunc to handle async client size changes [Rui; #770345]
|
||||
* Change focus window on clicks with any modifiers [Rui; #746642]
|
||||
* Misc. bug fixes and cleanups [Carlos, Daniel, Jonas, Rui; #771067, #774330, #774613,
|
||||
#771297, #774135, #774827, #774923]
|
||||
|
||||
Contributors:
|
||||
Jonas Ådahl, Carlos Garnacho, Rui Matos, Florian Müllner, Daniel Stone
|
||||
|
||||
Translations:
|
||||
Kjartan Maraas [nb]
|
||||
|
||||
3.23.1
|
||||
======
|
||||
* Fix handling of Escape shortcut in force-quit dialog [Landry; #737109]
|
||||
* Improve pointer constraints support [Jonas; #771859]
|
||||
* Really fix framebuffer capture origin offset [Rui; #771502]
|
||||
* Fix session going into idle mode immediately on startup [Rui; #772839]
|
||||
* Fix mirror mode with stage views [Rui; #773115]
|
||||
* Fall back to X with connectors spread across multiple GPUs [Ray; #771442]
|
||||
* Fix various crashes on wayland [Jonas, Carlos; #771646, #771858, #772929]
|
||||
* Fix various placement issues on wayland [Olivier, Jonas, Sjoerd; #772729,
|
||||
#768039, #771841, #771841, #773141]
|
||||
* Misc. bug fixes [Rui, Jonas, Olivier; #771019, #773116, #772914, #773210]
|
||||
|
||||
Contributors:
|
||||
Jonas Ådahl, Olivier Fourdan, Carlos Garnacho, Rui Matos, Landry MINOZA,
|
||||
Sjoerd Simons, Ray Strode
|
||||
|
||||
Translations:
|
||||
Theppitak Karoonboonyanan [th], Kjartan Maraas [nb], Hannie Dumoleyn [nl],
|
||||
liushuyu [zh_CN]
|
||||
|
||||
3.22.1
|
||||
======
|
||||
* Fix feedback loop between StClipboard and X11 bridge [Carlos; #760745]
|
||||
* Fall back gracefully if DRM plane rotation fails [Carlos; #772512]
|
||||
* Approximate native monitor backend behavior to X [Rui; #772176]
|
||||
* Fix crash on VT switch on wayland [Jonas; #771646]
|
||||
* Expose Flatpak ID for application matching [Florian; #772613, #772614]
|
||||
|
||||
Contributors:
|
||||
Jonas Ådahl, Carlos Garnacho, Rui Matos, Florian Müllner, Olav Vitters
|
||||
|
||||
Translations:
|
||||
Inaki Larranaga Murgoitio [eu], Milo Casagrande [it]
|
||||
|
||||
3.22.0
|
||||
======
|
||||
* Fix wayland crashes [Jonas; #771305, #771345, #770940, #771495]
|
||||
* Fix display rotation on wayland [Jonas; #770672]
|
||||
* Fix framebuffer capture origin offset [Rui; #771502]
|
||||
* Misc. bug fixes [Jonas, Florian, Carlos; #770937, #771536, #771628, #771549]
|
||||
|
||||
Contributors:
|
||||
Jonas Ådahl, Carlos Garnacho, Rui Matos, Florian Müllner
|
||||
|
||||
Translations:
|
||||
Ask Hjorth Larsen [da], Charles Monzat [fr], Stas Solovey [ru],
|
||||
Tom Tryfonidis [el], David King [en_GB]
|
||||
|
||||
3.21.92
|
||||
=======
|
||||
* Fix absolute pointer motion events on wayland [Jonas; #770557]
|
||||
* Default to using stage views [Jonas; #770366]
|
||||
* Fix animated cursors on wayland [Rui; #749913]
|
||||
* Fix various crashes on wayland [Jonas; #757568, #770727, #770992]
|
||||
* Fix screen capture for stage views not at (0, 0) [Jonas; #770127]
|
||||
* Compress motion events instead of discarding them [Jonas; #771049]
|
||||
* Fix XWayland pointer warp emulation [Jonas; #771050]
|
||||
* Add common monitor modes in KMS backend [Rui; #744544]
|
||||
* Temporarily use g-s-d schemas for tablet configuration [Carlos; #771315]
|
||||
* Misc. bug fixes [Jonas, Carlos; #770402, #770647, #770991, #770994, #770929]
|
||||
|
||||
Contributors:
|
||||
Jonas Ådahl, Olivier Fourdan, Carlos Garnacho, Rui Matos, Florian Müllner
|
||||
|
||||
Translations:
|
||||
Changwoo Ryu [ko], Baurzhan Muftakhidinov [kk], Anders Jonsson [sv],
|
||||
Tiago Santos [pt], Rafael Fontenelle [pt_BR], Mario Blättermann [de],
|
||||
Alexander Shopov [bg], Rūdolfs Mazurs [lv], Fran Dieguez [gl],
|
||||
Trần Ngọc Quân [vi], Piotr Drąg [pl], Мирослав Николић [sr, sr@latin]
|
||||
|
||||
3.21.91
|
||||
=======
|
||||
* Add support for xdg-foreign protocol [Jonas; #769786]
|
||||
* Support monitor rotation on wayland [Carlos; #745079]
|
||||
* Port xdg-shell implementation to unstable v6 [Jonas; #769936]
|
||||
* Handle unsupported buffer sizes more gracefully [Olivier; #770387]
|
||||
* Use the same output naming logic as the X server on wayland [Rui; #770338]
|
||||
* Fix replies in gnome-shell's chat notifications on wayland [Florian; #758167]
|
||||
* Misc. bug fixes and cleanups [Bastien, Sjoerd, Jonas; #769276, #769636,
|
||||
#770131, #770324, #769731]
|
||||
|
||||
Contributors:
|
||||
Jonas Ådahl, Olivier Fourdan, Carlos Garnacho, Rui Matos, Florian Müllner,
|
||||
Bastien Nocera, Sjoerd Simons
|
||||
|
||||
Translations:
|
||||
Piotr Drąg [pl], Mario Blättermann [de], Andika Triwidada [id],
|
||||
Enrico Nicoletto [pt_BR], Мирослав Николић [sr, sr@latin]
|
||||
|
||||
3.21.90
|
||||
=======
|
||||
* Consider XDG_SESSION_TYPE when determining session type [Jouke; #759388]
|
||||
* Re-add support for edge scrolling on some touchpads [Bastien; #768245]
|
||||
* Support mouse and trackball acceleration profile [Jonas; #769179]
|
||||
* Draw monitor contentn to individual framebuffer [Jonas; #768976]
|
||||
* Support virtual input devices [Jonas, Carlos; #765009]
|
||||
* Set correct output scale on hotplug [Jonas; #769505]
|
||||
* Misc. bug fixes and cleanups [Florian, Jonas, Thomas, Bastien, Carlos;
|
||||
#769014, #769024, #769054, #769070, #769036, #769305, #769578, #769800,
|
||||
#769073]
|
||||
|
||||
Contributors:
|
||||
Jonas Ådahl, Carlos Garnacho, Thomas Hindoe Paaboel Andersen, Simon McVittie,
|
||||
Alberts Muktupāvels, Florian Müllner, Bastien Nocera, Jouke Witteveen
|
||||
|
||||
Translations:
|
||||
Daniel Mustieles [es], Aurimas Černius [lt], Dušan Kazik [sk],
|
||||
Fabio Tomat [fur], Balázs Úr [hu], Yosef Or Boczko [he], Marek Černocký [cs],
|
||||
Matej Urbančič [sl]
|
||||
|
||||
3.21.4
|
||||
======
|
||||
* Fix missing frame border around GTK+ dialogs [Florian; #745060]
|
||||
* Improve X11 <-> wayland copy and paste interaction [Carlos; #768007]
|
||||
* Add support for NV_robustness_video_memory_purge extension [Rui; #739178]
|
||||
* Fix restoring the old focused window on restart [Owen; #766243]
|
||||
* Fix fullscreen windows on other monitors stealing focus after closing
|
||||
a window [Rui; #768221]
|
||||
* Draw monitor content to individual framebuffer [Jonas; #768976]
|
||||
* Provide screen capture API [Jonas; #768978]
|
||||
* Misc. bug fixes and cleanups [Rui, Owen, Luca, Olivier, Jonas, Carlos;
|
||||
#767969, #768243, #762407, #767997, #768039, #768977, #768977]
|
||||
|
||||
Contributors:
|
||||
Jonas Ådahl, Luca Bruno, Olivier Fourdan, Carlos Garnacho, Rui Matos,
|
||||
Florian Müllner, Owen W. Taylor
|
||||
|
||||
Translations:
|
||||
Andika Triwidada [id]
|
||||
|
||||
3.21.3
|
||||
======
|
||||
* Don't create invalid UTF-8 window description strings [Rui; #765535]
|
||||
|
@@ -25,6 +25,7 @@ AM_CPPFLAGS = \
|
||||
-I$(top_builddir)/clutter \
|
||||
-I$(top_srcdir)/../cogl \
|
||||
-I$(top_builddir)/../cogl \
|
||||
-I$(top_builddir)/../cogl/cogl \
|
||||
$(CLUTTER_DEPRECATED_CFLAGS) \
|
||||
$(CLUTTER_DEBUG_CFLAGS) \
|
||||
$(CLUTTER_HIDDEN_VISIBILITY_CFLAGS) \
|
||||
@@ -112,7 +113,6 @@ source_h = \
|
||||
clutter-snap-constraint.h \
|
||||
clutter-stage.h \
|
||||
clutter-stage-manager.h \
|
||||
clutter-stage-view.h \
|
||||
clutter-tap-action.h \
|
||||
clutter-test-utils.h \
|
||||
clutter-texture.h \
|
||||
@@ -123,6 +123,7 @@ source_h = \
|
||||
clutter-transition.h \
|
||||
clutter-types.h \
|
||||
clutter-units.h \
|
||||
clutter-virtual-input-device.h \
|
||||
clutter-zoom-action.h \
|
||||
$(NULL)
|
||||
|
||||
@@ -168,6 +169,7 @@ source_c = \
|
||||
clutter-image.c \
|
||||
clutter-input-device.c \
|
||||
clutter-input-device-tool.c \
|
||||
clutter-virtual-input-device.c \
|
||||
clutter-interval.c \
|
||||
clutter-keyframe-transition.c \
|
||||
clutter-keysyms-table.c \
|
||||
@@ -196,7 +198,6 @@ source_c = \
|
||||
clutter-snap-constraint.c \
|
||||
clutter-stage.c \
|
||||
clutter-stage-manager.c \
|
||||
clutter-stage-view.c \
|
||||
clutter-stage-window.c \
|
||||
clutter-tap-action.c \
|
||||
clutter-test-utils.c \
|
||||
@@ -238,6 +239,7 @@ source_h_priv = \
|
||||
clutter-settings-private.h \
|
||||
clutter-stage-manager-private.h \
|
||||
clutter-stage-private.h \
|
||||
clutter-stage-view.h \
|
||||
clutter-stage-window.h \
|
||||
$(NULL)
|
||||
|
||||
@@ -246,6 +248,7 @@ source_c_priv = \
|
||||
clutter-easing.c \
|
||||
clutter-event-translator.c \
|
||||
clutter-id-pool.c \
|
||||
clutter-stage-view.c \
|
||||
$(NULL)
|
||||
|
||||
# deprecated installed headers
|
||||
@@ -411,11 +414,21 @@ x11_source_c_priv = \
|
||||
x11_source_c += \
|
||||
x11/clutter-device-manager-xi2.c \
|
||||
x11/clutter-input-device-xi2.c \
|
||||
x11/clutter-input-device-tool-xi2.c \
|
||||
$(NULL)
|
||||
|
||||
x11_source_h_priv += \
|
||||
x11/clutter-device-manager-xi2.h \
|
||||
x11/clutter-input-device-xi2.h \
|
||||
x11/clutter-input-device-tool-xi2.h \
|
||||
$(NULL)
|
||||
|
||||
x11_source_c += \
|
||||
x11/clutter-virtual-input-device-x11.c \
|
||||
$(NULL)
|
||||
|
||||
x11_source_h_priv += \
|
||||
x11/clutter-virtual-input-device-x11.h \
|
||||
$(NULL)
|
||||
|
||||
backend_source_h += $(x11_source_h)
|
||||
@@ -458,13 +471,17 @@ backend_source_c += $(glx_source_c)
|
||||
evdev_c_priv = \
|
||||
evdev/clutter-device-manager-evdev.c \
|
||||
evdev/clutter-input-device-evdev.c \
|
||||
evdev/clutter-seat-evdev.c \
|
||||
evdev/clutter-virtual-input-device-evdev.c \
|
||||
evdev/clutter-event-evdev.c \
|
||||
evdev/clutter-input-device-tool-evdev.c \
|
||||
$(NULL)
|
||||
evdev_h_priv = \
|
||||
evdev/clutter-device-manager-evdev.h \
|
||||
evdev/clutter-input-device-evdev.h \
|
||||
evdev/clutter-seat-evdev.h \
|
||||
evdev/clutter-input-device-tool-evdev.h \
|
||||
evdev/clutter-virtual-input-device-evdev.h \
|
||||
$(NULL)
|
||||
evdev_h = evdev/clutter-evdev.h
|
||||
|
||||
|
@@ -401,7 +401,7 @@ clutter_canvas_emit_draw (ClutterCanvas *self)
|
||||
gboolean res;
|
||||
cairo_t *cr;
|
||||
|
||||
g_assert (priv->width > 0 && priv->width > 0);
|
||||
g_assert (priv->height > 0 && priv->width > 0);
|
||||
|
||||
priv->dirty = TRUE;
|
||||
|
||||
|
@@ -131,9 +131,16 @@ struct _ClutterInputDevice
|
||||
|
||||
gchar *vendor_id;
|
||||
gchar *product_id;
|
||||
gchar *node_path;
|
||||
|
||||
GPtrArray *tools;
|
||||
|
||||
gint n_rings;
|
||||
gint n_strips;
|
||||
gint n_mode_groups;
|
||||
|
||||
ClutterInputDeviceMapping mapping_mode;
|
||||
|
||||
guint has_cursor : 1;
|
||||
guint is_enabled : 1;
|
||||
};
|
||||
@@ -181,6 +188,10 @@ void _clutter_device_manager_select_stage_events (ClutterDeviceMa
|
||||
ClutterStage *stage);
|
||||
ClutterBackend *_clutter_device_manager_get_backend (ClutterDeviceManager *device_manager);
|
||||
|
||||
void _clutter_device_manager_compress_motion (ClutterDeviceManager *device_manger,
|
||||
ClutterEvent *event,
|
||||
const ClutterEvent *to_discard);
|
||||
|
||||
/* input device */
|
||||
gboolean _clutter_input_device_has_sequence (ClutterInputDevice *device,
|
||||
ClutterEventSequence *sequence);
|
||||
|
@@ -47,6 +47,8 @@
|
||||
#include "clutter-marshal.h"
|
||||
#include "clutter-private.h"
|
||||
#include "clutter-stage-private.h"
|
||||
#include "clutter-virtual-input-device.h"
|
||||
#include "clutter-input-device-tool.h"
|
||||
|
||||
struct _ClutterDeviceManagerPrivate
|
||||
{
|
||||
@@ -69,6 +71,7 @@ enum
|
||||
{
|
||||
DEVICE_ADDED,
|
||||
DEVICE_REMOVED,
|
||||
TOOL_CHANGED,
|
||||
|
||||
LAST_SIGNAL
|
||||
};
|
||||
@@ -183,6 +186,16 @@ clutter_device_manager_class_init (ClutterDeviceManagerClass *klass)
|
||||
_clutter_marshal_VOID__OBJECT,
|
||||
G_TYPE_NONE, 1,
|
||||
CLUTTER_TYPE_INPUT_DEVICE);
|
||||
|
||||
manager_signals[TOOL_CHANGED] =
|
||||
g_signal_new (I_("tool-changed"),
|
||||
G_TYPE_FROM_CLASS (klass),
|
||||
G_SIGNAL_RUN_LAST,
|
||||
0, NULL, NULL,
|
||||
_clutter_marshal_VOID__OBJECT_OBJECT,
|
||||
G_TYPE_NONE, 2,
|
||||
CLUTTER_TYPE_INPUT_DEVICE,
|
||||
CLUTTER_TYPE_INPUT_DEVICE_TOOL);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -435,3 +448,42 @@ _clutter_device_manager_get_backend (ClutterDeviceManager *manager)
|
||||
|
||||
return manager->priv->backend;
|
||||
}
|
||||
|
||||
/**
|
||||
* clutter_device_manager_create_virtual_device:
|
||||
* @device_manager: a #ClutterDeviceManager
|
||||
* @device_type: the type of the virtual device
|
||||
*
|
||||
* Creates a virtual input device.
|
||||
*
|
||||
* Returns: (transfer full): a newly created virtual device
|
||||
**/
|
||||
ClutterVirtualInputDevice *
|
||||
clutter_device_manager_create_virtual_device (ClutterDeviceManager *device_manager,
|
||||
ClutterInputDeviceType device_type)
|
||||
{
|
||||
ClutterDeviceManagerClass *manager_class;
|
||||
|
||||
g_return_val_if_fail (CLUTTER_IS_DEVICE_MANAGER (device_manager), NULL);
|
||||
|
||||
manager_class = CLUTTER_DEVICE_MANAGER_GET_CLASS (device_manager);
|
||||
return manager_class->create_virtual_device (device_manager,
|
||||
device_type);
|
||||
}
|
||||
|
||||
void
|
||||
_clutter_device_manager_compress_motion (ClutterDeviceManager *device_manager,
|
||||
ClutterEvent *event,
|
||||
const ClutterEvent *to_discard)
|
||||
{
|
||||
ClutterDeviceManagerClass *manager_class;
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_DEVICE_MANAGER (device_manager));
|
||||
|
||||
|
||||
manager_class = CLUTTER_DEVICE_MANAGER_GET_CLASS (device_manager);
|
||||
if (!manager_class->compress_motion)
|
||||
return;
|
||||
|
||||
manager_class->compress_motion (device_manager, event, to_discard);
|
||||
}
|
||||
|
@@ -83,9 +83,14 @@ struct _ClutterDeviceManagerClass
|
||||
ClutterInputDevice *device);
|
||||
void (* select_stage_events) (ClutterDeviceManager *manager,
|
||||
ClutterStage *stage);
|
||||
ClutterVirtualInputDevice *(* create_virtual_device) (ClutterDeviceManager *device_manager,
|
||||
ClutterInputDeviceType device_type);
|
||||
void (* compress_motion) (ClutterDeviceManager *device_manger,
|
||||
ClutterEvent *event,
|
||||
const ClutterEvent *to_discard);
|
||||
|
||||
/* padding */
|
||||
gpointer _padding[7];
|
||||
gpointer _padding[6];
|
||||
};
|
||||
|
||||
CLUTTER_AVAILABLE_IN_1_2
|
||||
@@ -105,6 +110,10 @@ CLUTTER_AVAILABLE_IN_1_2
|
||||
ClutterInputDevice * clutter_device_manager_get_core_device (ClutterDeviceManager *device_manager,
|
||||
ClutterInputDeviceType device_type);
|
||||
|
||||
CLUTTER_AVAILABLE_IN_ALL
|
||||
ClutterVirtualInputDevice *clutter_device_manager_create_virtual_device (ClutterDeviceManager *device_manager,
|
||||
ClutterInputDeviceType device_type);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __CLUTTER_DEVICE_MANAGER_H__ */
|
||||
|
@@ -794,6 +794,10 @@ typedef enum { /*< prefix=CLUTTER >*/
|
||||
CLUTTER_TOUCHPAD_SWIPE,
|
||||
CLUTTER_PROXIMITY_IN,
|
||||
CLUTTER_PROXIMITY_OUT,
|
||||
CLUTTER_PAD_BUTTON_PRESS,
|
||||
CLUTTER_PAD_BUTTON_RELEASE,
|
||||
CLUTTER_PAD_STRIP,
|
||||
CLUTTER_PAD_RING,
|
||||
|
||||
CLUTTER_EVENT_LAST /* helper */
|
||||
} ClutterEventType;
|
||||
@@ -900,6 +904,7 @@ typedef enum { /*< prefix=CLUTTER_FLOW >*/
|
||||
* @CLUTTER_PEN_DEVICE: A pen device
|
||||
* @CLUTTER_ERASER_DEVICE: An eraser device
|
||||
* @CLUTTER_CURSOR_DEVICE: A cursor device
|
||||
* @CLUTTER_PAD_DEVICE: A tablet pad
|
||||
* @CLUTTER_N_DEVICE_TYPES: The number of device types
|
||||
*
|
||||
* The types of input devices available.
|
||||
@@ -920,6 +925,7 @@ typedef enum {
|
||||
CLUTTER_PEN_DEVICE,
|
||||
CLUTTER_ERASER_DEVICE,
|
||||
CLUTTER_CURSOR_DEVICE,
|
||||
CLUTTER_PAD_DEVICE,
|
||||
|
||||
CLUTTER_N_DEVICE_TYPES
|
||||
} ClutterInputDeviceType;
|
||||
@@ -1520,6 +1526,16 @@ typedef enum {
|
||||
CLUTTER_INPUT_DEVICE_TOOL_LENS
|
||||
} ClutterInputDeviceToolType;
|
||||
|
||||
typedef enum {
|
||||
CLUTTER_INPUT_DEVICE_PAD_SOURCE_UNKNOWN,
|
||||
CLUTTER_INPUT_DEVICE_PAD_SOURCE_FINGER,
|
||||
} ClutterInputDevicePadSource;
|
||||
|
||||
typedef enum {
|
||||
CLUTTER_INPUT_DEVICE_MAPPING_ABSOLUTE,
|
||||
CLUTTER_INPUT_DEVICE_MAPPING_RELATIVE,
|
||||
} ClutterInputDeviceMapping;
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __CLUTTER_ENUMS_H__ */
|
||||
|
@@ -413,6 +413,10 @@ clutter_event_get_position (const ClutterEvent *event,
|
||||
case CLUTTER_EVENT_LAST:
|
||||
case CLUTTER_PROXIMITY_IN:
|
||||
case CLUTTER_PROXIMITY_OUT:
|
||||
case CLUTTER_PAD_BUTTON_PRESS:
|
||||
case CLUTTER_PAD_BUTTON_RELEASE:
|
||||
case CLUTTER_PAD_STRIP:
|
||||
case CLUTTER_PAD_RING:
|
||||
clutter_point_init (position, 0.f, 0.f);
|
||||
break;
|
||||
|
||||
@@ -483,6 +487,10 @@ clutter_event_set_coords (ClutterEvent *event,
|
||||
case CLUTTER_EVENT_LAST:
|
||||
case CLUTTER_PROXIMITY_IN:
|
||||
case CLUTTER_PROXIMITY_OUT:
|
||||
case CLUTTER_PAD_BUTTON_PRESS:
|
||||
case CLUTTER_PAD_BUTTON_RELEASE:
|
||||
case CLUTTER_PAD_STRIP:
|
||||
case CLUTTER_PAD_RING:
|
||||
break;
|
||||
|
||||
case CLUTTER_ENTER:
|
||||
@@ -811,9 +819,15 @@ clutter_event_get_button (const ClutterEvent *event)
|
||||
{
|
||||
g_return_val_if_fail (event != NULL, 0);
|
||||
g_return_val_if_fail (event->type == CLUTTER_BUTTON_PRESS ||
|
||||
event->type == CLUTTER_BUTTON_RELEASE, 0);
|
||||
event->type == CLUTTER_BUTTON_RELEASE ||
|
||||
event->type == CLUTTER_PAD_BUTTON_PRESS ||
|
||||
event->type == CLUTTER_PAD_BUTTON_RELEASE, 0);
|
||||
|
||||
return event->button.button;
|
||||
if (event->type == CLUTTER_BUTTON_PRESS ||
|
||||
event->type == CLUTTER_BUTTON_RELEASE)
|
||||
return event->button.button;
|
||||
else
|
||||
return event->pad_button.button;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1133,6 +1147,19 @@ clutter_event_set_device (ClutterEvent *event,
|
||||
case CLUTTER_PROXIMITY_OUT:
|
||||
event->proximity.device = device;
|
||||
break;
|
||||
|
||||
case CLUTTER_PAD_BUTTON_PRESS:
|
||||
case CLUTTER_PAD_BUTTON_RELEASE:
|
||||
event->pad_button.device = device;
|
||||
break;
|
||||
|
||||
case CLUTTER_PAD_STRIP:
|
||||
event->pad_strip.device = device;
|
||||
break;
|
||||
|
||||
case CLUTTER_PAD_RING:
|
||||
event->pad_ring.device = device;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1217,6 +1244,19 @@ clutter_event_get_device (const ClutterEvent *event)
|
||||
case CLUTTER_PROXIMITY_OUT:
|
||||
device = event->proximity.device;
|
||||
break;
|
||||
|
||||
case CLUTTER_PAD_BUTTON_PRESS:
|
||||
case CLUTTER_PAD_BUTTON_RELEASE:
|
||||
device = event->pad_button.device;
|
||||
break;
|
||||
|
||||
case CLUTTER_PAD_STRIP:
|
||||
device = event->pad_strip.device;
|
||||
break;
|
||||
|
||||
case CLUTTER_PAD_RING:
|
||||
device = event->pad_ring.device;
|
||||
break;
|
||||
}
|
||||
|
||||
return device;
|
||||
@@ -1708,6 +1748,10 @@ clutter_event_get_axes (const ClutterEvent *event,
|
||||
|
||||
case CLUTTER_TOUCHPAD_PINCH:
|
||||
case CLUTTER_TOUCHPAD_SWIPE:
|
||||
case CLUTTER_PAD_BUTTON_PRESS:
|
||||
case CLUTTER_PAD_BUTTON_RELEASE:
|
||||
case CLUTTER_PAD_STRIP:
|
||||
case CLUTTER_PAD_RING:
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1946,22 +1990,28 @@ clutter_event_remove_filter (guint id)
|
||||
}
|
||||
|
||||
/**
|
||||
* clutter_event_get_gesture_swipe_finger_count:
|
||||
* @event: a touchpad swipe event
|
||||
* clutter_event_get_touchpad_gesture_finger_count:
|
||||
* @event: a touchpad swipe/pinch event
|
||||
*
|
||||
* Returns the number of fingers that is triggering the touchpad gesture.
|
||||
*
|
||||
* Returns: the number of fingers swiping.
|
||||
* Returns: the number of fingers in the gesture.
|
||||
*
|
||||
* Since: 1.24
|
||||
**/
|
||||
guint
|
||||
clutter_event_get_gesture_swipe_finger_count (const ClutterEvent *event)
|
||||
clutter_event_get_touchpad_gesture_finger_count (const ClutterEvent *event)
|
||||
{
|
||||
g_return_val_if_fail (event != NULL, 0);
|
||||
g_return_val_if_fail (event->type == CLUTTER_TOUCHPAD_SWIPE, 0);
|
||||
g_return_val_if_fail (event->type == CLUTTER_TOUCHPAD_SWIPE ||
|
||||
event->type == CLUTTER_TOUCHPAD_PINCH, 0);
|
||||
|
||||
return event->touchpad_swipe.n_fingers;
|
||||
if (event->type == CLUTTER_TOUCHPAD_SWIPE)
|
||||
return event->touchpad_swipe.n_fingers;
|
||||
else if (event->type == CLUTTER_TOUCHPAD_PINCH)
|
||||
return event->touchpad_pinch.n_fingers;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -2108,3 +2158,24 @@ clutter_event_get_scroll_finish_flags (const ClutterEvent *event)
|
||||
|
||||
return event->scroll.finish_flags;
|
||||
}
|
||||
|
||||
guint
|
||||
clutter_event_get_mode_group (const ClutterEvent *event)
|
||||
{
|
||||
g_return_val_if_fail (event->type == CLUTTER_PAD_BUTTON_PRESS ||
|
||||
event->type == CLUTTER_PAD_BUTTON_RELEASE ||
|
||||
event->type == CLUTTER_PAD_RING ||
|
||||
event->type == CLUTTER_PAD_STRIP, 0);
|
||||
switch (event->type)
|
||||
{
|
||||
case CLUTTER_PAD_BUTTON_PRESS:
|
||||
case CLUTTER_PAD_BUTTON_RELEASE:
|
||||
return event->pad_button.group;
|
||||
case CLUTTER_PAD_RING:
|
||||
return event->pad_ring.group;
|
||||
case CLUTTER_PAD_STRIP:
|
||||
return event->pad_strip.group;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
@@ -118,6 +118,9 @@ typedef struct _ClutterTouchEvent ClutterTouchEvent;
|
||||
typedef struct _ClutterTouchpadPinchEvent ClutterTouchpadPinchEvent;
|
||||
typedef struct _ClutterTouchpadSwipeEvent ClutterTouchpadSwipeEvent;
|
||||
typedef struct _ClutterProximityEvent ClutterProximityEvent;
|
||||
typedef struct _ClutterPadButtonEvent ClutterPadButtonEvent;
|
||||
typedef struct _ClutterPadStripEvent ClutterPadStripEvent;
|
||||
typedef struct _ClutterPadRingEvent ClutterPadRingEvent;
|
||||
|
||||
/**
|
||||
* ClutterAnyEvent:
|
||||
@@ -456,6 +459,7 @@ struct _ClutterTouchpadPinchEvent
|
||||
gfloat dy;
|
||||
gfloat angle_delta;
|
||||
gfloat scale;
|
||||
guint n_fingers;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -493,6 +497,49 @@ struct _ClutterTouchpadSwipeEvent
|
||||
gfloat dy;
|
||||
};
|
||||
|
||||
struct _ClutterPadButtonEvent
|
||||
{
|
||||
ClutterEventType type;
|
||||
guint32 time;
|
||||
ClutterEventFlags flags;
|
||||
ClutterStage *stage;
|
||||
ClutterActor *source;
|
||||
|
||||
guint32 button;
|
||||
guint32 group;
|
||||
ClutterInputDevice *device;
|
||||
};
|
||||
|
||||
struct _ClutterPadStripEvent
|
||||
{
|
||||
ClutterEventType type;
|
||||
guint32 time;
|
||||
ClutterEventFlags flags;
|
||||
ClutterStage *stage;
|
||||
ClutterActor *source;
|
||||
|
||||
ClutterInputDevice *device;
|
||||
ClutterInputDevicePadSource strip_source;
|
||||
guint32 strip_number;
|
||||
guint32 group;
|
||||
gdouble value;
|
||||
};
|
||||
|
||||
struct _ClutterPadRingEvent
|
||||
{
|
||||
ClutterEventType type;
|
||||
guint32 time;
|
||||
ClutterEventFlags flags;
|
||||
ClutterStage *stage;
|
||||
ClutterActor *source;
|
||||
|
||||
ClutterInputDevice *device;
|
||||
ClutterInputDevicePadSource ring_source;
|
||||
guint32 ring_number;
|
||||
guint32 group;
|
||||
gdouble angle;
|
||||
};
|
||||
|
||||
/**
|
||||
* ClutterEvent:
|
||||
*
|
||||
@@ -516,6 +563,9 @@ union _ClutterEvent
|
||||
ClutterTouchpadPinchEvent touchpad_pinch;
|
||||
ClutterTouchpadSwipeEvent touchpad_swipe;
|
||||
ClutterProximityEvent proximity;
|
||||
ClutterPadButtonEvent pad_button;
|
||||
ClutterPadStripEvent pad_strip;
|
||||
ClutterPadRingEvent pad_ring;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -703,7 +753,7 @@ CLUTTER_AVAILABLE_IN_1_2
|
||||
const ClutterEvent * clutter_get_current_event (void);
|
||||
|
||||
CLUTTER_AVAILABLE_IN_1_24
|
||||
guint clutter_event_get_gesture_swipe_finger_count (const ClutterEvent *event);
|
||||
guint clutter_event_get_touchpad_gesture_finger_count (const ClutterEvent *event);
|
||||
|
||||
CLUTTER_AVAILABLE_IN_1_24
|
||||
gdouble clutter_event_get_gesture_pinch_angle_delta (const ClutterEvent *event);
|
||||
@@ -722,6 +772,10 @@ void clutter_event_get_gesture_motion_delta (const Clut
|
||||
ClutterScrollSource clutter_event_get_scroll_source (const ClutterEvent *event);
|
||||
ClutterScrollFinishFlags clutter_event_get_scroll_finish_flags (const ClutterEvent *event);
|
||||
|
||||
CLUTTER_AVAILABLE_IN_ALL
|
||||
guint clutter_event_get_mode_group (const ClutterEvent *event);
|
||||
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __CLUTTER_EVENT_H__ */
|
||||
|
@@ -34,12 +34,14 @@ struct _ClutterInputDeviceToolPrivate
|
||||
{
|
||||
ClutterInputDeviceToolType type;
|
||||
guint64 serial;
|
||||
guint64 id;
|
||||
};
|
||||
|
||||
enum {
|
||||
PROP_0,
|
||||
PROP_TYPE,
|
||||
PROP_SERIAL,
|
||||
PROP_ID,
|
||||
PROP_LAST
|
||||
};
|
||||
|
||||
@@ -66,6 +68,9 @@ clutter_input_device_tool_set_property (GObject *object,
|
||||
case PROP_SERIAL:
|
||||
priv->serial = g_value_get_uint64 (value);
|
||||
break;
|
||||
case PROP_ID:
|
||||
priv->id = g_value_get_uint64 (value);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
}
|
||||
@@ -90,6 +95,9 @@ clutter_input_device_tool_get_property (GObject *object,
|
||||
case PROP_SERIAL:
|
||||
g_value_set_uint64 (value, priv->serial);
|
||||
break;
|
||||
case PROP_ID:
|
||||
g_value_set_uint64 (value, priv->id);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
}
|
||||
@@ -116,6 +124,12 @@ clutter_input_device_tool_class_init (ClutterInputDeviceToolClass *klass)
|
||||
P_("Tool serial"),
|
||||
0, G_MAXUINT64, 0,
|
||||
CLUTTER_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
|
||||
props[PROP_ID] =
|
||||
g_param_spec_uint64 ("id",
|
||||
P_("Tool ID"),
|
||||
P_("Tool ID"),
|
||||
0, G_MAXUINT64, 0,
|
||||
CLUTTER_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
|
||||
|
||||
g_object_class_install_properties (gobject_class, PROP_LAST, props);
|
||||
}
|
||||
@@ -136,7 +150,7 @@ clutter_input_device_tool_init (ClutterInputDeviceTool *tool)
|
||||
*
|
||||
* Since: 1.28
|
||||
**/
|
||||
guint
|
||||
guint64
|
||||
clutter_input_device_tool_get_serial (ClutterInputDeviceTool *tool)
|
||||
{
|
||||
ClutterInputDeviceToolPrivate *priv;
|
||||
@@ -170,3 +184,24 @@ clutter_input_device_tool_get_tool_type (ClutterInputDeviceTool *tool)
|
||||
|
||||
return priv->type;
|
||||
}
|
||||
|
||||
/**
|
||||
* clutter_input_device_tool_get_id:
|
||||
* @tool: a #ClutterInputDeviceTool
|
||||
*
|
||||
* Gets the ID of this tool, this value can be used to identify a
|
||||
* physical tool (eg. a tablet pen) across program executions.
|
||||
*
|
||||
* Returns: The tool ID for this tool
|
||||
**/
|
||||
guint64
|
||||
clutter_input_device_tool_get_id (ClutterInputDeviceTool *tool)
|
||||
{
|
||||
ClutterInputDeviceToolPrivate *priv;
|
||||
|
||||
g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE_TOOL (tool), 0);
|
||||
|
||||
priv = clutter_input_device_tool_get_instance_private (tool);
|
||||
|
||||
return priv->id;
|
||||
}
|
||||
|
@@ -56,11 +56,14 @@ CLUTTER_AVAILABLE_IN_ALL
|
||||
GType clutter_input_device_tool_get_type (void) G_GNUC_CONST;
|
||||
|
||||
CLUTTER_AVAILABLE_IN_ALL
|
||||
guint clutter_input_device_tool_get_serial (ClutterInputDeviceTool *tool);
|
||||
guint64 clutter_input_device_tool_get_serial (ClutterInputDeviceTool *tool);
|
||||
|
||||
CLUTTER_AVAILABLE_IN_ALL
|
||||
ClutterInputDeviceToolType clutter_input_device_tool_get_tool_type (ClutterInputDeviceTool *tool);
|
||||
|
||||
CLUTTER_AVAILABLE_IN_ALL
|
||||
guint64 clutter_input_device_tool_get_id (ClutterInputDeviceTool *tool);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __CLUTTER_INPUT_DEVICE_TOOL_H__ */
|
||||
|
@@ -70,6 +70,12 @@ enum
|
||||
PROP_VENDOR_ID,
|
||||
PROP_PRODUCT_ID,
|
||||
|
||||
PROP_N_STRIPS,
|
||||
PROP_N_RINGS,
|
||||
PROP_N_MODE_GROUPS,
|
||||
PROP_DEVICE_NODE,
|
||||
PROP_MAPPING_MODE,
|
||||
|
||||
PROP_LAST
|
||||
};
|
||||
|
||||
@@ -195,6 +201,26 @@ clutter_input_device_set_property (GObject *gobject,
|
||||
self->product_id = g_value_dup_string (value);
|
||||
break;
|
||||
|
||||
case PROP_N_RINGS:
|
||||
self->n_rings = g_value_get_int (value);
|
||||
break;
|
||||
|
||||
case PROP_N_STRIPS:
|
||||
self->n_strips = g_value_get_int (value);
|
||||
break;
|
||||
|
||||
case PROP_N_MODE_GROUPS:
|
||||
self->n_mode_groups = g_value_get_int (value);
|
||||
break;
|
||||
|
||||
case PROP_DEVICE_NODE:
|
||||
self->node_path = g_value_dup_string (value);
|
||||
break;
|
||||
|
||||
case PROP_MAPPING_MODE:
|
||||
self->mapping_mode = g_value_get_enum (value);
|
||||
break;
|
||||
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
|
||||
break;
|
||||
@@ -255,6 +281,26 @@ clutter_input_device_get_property (GObject *gobject,
|
||||
g_value_set_string (value, self->product_id);
|
||||
break;
|
||||
|
||||
case PROP_N_RINGS:
|
||||
g_value_set_int (value, self->n_rings);
|
||||
break;
|
||||
|
||||
case PROP_N_STRIPS:
|
||||
g_value_set_int (value, self->n_strips);
|
||||
break;
|
||||
|
||||
case PROP_N_MODE_GROUPS:
|
||||
g_value_set_int (value, self->n_mode_groups);
|
||||
break;
|
||||
|
||||
case PROP_DEVICE_NODE:
|
||||
g_value_set_string (value, self->node_path);
|
||||
break;
|
||||
|
||||
case PROP_MAPPING_MODE:
|
||||
g_value_set_enum (value, self->mapping_mode);
|
||||
break;
|
||||
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
|
||||
break;
|
||||
@@ -432,6 +478,42 @@ clutter_input_device_class_init (ClutterInputDeviceClass *klass)
|
||||
NULL,
|
||||
CLUTTER_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
|
||||
|
||||
obj_props[PROP_N_RINGS] =
|
||||
g_param_spec_int ("n-rings",
|
||||
P_("Number of rings"),
|
||||
P_("Number of rings (circular sliders) in this device"),
|
||||
0, G_MAXINT, 0,
|
||||
CLUTTER_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
|
||||
|
||||
obj_props[PROP_N_STRIPS] =
|
||||
g_param_spec_int ("n-strips",
|
||||
P_("Number of strips"),
|
||||
P_("Number of strips (linear sliders) in this device"),
|
||||
0, G_MAXINT, 0,
|
||||
CLUTTER_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
|
||||
|
||||
obj_props[PROP_N_MODE_GROUPS] =
|
||||
g_param_spec_int ("n-mode-groups",
|
||||
P_("Number of mode groups"),
|
||||
P_("Number of mode groups"),
|
||||
0, G_MAXINT, 0,
|
||||
CLUTTER_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
|
||||
|
||||
obj_props[PROP_DEVICE_NODE] =
|
||||
g_param_spec_string ("device-node",
|
||||
P_("Device node path"),
|
||||
P_("Device node path"),
|
||||
NULL,
|
||||
CLUTTER_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
|
||||
|
||||
obj_props[PROP_MAPPING_MODE] =
|
||||
g_param_spec_enum ("mapping-mode",
|
||||
P_("Device mapping mode"),
|
||||
P_("Device mapping mode"),
|
||||
CLUTTER_TYPE_INPUT_DEVICE_MAPPING,
|
||||
CLUTTER_INPUT_DEVICE_MAPPING_ABSOLUTE,
|
||||
CLUTTER_PARAM_READWRITE);
|
||||
|
||||
gobject_class->dispose = clutter_input_device_dispose;
|
||||
gobject_class->set_property = clutter_input_device_set_property;
|
||||
gobject_class->get_property = clutter_input_device_get_property;
|
||||
@@ -2066,3 +2148,64 @@ clutter_input_device_update_from_tool (ClutterInputDevice *device,
|
||||
if (device_class->update_from_tool)
|
||||
device_class->update_from_tool (device, tool);
|
||||
}
|
||||
|
||||
gint
|
||||
clutter_input_device_get_n_rings (ClutterInputDevice *device)
|
||||
{
|
||||
g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE (device), 0);
|
||||
|
||||
return device->n_rings;
|
||||
}
|
||||
|
||||
gint
|
||||
clutter_input_device_get_n_strips (ClutterInputDevice *device)
|
||||
{
|
||||
g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE (device), 0);
|
||||
|
||||
return device->n_strips;
|
||||
}
|
||||
|
||||
gint
|
||||
clutter_input_device_get_n_mode_groups (ClutterInputDevice *device)
|
||||
{
|
||||
g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE (device), 0);
|
||||
g_return_val_if_fail (clutter_input_device_get_device_type (device) ==
|
||||
CLUTTER_PAD_DEVICE, 0);
|
||||
|
||||
return device->n_mode_groups;
|
||||
}
|
||||
|
||||
const gchar *
|
||||
clutter_input_device_get_device_node (ClutterInputDevice *device)
|
||||
{
|
||||
g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE (device), NULL);
|
||||
|
||||
return device->node_path;
|
||||
}
|
||||
|
||||
ClutterInputDeviceMapping
|
||||
clutter_input_device_get_mapping_mode (ClutterInputDevice *device)
|
||||
{
|
||||
g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE (device),
|
||||
CLUTTER_INPUT_DEVICE_MAPPING_ABSOLUTE);
|
||||
g_return_val_if_fail (clutter_input_device_get_device_type (device) ==
|
||||
CLUTTER_TABLET_DEVICE,
|
||||
CLUTTER_INPUT_DEVICE_MAPPING_ABSOLUTE);
|
||||
|
||||
return device->mapping_mode;
|
||||
}
|
||||
|
||||
void
|
||||
clutter_input_device_set_mapping_mode (ClutterInputDevice *device,
|
||||
ClutterInputDeviceMapping mapping)
|
||||
{
|
||||
g_return_if_fail (CLUTTER_IS_INPUT_DEVICE (device));
|
||||
g_return_if_fail (clutter_input_device_get_device_type (device) ==
|
||||
CLUTTER_TABLET_DEVICE);
|
||||
|
||||
if (device->mapping_mode == mapping)
|
||||
return;
|
||||
|
||||
device->mapping_mode = mapping;
|
||||
g_object_notify (G_OBJECT (device), "mapping-mode");
|
||||
}
|
||||
|
@@ -140,6 +140,23 @@ const gchar * clutter_input_device_get_vendor_id (ClutterInputDev
|
||||
CLUTTER_AVAILABLE_IN_1_22
|
||||
const gchar * clutter_input_device_get_product_id (ClutterInputDevice *device);
|
||||
|
||||
CLUTTER_AVAILABLE_IN_ALL
|
||||
gint clutter_input_device_get_n_rings (ClutterInputDevice *device);
|
||||
CLUTTER_AVAILABLE_IN_ALL
|
||||
gint clutter_input_device_get_n_strips (ClutterInputDevice *device);
|
||||
CLUTTER_AVAILABLE_IN_ALL
|
||||
gint clutter_input_device_get_n_mode_groups (ClutterInputDevice *device);
|
||||
|
||||
CLUTTER_AVAILABLE_IN_ALL
|
||||
const gchar * clutter_input_device_get_device_node (ClutterInputDevice *device);
|
||||
|
||||
CLUTTER_AVAILABLE_IN_ALL
|
||||
ClutterInputDeviceMapping clutter_input_device_get_mapping_mode (ClutterInputDevice *device);
|
||||
|
||||
CLUTTER_AVAILABLE_IN_ALL
|
||||
void clutter_input_device_set_mapping_mode (ClutterInputDevice *device,
|
||||
ClutterInputDeviceMapping mapping);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __CLUTTER_INPUT_DEVICE_H__ */
|
||||
|
@@ -719,14 +719,8 @@ clutter_get_text_direction (void)
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Translators: Leave this UNTRANSLATED if your language is
|
||||
* left-to-right. If your language is right-to-left
|
||||
* (e.g. Hebrew, Arabic), translate it to "default:RTL".
|
||||
*
|
||||
* Do NOT translate it to non-English e.g. "predefinito:LTR"! If
|
||||
* it isn't default:LTR or default:RTL it will not work.
|
||||
*/
|
||||
char *e = _("default:LTR");
|
||||
/* Re-use GTK+'s LTR/RTL handling */
|
||||
const char *e = g_dgettext ("gtk30", "default:LTR");
|
||||
|
||||
if (strcmp (e, "default:RTL") == 0)
|
||||
dir = CLUTTER_TEXT_DIRECTION_RTL;
|
||||
@@ -2163,6 +2157,10 @@ _clutter_process_event_details (ClutterActor *stage,
|
||||
|
||||
case CLUTTER_KEY_PRESS:
|
||||
case CLUTTER_KEY_RELEASE:
|
||||
case CLUTTER_PAD_BUTTON_PRESS:
|
||||
case CLUTTER_PAD_BUTTON_RELEASE:
|
||||
case CLUTTER_PAD_STRIP:
|
||||
case CLUTTER_PAD_RING:
|
||||
{
|
||||
ClutterActor *actor = NULL;
|
||||
|
||||
|
@@ -23,6 +23,7 @@ VOID:OBJECT
|
||||
VOID:OBJECT,FLAGS
|
||||
VOID:OBJECT,FLOAT,FLOAT
|
||||
VOID:OBJECT,FLOAT,FLOAT,FLAGS
|
||||
VOID:OBJECT,OBJECT
|
||||
VOID:OBJECT,PARAM
|
||||
VOID:OBJECT,POINTER
|
||||
VOID:OBJECT,UINT
|
||||
|
@@ -27,6 +27,7 @@ enum
|
||||
|
||||
PROP_LAYOUT,
|
||||
PROP_FRAMEBUFFER,
|
||||
PROP_OFFSCREEN,
|
||||
|
||||
PROP_LAST
|
||||
};
|
||||
@@ -37,6 +38,10 @@ typedef struct _ClutterStageViewPrivate
|
||||
{
|
||||
cairo_rectangle_int_t layout;
|
||||
CoglFramebuffer *framebuffer;
|
||||
|
||||
CoglOffscreen *offscreen;
|
||||
CoglPipeline *pipeline;
|
||||
|
||||
guint dirty_viewport : 1;
|
||||
guint dirty_projection : 1;
|
||||
} ClutterStageViewPrivate;
|
||||
@@ -55,6 +60,18 @@ clutter_stage_view_get_layout (ClutterStageView *view,
|
||||
|
||||
CoglFramebuffer *
|
||||
clutter_stage_view_get_framebuffer (ClutterStageView *view)
|
||||
{
|
||||
ClutterStageViewPrivate *priv =
|
||||
clutter_stage_view_get_instance_private (view);
|
||||
|
||||
if (priv->offscreen)
|
||||
return priv->offscreen;
|
||||
else
|
||||
return priv->framebuffer;
|
||||
}
|
||||
|
||||
CoglFramebuffer *
|
||||
clutter_stage_view_get_onscreen (ClutterStageView *view)
|
||||
{
|
||||
ClutterStageViewPrivate *priv =
|
||||
clutter_stage_view_get_instance_private (view);
|
||||
@@ -62,6 +79,68 @@ clutter_stage_view_get_framebuffer (ClutterStageView *view)
|
||||
return priv->framebuffer;
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_stage_view_ensure_offscreen_blit_pipeline (ClutterStageView *view)
|
||||
{
|
||||
ClutterStageViewPrivate *priv =
|
||||
clutter_stage_view_get_instance_private (view);
|
||||
ClutterStageViewClass *view_class =
|
||||
CLUTTER_STAGE_VIEW_GET_CLASS (view);
|
||||
|
||||
g_assert (priv->offscreen != NULL);
|
||||
|
||||
if (priv->pipeline)
|
||||
return;
|
||||
|
||||
priv->pipeline =
|
||||
cogl_pipeline_new (cogl_framebuffer_get_context (priv->offscreen));
|
||||
cogl_pipeline_set_layer_filters (priv->pipeline, 0,
|
||||
COGL_PIPELINE_FILTER_NEAREST,
|
||||
COGL_PIPELINE_FILTER_NEAREST);
|
||||
cogl_pipeline_set_layer_texture (priv->pipeline, 0,
|
||||
cogl_offscreen_get_texture (priv->offscreen));
|
||||
cogl_pipeline_set_layer_wrap_mode (priv->pipeline, 0,
|
||||
COGL_PIPELINE_WRAP_MODE_CLAMP_TO_EDGE);
|
||||
|
||||
if (view_class->setup_offscreen_blit_pipeline)
|
||||
view_class->setup_offscreen_blit_pipeline (view, priv->pipeline);
|
||||
}
|
||||
|
||||
void
|
||||
clutter_stage_view_invalidate_offscreen_blit_pipeline (ClutterStageView *view)
|
||||
{
|
||||
ClutterStageViewPrivate *priv =
|
||||
clutter_stage_view_get_instance_private (view);
|
||||
|
||||
g_clear_pointer (&priv->pipeline, cogl_object_unref);
|
||||
}
|
||||
|
||||
void
|
||||
clutter_stage_view_blit_offscreen (ClutterStageView *view,
|
||||
const cairo_rectangle_int_t *rect)
|
||||
{
|
||||
ClutterStageViewPrivate *priv =
|
||||
clutter_stage_view_get_instance_private (view);
|
||||
CoglMatrix matrix;
|
||||
|
||||
clutter_stage_view_ensure_offscreen_blit_pipeline (view);
|
||||
cogl_framebuffer_push_matrix (priv->framebuffer);
|
||||
|
||||
/* Set transform so 0,0 is on the top left corner and 1,1 on
|
||||
* the bottom right corner.
|
||||
*/
|
||||
cogl_matrix_init_identity (&matrix);
|
||||
cogl_matrix_translate (&matrix, -1, 1, 0);
|
||||
cogl_matrix_scale (&matrix, 2, -2, 0);
|
||||
cogl_framebuffer_set_projection_matrix (priv->framebuffer, &matrix);
|
||||
|
||||
cogl_framebuffer_draw_rectangle (priv->framebuffer,
|
||||
priv->pipeline,
|
||||
0, 0, 1, 1);
|
||||
|
||||
cogl_framebuffer_pop_matrix (priv->framebuffer);
|
||||
}
|
||||
|
||||
gboolean
|
||||
clutter_stage_view_is_dirty_viewport (ClutterStageView *view)
|
||||
{
|
||||
@@ -100,6 +179,27 @@ clutter_stage_view_set_dirty_projection (ClutterStageView *view,
|
||||
priv->dirty_projection = dirty;
|
||||
}
|
||||
|
||||
void
|
||||
clutter_stage_view_transform_to_onscreen (ClutterStageView *view,
|
||||
gfloat *x,
|
||||
gfloat *y)
|
||||
{
|
||||
ClutterStageViewClass *view_class = CLUTTER_STAGE_VIEW_GET_CLASS (view);
|
||||
gfloat z = 0, w = 1;
|
||||
CoglMatrix matrix;
|
||||
|
||||
view_class->get_offscreen_transformation_matrix (view, &matrix);
|
||||
cogl_matrix_get_inverse (&matrix, &matrix);
|
||||
cogl_matrix_transform_point (&matrix, x, y, &z, &w);
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_stage_default_get_offscreen_transformation_matrix (ClutterStageView *view,
|
||||
CoglMatrix *matrix)
|
||||
{
|
||||
cogl_matrix_init_identity (matrix);
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_stage_view_get_property (GObject *object,
|
||||
guint prop_id,
|
||||
@@ -118,6 +218,11 @@ clutter_stage_view_get_property (GObject *object,
|
||||
case PROP_FRAMEBUFFER:
|
||||
g_value_set_boxed (value, priv->framebuffer);
|
||||
break;
|
||||
case PROP_OFFSCREEN:
|
||||
g_value_set_boxed (value, priv->offscreen);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -139,8 +244,13 @@ clutter_stage_view_set_property (GObject *object,
|
||||
priv->layout = *layout;
|
||||
break;
|
||||
case PROP_FRAMEBUFFER:
|
||||
priv->framebuffer = g_value_get_boxed (value);
|
||||
priv->framebuffer = g_value_dup_boxed (value);
|
||||
break;
|
||||
case PROP_OFFSCREEN:
|
||||
priv->offscreen = g_value_dup_boxed (value);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -152,11 +262,20 @@ clutter_stage_view_dispose (GObject *object)
|
||||
clutter_stage_view_get_instance_private (view);
|
||||
|
||||
g_clear_pointer (&priv->framebuffer, cogl_object_unref);
|
||||
g_clear_pointer (&priv->offscreen, cogl_object_unref);
|
||||
g_clear_pointer (&priv->pipeline, cogl_object_unref);
|
||||
|
||||
G_OBJECT_CLASS (clutter_stage_view_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_stage_view_init (ClutterStageView *view)
|
||||
{
|
||||
ClutterStageViewPrivate *priv =
|
||||
clutter_stage_view_get_instance_private (view);
|
||||
|
||||
priv->dirty_viewport = TRUE;
|
||||
priv->dirty_projection = TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -164,6 +283,9 @@ clutter_stage_view_class_init (ClutterStageViewClass *klass)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
|
||||
klass->get_offscreen_transformation_matrix =
|
||||
clutter_stage_default_get_offscreen_transformation_matrix;
|
||||
|
||||
object_class->get_property = clutter_stage_view_get_property;
|
||||
object_class->set_property = clutter_stage_view_set_property;
|
||||
object_class->dispose = clutter_stage_view_dispose;
|
||||
@@ -179,10 +301,19 @@ clutter_stage_view_class_init (ClutterStageViewClass *klass)
|
||||
obj_props[PROP_FRAMEBUFFER] =
|
||||
g_param_spec_boxed ("framebuffer",
|
||||
"View framebuffer",
|
||||
"The framebuffer of the view",
|
||||
"The front buffer of the view",
|
||||
COGL_TYPE_HANDLE,
|
||||
G_PARAM_READWRITE |
|
||||
G_PARAM_STATIC_STRINGS);
|
||||
|
||||
obj_props[PROP_OFFSCREEN] =
|
||||
g_param_spec_boxed ("offscreen",
|
||||
"Offscreen buffer",
|
||||
"Framebuffer used as intermediate buffer",
|
||||
COGL_TYPE_HANDLE,
|
||||
G_PARAM_READWRITE |
|
||||
G_PARAM_CONSTRUCT_ONLY |
|
||||
G_PARAM_STATIC_STRINGS);
|
||||
|
||||
g_object_class_install_properties (object_class, PROP_LAST, obj_props);
|
||||
}
|
||||
|
@@ -33,6 +33,12 @@ G_DECLARE_DERIVABLE_TYPE (ClutterStageView, clutter_stage_view,
|
||||
struct _ClutterStageViewClass
|
||||
{
|
||||
GObjectClass parent_class;
|
||||
|
||||
void (* setup_offscreen_blit_pipeline) (ClutterStageView *view,
|
||||
CoglPipeline *pipeline);
|
||||
|
||||
void (* get_offscreen_transformation_matrix) (ClutterStageView *view,
|
||||
CoglMatrix *matrix);
|
||||
};
|
||||
|
||||
CLUTTER_AVAILABLE_IN_MUTTER
|
||||
@@ -41,6 +47,18 @@ void clutter_stage_view_get_layout (ClutterStageView *view,
|
||||
|
||||
CLUTTER_AVAILABLE_IN_MUTTER
|
||||
CoglFramebuffer *clutter_stage_view_get_framebuffer (ClutterStageView *view);
|
||||
CLUTTER_AVAILABLE_IN_MUTTER
|
||||
CoglFramebuffer *clutter_stage_view_get_onscreen (ClutterStageView *view);
|
||||
CLUTTER_AVAILABLE_IN_MUTTER
|
||||
void clutter_stage_view_invalidate_offscreen_blit_pipeline (ClutterStageView *view);
|
||||
|
||||
CLUTTER_AVAILABLE_IN_MUTTER
|
||||
void clutter_stage_view_transform_to_onscreen (ClutterStageView *view,
|
||||
gfloat *x,
|
||||
gfloat *y);
|
||||
|
||||
void clutter_stage_view_blit_offscreen (ClutterStageView *view,
|
||||
const cairo_rectangle_int_t *clip);
|
||||
|
||||
gboolean clutter_stage_view_is_dirty_viewport (ClutterStageView *view);
|
||||
|
||||
|
@@ -998,6 +998,16 @@ _clutter_stage_process_queued_events (ClutterStage *stage)
|
||||
"Omitting motion event at %d, %d",
|
||||
(int) event->motion.x,
|
||||
(int) event->motion.y);
|
||||
|
||||
if (next_event->type == CLUTTER_MOTION)
|
||||
{
|
||||
ClutterDeviceManager *device_manager =
|
||||
clutter_device_manager_get_default ();
|
||||
|
||||
_clutter_device_manager_compress_motion (device_manager,
|
||||
next_event, event);
|
||||
}
|
||||
|
||||
goto next_event;
|
||||
}
|
||||
else if (event->type == CLUTTER_TOUCH_UPDATE &&
|
||||
@@ -1394,8 +1404,6 @@ _clutter_stage_do_pick_on_view (ClutterStage *stage,
|
||||
view_layout.height);
|
||||
|
||||
_clutter_stage_window_get_dirty_pixel (priv->impl, view, &dirty_x, &dirty_y);
|
||||
dirty_x -= view_layout.x;
|
||||
dirty_y -= view_layout.y;
|
||||
|
||||
if (G_LIKELY (!(clutter_pick_debug_flags & CLUTTER_DEBUG_DUMP_PICK_BUFFERS)))
|
||||
{
|
||||
@@ -1446,10 +1454,10 @@ _clutter_stage_do_pick_on_view (ClutterStage *stage,
|
||||
used. The format is requested as pre-multiplied because Cogl
|
||||
assumes that all pixels in the framebuffer are premultiplied so
|
||||
it avoids a conversion. */
|
||||
cogl_read_pixels (read_x, read_y, 1, 1,
|
||||
COGL_READ_PIXELS_COLOR_BUFFER,
|
||||
COGL_PIXEL_FORMAT_RGBA_8888_PRE,
|
||||
pixel);
|
||||
cogl_framebuffer_read_pixels (fb,
|
||||
read_x, read_y, 1, 1,
|
||||
COGL_PIXEL_FORMAT_RGBA_8888_PRE,
|
||||
pixel);
|
||||
|
||||
if (G_UNLIKELY (clutter_pick_debug_flags & CLUTTER_DEBUG_DUMP_PICK_BUFFERS))
|
||||
{
|
||||
@@ -4676,6 +4684,7 @@ capture_view (ClutterStage *stage,
|
||||
uint8_t *data;
|
||||
int stride;
|
||||
CoglBitmap *bitmap;
|
||||
cairo_rectangle_int_t view_layout;
|
||||
|
||||
framebuffer = clutter_stage_view_get_framebuffer (view);
|
||||
|
||||
@@ -4700,8 +4709,11 @@ capture_view (ClutterStage *stage,
|
||||
stride,
|
||||
data);
|
||||
|
||||
clutter_stage_view_get_layout (view, &view_layout);
|
||||
|
||||
cogl_framebuffer_read_pixels_into_bitmap (framebuffer,
|
||||
rect->x, rect->y,
|
||||
rect->x - view_layout.x,
|
||||
rect->y - view_layout.y,
|
||||
COGL_READ_PIXELS_COLOR_BUFFER,
|
||||
bitmap);
|
||||
|
||||
|
@@ -95,6 +95,7 @@ typedef struct _ClutterState ClutterState;
|
||||
|
||||
typedef struct _ClutterInputDeviceTool ClutterInputDeviceTool;
|
||||
typedef struct _ClutterInputDevice ClutterInputDevice;
|
||||
typedef struct _ClutterVirtualInputDevice ClutterVirtualInputDevice;
|
||||
|
||||
typedef CoglMatrix ClutterMatrix;
|
||||
|
||||
|
222
clutter/clutter/clutter-virtual-input-device.c
Normal file
222
clutter/clutter/clutter-virtual-input-device.c
Normal file
@@ -0,0 +1,222 @@
|
||||
/*
|
||||
* Clutter.
|
||||
*
|
||||
* An OpenGL based 'interactive canvas' library.
|
||||
*
|
||||
* Copyright (C) 2016 Red Hat Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Author: Jonas Ådahl <jadahl@gmail.com>
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "clutter-build-config.h"
|
||||
#endif
|
||||
|
||||
#include <glib-object.h>
|
||||
|
||||
#include "clutter-virtual-input-device.h"
|
||||
|
||||
#include "clutter-device-manager.h"
|
||||
#include "clutter-private.h"
|
||||
#include "clutter-enum-types.h"
|
||||
|
||||
enum
|
||||
{
|
||||
PROP_0,
|
||||
|
||||
PROP_DEVICE_MANAGER,
|
||||
PROP_DEVICE_TYPE,
|
||||
|
||||
PROP_LAST
|
||||
};
|
||||
|
||||
static GParamSpec *obj_props[PROP_LAST];
|
||||
|
||||
typedef struct _ClutterVirtualInputDevicePrivate
|
||||
{
|
||||
ClutterDeviceManager *manager;
|
||||
ClutterInputDeviceType device_type;
|
||||
} ClutterVirtualInputDevicePrivate;
|
||||
|
||||
G_DEFINE_TYPE_WITH_PRIVATE (ClutterVirtualInputDevice,
|
||||
clutter_virtual_input_device,
|
||||
G_TYPE_OBJECT)
|
||||
|
||||
void
|
||||
clutter_virtual_input_device_notify_relative_motion (ClutterVirtualInputDevice *virtual_device,
|
||||
uint64_t time_us,
|
||||
double dx,
|
||||
double dy)
|
||||
{
|
||||
ClutterVirtualInputDeviceClass *klass =
|
||||
CLUTTER_VIRTUAL_INPUT_DEVICE_GET_CLASS (virtual_device);
|
||||
|
||||
klass->notify_relative_motion (virtual_device, time_us, dx, dy);
|
||||
}
|
||||
|
||||
void
|
||||
clutter_virtual_input_device_notify_absolute_motion (ClutterVirtualInputDevice *virtual_device,
|
||||
uint64_t time_us,
|
||||
double x,
|
||||
double y)
|
||||
{
|
||||
ClutterVirtualInputDeviceClass *klass =
|
||||
CLUTTER_VIRTUAL_INPUT_DEVICE_GET_CLASS (virtual_device);
|
||||
|
||||
klass->notify_absolute_motion (virtual_device, time_us, x, y);
|
||||
}
|
||||
|
||||
void
|
||||
clutter_virtual_input_device_notify_button (ClutterVirtualInputDevice *virtual_device,
|
||||
uint64_t time_us,
|
||||
uint32_t button,
|
||||
ClutterButtonState button_state)
|
||||
{
|
||||
ClutterVirtualInputDeviceClass *klass =
|
||||
CLUTTER_VIRTUAL_INPUT_DEVICE_GET_CLASS (virtual_device);
|
||||
|
||||
klass->notify_button (virtual_device, time_us, button, button_state);
|
||||
}
|
||||
|
||||
void
|
||||
clutter_virtual_input_device_notify_key (ClutterVirtualInputDevice *virtual_device,
|
||||
uint64_t time_us,
|
||||
uint32_t key,
|
||||
ClutterKeyState key_state)
|
||||
{
|
||||
ClutterVirtualInputDeviceClass *klass =
|
||||
CLUTTER_VIRTUAL_INPUT_DEVICE_GET_CLASS (virtual_device);
|
||||
|
||||
klass->notify_key (virtual_device, time_us, key, key_state);
|
||||
}
|
||||
|
||||
void
|
||||
clutter_virtual_input_device_notify_keyval (ClutterVirtualInputDevice *virtual_device,
|
||||
uint64_t time_us,
|
||||
uint32_t keyval,
|
||||
ClutterKeyState key_state)
|
||||
{
|
||||
ClutterVirtualInputDeviceClass *klass =
|
||||
CLUTTER_VIRTUAL_INPUT_DEVICE_GET_CLASS (virtual_device);
|
||||
|
||||
klass->notify_keyval (virtual_device, time_us, keyval, key_state);
|
||||
}
|
||||
|
||||
/**
|
||||
* clutter_virtual_input_device_get_manager:
|
||||
* @virtual_device: a virtual device
|
||||
*
|
||||
* Gets the device manager of this virtual device.
|
||||
*
|
||||
* Returns: (transfer none): The #ClutterDeviceManager of this virtual device
|
||||
**/
|
||||
ClutterDeviceManager *
|
||||
clutter_virtual_input_device_get_manager (ClutterVirtualInputDevice *virtual_device)
|
||||
{
|
||||
ClutterVirtualInputDevicePrivate *priv =
|
||||
clutter_virtual_input_device_get_instance_private (virtual_device);
|
||||
|
||||
return priv->manager;
|
||||
}
|
||||
|
||||
int
|
||||
clutter_virtual_input_device_get_device_type (ClutterVirtualInputDevice *virtual_device)
|
||||
{
|
||||
ClutterVirtualInputDevicePrivate *priv =
|
||||
clutter_virtual_input_device_get_instance_private (virtual_device);
|
||||
|
||||
return priv->device_type;
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_virtual_input_device_get_property (GObject *object,
|
||||
guint prop_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
ClutterVirtualInputDevice *virtual_device =
|
||||
CLUTTER_VIRTUAL_INPUT_DEVICE (object);
|
||||
ClutterVirtualInputDevicePrivate *priv =
|
||||
clutter_virtual_input_device_get_instance_private (virtual_device);
|
||||
|
||||
switch (prop_id)
|
||||
{
|
||||
case PROP_DEVICE_MANAGER:
|
||||
g_value_set_object (value, priv->manager);
|
||||
break;
|
||||
case PROP_DEVICE_TYPE:
|
||||
g_value_set_enum (value, priv->device_type);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_virtual_input_device_set_property (GObject *object,
|
||||
guint prop_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
ClutterVirtualInputDevice *virtual_device =
|
||||
CLUTTER_VIRTUAL_INPUT_DEVICE (object);
|
||||
ClutterVirtualInputDevicePrivate *priv =
|
||||
clutter_virtual_input_device_get_instance_private (virtual_device);
|
||||
|
||||
switch (prop_id)
|
||||
{
|
||||
case PROP_DEVICE_MANAGER:
|
||||
priv->manager = g_value_get_object (value);
|
||||
break;
|
||||
case PROP_DEVICE_TYPE:
|
||||
priv->device_type = g_value_get_enum (value);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_virtual_input_device_init (ClutterVirtualInputDevice *virtual_device)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_virtual_input_device_class_init (ClutterVirtualInputDeviceClass *klass)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
|
||||
object_class->get_property = clutter_virtual_input_device_get_property;
|
||||
object_class->set_property = clutter_virtual_input_device_set_property;
|
||||
|
||||
obj_props[PROP_DEVICE_MANAGER] =
|
||||
g_param_spec_object ("device-manager",
|
||||
P_("Device Manager"),
|
||||
P_("The device manager instance"),
|
||||
CLUTTER_TYPE_DEVICE_MANAGER,
|
||||
CLUTTER_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
|
||||
obj_props[PROP_DEVICE_TYPE] =
|
||||
g_param_spec_enum ("device-type",
|
||||
P_("Device type"),
|
||||
P_("Device type"),
|
||||
CLUTTER_TYPE_INPUT_DEVICE_TYPE,
|
||||
CLUTTER_POINTER_DEVICE,
|
||||
CLUTTER_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
|
||||
|
||||
g_object_class_install_properties (object_class, PROP_LAST, obj_props);
|
||||
}
|
116
clutter/clutter/clutter-virtual-input-device.h
Normal file
116
clutter/clutter/clutter-virtual-input-device.h
Normal file
@@ -0,0 +1,116 @@
|
||||
/*
|
||||
* Clutter.
|
||||
*
|
||||
* An OpenGL based 'interactive canvas' library.
|
||||
*
|
||||
* Copyright (C) 2016 Red Hat inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Author: Jonas Ådahl <jadahl@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __CLUTTER_VIRTUAL_INPUT_DEVICE_H__
|
||||
#define __CLUTTER_VIRTUAL_INPUT_DEVICE_H__
|
||||
|
||||
#include <glib-object.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "clutter-device-manager.h"
|
||||
|
||||
#define CLUTTER_TYPE_VIRTUAL_INPUT_DEVICE (clutter_virtual_input_device_get_type ())
|
||||
|
||||
CLUTTER_AVAILABLE_IN_ALL
|
||||
G_DECLARE_DERIVABLE_TYPE (ClutterVirtualInputDevice,
|
||||
clutter_virtual_input_device,
|
||||
CLUTTER, VIRTUAL_INPUT_DEVICE,
|
||||
GObject)
|
||||
|
||||
typedef enum _ClutterButtonState
|
||||
{
|
||||
CLUTTER_BUTTON_STATE_RELEASED,
|
||||
CLUTTER_BUTTON_STATE_PRESSED
|
||||
} ClutterButtonState;
|
||||
|
||||
typedef enum _ClutterKeyState
|
||||
{
|
||||
CLUTTER_KEY_STATE_RELEASED,
|
||||
CLUTTER_KEY_STATE_PRESSED
|
||||
} ClutterKeyState;
|
||||
|
||||
struct _ClutterVirtualInputDeviceClass
|
||||
{
|
||||
GObjectClass parent_class;
|
||||
|
||||
void (*notify_relative_motion) (ClutterVirtualInputDevice *virtual_device,
|
||||
uint64_t time_us,
|
||||
double dx,
|
||||
double dy);
|
||||
|
||||
void (*notify_absolute_motion) (ClutterVirtualInputDevice *virtual_device,
|
||||
uint64_t time_us,
|
||||
double x,
|
||||
double y);
|
||||
|
||||
void (*notify_button) (ClutterVirtualInputDevice *virtual_device,
|
||||
uint64_t time_us,
|
||||
uint32_t button,
|
||||
ClutterButtonState button_state);
|
||||
|
||||
void (*notify_key) (ClutterVirtualInputDevice *virtual_device,
|
||||
uint64_t time_us,
|
||||
uint32_t key,
|
||||
ClutterKeyState key_state);
|
||||
void (*notify_keyval) (ClutterVirtualInputDevice *virtual_device,
|
||||
uint64_t time_us,
|
||||
uint32_t keyval,
|
||||
ClutterKeyState key_state);
|
||||
};
|
||||
|
||||
CLUTTER_AVAILABLE_IN_ALL
|
||||
void clutter_virtual_input_device_notify_relative_motion (ClutterVirtualInputDevice *virtual_device,
|
||||
uint64_t time_us,
|
||||
double dx,
|
||||
double dy);
|
||||
|
||||
CLUTTER_AVAILABLE_IN_ALL
|
||||
void clutter_virtual_input_device_notify_absolute_motion (ClutterVirtualInputDevice *virtual_device,
|
||||
uint64_t time_us,
|
||||
double x,
|
||||
double y);
|
||||
|
||||
CLUTTER_AVAILABLE_IN_ALL
|
||||
void clutter_virtual_input_device_notify_button (ClutterVirtualInputDevice *virtual_device,
|
||||
uint64_t time_us,
|
||||
uint32_t button,
|
||||
ClutterButtonState button_state);
|
||||
|
||||
CLUTTER_AVAILABLE_IN_ALL
|
||||
void clutter_virtual_input_device_notify_key (ClutterVirtualInputDevice *virtual_device,
|
||||
uint64_t time_us,
|
||||
uint32_t key,
|
||||
ClutterKeyState key_state);
|
||||
|
||||
CLUTTER_AVAILABLE_IN_ALL
|
||||
void clutter_virtual_input_device_notify_keyval (ClutterVirtualInputDevice *virtual_device,
|
||||
uint64_t time_us,
|
||||
uint32_t keyval,
|
||||
ClutterKeyState key_state);
|
||||
|
||||
CLUTTER_AVAILABLE_IN_ALL
|
||||
ClutterDeviceManager * clutter_virtual_input_device_get_manager (ClutterVirtualInputDevice *virtual_device);
|
||||
|
||||
int clutter_virtual_input_device_get_device_type (ClutterVirtualInputDevice *virtual_device);
|
||||
|
||||
#endif /* __CLUTTER_VIRTUAL_INPUT_DEVICE_H__ */
|
@@ -107,6 +107,7 @@
|
||||
#include "clutter-transition.h"
|
||||
#include "clutter-units.h"
|
||||
#include "clutter-version.h"
|
||||
#include "clutter-virtual-input-device.h"
|
||||
#include "clutter-zoom-action.h"
|
||||
|
||||
#include "clutter-deprecated.h"
|
||||
|
@@ -37,6 +37,7 @@
|
||||
#include "clutter-stage-cogl.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
|
||||
#include "clutter-actor-private.h"
|
||||
#include "clutter-backend-private.h"
|
||||
@@ -357,7 +358,7 @@ swap_framebuffer (ClutterStageWindow *stage_window,
|
||||
cairo_rectangle_int_t *swap_region,
|
||||
gboolean swap_with_damage)
|
||||
{
|
||||
CoglFramebuffer *framebuffer = clutter_stage_view_get_framebuffer (view);
|
||||
CoglFramebuffer *framebuffer = clutter_stage_view_get_onscreen (view);
|
||||
int damage[4], ndamage;
|
||||
|
||||
damage[0] = swap_region->x;
|
||||
@@ -419,6 +420,12 @@ paint_stage (ClutterStageCogl *stage_cogl,
|
||||
|
||||
_clutter_stage_maybe_setup_viewport (stage, view);
|
||||
_clutter_stage_paint_view (stage, view, clip);
|
||||
|
||||
if (clutter_stage_view_get_onscreen (view) !=
|
||||
clutter_stage_view_get_framebuffer (view))
|
||||
{
|
||||
clutter_stage_view_blit_offscreen (view, clip);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -438,6 +445,42 @@ fill_current_damage_history_and_step (ClutterStageView *view)
|
||||
view_priv->damage_index++;
|
||||
}
|
||||
|
||||
static void
|
||||
transform_swap_region_to_onscreen (ClutterStageView *view,
|
||||
cairo_rectangle_int_t *swap_region)
|
||||
{
|
||||
CoglFramebuffer *framebuffer;
|
||||
cairo_rectangle_int_t layout;
|
||||
gfloat x1, y1, x2, y2;
|
||||
gint width, height;
|
||||
|
||||
framebuffer = clutter_stage_view_get_onscreen (view);
|
||||
clutter_stage_view_get_layout (view, &layout);
|
||||
|
||||
x1 = (float) swap_region->x / layout.width;
|
||||
y1 = (float) swap_region->y / layout.height;
|
||||
x2 = (float) (swap_region->x + swap_region->width) / layout.width;
|
||||
y2 = (float) (swap_region->y + swap_region->height) / layout.height;
|
||||
|
||||
clutter_stage_view_transform_to_onscreen (view, &x1, &y1);
|
||||
clutter_stage_view_transform_to_onscreen (view, &x2, &y2);
|
||||
|
||||
width = cogl_framebuffer_get_width (framebuffer);
|
||||
height = cogl_framebuffer_get_height (framebuffer);
|
||||
|
||||
x1 = floor (x1 * width);
|
||||
y1 = floor (height - (y1 * height));
|
||||
x2 = ceil (x2 * width);
|
||||
y2 = ceil (height - (y2 * height));
|
||||
|
||||
*swap_region = (cairo_rectangle_int_t) {
|
||||
.x = x1,
|
||||
.y = y1,
|
||||
.width = x2 - x1,
|
||||
.height = y2 - y1
|
||||
};
|
||||
}
|
||||
|
||||
static gboolean
|
||||
clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
|
||||
ClutterStageView *view)
|
||||
@@ -708,6 +751,12 @@ clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
|
||||
|
||||
if (do_swap_buffer)
|
||||
{
|
||||
if (clutter_stage_view_get_onscreen (view) !=
|
||||
clutter_stage_view_get_framebuffer (view))
|
||||
{
|
||||
transform_swap_region_to_onscreen (view, &swap_region);
|
||||
}
|
||||
|
||||
return swap_framebuffer (stage_window,
|
||||
view,
|
||||
&swap_region,
|
||||
@@ -757,7 +806,9 @@ clutter_stage_cogl_get_dirty_pixel (ClutterStageWindow *stage_window,
|
||||
int *x,
|
||||
int *y)
|
||||
{
|
||||
CoglFramebuffer *framebuffer = clutter_stage_view_get_framebuffer (view);
|
||||
gboolean has_buffer_age =
|
||||
cogl_is_onscreen (framebuffer) &&
|
||||
cogl_clutter_winsys_has_feature (COGL_WINSYS_FEATURE_BUFFER_AGE);
|
||||
cairo_rectangle_int_t *rect;
|
||||
|
||||
@@ -771,10 +822,13 @@ clutter_stage_cogl_get_dirty_pixel (ClutterStageWindow *stage_window,
|
||||
ClutterStageViewCogl *view_cogl = CLUTTER_STAGE_VIEW_COGL (view);
|
||||
ClutterStageViewCoglPrivate *view_priv =
|
||||
clutter_stage_view_cogl_get_instance_private (view_cogl);
|
||||
cairo_rectangle_int_t view_layout;
|
||||
|
||||
clutter_stage_view_get_layout (view, &view_layout);
|
||||
|
||||
rect = &view_priv->damage_history[DAMAGE_HISTORY (view_priv->damage_index - 1)];
|
||||
*x = rect->x;
|
||||
*y = rect->y;
|
||||
*x = rect->x - view_layout.x;
|
||||
*y = rect->y - view_layout.y;
|
||||
}
|
||||
}
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -24,6 +24,7 @@
|
||||
#ifndef __CLUTTER_DEVICE_MANAGER_EVDEV_H__
|
||||
#define __CLUTTER_DEVICE_MANAGER_EVDEV_H__
|
||||
|
||||
#include <clutter/clutter-backend.h>
|
||||
#include <clutter/clutter-device-manager.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
@@ -39,6 +40,8 @@ typedef struct _ClutterDeviceManagerEvdev ClutterDeviceManagerEvdev;
|
||||
typedef struct _ClutterDeviceManagerEvdevClass ClutterDeviceManagerEvdevClass;
|
||||
typedef struct _ClutterDeviceManagerEvdevPrivate ClutterDeviceManagerEvdevPrivate;
|
||||
|
||||
typedef struct _ClutterSeatEvdev ClutterSeatEvdev;
|
||||
|
||||
struct _ClutterDeviceManagerEvdev
|
||||
{
|
||||
ClutterDeviceManager parent_instance;
|
||||
@@ -61,6 +64,36 @@ gint _clutter_device_manager_evdev_acquire_device_id (ClutterDeviceManagerEvdev
|
||||
void _clutter_device_manager_evdev_release_device_id (ClutterDeviceManagerEvdev *manager_evdev,
|
||||
ClutterInputDevice *device);
|
||||
|
||||
struct xkb_keymap * _clutter_device_manager_evdev_get_keymap (ClutterDeviceManagerEvdev *manager_evdev);
|
||||
|
||||
ClutterStage * _clutter_device_manager_evdev_get_stage (ClutterDeviceManagerEvdev *manager_evdev);
|
||||
|
||||
void _clutter_device_manager_evdev_constrain_pointer (ClutterDeviceManagerEvdev *manager_evdev,
|
||||
ClutterInputDevice *core_pointer,
|
||||
uint64_t time_us,
|
||||
float x,
|
||||
float y,
|
||||
float *new_x,
|
||||
float *new_y);
|
||||
|
||||
static inline guint64
|
||||
us (guint64 us)
|
||||
{
|
||||
return us;
|
||||
}
|
||||
|
||||
static inline guint64
|
||||
ms2us (guint64 ms)
|
||||
{
|
||||
return us (ms * 1000);
|
||||
}
|
||||
|
||||
static inline guint32
|
||||
us2ms (guint64 us)
|
||||
{
|
||||
return (guint32) (us / 1000);
|
||||
}
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __CLUTTER_DEVICE_MANAGER_EVDEV_H__ */
|
||||
|
@@ -105,6 +105,10 @@ CLUTTER_AVAILABLE_IN_1_20
|
||||
void clutter_evdev_set_keyboard_layout_index (ClutterDeviceManager *evdev,
|
||||
xkb_layout_index_t idx);
|
||||
|
||||
CLUTTER_AVAILABLE_IN_1_26
|
||||
void clutter_evdev_set_keyboard_numlock (ClutterDeviceManager *evdev,
|
||||
gboolean numlock_state);
|
||||
|
||||
CLUTTER_AVAILABLE_IN_1_18
|
||||
void clutter_evdev_set_keyboard_repeat (ClutterDeviceManager *evdev,
|
||||
gboolean repeat,
|
||||
@@ -146,6 +150,14 @@ gboolean clutter_evdev_event_get_relative_motion (const ClutterEvent *event,
|
||||
double *dx_unaccel,
|
||||
double *dy_unaccel);
|
||||
|
||||
CLUTTER_AVAILABLE_IN_ALL
|
||||
void clutter_evdev_input_device_tool_set_pressure_curve (ClutterInputDeviceTool *tool,
|
||||
gdouble curve[4]);
|
||||
CLUTTER_AVAILABLE_IN_ALL
|
||||
void clutter_evdev_input_device_tool_set_button_code (ClutterInputDeviceTool *tool,
|
||||
guint button,
|
||||
guint evcode);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __CLUTTER_EVDEV_H__ */
|
||||
|
@@ -141,13 +141,24 @@ _clutter_input_device_evdev_new (ClutterDeviceManager *manager,
|
||||
ClutterInputDeviceType type;
|
||||
ClutterDeviceManagerEvdev *manager_evdev;
|
||||
gchar *vendor, *product;
|
||||
gint device_id;
|
||||
gint device_id, n_rings = 0, n_strips = 0, n_groups = 1;
|
||||
gchar *node_path;
|
||||
|
||||
type = _clutter_input_device_evdev_determine_type (libinput_device);
|
||||
vendor = g_strdup_printf ("%.4x", libinput_device_get_id_vendor (libinput_device));
|
||||
product = g_strdup_printf ("%.4x", libinput_device_get_id_product (libinput_device));
|
||||
manager_evdev = CLUTTER_DEVICE_MANAGER_EVDEV (manager);
|
||||
device_id = _clutter_device_manager_evdev_acquire_device_id (manager_evdev);
|
||||
node_path = g_strdup_printf ("/dev/input/%s", libinput_device_get_sysname (libinput_device));
|
||||
|
||||
if (libinput_device_has_capability (libinput_device,
|
||||
LIBINPUT_DEVICE_CAP_TABLET_PAD))
|
||||
{
|
||||
n_rings = libinput_device_tablet_pad_get_num_rings (libinput_device);
|
||||
n_strips = libinput_device_tablet_pad_get_num_strips (libinput_device);
|
||||
n_groups = libinput_device_tablet_pad_get_num_mode_groups (libinput_device);
|
||||
}
|
||||
|
||||
device = g_object_new (CLUTTER_TYPE_INPUT_DEVICE_EVDEV,
|
||||
"id", device_id,
|
||||
"name", libinput_device_get_name (libinput_device),
|
||||
@@ -157,6 +168,10 @@ _clutter_input_device_evdev_new (ClutterDeviceManager *manager,
|
||||
"enabled", TRUE,
|
||||
"vendor-id", vendor,
|
||||
"product-id", product,
|
||||
"n-rings", n_rings,
|
||||
"n-strips", n_strips,
|
||||
"n-mode-groups", n_groups,
|
||||
"device-node", node_path,
|
||||
NULL);
|
||||
|
||||
device->seat = seat;
|
||||
@@ -181,7 +196,8 @@ _clutter_input_device_evdev_new (ClutterDeviceManager *manager,
|
||||
ClutterInputDevice *
|
||||
_clutter_input_device_evdev_new_virtual (ClutterDeviceManager *manager,
|
||||
ClutterSeatEvdev *seat,
|
||||
ClutterInputDeviceType type)
|
||||
ClutterInputDeviceType type,
|
||||
ClutterInputMode mode)
|
||||
{
|
||||
ClutterInputDeviceEvdev *device;
|
||||
ClutterDeviceManagerEvdev *manager_evdev;
|
||||
@@ -208,7 +224,7 @@ _clutter_input_device_evdev_new_virtual (ClutterDeviceManager *manager,
|
||||
"name", name,
|
||||
"device-manager", manager,
|
||||
"device-type", type,
|
||||
"device-mode", CLUTTER_INPUT_MODE_MASTER,
|
||||
"device-mode", mode,
|
||||
"enabled", TRUE,
|
||||
NULL);
|
||||
|
||||
@@ -243,6 +259,8 @@ _clutter_input_device_evdev_determine_type (struct libinput_device *ldev)
|
||||
return CLUTTER_TOUCHPAD_DEVICE;
|
||||
else if (libinput_device_has_capability (ldev, LIBINPUT_DEVICE_CAP_TABLET_TOOL))
|
||||
return CLUTTER_TABLET_DEVICE;
|
||||
else if (libinput_device_has_capability (ldev, LIBINPUT_DEVICE_CAP_TABLET_PAD))
|
||||
return CLUTTER_PAD_DEVICE;
|
||||
else if (libinput_device_has_capability (ldev, LIBINPUT_DEVICE_CAP_POINTER))
|
||||
return CLUTTER_POINTER_DEVICE;
|
||||
else if (libinput_device_has_capability (ldev, LIBINPUT_DEVICE_CAP_TOUCH))
|
||||
|
@@ -29,7 +29,8 @@
|
||||
#include <glib-object.h>
|
||||
#include <libinput.h>
|
||||
|
||||
#include <clutter/clutter-input-device.h>
|
||||
#include "clutter/clutter-device-manager-private.h"
|
||||
#include "evdev/clutter-seat-evdev.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
@@ -56,7 +57,6 @@ G_BEGIN_DECLS
|
||||
CLUTTER_TYPE_INPUT_DEVICE_EVDEV, ClutterInputDeviceEvdevClass))
|
||||
|
||||
typedef struct _ClutterInputDeviceEvdev ClutterInputDeviceEvdev;
|
||||
typedef struct _ClutterSeatEvdev ClutterSeatEvdev;
|
||||
typedef struct _ClutterEventEvdev ClutterEventEvdev;
|
||||
|
||||
struct _ClutterInputDeviceEvdev
|
||||
@@ -76,7 +76,8 @@ ClutterInputDevice * _clutter_input_device_evdev_new (ClutterDe
|
||||
|
||||
ClutterInputDevice * _clutter_input_device_evdev_new_virtual (ClutterDeviceManager *manager,
|
||||
ClutterSeatEvdev *seat,
|
||||
ClutterInputDeviceType type);
|
||||
ClutterInputDeviceType type,
|
||||
ClutterInputMode mode);
|
||||
|
||||
ClutterSeatEvdev * _clutter_input_device_evdev_get_seat (ClutterInputDeviceEvdev *device);
|
||||
|
||||
|
@@ -26,6 +26,7 @@
|
||||
#endif
|
||||
|
||||
#include "clutter-input-device-tool-evdev.h"
|
||||
#include "clutter-evdev.h"
|
||||
|
||||
G_DEFINE_TYPE (ClutterInputDeviceToolEvdev, clutter_input_device_tool_evdev,
|
||||
CLUTTER_TYPE_INPUT_DEVICE_TOOL)
|
||||
@@ -35,6 +36,7 @@ clutter_input_device_tool_evdev_finalize (GObject *object)
|
||||
{
|
||||
ClutterInputDeviceToolEvdev *tool = CLUTTER_INPUT_DEVICE_TOOL_EVDEV (object);
|
||||
|
||||
g_hash_table_unref (tool->button_map);
|
||||
libinput_tablet_tool_unref (tool->tool);
|
||||
|
||||
G_OBJECT_CLASS (clutter_input_device_tool_evdev_parent_class)->finalize (object);
|
||||
@@ -51,6 +53,7 @@ clutter_input_device_tool_evdev_class_init (ClutterInputDeviceToolEvdevClass *kl
|
||||
static void
|
||||
clutter_input_device_tool_evdev_init (ClutterInputDeviceToolEvdev *tool)
|
||||
{
|
||||
tool->button_map = g_hash_table_new (NULL, NULL);
|
||||
}
|
||||
|
||||
ClutterInputDeviceTool *
|
||||
@@ -63,9 +66,103 @@ clutter_input_device_tool_evdev_new (struct libinput_tablet_tool *tool,
|
||||
evdev_tool = g_object_new (CLUTTER_TYPE_INPUT_DEVICE_TOOL_EVDEV,
|
||||
"type", type,
|
||||
"serial", serial,
|
||||
"id", libinput_tablet_tool_get_tool_id (tool),
|
||||
NULL);
|
||||
|
||||
evdev_tool->tool = libinput_tablet_tool_ref (tool);
|
||||
|
||||
return CLUTTER_INPUT_DEVICE_TOOL (evdev_tool);
|
||||
}
|
||||
|
||||
void
|
||||
clutter_evdev_input_device_tool_set_pressure_curve (ClutterInputDeviceTool *tool,
|
||||
gdouble curve[4])
|
||||
{
|
||||
ClutterInputDeviceToolEvdev *evdev_tool;
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_INPUT_DEVICE_TOOL_EVDEV (tool));
|
||||
g_return_if_fail (curve[0] >= 0 && curve[0] <= 1 &&
|
||||
curve[1] >= 0 && curve[1] <= 1 &&
|
||||
curve[2] >= 0 && curve[2] <= 1 &&
|
||||
curve[3] >= 0 && curve[3] <= 1);
|
||||
|
||||
evdev_tool = CLUTTER_INPUT_DEVICE_TOOL_EVDEV (tool);
|
||||
evdev_tool->pressure_curve[0] = curve[0];
|
||||
evdev_tool->pressure_curve[1] = curve[1];
|
||||
evdev_tool->pressure_curve[2] = curve[2];
|
||||
evdev_tool->pressure_curve[3] = curve[3];
|
||||
}
|
||||
|
||||
void
|
||||
clutter_evdev_input_device_tool_set_button_code (ClutterInputDeviceTool *tool,
|
||||
guint button,
|
||||
guint evcode)
|
||||
{
|
||||
ClutterInputDeviceToolEvdev *evdev_tool;
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_INPUT_DEVICE_TOOL_EVDEV (tool));
|
||||
|
||||
evdev_tool = CLUTTER_INPUT_DEVICE_TOOL_EVDEV (tool);
|
||||
|
||||
if (evcode == 0)
|
||||
{
|
||||
g_hash_table_remove (evdev_tool->button_map, GUINT_TO_POINTER (button));
|
||||
}
|
||||
else
|
||||
{
|
||||
g_hash_table_insert (evdev_tool->button_map, GUINT_TO_POINTER (button),
|
||||
GUINT_TO_POINTER (evcode));
|
||||
}
|
||||
}
|
||||
|
||||
static gdouble
|
||||
calculate_bezier_position (gdouble pos,
|
||||
gdouble x1,
|
||||
gdouble y1,
|
||||
gdouble x2,
|
||||
gdouble y2)
|
||||
{
|
||||
gdouble int1_y, int2_y;
|
||||
|
||||
pos = CLAMP (pos, 0, 1);
|
||||
|
||||
/* Intersection between 0,0 and x1,y1 */
|
||||
int1_y = pos * y1;
|
||||
|
||||
/* Intersection between x2,y2 and 1,1 */
|
||||
int2_y = (pos * (1 - y2)) + y2;
|
||||
|
||||
/* Find the new position in the line traced by the previous points */
|
||||
return (pos * (int2_y - int1_y)) + int1_y;
|
||||
}
|
||||
|
||||
gdouble
|
||||
clutter_input_device_tool_evdev_translate_pressure (ClutterInputDeviceTool *tool,
|
||||
gdouble pressure)
|
||||
{
|
||||
ClutterInputDeviceToolEvdev *evdev_tool;
|
||||
|
||||
g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE_TOOL (tool), pressure);
|
||||
|
||||
evdev_tool = CLUTTER_INPUT_DEVICE_TOOL_EVDEV (tool);
|
||||
|
||||
return calculate_bezier_position (CLAMP (pressure, 0, 1),
|
||||
evdev_tool->pressure_curve[0],
|
||||
evdev_tool->pressure_curve[1],
|
||||
evdev_tool->pressure_curve[2],
|
||||
evdev_tool->pressure_curve[3]);
|
||||
}
|
||||
|
||||
guint
|
||||
clutter_input_device_tool_evdev_get_button_code (ClutterInputDeviceTool *tool,
|
||||
guint button)
|
||||
{
|
||||
ClutterInputDeviceToolEvdev *evdev_tool;
|
||||
|
||||
g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE_TOOL (tool), 0);
|
||||
|
||||
evdev_tool = CLUTTER_INPUT_DEVICE_TOOL_EVDEV (tool);
|
||||
|
||||
return GPOINTER_TO_UINT (g_hash_table_lookup (evdev_tool->button_map,
|
||||
GUINT_TO_POINTER (button)));
|
||||
}
|
||||
|
@@ -59,6 +59,8 @@ struct _ClutterInputDeviceToolEvdev
|
||||
{
|
||||
ClutterInputDeviceTool parent_instance;
|
||||
struct libinput_tablet_tool *tool;
|
||||
GHashTable *button_map;
|
||||
gdouble pressure_curve[4];
|
||||
};
|
||||
|
||||
struct _ClutterInputDeviceToolEvdevClass
|
||||
@@ -72,6 +74,11 @@ ClutterInputDeviceTool * clutter_input_device_tool_evdev_new (struct libinp
|
||||
guint64 serial,
|
||||
ClutterInputDeviceToolType type);
|
||||
|
||||
gdouble clutter_input_device_tool_evdev_translate_pressure (ClutterInputDeviceTool *tool,
|
||||
gdouble pressure);
|
||||
guint clutter_input_device_tool_evdev_get_button_code (ClutterInputDeviceTool *tool,
|
||||
guint button);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __CLUTTER_INPUT_DEVICE_EVDEV_TOOL_H__ */
|
||||
|
600
clutter/clutter/evdev/clutter-seat-evdev.c
Normal file
600
clutter/clutter/evdev/clutter-seat-evdev.c
Normal file
@@ -0,0 +1,600 @@
|
||||
/*
|
||||
* Clutter.
|
||||
*
|
||||
* An OpenGL based 'interactive canvas' library.
|
||||
*
|
||||
* Copyright (C) 2010 Intel Corp.
|
||||
* Copyright (C) 2014 Jonas Ådahl
|
||||
* Copyright (C) 2016 Red Hat Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Author: Damien Lespiau <damien.lespiau@intel.com>
|
||||
* Author: Jonas Ådahl <jadahl@gmail.com>
|
||||
*/
|
||||
|
||||
#include "clutter-build-config.h"
|
||||
|
||||
#include "clutter-seat-evdev.h"
|
||||
|
||||
#include <linux/input.h>
|
||||
|
||||
#include "clutter-event-private.h"
|
||||
#include "clutter-input-device-evdev.h"
|
||||
#include "clutter-input-device-tool-evdev.h"
|
||||
#include "clutter-main.h"
|
||||
|
||||
/* Try to keep the pointer inside the stage. Hopefully no one is using
|
||||
* this backend with stages smaller than this. */
|
||||
#define INITIAL_POINTER_X 16
|
||||
#define INITIAL_POINTER_Y 16
|
||||
|
||||
#define AUTOREPEAT_VALUE 2
|
||||
|
||||
void
|
||||
clutter_seat_evdev_set_libinput_seat (ClutterSeatEvdev *seat,
|
||||
struct libinput_seat *libinput_seat)
|
||||
{
|
||||
g_assert (seat->libinput_seat == NULL);
|
||||
|
||||
libinput_seat_ref (libinput_seat);
|
||||
libinput_seat_set_user_data (libinput_seat, seat);
|
||||
seat->libinput_seat = libinput_seat;
|
||||
}
|
||||
|
||||
void
|
||||
clutter_seat_evdev_sync_leds (ClutterSeatEvdev *seat)
|
||||
{
|
||||
GSList *iter;
|
||||
ClutterInputDeviceEvdev *device_evdev;
|
||||
int caps_lock, num_lock, scroll_lock;
|
||||
enum libinput_led leds = 0;
|
||||
|
||||
caps_lock = xkb_state_led_index_is_active (seat->xkb, seat->caps_lock_led);
|
||||
num_lock = xkb_state_led_index_is_active (seat->xkb, seat->num_lock_led);
|
||||
scroll_lock = xkb_state_led_index_is_active (seat->xkb, seat->scroll_lock_led);
|
||||
|
||||
if (caps_lock)
|
||||
leds |= LIBINPUT_LED_CAPS_LOCK;
|
||||
if (num_lock)
|
||||
leds |= LIBINPUT_LED_NUM_LOCK;
|
||||
if (scroll_lock)
|
||||
leds |= LIBINPUT_LED_SCROLL_LOCK;
|
||||
|
||||
for (iter = seat->devices; iter; iter = iter->next)
|
||||
{
|
||||
device_evdev = iter->data;
|
||||
_clutter_input_device_evdev_update_leds (device_evdev, leds);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_touch_state_free (ClutterTouchState *touch_state)
|
||||
{
|
||||
g_slice_free (ClutterTouchState, touch_state);
|
||||
}
|
||||
|
||||
ClutterTouchState *
|
||||
clutter_seat_evdev_add_touch (ClutterSeatEvdev *seat,
|
||||
guint32 id)
|
||||
{
|
||||
ClutterTouchState *touch;
|
||||
|
||||
touch = g_slice_new0 (ClutterTouchState);
|
||||
touch->id = id;
|
||||
|
||||
g_hash_table_insert (seat->touches, GUINT_TO_POINTER (id), touch);
|
||||
|
||||
return touch;
|
||||
}
|
||||
|
||||
void
|
||||
clutter_seat_evdev_remove_touch (ClutterSeatEvdev *seat,
|
||||
guint32 id)
|
||||
{
|
||||
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));
|
||||
}
|
||||
|
||||
ClutterSeatEvdev *
|
||||
clutter_seat_evdev_new (ClutterDeviceManagerEvdev *manager_evdev)
|
||||
{
|
||||
ClutterDeviceManager *manager = CLUTTER_DEVICE_MANAGER (manager_evdev);
|
||||
ClutterSeatEvdev *seat;
|
||||
ClutterInputDevice *device;
|
||||
ClutterStage *stage;
|
||||
struct xkb_keymap *keymap;
|
||||
|
||||
seat = g_new0 (ClutterSeatEvdev, 1);
|
||||
if (!seat)
|
||||
return NULL;
|
||||
|
||||
seat->manager_evdev = manager_evdev;
|
||||
device = _clutter_input_device_evdev_new_virtual (
|
||||
manager, seat, CLUTTER_POINTER_DEVICE,
|
||||
CLUTTER_INPUT_MODE_MASTER);
|
||||
stage = _clutter_device_manager_evdev_get_stage (manager_evdev);
|
||||
_clutter_input_device_set_stage (device, stage);
|
||||
seat->pointer_x = INITIAL_POINTER_X;
|
||||
seat->pointer_y = INITIAL_POINTER_Y;
|
||||
_clutter_input_device_set_coords (device, NULL,
|
||||
seat->pointer_x, seat->pointer_y,
|
||||
NULL);
|
||||
_clutter_device_manager_add_device (manager, device);
|
||||
seat->core_pointer = device;
|
||||
|
||||
device = _clutter_input_device_evdev_new_virtual (
|
||||
manager, seat, CLUTTER_KEYBOARD_DEVICE,
|
||||
CLUTTER_INPUT_MODE_MASTER);
|
||||
_clutter_input_device_set_stage (device, stage);
|
||||
_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 */
|
||||
|
||||
keymap = _clutter_device_manager_evdev_get_keymap (manager_evdev);
|
||||
if (keymap)
|
||||
{
|
||||
seat->xkb = xkb_state_new (keymap);
|
||||
|
||||
seat->caps_lock_led =
|
||||
xkb_keymap_led_get_index (keymap, XKB_LED_NAME_CAPS);
|
||||
seat->num_lock_led =
|
||||
xkb_keymap_led_get_index (keymap, XKB_LED_NAME_NUM);
|
||||
seat->scroll_lock_led =
|
||||
xkb_keymap_led_get_index (keymap, XKB_LED_NAME_SCROLL);
|
||||
}
|
||||
|
||||
return seat;
|
||||
}
|
||||
|
||||
void
|
||||
clutter_seat_evdev_clear_repeat_timer (ClutterSeatEvdev *seat)
|
||||
{
|
||||
if (seat->repeat_timer)
|
||||
{
|
||||
g_source_remove (seat->repeat_timer);
|
||||
seat->repeat_timer = 0;
|
||||
g_clear_object (&seat->repeat_device);
|
||||
}
|
||||
}
|
||||
|
||||
static gboolean
|
||||
keyboard_repeat (gpointer data)
|
||||
{
|
||||
ClutterSeatEvdev *seat = data;
|
||||
GSource *source;
|
||||
guint32 time_ms;
|
||||
|
||||
g_return_val_if_fail (seat->repeat_device != NULL, G_SOURCE_REMOVE);
|
||||
source = g_main_context_find_source_by_id (NULL, seat->repeat_timer);
|
||||
time_ms = g_source_get_time (source) / 1000;
|
||||
|
||||
clutter_seat_evdev_notify_key (seat,
|
||||
seat->repeat_device,
|
||||
ms2us (time_ms),
|
||||
seat->repeat_key,
|
||||
AUTOREPEAT_VALUE,
|
||||
FALSE);
|
||||
|
||||
return G_SOURCE_CONTINUE;
|
||||
}
|
||||
|
||||
static void
|
||||
queue_event (ClutterEvent *event)
|
||||
{
|
||||
_clutter_event_push (event, FALSE);
|
||||
}
|
||||
|
||||
static int
|
||||
update_button_count (ClutterSeatEvdev *seat,
|
||||
uint32_t button,
|
||||
uint32_t state)
|
||||
{
|
||||
if (state)
|
||||
{
|
||||
return ++seat->button_count[button];
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Handle cases where we newer saw the initial pressed event. */
|
||||
if (seat->button_count[button] == 0)
|
||||
return 0;
|
||||
|
||||
return --seat->button_count[button];
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
clutter_seat_evdev_notify_key (ClutterSeatEvdev *seat,
|
||||
ClutterInputDevice *device,
|
||||
uint64_t time_us,
|
||||
uint32_t key,
|
||||
uint32_t state,
|
||||
gboolean update_keys)
|
||||
{
|
||||
ClutterStage *stage;
|
||||
ClutterEvent *event = NULL;
|
||||
enum xkb_state_component changed_state;
|
||||
|
||||
if (state != AUTOREPEAT_VALUE)
|
||||
{
|
||||
/* Drop any repeated button press (for example from virtual devices. */
|
||||
int count = update_button_count (seat, key, state);
|
||||
if (state && count > 1)
|
||||
return;
|
||||
if (!state && count != 0)
|
||||
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 (device);
|
||||
if (stage == NULL)
|
||||
{
|
||||
clutter_seat_evdev_clear_repeat_timer (seat);
|
||||
return;
|
||||
}
|
||||
|
||||
event = _clutter_key_event_new_from_evdev (device,
|
||||
seat->core_keyboard,
|
||||
stage,
|
||||
seat->xkb,
|
||||
seat->button_state,
|
||||
us2ms (time_us), key, state);
|
||||
_clutter_evdev_event_set_event_code (event, key);
|
||||
|
||||
/* We must be careful and not pass multiple releases to xkb, otherwise it gets
|
||||
confused and locks the modifiers */
|
||||
if (state != AUTOREPEAT_VALUE)
|
||||
{
|
||||
changed_state = xkb_state_update_key (seat->xkb,
|
||||
event->key.hardware_keycode,
|
||||
state ? XKB_KEY_DOWN : XKB_KEY_UP);
|
||||
}
|
||||
else
|
||||
{
|
||||
changed_state = 0;
|
||||
clutter_event_set_flags (event, CLUTTER_EVENT_FLAG_SYNTHETIC);
|
||||
}
|
||||
|
||||
queue_event (event);
|
||||
|
||||
if (update_keys && (changed_state & XKB_STATE_LEDS))
|
||||
clutter_seat_evdev_sync_leds (seat);
|
||||
|
||||
if (state == 0 || /* key release */
|
||||
!seat->repeat ||
|
||||
!xkb_keymap_key_repeats (xkb_state_get_keymap (seat->xkb),
|
||||
event->key.hardware_keycode))
|
||||
{
|
||||
clutter_seat_evdev_clear_repeat_timer (seat);
|
||||
return;
|
||||
}
|
||||
|
||||
if (state == 1) /* key press */
|
||||
seat->repeat_count = 0;
|
||||
|
||||
seat->repeat_count += 1;
|
||||
seat->repeat_key = key;
|
||||
|
||||
switch (seat->repeat_count)
|
||||
{
|
||||
case 1:
|
||||
case 2:
|
||||
{
|
||||
guint32 interval;
|
||||
|
||||
clutter_seat_evdev_clear_repeat_timer (seat);
|
||||
seat->repeat_device = g_object_ref (device);
|
||||
|
||||
if (seat->repeat_count == 1)
|
||||
interval = seat->repeat_delay;
|
||||
else
|
||||
interval = seat->repeat_interval;
|
||||
|
||||
seat->repeat_timer =
|
||||
clutter_threads_add_timeout_full (CLUTTER_PRIORITY_EVENTS,
|
||||
interval,
|
||||
keyboard_repeat,
|
||||
seat,
|
||||
NULL);
|
||||
return;
|
||||
}
|
||||
default:
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
static ClutterEvent *
|
||||
new_absolute_motion_event (ClutterSeatEvdev *seat,
|
||||
ClutterInputDevice *input_device,
|
||||
guint64 time_us,
|
||||
gfloat x,
|
||||
gfloat y,
|
||||
gdouble *axes)
|
||||
{
|
||||
ClutterStage *stage = _clutter_input_device_get_stage (input_device);
|
||||
ClutterEvent *event;
|
||||
|
||||
event = clutter_event_new (CLUTTER_MOTION);
|
||||
|
||||
if (clutter_input_device_get_device_type (input_device) != CLUTTER_TABLET_DEVICE)
|
||||
_clutter_device_manager_evdev_constrain_pointer (seat->manager_evdev,
|
||||
seat->core_pointer,
|
||||
time_us,
|
||||
seat->pointer_x,
|
||||
seat->pointer_y,
|
||||
&x, &y);
|
||||
|
||||
_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;
|
||||
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)
|
||||
{
|
||||
ClutterInputDeviceEvdev *device_evdev =
|
||||
CLUTTER_INPUT_DEVICE_EVDEV (input_device);
|
||||
|
||||
clutter_event_set_device_tool (event, device_evdev->last_tool);
|
||||
clutter_event_set_device (event, input_device);
|
||||
}
|
||||
else
|
||||
{
|
||||
clutter_event_set_device (event, seat->core_pointer);
|
||||
}
|
||||
|
||||
_clutter_input_device_set_stage (seat->core_pointer, stage);
|
||||
|
||||
if (clutter_input_device_get_device_type (input_device) != CLUTTER_TABLET_DEVICE)
|
||||
{
|
||||
seat->pointer_x = x;
|
||||
seat->pointer_y = y;
|
||||
}
|
||||
|
||||
return event;
|
||||
}
|
||||
|
||||
void
|
||||
clutter_seat_evdev_notify_relative_motion (ClutterSeatEvdev *seat,
|
||||
ClutterInputDevice *input_device,
|
||||
uint64_t time_us,
|
||||
float dx,
|
||||
float dy,
|
||||
float dx_unaccel,
|
||||
float dy_unaccel)
|
||||
{
|
||||
gfloat new_x, new_y;
|
||||
ClutterEvent *event;
|
||||
|
||||
/* We can drop the event on the floor if no stage has been
|
||||
* associated with the device yet. */
|
||||
if (!_clutter_input_device_get_stage (input_device))
|
||||
return;
|
||||
|
||||
new_x = seat->pointer_x + dx;
|
||||
new_y = seat->pointer_y + dy;
|
||||
event = new_absolute_motion_event (seat, input_device,
|
||||
time_us, new_x, new_y, NULL);
|
||||
|
||||
_clutter_evdev_event_set_relative_motion (event,
|
||||
dx, dy,
|
||||
dx_unaccel, dy_unaccel);
|
||||
|
||||
queue_event (event);
|
||||
}
|
||||
|
||||
void clutter_seat_evdev_notify_absolute_motion (ClutterSeatEvdev *seat,
|
||||
ClutterInputDevice *input_device,
|
||||
uint64_t time_us,
|
||||
float x,
|
||||
float y,
|
||||
double *axes)
|
||||
{
|
||||
ClutterEvent *event;
|
||||
|
||||
event = new_absolute_motion_event (seat, input_device, time_us, x, y, axes);
|
||||
|
||||
queue_event (event);
|
||||
}
|
||||
|
||||
void
|
||||
clutter_seat_evdev_notify_button (ClutterSeatEvdev *seat,
|
||||
ClutterInputDevice *input_device,
|
||||
uint64_t time_us,
|
||||
uint32_t button,
|
||||
uint32_t state)
|
||||
{
|
||||
ClutterInputDeviceEvdev *device_evdev = (ClutterInputDeviceEvdev *) input_device;
|
||||
ClutterStage *stage;
|
||||
ClutterEvent *event = NULL;
|
||||
gint button_nr;
|
||||
static gint maskmap[8] =
|
||||
{
|
||||
CLUTTER_BUTTON1_MASK, CLUTTER_BUTTON3_MASK, CLUTTER_BUTTON2_MASK,
|
||||
CLUTTER_BUTTON4_MASK, CLUTTER_BUTTON5_MASK, 0, 0, 0
|
||||
};
|
||||
int button_count;
|
||||
|
||||
/* Drop any repeated button press (for example from virtual devices. */
|
||||
button_count = update_button_count (seat, button, state);
|
||||
if (state && button_count > 1)
|
||||
return;
|
||||
if (!state && button_count != 0)
|
||||
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;
|
||||
|
||||
/* The evdev button numbers don't map sequentially to clutter button
|
||||
* numbers (the right and middle mouse buttons are in the opposite
|
||||
* order) so we'll map them directly with a switch statement */
|
||||
switch (button)
|
||||
{
|
||||
case BTN_LEFT:
|
||||
case BTN_TOUCH:
|
||||
button_nr = CLUTTER_BUTTON_PRIMARY;
|
||||
break;
|
||||
|
||||
case BTN_RIGHT:
|
||||
case BTN_STYLUS:
|
||||
button_nr = CLUTTER_BUTTON_SECONDARY;
|
||||
break;
|
||||
|
||||
case BTN_MIDDLE:
|
||||
case BTN_STYLUS2:
|
||||
button_nr = CLUTTER_BUTTON_MIDDLE;
|
||||
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)
|
||||
button_nr = button - BTN_TOOL_PEN + 4;
|
||||
else
|
||||
button_nr = button - (BTN_LEFT - 1) + 4;
|
||||
break;
|
||||
}
|
||||
|
||||
if (button_nr < 1 || button_nr > 12)
|
||||
{
|
||||
g_warning ("Unhandled button event 0x%x", button);
|
||||
return;
|
||||
}
|
||||
|
||||
if (state)
|
||||
event = clutter_event_new (CLUTTER_BUTTON_PRESS);
|
||||
else
|
||||
event = clutter_event_new (CLUTTER_BUTTON_RELEASE);
|
||||
|
||||
if (button_nr < G_N_ELEMENTS (maskmap))
|
||||
{
|
||||
/* Update the modifiers */
|
||||
if (state)
|
||||
seat->button_state |= maskmap[button_nr - 1];
|
||||
else
|
||||
seat->button_state &= ~maskmap[button_nr - 1];
|
||||
}
|
||||
|
||||
_clutter_evdev_event_set_time_usec (event, time_us);
|
||||
event->button.time = us2ms (time_us);
|
||||
event->button.stage = CLUTTER_STAGE (stage);
|
||||
_clutter_xkb_translate_state (event, seat->xkb, seat->button_state);
|
||||
event->button.button = button_nr;
|
||||
|
||||
if (clutter_input_device_get_device_type (input_device) == CLUTTER_TABLET_DEVICE)
|
||||
{
|
||||
ClutterPoint point;
|
||||
|
||||
clutter_input_device_get_coords (input_device, NULL, &point);
|
||||
event->button.x = point.x;
|
||||
event->button.y = point.y;
|
||||
}
|
||||
else
|
||||
{
|
||||
event->button.x = seat->pointer_x;
|
||||
event->button.y = seat->pointer_y;
|
||||
}
|
||||
|
||||
clutter_event_set_device (event, seat->core_pointer);
|
||||
clutter_event_set_source_device (event, input_device);
|
||||
|
||||
if (device_evdev->last_tool)
|
||||
{
|
||||
/* Apply the button event code as per the tool mapping */
|
||||
guint mapped_button;
|
||||
|
||||
mapped_button = clutter_input_device_tool_evdev_get_button_code (device_evdev->last_tool,
|
||||
button_nr);
|
||||
if (mapped_button != 0)
|
||||
button = mapped_button;
|
||||
}
|
||||
|
||||
_clutter_evdev_event_set_event_code (event, button);
|
||||
|
||||
if (clutter_input_device_get_device_type (input_device) == CLUTTER_TABLET_DEVICE)
|
||||
{
|
||||
clutter_event_set_device_tool (event, device_evdev->last_tool);
|
||||
clutter_event_set_device (event, input_device);
|
||||
}
|
||||
else
|
||||
{
|
||||
clutter_event_set_device (event, seat->core_pointer);
|
||||
}
|
||||
|
||||
_clutter_input_device_set_stage (seat->core_pointer, stage);
|
||||
|
||||
queue_event (event);
|
||||
}
|
||||
|
||||
void
|
||||
clutter_seat_evdev_free (ClutterSeatEvdev *seat)
|
||||
{
|
||||
GSList *iter;
|
||||
|
||||
for (iter = seat->devices; iter; iter = g_slist_next (iter))
|
||||
{
|
||||
ClutterInputDevice *device = iter->data;
|
||||
|
||||
g_object_unref (device);
|
||||
}
|
||||
g_slist_free (seat->devices);
|
||||
g_hash_table_unref (seat->touches);
|
||||
|
||||
xkb_state_unref (seat->xkb);
|
||||
|
||||
clutter_seat_evdev_clear_repeat_timer (seat);
|
||||
|
||||
if (seat->libinput_seat)
|
||||
libinput_seat_unref (seat->libinput_seat);
|
||||
|
||||
g_free (seat);
|
||||
}
|
||||
|
||||
void
|
||||
clutter_seat_evdev_set_stage (ClutterSeatEvdev *seat,
|
||||
ClutterStage *stage)
|
||||
{
|
||||
GSList *l;
|
||||
|
||||
_clutter_input_device_set_stage (seat->core_pointer, stage);
|
||||
_clutter_input_device_set_stage (seat->core_keyboard, stage);
|
||||
|
||||
for (l = seat->devices; l; l = l->next)
|
||||
{
|
||||
ClutterInputDevice *device = l->data;
|
||||
|
||||
_clutter_input_device_set_stage (device, stage);
|
||||
}
|
||||
}
|
132
clutter/clutter/evdev/clutter-seat-evdev.h
Normal file
132
clutter/clutter/evdev/clutter-seat-evdev.h
Normal file
@@ -0,0 +1,132 @@
|
||||
/*
|
||||
* Clutter.
|
||||
*
|
||||
* An OpenGL based 'interactive canvas' library.
|
||||
*
|
||||
* Copyright (C) 2010 Intel Corp.
|
||||
* Copyright (C) 2014 Jonas Ådahl
|
||||
* Copyright (C) 2016 Red Hat Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Author: Damien Lespiau <damien.lespiau@intel.com>
|
||||
* Author: Jonas Ådahl <jadahl@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __CLUTTER_SEAT_EVDEV_H__
|
||||
#define __CLUTTER_SEAT_EVDEV_H__
|
||||
|
||||
#include <libinput.h>
|
||||
#include <linux/input.h>
|
||||
|
||||
#include "clutter-input-device.h"
|
||||
#include "clutter-device-manager-evdev.h"
|
||||
#include "clutter-xkb-utils.h"
|
||||
|
||||
typedef struct _ClutterTouchState ClutterTouchState;
|
||||
|
||||
struct _ClutterTouchState
|
||||
{
|
||||
guint32 id;
|
||||
ClutterPoint coords;
|
||||
};
|
||||
|
||||
struct _ClutterSeatEvdev
|
||||
{
|
||||
struct libinput_seat *libinput_seat;
|
||||
ClutterDeviceManagerEvdev *manager_evdev;
|
||||
|
||||
GSList *devices;
|
||||
|
||||
ClutterInputDevice *core_pointer;
|
||||
ClutterInputDevice *core_keyboard;
|
||||
|
||||
GHashTable *touches;
|
||||
|
||||
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;
|
||||
uint32_t button_state;
|
||||
int button_count[KEY_CNT];
|
||||
|
||||
/* keyboard repeat */
|
||||
gboolean repeat;
|
||||
guint32 repeat_delay;
|
||||
guint32 repeat_interval;
|
||||
guint32 repeat_key;
|
||||
guint32 repeat_count;
|
||||
guint32 repeat_timer;
|
||||
ClutterInputDevice *repeat_device;
|
||||
|
||||
gfloat pointer_x;
|
||||
gfloat pointer_y;
|
||||
|
||||
/* Emulation of discrete scroll events out of smooth ones */
|
||||
gfloat accum_scroll_dx;
|
||||
gfloat accum_scroll_dy;
|
||||
};
|
||||
|
||||
void clutter_seat_evdev_notify_key (ClutterSeatEvdev *seat,
|
||||
ClutterInputDevice *device,
|
||||
uint64_t time_us,
|
||||
uint32_t key,
|
||||
uint32_t state,
|
||||
gboolean update_keys);
|
||||
|
||||
void clutter_seat_evdev_notify_relative_motion (ClutterSeatEvdev *seat_evdev,
|
||||
ClutterInputDevice *input_device,
|
||||
uint64_t time_us,
|
||||
float dx,
|
||||
float dy,
|
||||
float dx_unaccel,
|
||||
float dy_unaccel);
|
||||
|
||||
void clutter_seat_evdev_notify_absolute_motion (ClutterSeatEvdev *seat_evdev,
|
||||
ClutterInputDevice *input_device,
|
||||
uint64_t time_us,
|
||||
float x,
|
||||
float y,
|
||||
double *axes);
|
||||
|
||||
void clutter_seat_evdev_notify_button (ClutterSeatEvdev *seat,
|
||||
ClutterInputDevice *input_device,
|
||||
uint64_t time_us,
|
||||
uint32_t button,
|
||||
uint32_t state);
|
||||
|
||||
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);
|
||||
|
||||
void clutter_seat_evdev_remove_touch (ClutterSeatEvdev *seat,
|
||||
guint32 id);
|
||||
|
||||
ClutterTouchState * clutter_seat_evdev_get_touch (ClutterSeatEvdev *seat,
|
||||
guint32 id);
|
||||
|
||||
void clutter_seat_evdev_set_stage (ClutterSeatEvdev *seat,
|
||||
ClutterStage *stage);
|
||||
|
||||
void clutter_seat_evdev_clear_repeat_timer (ClutterSeatEvdev *seat);
|
||||
|
||||
ClutterSeatEvdev * clutter_seat_evdev_new (ClutterDeviceManagerEvdev *manager_evdev);
|
||||
|
||||
void clutter_seat_evdev_free (ClutterSeatEvdev *seat);
|
||||
|
||||
#endif /* __CLUTTER_SEAT_EVDEV_H__ */
|
495
clutter/clutter/evdev/clutter-virtual-input-device-evdev.c
Normal file
495
clutter/clutter/evdev/clutter-virtual-input-device-evdev.c
Normal file
@@ -0,0 +1,495 @@
|
||||
/*
|
||||
* Clutter.
|
||||
*
|
||||
* An OpenGL based 'interactive canvas' library.
|
||||
*
|
||||
* Copyright (C) 2016 Red Hat Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Author: Jonas Ådahl <jadahl@gmail.com>
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "clutter-build-config.h"
|
||||
#endif
|
||||
|
||||
#include <glib-object.h>
|
||||
#include <linux/input.h>
|
||||
|
||||
#include "clutter-private.h"
|
||||
#include "clutter-virtual-input-device.h"
|
||||
#include "evdev/clutter-input-device-evdev.h"
|
||||
#include "evdev/clutter-seat-evdev.h"
|
||||
#include "evdev/clutter-virtual-input-device-evdev.h"
|
||||
|
||||
enum
|
||||
{
|
||||
PROP_0,
|
||||
|
||||
PROP_SEAT,
|
||||
|
||||
PROP_LAST
|
||||
};
|
||||
|
||||
static GParamSpec *obj_props[PROP_LAST];
|
||||
|
||||
struct _ClutterVirtualInputDeviceEvdev
|
||||
{
|
||||
ClutterVirtualInputDevice parent;
|
||||
|
||||
ClutterInputDevice *device;
|
||||
ClutterSeatEvdev *seat;
|
||||
int button_count[KEY_CNT];
|
||||
};
|
||||
|
||||
G_DEFINE_TYPE (ClutterVirtualInputDeviceEvdev,
|
||||
clutter_virtual_input_device_evdev,
|
||||
CLUTTER_TYPE_VIRTUAL_INPUT_DEVICE)
|
||||
|
||||
typedef enum _EvdevButtonType
|
||||
{
|
||||
EVDEV_BUTTON_TYPE_NONE,
|
||||
EVDEV_BUTTON_TYPE_KEY,
|
||||
EVDEV_BUTTON_TYPE_BUTTON,
|
||||
} EvdevButtonType;
|
||||
|
||||
static int
|
||||
update_button_count (ClutterVirtualInputDeviceEvdev *virtual_evdev,
|
||||
uint32_t button,
|
||||
uint32_t state)
|
||||
{
|
||||
if (state)
|
||||
return ++virtual_evdev->button_count[button];
|
||||
else
|
||||
return --virtual_evdev->button_count[button];
|
||||
}
|
||||
|
||||
static EvdevButtonType
|
||||
get_button_type (uint16_t code)
|
||||
{
|
||||
switch (code)
|
||||
{
|
||||
case BTN_TOOL_PEN:
|
||||
case BTN_TOOL_RUBBER:
|
||||
case BTN_TOOL_BRUSH:
|
||||
case BTN_TOOL_PENCIL:
|
||||
case BTN_TOOL_AIRBRUSH:
|
||||
case BTN_TOOL_MOUSE:
|
||||
case BTN_TOOL_LENS:
|
||||
case BTN_TOOL_QUINTTAP:
|
||||
case BTN_TOOL_DOUBLETAP:
|
||||
case BTN_TOOL_TRIPLETAP:
|
||||
case BTN_TOOL_QUADTAP:
|
||||
case BTN_TOOL_FINGER:
|
||||
case BTN_TOUCH:
|
||||
return EVDEV_BUTTON_TYPE_NONE;
|
||||
}
|
||||
|
||||
if (code >= KEY_ESC && code <= KEY_MICMUTE)
|
||||
return EVDEV_BUTTON_TYPE_KEY;
|
||||
if (code >= BTN_MISC && code <= BTN_GEAR_UP)
|
||||
return EVDEV_BUTTON_TYPE_BUTTON;
|
||||
if (code >= KEY_OK && code <= KEY_LIGHTS_TOGGLE)
|
||||
return EVDEV_BUTTON_TYPE_KEY;
|
||||
if (code >= BTN_DPAD_UP && code <= BTN_DPAD_RIGHT)
|
||||
return EVDEV_BUTTON_TYPE_BUTTON;
|
||||
if (code >= KEY_ALS_TOGGLE && code <= KEY_KBDINPUTASSIST_CANCEL)
|
||||
return EVDEV_BUTTON_TYPE_KEY;
|
||||
if (code >= BTN_TRIGGER_HAPPY && code <= BTN_TRIGGER_HAPPY40)
|
||||
return EVDEV_BUTTON_TYPE_BUTTON;
|
||||
return EVDEV_BUTTON_TYPE_NONE;
|
||||
}
|
||||
|
||||
static void
|
||||
release_pressed_buttons (ClutterVirtualInputDevice *virtual_device)
|
||||
{
|
||||
ClutterVirtualInputDeviceEvdev *virtual_evdev =
|
||||
CLUTTER_VIRTUAL_INPUT_DEVICE_EVDEV (virtual_device);
|
||||
int code;
|
||||
uint64_t time_us;
|
||||
|
||||
time_us = g_get_monotonic_time ();
|
||||
|
||||
for (code = 0; code < G_N_ELEMENTS (virtual_evdev->button_count); code++)
|
||||
{
|
||||
if (virtual_evdev->button_count[code] == 0)
|
||||
continue;
|
||||
|
||||
switch (get_button_type (code))
|
||||
{
|
||||
case EVDEV_BUTTON_TYPE_KEY:
|
||||
clutter_virtual_input_device_notify_key (virtual_device,
|
||||
time_us,
|
||||
code,
|
||||
CLUTTER_KEY_STATE_RELEASED);
|
||||
break;
|
||||
case EVDEV_BUTTON_TYPE_BUTTON:
|
||||
clutter_virtual_input_device_notify_button (virtual_device,
|
||||
time_us,
|
||||
code,
|
||||
CLUTTER_BUTTON_STATE_RELEASED);
|
||||
break;
|
||||
case EVDEV_BUTTON_TYPE_NONE:
|
||||
g_assert_not_reached ();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_virtual_input_device_evdev_notify_relative_motion (ClutterVirtualInputDevice *virtual_device,
|
||||
uint64_t time_us,
|
||||
double dx,
|
||||
double dy)
|
||||
{
|
||||
ClutterVirtualInputDeviceEvdev *virtual_evdev =
|
||||
CLUTTER_VIRTUAL_INPUT_DEVICE_EVDEV (virtual_device);
|
||||
|
||||
clutter_seat_evdev_notify_relative_motion (virtual_evdev->seat,
|
||||
virtual_evdev->device,
|
||||
time_us,
|
||||
dx, dy,
|
||||
dx, dy);
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_virtual_input_device_evdev_notify_absolute_motion (ClutterVirtualInputDevice *virtual_device,
|
||||
uint64_t time_us,
|
||||
double x,
|
||||
double y)
|
||||
{
|
||||
ClutterVirtualInputDeviceEvdev *virtual_evdev =
|
||||
CLUTTER_VIRTUAL_INPUT_DEVICE_EVDEV (virtual_device);
|
||||
|
||||
clutter_seat_evdev_notify_absolute_motion (virtual_evdev->seat,
|
||||
virtual_evdev->device,
|
||||
time_us,
|
||||
x, y,
|
||||
NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_virtual_input_device_evdev_notify_button (ClutterVirtualInputDevice *virtual_device,
|
||||
uint64_t time_us,
|
||||
uint32_t button,
|
||||
ClutterButtonState button_state)
|
||||
{
|
||||
ClutterVirtualInputDeviceEvdev *virtual_evdev =
|
||||
CLUTTER_VIRTUAL_INPUT_DEVICE_EVDEV (virtual_device);
|
||||
int button_count;
|
||||
|
||||
if (get_button_type (button) != EVDEV_BUTTON_TYPE_BUTTON)
|
||||
{
|
||||
g_warning ("Unknown/invalid virtual device button 0x%x pressed",
|
||||
button);
|
||||
return;
|
||||
}
|
||||
|
||||
button_count = update_button_count (virtual_evdev, button, button_state);
|
||||
if (button_count < 0 || button_count > 1)
|
||||
{
|
||||
g_warning ("Received multiple virtual 0x%x button %s (ignoring)", button,
|
||||
button_state == CLUTTER_BUTTON_STATE_PRESSED ? "presses" : "releases");
|
||||
update_button_count (virtual_evdev, button, 1 - button_state);
|
||||
return;
|
||||
}
|
||||
|
||||
clutter_seat_evdev_notify_button (virtual_evdev->seat,
|
||||
virtual_evdev->device,
|
||||
time_us,
|
||||
button,
|
||||
button_state);
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_virtual_input_device_evdev_notify_key (ClutterVirtualInputDevice *virtual_device,
|
||||
uint64_t time_us,
|
||||
uint32_t key,
|
||||
ClutterKeyState key_state)
|
||||
{
|
||||
ClutterVirtualInputDeviceEvdev *virtual_evdev =
|
||||
CLUTTER_VIRTUAL_INPUT_DEVICE_EVDEV (virtual_device);
|
||||
int key_count;
|
||||
|
||||
if (get_button_type (key) != EVDEV_BUTTON_TYPE_KEY)
|
||||
{
|
||||
g_warning ("Unknown/invalid virtual device key 0x%x pressed\n", key);
|
||||
return;
|
||||
}
|
||||
|
||||
key_count = update_button_count (virtual_evdev, key, key_state);
|
||||
if (key_count < 0 || key_count > 1)
|
||||
{
|
||||
g_warning ("Received multiple virtual 0x%x key %s (ignoring)", key,
|
||||
key_state == CLUTTER_KEY_STATE_PRESSED ? "presses" : "releases");
|
||||
update_button_count (virtual_evdev, key, 1 - key_state);
|
||||
return;
|
||||
}
|
||||
|
||||
clutter_seat_evdev_notify_key (virtual_evdev->seat,
|
||||
virtual_evdev->device,
|
||||
time_us,
|
||||
key,
|
||||
key_state,
|
||||
TRUE);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
pick_keycode_for_keyval_in_current_group (ClutterVirtualInputDevice *virtual_device,
|
||||
guint keyval,
|
||||
guint *keycode_out,
|
||||
guint *level_out)
|
||||
{
|
||||
ClutterVirtualInputDeviceEvdev *virtual_evdev =
|
||||
CLUTTER_VIRTUAL_INPUT_DEVICE_EVDEV (virtual_device);
|
||||
ClutterDeviceManager *manager;
|
||||
struct xkb_keymap *xkb_keymap;
|
||||
struct xkb_state *state;
|
||||
guint keycode, layout;
|
||||
xkb_keycode_t min_keycode, max_keycode;
|
||||
|
||||
manager = clutter_virtual_input_device_get_manager (virtual_device);
|
||||
xkb_keymap = _clutter_device_manager_evdev_get_keymap (CLUTTER_DEVICE_MANAGER_EVDEV (manager));
|
||||
state = virtual_evdev->seat->xkb;
|
||||
|
||||
layout = xkb_state_serialize_layout (state, XKB_STATE_LAYOUT_EFFECTIVE);
|
||||
min_keycode = xkb_keymap_min_keycode (xkb_keymap);
|
||||
max_keycode = xkb_keymap_max_keycode (xkb_keymap);
|
||||
for (keycode = min_keycode; keycode < max_keycode; keycode++)
|
||||
{
|
||||
gint num_levels, level;
|
||||
num_levels = xkb_keymap_num_levels_for_key (xkb_keymap, keycode, layout);
|
||||
for (level = 0; level < num_levels; level++)
|
||||
{
|
||||
const xkb_keysym_t *syms;
|
||||
gint num_syms, sym;
|
||||
num_syms = xkb_keymap_key_get_syms_by_level (xkb_keymap, keycode, layout, level, &syms);
|
||||
for (sym = 0; sym < num_syms; sym++)
|
||||
{
|
||||
if (syms[sym] == keyval)
|
||||
{
|
||||
*keycode_out = keycode;
|
||||
if (level_out)
|
||||
*level_out = level;
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
apply_level_modifiers (ClutterVirtualInputDevice *virtual_device,
|
||||
uint64_t time_us,
|
||||
uint32_t level,
|
||||
uint32_t key_state)
|
||||
{
|
||||
ClutterVirtualInputDeviceEvdev *virtual_evdev =
|
||||
CLUTTER_VIRTUAL_INPUT_DEVICE_EVDEV (virtual_device);
|
||||
guint keysym, keycode, evcode;
|
||||
|
||||
if (level == 0)
|
||||
return;
|
||||
|
||||
if (level == 1)
|
||||
{
|
||||
keysym = XKB_KEY_Shift_L;
|
||||
}
|
||||
else if (level == 2)
|
||||
{
|
||||
keysym = XKB_KEY_ISO_Level3_Shift;
|
||||
}
|
||||
else
|
||||
{
|
||||
g_warning ("Unhandled level: %d\n", level);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!pick_keycode_for_keyval_in_current_group (virtual_device, keysym,
|
||||
&keycode, NULL))
|
||||
return;
|
||||
|
||||
clutter_input_device_keycode_to_evdev (virtual_evdev->device,
|
||||
keycode, &evcode);
|
||||
clutter_seat_evdev_notify_key (virtual_evdev->seat,
|
||||
virtual_evdev->device,
|
||||
time_us,
|
||||
evcode,
|
||||
key_state,
|
||||
TRUE);
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_virtual_input_device_evdev_notify_keyval (ClutterVirtualInputDevice *virtual_device,
|
||||
uint64_t time_us,
|
||||
uint32_t keyval,
|
||||
ClutterKeyState key_state)
|
||||
{
|
||||
ClutterVirtualInputDeviceEvdev *virtual_evdev =
|
||||
CLUTTER_VIRTUAL_INPUT_DEVICE_EVDEV (virtual_device);
|
||||
int key_count;
|
||||
guint keycode = 0, level = 0, evcode = 0;
|
||||
|
||||
if (!pick_keycode_for_keyval_in_current_group (virtual_device,
|
||||
keyval, &keycode, &level))
|
||||
{
|
||||
g_warning ("No keycode found for keyval %x in current group", keyval);
|
||||
return;
|
||||
}
|
||||
|
||||
clutter_input_device_keycode_to_evdev (virtual_evdev->device,
|
||||
keycode, &evcode);
|
||||
|
||||
if (get_button_type (evcode) != EVDEV_BUTTON_TYPE_KEY)
|
||||
{
|
||||
g_warning ("Unknown/invalid virtual device key 0x%x pressed\n", evcode);
|
||||
return;
|
||||
}
|
||||
|
||||
key_count = update_button_count (virtual_evdev, evcode, key_state);
|
||||
if (key_count < 0 || key_count > 1)
|
||||
{
|
||||
g_warning ("Received multiple virtual 0x%x key %s (ignoring)", keycode,
|
||||
key_state == CLUTTER_KEY_STATE_PRESSED ? "presses" : "releases");
|
||||
update_button_count (virtual_evdev, evcode, 1 - key_state);
|
||||
return;
|
||||
}
|
||||
|
||||
if (key_state)
|
||||
apply_level_modifiers (virtual_device, time_us, level, key_state);
|
||||
|
||||
clutter_seat_evdev_notify_key (virtual_evdev->seat,
|
||||
virtual_evdev->device,
|
||||
time_us,
|
||||
evcode,
|
||||
key_state,
|
||||
TRUE);
|
||||
|
||||
if (!key_state)
|
||||
apply_level_modifiers (virtual_device, time_us, level, key_state);
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_virtual_input_device_evdev_get_property (GObject *object,
|
||||
guint prop_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
ClutterVirtualInputDeviceEvdev *virtual_evdev =
|
||||
CLUTTER_VIRTUAL_INPUT_DEVICE_EVDEV (object);
|
||||
|
||||
switch (prop_id)
|
||||
{
|
||||
case PROP_SEAT:
|
||||
g_value_set_pointer (value, virtual_evdev->seat);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_virtual_input_device_evdev_set_property (GObject *object,
|
||||
guint prop_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
ClutterVirtualInputDeviceEvdev *virtual_evdev =
|
||||
CLUTTER_VIRTUAL_INPUT_DEVICE_EVDEV (object);
|
||||
|
||||
switch (prop_id)
|
||||
{
|
||||
case PROP_SEAT:
|
||||
virtual_evdev->seat = g_value_get_pointer (value);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_virtual_input_device_evdev_constructed (GObject *object)
|
||||
{
|
||||
ClutterVirtualInputDevice *virtual_device =
|
||||
CLUTTER_VIRTUAL_INPUT_DEVICE (object);
|
||||
ClutterVirtualInputDeviceEvdev *virtual_evdev =
|
||||
CLUTTER_VIRTUAL_INPUT_DEVICE_EVDEV (object);
|
||||
ClutterDeviceManager *manager;
|
||||
ClutterInputDeviceType device_type;
|
||||
ClutterStage *stage;
|
||||
|
||||
manager = clutter_virtual_input_device_get_manager (virtual_device);
|
||||
device_type = clutter_virtual_input_device_get_device_type (virtual_device);
|
||||
|
||||
virtual_evdev->device =
|
||||
_clutter_input_device_evdev_new_virtual (manager,
|
||||
virtual_evdev->seat,
|
||||
device_type,
|
||||
CLUTTER_INPUT_MODE_SLAVE);
|
||||
|
||||
stage = _clutter_device_manager_evdev_get_stage (CLUTTER_DEVICE_MANAGER_EVDEV (manager));
|
||||
_clutter_input_device_set_stage (virtual_evdev->device, stage);
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_virtual_input_device_evdev_finalize (GObject *object)
|
||||
{
|
||||
ClutterVirtualInputDevice *virtual_device =
|
||||
CLUTTER_VIRTUAL_INPUT_DEVICE (object);
|
||||
ClutterVirtualInputDeviceEvdev *virtual_evdev =
|
||||
CLUTTER_VIRTUAL_INPUT_DEVICE_EVDEV (object);
|
||||
GObjectClass *object_class;
|
||||
|
||||
release_pressed_buttons (virtual_device);
|
||||
g_clear_object (&virtual_evdev->device);
|
||||
|
||||
object_class =
|
||||
G_OBJECT_CLASS (clutter_virtual_input_device_evdev_parent_class);
|
||||
object_class->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_virtual_input_device_evdev_init (ClutterVirtualInputDeviceEvdev *virtual_device_evdev)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_virtual_input_device_evdev_class_init (ClutterVirtualInputDeviceEvdevClass *klass)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
ClutterVirtualInputDeviceClass *virtual_input_device_class =
|
||||
CLUTTER_VIRTUAL_INPUT_DEVICE_CLASS (klass);
|
||||
|
||||
object_class->get_property = clutter_virtual_input_device_evdev_get_property;
|
||||
object_class->set_property = clutter_virtual_input_device_evdev_set_property;
|
||||
object_class->constructed = clutter_virtual_input_device_evdev_constructed;
|
||||
object_class->finalize = clutter_virtual_input_device_evdev_finalize;
|
||||
|
||||
virtual_input_device_class->notify_relative_motion = clutter_virtual_input_device_evdev_notify_relative_motion;
|
||||
virtual_input_device_class->notify_absolute_motion = clutter_virtual_input_device_evdev_notify_absolute_motion;
|
||||
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;
|
||||
|
||||
obj_props[PROP_SEAT] = g_param_spec_pointer ("seat",
|
||||
P_("ClutterSeatEvdev"),
|
||||
P_("ClutterSeatEvdev"),
|
||||
CLUTTER_PARAM_READWRITE |
|
||||
G_PARAM_CONSTRUCT_ONLY);
|
||||
g_object_class_install_properties (object_class, PROP_LAST, obj_props);
|
||||
}
|
35
clutter/clutter/evdev/clutter-virtual-input-device-evdev.h
Normal file
35
clutter/clutter/evdev/clutter-virtual-input-device-evdev.h
Normal file
@@ -0,0 +1,35 @@
|
||||
/*
|
||||
* Clutter.
|
||||
*
|
||||
* An OpenGL based 'interactive canvas' library.
|
||||
*
|
||||
* Copyright (C) 2016 Red Hat Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Author: Jonas Ådahl <jadahl@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __CLUTTER_VIRTUAL_INPUT_DEVICE_EVDEV_H__
|
||||
#define __CLUTTER_VIRTUAL_INPUT_DEVICE_EVDEV_H__
|
||||
|
||||
#include "clutter-virtual-input-device.h"
|
||||
|
||||
#define CLUTTER_TYPE_VIRTUAL_INPUT_DEVICE_EVDEV (clutter_virtual_input_device_evdev_get_type ())
|
||||
G_DECLARE_FINAL_TYPE (ClutterVirtualInputDeviceEvdev,
|
||||
clutter_virtual_input_device_evdev,
|
||||
CLUTTER, VIRTUAL_INPUT_DEVICE_EVDEV,
|
||||
ClutterVirtualInputDevice)
|
||||
|
||||
#endif /* __CLUTTER_VIRTUAL_INPUT_DEVICE_EVDEV_H__ */
|
@@ -28,6 +28,7 @@
|
||||
#include "clutter-backend-x11.h"
|
||||
#include "clutter-input-device-core-x11.h"
|
||||
#include "clutter-stage-x11.h"
|
||||
#include "clutter-virtual-input-device-x11.h"
|
||||
|
||||
#include "clutter-backend.h"
|
||||
#include "clutter-debug.h"
|
||||
@@ -480,6 +481,13 @@ clutter_device_manager_x11_get_device (ClutterDeviceManager *manager,
|
||||
GINT_TO_POINTER (id));
|
||||
}
|
||||
|
||||
static ClutterVirtualInputDevice *
|
||||
clutter_device_manager_x11_create_virtual_device (ClutterDeviceManager *device_manager,
|
||||
ClutterInputDeviceType device_type)
|
||||
{
|
||||
return g_object_new (CLUTTER_TYPE_VIRTUAL_INPUT_DEVICE_X11, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_device_manager_x11_set_property (GObject *gobject,
|
||||
guint prop_id,
|
||||
@@ -526,6 +534,7 @@ clutter_device_manager_x11_class_init (ClutterDeviceManagerX11Class *klass)
|
||||
manager_class->get_devices = clutter_device_manager_x11_get_devices;
|
||||
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;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@@ -29,6 +29,8 @@
|
||||
|
||||
#include "clutter-backend-x11.h"
|
||||
#include "clutter-input-device-xi2.h"
|
||||
#include "clutter-input-device-tool-xi2.h"
|
||||
#include "clutter-virtual-input-device-x11.h"
|
||||
#include "clutter-stage-x11.h"
|
||||
|
||||
#include "clutter-backend.h"
|
||||
@@ -321,6 +323,42 @@ get_device_ids (ClutterBackendX11 *backend_x11,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gchar *
|
||||
get_device_node_path (ClutterBackendX11 *backend_x11,
|
||||
XIDeviceInfo *info)
|
||||
{
|
||||
gulong nitems, bytes_after;
|
||||
guchar *data;
|
||||
int rc, format;
|
||||
Atom prop, type;
|
||||
gchar *node_path;
|
||||
|
||||
prop = XInternAtom (backend_x11->xdpy, "Device Node", False);
|
||||
if (prop == None)
|
||||
return NULL;
|
||||
|
||||
clutter_x11_trap_x_errors ();
|
||||
|
||||
rc = XIGetProperty (backend_x11->xdpy,
|
||||
info->deviceid, prop, 0, 1024, False,
|
||||
XA_STRING, &type, &format, &nitems, &bytes_after,
|
||||
(guchar **) &data);
|
||||
|
||||
if (clutter_x11_untrap_x_errors ())
|
||||
return NULL;
|
||||
|
||||
if (rc != Success || type != XA_STRING || format != 8)
|
||||
{
|
||||
XFree (data);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
node_path = g_strdup ((char *) data);
|
||||
XFree (data);
|
||||
|
||||
return node_path;
|
||||
}
|
||||
|
||||
static ClutterInputDevice *
|
||||
create_device (ClutterDeviceManagerXI2 *manager_xi2,
|
||||
ClutterBackendX11 *backend_x11,
|
||||
@@ -331,7 +369,7 @@ create_device (ClutterDeviceManagerXI2 *manager_xi2,
|
||||
ClutterInputMode mode;
|
||||
gboolean is_enabled;
|
||||
guint num_touches = 0;
|
||||
gchar *vendor_id = NULL, *product_id = NULL;
|
||||
gchar *vendor_id = NULL, *product_id = NULL, *node_path = NULL;
|
||||
|
||||
if (info->use == XIMasterKeyboard || info->use == XISlaveKeyboard)
|
||||
{
|
||||
@@ -358,6 +396,8 @@ create_device (ClutterDeviceManagerXI2 *manager_xi2,
|
||||
source = CLUTTER_ERASER_DEVICE;
|
||||
else if (strstr (name, "cursor") != NULL)
|
||||
source = CLUTTER_CURSOR_DEVICE;
|
||||
else if (strstr (name, " pad") != NULL)
|
||||
source = CLUTTER_PAD_DEVICE;
|
||||
else if (strstr (name, "wacom") != NULL || strstr (name, "pen") != NULL)
|
||||
source = CLUTTER_PEN_DEVICE;
|
||||
else if (strstr (name, "touchpad") != NULL)
|
||||
@@ -391,7 +431,10 @@ create_device (ClutterDeviceManagerXI2 *manager_xi2,
|
||||
|
||||
if (info->use != XIMasterKeyboard &&
|
||||
info->use != XIMasterPointer)
|
||||
get_device_ids (backend_x11, info, &vendor_id, &product_id);
|
||||
{
|
||||
get_device_ids (backend_x11, info, &vendor_id, &product_id);
|
||||
node_path = get_device_node_path (backend_x11, info);
|
||||
}
|
||||
|
||||
retval = g_object_new (CLUTTER_TYPE_INPUT_DEVICE_XI2,
|
||||
"name", info->name,
|
||||
@@ -404,6 +447,7 @@ create_device (ClutterDeviceManagerXI2 *manager_xi2,
|
||||
"enabled", is_enabled,
|
||||
"vendor-id", vendor_id,
|
||||
"product-id", product_id,
|
||||
"device-node", node_path,
|
||||
NULL);
|
||||
|
||||
translate_device_classes (backend_x11->xdpy, retval,
|
||||
@@ -420,6 +464,46 @@ create_device (ClutterDeviceManagerXI2 *manager_xi2,
|
||||
return retval;
|
||||
}
|
||||
|
||||
static void
|
||||
pad_passive_button_grab (ClutterInputDevice *device)
|
||||
{
|
||||
XIGrabModifiers xi_grab_mods = { XIAnyModifier, };
|
||||
XIEventMask xi_event_mask;
|
||||
gint device_id, rc;
|
||||
|
||||
device_id = clutter_input_device_get_device_id (device);
|
||||
|
||||
xi_event_mask.deviceid = device_id;
|
||||
xi_event_mask.mask_len = XIMaskLen (XI_LASTEVENT);
|
||||
xi_event_mask.mask = g_new0 (unsigned char, xi_event_mask.mask_len);
|
||||
|
||||
XISetMask (xi_event_mask.mask, XI_Motion);
|
||||
XISetMask (xi_event_mask.mask, XI_ButtonPress);
|
||||
XISetMask (xi_event_mask.mask, XI_ButtonRelease);
|
||||
|
||||
clutter_x11_trap_x_errors ();
|
||||
rc = XIGrabButton (clutter_x11_get_default_display (),
|
||||
device_id, XIAnyButton,
|
||||
clutter_x11_get_root_window (), None,
|
||||
XIGrabModeSync, XIGrabModeSync,
|
||||
True, &xi_event_mask, 1, &xi_grab_mods);
|
||||
if (rc != 0)
|
||||
{
|
||||
g_warning ("Could not passively grab pad device: %s",
|
||||
clutter_input_device_get_device_name (device));
|
||||
}
|
||||
else
|
||||
{
|
||||
XIAllowEvents (clutter_x11_get_default_display (),
|
||||
device_id, XIAsyncDevice,
|
||||
CLUTTER_CURRENT_TIME);
|
||||
}
|
||||
|
||||
clutter_x11_untrap_x_errors ();
|
||||
|
||||
g_free (xi_event_mask.mask);
|
||||
}
|
||||
|
||||
static ClutterInputDevice *
|
||||
add_device (ClutterDeviceManagerXI2 *manager_xi2,
|
||||
ClutterBackendX11 *backend_x11,
|
||||
@@ -454,6 +538,9 @@ add_device (ClutterDeviceManagerXI2 *manager_xi2,
|
||||
g_warning ("Unhandled device: %s",
|
||||
clutter_input_device_get_device_name (device));
|
||||
|
||||
if (clutter_input_device_get_device_type (device) == CLUTTER_PAD_DEVICE)
|
||||
pad_passive_button_grab (device);
|
||||
|
||||
/* relationships between devices and signal emissions are not
|
||||
* necessary while we're constructing the device manager instance
|
||||
*/
|
||||
@@ -866,6 +953,78 @@ clutter_device_manager_xi2_select_stage_events (ClutterDeviceManager *manager,
|
||||
g_free (mask);
|
||||
}
|
||||
|
||||
static guint
|
||||
device_get_tool_serial (ClutterBackendX11 *backend_x11,
|
||||
ClutterInputDevice *device)
|
||||
{
|
||||
gulong nitems, bytes_after;
|
||||
guint32 *data = NULL;
|
||||
guint serial_id = 0;
|
||||
int rc, format;
|
||||
Atom type;
|
||||
Atom prop;
|
||||
|
||||
prop = XInternAtom (backend_x11->xdpy, "Wacom Serial IDs", True);
|
||||
if (prop == None)
|
||||
return 0;
|
||||
|
||||
clutter_x11_trap_x_errors ();
|
||||
rc = XIGetProperty (backend_x11->xdpy,
|
||||
clutter_input_device_get_device_id (device),
|
||||
prop, 0, 4, FALSE, XA_INTEGER, &type, &format, &nitems, &bytes_after,
|
||||
(guchar **) &data);
|
||||
clutter_x11_untrap_x_errors ();
|
||||
|
||||
if (rc == Success && type == XA_INTEGER && format == 32 && nitems >= 4)
|
||||
serial_id = data[3];
|
||||
|
||||
XFree (data);
|
||||
|
||||
return serial_id;
|
||||
}
|
||||
|
||||
static void
|
||||
handle_property_event (ClutterDeviceManagerXI2 *manager_xi2,
|
||||
XIEvent *event)
|
||||
{
|
||||
XIPropertyEvent *xev = (XIPropertyEvent *) event;
|
||||
ClutterBackendX11 *backend_x11 = CLUTTER_BACKEND_X11 (clutter_get_default_backend ());
|
||||
Atom serial_ids_prop = XInternAtom (backend_x11->xdpy, "Wacom Serial IDs", True);
|
||||
ClutterInputDevice *device;
|
||||
|
||||
device = g_hash_table_lookup (manager_xi2->devices_by_id,
|
||||
GINT_TO_POINTER (xev->deviceid));
|
||||
if (!device)
|
||||
return;
|
||||
|
||||
if (xev->property == serial_ids_prop)
|
||||
{
|
||||
ClutterInputDeviceTool *tool = NULL;
|
||||
ClutterInputDeviceToolType type;
|
||||
guint serial_id;
|
||||
|
||||
serial_id = device_get_tool_serial (backend_x11, device);
|
||||
|
||||
if (serial_id != 0)
|
||||
{
|
||||
tool = g_hash_table_lookup (manager_xi2->tools_by_serial,
|
||||
GUINT_TO_POINTER (serial_id));
|
||||
if (!tool)
|
||||
{
|
||||
type = clutter_input_device_get_device_type (device) == CLUTTER_ERASER_DEVICE ?
|
||||
CLUTTER_INPUT_DEVICE_TOOL_ERASER : CLUTTER_INPUT_DEVICE_TOOL_PEN;
|
||||
tool = clutter_input_device_tool_xi2_new (serial_id, type);
|
||||
g_hash_table_insert (manager_xi2->tools_by_serial,
|
||||
GUINT_TO_POINTER (serial_id),
|
||||
tool);
|
||||
}
|
||||
}
|
||||
|
||||
clutter_input_device_xi2_update_tool (device, tool);
|
||||
g_signal_emit_by_name (manager_xi2, "tool-changed", device, tool);
|
||||
}
|
||||
}
|
||||
|
||||
static ClutterTranslateReturn
|
||||
clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
|
||||
gpointer native,
|
||||
@@ -897,7 +1056,8 @@ clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
|
||||
return CLUTTER_TRANSLATE_REMOVE;
|
||||
|
||||
if (!(xi_event->evtype == XI_HierarchyChanged ||
|
||||
xi_event->evtype == XI_DeviceChanged))
|
||||
xi_event->evtype == XI_DeviceChanged ||
|
||||
xi_event->evtype == XI_PropertyEvent))
|
||||
{
|
||||
stage = get_event_stage (translator, xi_event);
|
||||
if (stage == NULL || CLUTTER_ACTOR_IN_DESTRUCTION (stage))
|
||||
@@ -1038,6 +1198,50 @@ clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
|
||||
stage != NULL)
|
||||
_clutter_input_device_set_stage (device, stage);
|
||||
|
||||
if (clutter_input_device_get_device_type (source_device) == CLUTTER_PAD_DEVICE)
|
||||
{
|
||||
/* We got these events because of the passive button grab */
|
||||
XIAllowEvents (clutter_x11_get_default_display (),
|
||||
xev->sourceid,
|
||||
XIAsyncDevice,
|
||||
xev->time);
|
||||
|
||||
/* Ignore 4-7 buttons */
|
||||
if (xev->detail >= 4 && xev->detail <= 7)
|
||||
return CLUTTER_TRANSLATE_REMOVE;
|
||||
|
||||
event->pad_button.type =
|
||||
(xi_event->evtype == XI_ButtonPress) ? CLUTTER_PAD_BUTTON_PRESS
|
||||
: CLUTTER_PAD_BUTTON_RELEASE;
|
||||
event->pad_button.time = xev->time;
|
||||
event->pad_button.stage = stage;
|
||||
|
||||
/* The 4-7 button range is taken as non-existent on pad devices,
|
||||
* let the buttons above that take over this range.
|
||||
*/
|
||||
if (xev->detail > 7)
|
||||
xev->detail -= 4;
|
||||
|
||||
/* Pad buttons are 0-indexed */
|
||||
event->pad_button.button = xev->detail - 1;
|
||||
clutter_event_set_source_device (event, source_device);
|
||||
|
||||
CLUTTER_NOTE (EVENT,
|
||||
"%s: win:0x%x, device:%d '%s', time:%d "
|
||||
"(button:%d)",
|
||||
event->any.type == CLUTTER_BUTTON_PRESS
|
||||
? "pad button press "
|
||||
: "pad button release",
|
||||
(unsigned int) stage_x11->xwin,
|
||||
device->id,
|
||||
device->device_name,
|
||||
event->any.time,
|
||||
event->pad_button.button);
|
||||
|
||||
retval = CLUTTER_TRANSLATE_QUEUE;
|
||||
break;
|
||||
}
|
||||
|
||||
switch (xev->detail)
|
||||
{
|
||||
case 4:
|
||||
@@ -1117,6 +1321,8 @@ clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
|
||||
|
||||
clutter_event_set_source_device (event, source_device);
|
||||
clutter_event_set_device (event, device);
|
||||
clutter_event_set_device_tool (event,
|
||||
clutter_input_device_xi2_get_current_tool (source_device));
|
||||
|
||||
event->button.axes = translate_axes (event->button.device,
|
||||
event->button.x,
|
||||
@@ -1225,6 +1431,8 @@ clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
|
||||
|
||||
clutter_event_set_source_device (event, source_device);
|
||||
clutter_event_set_device (event, device);
|
||||
clutter_event_set_device_tool (event,
|
||||
clutter_input_device_xi2_get_current_tool (source_device));
|
||||
|
||||
event->motion.axes = translate_axes (event->motion.device,
|
||||
event->motion.x,
|
||||
@@ -1426,6 +1634,10 @@ clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
|
||||
case XI_FocusOut:
|
||||
retval = CLUTTER_TRANSLATE_CONTINUE;
|
||||
break;
|
||||
case XI_PropertyEvent:
|
||||
handle_property_event (manager_xi2, xi_event);
|
||||
retval = CLUTTER_TRANSLATE_CONTINUE;
|
||||
break;
|
||||
}
|
||||
|
||||
return retval;
|
||||
@@ -1603,6 +1815,7 @@ clutter_device_manager_xi2_constructed (GObject *gobject)
|
||||
|
||||
XISetMask (mask, XI_HierarchyChanged);
|
||||
XISetMask (mask, XI_DeviceChanged);
|
||||
XISetMask (mask, XI_PropertyEvent);
|
||||
|
||||
event_mask.deviceid = XIAllDevices;
|
||||
event_mask.mask_len = sizeof (mask);
|
||||
@@ -1638,6 +1851,16 @@ clutter_device_manager_xi2_set_property (GObject *gobject,
|
||||
}
|
||||
}
|
||||
|
||||
static ClutterVirtualInputDevice *
|
||||
clutter_device_manager_xi2_create_virtual_device (ClutterDeviceManager *manager,
|
||||
ClutterInputDeviceType device_type)
|
||||
{
|
||||
return g_object_new (CLUTTER_TYPE_VIRTUAL_INPUT_DEVICE_X11,
|
||||
"device-manager", manager,
|
||||
"device-type", device_type,
|
||||
NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_device_manager_xi2_class_init (ClutterDeviceManagerXI2Class *klass)
|
||||
{
|
||||
@@ -1665,6 +1888,7 @@ clutter_device_manager_xi2_class_init (ClutterDeviceManagerXI2Class *klass)
|
||||
manager_class->get_core_device = clutter_device_manager_xi2_get_core_device;
|
||||
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;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1673,4 +1897,6 @@ clutter_device_manager_xi2_init (ClutterDeviceManagerXI2 *self)
|
||||
self->devices_by_id = g_hash_table_new_full (NULL, NULL,
|
||||
NULL,
|
||||
(GDestroyNotify) g_object_unref);
|
||||
self->tools_by_serial = g_hash_table_new_full (NULL, NULL, NULL,
|
||||
(GDestroyNotify) g_object_unref);
|
||||
}
|
||||
|
@@ -43,6 +43,7 @@ struct _ClutterDeviceManagerXI2
|
||||
ClutterDeviceManager parent_instance;
|
||||
|
||||
GHashTable *devices_by_id;
|
||||
GHashTable *tools_by_serial;
|
||||
|
||||
GSList *all_devices;
|
||||
|
||||
|
51
clutter/clutter/x11/clutter-input-device-tool-xi2.c
Normal file
51
clutter/clutter/x11/clutter-input-device-tool-xi2.c
Normal file
@@ -0,0 +1,51 @@
|
||||
/*
|
||||
* Clutter.
|
||||
*
|
||||
* An OpenGL based 'interactive canvas' library.
|
||||
*
|
||||
* Copyright © 2016 Red Hat
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Author: Carlos Garnacho <carlosg@gnome.org>
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "clutter-build-config.h"
|
||||
#endif
|
||||
|
||||
#include "clutter-input-device-tool-xi2.h"
|
||||
|
||||
G_DEFINE_TYPE (ClutterInputDeviceToolXI2, clutter_input_device_tool_xi2,
|
||||
CLUTTER_TYPE_INPUT_DEVICE_TOOL)
|
||||
|
||||
static void
|
||||
clutter_input_device_tool_xi2_class_init (ClutterInputDeviceToolXI2Class *klass)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_input_device_tool_xi2_init (ClutterInputDeviceToolXI2 *tool)
|
||||
{
|
||||
}
|
||||
|
||||
ClutterInputDeviceTool *
|
||||
clutter_input_device_tool_xi2_new (guint serial,
|
||||
ClutterInputDeviceToolType type)
|
||||
{
|
||||
return g_object_new (CLUTTER_TYPE_INPUT_DEVICE_TOOL_XI2,
|
||||
"type", type,
|
||||
"serial", serial,
|
||||
NULL);
|
||||
}
|
74
clutter/clutter/x11/clutter-input-device-tool-xi2.h
Normal file
74
clutter/clutter/x11/clutter-input-device-tool-xi2.h
Normal file
@@ -0,0 +1,74 @@
|
||||
/*
|
||||
* Clutter.
|
||||
*
|
||||
* An OpenGL based 'interactive canvas' library.
|
||||
*
|
||||
* Copyright © 2016 Red Hat
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Author: Carlos Garnacho <carlosg@gnome.org>
|
||||
*/
|
||||
|
||||
#ifndef __CLUTTER_INPUT_DEVICE_XI2_TOOL_H__
|
||||
#define __CLUTTER_INPUT_DEVICE_XI2_TOOL_H__
|
||||
|
||||
#include <clutter/clutter-input-device-tool.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define CLUTTER_TYPE_INPUT_DEVICE_TOOL_XI2 (clutter_input_device_tool_xi2_get_type ())
|
||||
|
||||
#define CLUTTER_INPUT_DEVICE_TOOL_XI2(o) \
|
||||
(G_TYPE_CHECK_INSTANCE_CAST ((o), \
|
||||
CLUTTER_TYPE_INPUT_DEVICE_TOOL_XI2, ClutterInputDeviceToolXI2))
|
||||
|
||||
#define CLUTTER_IS_INPUT_DEVICE_TOOL_XI2(o) \
|
||||
(G_TYPE_CHECK_INSTANCE_TYPE ((o), \
|
||||
CLUTTER_TYPE_INPUT_DEVICE_TOOL_XI2))
|
||||
|
||||
#define CLUTTER_INPUT_DEVICE_TOOL_XI2_CLASS(c) \
|
||||
(G_TYPE_CHECK_CLASS_CAST ((c), \
|
||||
CLUTTER_TYPE_INPUT_DEVICE_TOOL_XI2, ClutterInputDeviceToolXI2Class))
|
||||
|
||||
#define CLUTTER_IS_INPUT_DEVICE_TOOL_XI2_CLASS(c) \
|
||||
(G_TYPE_CHECK_CLASS_TYPE ((c), \
|
||||
CLUTTER_TYPE_INPUT_DEVICE_TOOL_XI2))
|
||||
|
||||
#define CLUTTER_INPUT_DEVICE_TOOL_XI2_GET_CLASS(o) \
|
||||
(G_TYPE_INSTANCE_GET_CLASS ((o), \
|
||||
CLUTTER_TYPE_INPUT_DEVICE_TOOL_XI2, ClutterInputDeviceToolXI2Class))
|
||||
|
||||
typedef struct _ClutterInputDeviceToolXI2 ClutterInputDeviceToolXI2;
|
||||
typedef struct _ClutterInputDeviceToolXI2Class ClutterInputDeviceToolXI2Class;
|
||||
|
||||
struct _ClutterInputDeviceToolXI2
|
||||
{
|
||||
ClutterInputDeviceTool parent_instance;
|
||||
struct libinput_tablet_tool *tool;
|
||||
};
|
||||
|
||||
struct _ClutterInputDeviceToolXI2Class
|
||||
{
|
||||
ClutterInputDeviceToolClass parent_class;
|
||||
};
|
||||
|
||||
GType clutter_input_device_tool_xi2_get_type (void) G_GNUC_CONST;
|
||||
|
||||
ClutterInputDeviceTool * clutter_input_device_tool_xi2_new (guint serial,
|
||||
ClutterInputDeviceToolType type);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __CLUTTER_INPUT_DEVICE_XI2_TOOL_H__ */
|
@@ -44,6 +44,7 @@ struct _ClutterInputDeviceXI2
|
||||
ClutterInputDevice device;
|
||||
|
||||
gint device_id;
|
||||
ClutterInputDeviceTool *current_tool;
|
||||
};
|
||||
|
||||
#define N_BUTTONS 5
|
||||
@@ -172,3 +173,18 @@ _clutter_input_device_xi2_translate_state (ClutterEvent *event,
|
||||
|
||||
_clutter_event_set_state_full (event, button, base, latched, locked, effective);
|
||||
}
|
||||
|
||||
void
|
||||
clutter_input_device_xi2_update_tool (ClutterInputDevice *device,
|
||||
ClutterInputDeviceTool *tool)
|
||||
{
|
||||
ClutterInputDeviceXI2 *device_xi2 = CLUTTER_INPUT_DEVICE_XI2 (device);
|
||||
g_set_object (&device_xi2->current_tool, tool);
|
||||
}
|
||||
|
||||
ClutterInputDeviceTool *
|
||||
clutter_input_device_xi2_get_current_tool (ClutterInputDevice *device)
|
||||
{
|
||||
ClutterInputDeviceXI2 *device_xi2 = CLUTTER_INPUT_DEVICE_XI2 (device);
|
||||
return device_xi2->current_tool;
|
||||
}
|
||||
|
@@ -41,6 +41,9 @@ void _clutter_input_device_xi2_translate_state (ClutterEvent *event,
|
||||
XIModifierState *modifiers_state,
|
||||
XIButtonState *buttons_state,
|
||||
XIGroupState *group_state);
|
||||
void clutter_input_device_xi2_update_tool (ClutterInputDevice *device,
|
||||
ClutterInputDeviceTool *tool);
|
||||
ClutterInputDeviceTool * clutter_input_device_xi2_get_current_tool (ClutterInputDevice *device);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
110
clutter/clutter/x11/clutter-virtual-input-device-x11.c
Normal file
110
clutter/clutter/x11/clutter-virtual-input-device-x11.c
Normal file
@@ -0,0 +1,110 @@
|
||||
/*
|
||||
* Clutter.
|
||||
*
|
||||
* An OpenGL based 'interactive canvas' library.
|
||||
*
|
||||
* Copyright (C) 2016 Red Hat Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Author: Jonas Ådahl <jadahl@gmail.com>
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "clutter-build-config.h"
|
||||
#endif
|
||||
|
||||
#include <glib-object.h>
|
||||
|
||||
#include "clutter-x11.h"
|
||||
#include "X11/extensions/XTest.h"
|
||||
|
||||
#include "clutter-virtual-input-device.h"
|
||||
#include "x11/clutter-virtual-input-device-x11.h"
|
||||
|
||||
struct _ClutterVirtualInputDeviceX11
|
||||
{
|
||||
ClutterVirtualInputDevice parent;
|
||||
};
|
||||
|
||||
G_DEFINE_TYPE (ClutterVirtualInputDeviceX11,
|
||||
clutter_virtual_input_device_x11,
|
||||
CLUTTER_TYPE_VIRTUAL_INPUT_DEVICE)
|
||||
|
||||
static void
|
||||
clutter_virtual_input_device_x11_notify_relative_motion (ClutterVirtualInputDevice *virtual_device,
|
||||
uint64_t time_us,
|
||||
double dx,
|
||||
double dy)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_virtual_input_device_x11_notify_absolute_motion (ClutterVirtualInputDevice *virtual_device,
|
||||
uint64_t time_us,
|
||||
double x,
|
||||
double y)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_virtual_input_device_x11_notify_button (ClutterVirtualInputDevice *virtual_device,
|
||||
uint64_t time_us,
|
||||
uint32_t button,
|
||||
ClutterButtonState button_state)
|
||||
{
|
||||
XTestFakeButtonEvent (clutter_x11_get_default_display (),
|
||||
button, button_state == CLUTTER_BUTTON_STATE_PRESSED, 0);
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_virtual_input_device_x11_notify_key (ClutterVirtualInputDevice *virtual_device,
|
||||
uint64_t time_us,
|
||||
uint32_t key,
|
||||
ClutterKeyState key_state)
|
||||
{
|
||||
XTestFakeKeyEvent (clutter_x11_get_default_display (),
|
||||
key, key_state == CLUTTER_KEY_STATE_PRESSED, 0);
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_virtual_input_device_x11_notify_keyval (ClutterVirtualInputDevice *virtual_device,
|
||||
uint64_t time_us,
|
||||
uint32_t keyval,
|
||||
ClutterKeyState key_state)
|
||||
{
|
||||
KeyCode keycode;
|
||||
|
||||
keycode = XKeysymToKeycode (clutter_x11_get_default_display (), keyval);
|
||||
XTestFakeKeyEvent (clutter_x11_get_default_display (),
|
||||
keycode, key_state == CLUTTER_KEY_STATE_PRESSED, 0);
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_virtual_input_device_x11_init (ClutterVirtualInputDeviceX11 *virtual_device_x11)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_virtual_input_device_x11_class_init (ClutterVirtualInputDeviceX11Class *klass)
|
||||
{
|
||||
ClutterVirtualInputDeviceClass *virtual_input_device_class =
|
||||
CLUTTER_VIRTUAL_INPUT_DEVICE_CLASS (klass);
|
||||
|
||||
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_key = clutter_virtual_input_device_x11_notify_key;
|
||||
virtual_input_device_class->notify_keyval = clutter_virtual_input_device_x11_notify_keyval;
|
||||
}
|
35
clutter/clutter/x11/clutter-virtual-input-device-x11.h
Normal file
35
clutter/clutter/x11/clutter-virtual-input-device-x11.h
Normal file
@@ -0,0 +1,35 @@
|
||||
/*
|
||||
* Clutter.
|
||||
*
|
||||
* An OpenGL based 'interactive canvas' library.
|
||||
*
|
||||
* Copyright (C) 2016 Red Hat Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Author: Jonas Ådahl <jadahl@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __CLUTTER_VIRTUAL_INPUT_DEVICE_X11_H__
|
||||
#define __CLUTTER_VIRTUAL_INPUT_DEVICE_X11_H__
|
||||
|
||||
#include "clutter-virtual-input-device.h"
|
||||
|
||||
#define CLUTTER_TYPE_VIRTUAL_INPUT_DEVICE_X11 (clutter_virtual_input_device_x11_get_type ())
|
||||
G_DECLARE_FINAL_TYPE (ClutterVirtualInputDeviceX11,
|
||||
clutter_virtual_input_device_x11,
|
||||
CLUTTER, VIRTUAL_INPUT_DEVICE_X11,
|
||||
ClutterVirtualInputDevice)
|
||||
|
||||
#endif /* __CLUTTER_VIRTUAL_INPUT_DEVICE_X11_H__ */
|
@@ -116,7 +116,7 @@ m4_define([pango_req_version], [1.30])
|
||||
m4_define([gi_req_version], [1.39.0])
|
||||
m4_define([xcomposite_req_version], [0.4])
|
||||
m4_define([gdk_req_version], [3.3.18])
|
||||
m4_define([libinput_req_version], [0.19.0])
|
||||
m4_define([libinput_req_version], [1.4.0])
|
||||
m4_define([libudev_req_version], [136])
|
||||
|
||||
AC_SUBST([GLIB_REQ_VERSION], [glib_req_version])
|
||||
@@ -382,6 +382,22 @@ AS_IF([test "x$SUPPORT_X11" = "x1"],
|
||||
[AC_MSG_ERROR([not found])]
|
||||
)
|
||||
|
||||
# XTEST (required)
|
||||
AC_MSG_CHECKING([for XTest extension])
|
||||
PKG_CHECK_EXISTS([xtst], [have_xtest=yes], [have_xtest=no])
|
||||
AS_IF([test "x$have_xtest" = "xyes"],
|
||||
[
|
||||
AC_DEFINE(HAVE_XTEST, [1], [Define to 1 if we have the XTest X extension])
|
||||
|
||||
X11_LIBS="$X11_LIBS -lXtst"
|
||||
X11_PC_FILES="$X11_PC_FILES xtst"
|
||||
X11_EXTS="$X11_EXTS xtst"
|
||||
|
||||
AC_MSG_RESULT([found])
|
||||
],
|
||||
[AC_MSG_ERROR([Not found])]
|
||||
)
|
||||
|
||||
# X Generic Extensions (optional)
|
||||
clutter_save_CPPFLAGS="$CPPFLAGS"
|
||||
CPPFLAGS="$CPPFLAGS $X11_CFLAGS"
|
||||
|
@@ -11,6 +11,7 @@ AM_CPPFLAGS = \
|
||||
-DGLIB_DISABLE_DEPRECATION_WARNINGS \
|
||||
-I$(top_srcdir)/../cogl \
|
||||
-I$(top_builddir)/../cogl \
|
||||
-I$(top_builddir)/../cogl/cogl \
|
||||
-I$(top_srcdir) \
|
||||
-I$(top_builddir) \
|
||||
-I$(top_srcdir)/clutter \
|
||||
|
@@ -9,6 +9,7 @@ AM_CPPFLAGS = \
|
||||
-DG_LOG_DOMAIN=\"Clutter-Conform\" \
|
||||
-I$(top_srcdir)/../cogl \
|
||||
-I$(top_builddir)/../cogl \
|
||||
-I$(top_builddir)/../cogl/cogl \
|
||||
-I$(top_srcdir) \
|
||||
-I$(top_builddir) \
|
||||
-DCOGL_DISABLE_DEPRECATION_WARNINGS \
|
||||
|
@@ -15,16 +15,13 @@ UNIT_TESTS = \
|
||||
test-state-animator.c \
|
||||
test-fbo.c \
|
||||
test-multistage.c \
|
||||
test-cogl-primitives.c \
|
||||
test-cogl-tex-tile.c \
|
||||
test-cogl-tex-convert.c \
|
||||
test-cogl-tex-foreign.c \
|
||||
test-cogl-tex-getset.c \
|
||||
test-cogl-offscreen.c \
|
||||
test-cogl-tex-polygon.c \
|
||||
test-cogl-multitexture.c \
|
||||
test-stage-read-pixels.c \
|
||||
test-clip.c \
|
||||
test-paint-wrapper.c \
|
||||
test-texture-quality.c \
|
||||
test-layout.c \
|
||||
@@ -112,7 +109,9 @@ clean-wrappers:
|
||||
|
||||
.PHONY: wrappers clean-wrappers
|
||||
|
||||
common_ldadd = $(top_builddir)/clutter/libmutter-clutter-@CLUTTER_API_VERSION@.la
|
||||
common_ldadd = \
|
||||
$(top_builddir)/clutter/libmutter-clutter-@CLUTTER_API_VERSION@.la \
|
||||
$(top_builddir)/../cogl/cogl/libmutter-cogl.la
|
||||
|
||||
check_PROGRAMS = test-interactive
|
||||
check_SCRIPTS = wrappers
|
||||
@@ -128,6 +127,7 @@ test_interactive_CPPFLAGS = \
|
||||
-DCLUTTER_DISABLE_DEPRECATION_WARNINGS \
|
||||
-I$(top_srcdir)/../cogl \
|
||||
-I$(top_builddir)/../cogl \
|
||||
-I$(top_builddir)/../cogl/cogl \
|
||||
-I$(top_srcdir) \
|
||||
-I$(top_builddir) \
|
||||
-I$(top_srcdir)/clutter \
|
||||
|
@@ -1,396 +0,0 @@
|
||||
#include <clutter/clutter.h>
|
||||
#include <gmodule.h>
|
||||
#include <math.h>
|
||||
|
||||
typedef struct _CallbackData CallbackData;
|
||||
typedef struct _Clip Clip;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
CLIP_NONE,
|
||||
CLIP_RECTANGLE,
|
||||
CLIP_ROTATED_RECTANGLE,
|
||||
CLIP_SHAPES
|
||||
} ClipType;
|
||||
|
||||
struct _Clip
|
||||
{
|
||||
ClipType type;
|
||||
gint x1, y1, x2, y2;
|
||||
};
|
||||
|
||||
struct _CallbackData
|
||||
{
|
||||
ClutterActor *stage;
|
||||
CoglHandle hand;
|
||||
|
||||
Clip current_clip;
|
||||
|
||||
GSList *clips;
|
||||
};
|
||||
|
||||
static const char
|
||||
instructions[] =
|
||||
"Left button and drag to draw a rectangle, control+left to draw a rotated "
|
||||
"rectangle or shift+left to draw a path. Press 'r' to reset or 'u' "
|
||||
"to undo the last clip.";
|
||||
|
||||
static void
|
||||
path_shapes (gint x, gint y, gint width, gint height)
|
||||
{
|
||||
cogl_path_move_to (x, y);
|
||||
cogl_path_line_to (x, (y + height * 4 / 5));
|
||||
cogl_path_line_to ((x + width * 4 / 15), (y + height * 4 / 5));
|
||||
cogl_path_close ();
|
||||
|
||||
cogl_path_rectangle (x + width / 3,
|
||||
y,
|
||||
x + width * 9 / 15,
|
||||
y + height * 4 / 5);
|
||||
|
||||
cogl_path_ellipse ((x + width * 4 / 5),
|
||||
(y + height * 2 / 5),
|
||||
(width * 2 / 15),
|
||||
(height * 2 / 5));
|
||||
}
|
||||
|
||||
static void
|
||||
draw_shapes (gint x, gint y)
|
||||
{
|
||||
path_shapes (x, y, 300, 100);
|
||||
cogl_set_source_color4ub (0x00, 0x00, 0xff, 0xff);
|
||||
cogl_path_fill_preserve ();
|
||||
cogl_set_source_color4ub (0xff, 0x00, 0x00, 0xff);
|
||||
cogl_path_stroke ();
|
||||
}
|
||||
|
||||
static void
|
||||
make_clip_path (Clip *clip)
|
||||
{
|
||||
switch (clip->type)
|
||||
{
|
||||
case CLIP_NONE:
|
||||
break;
|
||||
|
||||
case CLIP_RECTANGLE:
|
||||
cogl_path_rectangle (clip->x1,
|
||||
clip->y1,
|
||||
clip->x2,
|
||||
clip->y2);
|
||||
break;
|
||||
|
||||
case CLIP_ROTATED_RECTANGLE:
|
||||
{
|
||||
int size = MIN (ABS (clip->x2 - clip->x1),
|
||||
ABS (clip->y2 - clip->y1));
|
||||
int cx = (clip->x1 + clip->x2) / 2;
|
||||
int cy = (clip->y1 + clip->y2) / 2;
|
||||
|
||||
cogl_path_move_to (cx - size / 2, cy);
|
||||
cogl_path_line_to (cx, cy - size / 2);
|
||||
cogl_path_line_to (cx + size / 2, cy);
|
||||
cogl_path_line_to (cx, cy + size / 2);
|
||||
cogl_path_close ();
|
||||
}
|
||||
break;
|
||||
|
||||
case CLIP_SHAPES:
|
||||
{
|
||||
int x, y, width, height;
|
||||
|
||||
if (clip->x1 < clip->x2)
|
||||
{
|
||||
x = clip->x1;
|
||||
width = clip->x2 - x;
|
||||
}
|
||||
else
|
||||
{
|
||||
x = clip->x2;
|
||||
width = clip->x1 - x;
|
||||
}
|
||||
if (clip->y1 < clip->y2)
|
||||
{
|
||||
y = clip->y1;
|
||||
height = clip->y2 - y;
|
||||
}
|
||||
else
|
||||
{
|
||||
y = clip->y2;
|
||||
height = clip->y1 - y;
|
||||
}
|
||||
|
||||
path_shapes (x, y, width, height);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
on_paint (ClutterActor *actor, CallbackData *data)
|
||||
{
|
||||
int i;
|
||||
ClutterGeometry stage_size;
|
||||
gint hand_width, hand_height;
|
||||
GSList *node;
|
||||
|
||||
clutter_actor_get_allocation_geometry (data->stage, &stage_size);
|
||||
|
||||
hand_width = cogl_texture_get_width (data->hand);
|
||||
hand_height = cogl_texture_get_height (data->hand);
|
||||
|
||||
/* Setup the clipping */
|
||||
for (node = data->clips; node; node = node->next)
|
||||
{
|
||||
Clip *clip = (Clip *) node->data;
|
||||
|
||||
if (clip->type == CLIP_RECTANGLE)
|
||||
cogl_clip_push_rectangle (clip->x1,
|
||||
clip->y1,
|
||||
clip->x2,
|
||||
clip->y2);
|
||||
else if (clip->type == CLIP_ROTATED_RECTANGLE)
|
||||
{
|
||||
float size = MIN (ABS (clip->x2 - clip->x1),
|
||||
ABS (clip->y2 - clip->y1));
|
||||
int cx = (clip->x1 + clip->x2) / 2;
|
||||
int cy = (clip->y1 + clip->y2) / 2;
|
||||
|
||||
size = sqrtf ((size / 2) * (size / 2) * 2);
|
||||
|
||||
cogl_push_matrix ();
|
||||
|
||||
/* Rotate 45° about the centre point */
|
||||
cogl_translate (cx, cy, 0.0f);
|
||||
cogl_rotate (45.0f, 0.0f, 0.0f, 1.0f);
|
||||
cogl_clip_push_rectangle (-size / 2, -size / 2, size / 2, size / 2);
|
||||
|
||||
cogl_pop_matrix ();
|
||||
}
|
||||
else
|
||||
{
|
||||
make_clip_path (clip);
|
||||
cogl_clip_push_from_path ();
|
||||
}
|
||||
}
|
||||
|
||||
/* Draw a rectangle filling the entire stage */
|
||||
cogl_set_source_color4ub (0x80, 0x80, 0xff, 0xff);
|
||||
cogl_rectangle (0, 0, stage_size.width, stage_size.height);
|
||||
|
||||
draw_shapes (10, 10);
|
||||
|
||||
/* Draw the hand at different rotations */
|
||||
for (i = -2; i <= 2; i++)
|
||||
{
|
||||
cogl_push_matrix ();
|
||||
|
||||
cogl_translate (stage_size.width / 2 + stage_size.width / 6 * i,
|
||||
stage_size.height / 2, 0);
|
||||
|
||||
cogl_rotate (i * 40, 0, 1, 0);
|
||||
|
||||
cogl_set_source_color4ub (0xff, 0xff, 0xff, 0xff);
|
||||
|
||||
cogl_set_source_texture (data->hand);
|
||||
cogl_rectangle_with_texture_coords ((-hand_width / 2),
|
||||
(-hand_height / 2),
|
||||
(hand_width / 2),
|
||||
(hand_height / 2),
|
||||
0, 0, 1, 1);
|
||||
|
||||
cogl_pop_matrix ();
|
||||
}
|
||||
|
||||
draw_shapes (stage_size.width - 310, stage_size.height - 110);
|
||||
|
||||
/* Remove all of the clipping */
|
||||
g_slist_foreach (data->clips, (GFunc) cogl_clip_pop, NULL);
|
||||
|
||||
/* Draw the bounding box for each of the clips */
|
||||
for (node = data->clips; node; node = node->next)
|
||||
{
|
||||
Clip *clip = (Clip *) node->data;
|
||||
|
||||
make_clip_path (clip);
|
||||
cogl_set_source_color4ub (0x00, 0x00, 0xff, 0xff);
|
||||
cogl_path_stroke ();
|
||||
}
|
||||
|
||||
/* Draw the bounding box for the pending new clip */
|
||||
if (data->current_clip.type != CLIP_NONE)
|
||||
{
|
||||
make_clip_path (&data->current_clip);
|
||||
cogl_set_source_color4ub (0xff, 0x00, 0x00, 0xff);
|
||||
cogl_path_stroke ();
|
||||
}
|
||||
}
|
||||
|
||||
static gboolean
|
||||
on_button_press (ClutterActor *stage, ClutterButtonEvent *event,
|
||||
CallbackData *data)
|
||||
{
|
||||
data->current_clip.x1 = data->current_clip.x2 = event->x;
|
||||
data->current_clip.y1 = data->current_clip.y2 = event->y;
|
||||
|
||||
switch (event->button)
|
||||
{
|
||||
case CLUTTER_BUTTON_PRIMARY:
|
||||
if (clutter_event_has_shift_modifier ((ClutterEvent *) event))
|
||||
data->current_clip.type = CLIP_SHAPES;
|
||||
else if (clutter_event_has_control_modifier ((ClutterEvent *) event))
|
||||
data->current_clip.type = CLIP_ROTATED_RECTANGLE;
|
||||
else
|
||||
data->current_clip.type = CLIP_RECTANGLE;
|
||||
break;
|
||||
|
||||
case CLUTTER_BUTTON_SECONDARY:
|
||||
data->current_clip.type = CLIP_ROTATED_RECTANGLE;
|
||||
break;
|
||||
|
||||
case CLUTTER_BUTTON_MIDDLE:
|
||||
data->current_clip.type = CLIP_SHAPES;
|
||||
break;
|
||||
|
||||
default:
|
||||
data->current_clip.type = CLIP_NONE;
|
||||
break;
|
||||
}
|
||||
|
||||
clutter_actor_queue_redraw (stage);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
on_button_release (ClutterActor *stage, ClutterButtonEvent *event,
|
||||
CallbackData *data)
|
||||
{
|
||||
if (data->current_clip.type != CLIP_NONE)
|
||||
{
|
||||
data->clips = g_slist_prepend (data->clips,
|
||||
g_slice_copy (sizeof (Clip),
|
||||
&data->current_clip));
|
||||
|
||||
data->current_clip.type = CLIP_NONE;
|
||||
}
|
||||
|
||||
clutter_actor_queue_redraw (stage);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
on_motion (ClutterActor *stage, ClutterMotionEvent *event,
|
||||
CallbackData *data)
|
||||
{
|
||||
if (data->current_clip.type != CLIP_NONE)
|
||||
{
|
||||
data->current_clip.x2 = event->x;
|
||||
data->current_clip.y2 = event->y;
|
||||
|
||||
clutter_actor_queue_redraw (stage);
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
free_clips (CallbackData *data)
|
||||
{
|
||||
GSList *node;
|
||||
|
||||
for (node = data->clips; node; node = node->next)
|
||||
g_slice_free (Clip, node->data);
|
||||
|
||||
g_slist_free (data->clips);
|
||||
|
||||
data->clips = NULL;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
on_key_press (ClutterActor *stage,
|
||||
ClutterEvent *event,
|
||||
CallbackData *data)
|
||||
{
|
||||
switch (clutter_event_get_key_symbol (event))
|
||||
{
|
||||
case CLUTTER_KEY_r:
|
||||
free_clips (data);
|
||||
clutter_actor_queue_redraw (stage);
|
||||
break;
|
||||
|
||||
case CLUTTER_KEY_u:
|
||||
if (data->clips)
|
||||
{
|
||||
g_slice_free (Clip, data->clips->data);
|
||||
data->clips = g_slist_delete_link (data->clips, data->clips);
|
||||
clutter_actor_queue_redraw (stage);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
G_MODULE_EXPORT int
|
||||
test_clip_main (int argc, char **argv)
|
||||
{
|
||||
CallbackData data;
|
||||
ClutterActor *stub_actor, *label;
|
||||
gchar *file;
|
||||
|
||||
if (clutter_init (&argc, &argv) != CLUTTER_INIT_SUCCESS)
|
||||
return 1;
|
||||
|
||||
data.current_clip.type = CLIP_NONE;
|
||||
data.clips = NULL;
|
||||
|
||||
data.stage = clutter_stage_new ();
|
||||
clutter_stage_set_title (CLUTTER_STAGE (data.stage), "Clipping");
|
||||
g_signal_connect (data.stage, "destroy", G_CALLBACK (clutter_main_quit), NULL);
|
||||
|
||||
stub_actor = clutter_rectangle_new ();
|
||||
clutter_container_add (CLUTTER_CONTAINER (data.stage), stub_actor, NULL);
|
||||
|
||||
file = g_build_filename (TESTS_DATADIR, "redhand.png", NULL);
|
||||
data.hand = cogl_texture_new_from_file (file,
|
||||
COGL_TEXTURE_NONE,
|
||||
COGL_PIXEL_FORMAT_ANY,
|
||||
NULL);
|
||||
g_free (file);
|
||||
|
||||
label = clutter_text_new_with_text ("Sans 12px", instructions);
|
||||
clutter_text_set_line_wrap (CLUTTER_TEXT (label), TRUE);
|
||||
clutter_actor_set_width (label, clutter_actor_get_width (data.stage) - 310);
|
||||
clutter_actor_set_y (label,
|
||||
clutter_actor_get_height (data.stage)
|
||||
- clutter_actor_get_height (label));
|
||||
clutter_container_add (CLUTTER_CONTAINER (data.stage), label, NULL);
|
||||
|
||||
g_signal_connect (stub_actor, "paint", G_CALLBACK (on_paint), &data);
|
||||
|
||||
g_signal_connect (data.stage, "button-press-event",
|
||||
G_CALLBACK (on_button_press), &data);
|
||||
g_signal_connect (data.stage, "button-release-event",
|
||||
G_CALLBACK (on_button_release), &data);
|
||||
g_signal_connect (data.stage, "motion-event",
|
||||
G_CALLBACK (on_motion), &data);
|
||||
g_signal_connect (data.stage, "key-press-event",
|
||||
G_CALLBACK (on_key_press), &data);
|
||||
|
||||
clutter_actor_show (data.stage);
|
||||
|
||||
clutter_main ();
|
||||
|
||||
cogl_handle_unref (data.hand);
|
||||
|
||||
free_clips (&data);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
G_MODULE_EXPORT const char *
|
||||
test_clip_describe (void)
|
||||
{
|
||||
return "Actor clipping with various techniques";
|
||||
}
|
@@ -1,144 +0,0 @@
|
||||
#include <glib.h>
|
||||
#include <gmodule.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <cogl/cogl.h>
|
||||
#include <clutter/clutter.h>
|
||||
|
||||
typedef void (*PaintFunc) (void);
|
||||
|
||||
static void
|
||||
test_paint_line (void)
|
||||
{
|
||||
cogl_path_line (-50, -25, 50, 25);
|
||||
}
|
||||
|
||||
static void
|
||||
test_paint_rect (void)
|
||||
{
|
||||
cogl_path_rectangle (-50, -25, 50, 25);
|
||||
}
|
||||
|
||||
static void
|
||||
test_paint_rndrect(void)
|
||||
{
|
||||
cogl_path_round_rectangle (-50, -25, 50, 25, 10, 5);
|
||||
}
|
||||
|
||||
static void
|
||||
test_paint_polyl (void)
|
||||
{
|
||||
gfloat poly_coords[] = {
|
||||
-50, -50,
|
||||
+50, -30,
|
||||
+30, +30,
|
||||
-30, +40
|
||||
};
|
||||
|
||||
cogl_path_polyline (poly_coords, 4);
|
||||
}
|
||||
|
||||
static void
|
||||
test_paint_polyg (void)
|
||||
{
|
||||
gfloat poly_coords[] = {
|
||||
-50, -50,
|
||||
+50, -30,
|
||||
+30, +30,
|
||||
-30, +40
|
||||
};
|
||||
|
||||
cogl_path_polygon (poly_coords, 4);
|
||||
}
|
||||
|
||||
static void
|
||||
test_paint_elp (void)
|
||||
{
|
||||
cogl_path_ellipse (0, 0, 60, 40);
|
||||
}
|
||||
|
||||
static void
|
||||
test_paint_curve (void)
|
||||
{
|
||||
cogl_path_move_to (-50, +50);
|
||||
|
||||
cogl_path_curve_to (+100, -50,
|
||||
-100, -50,
|
||||
+50, +50);
|
||||
}
|
||||
|
||||
static PaintFunc paint_func []=
|
||||
{
|
||||
test_paint_line,
|
||||
test_paint_rect,
|
||||
test_paint_rndrect,
|
||||
test_paint_polyl,
|
||||
test_paint_polyg,
|
||||
test_paint_elp,
|
||||
test_paint_curve
|
||||
};
|
||||
|
||||
static void
|
||||
paint_cb (ClutterActor *self, ClutterTimeline *tl)
|
||||
{
|
||||
gint paint_index = (clutter_timeline_get_progress (tl)
|
||||
* G_N_ELEMENTS (paint_func));
|
||||
|
||||
cogl_push_matrix ();
|
||||
|
||||
paint_func[paint_index] ();
|
||||
|
||||
cogl_translate (100, 100, 0);
|
||||
cogl_set_source_color4ub (0, 160, 0, 255);
|
||||
cogl_path_stroke_preserve ();
|
||||
|
||||
cogl_translate (150, 0, 0);
|
||||
cogl_set_source_color4ub (200, 0, 0, 255);
|
||||
cogl_path_fill ();
|
||||
|
||||
cogl_pop_matrix();
|
||||
}
|
||||
|
||||
G_MODULE_EXPORT int
|
||||
test_cogl_primitives_main (int argc, char *argv[])
|
||||
{
|
||||
ClutterActor *stage;
|
||||
ClutterActor *coglbox;
|
||||
ClutterTimeline *tl;
|
||||
|
||||
if (clutter_init (&argc, &argv) != CLUTTER_INIT_SUCCESS)
|
||||
return 1;
|
||||
|
||||
tl = clutter_timeline_new (G_N_ELEMENTS (paint_func) * 1000);
|
||||
clutter_timeline_set_loop (tl, TRUE);
|
||||
clutter_timeline_start (tl);
|
||||
|
||||
stage = clutter_stage_new ();
|
||||
clutter_actor_set_size (stage, 400, 400);
|
||||
clutter_stage_set_title (CLUTTER_STAGE (stage), "Cogl Path Primitives");
|
||||
g_signal_connect (stage, "destroy", G_CALLBACK (clutter_main_quit), NULL);
|
||||
|
||||
coglbox = clutter_group_new ();
|
||||
clutter_container_add_actor (CLUTTER_CONTAINER (stage), coglbox);
|
||||
g_signal_connect (coglbox, "paint", G_CALLBACK (paint_cb), tl);
|
||||
/* Redraw every frame of the timeline */
|
||||
g_signal_connect_swapped (tl, "new-frame",
|
||||
G_CALLBACK (clutter_actor_queue_redraw), coglbox);
|
||||
|
||||
clutter_actor_set_rotation (coglbox, CLUTTER_Y_AXIS, -30, 200, 0, 0);
|
||||
clutter_actor_set_position (coglbox, 0, 100);
|
||||
|
||||
clutter_actor_show (stage);
|
||||
|
||||
clutter_main ();
|
||||
|
||||
g_object_unref (tl);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
G_MODULE_EXPORT const char *
|
||||
test_cogl_primitives (void)
|
||||
{
|
||||
return "2D Path primitives support in Cogl.";
|
||||
}
|
@@ -1,270 +0,0 @@
|
||||
#include <glib.h>
|
||||
#include <gmodule.h>
|
||||
#include <stdlib.h>
|
||||
#include <clutter/clutter.h>
|
||||
#include <cogl/cogl.h>
|
||||
|
||||
/* Coglbox declaration
|
||||
*--------------------------------------------------*/
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define TEST_TYPE_COGLBOX test_coglbox_get_type()
|
||||
|
||||
#define TEST_COGLBOX(obj) \
|
||||
(G_TYPE_CHECK_INSTANCE_CAST ((obj), \
|
||||
TEST_TYPE_COGLBOX, TestCoglboxClass))
|
||||
|
||||
#define TEST_COGLBOX_CLASS(klass) \
|
||||
(G_TYPE_CHECK_CLASS_CAST ((klass), \
|
||||
TEST_TYPE_COGLBOX, TestCoglboxClass))
|
||||
|
||||
#define TEST_IS_COGLBOX(obj) \
|
||||
(G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
|
||||
TEST_TYPE_COGLBOX))
|
||||
|
||||
#define TEST_IS_COGLBOX_CLASS(klass) \
|
||||
(G_TYPE_CHECK_CLASS_TYPE ((klass), \
|
||||
TEST_TYPE_COGLBOX))
|
||||
|
||||
#define TEST_COGLBOX_GET_CLASS(obj) \
|
||||
(G_TYPE_INSTANCE_GET_CLASS ((obj), \
|
||||
TEST_TYPE_COGLBOX, TestCoglboxClass))
|
||||
|
||||
typedef struct _TestCoglbox TestCoglbox;
|
||||
typedef struct _TestCoglboxClass TestCoglboxClass;
|
||||
typedef struct _TestCoglboxPrivate TestCoglboxPrivate;
|
||||
|
||||
struct _TestCoglbox
|
||||
{
|
||||
ClutterActor parent;
|
||||
|
||||
/*< private >*/
|
||||
TestCoglboxPrivate *priv;
|
||||
};
|
||||
|
||||
struct _TestCoglboxClass
|
||||
{
|
||||
ClutterActorClass parent_class;
|
||||
|
||||
/* padding for future expansion */
|
||||
void (*_test_coglbox1) (void);
|
||||
void (*_test_coglbox2) (void);
|
||||
void (*_test_coglbox3) (void);
|
||||
void (*_test_coglbox4) (void);
|
||||
};
|
||||
|
||||
static GType test_coglbox_get_type (void) G_GNUC_CONST;
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
/* Coglbox private declaration
|
||||
*--------------------------------------------------*/
|
||||
|
||||
G_DEFINE_TYPE (TestCoglbox, test_coglbox, CLUTTER_TYPE_ACTOR);
|
||||
|
||||
#define TEST_COGLBOX_GET_PRIVATE(obj) \
|
||||
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), TEST_TYPE_COGLBOX, TestCoglboxPrivate))
|
||||
|
||||
struct _TestCoglboxPrivate
|
||||
{
|
||||
CoglHandle cogl_tex_id[4];
|
||||
};
|
||||
|
||||
/* Coglbox implementation
|
||||
*--------------------------------------------------*/
|
||||
|
||||
static void
|
||||
test_coglbox_paint(ClutterActor *self)
|
||||
{
|
||||
TestCoglboxPrivate *priv = TEST_COGLBOX_GET_PRIVATE (self);
|
||||
gfloat texcoords[4] = { 0.0f, 0.0f, 1.0f, 1.0f };
|
||||
|
||||
cogl_set_source_color4ub (0x66, 0x66, 0xdd, 0xff);
|
||||
cogl_rectangle (0, 0, 400, 400);
|
||||
|
||||
cogl_push_matrix ();
|
||||
|
||||
cogl_translate (100, 100, 0);
|
||||
cogl_set_source_texture (priv->cogl_tex_id[1]);
|
||||
cogl_rectangle_with_texture_coords (0, 0, 200, 213,
|
||||
texcoords[0], texcoords[1],
|
||||
texcoords[2], texcoords[3]);
|
||||
|
||||
cogl_pop_matrix();
|
||||
}
|
||||
|
||||
static void
|
||||
test_coglbox_finalize (GObject *object)
|
||||
{
|
||||
G_OBJECT_CLASS (test_coglbox_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
test_coglbox_dispose (GObject *object)
|
||||
{
|
||||
TestCoglboxPrivate *priv;
|
||||
|
||||
priv = TEST_COGLBOX_GET_PRIVATE (object);
|
||||
cogl_handle_unref (priv->cogl_tex_id);
|
||||
|
||||
G_OBJECT_CLASS (test_coglbox_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
static void
|
||||
test_coglbox_init (TestCoglbox *self)
|
||||
{
|
||||
TestCoglboxPrivate *priv;
|
||||
guint width;
|
||||
guint height;
|
||||
guint rowstride;
|
||||
CoglPixelFormat format;
|
||||
gint size;
|
||||
guchar *data;
|
||||
gint x,y,t;
|
||||
guchar *pixel;
|
||||
gchar *file;
|
||||
|
||||
self->priv = priv = TEST_COGLBOX_GET_PRIVATE(self);
|
||||
|
||||
/* Load image from file */
|
||||
file = g_build_filename (TESTS_DATADIR, "redhand.png", NULL);
|
||||
priv->cogl_tex_id[0] =
|
||||
cogl_texture_new_from_file (file,
|
||||
COGL_TEXTURE_NONE,
|
||||
COGL_PIXEL_FORMAT_ANY,
|
||||
NULL);
|
||||
|
||||
if (priv->cogl_tex_id[0] == COGL_INVALID_HANDLE)
|
||||
{
|
||||
printf ("Failed loading redhand.png image!\n");
|
||||
return;
|
||||
}
|
||||
|
||||
g_free (file);
|
||||
|
||||
printf("Texture loaded from file.\n");
|
||||
|
||||
/* Obtain pixel data */
|
||||
|
||||
format = cogl_texture_get_format (priv->cogl_tex_id[0]);
|
||||
g_assert(format == COGL_PIXEL_FORMAT_RGBA_8888_PRE ||
|
||||
format == COGL_PIXEL_FORMAT_ARGB_8888_PRE);
|
||||
|
||||
width = cogl_texture_get_width (priv->cogl_tex_id[0]);
|
||||
height = cogl_texture_get_height (priv->cogl_tex_id[0]);
|
||||
size = cogl_texture_get_data (priv->cogl_tex_id[0],
|
||||
format, 0, NULL);
|
||||
|
||||
printf("size: %dx%d\n", width, height);
|
||||
printf("format: 0x%x\n", format);
|
||||
printf("bytesize: %d\n", size);
|
||||
|
||||
data = (guchar*) g_malloc (sizeof(guchar) * size);
|
||||
|
||||
cogl_texture_get_data (priv->cogl_tex_id[0],
|
||||
format, 0, data);
|
||||
rowstride = cogl_texture_get_rowstride (priv->cogl_tex_id[0]);
|
||||
|
||||
/* Create new texture from modified data */
|
||||
|
||||
priv->cogl_tex_id[1] =
|
||||
cogl_texture_new_from_data (width, height,
|
||||
COGL_TEXTURE_NONE,
|
||||
format, format,
|
||||
rowstride, data);
|
||||
|
||||
if (priv->cogl_tex_id[1] == COGL_INVALID_HANDLE)
|
||||
{
|
||||
printf ("Failed creating image from data!\n");
|
||||
return;
|
||||
}
|
||||
|
||||
printf ("Texture created from data.\n");
|
||||
|
||||
/* Modify data (swap red and green) */
|
||||
|
||||
for (y=0; y<height; ++y)
|
||||
{
|
||||
for (x=0; x<width; ++x)
|
||||
{
|
||||
pixel = data + y * rowstride + x * 4;
|
||||
if (format == COGL_PIXEL_FORMAT_RGBA_8888_PRE)
|
||||
{
|
||||
t = pixel[0];
|
||||
pixel[0] = pixel[1];
|
||||
pixel[1] = t;
|
||||
}
|
||||
else
|
||||
{
|
||||
t = pixel[1];
|
||||
pixel[1] = pixel[2];
|
||||
pixel[2] = t;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
cogl_texture_set_region (priv->cogl_tex_id[1],
|
||||
0, 0, 0, 0,
|
||||
100, 100, width, height,
|
||||
format, 0, data);
|
||||
|
||||
cogl_texture_set_region (priv->cogl_tex_id[1],
|
||||
100, 100, 100, 100,
|
||||
100, 100, width, height,
|
||||
format, 0, data);
|
||||
|
||||
printf ("Subregion data updated.\n");
|
||||
}
|
||||
|
||||
static void
|
||||
test_coglbox_class_init (TestCoglboxClass *klass)
|
||||
{
|
||||
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||
ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass);
|
||||
|
||||
gobject_class->finalize = test_coglbox_finalize;
|
||||
gobject_class->dispose = test_coglbox_dispose;
|
||||
actor_class->paint = test_coglbox_paint;
|
||||
|
||||
g_type_class_add_private (gobject_class, sizeof (TestCoglboxPrivate));
|
||||
}
|
||||
|
||||
static ClutterActor*
|
||||
test_coglbox_new (void)
|
||||
{
|
||||
return g_object_new (TEST_TYPE_COGLBOX, NULL);
|
||||
}
|
||||
|
||||
G_MODULE_EXPORT int
|
||||
test_cogl_tex_getset_main (int argc, char *argv[])
|
||||
{
|
||||
ClutterActor *stage;
|
||||
ClutterActor *coglbox;
|
||||
|
||||
if (clutter_init (&argc, &argv) != CLUTTER_INIT_SUCCESS)
|
||||
return 1;
|
||||
|
||||
/* Stage */
|
||||
stage = clutter_stage_new ();
|
||||
clutter_actor_set_size (stage, 400, 400);
|
||||
clutter_stage_set_title (CLUTTER_STAGE (stage), "Cogl Texture Readback");
|
||||
g_signal_connect (stage, "destroy", G_CALLBACK (clutter_main_quit), NULL);
|
||||
|
||||
/* Cogl Box */
|
||||
coglbox = test_coglbox_new ();
|
||||
clutter_container_add_actor (CLUTTER_CONTAINER (stage), coglbox);
|
||||
|
||||
clutter_actor_show_all (stage);
|
||||
|
||||
clutter_main ();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
G_MODULE_EXPORT const char *
|
||||
test_cogl_tex_getset_describe (void)
|
||||
{
|
||||
return "Texture region readback and update in Cogl.";
|
||||
}
|
@@ -1,4 +1,7 @@
|
||||
common_ldadd = $(top_builddir)/clutter/libmutter-clutter-@CLUTTER_API_VERSION@.la
|
||||
common_ldadd = \
|
||||
$(top_builddir)/clutter/libmutter-clutter-@CLUTTER_API_VERSION@.la \
|
||||
$(top_builddir)/../cogl/cogl/libmutter-cogl.la
|
||||
|
||||
|
||||
check_PROGRAMS = \
|
||||
test-text \
|
||||
@@ -17,6 +20,7 @@ AM_CPPFLAGS = \
|
||||
-DTESTS_DATA_DIR=\""$(top_srcdir)/tests/data/"\" \
|
||||
-I$(top_srcdir)/../cogl \
|
||||
-I$(top_builddir)/../cogl \
|
||||
-I$(top_builddir)/../cogl/cogl \
|
||||
-I$(top_srcdir) \
|
||||
-I$(top_builddir) \
|
||||
-I$(top_srcdir)/clutter \
|
||||
|
@@ -1,4 +1,4 @@
|
||||
#include <config.h>
|
||||
#include <clutter-build-config.h>
|
||||
#include <glib.h>
|
||||
#include <gmodule.h>
|
||||
#include <stdlib.h>
|
||||
|
@@ -21,6 +21,7 @@ AM_CPPFLAGS = \
|
||||
-DTESTS_DATA_DIR=\""$(top_srcdir)/tests/data/"\" \
|
||||
-I$(top_srcdir)/../cogl \
|
||||
-I$(top_builddir)/../cogl \
|
||||
-I$(top_builddir)/../cogl/cogl \
|
||||
-I$(top_srcdir) \
|
||||
-I$(top_builddir) \
|
||||
-I$(top_srcdir)/clutter \
|
||||
|
@@ -452,7 +452,7 @@ libmutter_cogl_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_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).*"
|
||||
-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).*"
|
||||
|
||||
libmutter_cogl_la_SOURCES = $(cogl_sources_c)
|
||||
nodist_libmutter_cogl_la_SOURCES = $(BUILT_SOURCES)
|
||||
|
@@ -262,6 +262,7 @@ typedef enum _CoglFeatureID
|
||||
COGL_FEATURE_ID_PER_VERTEX_POINT_SIZE,
|
||||
COGL_FEATURE_ID_TEXTURE_RG,
|
||||
COGL_FEATURE_ID_BUFFER_AGE,
|
||||
COGL_FEATURE_ID_TEXTURE_EGL_IMAGE_EXTERNAL,
|
||||
|
||||
/*< private >*/
|
||||
_COGL_N_FEATURE_IDS /*< skip >*/
|
||||
|
@@ -152,6 +152,7 @@ typedef long GLsizeiptr;
|
||||
#define GL_POLYGON_OFFSET_FILL 0x8037
|
||||
#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E
|
||||
#define GL_SAMPLE_COVERAGE 0x80A0
|
||||
#define GL_TEXTURE_EXTERNAL_OES 0x8D65
|
||||
|
||||
/* ErrorCode */
|
||||
#define GL_NO_ERROR 0
|
||||
|
@@ -65,7 +65,7 @@
|
||||
* conflicts we only expose the minimal set of GLES 2.0 types and enums
|
||||
* publicly.
|
||||
*/
|
||||
#ifdef COGL_COMPILATION
|
||||
#if defined(COGL_COMPILATION) || defined(COGL_ENABLE_MUTTER_API)
|
||||
#include "cogl-gl-header.h"
|
||||
#else
|
||||
#include <cogl/cogl-gles2-types.h>
|
||||
|
@@ -111,6 +111,14 @@ _cogl_glsl_shader_set_source_with_boilerplate (CoglContext *ctx,
|
||||
lengths[count++] = sizeof (texture_3d_extension) - 1;
|
||||
}
|
||||
|
||||
if (cogl_has_feature (ctx, COGL_FEATURE_ID_TEXTURE_EGL_IMAGE_EXTERNAL))
|
||||
{
|
||||
static const char texture_3d_extension[] =
|
||||
"#extension GL_OES_EGL_image_external : require\n";
|
||||
strings[count] = texture_3d_extension;
|
||||
lengths[count++] = sizeof (texture_3d_extension) - 1;
|
||||
}
|
||||
|
||||
if (shader_gl_type == GL_VERTEX_SHADER)
|
||||
{
|
||||
strings[count] = vertex_boilerplate;
|
||||
|
@@ -936,7 +936,7 @@ _cogl_pipeline_layer_needs_combine_separate
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
|
@@ -36,10 +36,6 @@
|
||||
#include "cogl-texture-private.h"
|
||||
#include "cogl-texture-2d.h"
|
||||
|
||||
#ifdef COGL_HAS_EGL_SUPPORT
|
||||
#include "cogl-egl-defines.h"
|
||||
#endif
|
||||
|
||||
struct _CoglTexture2D
|
||||
{
|
||||
CoglTexture _parent;
|
||||
@@ -59,30 +55,23 @@ struct _CoglTexture2D
|
||||
GLenum gl_internal_format;
|
||||
/* The texture object number */
|
||||
GLuint gl_texture;
|
||||
GLenum gl_target;
|
||||
GLenum gl_legacy_texobj_min_filter;
|
||||
GLenum gl_legacy_texobj_mag_filter;
|
||||
GLint gl_legacy_texobj_wrap_mode_s;
|
||||
GLint gl_legacy_texobj_wrap_mode_t;
|
||||
CoglTexturePixel first_pixel;
|
||||
|
||||
struct {
|
||||
void *user_data;
|
||||
GDestroyNotify destroy;
|
||||
} egl_image_external;
|
||||
};
|
||||
|
||||
CoglTexture2D *
|
||||
_cogl_texture_2d_new_from_bitmap (CoglBitmap *bmp,
|
||||
CoglBool can_convert_in_place);
|
||||
|
||||
#if defined (COGL_HAS_EGL_SUPPORT) && defined (EGL_KHR_image_base)
|
||||
/* NB: The reason we require the width, height and format to be passed
|
||||
* even though they may seem redundant is because GLES 1/2 don't
|
||||
* provide a way to query these properties. */
|
||||
CoglTexture2D *
|
||||
_cogl_egl_texture_2d_new_from_image (CoglContext *ctx,
|
||||
int width,
|
||||
int height,
|
||||
CoglPixelFormat format,
|
||||
EGLImageKHR image,
|
||||
CoglError **error);
|
||||
#endif
|
||||
|
||||
CoglTexture2D *
|
||||
_cogl_texture_2d_create_base (CoglContext *ctx,
|
||||
int width,
|
||||
|
@@ -110,6 +110,8 @@ _cogl_texture_2d_create_base (CoglContext *ctx,
|
||||
tex_2d->mipmaps_dirty = TRUE;
|
||||
tex_2d->auto_mipmap = TRUE;
|
||||
|
||||
tex_2d->gl_target = GL_TEXTURE_2D;
|
||||
|
||||
tex_2d->is_foreign = FALSE;
|
||||
|
||||
ctx->driver_vtable->texture_2d_init (tex_2d);
|
||||
@@ -236,12 +238,12 @@ cogl_texture_2d_new_from_data (CoglContext *ctx,
|
||||
* even though they may seem redundant is because GLES 1/2 don't
|
||||
* provide a way to query these properties. */
|
||||
CoglTexture2D *
|
||||
_cogl_egl_texture_2d_new_from_image (CoglContext *ctx,
|
||||
int width,
|
||||
int height,
|
||||
CoglPixelFormat format,
|
||||
EGLImageKHR image,
|
||||
CoglError **error)
|
||||
cogl_egl_texture_2d_new_from_image (CoglContext *ctx,
|
||||
int width,
|
||||
int height,
|
||||
CoglPixelFormat format,
|
||||
EGLImageKHR image,
|
||||
CoglError **error)
|
||||
{
|
||||
CoglTextureLoader *loader;
|
||||
CoglTexture2D *tex;
|
||||
@@ -430,11 +432,11 @@ cogl_wayland_texture_2d_new_from_buffer (CoglContext *ctx,
|
||||
EGL_WAYLAND_BUFFER_WL,
|
||||
buffer,
|
||||
NULL);
|
||||
tex = _cogl_egl_texture_2d_new_from_image (ctx,
|
||||
width, height,
|
||||
internal_format,
|
||||
image,
|
||||
error);
|
||||
tex = cogl_egl_texture_2d_new_from_image (ctx,
|
||||
width, height,
|
||||
internal_format,
|
||||
image,
|
||||
error);
|
||||
_cogl_egl_destroy_image (ctx, image);
|
||||
return tex;
|
||||
}
|
||||
@@ -557,7 +559,7 @@ _cogl_texture_2d_get_gl_texture (CoglTexture *tex,
|
||||
GLuint handle;
|
||||
|
||||
if (out_gl_target)
|
||||
*out_gl_target = GL_TEXTURE_2D;
|
||||
*out_gl_target = tex_2d->gl_target;
|
||||
|
||||
handle = ctx->driver_vtable->texture_2d_get_gl_handle (tex_2d);
|
||||
|
||||
|
@@ -40,6 +40,10 @@
|
||||
#include "cogl-context.h"
|
||||
#include "cogl-bitmap.h"
|
||||
|
||||
#ifdef COGL_HAS_EGL_SUPPORT
|
||||
#include "cogl-egl-defines.h"
|
||||
#endif
|
||||
|
||||
COGL_BEGIN_DECLS
|
||||
|
||||
/**
|
||||
@@ -227,6 +231,40 @@ cogl_texture_2d_new_from_data (CoglContext *ctx,
|
||||
CoglTexture2D *
|
||||
cogl_texture_2d_new_from_bitmap (CoglBitmap *bitmap);
|
||||
|
||||
#if defined (COGL_HAS_EGL_SUPPORT) && defined (EGL_KHR_image_base)
|
||||
/* NB: The reason we require the width, height and format to be passed
|
||||
* even though they may seem redundant is because GLES 1/2 don't
|
||||
* provide a way to query these properties. */
|
||||
CoglTexture2D *
|
||||
cogl_egl_texture_2d_new_from_image (CoglContext *ctx,
|
||||
int width,
|
||||
int height,
|
||||
CoglPixelFormat format,
|
||||
EGLImageKHR image,
|
||||
CoglError **error);
|
||||
|
||||
typedef gboolean (*CoglTexture2DEGLImageExternalAlloc) (CoglTexture2D *tex_2d,
|
||||
gpointer user_data,
|
||||
GError **error);
|
||||
|
||||
CoglTexture2D *
|
||||
cogl_texture_2d_new_from_egl_image_external (CoglContext *ctx,
|
||||
int width,
|
||||
int height,
|
||||
CoglTexture2DEGLImageExternalAlloc alloc,
|
||||
gpointer user_data,
|
||||
GDestroyNotify destroy,
|
||||
CoglError **error);
|
||||
|
||||
void
|
||||
cogl_texture_2d_egl_image_external_bind (CoglTexture2D *tex_2d);
|
||||
|
||||
void
|
||||
cogl_texture_2d_egl_image_external_alloc_finish (CoglTexture2D *tex_2d,
|
||||
void *user_data,
|
||||
GDestroyNotify destroy);
|
||||
#endif
|
||||
|
||||
COGL_END_DECLS
|
||||
|
||||
#endif /* __COGL_TEXTURE_2D_H */
|
||||
|
@@ -37,6 +37,7 @@
|
||||
#include "cogl-spans.h"
|
||||
#include "cogl-meta-texture.h"
|
||||
#include "cogl-framebuffer.h"
|
||||
#include "cogl-texture-2d.h"
|
||||
|
||||
#ifdef COGL_HAS_EGL_SUPPORT
|
||||
#include "cogl-egl-defines.h"
|
||||
@@ -154,7 +155,8 @@ typedef enum _CoglTextureSoureType {
|
||||
COGL_TEXTURE_SOURCE_TYPE_SIZED = 1,
|
||||
COGL_TEXTURE_SOURCE_TYPE_BITMAP,
|
||||
COGL_TEXTURE_SOURCE_TYPE_EGL_IMAGE,
|
||||
COGL_TEXTURE_SOURCE_TYPE_GL_FOREIGN
|
||||
COGL_TEXTURE_SOURCE_TYPE_GL_FOREIGN,
|
||||
COGL_TEXTURE_SOURCE_TYPE_EGL_IMAGE_EXTERNAL
|
||||
} CoglTextureSourceType;
|
||||
|
||||
typedef struct _CoglTextureLoader
|
||||
@@ -179,6 +181,14 @@ typedef struct _CoglTextureLoader
|
||||
int height;
|
||||
CoglPixelFormat format;
|
||||
} egl_image;
|
||||
#endif
|
||||
#if defined (COGL_HAS_EGL_SUPPORT)
|
||||
struct {
|
||||
int width;
|
||||
int height;
|
||||
CoglTexture2DEGLImageExternalAlloc alloc;
|
||||
CoglPixelFormat format;
|
||||
} egl_image_external;
|
||||
#endif
|
||||
struct {
|
||||
int width;
|
||||
|
@@ -160,6 +160,7 @@ _cogl_texture_free_loader (CoglTexture *texture)
|
||||
case COGL_TEXTURE_SOURCE_TYPE_SIZED:
|
||||
case COGL_TEXTURE_SOURCE_TYPE_EGL_IMAGE:
|
||||
case COGL_TEXTURE_SOURCE_TYPE_GL_FOREIGN:
|
||||
case COGL_TEXTURE_SOURCE_TYPE_EGL_IMAGE_EXTERNAL:
|
||||
break;
|
||||
case COGL_TEXTURE_SOURCE_TYPE_BITMAP:
|
||||
cogl_object_unref (loader->src.bitmap.bitmap);
|
||||
|
@@ -180,7 +180,7 @@ XVisualInfo *
|
||||
cogl_xlib_renderer_get_visual_info (CoglRenderer *renderer);
|
||||
|
||||
/**
|
||||
* cogl_xlib_renderer_request_reset_on_video_memory_purge:
|
||||
* cogl_xlib_renderer_request_reset_on_video_memory_purge: (skip)
|
||||
* @renderer: a #CoglRenderer
|
||||
* @enable: The new value
|
||||
*
|
||||
|
@@ -1307,7 +1307,7 @@ CoglMaterialWrapMode
|
||||
cogl_material_layer_get_wrap_mode_p (CoglMaterialLayer *layer);
|
||||
|
||||
/**
|
||||
* cogl_material_set_depth_state:
|
||||
* cogl_material_set_depth_state: (skip)
|
||||
* @material: A #CoglMaterial object
|
||||
* @state: A #CoglDepthState struct
|
||||
* @error: A #CoglError to report failures to setup the given @state.
|
||||
@@ -1334,7 +1334,7 @@ cogl_material_set_depth_state (CoglMaterial *material,
|
||||
CoglError **error);
|
||||
|
||||
/**
|
||||
* cogl_material_get_depth_state:
|
||||
* cogl_material_get_depth_state: (skip)
|
||||
* @material: A #CoglMaterial object
|
||||
* @state_out: A destination #CoglDepthState struct
|
||||
*
|
||||
@@ -1370,8 +1370,8 @@ typedef CoglBool (*CoglMaterialLayerCallback) (CoglMaterial *material,
|
||||
/**
|
||||
* cogl_material_foreach_layer:
|
||||
* @material: A #CoglMaterial object
|
||||
* @callback: A #CoglMaterialLayerCallback to be called for each layer
|
||||
* index
|
||||
* @callback: (scope call): A #CoglMaterialLayerCallback to be called for each
|
||||
* layer index
|
||||
* @user_data: Private data that will be passed to the callback
|
||||
*
|
||||
* Iterates all the layer indices of the given @material.
|
||||
|
@@ -46,11 +46,26 @@
|
||||
#include "cogl-error-private.h"
|
||||
#include "cogl-util-gl-private.h"
|
||||
|
||||
#if defined (COGL_HAS_EGL_SUPPORT)
|
||||
#include "cogl-egl-defines.h"
|
||||
# ifndef COGL_HAS_GLES2
|
||||
/* We need this define from GLES2, but can't include the header
|
||||
as its type definitions may conflict with the GL ones
|
||||
*/
|
||||
# define GL_TEXTURE_EXTERNAL_OES 0x8D65
|
||||
# endif
|
||||
#endif
|
||||
|
||||
void
|
||||
_cogl_texture_2d_gl_free (CoglTexture2D *tex_2d)
|
||||
{
|
||||
if (!tex_2d->is_foreign && tex_2d->gl_texture)
|
||||
_cogl_delete_gl_texture (tex_2d->gl_texture);
|
||||
|
||||
#if defined (COGL_HAS_EGL_SUPPORT)
|
||||
g_clear_pointer (&tex_2d->egl_image_external.user_data,
|
||||
tex_2d->egl_image_external.destroy);
|
||||
#endif
|
||||
}
|
||||
|
||||
CoglBool
|
||||
@@ -101,6 +116,9 @@ _cogl_texture_2d_gl_init (CoglTexture2D *tex_2d)
|
||||
/* Wrap mode not yet set */
|
||||
tex_2d->gl_legacy_texobj_wrap_mode_s = GL_FALSE;
|
||||
tex_2d->gl_legacy_texobj_wrap_mode_t = GL_FALSE;
|
||||
|
||||
tex_2d->egl_image_external.user_data = NULL;
|
||||
tex_2d->egl_image_external.destroy = NULL;
|
||||
}
|
||||
|
||||
static CoglBool
|
||||
@@ -439,6 +457,96 @@ allocate_from_gl_foreign (CoglTexture2D *tex_2d,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#if defined (COGL_HAS_EGL_SUPPORT)
|
||||
static CoglBool
|
||||
allocate_custom_egl_image_external (CoglTexture2D *tex_2d,
|
||||
CoglTextureLoader *loader,
|
||||
CoglError **error)
|
||||
{
|
||||
CoglTexture *tex = COGL_TEXTURE (tex_2d);
|
||||
CoglContext *ctx = tex->context;
|
||||
CoglPixelFormat internal_format = loader->src.egl_image_external.format;
|
||||
|
||||
_cogl_gl_util_clear_gl_errors (ctx);
|
||||
|
||||
GE (ctx, glActiveTexture (GL_TEXTURE0));
|
||||
GE (ctx, glGenTextures (1, &tex_2d->gl_texture));
|
||||
|
||||
GE (ctx, glBindTexture (GL_TEXTURE_EXTERNAL_OES,
|
||||
tex_2d->gl_texture));
|
||||
|
||||
if (_cogl_gl_util_get_error (ctx) != GL_NO_ERROR)
|
||||
{
|
||||
_cogl_set_error (error,
|
||||
COGL_TEXTURE_ERROR,
|
||||
COGL_TEXTURE_ERROR_BAD_PARAMETER,
|
||||
"Could not create a CoglTexture2D from a given "
|
||||
"EGLImage");
|
||||
GE( ctx, glDeleteTextures (1, &tex_2d->gl_texture) );
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
GE (ctx, glTexParameteri(GL_TEXTURE_EXTERNAL_OES,
|
||||
GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE));
|
||||
GE (ctx, glTexParameteri(GL_TEXTURE_EXTERNAL_OES,
|
||||
GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE));
|
||||
|
||||
if (!loader->src.egl_image_external.alloc (tex_2d,
|
||||
tex_2d->egl_image_external.user_data,
|
||||
error))
|
||||
{
|
||||
GE (ctx, glBindTexture (GL_TEXTURE_EXTERNAL_OES, 0));
|
||||
GE (ctx, glDeleteTextures (1, &tex_2d->gl_texture));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
GE (ctx, glBindTexture (GL_TEXTURE_EXTERNAL_OES, 0));
|
||||
|
||||
tex_2d->internal_format = internal_format;
|
||||
tex_2d->gl_target = GL_TEXTURE_EXTERNAL_OES;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
CoglTexture2D *
|
||||
cogl_texture_2d_new_from_egl_image_external (CoglContext *ctx,
|
||||
int width,
|
||||
int height,
|
||||
CoglTexture2DEGLImageExternalAlloc alloc,
|
||||
gpointer user_data,
|
||||
GDestroyNotify destroy,
|
||||
CoglError **error)
|
||||
{
|
||||
CoglTextureLoader *loader;
|
||||
CoglTexture2D *tex_2d;
|
||||
CoglPixelFormat internal_format = COGL_PIXEL_FORMAT_ANY;
|
||||
|
||||
_COGL_RETURN_VAL_IF_FAIL (_cogl_context_get_winsys (ctx)->constraints &
|
||||
COGL_RENDERER_CONSTRAINT_USES_EGL,
|
||||
NULL);
|
||||
|
||||
_COGL_RETURN_VAL_IF_FAIL (cogl_has_feature (ctx,
|
||||
COGL_FEATURE_ID_TEXTURE_EGL_IMAGE_EXTERNAL),
|
||||
NULL);
|
||||
|
||||
loader = _cogl_texture_create_loader ();
|
||||
loader->src_type = COGL_TEXTURE_SOURCE_TYPE_EGL_IMAGE_EXTERNAL;
|
||||
loader->src.egl_image_external.width = width;
|
||||
loader->src.egl_image_external.height = height;
|
||||
loader->src.egl_image_external.alloc = alloc;
|
||||
loader->src.egl_image_external.format = internal_format;
|
||||
|
||||
tex_2d = _cogl_texture_2d_create_base (ctx, width, height,
|
||||
internal_format, loader);
|
||||
|
||||
|
||||
tex_2d->egl_image_external.user_data = user_data;
|
||||
tex_2d->egl_image_external.destroy = destroy;
|
||||
|
||||
return tex_2d;
|
||||
}
|
||||
#endif /* defined (COGL_HAS_EGL_SUPPORT) */
|
||||
|
||||
CoglBool
|
||||
_cogl_texture_2d_gl_allocate (CoglTexture *tex,
|
||||
CoglError **error)
|
||||
@@ -462,6 +570,8 @@ _cogl_texture_2d_gl_allocate (CoglTexture *tex,
|
||||
#endif
|
||||
case COGL_TEXTURE_SOURCE_TYPE_GL_FOREIGN:
|
||||
return allocate_from_gl_foreign (tex_2d, loader, error);
|
||||
case COGL_TEXTURE_SOURCE_TYPE_EGL_IMAGE_EXTERNAL:
|
||||
return allocate_custom_egl_image_external (tex_2d, loader, error);
|
||||
}
|
||||
|
||||
g_return_val_if_reached (FALSE);
|
||||
|
@@ -48,6 +48,7 @@
|
||||
|
||||
#include "cogl-texture-pixmap-x11-private.h"
|
||||
#include "cogl-texture-2d-private.h"
|
||||
#include "cogl-texture-2d.h"
|
||||
#include "cogl-error-private.h"
|
||||
#include "cogl-poll-private.h"
|
||||
|
||||
@@ -290,6 +291,19 @@ error:
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static int
|
||||
_cogl_winsys_egl_add_config_attributes (CoglDisplay *display,
|
||||
CoglFramebufferConfig *config,
|
||||
EGLint *attributes)
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
attributes[i++] = EGL_SURFACE_TYPE;
|
||||
attributes[i++] = EGL_WINDOW_BIT;
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
static CoglBool
|
||||
_cogl_winsys_egl_display_setup (CoglDisplay *display,
|
||||
CoglError **error)
|
||||
@@ -728,12 +742,12 @@ _cogl_winsys_texture_pixmap_x11_create (CoglTexturePixmapX11 *tex_pixmap)
|
||||
COGL_PIXEL_FORMAT_RGB_888);
|
||||
|
||||
egl_tex_pixmap->texture = COGL_TEXTURE (
|
||||
_cogl_egl_texture_2d_new_from_image (ctx,
|
||||
tex->width,
|
||||
tex->height,
|
||||
texture_format,
|
||||
egl_tex_pixmap->image,
|
||||
NULL));
|
||||
cogl_egl_texture_2d_new_from_image (ctx,
|
||||
tex->width,
|
||||
tex->height,
|
||||
texture_format,
|
||||
egl_tex_pixmap->image,
|
||||
NULL));
|
||||
|
||||
tex_pixmap->winsys = egl_tex_pixmap;
|
||||
|
||||
@@ -794,6 +808,7 @@ _cogl_winsys_texture_pixmap_x11_get_texture (CoglTexturePixmapX11 *tex_pixmap,
|
||||
static const CoglWinsysEGLVtable
|
||||
_cogl_winsys_egl_vtable =
|
||||
{
|
||||
.add_config_attributes = _cogl_winsys_egl_add_config_attributes,
|
||||
.display_setup = _cogl_winsys_egl_display_setup,
|
||||
.display_destroy = _cogl_winsys_egl_display_destroy,
|
||||
.context_created = _cogl_winsys_egl_context_created,
|
||||
|
@@ -233,11 +233,11 @@ egl_attributes_from_framebuffer_config (CoglDisplay *display,
|
||||
CoglRendererEGL *egl_renderer = renderer->winsys;
|
||||
int i = 0;
|
||||
|
||||
/* Let the platform add attributes first */
|
||||
if (egl_renderer->platform_vtable->add_config_attributes)
|
||||
i = egl_renderer->platform_vtable->add_config_attributes (display,
|
||||
config,
|
||||
attributes);
|
||||
/* Let the platform add attributes first, including setting the
|
||||
* EGL_SURFACE_TYPE */
|
||||
i = egl_renderer->platform_vtable->add_config_attributes (display,
|
||||
config,
|
||||
attributes);
|
||||
|
||||
if (config->need_stencil)
|
||||
{
|
||||
@@ -269,9 +269,6 @@ egl_attributes_from_framebuffer_config (CoglDisplay *display,
|
||||
EGL_OPENGL_ES_BIT :
|
||||
EGL_OPENGL_ES2_BIT);
|
||||
|
||||
attributes[i++] = EGL_SURFACE_TYPE;
|
||||
attributes[i++] = EGL_WINDOW_BIT;
|
||||
|
||||
if (config->samples_per_pixel)
|
||||
{
|
||||
attributes[i++] = EGL_SAMPLE_BUFFERS;
|
||||
@@ -298,7 +295,7 @@ _cogl_winsys_egl_make_current (CoglDisplay *display,
|
||||
if (egl_display->current_draw_surface == draw &&
|
||||
egl_display->current_read_surface == read &&
|
||||
egl_display->current_context == context)
|
||||
return EGL_TRUE;
|
||||
return EGL_TRUE;
|
||||
|
||||
ret = eglMakeCurrent (egl_renderer->edpy,
|
||||
draw,
|
||||
@@ -1028,6 +1025,13 @@ _cogl_egl_create_image (CoglContext *ctx,
|
||||
if (target == EGL_NATIVE_PIXMAP_KHR)
|
||||
egl_ctx = EGL_NO_CONTEXT;
|
||||
else
|
||||
#endif
|
||||
#ifdef COGL_HAS_WAYLAND_EGL_SERVER_SUPPORT
|
||||
/* The WL_bind_wayland_display spec states that EGL_NO_CONTEXT is to be used
|
||||
* in conjunction with the EGL_WAYLAND_BUFFER_WL target */
|
||||
if (target == EGL_WAYLAND_BUFFER_WL)
|
||||
egl_ctx = EGL_NO_CONTEXT;
|
||||
else
|
||||
#endif
|
||||
egl_ctx = egl_display->egl_context;
|
||||
|
||||
|
@@ -2,6 +2,7 @@ NULL =
|
||||
|
||||
AM_CPPFLAGS = \
|
||||
-I$(top_srcdir) \
|
||||
-I$(top_builddir)/cogl \
|
||||
-DCOGL_DISABLE_DEPRECATED
|
||||
|
||||
test_conformance_CPPFLAGS = \
|
||||
|
77
configure.ac
77
configure.ac
@@ -1,7 +1,7 @@
|
||||
AC_PREREQ(2.62)
|
||||
|
||||
m4_define([mutter_major_version], [3])
|
||||
m4_define([mutter_minor_version], [21])
|
||||
m4_define([mutter_minor_version], [23])
|
||||
m4_define([mutter_micro_version], [3])
|
||||
|
||||
m4_define([mutter_version],
|
||||
@@ -43,9 +43,11 @@ GETTEXT_PACKAGE=mutter
|
||||
AC_SUBST(GETTEXT_PACKAGE)
|
||||
AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE",[Name of default gettext domain])
|
||||
|
||||
AM_GNU_GETTEXT_VERSION([0.19.6])
|
||||
AM_GNU_GETTEXT([external])
|
||||
|
||||
LT_PREREQ([2.2.6])
|
||||
LT_INIT([disable-static])
|
||||
IT_PROG_INTLTOOL([0.41])
|
||||
AC_PROG_CC
|
||||
AC_PROG_CC_C_O
|
||||
AC_PROG_INSTALL
|
||||
@@ -59,12 +61,15 @@ AM_PATH_GLIB_2_0([2.49.0])
|
||||
CANBERRA_GTK=libcanberra-gtk3
|
||||
CANBERRA_GTK_VERSION=0.26
|
||||
|
||||
LIBWACOM_VERSION=0.13
|
||||
|
||||
MUTTER_PC_MODULES="
|
||||
egl
|
||||
gtk+-3.0 >= 3.19.8
|
||||
gio-unix-2.0 >= 2.35.1
|
||||
pango >= 1.2.0
|
||||
cairo >= 1.10.0
|
||||
gsettings-desktop-schemas >= 3.19.3
|
||||
gsettings-desktop-schemas >= 3.21.4
|
||||
json-glib-1.0
|
||||
upower-glib >= 0.99.0
|
||||
gnome-desktop-3.0
|
||||
@@ -81,6 +86,7 @@ MUTTER_PC_MODULES="
|
||||
xrender
|
||||
x11-xcb
|
||||
xcb-randr
|
||||
xcb-res
|
||||
"
|
||||
|
||||
GLIB_GSETTINGS
|
||||
@@ -109,6 +115,16 @@ AC_ARG_WITH(libcanberra,
|
||||
[disable the use of libcanberra for playing sounds]),,
|
||||
with_libcanberra=auto)
|
||||
|
||||
AC_ARG_WITH(libwacom,
|
||||
AC_HELP_STRING([--without-libwacom],
|
||||
[disable the use of libwacom for advanced tablet management]),,
|
||||
with_libwacom=auto)
|
||||
|
||||
AC_ARG_WITH(gudev,
|
||||
AC_HELP_STRING([--without-gudev],
|
||||
[disable the use of gudev for device type detection]),,
|
||||
with_gudev=auto)
|
||||
|
||||
AC_ARG_WITH([xwayland-path],
|
||||
[AS_HELP_STRING([--with-xwayland-path], [Absolute path for an X Wayland server])],
|
||||
[XWAYLAND_PATH="$withval"],
|
||||
@@ -170,6 +186,42 @@ else
|
||||
fi
|
||||
fi
|
||||
|
||||
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_VERSION; then
|
||||
have_libwacom=yes
|
||||
AC_MSG_RESULT(yes)
|
||||
MUTTER_PC_MODULES="$MUTTER_PC_MODULES libwacom"
|
||||
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
|
||||
|
||||
have_gudev=no
|
||||
AC_MSG_CHECKING([gudev])
|
||||
if test x$with_gudev = xno ; then
|
||||
AC_MSG_RESULT([disabled])
|
||||
else
|
||||
if $PKG_CONFIG --exists gudev-1.0; then
|
||||
have_gudev=yes
|
||||
AC_MSG_RESULT(yes)
|
||||
MUTTER_PC_MODULES="$MUTTER_PC_MODULES gudev-1.0"
|
||||
AC_DEFINE([HAVE_LIBGUDEV], 1, [Building with gudev for device type detection])
|
||||
else
|
||||
AC_MSG_RESULT(no)
|
||||
if test x$with_gudev = xyes ; then
|
||||
AC_MSG_ERROR([gudev forced but not found])
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
INTROSPECTION_VERSION=0.9.5
|
||||
GOBJECT_INTROSPECTION_CHECK([$INTROSPECTION_VERSION])
|
||||
|
||||
@@ -189,12 +241,13 @@ AC_SUBST(XWAYLAND_PATH)
|
||||
|
||||
PKG_CHECK_MODULES(MUTTER, $MUTTER_PC_MODULES)
|
||||
|
||||
MUTTER_NATIVE_BACKEND_MODULES="libdrm libsystemd libinput gudev-1.0 gbm >= 10.3"
|
||||
MUTTER_NATIVE_BACKEND_MODULES="libdrm libsystemd 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]),,
|
||||
enable_native_backend=auto
|
||||
)
|
||||
have_native_backend="no"
|
||||
AS_IF([test "$enable_native_backend" = "yes"], [have_native_backend=yes],
|
||||
[test "$enable_native_backend" = "auto"], PKG_CHECK_EXISTS([$MUTTER_NATIVE_BACKEND_MODULES], [have_native_backend=yes]))
|
||||
|
||||
@@ -204,6 +257,15 @@ AS_IF([test "$have_native_backend" = "yes"], [
|
||||
])
|
||||
AM_CONDITIONAL([HAVE_NATIVE_BACKEND],[test "$have_native_backend" = "yes"])
|
||||
|
||||
AC_ARG_ENABLE(egl-device,
|
||||
AS_HELP_STRING([--enable-egl-device], [enable support for EGLDevice on top of KMS]),
|
||||
enable_egl_device=yes,
|
||||
enable_egl_device=no
|
||||
)
|
||||
AS_IF([test "$enable_egl_device" = "yes"], [
|
||||
AC_DEFINE([HAVE_EGL_DEVICE],[1], [Defined if EGLDevice support is enabled])
|
||||
])
|
||||
|
||||
MUTTER_WAYLAND_MODULES="wayland-server >= 1.6.90"
|
||||
|
||||
AC_ARG_ENABLE(wayland,
|
||||
@@ -221,7 +283,7 @@ 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.1],
|
||||
PKG_CHECK_MODULES(WAYLAND_PROTOCOLS, [wayland-protocols >= 1.7],
|
||||
[ac_wayland_protocols_pkgdatadir=`$PKG_CONFIG --variable=pkgdatadir wayland-protocols`])
|
||||
AC_SUBST(WAYLAND_PROTOCOLS_DATADIR, $ac_wayland_protocols_pkgdatadir)
|
||||
])
|
||||
@@ -325,6 +387,8 @@ AC_CHECK_DECL([GL_EXT_x11_sync_object],
|
||||
[AC_MSG_ERROR([GL_EXT_x11_sync_object definition not found, please update your GL headers])],
|
||||
[#include <GL/glx.h>])
|
||||
|
||||
AC_PATH_PROG([CVT],[cvt],[])
|
||||
|
||||
#### Warnings (last since -Werror can disturb other tests)
|
||||
|
||||
# Stay command-line compatible with the gnome-common configure option. Here
|
||||
@@ -423,10 +487,13 @@ mutter-$VERSION
|
||||
|
||||
Startup notification: ${have_startup_notification}
|
||||
libcanberra: ${have_libcanberra}
|
||||
libwacom: ${have_libwacom}
|
||||
gudev ${have_gudev}
|
||||
Introspection: ${found_introspection}
|
||||
Session management: ${found_sm}
|
||||
Wayland: ${have_wayland}
|
||||
Native (KMS) backend: ${have_native_backend}
|
||||
EGLDevice: ${enable_egl_device}
|
||||
"
|
||||
|
||||
|
||||
|
@@ -1,140 +1,140 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<KeyListEntries schema="org.gnome.desktop.wm.keybindings"
|
||||
group="system"
|
||||
_name="Navigation"
|
||||
name="Navigation"
|
||||
wm_name="Mutter"
|
||||
package="mutter">
|
||||
|
||||
<KeyListEntry name="move-to-workspace-1"
|
||||
_description="Move window to workspace 1" />
|
||||
description="Move window to workspace 1" />
|
||||
|
||||
<KeyListEntry name="move-to-workspace-2"
|
||||
_description="Move window to workspace 2" />
|
||||
description="Move window to workspace 2" />
|
||||
|
||||
<KeyListEntry name="move-to-workspace-3"
|
||||
_description="Move window to workspace 3" />
|
||||
description="Move window to workspace 3" />
|
||||
|
||||
<KeyListEntry name="move-to-workspace-4"
|
||||
_description="Move window to workspace 4" />
|
||||
description="Move window to workspace 4" />
|
||||
|
||||
<KeyListEntry name="move-to-workspace-last"
|
||||
_description="Move window to last workspace" />
|
||||
description="Move window to last workspace" />
|
||||
|
||||
<KeyListEntry name="move-to-workspace-left"
|
||||
_description="Move window one workspace to the left" />
|
||||
description="Move window one workspace to the left" />
|
||||
|
||||
<KeyListEntry name="move-to-workspace-right"
|
||||
_description="Move window one workspace to the right" />
|
||||
description="Move window one workspace to the right" />
|
||||
|
||||
<KeyListEntry name="move-to-workspace-up"
|
||||
_description="Move window one workspace up" />
|
||||
description="Move window one workspace up" />
|
||||
|
||||
<KeyListEntry name="move-to-workspace-down"
|
||||
_description="Move window one workspace down" />
|
||||
description="Move window one workspace down" />
|
||||
|
||||
<KeyListEntry name="move-to-monitor-left"
|
||||
_description="Move window one monitor to the left" />
|
||||
description="Move window one monitor to the left" />
|
||||
|
||||
<KeyListEntry name="move-to-monitor-right"
|
||||
_description="Move window one monitor to the right" />
|
||||
description="Move window one monitor to the right" />
|
||||
|
||||
<KeyListEntry name="move-to-monitor-up"
|
||||
_description="Move window one monitor up" />
|
||||
description="Move window one monitor up" />
|
||||
|
||||
<KeyListEntry name="move-to-monitor-down"
|
||||
_description="Move window one monitor down" />
|
||||
description="Move window one monitor down" />
|
||||
|
||||
<KeyListEntry name="switch-applications"
|
||||
reverse-entry="switch-applications-backward"
|
||||
_description="Switch applications"/>
|
||||
description="Switch applications"/>
|
||||
|
||||
<KeyListEntry name="switch-applications-backward"
|
||||
reverse-entry="switch-applications"
|
||||
hidden="true"
|
||||
_description="Switch to previous application"/>
|
||||
description="Switch to previous application"/>
|
||||
|
||||
<KeyListEntry name="switch-windows"
|
||||
reverse-entry="switch-windows-backward"
|
||||
_description="Switch windows"/>
|
||||
description="Switch windows"/>
|
||||
|
||||
<KeyListEntry name="switch-windows-backward"
|
||||
reverse-entry="switch-windows"
|
||||
hidden="true"
|
||||
_description="Switch to previous window"/>
|
||||
description="Switch to previous window"/>
|
||||
|
||||
<KeyListEntry name="switch-group"
|
||||
reverse-entry="switch-group-backward"
|
||||
_description="Switch windows of an application"/>
|
||||
description="Switch windows of an application"/>
|
||||
|
||||
<KeyListEntry name="switch-group-backward"
|
||||
reverse-entry="switch-group"
|
||||
hidden="true"
|
||||
_description="Switch to previous window of an application"/>
|
||||
description="Switch to previous window of an application"/>
|
||||
|
||||
<KeyListEntry name="switch-panels"
|
||||
reverse-entry="switch-panels-backward"
|
||||
_description="Switch system controls"/>
|
||||
description="Switch system controls"/>
|
||||
|
||||
<KeyListEntry name="switch-panels-backward"
|
||||
reverse-entry="switch-panels"
|
||||
hidden="true"
|
||||
_description="Switch to previous system control"/>
|
||||
description="Switch to previous system control"/>
|
||||
|
||||
<KeyListEntry name="cycle-windows"
|
||||
reverse-entry="cycle-windows-backward"
|
||||
_description="Switch windows directly"/>
|
||||
description="Switch windows directly"/>
|
||||
|
||||
<KeyListEntry name="cycle-windows-backward"
|
||||
reverse-entry="cycle-windows"
|
||||
hidden="true"
|
||||
_description="Switch directly to previous window"/>
|
||||
description="Switch directly to previous window"/>
|
||||
|
||||
<KeyListEntry name="cycle-group"
|
||||
reverse-entry="cycle-group-backward"
|
||||
_description="Switch windows of an app directly"/>
|
||||
description="Switch windows of an app directly"/>
|
||||
|
||||
<KeyListEntry name="cycle-group-backward"
|
||||
reverse-entry="cycle-group"
|
||||
hidden="true"
|
||||
_description="Switch directly to previous window of an app"/>
|
||||
description="Switch directly to previous window of an app"/>
|
||||
|
||||
<KeyListEntry name="cycle-panels"
|
||||
reverse-entry="cycle-panels-backward"
|
||||
_description="Switch system controls directly"/>
|
||||
description="Switch system controls directly"/>
|
||||
|
||||
<KeyListEntry name="cycle-panels-backward"
|
||||
reverse-entry="cycle-panels"
|
||||
hidden="true"
|
||||
_description="Switch directly to previous system control"/>
|
||||
description="Switch directly to previous system control"/>
|
||||
|
||||
<KeyListEntry name="show-desktop"
|
||||
_description="Hide all normal windows"/>
|
||||
description="Hide all normal windows"/>
|
||||
|
||||
<KeyListEntry name="switch-to-workspace-1"
|
||||
_description="Switch to workspace 1" />
|
||||
description="Switch to workspace 1" />
|
||||
|
||||
<KeyListEntry name="switch-to-workspace-2"
|
||||
_description="Switch to workspace 2" />
|
||||
description="Switch to workspace 2" />
|
||||
|
||||
<KeyListEntry name="switch-to-workspace-3"
|
||||
_description="Switch to workspace 3" />
|
||||
description="Switch to workspace 3" />
|
||||
|
||||
<KeyListEntry name="switch-to-workspace-4"
|
||||
_description="Switch to workspace 4" />
|
||||
description="Switch to workspace 4" />
|
||||
|
||||
<KeyListEntry name="switch-to-workspace-last"
|
||||
_description="Switch to last workspace" />
|
||||
description="Switch to last workspace" />
|
||||
|
||||
<KeyListEntry name="switch-to-workspace-left"
|
||||
_description="Move to workspace left" />
|
||||
description="Move to workspace left" />
|
||||
|
||||
<KeyListEntry name="switch-to-workspace-right"
|
||||
_description="Move to workspace right" />
|
||||
description="Move to workspace right" />
|
||||
|
||||
<KeyListEntry name="switch-to-workspace-up"
|
||||
_description="Move to workspace above" />
|
||||
description="Move to workspace above" />
|
||||
|
||||
<KeyListEntry name="switch-to-workspace-down"
|
||||
_description="Move to workspace below" />
|
||||
description="Move to workspace below" />
|
||||
|
||||
</KeyListEntries>
|
@@ -1,13 +1,13 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<KeyListEntries schema="org.gnome.desktop.wm.keybindings"
|
||||
group="system"
|
||||
_name="System"
|
||||
name="System"
|
||||
wm_name="Mutter"
|
||||
package="mutter">
|
||||
|
||||
<KeyListEntry name="panel-run-dialog" _description="Show the run command prompt"/>
|
||||
<KeyListEntry name="panel-run-dialog" description="Show the run command prompt"/>
|
||||
|
||||
<KeyListEntry name="panel-main-menu" _description="Show the activities overview"/>
|
||||
<KeyListEntry name="panel-main-menu" description="Show the activities overview"/>
|
||||
|
||||
</KeyListEntries>
|
||||
|
50
data/50-mutter-windows.xml
Normal file
50
data/50-mutter-windows.xml
Normal file
@@ -0,0 +1,50 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<KeyListEntries schema="org.gnome.desktop.wm.keybindings"
|
||||
group="system"
|
||||
name="Windows"
|
||||
wm_name="Mutter"
|
||||
package="mutter">
|
||||
|
||||
<KeyListEntry name="activate-window-menu" description="Activate the window menu"/>
|
||||
|
||||
<KeyListEntry name="toggle-fullscreen" description="Toggle fullscreen mode"/>
|
||||
|
||||
<KeyListEntry name="toggle-maximized" description="Toggle maximization state"/>
|
||||
|
||||
<KeyListEntry name="maximize" description="Maximize window"/>
|
||||
|
||||
<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"/>
|
||||
|
||||
<KeyListEntry name="begin-move" description="Move window"/>
|
||||
|
||||
<KeyListEntry name="begin-resize" description="Resize window"/>
|
||||
|
||||
<KeyListEntry name="toggle-on-all-workspaces"
|
||||
description="Toggle window on all workspaces or one"/>
|
||||
|
||||
<KeyListEntry name="raise-or-lower" description="Raise window if covered, otherwise lower it"/>
|
||||
|
||||
<KeyListEntry name="raise" description="Raise window above other windows"/>
|
||||
|
||||
<KeyListEntry name="lower" description="Lower window below other windows"/>
|
||||
|
||||
<KeyListEntry name="maximize-vertically" description="Maximize window vertically"/>
|
||||
|
||||
<KeyListEntry name="maximize-horizontally" description="Maximize window horizontally"/>
|
||||
|
||||
<KeyListEntry name="toggle-tiled-left"
|
||||
schema="org.gnome.mutter.keybindings"
|
||||
description="View split on left"/>
|
||||
|
||||
<KeyListEntry name="toggle-tiled-right"
|
||||
schema="org.gnome.mutter.keybindings"
|
||||
description="View split on right"/>
|
||||
|
||||
</KeyListEntries>
|
||||
|
@@ -1,50 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<KeyListEntries schema="org.gnome.desktop.wm.keybindings"
|
||||
group="system"
|
||||
_name="Windows"
|
||||
wm_name="Mutter"
|
||||
package="mutter">
|
||||
|
||||
<KeyListEntry name="activate-window-menu" _description="Activate the window menu"/>
|
||||
|
||||
<KeyListEntry name="toggle-fullscreen" _description="Toggle fullscreen mode"/>
|
||||
|
||||
<KeyListEntry name="toggle-maximized" _description="Toggle maximization state"/>
|
||||
|
||||
<KeyListEntry name="maximize" _description="Maximize window"/>
|
||||
|
||||
<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"/>
|
||||
|
||||
<KeyListEntry name="begin-move" _description="Move window"/>
|
||||
|
||||
<KeyListEntry name="begin-resize" _description="Resize window"/>
|
||||
|
||||
<KeyListEntry name="toggle-on-all-workspaces"
|
||||
_description="Toggle window on all workspaces or one"/>
|
||||
|
||||
<KeyListEntry name="raise-or-lower" _description="Raise window if covered, otherwise lower it"/>
|
||||
|
||||
<KeyListEntry name="raise" _description="Raise window above other windows"/>
|
||||
|
||||
<KeyListEntry name="lower" _description="Lower window below other windows"/>
|
||||
|
||||
<KeyListEntry name="maximize-vertically" _description="Maximize window vertically"/>
|
||||
|
||||
<KeyListEntry name="maximize-horizontally" _description="Maximize window horizontally"/>
|
||||
|
||||
<KeyListEntry name="toggle-tiled-left"
|
||||
schema="org.gnome.mutter.keybindings"
|
||||
_description="View split on left"/>
|
||||
|
||||
<KeyListEntry name="toggle-tiled-right"
|
||||
schema="org.gnome.mutter.keybindings"
|
||||
_description="View split on right"/>
|
||||
|
||||
</KeyListEntries>
|
||||
|
@@ -3,21 +3,24 @@ desktopfiles_in_files = \
|
||||
desktopfilesdir = $(datadir)/applications
|
||||
desktopfiles_DATA = $(desktopfiles_in_files:.desktop.in=.desktop)
|
||||
|
||||
@INTLTOOL_DESKTOP_RULE@
|
||||
%.desktop:%.desktop.in
|
||||
$(AM_V_GET) $(MSGFMT) --desktop --template $< -d $(top_srcdir)/po -o $@
|
||||
|
||||
xml_in_files = \
|
||||
50-mutter-navigation.xml.in \
|
||||
50-mutter-system.xml.in \
|
||||
50-mutter-windows.xml.in
|
||||
xmldir = $(GNOME_KEYBINDINGS_KEYSDIR)
|
||||
xml_DATA = $(xml_in_files:.xml.in=.xml)
|
||||
xml_DATA = \
|
||||
50-mutter-navigation.xml \
|
||||
50-mutter-system.xml \
|
||||
50-mutter-windows.xml
|
||||
|
||||
gschema_in_files = \
|
||||
org.gnome.mutter.gschema.xml.in \
|
||||
org.gnome.mutter.wayland.gschema.xml.in
|
||||
gsettings_SCHEMAS = $(gschema_in_files:.xml.in=.xml)
|
||||
|
||||
@INTLTOOL_XML_NOMERGE_RULE@
|
||||
%.gschema.xml: %.gschema.xml.in Makefile
|
||||
$(AM_V_GEN) sed -e 's|@GETTEXT_DOMAIN[@]|$(GETTEXT_DOMAIN)|g' \
|
||||
$< > $@ || rm $@
|
||||
|
||||
@GSETTINGS_RULES@
|
||||
|
||||
convertdir = $(datadir)/GConf/gsettings
|
||||
@@ -25,11 +28,10 @@ convert_DATA = mutter-schemas.convert
|
||||
|
||||
CLEANFILES = \
|
||||
$(desktopfiles_DATA) \
|
||||
$(gsettings_SCHEMAS) \
|
||||
$(xml_DATA)
|
||||
$(gsettings_SCHEMAS)
|
||||
|
||||
EXTRA_DIST = \
|
||||
$(convert_DATA) \
|
||||
$(desktopfiles_in_files) \
|
||||
$(gschema_in_files) \
|
||||
$(xml_in_files)
|
||||
$(xml_DATA)
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[Desktop Entry]
|
||||
Type=Application
|
||||
_Name=Mutter
|
||||
Name=Mutter
|
||||
Exec=mutter
|
||||
NoDisplay=true
|
||||
# name of loadable control center module
|
||||
|
@@ -4,102 +4,102 @@
|
||||
|
||||
<key name="overlay-key" type="s">
|
||||
<default>'Super_L'</default>
|
||||
<_summary>Modifier to use for extended window management operations</_summary>
|
||||
<_description>
|
||||
<summary>Modifier to use for extended window management operations</summary>
|
||||
<description>
|
||||
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.
|
||||
</_description>
|
||||
</description>
|
||||
</key>
|
||||
|
||||
<key name="attach-modal-dialogs" type="b">
|
||||
<default>false</default>
|
||||
<_summary>Attach modal dialogs</_summary>
|
||||
<_description>
|
||||
<summary>Attach modal dialogs</summary>
|
||||
<description>
|
||||
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.
|
||||
</_description>
|
||||
</description>
|
||||
</key>
|
||||
|
||||
<key name="edge-tiling" type="b">
|
||||
<default>false</default>
|
||||
<_summary>Enable edge tiling when dropping windows on screen edges</_summary>
|
||||
<_description>
|
||||
<summary>Enable edge tiling when dropping windows on screen edges</summary>
|
||||
<description>
|
||||
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.
|
||||
</_description>
|
||||
</description>
|
||||
</key>
|
||||
|
||||
<key name="dynamic-workspaces" type="b">
|
||||
<default>false</default>
|
||||
<_summary>Workspaces are managed dynamically</_summary>
|
||||
<_description>
|
||||
<summary>Workspaces are managed dynamically</summary>
|
||||
<description>
|
||||
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).
|
||||
</_description>
|
||||
</description>
|
||||
</key>
|
||||
|
||||
<key name="workspaces-only-on-primary" type="b">
|
||||
<default>false</default>
|
||||
<_summary>Workspaces only on primary</_summary>
|
||||
<_description>
|
||||
<summary>Workspaces only on primary</summary>
|
||||
<description>
|
||||
Determines whether workspace switching should happen for windows
|
||||
on all monitors or only for windows on the primary monitor.
|
||||
</_description>
|
||||
</description>
|
||||
</key>
|
||||
|
||||
<key name="no-tab-popup" type="b">
|
||||
<default>false</default>
|
||||
<_summary>No tab popup</_summary>
|
||||
<_description>
|
||||
<summary>No tab popup</summary>
|
||||
<description>
|
||||
Determines whether the use of popup and highlight frame should
|
||||
be disabled for window cycling.
|
||||
</_description>
|
||||
</description>
|
||||
</key>
|
||||
|
||||
<key name="focus-change-on-pointer-rest" type="b">
|
||||
<default>false</default>
|
||||
<_summary>Delay focus changes until the pointer stops moving</_summary>
|
||||
<_description>
|
||||
<summary>Delay focus changes until the pointer stops moving</summary>
|
||||
<description>
|
||||
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.
|
||||
</_description>
|
||||
</description>
|
||||
</key>
|
||||
|
||||
<key name="draggable-border-width" type="i">
|
||||
<default>10</default>
|
||||
<range min="0" max="64"/>
|
||||
<_summary>Draggable border width</_summary>
|
||||
<_description>
|
||||
<summary>Draggable border width</summary>
|
||||
<description>
|
||||
The amount of total draggable borders. If the theme's visible
|
||||
borders are not enough, invisible borders will be added to meet
|
||||
this value.
|
||||
</_description>
|
||||
</description>
|
||||
</key>
|
||||
|
||||
<key name="auto-maximize" type="b">
|
||||
<default>true</default>
|
||||
<_summary>Auto maximize nearly monitor sized windows</_summary>
|
||||
<_description>
|
||||
<summary>Auto maximize nearly monitor sized windows</summary>
|
||||
<description>
|
||||
If enabled, new windows that are initially the size of the monitor
|
||||
automatically get maximized.
|
||||
</_description>
|
||||
</description>
|
||||
</key>
|
||||
|
||||
<key name="center-new-windows" type="b">
|
||||
<default>false</default>
|
||||
<_summary>Place new windows in the center</_summary>
|
||||
<_description>
|
||||
<summary>Place new windows in the center</summary>
|
||||
<description>
|
||||
When true, the new windows will always be put in the center of the
|
||||
active screen of the monitor.
|
||||
</_description>
|
||||
</description>
|
||||
</key>
|
||||
|
||||
<child name="keybindings" schema="org.gnome.mutter.keybindings"/>
|
||||
@@ -117,12 +117,12 @@
|
||||
|
||||
<key name="tab-popup-select" type="as">
|
||||
<default>[]</default>
|
||||
<_summary>Select window from tab popup</_summary>
|
||||
<summary>Select window from tab popup</summary>
|
||||
</key>
|
||||
|
||||
<key name="tab-popup-cancel" type="as">
|
||||
<default>[]</default>
|
||||
<_summary>Cancel tab popup</_summary>
|
||||
<summary>Cancel tab popup</summary>
|
||||
</key>
|
||||
|
||||
</schema>
|
||||
|
@@ -3,51 +3,51 @@
|
||||
gettext-domain="@GETTEXT_DOMAIN@">
|
||||
<key name="switch-to-session-1" type="as">
|
||||
<default><![CDATA[['<Primary><Alt>F1']]]></default>
|
||||
<_summary>Switch to VT 1</_summary>
|
||||
<summary>Switch to VT 1</summary>
|
||||
</key>
|
||||
<key name="switch-to-session-2" type="as">
|
||||
<default><![CDATA[['<Primary><Alt>F2']]]></default>
|
||||
<_summary>Switch to VT 2</_summary>
|
||||
<summary>Switch to VT 2</summary>
|
||||
</key>
|
||||
<key name="switch-to-session-3" type="as">
|
||||
<default><![CDATA[['<Primary><Alt>F3']]]></default>
|
||||
<_summary>Switch to VT 3</_summary>
|
||||
<summary>Switch to VT 3</summary>
|
||||
</key>
|
||||
<key name="switch-to-session-4" type="as">
|
||||
<default><![CDATA[['<Primary><Alt>F4']]]></default>
|
||||
<_summary>Switch to VT 4</_summary>
|
||||
<summary>Switch to VT 4</summary>
|
||||
</key>
|
||||
<key name="switch-to-session-5" type="as">
|
||||
<default><![CDATA[['<Primary><Alt>F5']]]></default>
|
||||
<_summary>Switch to VT 5</_summary>
|
||||
<summary>Switch to VT 5</summary>
|
||||
</key>
|
||||
<key name="switch-to-session-6" type="as">
|
||||
<default><![CDATA[['<Primary><Alt>F6']]]></default>
|
||||
<_summary>Switch to VT 6</_summary>
|
||||
<summary>Switch to VT 6</summary>
|
||||
</key>
|
||||
<key name="switch-to-session-7" type="as">
|
||||
<default><![CDATA[['<Primary><Alt>F7']]]></default>
|
||||
<_summary>Switch to VT 7</_summary>
|
||||
<summary>Switch to VT 7</summary>
|
||||
</key>
|
||||
<key name="switch-to-session-8" type="as">
|
||||
<default><![CDATA[['<Primary><Alt>F8']]]></default>
|
||||
<_summary>Switch to VT 8</_summary>
|
||||
<summary>Switch to VT 8</summary>
|
||||
</key>
|
||||
<key name="switch-to-session-9" type="as">
|
||||
<default><![CDATA[['<Primary><Alt>F9']]]></default>
|
||||
<_summary>Switch to VT 9</_summary>
|
||||
<summary>Switch to VT 9</summary>
|
||||
</key>
|
||||
<key name="switch-to-session-10" type="as">
|
||||
<default><![CDATA[['<Primary><Alt>F10']]]></default>
|
||||
<_summary>Switch to VT 10</_summary>
|
||||
<summary>Switch to VT 10</summary>
|
||||
</key>
|
||||
<key name="switch-to-session-11" type="as">
|
||||
<default><![CDATA[['<Primary><Alt>F11']]]></default>
|
||||
<_summary>Switch to VT 11</_summary>
|
||||
<summary>Switch to VT 11</summary>
|
||||
</key>
|
||||
<key name="switch-to-session-12" type="as">
|
||||
<default><![CDATA[['<Primary><Alt>F12']]]></default>
|
||||
<_summary>Switch to VT 12</_summary>
|
||||
<summary>Switch to VT 12</summary>
|
||||
</key>
|
||||
</schema>
|
||||
</schemalist>
|
||||
|
68
po/Makevars
Normal file
68
po/Makevars
Normal file
@@ -0,0 +1,68 @@
|
||||
# Makefile variables for PO directory in any package using GNU gettext.
|
||||
|
||||
# Usually the message domain is the same as the package name.
|
||||
DOMAIN = $(PACKAGE)
|
||||
|
||||
# These two variables depend on the location of this directory.
|
||||
subdir = po
|
||||
top_builddir = ..
|
||||
|
||||
# These options get passed to xgettext.
|
||||
XGETTEXT_OPTIONS = --from-code=UTF-8 --keyword=_ --keyword=N_ \
|
||||
--keyword=C_:1c,2 --keyword=NC_:1c,2 \
|
||||
--keyword=g_dngettext:2,3 --add-comments \
|
||||
--flag=g_dngettext:2:pass-c-format \
|
||||
--flag=g_strdup_printf:1:c-format \
|
||||
--flag=g_string_printf:2:c-format \
|
||||
--flag=g_string_append_printf:2:c-format \
|
||||
--flag=g_error_new:3:c-format \
|
||||
--flag=g_set_error:4:c-format \
|
||||
--flag=g_markup_printf_escaped:1:c-format \
|
||||
--flag=g_log:3:c-format \
|
||||
--flag=g_print:1:c-format \
|
||||
--flag=g_printerr:1:c-format \
|
||||
--flag=g_printf:1:c-format \
|
||||
--flag=g_fprintf:2:c-format \
|
||||
--flag=g_sprintf:2:c-format \
|
||||
--flag=g_snprintf:3:c-format
|
||||
|
||||
|
||||
# This is the copyright holder that gets inserted into the header of the
|
||||
# $(DOMAIN).pot file. Set this to the copyright holder of the surrounding
|
||||
# package. (Note that the msgstr strings, extracted from the package's
|
||||
# sources, belong to the copyright holder of the package.) Translators are
|
||||
# expected to transfer the copyright for their translations to this person
|
||||
# or entity, or to disclaim their copyright. The empty string stands for
|
||||
# the public domain; in this case the translators are expected to disclaim
|
||||
# their copyright.
|
||||
COPYRIGHT_HOLDER = Translation copyright holder
|
||||
# This is the email address or URL to which the translators shall report
|
||||
# bugs in the untranslated strings:
|
||||
# - Strings which are not entire sentences, see the maintainer guidelines
|
||||
# in the GNU gettext documentation, section 'Preparing Strings'.
|
||||
# - Strings which use unclear terms or require additional context to be
|
||||
# understood.
|
||||
# - Strings which make invalid assumptions about notation of date, time or
|
||||
# money.
|
||||
# - Pluralisation problems.
|
||||
# - Incorrect English spelling.
|
||||
# - Incorrect formatting.
|
||||
# It can be your email address, or a mailing list address where translators
|
||||
# can write to without being subscribed, or the URL of a web page through
|
||||
# which the translators can contact you.
|
||||
MSGID_BUGS_ADDRESS = http://bugzilla.gnome.org/enter_bug.cgi?product=mutter&keywords=I18N+L10N&component=general
|
||||
|
||||
# This is the list of locale categories, beyond LC_MESSAGES, for which the
|
||||
# message catalogs shall be used. It is usually empty.
|
||||
EXTRA_LOCALE_CATEGORIES =
|
||||
|
||||
# Ignore the timestamp of the .pot file, as git clones do not have
|
||||
# deterministic timestamps, and .po files are updated by translators
|
||||
# (only) in GNOME projects.
|
||||
PO_DEPENDS_ON_POT = no
|
||||
|
||||
# This tells whether or not to forcibly update $(DOMAIN).pot and
|
||||
# regenerate PO files on "make dist". Possible values are "yes" and
|
||||
# "no". Set this to no if the POT file and PO files are maintained
|
||||
# externally.
|
||||
DIST_DEPENDS_ON_UPDATE_PO = no
|
@@ -1,11 +1,12 @@
|
||||
# List of source files containing translatable strings.
|
||||
# Please keep this file sorted alphabetically.
|
||||
data/50-mutter-navigation.xml.in
|
||||
data/50-mutter-system.xml.in
|
||||
data/50-mutter-windows.xml.in
|
||||
data/50-mutter-navigation.xml
|
||||
data/50-mutter-system.xml
|
||||
data/50-mutter-windows.xml
|
||||
data/mutter.desktop.in
|
||||
data/org.gnome.mutter.gschema.xml.in
|
||||
data/org.gnome.mutter.wayland.gschema.xml.in
|
||||
src/backends/meta-input-settings.c
|
||||
src/backends/meta-monitor-manager.c
|
||||
src/compositor/compositor.c
|
||||
src/compositor/meta-background.c
|
||||
@@ -23,6 +24,7 @@ src/core/util.c
|
||||
src/core/window.c
|
||||
src/ui/frames.c
|
||||
src/ui/theme.c
|
||||
src/wayland/meta-wayland-tablet-pad.c
|
||||
src/x11/session.c
|
||||
src/x11/window-props.c
|
||||
src/x11/xprops.c
|
||||
|
@@ -1,13 +1,12 @@
|
||||
# List of source files that should NOT be translated.
|
||||
# Please keep this file sorted alphabetically.
|
||||
|
||||
clutter/clutter/clutter-actor-meta.c
|
||||
clutter/clutter/clutter-actor.c
|
||||
clutter/clutter/clutter-actor-meta.c
|
||||
clutter/clutter/clutter-align-constraint.c
|
||||
clutter/clutter/clutter-backend.c
|
||||
clutter/clutter/clutter-bin-layout.c
|
||||
clutter/clutter/clutter-bind-constraint.c
|
||||
clutter/clutter/clutter-binding-pool.c
|
||||
clutter/clutter/clutter-bin-layout.c
|
||||
clutter/clutter/clutter-box-layout.c
|
||||
clutter/clutter/clutter-brightness-contrast-effect.c
|
||||
clutter/clutter/clutter-canvas.c
|
||||
@@ -52,17 +51,18 @@ clutter/clutter/clutter-text.c
|
||||
clutter/clutter/clutter-timeline.c
|
||||
clutter/clutter/clutter-transition.c
|
||||
clutter/clutter/clutter-units.c
|
||||
clutter/clutter/clutter-virtual-input-device.c
|
||||
clutter/clutter/clutter-zoom-action.c
|
||||
clutter/clutter/deprecated/clutter-alpha.c
|
||||
clutter/clutter/deprecated/clutter-animation.c
|
||||
clutter/clutter/deprecated/clutter-animator.c
|
||||
clutter/clutter/deprecated/clutter-behaviour.c
|
||||
clutter/clutter/deprecated/clutter-behaviour-depth.c
|
||||
clutter/clutter/deprecated/clutter-behaviour-ellipse.c
|
||||
clutter/clutter/deprecated/clutter-behaviour-opacity.c
|
||||
clutter/clutter/deprecated/clutter-behaviour-path.c
|
||||
clutter/clutter/deprecated/clutter-behaviour-rotate.c
|
||||
clutter/clutter/deprecated/clutter-behaviour-scale.c
|
||||
clutter/clutter/deprecated/clutter-behaviour.c
|
||||
clutter/clutter/deprecated/clutter-box.c
|
||||
clutter/clutter/deprecated/clutter-cairo-texture.c
|
||||
clutter/clutter/deprecated/clutter-fixed.c
|
||||
@@ -72,9 +72,10 @@ clutter/clutter/deprecated/clutter-shader.c
|
||||
clutter/clutter/deprecated/clutter-state.c
|
||||
clutter/clutter/deprecated/clutter-table-layout.c
|
||||
clutter/clutter/deprecated/clutter-texture.c
|
||||
clutter/clutter/evdev/clutter-virtual-input-device-evdev.c
|
||||
clutter/clutter/wayland/clutter-wayland-surface.c
|
||||
clutter/clutter/x11/clutter-backend-x11.c
|
||||
clutter/clutter/x11/clutter-keymap-x11.c
|
||||
clutter/clutter/x11/clutter-x11-texture-pixmap.c
|
||||
cogl/cogl/cogl-debug-options.h
|
||||
cogl/cogl/cogl-debug.c
|
||||
cogl/cogl/cogl-debug-options.h
|
||||
|
1
po/am.po
1
po/am.po
@@ -12,6 +12,7 @@ msgstr ""
|
||||
"PO-Revision-Date: 2003-02-03 10:16+EDT\n"
|
||||
"Last-Translator: Ge'ez Frontier Foundation <locales@geez.org>\n"
|
||||
"Language-Team: Amharic <locales@geez.org>\n"
|
||||
"Language: am\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
2
po/as.po
2
po/as.po
@@ -14,7 +14,7 @@ msgstr ""
|
||||
"PO-Revision-Date: 2014-08-18 21:37+0530\n"
|
||||
"Last-Translator: Nilamdyuti Goswami <ngoswami@redhat.com>\n"
|
||||
"Language-Team: Assamese <kde-i18n-doc@kde.org>\n"
|
||||
"Language: as_IN\n"
|
||||
"Language: as\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
2
po/az.po
2
po/az.po
@@ -12,10 +12,10 @@ msgstr ""
|
||||
"PO-Revision-Date: 2004-08-17 21:53+0300\n"
|
||||
"Last-Translator: Metin Amiroff <metin@karegen.com>\n"
|
||||
"Language-Team: Azerbaijani <translation-team-az@lists.sourceforge.net>\n"
|
||||
"Language: az\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"net>\n"
|
||||
"X-Generator: KBabel 1.3.1\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
|
@@ -11,6 +11,7 @@ msgstr ""
|
||||
"PO-Revision-Date: 2009-02-14 19:37+0200\n"
|
||||
"Last-Translator: Ihar Hrachyshka <ihar.hrachyshka@gmail.com>\n"
|
||||
"Language-Team: i18n@mova.org <i18n@mova.org>\n"
|
||||
"Language: be@latin\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
838
po/bg.po
838
po/bg.po
@@ -1,9 +1,10 @@
|
||||
# Bulgarian translation of mutter po-file.
|
||||
# Copyright (C) 2002, 2004, 2006, 2007, 2008 Free Software Foundation, Inc.
|
||||
# Copyright (C) 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc.
|
||||
# Copyright (C) 2014, 2015 Free Software Foundation, Inc.
|
||||
# Copyright (C) 2014, 2015, 2016 Free Software Foundation, Inc.
|
||||
# Alexander Shopov <ash@kambanaria.org>, 2002, 2006, 2007, 2009, 2010.
|
||||
# Alexander Shopov <ash@kambanaria.org>, 2011, 2012, 2013, 2014, 2015.
|
||||
# Alexander Shopov <ash@kambanaria.org>, 2016.
|
||||
# Vladimir Petkov <kaladan@gmail.com>, 2004.
|
||||
# Rostislav Raykov <zbrox@i-space.org>, 2004.
|
||||
# Yavor Doganov <yavor@gnu.org>, 2008.
|
||||
@@ -11,9 +12,10 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: mutter master\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2015-03-10 09:51+0200\n"
|
||||
"PO-Revision-Date: 2015-03-10 09:51+0200\n"
|
||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
|
||||
"product=mutter&keywords=I18N+L10N&component=general\n"
|
||||
"POT-Creation-Date: 2016-09-08 06:33+0300\n"
|
||||
"PO-Revision-Date: 2016-09-05 16:27+0300\n"
|
||||
"Last-Translator: Alexander Shopov <ash@kambanaria.org>\n"
|
||||
"Language-Team: Bulgarian <dict@fsa-bg.org>\n"
|
||||
"Language: bg\n"
|
||||
@@ -22,471 +24,44 @@ msgstr ""
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:1
|
||||
msgid "Navigation"
|
||||
msgstr "Навигация"
|
||||
#: ../src/backends/meta-input-settings.c:1707
|
||||
msgid "Switch monitor"
|
||||
msgstr "Смяна на екрана"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:2
|
||||
msgid "Move window to workspace 1"
|
||||
msgstr "Преместване на прозореца на работен плот 1"
|
||||
#: ../src/backends/meta-input-settings.c:1709
|
||||
msgid "Show on-screen help"
|
||||
msgstr "Показване на помощта на екрана"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:3
|
||||
msgid "Move window to workspace 2"
|
||||
msgstr "Преместване на прозореца на работен плот 2"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:4
|
||||
msgid "Move window to workspace 3"
|
||||
msgstr "Преместване на прозореца на работен плот 3"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:5
|
||||
msgid "Move window to workspace 4"
|
||||
msgstr "Преместване на прозореца на работен плот 4"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:6
|
||||
msgid "Move window to last workspace"
|
||||
msgstr "Преместване на прозореца на последния работен плот"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:7
|
||||
msgid "Move window one workspace to the left"
|
||||
msgstr "Преместване на прозореца един работен плот наляво"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:8
|
||||
msgid "Move window one workspace to the right"
|
||||
msgstr "Преместване на прозореца един работен плот надясно"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:9
|
||||
msgid "Move window one workspace up"
|
||||
msgstr "Преместване на прозореца един работен плот нагоре"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:10
|
||||
msgid "Move window one workspace down"
|
||||
msgstr "Преместване на прозореца един работен плот надолу"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:11
|
||||
msgid "Move window one monitor to the left"
|
||||
msgstr "Преместване на прозореца един екран наляво"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:12
|
||||
msgid "Move window one monitor to the right"
|
||||
msgstr "Преместване на прозореца един екран надясно"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:13
|
||||
msgid "Move window one monitor up"
|
||||
msgstr "Преместване на прозореца един екран нагоре"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:14
|
||||
msgid "Move window one monitor down"
|
||||
msgstr "Преместване на прозореца един екран надолу"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:15
|
||||
msgid "Switch applications"
|
||||
msgstr "Преместване на фокуса между програмите"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:16
|
||||
msgid "Switch to previous application"
|
||||
msgstr "Преместване на фокуса към предишната програма"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:17
|
||||
msgid "Switch windows"
|
||||
msgstr "Преместване на фокуса между прозорците"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:18
|
||||
msgid "Switch to previous window"
|
||||
msgstr "Преместване на фокуса към предишния прозорец"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:19
|
||||
msgid "Switch windows of an application"
|
||||
msgstr "Преместване на фокуса между прозорците на една програма"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:20
|
||||
msgid "Switch to previous window of an application"
|
||||
msgstr "Преместване на фокуса към предишния прозорец на програма"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:21
|
||||
msgid "Switch system controls"
|
||||
msgstr "Преместване на фокуса между служебните обекти"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:22
|
||||
msgid "Switch to previous system control"
|
||||
msgstr "Преместване на фокуса към предишния служебен обект"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:23
|
||||
msgid "Switch windows directly"
|
||||
msgstr "Незабавно преместване на фокуса между прозорците"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:24
|
||||
msgid "Switch directly to previous window"
|
||||
msgstr "Незабавно преместване на фокуса към предишния прозорец"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:25
|
||||
msgid "Switch windows of an app directly"
|
||||
msgstr "Незабавно преместване на фокуса между прозорците на една програма"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:26
|
||||
msgid "Switch directly to previous window of an app"
|
||||
msgstr ""
|
||||
"Незабавно преместване на фокуса към предишния прозорец на една програма"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:27
|
||||
msgid "Switch system controls directly"
|
||||
msgstr "Незабавно преместване на фокуса между служебните обекти"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:28
|
||||
msgid "Switch directly to previous system control"
|
||||
msgstr "Незабавно преместване на фокуса към предишния служебен обект"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:29
|
||||
msgid "Hide all normal windows"
|
||||
msgstr "Скриване на всички обикновени прозорци"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:30
|
||||
msgid "Switch to workspace 1"
|
||||
msgstr "Превключване към работен плот 1"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:31
|
||||
msgid "Switch to workspace 2"
|
||||
msgstr "Превключване към работен плот 2"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:32
|
||||
msgid "Switch to workspace 3"
|
||||
msgstr "Превключване към работен плот 3"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:33
|
||||
msgid "Switch to workspace 4"
|
||||
msgstr "Превключване към работен плот 4"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:34
|
||||
msgid "Switch to last workspace"
|
||||
msgstr "Превключване към последния работен плот"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:35
|
||||
msgid "Move to workspace left"
|
||||
msgstr "Преместване на левия работен плот"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:36
|
||||
msgid "Move to workspace right"
|
||||
msgstr "Преместване на десния работен плот"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:37
|
||||
msgid "Move to workspace above"
|
||||
msgstr "Преместване на горния работен плот"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:38
|
||||
msgid "Move to workspace below"
|
||||
msgstr "Преместване на долния работен плот"
|
||||
|
||||
#: ../data/50-mutter-system.xml.in.h:1
|
||||
msgid "System"
|
||||
msgstr "Система"
|
||||
|
||||
#: ../data/50-mutter-system.xml.in.h:2
|
||||
msgid "Show the run command prompt"
|
||||
msgstr "Показване на прозореца за стартиране на команда"
|
||||
|
||||
#: ../data/50-mutter-system.xml.in.h:3
|
||||
msgid "Show the activities overview"
|
||||
msgstr "Преглед на дейностите"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:1
|
||||
msgid "Windows"
|
||||
msgstr "Прозорци"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:2
|
||||
msgid "Activate the window menu"
|
||||
msgstr "Задействане на менюто за прозорците"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:3
|
||||
msgid "Toggle fullscreen mode"
|
||||
msgstr "Превключване на режима за цял екран"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:4
|
||||
msgid "Toggle maximization state"
|
||||
msgstr "Превключване на състоянието на максимизиране"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:5
|
||||
msgid "Maximize window"
|
||||
msgstr "Максимизиране на прозорец"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:6
|
||||
msgid "Restore window"
|
||||
msgstr "Възстановяване на прозорец"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:7
|
||||
msgid "Toggle shaded state"
|
||||
msgstr "Превключване на състоянието на навиване"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:8
|
||||
msgid "Close window"
|
||||
msgstr "Затваряне на прозореца"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:9
|
||||
msgid "Hide window"
|
||||
msgstr "Скриване на прозорец"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:10
|
||||
msgid "Move window"
|
||||
msgstr "Преместване на прозорец"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:11
|
||||
msgid "Resize window"
|
||||
msgstr "Оразмеряване на прозорец"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:12
|
||||
msgid "Toggle window on all workspaces or one"
|
||||
msgstr "Превключване на появата на прозореца на всички работни места"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:13
|
||||
msgid "Raise window if covered, otherwise lower it"
|
||||
msgstr "Ако прозорецът е под друг, го издига, иначе го понижава"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:14
|
||||
msgid "Raise window above other windows"
|
||||
msgstr "Издигане на прозореца над другите"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:15
|
||||
msgid "Lower window below other windows"
|
||||
msgstr "Понижаване на прозореца под другите прозорци"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:16
|
||||
msgid "Maximize window vertically"
|
||||
msgstr "Максимизиране на прозореца вертикално"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:17
|
||||
msgid "Maximize window horizontally"
|
||||
msgstr "Максимизиране на прозореца хоризонтално"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:18
|
||||
msgid "View split on left"
|
||||
msgstr "Изглед разделен отляво"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:19
|
||||
msgid "View split on right"
|
||||
msgstr "Изглед разделен отдясно"
|
||||
|
||||
#: ../data/mutter.desktop.in.h:1
|
||||
msgid "Mutter"
|
||||
msgstr "Mutter"
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:1
|
||||
msgid "Modifier to use for extended window management operations"
|
||||
msgstr ""
|
||||
"Модификатор, който да се ползва за допълнителните действия по прозорците"
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:2
|
||||
msgid ""
|
||||
"This key will initiate the \"overlay\", which is a combination window "
|
||||
"overview and application launching system. The default is intended to be the "
|
||||
"\"Windows key\" on PC hardware. It's expected that this binding either the "
|
||||
"default or set to the empty string."
|
||||
msgstr ""
|
||||
"Този клавиш стартира наслагването, което е комбинация от прозорец и система "
|
||||
"за стартиране на програми. Стандартно клавишът е „Windows“ при системите "
|
||||
"съвместими с PC. Очаква се да е или стандартната стойност или празен низ."
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:3
|
||||
msgid "Attach modal dialogs"
|
||||
msgstr "Прилепени модални диалогови прозорци"
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:4
|
||||
msgid ""
|
||||
"When true, instead of having independent titlebars, modal dialogs appear "
|
||||
"attached to the titlebar of the parent window and are moved together with "
|
||||
"the parent window."
|
||||
msgstr ""
|
||||
"Когато е ключът е истина, модалните диалогови прозорци прилепват към "
|
||||
"заглавната лента на родителския си прозорец и се местят с него, вместо да са "
|
||||
"отделни и да имат собствена заглавна лента."
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:5
|
||||
msgid "Enable edge tiling when dropping windows on screen edges"
|
||||
msgstr ""
|
||||
"Включване на прилепването и максимизирането на прозорците по границите на "
|
||||
"екрана"
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:6
|
||||
msgid ""
|
||||
"If enabled, dropping windows on vertical screen edges maximizes them "
|
||||
"vertically and resizes them horizontally to cover half of the available "
|
||||
"area. Dropping windows on the top screen edge maximizes them completely."
|
||||
msgstr ""
|
||||
"Ако е включено, прозорците ще се максимизират по вертикала и ще заемат "
|
||||
"половината площ по хоризонтала при поставянето им край вертикалните граници "
|
||||
"на екрана. При поставянето им край горната граница прозорците ще се "
|
||||
"максимизират изцяло."
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:7
|
||||
msgid "Workspaces are managed dynamically"
|
||||
msgstr "Динамично управление на работните места"
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:8
|
||||
msgid ""
|
||||
"Determines whether workspaces are managed dynamically or whether there's a "
|
||||
"static number of workspaces (determined by the num-workspaces key in org."
|
||||
"gnome.desktop.wm.preferences)."
|
||||
msgstr ""
|
||||
"Определя дали се ползва динамично управление на работните места или броят им "
|
||||
"е установено число (зададено чрез ключа „num-workspaces“ в „org.gnome."
|
||||
"desktop.wm.preferences“)."
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:9
|
||||
msgid "Workspaces only on primary"
|
||||
msgstr "Работни плотове само на основния екран"
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:10
|
||||
msgid ""
|
||||
"Determines whether workspace switching should happen for windows on all "
|
||||
"monitors or only for windows on the primary monitor."
|
||||
msgstr ""
|
||||
"Дали смяната на работни плотове да се извършва на всички екрани или само на "
|
||||
"основния."
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:11
|
||||
msgid "No tab popup"
|
||||
msgstr "Без изскачащ прозорец при обхождане"
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:12
|
||||
msgid ""
|
||||
"Determines whether the use of popup and highlight frame should be disabled "
|
||||
"for window cycling."
|
||||
msgstr ""
|
||||
"Дали отбелязването на рамка и изскачащият прозорец при обхождане на "
|
||||
"прозорците да се изключат."
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:13
|
||||
msgid "Delay focus changes until the pointer stops moving"
|
||||
msgstr "Смяната на фокуса да изчака спирането на показалеца"
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:14
|
||||
msgid ""
|
||||
"If set to true, and the focus mode is either \"sloppy\" or \"mouse\" then "
|
||||
"the focus will not be changed immediately when entering a window, but only "
|
||||
"after the pointer stops moving."
|
||||
msgstr ""
|
||||
"Ако е включено и начинът за фокусиране е „sloppy“ (мързеливо) или "
|
||||
"„mouse“ (под мишката), тогава фокусът няма да се предава веднага при "
|
||||
"навлизането в прозорец, а едва след като показалецът спре да се движи."
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:15
|
||||
msgid "Draggable border width"
|
||||
msgstr "Широчина на границата за влачене"
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:16
|
||||
msgid ""
|
||||
"The amount of total draggable borders. If the theme's visible borders are "
|
||||
"not enough, invisible borders will be added to meet this value."
|
||||
msgstr ""
|
||||
"Общ размер на границите за влачене. Ако видимите граници на темата са по-"
|
||||
"малки, се добавят невидими граници, за да се достигне тази величина."
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:17
|
||||
msgid "Auto maximize nearly monitor sized windows"
|
||||
msgstr ""
|
||||
"Автоматично максимизиране на прозорци с размер близък до този на екрана"
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:18
|
||||
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
|
||||
msgid "Place new windows in the center"
|
||||
msgstr "Поставяне на новите прозорци в центъра на екрана"
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:20
|
||||
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
|
||||
msgid "Select window from tab popup"
|
||||
msgstr "Избиране при обхождане чрез изскачащ прозорец"
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:22
|
||||
msgid "Cancel tab popup"
|
||||
msgstr "Без изскачащ прозорец при обхождане"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:1
|
||||
msgid "Switch to VT 1"
|
||||
msgstr "Превключване към виртуална графична конзола 1"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:2
|
||||
msgid "Switch to VT 2"
|
||||
msgstr "Превключване към виртуална графична конзола 2"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:3
|
||||
msgid "Switch to VT 3"
|
||||
msgstr "Превключване към виртуална графична конзола 3"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:4
|
||||
msgid "Switch to VT 4"
|
||||
msgstr "Превключване към виртуална графична конзола 4"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:5
|
||||
msgid "Switch to VT 5"
|
||||
msgstr "Превключване към виртуална графична конзола 5"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:6
|
||||
msgid "Switch to VT 6"
|
||||
msgstr "Превключване към виртуална графична конзола 6"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:7
|
||||
msgid "Switch to VT 7"
|
||||
msgstr "Превключване към виртуална графична конзола 7"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:8
|
||||
msgid "Switch to VT 8"
|
||||
msgstr "Превключване към виртуална графична конзола 8"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:9
|
||||
msgid "Switch to VT 9"
|
||||
msgstr "Превключване към виртуална графична конзола 9"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:10
|
||||
msgid "Switch to VT 10"
|
||||
msgstr "Превключване към виртуална графична конзола 10"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:11
|
||||
msgid "Switch to VT 11"
|
||||
msgstr "Превключване към виртуална графична конзола 11"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:12
|
||||
msgid "Switch to VT 12"
|
||||
msgstr "Превключване към виртуална графична конзола 12"
|
||||
|
||||
#: ../src/backends/meta-monitor-manager.c:364
|
||||
#: ../src/backends/meta-monitor-manager.c:514
|
||||
msgid "Built-in display"
|
||||
msgstr "Вграден екран"
|
||||
|
||||
#: ../src/backends/meta-monitor-manager.c:391
|
||||
#: ../src/backends/meta-monitor-manager.c:537
|
||||
msgid "Unknown"
|
||||
msgstr "Непознат"
|
||||
|
||||
#: ../src/backends/meta-monitor-manager.c:393
|
||||
#: ../src/backends/meta-monitor-manager.c:539
|
||||
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:401
|
||||
#: ../src/backends/meta-monitor-manager.c:547
|
||||
#, 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
|
||||
#: ../src/compositor/compositor.c:463
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Another compositing manager is already running on screen %i on display \"%s"
|
||||
"\"."
|
||||
msgstr "На екран %i от дисплея „%s“ вече има мениджър за наслагване."
|
||||
|
||||
#: ../src/core/bell.c:185
|
||||
#: ../src/core/bell.c:194
|
||||
msgid "Bell event"
|
||||
msgstr "Събитие за звънец"
|
||||
|
||||
@@ -515,44 +90,48 @@ msgstr "Из_чакване"
|
||||
msgid "_Force Quit"
|
||||
msgstr "_Принудително спиране"
|
||||
|
||||
#: ../src/core/display.c:562
|
||||
#: ../src/core/display.c:590
|
||||
#, c-format
|
||||
msgid "Failed to open X Window System display '%s'\n"
|
||||
msgstr "Неуспешно отваряне на дисплея на X Window „%s“\n"
|
||||
|
||||
#: ../src/core/main.c:176
|
||||
#: ../src/core/main.c:182
|
||||
msgid "Disable connection to session manager"
|
||||
msgstr "Прекъсване на връзката към мениджъра на сесиите"
|
||||
|
||||
#: ../src/core/main.c:182
|
||||
#: ../src/core/main.c:188
|
||||
msgid "Replace the running window manager"
|
||||
msgstr "Замяна на текущия мениджър на прозорци"
|
||||
|
||||
#: ../src/core/main.c:188
|
||||
#: ../src/core/main.c:194
|
||||
msgid "Specify session management ID"
|
||||
msgstr "Определяне на идентификатор за управлението на сесии"
|
||||
|
||||
#: ../src/core/main.c:193
|
||||
#: ../src/core/main.c:199
|
||||
msgid "X Display to use"
|
||||
msgstr "X дисплеят, който да се използва"
|
||||
|
||||
# Ако „запазено“ не се членува, низът се събира на един ред без
|
||||
# пренасяне.
|
||||
#: ../src/core/main.c:199
|
||||
#: ../src/core/main.c:205
|
||||
msgid "Initialize session from savefile"
|
||||
msgstr "Инициализиране на сесия от файл със запазено състояние"
|
||||
|
||||
#: ../src/core/main.c:205
|
||||
#: ../src/core/main.c:211
|
||||
msgid "Make X calls synchronous"
|
||||
msgstr "Извикванията на X да са синхронни"
|
||||
|
||||
#: ../src/core/main.c:212
|
||||
#: ../src/core/main.c:218
|
||||
msgid "Run as a wayland compositor"
|
||||
msgstr "Wayland да е мениджър за наслагване"
|
||||
|
||||
#: ../src/core/main.c:220
|
||||
#: ../src/core/main.c:224
|
||||
msgid "Run as a nested compositor"
|
||||
msgstr "Изпълнение като вложен сървър за изобразяване"
|
||||
|
||||
#: ../src/core/main.c:232
|
||||
msgid "Run as a full display server, rather than nested"
|
||||
msgstr "Изпълнение като самостоятелен, а не вграден сървър за изобразяване"
|
||||
msgstr "Изпълнение като самостоятелен, а не вложен сървър за изобразяване"
|
||||
|
||||
#: ../src/core/mutter.c:39
|
||||
#, c-format
|
||||
@@ -578,12 +157,12 @@ msgstr "Отпечатване на версията на програмата"
|
||||
msgid "Mutter plugin to use"
|
||||
msgstr "Приставка, която да се ползва"
|
||||
|
||||
#: ../src/core/prefs.c:2004
|
||||
#: ../src/core/prefs.c:1997
|
||||
#, c-format
|
||||
msgid "Workspace %d"
|
||||
msgstr "Работен плот %d"
|
||||
|
||||
#: ../src/core/screen.c:525
|
||||
#: ../src/core/screen.c:521
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Display \"%s\" already has a window manager; try using the --replace option "
|
||||
@@ -592,15 +171,20 @@ msgstr ""
|
||||
"Вече има мениджър на прозорци на дисплей „%s“. Пробвайте да го замените с "
|
||||
"опцията „--replace“."
|
||||
|
||||
#: ../src/core/screen.c:607
|
||||
#: ../src/core/screen.c:606
|
||||
#, c-format
|
||||
msgid "Screen %d on display '%s' is invalid\n"
|
||||
msgstr "Екранът %d на дисплей „%s“ е невалиден\n"
|
||||
|
||||
#: ../src/core/util.c:118
|
||||
#: ../src/core/util.c:120
|
||||
msgid "Mutter was compiled without support for verbose mode\n"
|
||||
msgstr "Mutter е компилиран без поддръжка на подробен режим\n"
|
||||
|
||||
#: ../src/wayland/meta-wayland-tablet-pad.c:595
|
||||
#, c-format
|
||||
msgid "Mode Switch: Mode %d"
|
||||
msgstr "Смяна на режима: режим %d"
|
||||
|
||||
#: ../src/x11/session.c:1815
|
||||
msgid ""
|
||||
"These windows do not support "save current setup" and will have to "
|
||||
@@ -609,7 +193,345 @@ msgstr ""
|
||||
"Тези прозорци не поддържат операцията по записване на текущото състояние и "
|
||||
"ще трябва да се стартират ръчно при следващото ви влизане."
|
||||
|
||||
#: ../src/x11/window-props.c:549
|
||||
#: ../src/x11/window-props.c:548
|
||||
#, 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 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 "Mutter"
|
||||
|
||||
#~ msgid "Modifier to use for extended window management operations"
|
||||
#~ msgstr ""
|
||||
#~ "Модификатор, който да се ползва за допълнителните действия по прозорците"
|
||||
|
||||
#~ 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 ""
|
||||
#~ "Този клавиш стартира наслагването, което е комбинация от прозорец и "
|
||||
#~ "система за стартиране на програми. Стандартно клавишът е „Windows“ при "
|
||||
#~ "системите съвместими с PC. Очаква се да е или стандартната стойност или "
|
||||
#~ "празен низ."
|
||||
|
||||
#~ msgid "Attach modal dialogs"
|
||||
#~ msgstr "Прилепени модални диалогови прозорци"
|
||||
|
||||
#~ 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 ""
|
||||
#~ "Когато е ключът е истина, модалните диалогови прозорци прилепват към "
|
||||
#~ "заглавната лента на родителския си прозорец и се местят с него, вместо да "
|
||||
#~ "са отделни и да имат собствена заглавна лента."
|
||||
|
||||
#~ msgid "Enable edge tiling when dropping windows on screen edges"
|
||||
#~ msgstr ""
|
||||
#~ "Включване на прилепването и максимизирането на прозорците по границите на "
|
||||
#~ "екрана"
|
||||
|
||||
#~ 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 ""
|
||||
#~ "Ако е включено, прозорците ще се максимизират по вертикала и ще заемат "
|
||||
#~ "половината площ по хоризонтала при поставянето им край вертикалните "
|
||||
#~ "граници на екрана. При поставянето им край горната граница прозорците ще "
|
||||
#~ "се максимизират изцяло."
|
||||
|
||||
#~ msgid "Workspaces are managed dynamically"
|
||||
#~ msgstr "Динамично управление на работните места"
|
||||
|
||||
#~ 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 ""
|
||||
#~ "Определя дали се ползва динамично управление на работните места или броят "
|
||||
#~ "им е установено число (зададено чрез ключа „num-workspaces“ в „org.gnome."
|
||||
#~ "desktop.wm.preferences“)."
|
||||
|
||||
#~ msgid "Workspaces only on primary"
|
||||
#~ msgstr "Работни плотове само на основния екран"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Determines whether workspace switching should happen for windows on all "
|
||||
#~ "monitors or only for windows on the primary monitor."
|
||||
#~ msgstr ""
|
||||
#~ "Дали смяната на работни плотове да се извършва на всички екрани или само "
|
||||
#~ "на основния."
|
||||
|
||||
#~ msgid "No tab popup"
|
||||
#~ msgstr "Без изскачащ прозорец при обхождане"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Determines whether the use of popup and highlight frame should be "
|
||||
#~ "disabled for window cycling."
|
||||
#~ msgstr ""
|
||||
#~ "Дали отбелязването на рамка и изскачащият прозорец при обхождане на "
|
||||
#~ "прозорците да се изключат."
|
||||
|
||||
#~ msgid "Delay focus changes until the pointer stops moving"
|
||||
#~ msgstr "Смяната на фокуса да изчака спирането на показалеца"
|
||||
|
||||
#~ 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 ""
|
||||
#~ "Ако е включено и начинът за фокусиране е „sloppy“ (мързеливо) или "
|
||||
#~ "„mouse“ (под мишката), тогава фокусът няма да се предава веднага при "
|
||||
#~ "навлизането в прозорец, а едва след като показалецът спре да се движи."
|
||||
|
||||
#~ msgid "Draggable border width"
|
||||
#~ msgstr "Широчина на границата за влачене"
|
||||
|
||||
#~ 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 ""
|
||||
#~ "Общ размер на границите за влачене. Ако видимите граници на темата са по-"
|
||||
#~ "малки, се добавят невидими граници, за да се достигне тази величина."
|
||||
|
||||
#~ msgid "Auto maximize nearly monitor sized windows"
|
||||
#~ msgstr ""
|
||||
#~ "Автоматично максимизиране на прозорци с размер близък до този на екрана"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "If enabled, new windows that are initially the size of the monitor "
|
||||
#~ "automatically get maximized."
|
||||
#~ msgstr ""
|
||||
#~ "Ако е включено, новите прозорци, чийто размер е близък на този на екрана, "
|
||||
#~ "автоматично ще се максимизират."
|
||||
|
||||
#~ msgid "Place new windows in the center"
|
||||
#~ msgstr "Поставяне на новите прозорци в центъра на екрана"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "When true, the new windows will always be put in the center of the active "
|
||||
#~ "screen of the monitor."
|
||||
#~ msgstr "Ако е включено, новите прозорци ще се поставят в центъра на екрана."
|
||||
|
||||
#~ msgid "Select window from tab popup"
|
||||
#~ msgstr "Избиране при обхождане чрез изскачащ прозорец"
|
||||
|
||||
#~ msgid "Cancel tab popup"
|
||||
#~ msgstr "Без изскачащ прозорец при обхождане"
|
||||
|
||||
#~ msgid "Switch to VT 1"
|
||||
#~ msgstr "Превключване към виртуална графична конзола 1"
|
||||
|
||||
#~ msgid "Switch to VT 2"
|
||||
#~ msgstr "Превключване към виртуална графична конзола 2"
|
||||
|
||||
#~ msgid "Switch to VT 3"
|
||||
#~ msgstr "Превключване към виртуална графична конзола 3"
|
||||
|
||||
#~ msgid "Switch to VT 4"
|
||||
#~ msgstr "Превключване към виртуална графична конзола 4"
|
||||
|
||||
#~ msgid "Switch to VT 5"
|
||||
#~ msgstr "Превключване към виртуална графична конзола 5"
|
||||
|
||||
#~ msgid "Switch to VT 6"
|
||||
#~ msgstr "Превключване към виртуална графична конзола 6"
|
||||
|
||||
#~ msgid "Switch to VT 7"
|
||||
#~ msgstr "Превключване към виртуална графична конзола 7"
|
||||
|
||||
#~ msgid "Switch to VT 8"
|
||||
#~ msgstr "Превключване към виртуална графична конзола 8"
|
||||
|
||||
#~ msgid "Switch to VT 9"
|
||||
#~ msgstr "Превключване към виртуална графична конзола 9"
|
||||
|
||||
#~ msgid "Switch to VT 10"
|
||||
#~ msgstr "Превключване към виртуална графична конзола 10"
|
||||
|
||||
#~ msgid "Switch to VT 11"
|
||||
#~ msgstr "Превключване към виртуална графична конзола 11"
|
||||
|
||||
#~ msgid "Switch to VT 12"
|
||||
#~ msgstr "Превключване към виртуална графична конзола 12"
|
||||
|
1
po/bn.po
1
po/bn.po
@@ -13,6 +13,7 @@ msgstr ""
|
||||
"PO-Revision-Date: 2005-10-03 01:16+0600\n"
|
||||
"Last-Translator: Mahay Alam Khan <makl10n@yahoo.com>\n"
|
||||
"Language-Team: Bengali <gnome-trans@bengalinux.org>\n"
|
||||
"Language: bn\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
@@ -19,7 +19,7 @@ msgstr ""
|
||||
"PO-Revision-Date: 2014-09-25 13:56+0000\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Bengali (India) <kde-i18n-doc@kde.org>\n"
|
||||
"Language: bn-IN\n"
|
||||
"Language: bn_IN\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
1
po/br.po
1
po/br.po
@@ -12,6 +12,7 @@ msgstr ""
|
||||
"PO-Revision-Date: 2009-09-14 04:51+0100\n"
|
||||
"Last-Translator: Denis\n"
|
||||
"Language-Team: Brenux <brenux@free.fr>\n"
|
||||
"Language: br\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
@@ -16,7 +16,7 @@ msgstr ""
|
||||
"PO-Revision-Date: 2014-09-14 21:12+0200\n"
|
||||
"Last-Translator: Gil Forcada <gilforcada@guifi.net>\n"
|
||||
"Language-Team: Catalan <tradgnome@softcatala.org>\n"
|
||||
"Language: ca-XV\n"
|
||||
"Language: ca@valencia\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bits\n"
|
||||
|
68
po/cs.po
68
po/cs.po
@@ -6,22 +6,23 @@
|
||||
# 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.
|
||||
# Marek Černocký <marek@manet.cz>, 2012, 2013, 2014, 2016.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: mutter\n"
|
||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
|
||||
"product=mutter&keywords=I18N+L10N&component=general\n"
|
||||
"POT-Creation-Date: 2016-02-27 13:36+0000\n"
|
||||
"PO-Revision-Date: 2014-09-22 15:01+0200\n"
|
||||
"Last-Translator: Petr Kovar <pknbe@volny.cz>\n"
|
||||
"Language-Team: Czech <gnome-cs-list@gnome.org>\n"
|
||||
"POT-Creation-Date: 2016-08-16 12:01+0000\n"
|
||||
"PO-Revision-Date: 2016-08-17 13:15+0200\n"
|
||||
"Last-Translator: Marek Černocký <marek@manet.cz>\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"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
|
||||
"X-Generator: Virtaal 0.7.1\n"
|
||||
"X-Generator: Gtranslator 2.91.7\n"
|
||||
"X-Project-Style: gnome\n"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:1
|
||||
@@ -456,36 +457,45 @@ msgstr "Přepnout na VT 11"
|
||||
msgid "Switch to VT 12"
|
||||
msgstr "Přepnout na VT 12"
|
||||
|
||||
#: ../src/backends/meta-monitor-manager.c:518
|
||||
#: ../src/backends/meta-input-settings.c:1707
|
||||
#| msgid "Switch system controls"
|
||||
msgid "Switch monitor"
|
||||
msgstr "Přepnout monitor"
|
||||
|
||||
#: ../src/backends/meta-input-settings.c:1709
|
||||
msgid "Show on-screen help"
|
||||
msgstr "Zobrazit nápovědu na obrazovce"
|
||||
|
||||
#: ../src/backends/meta-monitor-manager.c:514
|
||||
msgid "Built-in display"
|
||||
msgstr "Vestavěný displej"
|
||||
|
||||
#: ../src/backends/meta-monitor-manager.c:544
|
||||
#: ../src/backends/meta-monitor-manager.c:537
|
||||
msgid "Unknown"
|
||||
msgstr "Neznámý"
|
||||
|
||||
#: ../src/backends/meta-monitor-manager.c:546
|
||||
#: ../src/backends/meta-monitor-manager.c:539
|
||||
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:554
|
||||
#: ../src/backends/meta-monitor-manager.c:547
|
||||
#, 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
|
||||
#: ../src/compositor/compositor.c:463
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Another compositing manager is already running on screen %i on display \"%s"
|
||||
"\"."
|
||||
msgstr "Jiný kompozitní správce již běží na obrazovce %i displeje „%s“."
|
||||
|
||||
#: ../src/core/bell.c:185
|
||||
#: ../src/core/bell.c:194
|
||||
msgid "Bell event"
|
||||
msgstr "Událost zvonku"
|
||||
|
||||
@@ -514,44 +524,44 @@ msgstr "_Počkat"
|
||||
msgid "_Force Quit"
|
||||
msgstr "_Vynutit ukončení"
|
||||
|
||||
#: ../src/core/display.c:555
|
||||
#: ../src/core/display.c:590
|
||||
#, c-format
|
||||
msgid "Failed to open X Window System display '%s'\n"
|
||||
msgstr "Nelze otevřít displej X Window System „%s“\n"
|
||||
|
||||
#: ../src/core/main.c:181
|
||||
#: ../src/core/main.c:182
|
||||
msgid "Disable connection to session manager"
|
||||
msgstr "Zakáže připojení ke správci sezení"
|
||||
|
||||
#: ../src/core/main.c:187
|
||||
#: ../src/core/main.c:188
|
||||
msgid "Replace the running window manager"
|
||||
msgstr "Nahradí běžícího správce oken"
|
||||
|
||||
#: ../src/core/main.c:193
|
||||
#: ../src/core/main.c:194
|
||||
msgid "Specify session management ID"
|
||||
msgstr "Určení ID správy sezení"
|
||||
|
||||
#: ../src/core/main.c:198
|
||||
#: ../src/core/main.c:199
|
||||
msgid "X Display to use"
|
||||
msgstr "Displej X, který použije"
|
||||
|
||||
#: ../src/core/main.c:204
|
||||
#: ../src/core/main.c:205
|
||||
msgid "Initialize session from savefile"
|
||||
msgstr "Spustí sezení z uloženého souboru"
|
||||
|
||||
#: ../src/core/main.c:210
|
||||
#: ../src/core/main.c:211
|
||||
msgid "Make X calls synchronous"
|
||||
msgstr "Provede volání X synchronně"
|
||||
|
||||
#: ../src/core/main.c:217
|
||||
#: ../src/core/main.c:218
|
||||
msgid "Run as a wayland compositor"
|
||||
msgstr "Spustit jako kompozitor protokolu Wayland"
|
||||
|
||||
#: ../src/core/main.c:223
|
||||
#: ../src/core/main.c:224
|
||||
msgid "Run as a nested compositor"
|
||||
msgstr "Spustit jako podkladový kompozitor"
|
||||
|
||||
#: ../src/core/main.c:231
|
||||
#: ../src/core/main.c:232
|
||||
msgid "Run as a full display server, rather than nested"
|
||||
msgstr "Spustit jako plnohodnotný server displeje, nikoliv vnořeně"
|
||||
|
||||
@@ -573,7 +583,7 @@ msgstr ""
|
||||
|
||||
#: ../src/core/mutter.c:53
|
||||
msgid "Print version"
|
||||
msgstr "Vypíše verzi"
|
||||
msgstr "Vypsat verzi"
|
||||
|
||||
#: ../src/core/mutter.c:59
|
||||
msgid "Mutter plugin to use"
|
||||
@@ -593,15 +603,20 @@ 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:603
|
||||
#: ../src/core/screen.c:606
|
||||
#, c-format
|
||||
msgid "Screen %d on display '%s' is invalid\n"
|
||||
msgstr "Obrazovka %d na displeji „%s“ je neplatná\n"
|
||||
|
||||
#: ../src/core/util.c:121
|
||||
#: ../src/core/util.c:120
|
||||
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:595
|
||||
#, c-format
|
||||
msgid "Mode Switch: Mode %d"
|
||||
msgstr "Přepínač režimu: režim %d"
|
||||
|
||||
#: ../src/x11/session.c:1815
|
||||
msgid ""
|
||||
"These windows do not support "save current setup" and will have to "
|
||||
@@ -610,7 +625,7 @@ msgstr ""
|
||||
"Tato okna nepodporují "ukládání aktuálního nastavení" a po vašem "
|
||||
"příštím přihlášení je budete muset spustit ručně."
|
||||
|
||||
#: ../src/x11/window-props.c:549
|
||||
#: ../src/x11/window-props.c:548
|
||||
#, c-format
|
||||
msgid "%s (on %s)"
|
||||
msgstr "%s (na %s)"
|
||||
@@ -1274,4 +1289,3 @@ msgstr "%s (na %s)"
|
||||
|
||||
#~ msgid "Move to Another _Workspace"
|
||||
#~ msgstr "Přes_unout na jinou plochu"
|
||||
|
||||
|
1
po/cy.po
1
po/cy.po
@@ -15,6 +15,7 @@ msgstr ""
|
||||
"PO-Revision-Date: 2008-02-05 21:12-0000\n"
|
||||
"Last-Translator: Rhys Jones <rhys@sucs.org>\n"
|
||||
"Language-Team: Cymraeg <gnome-cy@pengwyn.linux.org.uk>\n"
|
||||
"Language: cy\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
297
po/da.po
297
po/da.po
@@ -10,7 +10,7 @@
|
||||
# Joe Hansen <joedalton2@yahoo.dk>, 2011.
|
||||
# Ask Hjorth Larsen <asklarsen@gmail.com>, 2007, 09, 10, 12, 13, 14, 15, 16.
|
||||
#
|
||||
# Konventioner:
|
||||
# Ordliste:
|
||||
#
|
||||
# display -> terminal
|
||||
#
|
||||
@@ -19,9 +19,10 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: mutter\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-03-20 23:17+0100\n"
|
||||
"PO-Revision-Date: 2016-03-20 21:46+0100\n"
|
||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
|
||||
"product=mutter&keywords=I18N+L10N&component=general\n"
|
||||
"POT-Creation-Date: 2016-09-13 10:16+0000\n"
|
||||
"PO-Revision-Date: 2016-09-08 23:52+0200\n"
|
||||
"Last-Translator: Ask Hjorth Larsen <asklarsen@gmail.com>\n"
|
||||
"Language-Team: Danish <dansk@dansk-gruppen.dk>\n"
|
||||
"Language: da\n"
|
||||
@@ -29,255 +30,255 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:1
|
||||
#: data/50-mutter-navigation.xml:6
|
||||
msgid "Navigation"
|
||||
msgstr "Navigation"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:2
|
||||
#: data/50-mutter-navigation.xml:9
|
||||
msgid "Move window to workspace 1"
|
||||
msgstr "Flyt vindue til arbejdsområde 1"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:3
|
||||
#: data/50-mutter-navigation.xml:12
|
||||
msgid "Move window to workspace 2"
|
||||
msgstr "Flyt vindue til arbejdsområde 2"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:4
|
||||
#: data/50-mutter-navigation.xml:15
|
||||
msgid "Move window to workspace 3"
|
||||
msgstr "Flyt vindue til arbejdsområde 3"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:5
|
||||
#: data/50-mutter-navigation.xml:18
|
||||
msgid "Move window to workspace 4"
|
||||
msgstr "Flyt vindue til arbejdsområde 4"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:6
|
||||
#: data/50-mutter-navigation.xml:21
|
||||
msgid "Move window to last workspace"
|
||||
msgstr "Flyt vindue til sidste arbejdsområde"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:7
|
||||
#: data/50-mutter-navigation.xml:24
|
||||
msgid "Move window one workspace to the left"
|
||||
msgstr "Flyt vindue et arbejdsområde til venstre"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:8
|
||||
#: data/50-mutter-navigation.xml:27
|
||||
msgid "Move window one workspace to the right"
|
||||
msgstr "Flyt vindue et arbejdsområde til højre"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:9
|
||||
#: data/50-mutter-navigation.xml:30
|
||||
msgid "Move window one workspace up"
|
||||
msgstr "Flyt vindue et arbejdsområde op"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:10
|
||||
#: data/50-mutter-navigation.xml:33
|
||||
msgid "Move window one workspace down"
|
||||
msgstr "Flyt vindue et arbejdsområde ned"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:11
|
||||
#: data/50-mutter-navigation.xml:36
|
||||
msgid "Move window one monitor to the left"
|
||||
msgstr "Flyt vindue en skærm til venstre"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:12
|
||||
#: data/50-mutter-navigation.xml:39
|
||||
msgid "Move window one monitor to the right"
|
||||
msgstr "Flyt vindue en skærm til højre"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:13
|
||||
#: data/50-mutter-navigation.xml:42
|
||||
msgid "Move window one monitor up"
|
||||
msgstr "Flyt vindue en skærm op"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:14
|
||||
#: data/50-mutter-navigation.xml:45
|
||||
msgid "Move window one monitor down"
|
||||
msgstr "Flyt vindue en skærm ned"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:15
|
||||
#: data/50-mutter-navigation.xml:49
|
||||
msgid "Switch applications"
|
||||
msgstr "Skift mellem programmer"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:16
|
||||
#: data/50-mutter-navigation.xml:54
|
||||
msgid "Switch to previous application"
|
||||
msgstr "Skift til forrige program"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:17
|
||||
#: data/50-mutter-navigation.xml:58
|
||||
msgid "Switch windows"
|
||||
msgstr "Skift mellem vinduer"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:18
|
||||
#: data/50-mutter-navigation.xml:63
|
||||
msgid "Switch to previous window"
|
||||
msgstr "Skift til forrige vindue"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:19
|
||||
#: data/50-mutter-navigation.xml:67
|
||||
msgid "Switch windows of an application"
|
||||
msgstr "Skift mellem vinduer i et program"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:20
|
||||
#: data/50-mutter-navigation.xml:72
|
||||
msgid "Switch to previous window of an application"
|
||||
msgstr "Skift til forrige vindue af et program"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:21
|
||||
#: data/50-mutter-navigation.xml:76
|
||||
msgid "Switch system controls"
|
||||
msgstr "Skift mellem systemkontroller"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:22
|
||||
#: data/50-mutter-navigation.xml:81
|
||||
msgid "Switch to previous system control"
|
||||
msgstr "Skift til forrige systemkontrol"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:23
|
||||
#: data/50-mutter-navigation.xml:85
|
||||
msgid "Switch windows directly"
|
||||
msgstr "Skift direkte mellem vinduer"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:24
|
||||
#: data/50-mutter-navigation.xml:90
|
||||
msgid "Switch directly to previous window"
|
||||
msgstr "Skift direkte til forrige vindue"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:25
|
||||
#: data/50-mutter-navigation.xml:94
|
||||
msgid "Switch windows of an app directly"
|
||||
msgstr "Skift direkte mellem vinduer i et program"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:26
|
||||
#: data/50-mutter-navigation.xml:99
|
||||
msgid "Switch directly to previous window of an app"
|
||||
msgstr "Skift direkte til forrige vindue af et program"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:27
|
||||
#: data/50-mutter-navigation.xml:103
|
||||
msgid "Switch system controls directly"
|
||||
msgstr "Skift direkte mellem systemkontroller"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:28
|
||||
#: data/50-mutter-navigation.xml:108
|
||||
msgid "Switch directly to previous system control"
|
||||
msgstr "Skift direkte til forrige systemkontrol"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:29
|
||||
#: data/50-mutter-navigation.xml:111
|
||||
msgid "Hide all normal windows"
|
||||
msgstr "Skjul alle normale vinduer"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:30
|
||||
#: data/50-mutter-navigation.xml:114
|
||||
msgid "Switch to workspace 1"
|
||||
msgstr "Skift til arbejdsområde 1"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:31
|
||||
#: data/50-mutter-navigation.xml:117
|
||||
msgid "Switch to workspace 2"
|
||||
msgstr "Skift til arbejdsområde 2"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:32
|
||||
#: data/50-mutter-navigation.xml:120
|
||||
msgid "Switch to workspace 3"
|
||||
msgstr "Skift til arbejdsområde 3"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:33
|
||||
#: data/50-mutter-navigation.xml:123
|
||||
msgid "Switch to workspace 4"
|
||||
msgstr "Skift til arbejdsområde 4"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:34
|
||||
#: data/50-mutter-navigation.xml:126
|
||||
msgid "Switch to last workspace"
|
||||
msgstr "Skift til sidste arbejdsområde"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:35
|
||||
#: data/50-mutter-navigation.xml:129
|
||||
msgid "Move to workspace left"
|
||||
msgstr "Flyt til arbejdsområdet til venstre"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:36
|
||||
#: data/50-mutter-navigation.xml:132
|
||||
msgid "Move to workspace right"
|
||||
msgstr "Flyt til arbejdsområdet til højre"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:37
|
||||
#: data/50-mutter-navigation.xml:135
|
||||
msgid "Move to workspace above"
|
||||
msgstr "Flyt til arbejdsområdet ovenover"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:38
|
||||
#: data/50-mutter-navigation.xml:138
|
||||
msgid "Move to workspace below"
|
||||
msgstr "Flyt til arbejdsområdet nedenunder"
|
||||
|
||||
#: ../data/50-mutter-system.xml.in.h:1
|
||||
#: data/50-mutter-system.xml:6
|
||||
msgid "System"
|
||||
msgstr "System"
|
||||
|
||||
#: ../data/50-mutter-system.xml.in.h:2
|
||||
#: data/50-mutter-system.xml:8
|
||||
msgid "Show the run command prompt"
|
||||
msgstr "Vis \"kør kommando\"-prompten"
|
||||
|
||||
#: ../data/50-mutter-system.xml.in.h:3
|
||||
#: data/50-mutter-system.xml:10
|
||||
msgid "Show the activities overview"
|
||||
msgstr "Vis aktivitetsoversigten"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:1
|
||||
#: data/50-mutter-windows.xml:6
|
||||
msgid "Windows"
|
||||
msgstr "Vinduer"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:2
|
||||
#: data/50-mutter-windows.xml:8
|
||||
msgid "Activate the window menu"
|
||||
msgstr "Aktivér vinduesmenuen"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:3
|
||||
#: data/50-mutter-windows.xml:10
|
||||
msgid "Toggle fullscreen mode"
|
||||
msgstr "Slå fuldskærmstilstand til/fra"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:4
|
||||
#: data/50-mutter-windows.xml:12
|
||||
msgid "Toggle maximization state"
|
||||
msgstr "Slå maksimering til/fra"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:5
|
||||
#: data/50-mutter-windows.xml:14
|
||||
msgid "Maximize window"
|
||||
msgstr "Maksimér vindue"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:6
|
||||
#: data/50-mutter-windows.xml:16
|
||||
msgid "Restore window"
|
||||
msgstr "Gendan vindue"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:7
|
||||
#: data/50-mutter-windows.xml:18
|
||||
msgid "Toggle shaded state"
|
||||
msgstr "Slå vinduesoprulning til/fra"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:8
|
||||
#: data/50-mutter-windows.xml:20
|
||||
msgid "Close window"
|
||||
msgstr "Luk vindue"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:9
|
||||
#: data/50-mutter-windows.xml:22
|
||||
msgid "Hide window"
|
||||
msgstr "Skjul vindue"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:10
|
||||
#: data/50-mutter-windows.xml:24
|
||||
msgid "Move window"
|
||||
msgstr "Flyt vindue"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:11
|
||||
#: data/50-mutter-windows.xml:26
|
||||
msgid "Resize window"
|
||||
msgstr "Ændr vinduesstørrelse"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:12
|
||||
#: data/50-mutter-windows.xml:29
|
||||
msgid "Toggle window on all workspaces or one"
|
||||
msgstr "Slå visning af vindue på alle arbejdsområder til/fra"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:13
|
||||
#: data/50-mutter-windows.xml:31
|
||||
msgid "Raise window if covered, otherwise lower it"
|
||||
msgstr "Hæv vindue hvis det er dækket, ellers sænk det"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:14
|
||||
#: data/50-mutter-windows.xml:33
|
||||
msgid "Raise window above other windows"
|
||||
msgstr "Hæv vindue over andre vinduer"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:15
|
||||
#: data/50-mutter-windows.xml:35
|
||||
msgid "Lower window below other windows"
|
||||
msgstr "Sænk vindue under andre vinduer"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:16
|
||||
#: data/50-mutter-windows.xml:37
|
||||
msgid "Maximize window vertically"
|
||||
msgstr "Maksimér vindue lodret"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:17
|
||||
#: data/50-mutter-windows.xml:39
|
||||
msgid "Maximize window horizontally"
|
||||
msgstr "Maksimér vindue vandret"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:18
|
||||
#: data/50-mutter-windows.xml:43
|
||||
msgid "View split on left"
|
||||
msgstr "Delt visning venstre"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:19
|
||||
#: data/50-mutter-windows.xml:47
|
||||
msgid "View split on right"
|
||||
msgstr "Delt visning højre"
|
||||
|
||||
#: ../data/mutter.desktop.in.h:1
|
||||
#: data/mutter.desktop.in:4
|
||||
msgid "Mutter"
|
||||
msgstr "Mutter"
|
||||
|
||||
#: ../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 "Modifikationstast til brug for udvidede vindueshåndteringsoperationer"
|
||||
|
||||
#: ../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 "
|
||||
@@ -289,11 +290,11 @@ msgstr ""
|
||||
"\"Windows\"-tasten. Det forventes at denne binding enten har "
|
||||
"standardværdien, eller er sat til den tomme streng."
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:3
|
||||
#: data/org.gnome.mutter.gschema.xml.in:20
|
||||
msgid "Attach modal dialogs"
|
||||
msgstr "Fastgør modaldialoger"
|
||||
|
||||
#: ../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 "
|
||||
@@ -302,13 +303,13 @@ msgstr ""
|
||||
"Når sand, vil modaldialoger hænge sammen med titellinjen af ophavsvinduet og "
|
||||
"flyttes sammen med dette, frem for at have uafhængige titellinjer."
|
||||
|
||||
#: ../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 ""
|
||||
"Aktivér maksimering eller halvmaksimering når vinduer slippes over "
|
||||
"skærmranden"
|
||||
|
||||
#: ../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 "
|
||||
@@ -319,11 +320,11 @@ msgstr ""
|
||||
"tilgængelige område. Vinduer, der slippes på øverste skærmrand, maksimeres "
|
||||
"helt."
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:7
|
||||
#: data/org.gnome.mutter.gschema.xml.in:40
|
||||
msgid "Workspaces are managed dynamically"
|
||||
msgstr "Arbejdsområder håndteres dynamisk"
|
||||
|
||||
#: ../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 "
|
||||
"static number of workspaces (determined by the num-workspaces key in org."
|
||||
@@ -333,11 +334,11 @@ msgstr ""
|
||||
"antal arbejdsområder (angivet med nøglen num-workspaces i org.gnome.desktop."
|
||||
"wm.preferences)."
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:9
|
||||
#: data/org.gnome.mutter.gschema.xml.in:50
|
||||
msgid "Workspaces only on primary"
|
||||
msgstr "Arbejdsområder kun på primær skærm"
|
||||
|
||||
#: ../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."
|
||||
@@ -345,11 +346,11 @@ msgstr ""
|
||||
"Angiver om skift mellem arbejdsområder skal ske for vinduer på alle skærme, "
|
||||
"eller kun for vinduer på den primære skærm."
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:11
|
||||
#: data/org.gnome.mutter.gschema.xml.in:59
|
||||
msgid "No tab popup"
|
||||
msgstr "Ingen tab-pop-op"
|
||||
|
||||
#: ../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."
|
||||
@@ -357,11 +358,11 @@ msgstr ""
|
||||
"Afgør om brugen af pop-op og fremhævet vinduesramme skal deaktiveres ved "
|
||||
"vinduesskifte."
|
||||
|
||||
#: ../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 "Lad fokusændringer vente indtil markøren holder op med at bevæge sig"
|
||||
|
||||
#: ../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 "
|
||||
@@ -371,11 +372,11 @@ msgstr ""
|
||||
"vil fokus ikke blive ændret omgående når man går ind i et nyt vindue, men "
|
||||
"først efter markøren holder op med at bevæge sig."
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:15
|
||||
#: data/org.gnome.mutter.gschema.xml.in:79
|
||||
msgid "Draggable border width"
|
||||
msgstr "Bredde af den trækbare kant"
|
||||
|
||||
#: ../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 "
|
||||
"not enough, invisible borders will be added to meet this value."
|
||||
@@ -383,11 +384,11 @@ msgstr ""
|
||||
"Samlet mængde kant der kan trækkes. Hvis temaets synlige grænser ikke er "
|
||||
"nok, så vil usynlige kanter blive tilføjet for at møde denne værdi."
|
||||
|
||||
#: ../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 "Maksimér automatisk vinduer hvis størrelse næsten passer til skærmen"
|
||||
|
||||
#: ../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."
|
||||
@@ -395,96 +396,107 @@ msgstr ""
|
||||
"Hvis aktiveret vil nye vinduer, som i begyndelsen har samme størrelse som "
|
||||
"skærmen, blive automatisk maksimeret."
|
||||
|
||||
#: ../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 "Placér nye vinduer i midten"
|
||||
|
||||
#: ../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 ""
|
||||
"Når sand, vil nye vinduer altid blive placeret i midten af den aktive skærm."
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:21
|
||||
#: data/org.gnome.mutter.gschema.xml.in:120
|
||||
msgid "Select window from tab popup"
|
||||
msgstr "Vælg vindue fra tab-pop-op"
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:22
|
||||
#: data/org.gnome.mutter.gschema.xml.in:125
|
||||
msgid "Cancel tab popup"
|
||||
msgstr "Annullér faneblads-pop-op"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:1
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:6
|
||||
msgid "Switch to VT 1"
|
||||
msgstr "Skift til VT 1"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:2
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:10
|
||||
msgid "Switch to VT 2"
|
||||
msgstr "Skift til VT 2"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:3
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:14
|
||||
msgid "Switch to VT 3"
|
||||
msgstr "Skift til VT 3"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:4
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:18
|
||||
msgid "Switch to VT 4"
|
||||
msgstr "Skift til VT 4"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:5
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:22
|
||||
msgid "Switch to VT 5"
|
||||
msgstr "Skift til VT 5"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:6
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:26
|
||||
msgid "Switch to VT 6"
|
||||
msgstr "Skift til VT 6"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:7
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:30
|
||||
msgid "Switch to VT 7"
|
||||
msgstr "Skift til VT 7"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:8
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:34
|
||||
msgid "Switch to VT 8"
|
||||
msgstr "Skift til VT 8"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:9
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:38
|
||||
msgid "Switch to VT 9"
|
||||
msgstr "Skift til VT 9"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:10
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:42
|
||||
msgid "Switch to VT 10"
|
||||
msgstr "Skift til VT 10"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:11
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:46
|
||||
msgid "Switch to VT 11"
|
||||
msgstr "Skift til VT 11"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:12
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:50
|
||||
msgid "Switch to VT 12"
|
||||
msgstr "Skift til VT 12"
|
||||
|
||||
#: ../src/backends/meta-monitor-manager.c:518
|
||||
msgid "Built-in display"
|
||||
msgstr "Indbygget skærm"
|
||||
#. TRANSLATORS: This string refers to an action, cycles drawing tablets'
|
||||
#. * mapping through the available outputs.
|
||||
#.
|
||||
#: src/backends/meta-input-settings.c:1845
|
||||
msgid "Switch monitor"
|
||||
msgstr "Skift skærm"
|
||||
|
||||
#: ../src/backends/meta-monitor-manager.c:544
|
||||
#: src/backends/meta-input-settings.c:1847
|
||||
msgid "Show on-screen help"
|
||||
msgstr "Vis integreret hjælp"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:514
|
||||
msgid "Built-in display"
|
||||
msgstr "Indbygget terminal"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:537
|
||||
msgid "Unknown"
|
||||
msgstr "Ukendt"
|
||||
|
||||
#: ../src/backends/meta-monitor-manager.c:546
|
||||
#: src/backends/meta-monitor-manager.c:539
|
||||
msgid "Unknown Display"
|
||||
msgstr "Ukendt skærm"
|
||||
msgstr "Ukendt terminal"
|
||||
|
||||
#. TRANSLATORS: this is a monitor vendor name, followed by a
|
||||
#. * size in inches, like 'Dell 15"'
|
||||
#.
|
||||
#: ../src/backends/meta-monitor-manager.c:554
|
||||
#: src/backends/meta-monitor-manager.c:547
|
||||
#, 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
|
||||
#: src/compositor/compositor.c:463
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Another compositing manager is already running on screen %i on display \"%s"
|
||||
@@ -492,20 +504,20 @@ msgid ""
|
||||
msgstr ""
|
||||
"En anden komposithåndtering kører allerede på skærm %i på terminal \"%s\"."
|
||||
|
||||
#: ../src/core/bell.c:192
|
||||
#: src/core/bell.c:194
|
||||
msgid "Bell event"
|
||||
msgstr "Bip-hændelse"
|
||||
|
||||
#: ../src/core/delete.c:127
|
||||
#: src/core/delete.c:127
|
||||
#, c-format
|
||||
msgid "“%s” is not responding."
|
||||
msgstr "“%s” svarer ikke."
|
||||
|
||||
#: ../src/core/delete.c:129
|
||||
#: src/core/delete.c:129
|
||||
msgid "Application is not responding."
|
||||
msgstr "Program svarer ikke."
|
||||
|
||||
#: ../src/core/delete.c:134
|
||||
#: 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."
|
||||
@@ -513,56 +525,56 @@ msgstr ""
|
||||
"Du kan vælge at vente et lille stykke tid på at programmet fortsætter, eller "
|
||||
"du kan tvinge programmet til at afslutte fuldstændigt."
|
||||
|
||||
#: ../src/core/delete.c:141
|
||||
#: src/core/delete.c:141
|
||||
msgid "_Wait"
|
||||
msgstr "_Vent"
|
||||
|
||||
#: ../src/core/delete.c:141
|
||||
#: src/core/delete.c:141
|
||||
msgid "_Force Quit"
|
||||
msgstr "_Tving til at afslutte"
|
||||
|
||||
#: ../src/core/display.c:555
|
||||
#: src/core/display.c:590
|
||||
#, c-format
|
||||
msgid "Failed to open X Window System display '%s'\n"
|
||||
msgstr "Kunne ikke åbne X Window System-terminalen \"%s\"\n"
|
||||
|
||||
#: ../src/core/main.c:181
|
||||
#: src/core/main.c:182
|
||||
msgid "Disable connection to session manager"
|
||||
msgstr "Deaktivér forbindelse til sessionshåndtering"
|
||||
|
||||
#: ../src/core/main.c:187
|
||||
#: src/core/main.c:188
|
||||
msgid "Replace the running window manager"
|
||||
msgstr "Erstat den kørende vindueshåndtering"
|
||||
|
||||
#: ../src/core/main.c:193
|
||||
#: src/core/main.c:194
|
||||
msgid "Specify session management ID"
|
||||
msgstr "Angiv sessionhåndterings-id"
|
||||
|
||||
#: ../src/core/main.c:198
|
||||
#: src/core/main.c:199
|
||||
msgid "X Display to use"
|
||||
msgstr "X-skærm som bruges"
|
||||
msgstr "X-terminal som bruges"
|
||||
|
||||
#: ../src/core/main.c:204
|
||||
#: src/core/main.c:205
|
||||
msgid "Initialize session from savefile"
|
||||
msgstr "Initialisér session fra gemt fil"
|
||||
|
||||
#: ../src/core/main.c:210
|
||||
#: src/core/main.c:211
|
||||
msgid "Make X calls synchronous"
|
||||
msgstr "Gør kald til X synkrone"
|
||||
|
||||
#: ../src/core/main.c:217
|
||||
#: src/core/main.c:218
|
||||
msgid "Run as a wayland compositor"
|
||||
msgstr "Kør som en wayland-kompositor"
|
||||
|
||||
#: ../src/core/main.c:223
|
||||
#: src/core/main.c:224
|
||||
msgid "Run as a nested compositor"
|
||||
msgstr "Kør som en indlejret kompositor"
|
||||
|
||||
#: ../src/core/main.c:231
|
||||
#: src/core/main.c:232
|
||||
msgid "Run as a full display server, rather than nested"
|
||||
msgstr "Kør som fuld displayserver, frem for indlejret"
|
||||
msgstr "Kør som fuld terminalserver, frem for indlejret"
|
||||
|
||||
#: ../src/core/mutter.c:39
|
||||
#: src/core/mutter.c:39
|
||||
#, c-format
|
||||
msgid ""
|
||||
"mutter %s\n"
|
||||
@@ -577,20 +589,20 @@ msgstr ""
|
||||
"Der er INGEN garanti; ikke engang for SALGBARHED eller EGNETHED TIL ET "
|
||||
"BESTEMT FORMÅL.\n"
|
||||
|
||||
#: ../src/core/mutter.c:53
|
||||
#: src/core/mutter.c:53
|
||||
msgid "Print version"
|
||||
msgstr "Vis version"
|
||||
|
||||
#: ../src/core/mutter.c:59
|
||||
#: src/core/mutter.c:59
|
||||
msgid "Mutter plugin to use"
|
||||
msgstr "Mutter-udvidelsesmodul der skal bruges"
|
||||
|
||||
#: ../src/core/prefs.c:1997
|
||||
#: src/core/prefs.c:1997
|
||||
#, c-format
|
||||
msgid "Workspace %d"
|
||||
msgstr "Arbejdsområde %d"
|
||||
|
||||
#: ../src/core/screen.c:521
|
||||
#: src/core/screen.c:521
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Display \"%s\" already has a window manager; try using the --replace option "
|
||||
@@ -599,16 +611,21 @@ msgstr ""
|
||||
"Terminalen \"%s\" har allerede en vindueshåndtering; prøv tilvalget --"
|
||||
"replace for at erstatte den aktuelle vindueshåndtering."
|
||||
|
||||
#: ../src/core/screen.c:603
|
||||
#: src/core/screen.c:606
|
||||
#, c-format
|
||||
msgid "Screen %d on display '%s' is invalid\n"
|
||||
msgstr "Skærm %d på terminal \"%s\" er ugyldig\n"
|
||||
|
||||
#: ../src/core/util.c:121
|
||||
#: src/core/util.c:120
|
||||
msgid "Mutter was compiled without support for verbose mode\n"
|
||||
msgstr "Mutter blev kompileret uden understøttelse for uddybende tilstand\n"
|
||||
|
||||
#: ../src/x11/session.c:1815
|
||||
#: src/wayland/meta-wayland-tablet-pad.c:595
|
||||
#, c-format
|
||||
msgid "Mode Switch: Mode %d"
|
||||
msgstr "Tilstandsskift: Tilstand %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."
|
||||
@@ -617,7 +634,7 @@ msgstr ""
|
||||
"genstartes manuelt næste gang du logger på."
|
||||
|
||||
# Lad os håbe dette er rigtigt
|
||||
#: ../src/x11/window-props.c:549
|
||||
#: src/x11/window-props.c:548
|
||||
#, c-format
|
||||
msgid "%s (on %s)"
|
||||
msgstr "%s (på %s)"
|
||||
@@ -631,9 +648,6 @@ msgstr "%s (på %s)"
|
||||
#~ "Kunne ikke finde et tema! Sikr dig at %s eksisterer og indeholder de "
|
||||
#~ "sædvanlige temaer.\n"
|
||||
|
||||
#~ msgid "Screen %d on display \"%s\" already has a window manager\n"
|
||||
#~ msgstr "Skærm %d på terminal \"%s\" har allerede en vindueshåndtering\n"
|
||||
|
||||
#~ msgid "%d x %d"
|
||||
#~ msgstr "%d x %d"
|
||||
|
||||
@@ -1133,15 +1147,6 @@ msgstr "%s (på %s)"
|
||||
#~ "\"%s\" fundet i konfigurationsdatabasen er ikke en gyldig værdi for "
|
||||
#~ "tastebindingen \"%s\"\n"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Could not acquire window manager selection on screen %d display \"%s\"\n"
|
||||
#~ msgstr ""
|
||||
#~ "Kunne ikke fremskaffe vindueshåndteringvælgeren på skærm %d på terminal "
|
||||
#~ "\"%s\"\n"
|
||||
|
||||
#~ msgid "Could not release screen %d on display \"%s\"\n"
|
||||
#~ msgstr "Kunne ikke frigive skærm %d på terminal \"%s\"\n"
|
||||
|
||||
#~ msgid "Could not create directory '%s': %s\n"
|
||||
#~ msgstr "Kunne ikke oprette mappen \"%s\": %s\n"
|
||||
|
||||
|
269
po/de.po
269
po/de.po
@@ -13,8 +13,8 @@ msgstr ""
|
||||
"Project-Id-Version: mutter master\n"
|
||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
|
||||
"product=mutter&keywords=I18N+L10N&component=general\n"
|
||||
"POT-Creation-Date: 2016-02-28 13:37+0000\n"
|
||||
"PO-Revision-Date: 2016-02-28 19:15+0100\n"
|
||||
"POT-Creation-Date: 2016-09-07 09:27+0000\n"
|
||||
"PO-Revision-Date: 2016-09-07 18:55+0200\n"
|
||||
"Last-Translator: Mario Blättermann <mario.blaettermann@gmail.com>\n"
|
||||
"Language-Team: Deutsch <gnome-de@gnome.org>\n"
|
||||
"Language: de\n"
|
||||
@@ -22,259 +22,259 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: Poedit 1.8.7\n"
|
||||
"X-Generator: Poedit 1.8.9\n"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:1
|
||||
#: data/50-mutter-navigation.xml:6
|
||||
msgid "Navigation"
|
||||
msgstr "Navigation"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:2
|
||||
#: data/50-mutter-navigation.xml:9
|
||||
msgid "Move window to workspace 1"
|
||||
msgstr "Fenster auf Arbeitsfläche 1 verschieben"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:3
|
||||
#: data/50-mutter-navigation.xml:12
|
||||
msgid "Move window to workspace 2"
|
||||
msgstr "Fenster auf Arbeitsfläche 2 verschieben"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:4
|
||||
#: data/50-mutter-navigation.xml:15
|
||||
msgid "Move window to workspace 3"
|
||||
msgstr "Fenster auf Arbeitsfläche 3 verschieben"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:5
|
||||
#: data/50-mutter-navigation.xml:18
|
||||
msgid "Move window to workspace 4"
|
||||
msgstr "Fenster auf Arbeitsfläche 4 verschieben"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:6
|
||||
#: data/50-mutter-navigation.xml:21
|
||||
msgid "Move window to last workspace"
|
||||
msgstr "Fenster auf letzte Arbeitsfläche verschieben"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:7
|
||||
#: 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.in.h:8
|
||||
#: 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.in.h:9
|
||||
#: 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.in.h:10
|
||||
#: data/50-mutter-navigation.xml:33
|
||||
msgid "Move window one workspace down"
|
||||
msgstr "Fenster eine Arbeitsfläche nach unten verschieben"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:11
|
||||
#: data/50-mutter-navigation.xml:36
|
||||
msgid "Move window one monitor to the left"
|
||||
msgstr "Fenster einen Bildschirm nach links verschieben"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:12
|
||||
#: data/50-mutter-navigation.xml:39
|
||||
msgid "Move window one monitor to the right"
|
||||
msgstr "Fenster einen Bildschirm nach rechts verschieben"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:13
|
||||
#: data/50-mutter-navigation.xml:42
|
||||
msgid "Move window one monitor up"
|
||||
msgstr "Fenster einen Bildschirm nach oben verschieben"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:14
|
||||
#: data/50-mutter-navigation.xml:45
|
||||
msgid "Move window one monitor down"
|
||||
msgstr "Fenster einen Bildschirm nach unten verschieben"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:15
|
||||
#: data/50-mutter-navigation.xml:49
|
||||
msgid "Switch applications"
|
||||
msgstr "Anwendungen wechseln"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:16
|
||||
#: data/50-mutter-navigation.xml:54
|
||||
msgid "Switch to previous application"
|
||||
msgstr "Zur vorherigen Anwendung wechseln"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:17
|
||||
#: data/50-mutter-navigation.xml:58
|
||||
msgid "Switch windows"
|
||||
msgstr "Fenster wechseln"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:18
|
||||
#: data/50-mutter-navigation.xml:63
|
||||
msgid "Switch to previous window"
|
||||
msgstr "Zum vorherigen Fenster wechseln"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:19
|
||||
#: data/50-mutter-navigation.xml:67
|
||||
msgid "Switch windows of an application"
|
||||
msgstr "Zwischen den Fenstern einer Anwendung wechseln"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:20
|
||||
#: data/50-mutter-navigation.xml:72
|
||||
msgid "Switch to previous window of an application"
|
||||
msgstr "Zum vorherigen Fenster einer Anwendung wechseln"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:21
|
||||
#: data/50-mutter-navigation.xml:76
|
||||
msgid "Switch system controls"
|
||||
msgstr "Systemsteuerungen umschalten"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:22
|
||||
#: data/50-mutter-navigation.xml:81
|
||||
msgid "Switch to previous system control"
|
||||
msgstr "Zur vorherigen Systemsteuerungen wechseln"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:23
|
||||
#: data/50-mutter-navigation.xml:85
|
||||
msgid "Switch windows directly"
|
||||
msgstr "Fenster sofort wechseln"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:24
|
||||
#: data/50-mutter-navigation.xml:90
|
||||
msgid "Switch directly to previous window"
|
||||
msgstr "Direkt zum vorherigen Fenster wechseln"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:25
|
||||
#: data/50-mutter-navigation.xml:94
|
||||
msgid "Switch windows of an app directly"
|
||||
msgstr "Sofort zwischen den Fenstern einer Anwendung wechseln"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:26
|
||||
#: data/50-mutter-navigation.xml:99
|
||||
msgid "Switch directly to previous window of an app"
|
||||
msgstr "Direkt zum vorherigen Fenster einer Anwendung wechseln"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:27
|
||||
#: data/50-mutter-navigation.xml:103
|
||||
msgid "Switch system controls directly"
|
||||
msgstr "Systemsteuerungen sofort umschalten"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:28
|
||||
#: data/50-mutter-navigation.xml:108
|
||||
msgid "Switch directly to previous system control"
|
||||
msgstr "Direkt zur vorherigen Systemsteuerungen wechselen"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:29
|
||||
#: data/50-mutter-navigation.xml:111
|
||||
msgid "Hide all normal windows"
|
||||
msgstr "Alle normalen Fenster verbergen"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:30
|
||||
#: data/50-mutter-navigation.xml:114
|
||||
msgid "Switch to workspace 1"
|
||||
msgstr "Zur Arbeitsfläche 1 wechseln"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:31
|
||||
#: data/50-mutter-navigation.xml:117
|
||||
msgid "Switch to workspace 2"
|
||||
msgstr "Zur Arbeitsfläche 2 wechseln"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:32
|
||||
#: data/50-mutter-navigation.xml:120
|
||||
msgid "Switch to workspace 3"
|
||||
msgstr "Zur Arbeitsfläche 3 wechseln"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:33
|
||||
#: data/50-mutter-navigation.xml:123
|
||||
msgid "Switch to workspace 4"
|
||||
msgstr "Zur Arbeitsfläche 4 wechseln"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:34
|
||||
#: data/50-mutter-navigation.xml:126
|
||||
msgid "Switch to last workspace"
|
||||
msgstr "Zur letzten Arbeitsfläche wechseln"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:35
|
||||
#: data/50-mutter-navigation.xml:129
|
||||
msgid "Move to workspace left"
|
||||
msgstr "Auf Arbeitsfläche links verschieben"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:36
|
||||
#: data/50-mutter-navigation.xml:132
|
||||
msgid "Move to workspace right"
|
||||
msgstr "Auf Arbeitsfläche rechts verschieben"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:37
|
||||
#: data/50-mutter-navigation.xml:135
|
||||
msgid "Move to workspace above"
|
||||
msgstr "Auf Arbeitsfläche darüber verschieben"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:38
|
||||
#: data/50-mutter-navigation.xml:138
|
||||
msgid "Move to workspace below"
|
||||
msgstr "Auf Arbeitsfläche darunter verschieben"
|
||||
|
||||
#: ../data/50-mutter-system.xml.in.h:1
|
||||
#: data/50-mutter-system.xml:6
|
||||
msgid "System"
|
||||
msgstr "System"
|
||||
|
||||
#: ../data/50-mutter-system.xml.in.h:2
|
||||
#: data/50-mutter-system.xml:8
|
||||
msgid "Show the run command prompt"
|
||||
msgstr "Den »Befehl ausführen«-Dialog anzeigen"
|
||||
|
||||
#: ../data/50-mutter-system.xml.in.h:3
|
||||
#: data/50-mutter-system.xml:10
|
||||
msgid "Show the activities overview"
|
||||
msgstr "Aktivitäten-Übersicht anzeigen"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:1
|
||||
#: data/50-mutter-windows.xml:6
|
||||
msgid "Windows"
|
||||
msgstr "Fenster"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:2
|
||||
#: data/50-mutter-windows.xml:8
|
||||
msgid "Activate the window menu"
|
||||
msgstr "Das Fenstermenü aktivieren"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:3
|
||||
#: data/50-mutter-windows.xml:10
|
||||
msgid "Toggle fullscreen mode"
|
||||
msgstr "Vollbildmodus ein-/ausschalten"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:4
|
||||
#: data/50-mutter-windows.xml:12
|
||||
msgid "Toggle maximization state"
|
||||
msgstr "Maximierungszustand ein-/ausschalten"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:5
|
||||
#: data/50-mutter-windows.xml:14
|
||||
msgid "Maximize window"
|
||||
msgstr "Fenster maximieren"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:6
|
||||
#: data/50-mutter-windows.xml:16
|
||||
msgid "Restore window"
|
||||
msgstr "Fenstergröße wiederherstellen"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:7
|
||||
#: data/50-mutter-windows.xml:18
|
||||
msgid "Toggle shaded state"
|
||||
msgstr "Fenster ein-/ausrollen"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:8
|
||||
#: data/50-mutter-windows.xml:20
|
||||
msgid "Close window"
|
||||
msgstr "Fenster schließen"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:9
|
||||
#: data/50-mutter-windows.xml:22
|
||||
msgid "Hide window"
|
||||
msgstr "Fenster verbergen"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:10
|
||||
#: data/50-mutter-windows.xml:24
|
||||
msgid "Move window"
|
||||
msgstr "Fenster verschieben"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:11
|
||||
#: data/50-mutter-windows.xml:26
|
||||
msgid "Resize window"
|
||||
msgstr "Fenstergröße ändern"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:12
|
||||
#: data/50-mutter-windows.xml:29
|
||||
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.in.h:13
|
||||
#: data/50-mutter-windows.xml:31
|
||||
msgid "Raise window if covered, otherwise lower it"
|
||||
msgstr "Fenster anheben, falls es verdeckt ist, andernfalls absenken"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:14
|
||||
#: data/50-mutter-windows.xml:33
|
||||
msgid "Raise window above other windows"
|
||||
msgstr "Fenster vor die anderen Fenster anheben"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:15
|
||||
#: data/50-mutter-windows.xml:35
|
||||
msgid "Lower window below other windows"
|
||||
msgstr "Fenster hinter die anderen Fenster absenken"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:16
|
||||
#: data/50-mutter-windows.xml:37
|
||||
msgid "Maximize window vertically"
|
||||
msgstr "Fenster vertikal maximieren"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:17
|
||||
#: data/50-mutter-windows.xml:39
|
||||
msgid "Maximize window horizontally"
|
||||
msgstr "Fenster horizontal maximieren"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:18
|
||||
#: data/50-mutter-windows.xml:43
|
||||
msgid "View split on left"
|
||||
msgstr "Ansicht links teilen"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:19
|
||||
#: data/50-mutter-windows.xml:47
|
||||
msgid "View split on right"
|
||||
msgstr "Ansicht rechts teilen"
|
||||
|
||||
#: ../data/mutter.desktop.in.h:1
|
||||
#: data/mutter.desktop.in:4
|
||||
msgid "Mutter"
|
||||
msgstr "Mutter"
|
||||
|
||||
#: ../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 "Zusatztaste für erweiterte Aktionen der Fensterverwaltung"
|
||||
|
||||
# bzw- die Apfel-Taste auf Mac-Computern
|
||||
#: ../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 "
|
||||
@@ -287,11 +287,11 @@ msgstr ""
|
||||
"vorgesehen. Man geht davon aus, dass diese Tastenverknüpfung entweder die "
|
||||
"Vorgabe ist oder als leere Zeichenkette gesetzt ist."
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:3
|
||||
#: data/org.gnome.mutter.gschema.xml.in:20
|
||||
msgid "Attach modal dialogs"
|
||||
msgstr "Modale Dialoge anhängen"
|
||||
|
||||
#: ../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 "
|
||||
@@ -301,12 +301,12 @@ msgstr ""
|
||||
"die Titelleisten des Elternfensters angehängte modale Dialoge, welche "
|
||||
"zusammen mit dem Elternfenster bewegt werden."
|
||||
|
||||
#: ../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 ""
|
||||
"Kantenplatzierung beim Berühren der Bildschirmränder mit Fenstern aktivieren"
|
||||
|
||||
#: ../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 "
|
||||
@@ -317,11 +317,11 @@ msgstr ""
|
||||
"Hälfte des verfügbaren Bereiches zu belegen. Eine Berührung mit dem oberen "
|
||||
"Bildschirmrand maximiert das Fenster vollständig."
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:7
|
||||
#: data/org.gnome.mutter.gschema.xml.in:40
|
||||
msgid "Workspaces are managed dynamically"
|
||||
msgstr "Arbeitsflächen sollen dynamisch verwaltet werden "
|
||||
|
||||
#: ../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 "
|
||||
"static number of workspaces (determined by the num-workspaces key in org."
|
||||
@@ -331,11 +331,11 @@ msgstr ""
|
||||
"eine feste Anzahl Arbeitsflächen gibt (welche durch den Schlüssel num-"
|
||||
"workspaces in org.gnome.desktop.wm.preferences festgelegt wird)."
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:9
|
||||
#: data/org.gnome.mutter.gschema.xml.in:50
|
||||
msgid "Workspaces only on primary"
|
||||
msgstr "Nur primärer Arbeitsflächenwechsel"
|
||||
|
||||
#: ../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."
|
||||
@@ -343,11 +343,11 @@ msgstr ""
|
||||
"Legt fest, ob Arbeitsflächenwechsel für alle Fenster auf allen Bildschirmen "
|
||||
"oder nur für Fenster auf dem primären Bildschirm ausgeführt werden soll."
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:11
|
||||
#: data/org.gnome.mutter.gschema.xml.in:59
|
||||
msgid "No tab popup"
|
||||
msgstr "Keine Tab-Anzeige"
|
||||
|
||||
#: ../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."
|
||||
@@ -355,11 +355,11 @@ msgstr ""
|
||||
"Legt fest, ob beim Durchblättern der Fenster die Tab-Anzeige und die "
|
||||
"Hervorhebung des Rahmens deaktiviert werden soll."
|
||||
|
||||
#: ../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 "Fokus-Änderungen verzögern, bis der Zeiger aufhört sich zu bewegen"
|
||||
|
||||
#: ../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 "
|
||||
@@ -369,12 +369,12 @@ msgstr ""
|
||||
"»mouse« ist, wird der Fokus nicht sofort beim Erreichen eines Fensters "
|
||||
"geändert, sondern erst, wenn der Zeiger aufhört sich zu bewegen."
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:15
|
||||
#: data/org.gnome.mutter.gschema.xml.in:79
|
||||
msgid "Draggable border width"
|
||||
msgstr "Breite der ziehbaren Ränder"
|
||||
|
||||
# Lange Beschreibung von »Draggable border width«
|
||||
#: ../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 "
|
||||
"not enough, invisible borders will be added to meet this value."
|
||||
@@ -383,11 +383,11 @@ msgstr ""
|
||||
"nicht ausreichen, werden unsichtbare Ränder hinzugefügt, um diesen Wert zu "
|
||||
"erreichen."
|
||||
|
||||
#: ../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 "Fenster nahe der Bildschirmgröße automatisch maximieren"
|
||||
|
||||
#: ../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."
|
||||
@@ -395,11 +395,11 @@ msgstr ""
|
||||
"Wenn aktiviert, werden neue Fenster, die beim Öffnen nahezu die Größe des "
|
||||
"Bildschirms haben, direkt maximiert."
|
||||
|
||||
#: ../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 "Neue Fenster in der Mitte platzieren"
|
||||
|
||||
#: ../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."
|
||||
@@ -407,85 +407,93 @@ msgstr ""
|
||||
"Falls wahr, so werden neue Fenster immer in der Mitte des aktiven "
|
||||
"Bildschirms platziert"
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:21
|
||||
#: data/org.gnome.mutter.gschema.xml.in:120
|
||||
msgid "Select window from tab popup"
|
||||
msgstr "Fenster aus Tab-Anzeige auswählen"
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:22
|
||||
#: data/org.gnome.mutter.gschema.xml.in:125
|
||||
msgid "Cancel tab popup"
|
||||
msgstr "Tab-Anzeige abbrechen"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:1
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:6
|
||||
msgid "Switch to VT 1"
|
||||
msgstr "Zum virtuellen Terminal 1 wechseln"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:2
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:10
|
||||
msgid "Switch to VT 2"
|
||||
msgstr "Zum virtuellen Terminal 2 wechseln"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:3
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:14
|
||||
msgid "Switch to VT 3"
|
||||
msgstr "Zum virtuellen Terminal 3 wechseln"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:4
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:18
|
||||
msgid "Switch to VT 4"
|
||||
msgstr "Zum virtuellen Terminal 4 wechseln"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:5
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:22
|
||||
msgid "Switch to VT 5"
|
||||
msgstr "Zum virtuellen Terminal 5 wechseln"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:6
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:26
|
||||
msgid "Switch to VT 6"
|
||||
msgstr "Zum virtuellen Terminal 6 wechseln"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:7
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:30
|
||||
msgid "Switch to VT 7"
|
||||
msgstr "Zum virtuellen Terminal 7 wechseln"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:8
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:34
|
||||
msgid "Switch to VT 8"
|
||||
msgstr "Zum virtuellen Terminal 8 wechseln"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:9
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:38
|
||||
msgid "Switch to VT 9"
|
||||
msgstr "Zum virtuellen Terminal 9 wechseln"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:10
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:42
|
||||
msgid "Switch to VT 10"
|
||||
msgstr "Zum virtuellen Terminal 10 wechseln"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:11
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:46
|
||||
msgid "Switch to VT 11"
|
||||
msgstr "Zum virtuellen Terminal 11 wechseln"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:12
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:50
|
||||
msgid "Switch to VT 12"
|
||||
msgstr "Zum virtuellen Terminal 12 wechseln"
|
||||
|
||||
#: ../src/backends/meta-monitor-manager.c:518
|
||||
#: src/backends/meta-input-settings.c:1707
|
||||
msgid "Switch monitor"
|
||||
msgstr "Bildschirm wechseln"
|
||||
|
||||
#: src/backends/meta-input-settings.c:1709
|
||||
msgid "Show on-screen help"
|
||||
msgstr "Bildschirmhilfe anzeigen"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:514
|
||||
msgid "Built-in display"
|
||||
msgstr "Eingebaute Anzeige"
|
||||
|
||||
#: ../src/backends/meta-monitor-manager.c:544
|
||||
#: src/backends/meta-monitor-manager.c:537
|
||||
msgid "Unknown"
|
||||
msgstr "Unbekannt"
|
||||
|
||||
#: ../src/backends/meta-monitor-manager.c:546
|
||||
#: src/backends/meta-monitor-manager.c:539
|
||||
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:554
|
||||
#: src/backends/meta-monitor-manager.c:547
|
||||
#, 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
|
||||
#: src/compositor/compositor.c:463
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Another compositing manager is already running on screen %i on display \"%s"
|
||||
@@ -494,20 +502,20 @@ msgstr ""
|
||||
"Ein weiterer Compositing-Verwalter läuft bereits auf Bildschirm %i der "
|
||||
"Anzeige »%s«."
|
||||
|
||||
#: ../src/core/bell.c:185
|
||||
#: src/core/bell.c:194
|
||||
msgid "Bell event"
|
||||
msgstr "Klangereignis"
|
||||
|
||||
#: ../src/core/delete.c:127
|
||||
#: src/core/delete.c:127
|
||||
#, c-format
|
||||
msgid "“%s” is not responding."
|
||||
msgstr "»%s« antwortet nicht."
|
||||
|
||||
#: ../src/core/delete.c:129
|
||||
#: src/core/delete.c:129
|
||||
msgid "Application is not responding."
|
||||
msgstr "Die Anwendung antwortet nicht."
|
||||
|
||||
#: ../src/core/delete.c:134
|
||||
#: 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."
|
||||
@@ -515,58 +523,58 @@ msgstr ""
|
||||
"Sie können der Anwendung noch etwas Zeit geben oder ein sofortiges Beenden "
|
||||
"erzwingen."
|
||||
|
||||
#: ../src/core/delete.c:141
|
||||
#: src/core/delete.c:141
|
||||
msgid "_Wait"
|
||||
msgstr "_Warten"
|
||||
|
||||
#: ../src/core/delete.c:141
|
||||
#: src/core/delete.c:141
|
||||
msgid "_Force Quit"
|
||||
msgstr "_Beenden erzwingen"
|
||||
|
||||
#: ../src/core/display.c:555
|
||||
#: src/core/display.c:590
|
||||
#, 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:181
|
||||
#: src/core/main.c:182
|
||||
msgid "Disable connection to session manager"
|
||||
msgstr "Verbindung zur Sitzungsverwaltung deaktivieren"
|
||||
|
||||
#: ../src/core/main.c:187
|
||||
#: src/core/main.c:188
|
||||
msgid "Replace the running window manager"
|
||||
msgstr "Den aktuellen Fensterverwalter ersetzen"
|
||||
|
||||
#: ../src/core/main.c:193
|
||||
#: src/core/main.c:194
|
||||
msgid "Specify session management ID"
|
||||
msgstr "Kennung der Sitzungsverwaltung angeben"
|
||||
|
||||
#: ../src/core/main.c:198
|
||||
#: src/core/main.c:199
|
||||
msgid "X Display to use"
|
||||
msgstr "Zu verwendende X-Anzeige"
|
||||
|
||||
#: ../src/core/main.c:204
|
||||
#: src/core/main.c:205
|
||||
msgid "Initialize session from savefile"
|
||||
msgstr "Sitzung anhand gespeicherter Datei starten"
|
||||
|
||||
#: ../src/core/main.c:210
|
||||
#: src/core/main.c:211
|
||||
msgid "Make X calls synchronous"
|
||||
msgstr "X-Aufrufe abgleichen"
|
||||
|
||||
#: ../src/core/main.c:217
|
||||
#: src/core/main.c:218
|
||||
msgid "Run as a wayland compositor"
|
||||
msgstr "Als Wayland-Compositor ausführen"
|
||||
|
||||
#: ../src/core/main.c:223
|
||||
#: src/core/main.c:224
|
||||
msgid "Run as a nested compositor"
|
||||
msgstr "Als eingebetteten Compositor ausführen"
|
||||
|
||||
#: ../src/core/main.c:231
|
||||
#: src/core/main.c:232
|
||||
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
|
||||
#: src/core/mutter.c:39
|
||||
#, c-format
|
||||
msgid ""
|
||||
"mutter %s\n"
|
||||
@@ -582,20 +590,20 @@ msgstr ""
|
||||
"Es besteht KEINE Garantie auf MARKTREIFE oder EIGNUNG für einen BESTIMMTEN "
|
||||
"ZWECK.\n"
|
||||
|
||||
#: ../src/core/mutter.c:53
|
||||
#: src/core/mutter.c:53
|
||||
msgid "Print version"
|
||||
msgstr "Version ausgeben"
|
||||
|
||||
#: ../src/core/mutter.c:59
|
||||
#: src/core/mutter.c:59
|
||||
msgid "Mutter plugin to use"
|
||||
msgstr "Zu benutzendes Mutter-Plugin"
|
||||
|
||||
#: ../src/core/prefs.c:1997
|
||||
#: src/core/prefs.c:1997
|
||||
#, c-format
|
||||
msgid "Workspace %d"
|
||||
msgstr "Arbeitsfläche %d"
|
||||
|
||||
#: ../src/core/screen.c:521
|
||||
#: src/core/screen.c:521
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Display \"%s\" already has a window manager; try using the --replace option "
|
||||
@@ -604,16 +612,21 @@ msgstr ""
|
||||
"Bildschirm »%s« hat bereits einen Fensterverwalter. Versuchen Sie die Option "
|
||||
"»--replace«, um den aktuellen Fensterverwalter zu ersetzen."
|
||||
|
||||
#: ../src/core/screen.c:603
|
||||
#: src/core/screen.c:606
|
||||
#, c-format
|
||||
msgid "Screen %d on display '%s' is invalid\n"
|
||||
msgstr "Bildschirm %d auf Anzeige »%s« ist ungültig\n"
|
||||
|
||||
#: ../src/core/util.c:121
|
||||
#: src/core/util.c:120
|
||||
msgid "Mutter was compiled without support for verbose mode\n"
|
||||
msgstr "Mutter wurde ohne Unterstützung für den redseligen Modus kompiliert\n"
|
||||
|
||||
#: ../src/x11/session.c:1815
|
||||
#: src/wayland/meta-wayland-tablet-pad.c:595
|
||||
#, c-format
|
||||
msgid "Mode Switch: Mode %d"
|
||||
msgstr "Moduswechsel: Modus %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."
|
||||
@@ -621,7 +634,7 @@ msgstr ""
|
||||
"Diese Fenster unterstützen das Speichern der aktuellen Einstellungen nicht "
|
||||
"und müssen bei der nächsten Anmeldung manuell neu gestartet werden."
|
||||
|
||||
#: ../src/x11/window-props.c:549
|
||||
#: src/x11/window-props.c:548
|
||||
#, c-format
|
||||
msgid "%s (on %s)"
|
||||
msgstr "%s (auf %s)"
|
||||
|
1
po/dz.po
1
po/dz.po
@@ -10,6 +10,7 @@ msgstr ""
|
||||
"PO-Revision-Date: 2007-05-24 23:11+0530\n"
|
||||
"Last-Translator: Tshewang Norbu <bumthap2006@hotmail.com>\n"
|
||||
"Language-Team: DZONGKHA <pgeyleg@dit.gov.bt>\n"
|
||||
"Language: dz\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
273
po/el.po
273
po/el.po
@@ -20,8 +20,8 @@ msgstr ""
|
||||
"Project-Id-Version: metacity.gnome-2-26\n"
|
||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
|
||||
"product=mutter&keywords=I18N+L10N&component=general\n"
|
||||
"POT-Creation-Date: 2016-03-12 01:36+0000\n"
|
||||
"PO-Revision-Date: 2016-03-14 23:05+0200\n"
|
||||
"POT-Creation-Date: 2016-09-07 09:27+0000\n"
|
||||
"PO-Revision-Date: 2016-09-15 11:47+0300\n"
|
||||
"Last-Translator: Tom Tryfonidis <tomtryf@gmail.com>\n"
|
||||
"Language-Team: Greek, Modern (1453-) <opensuse-translation-el@opensuse.org>\n"
|
||||
"Language: el\n"
|
||||
@@ -29,258 +29,258 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: Poedit 1.8.7\n"
|
||||
"X-Generator: Poedit 1.8.9\n"
|
||||
"X-Project-Style: gnome\n"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:1
|
||||
#: data/50-mutter-navigation.xml:6
|
||||
msgid "Navigation"
|
||||
msgstr "Περιήγηση"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:2
|
||||
#: data/50-mutter-navigation.xml:9
|
||||
msgid "Move window to workspace 1"
|
||||
msgstr "Μετακίνηση παραθύρου στον χώρο εργασίας 1"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:3
|
||||
#: data/50-mutter-navigation.xml:12
|
||||
msgid "Move window to workspace 2"
|
||||
msgstr "Μετακίνηση παραθύρου στον χώρο εργασίας 2"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:4
|
||||
#: data/50-mutter-navigation.xml:15
|
||||
msgid "Move window to workspace 3"
|
||||
msgstr "Μετακίνηση παραθύρου στον χώρο εργασίας 3"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:5
|
||||
#: data/50-mutter-navigation.xml:18
|
||||
msgid "Move window to workspace 4"
|
||||
msgstr "Μετακίνηση παραθύρου στον χώρο εργασίας 4"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:6
|
||||
#: data/50-mutter-navigation.xml:21
|
||||
msgid "Move window to last workspace"
|
||||
msgstr "Μετακίνηση παραθύρου στον τελευταίο χώρο εργασίας"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:7
|
||||
#: data/50-mutter-navigation.xml:24
|
||||
msgid "Move window one workspace to the left"
|
||||
msgstr "Μετακίνηση παραθύρου έναν χώρο εργασίας αριστερά"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:8
|
||||
#: data/50-mutter-navigation.xml:27
|
||||
msgid "Move window one workspace to the right"
|
||||
msgstr "Μετακίνηση παραθύρου έναν χώρο εργασίας δεξιά"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:9
|
||||
#: data/50-mutter-navigation.xml:30
|
||||
msgid "Move window one workspace up"
|
||||
msgstr "Μετακίνηση παραθύρου έναν χώρο εργασίας πάνω"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:10
|
||||
#: data/50-mutter-navigation.xml:33
|
||||
msgid "Move window one workspace down"
|
||||
msgstr "Μετακίνηση παραθύρου έναν χώρο εργασίας κάτω"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:11
|
||||
#: data/50-mutter-navigation.xml:36
|
||||
msgid "Move window one monitor to the left"
|
||||
msgstr "Μετακίνηση παραθύρου κατά μια οθόνη στα αριστερά"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:12
|
||||
#: data/50-mutter-navigation.xml:39
|
||||
msgid "Move window one monitor to the right"
|
||||
msgstr "Μετακίνηση παραθύρου κατά μια οθόνη στα δεξιά"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:13
|
||||
#: data/50-mutter-navigation.xml:42
|
||||
msgid "Move window one monitor up"
|
||||
msgstr "Μετακίνηση παραθύρου κατά μια οθόνη προς τα πάνω"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:14
|
||||
#: data/50-mutter-navigation.xml:45
|
||||
msgid "Move window one monitor down"
|
||||
msgstr "Μετακίνηση παραθύρου κατά μια οθόνη προς τα κάτω"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:15
|
||||
#: data/50-mutter-navigation.xml:49
|
||||
msgid "Switch applications"
|
||||
msgstr "Εναλλαγή εφαρμογών"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:16
|
||||
#: data/50-mutter-navigation.xml:54
|
||||
msgid "Switch to previous application"
|
||||
msgstr "Εναλλαγή στην προηγούμενη εφαρμογή"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:17
|
||||
#: data/50-mutter-navigation.xml:58
|
||||
msgid "Switch windows"
|
||||
msgstr "Εναλλαγή παραθύρων"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:18
|
||||
#: data/50-mutter-navigation.xml:63
|
||||
msgid "Switch to previous window"
|
||||
msgstr "Εναλλαγή στο προηγούμενο παράθυρο"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:19
|
||||
#: data/50-mutter-navigation.xml:67
|
||||
msgid "Switch windows of an application"
|
||||
msgstr "Εναλλαγή παραθύρων μιας εφαρμογής"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:20
|
||||
#: data/50-mutter-navigation.xml:72
|
||||
msgid "Switch to previous window of an application"
|
||||
msgstr "Εναλλαγή στο προηγούμενο παράθυρο μιας εφαρμογής"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:21
|
||||
#: data/50-mutter-navigation.xml:76
|
||||
msgid "Switch system controls"
|
||||
msgstr "Εναλλαγή ελέγχων συστήματος"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:22
|
||||
#: data/50-mutter-navigation.xml:81
|
||||
msgid "Switch to previous system control"
|
||||
msgstr "Εναλλαγή σε προηγούμενους ελέγχους συστήματος"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:23
|
||||
#: data/50-mutter-navigation.xml:85
|
||||
msgid "Switch windows directly"
|
||||
msgstr "Άμεση εναλλαγή παραθύρων"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:24
|
||||
#: data/50-mutter-navigation.xml:90
|
||||
msgid "Switch directly to previous window"
|
||||
msgstr "Άμεση εναλλαγή στο προηγούμενο παράθυρο"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:25
|
||||
#: data/50-mutter-navigation.xml:94
|
||||
msgid "Switch windows of an app directly"
|
||||
msgstr "Άμεση εναλλαγή παραθύρων μιας εφαρμογής"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:26
|
||||
#: data/50-mutter-navigation.xml:99
|
||||
msgid "Switch directly to previous window of an app"
|
||||
msgstr "Άμεση εναλλαγή στο προηγούμενο παράθυρο μιας εφαρμογής"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:27
|
||||
#: data/50-mutter-navigation.xml:103
|
||||
msgid "Switch system controls directly"
|
||||
msgstr "Άμεση εναλλαγή ελέγχων συστήματος"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:28
|
||||
#: data/50-mutter-navigation.xml:108
|
||||
msgid "Switch directly to previous system control"
|
||||
msgstr "Άμεση εναλλαγή σε προηγούμενους ελέγχους συστήματος"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:29
|
||||
#: data/50-mutter-navigation.xml:111
|
||||
msgid "Hide all normal windows"
|
||||
msgstr "Απόκρυψη όλων των κανονικών παραθύρων"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:30
|
||||
#: data/50-mutter-navigation.xml:114
|
||||
msgid "Switch to workspace 1"
|
||||
msgstr "Εναλλαγή στον χώρο εργασίας 1"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:31
|
||||
#: data/50-mutter-navigation.xml:117
|
||||
msgid "Switch to workspace 2"
|
||||
msgstr "Εναλλαγή στον χώρο εργασίας 2"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:32
|
||||
#: data/50-mutter-navigation.xml:120
|
||||
msgid "Switch to workspace 3"
|
||||
msgstr "Εναλλαγή στον χώρο εργασίας 3"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:33
|
||||
#: data/50-mutter-navigation.xml:123
|
||||
msgid "Switch to workspace 4"
|
||||
msgstr "Εναλλαγή στον χώρο εργασίας 4"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:34
|
||||
#: data/50-mutter-navigation.xml:126
|
||||
msgid "Switch to last workspace"
|
||||
msgstr "Εναλλαγή στον τελευταίο χώρο εργασίας"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:35
|
||||
#: data/50-mutter-navigation.xml:129
|
||||
msgid "Move to workspace left"
|
||||
msgstr "Μετακίνηση στον χώρο εργασίας αριστερά"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:36
|
||||
#: data/50-mutter-navigation.xml:132
|
||||
msgid "Move to workspace right"
|
||||
msgstr "Μετακίνηση στον χώρο εργασίας δεξιά"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:37
|
||||
#: data/50-mutter-navigation.xml:135
|
||||
msgid "Move to workspace above"
|
||||
msgstr "Μετακίνηση στον χώρο εργασίας επάνω"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:38
|
||||
#: data/50-mutter-navigation.xml:138
|
||||
msgid "Move to workspace below"
|
||||
msgstr "Μετακίνηση στον χώρο εργασίας κάτω"
|
||||
|
||||
#: ../data/50-mutter-system.xml.in.h:1
|
||||
#: data/50-mutter-system.xml:6
|
||||
msgid "System"
|
||||
msgstr "Σύστημα"
|
||||
|
||||
#: ../data/50-mutter-system.xml.in.h:2
|
||||
#: data/50-mutter-system.xml:8
|
||||
msgid "Show the run command prompt"
|
||||
msgstr "Εμφάνιση της προτροπής της εντολής run"
|
||||
|
||||
#: ../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-windows.xml:6
|
||||
msgid "Windows"
|
||||
msgstr "Παράθυρα"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:2
|
||||
#: data/50-mutter-windows.xml:8
|
||||
msgid "Activate the window menu"
|
||||
msgstr "Ενεργοποίηση του μενού παραθύρου"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:3
|
||||
#: data/50-mutter-windows.xml:10
|
||||
msgid "Toggle fullscreen mode"
|
||||
msgstr "Εναλλαγή κατάστασης πλήρους οθόνης"
|
||||
|
||||
#: ../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 "Μεγιστοποίηση παραθύρου"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:6
|
||||
#: data/50-mutter-windows.xml:16
|
||||
msgid "Restore window"
|
||||
msgstr "Επαναφορά παραθύρου"
|
||||
|
||||
#: ../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 "Κλείσιμο παραθύρου"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:9
|
||||
#: data/50-mutter-windows.xml:22
|
||||
msgid "Hide window"
|
||||
msgstr "Απόκρυψη παραθύρου"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:10
|
||||
#: data/50-mutter-windows.xml:24
|
||||
msgid "Move window"
|
||||
msgstr "Μετακίνηση παραθύρου"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:11
|
||||
#: data/50-mutter-windows.xml:26
|
||||
msgid "Resize window"
|
||||
msgstr "Αυξομείωση παραθύρου"
|
||||
|
||||
#: ../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 "Μεγιστοποίηση παραθύρου κάθετα"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:17
|
||||
#: data/50-mutter-windows.xml:39
|
||||
msgid "Maximize window horizontally"
|
||||
msgstr "Μεγιστοποίηση παραθύρου οριζόντια"
|
||||
|
||||
#: ../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 "Mutter"
|
||||
|
||||
#: ../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 "
|
||||
@@ -293,11 +293,11 @@ 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 "
|
||||
@@ -307,13 +307,13 @@ 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 "
|
||||
@@ -324,11 +324,11 @@ 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 "
|
||||
"static number of workspaces (determined by the num-workspaces key in org."
|
||||
@@ -338,11 +338,11 @@ msgstr ""
|
||||
"στατικός αριθμός χώρων εργασίας (καθορίζεται από το κλειδί num-workspaces "
|
||||
"στο org.gnome.desktop.wm.preferences)."
|
||||
|
||||
#: ../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."
|
||||
@@ -350,11 +350,11 @@ 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."
|
||||
@@ -362,12 +362,12 @@ 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 "
|
||||
@@ -377,11 +377,11 @@ msgstr ""
|
||||
"\"mouse\" τότε η εστίαση δεν θα αλλάξει αμέσως όταν ανοίγετε ένα παράθυρο, "
|
||||
"αλλά μόνο όταν ο δείκτης σταματήσει να κινείται."
|
||||
|
||||
#: ../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 "
|
||||
"not enough, invisible borders will be added to meet this value."
|
||||
@@ -390,13 +390,13 @@ 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."
|
||||
@@ -404,11 +404,11 @@ 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."
|
||||
@@ -416,85 +416,93 @@ msgstr ""
|
||||
"Αν είναι αληθές, τα νέα παράθυρα θα είναι πάντα τοποθετημένα στο κέντρο της "
|
||||
"κύριας οθόνης."
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:21
|
||||
#: data/org.gnome.mutter.gschema.xml.in:120
|
||||
msgid "Select window from tab popup"
|
||||
msgstr "Επιλογή παραθύρου από την αναδυόμενη καρτέλα"
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:22
|
||||
#: data/org.gnome.mutter.gschema.xml.in:125
|
||||
msgid "Cancel tab popup"
|
||||
msgstr "Ακύρωση αναδυόμενης καρτέλας"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:1
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:6
|
||||
msgid "Switch to VT 1"
|
||||
msgstr "Εναλλαγή στο VT 1 "
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:2
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:10
|
||||
msgid "Switch to VT 2"
|
||||
msgstr "Εναλλαγή στο VT 2"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:3
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:14
|
||||
msgid "Switch to VT 3"
|
||||
msgstr "Εναλλαγή στο VT 3"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:4
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:18
|
||||
msgid "Switch to VT 4"
|
||||
msgstr "Εναλλαγή στο VT 4"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:5
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:22
|
||||
msgid "Switch to VT 5"
|
||||
msgstr "Εναλλαγή στο VT 5"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:6
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:26
|
||||
msgid "Switch to VT 6"
|
||||
msgstr "Εναλλαγή στο VT 6"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:7
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:30
|
||||
msgid "Switch to VT 7"
|
||||
msgstr "Εναλλαγή στο VT 7"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:8
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:34
|
||||
msgid "Switch to VT 8"
|
||||
msgstr "Εναλλαγή στο VT 8"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:9
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:38
|
||||
msgid "Switch to VT 9"
|
||||
msgstr "Εναλλαγή στο VT 9"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:10
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:42
|
||||
msgid "Switch to VT 10"
|
||||
msgstr "Εναλλαγή στο VT 10"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:11
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:46
|
||||
msgid "Switch to VT 11"
|
||||
msgstr "Εναλλαγή στο VT 11"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:12
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:50
|
||||
msgid "Switch to VT 12"
|
||||
msgstr "Εναλλαγή στο VT 12"
|
||||
|
||||
#: ../src/backends/meta-monitor-manager.c:518
|
||||
#: src/backends/meta-input-settings.c:1707
|
||||
msgid "Switch monitor"
|
||||
msgstr "Εναλλαγή οθόνης"
|
||||
|
||||
#: src/backends/meta-input-settings.c:1709
|
||||
msgid "Show on-screen help"
|
||||
msgstr "Εμφάνιση βοήθειας στην οθόνη"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:514
|
||||
msgid "Built-in display"
|
||||
msgstr "Ενσωματωμένη οθόνη"
|
||||
|
||||
#: ../src/backends/meta-monitor-manager.c:544
|
||||
#: src/backends/meta-monitor-manager.c:537
|
||||
msgid "Unknown"
|
||||
msgstr "Άγνωστη"
|
||||
|
||||
#: ../src/backends/meta-monitor-manager.c:546
|
||||
#: src/backends/meta-monitor-manager.c:539
|
||||
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:554
|
||||
#: src/backends/meta-monitor-manager.c:547
|
||||
#, 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
|
||||
#: src/compositor/compositor.c:463
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Another compositing manager is already running on screen %i on display \"%s"
|
||||
@@ -502,20 +510,20 @@ msgid ""
|
||||
msgstr ""
|
||||
"Εκτελείται ένας άλλος διαχειριστής παραθύρων στην οθόνη %i προβολή \"%s\"."
|
||||
|
||||
#: ../src/core/bell.c:192
|
||||
#: src/core/bell.c:194
|
||||
msgid "Bell event"
|
||||
msgstr "Ηχητικό συμβάν κουδουνιού"
|
||||
|
||||
#: ../src/core/delete.c:127
|
||||
#: src/core/delete.c:127
|
||||
#, c-format
|
||||
msgid "“%s” is not responding."
|
||||
msgstr "Το “%s” δεν ανταποκρίνεται."
|
||||
|
||||
#: ../src/core/delete.c:129
|
||||
#: src/core/delete.c:129
|
||||
msgid "Application is not responding."
|
||||
msgstr "Η εφαρμογή δεν ανταποκρίνεται."
|
||||
|
||||
#: ../src/core/delete.c:134
|
||||
#: 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."
|
||||
@@ -523,57 +531,57 @@ msgstr ""
|
||||
"Μπορείτε να επιλέξετε να περιμένετε λίγο για να συνεχίσει, ή να εξαναγκάσετε "
|
||||
"την εφαρμογή σε έξοδο."
|
||||
|
||||
#: ../src/core/delete.c:141
|
||||
#: src/core/delete.c:141
|
||||
msgid "_Wait"
|
||||
msgstr "_Αναμονή"
|
||||
|
||||
#: ../src/core/delete.c:141
|
||||
#: src/core/delete.c:141
|
||||
msgid "_Force Quit"
|
||||
msgstr "_Εξαναγκασμός σε τερματισμό"
|
||||
|
||||
# gconf/gconf-internals.c:2416
|
||||
#: ../src/core/display.c:555
|
||||
#: src/core/display.c:590
|
||||
#, c-format
|
||||
msgid "Failed to open X Window System display '%s'\n"
|
||||
msgstr "Αποτυχία ανοίγματος οθόνης του συστήματος παραθύρων Χ '%s'\n"
|
||||
|
||||
#: ../src/core/main.c:181
|
||||
#: src/core/main.c:182
|
||||
msgid "Disable connection to session manager"
|
||||
msgstr "Απενεργοποίηση σύνδεσης στο διαχειριστή συνεδρίας"
|
||||
|
||||
#: ../src/core/main.c:187
|
||||
#: src/core/main.c:188
|
||||
msgid "Replace the running window manager"
|
||||
msgstr "Αντικατάσταση του τρέχοντος διαχειριστή παραθύρων"
|
||||
|
||||
#: ../src/core/main.c:193
|
||||
#: src/core/main.c:194
|
||||
msgid "Specify session management ID"
|
||||
msgstr "Καθορισμός αναγνωριστικού διαχείρισης συνεδρίας"
|
||||
|
||||
#: ../src/core/main.c:198
|
||||
#: src/core/main.c:199
|
||||
msgid "X Display to use"
|
||||
msgstr "Εμφάνιση Χ για χρήση"
|
||||
|
||||
#: ../src/core/main.c:204
|
||||
#: src/core/main.c:205
|
||||
msgid "Initialize session from savefile"
|
||||
msgstr "Εκκίνηση συνεδρίας από savefile"
|
||||
|
||||
#: ../src/core/main.c:210
|
||||
#: src/core/main.c:211
|
||||
msgid "Make X calls synchronous"
|
||||
msgstr "Να καταστούν σύγχρονες οι κλήσεις του X"
|
||||
|
||||
#: ../src/core/main.c:217
|
||||
#: src/core/main.c:218
|
||||
msgid "Run as a wayland compositor"
|
||||
msgstr "Εκτέλεση ως wayland compositor"
|
||||
|
||||
#: ../src/core/main.c:223
|
||||
#: src/core/main.c:224
|
||||
msgid "Run as a nested compositor"
|
||||
msgstr "Εκτέλεση ως ενσωματωμένος compositor"
|
||||
|
||||
#: ../src/core/main.c:231
|
||||
#: src/core/main.c:232
|
||||
msgid "Run as a full display server, rather than nested"
|
||||
msgstr "Εκτέλεση ως διακομιστής πλήρους οθόνης, αντί ενσωματωμένης"
|
||||
|
||||
#: ../src/core/mutter.c:39
|
||||
#: src/core/mutter.c:39
|
||||
#, c-format
|
||||
msgid ""
|
||||
"mutter %s\n"
|
||||
@@ -587,22 +595,22 @@ msgstr ""
|
||||
"άλλοι\n"
|
||||
"Αυτό είναι ελεύθερο λογισμικό, βλ. τον πηγαίο κώδικα για όρους αντιγραφής.\n"
|
||||
"ΔΕΝ παρέχεται καμία εγγύηση, ούτε ΕΜΠΟΡΕΥΣΙΜΟΤΗΤΑΣ ούτε ΚΑΤΑΛΛΗΛΟΤΗΤΑΣ ΓΙΑ "
|
||||
"ΣΥΓΚΕΚΡΙΜΕΝΟΣΚΟΠΟ.\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 "Πρόσθετα του Mutter για χρήση"
|
||||
|
||||
#: ../src/core/prefs.c:1997
|
||||
#: src/core/prefs.c:1997
|
||||
#, c-format
|
||||
msgid "Workspace %d"
|
||||
msgstr "Χώρος εργασίας %d"
|
||||
|
||||
#: ../src/core/screen.c:521
|
||||
#: src/core/screen.c:521
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Display \"%s\" already has a window manager; try using the --replace option "
|
||||
@@ -612,27 +620,32 @@ msgstr ""
|
||||
"χρησιμοποιήσετε την επιλογή --replace για να αντικαταστήσετε τον τρέχων "
|
||||
"διαχειριστή παραθύρων."
|
||||
|
||||
#: ../src/core/screen.c:603
|
||||
#: src/core/screen.c:606
|
||||
#, c-format
|
||||
msgid "Screen %d on display '%s' is invalid\n"
|
||||
msgstr "Η οθόνη %d στην προβολή '%s' δεν είναι έγκυρη\n"
|
||||
|
||||
#: ../src/core/util.c:121
|
||||
#: src/core/util.c:120
|
||||
msgid "Mutter was compiled without support for verbose mode\n"
|
||||
msgstr ""
|
||||
"Το Mutter έχει μεταγλωττιστεί χωρίς υποστήριξη για λειτουργία εμφάνισης "
|
||||
"λεπτομερειών\n"
|
||||
|
||||
#: ../src/x11/session.c:1815
|
||||
#: src/wayland/meta-wayland-tablet-pad.c:595
|
||||
#, c-format
|
||||
msgid "Mode Switch: Mode %d"
|
||||
msgstr "Λειτουργία διακόπτη: Λειτουργία %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."
|
||||
msgstr ""
|
||||
"Αυτά τα παράθυρα δεν υποστηρίζουν "αποθήκευση τρέχουσας "
|
||||
"Αυτά τα παράθυρα δεν υποστηρίζουν "αποθήκευση της τρέχουσας "
|
||||
"εγκατάστασης" και θα πρέπει να επανεκκινηθούν χειροκίνητα στην επόμενη "
|
||||
"είσοδο σας."
|
||||
|
||||
#: ../src/x11/window-props.c:549
|
||||
#: src/x11/window-props.c:548
|
||||
#, c-format
|
||||
msgid "%s (on %s)"
|
||||
msgstr "%s (σε %s)"
|
||||
|
@@ -12,6 +12,7 @@ msgstr ""
|
||||
"PO-Revision-Date: 2005-07-18 18:28-0400\n"
|
||||
"Last-Translator: Adam Weinberger <adamw@gnome.org>\n"
|
||||
"Language-Team: Canadian English <adamw@gnome.org>\n"
|
||||
"Language: en_CA\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
2407
po/en_GB.po
2407
po/en_GB.po
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user